From 982a1c21477f0c39adda8337babb98379aece11e Mon Sep 17 00:00:00 2001 From: Flancian <0@flancia.org> Date: Sat, 10 Jul 2021 10:47:34 +0200 Subject: [PATCH] Try skipping all obsidian files again. --- .gitignore | 2 + .obsidian-git-data | 12 - .obsidian/config | 1 - .obsidian/daily-notes.json | 1 - .obsidian/graph.json | 1 - .obsidian/plugins/buttons/main.js | 4098 - .obsidian/plugins/buttons/manifest.json | 10 - .obsidian/plugins/buttons/styles.css | 142 - .obsidian/plugins/css-snippets/main.js | 57 - .obsidian/plugins/css-snippets/manifest.json | 9 - .../plugins/darlal-switcher-plus/main.js | 985 - .../darlal-switcher-plus/manifest.json | 10 - .../plugins/darlal-switcher-plus/styles.css | 38 - .../plugins/find-unlinked-files/data.json | 1 - .obsidian/plugins/find-unlinked-files/main.js | 637 - .../plugins/find-unlinked-files/manifest.json | 9 - .../plugins/hotkeysplus-obsidian/main.js | 256 - .../hotkeysplus-obsidian/manifest.json | 9 - .../plugins/markdown-prettifier/data.json | 1 - .obsidian/plugins/markdown-prettifier/main.js | 54768 -------------- .../plugins/markdown-prettifier/manifest.json | 10 - .../plugins/markdown-prettifier/styles.css | 1 - .../maximise-active-pane-obsidian/main.js | 171 - .../manifest.json | 8 - .../maximise-active-pane-obsidian/styles.css | 7 - .obsidian/plugins/nldates-obsidian/data.json | 1 - .obsidian/plugins/nldates-obsidian/main.js | 6589 -- .../plugins/nldates-obsidian/manifest.json | 10 - .../plugins/note-refactor-obsidian/main.js | 6731 -- .../note-refactor-obsidian/manifest.json | 9 - .../plugins/note-refactor-obsidian/styles.css | 7 - .../obsidian-advanced-appearance/main.js | 668 - .../manifest.json | 10 - .../obsidian-advanced-appearance/styles.css | 335 - .../obsidian-checklist-plugin/data.json | 1 - .../plugins/obsidian-checklist-plugin/main.js | 13695 ---- .../obsidian-checklist-plugin/manifest.json | 10 - .../obsidian-checklist-plugin/styles.css | 44 - .../plugins/obsidian-day-planner/data.json | 1 - .../plugins/obsidian-day-planner/main.js | 7343 -- .../obsidian-day-planner/manifest.json | 9 - .../plugins/obsidian-day-planner/styles.css | 88 - .../plugins/obsidian-emoji-toolbar/main.js | 17354 ----- .../obsidian-emoji-toolbar/manifest.json | 9 - .../plugins/obsidian-emoji-toolbar/styles.css | 6 - .../obsidian-excalidraw-plugin/main.js | 69 - .../obsidian-excalidraw-plugin/manifest.json | 10 - .../obsidian-excalidraw-plugin/styles.css | 1 - .obsidian/plugins/obsidian-git/data.json | 1 - .obsidian/plugins/obsidian-git/main.js | 6583 -- .obsidian/plugins/obsidian-git/manifest.json | 8 - .../plugins/obsidian-journey-plugin/data.json | 1 - .../plugins/obsidian-journey-plugin/main.js | 6833 -- .../obsidian-journey-plugin/manifest.json | 10 - .../obsidian-journey-plugin/styles.css | 106 - .obsidian/plugins/obsidian-mind-map/main.js | 32629 -------- .../plugins/obsidian-mind-map/manifest.json | 8 - .obsidian/plugins/obsidian-outliner/data.json | 1 - .obsidian/plugins/obsidian-outliner/main.js | 2091 - .../plugins/obsidian-outliner/manifest.json | 10 - .../plugins/obsidian-outliner/styles.css | 42 - .../plugins/obsidian-plugin-todo/main.js | 432 - .../obsidian-plugin-todo/manifest.json | 10 - .../plugins/obsidian-plugin-todo/styles.css | 59 - .../plugins/obsidian-pomodoro-plugin/main.js | 37789 ---------- .../obsidian-pomodoro-plugin/manifest.json | 10 - .../obsidian-pomodoro-plugin/styles.css | 38 - .../obsidian-rollover-daily-todos/main.js | 129 - .../manifest.json | 10 - .obsidian/plugins/obsidian-tabs/main.js | 244 - .obsidian/plugins/obsidian-tabs/manifest.json | 10 - .obsidian/plugins/obsidian-tabs/styles.css | 299 - .../plugins/open-note-to-window-title/main.js | 129 - .../open-note-to-window-title/manifest.json | 9 - .../plugins/pdf-to-markdown-plugin/data.json | 1 - .../plugins/pdf-to-markdown-plugin/main.js | 62245 ---------------- .../pdf-to-markdown-plugin/manifest.json | 9 - .../plugins/pdf-to-markdown-plugin/styles.css | 1 - .obsidian/plugins/periodic-notes/main.js | 5287 -- .../plugins/periodic-notes/manifest.json | 10 - .obsidian/plugins/periodic-notes/styles.css | 30 - .../plugins/recent-files-obsidian/data.json | 1 - .../plugins/recent-files-obsidian/main.js | 517 - .../recent-files-obsidian/manifest.json | 10 - .../plugins/recent-files-obsidian/styles.css | 9 - .obsidian/plugins/review-obsidian/main.js | 967 - .../plugins/review-obsidian/manifest.json | 9 - .obsidian/plugins/slated-obsidian/data.json | 1 - .obsidian/plugins/slated-obsidian/main.js | 16986 ----- .../plugins/slated-obsidian/manifest.json | 11 - .obsidian/plugins/slated-obsidian/styles.css | 99 - .../plugins/sliding-panes-obsidian/data.json | 1 - .../plugins/sliding-panes-obsidian/main.js | 589 - .../sliding-panes-obsidian/manifest.json | 10 - .../plugins/sliding-panes-obsidian/styles.css | 115 - .obsidian/plugins/templater-obsidian/main.js | 3572 - .../plugins/templater-obsidian/manifest.json | 10 - .../plugins/templater-obsidian/styles.css | 256 - .obsidian/starred.json | 1 - .obsidian/workspace | 434 - .obsidian/workspaces.json | 1 - 2021-07-10.md | 4 +- enough about human rights.md | 39 +- 103 files changed, 43 insertions(+), 292917 deletions(-) delete mode 100644 .obsidian-git-data delete mode 100644 .obsidian/config delete mode 100644 .obsidian/daily-notes.json delete mode 100644 .obsidian/graph.json delete mode 100644 .obsidian/plugins/buttons/main.js delete mode 100644 .obsidian/plugins/buttons/manifest.json delete mode 100644 .obsidian/plugins/buttons/styles.css delete mode 100644 .obsidian/plugins/css-snippets/main.js delete mode 100644 .obsidian/plugins/css-snippets/manifest.json delete mode 100644 .obsidian/plugins/darlal-switcher-plus/main.js delete mode 100644 .obsidian/plugins/darlal-switcher-plus/manifest.json delete mode 100644 .obsidian/plugins/darlal-switcher-plus/styles.css delete mode 100644 .obsidian/plugins/find-unlinked-files/data.json delete mode 100644 .obsidian/plugins/find-unlinked-files/main.js delete mode 100644 .obsidian/plugins/find-unlinked-files/manifest.json delete mode 100644 .obsidian/plugins/hotkeysplus-obsidian/main.js delete mode 100644 .obsidian/plugins/hotkeysplus-obsidian/manifest.json delete mode 100644 .obsidian/plugins/markdown-prettifier/data.json delete mode 100644 .obsidian/plugins/markdown-prettifier/main.js delete mode 100644 .obsidian/plugins/markdown-prettifier/manifest.json delete mode 100644 .obsidian/plugins/markdown-prettifier/styles.css delete mode 100644 .obsidian/plugins/maximise-active-pane-obsidian/main.js delete mode 100644 .obsidian/plugins/maximise-active-pane-obsidian/manifest.json delete mode 100644 .obsidian/plugins/maximise-active-pane-obsidian/styles.css delete mode 100644 .obsidian/plugins/nldates-obsidian/data.json delete mode 100644 .obsidian/plugins/nldates-obsidian/main.js delete mode 100644 .obsidian/plugins/nldates-obsidian/manifest.json delete mode 100644 .obsidian/plugins/note-refactor-obsidian/main.js delete mode 100644 .obsidian/plugins/note-refactor-obsidian/manifest.json delete mode 100644 .obsidian/plugins/note-refactor-obsidian/styles.css delete mode 100644 .obsidian/plugins/obsidian-advanced-appearance/main.js delete mode 100644 .obsidian/plugins/obsidian-advanced-appearance/manifest.json delete mode 100644 .obsidian/plugins/obsidian-advanced-appearance/styles.css delete mode 100644 .obsidian/plugins/obsidian-checklist-plugin/data.json delete mode 100644 .obsidian/plugins/obsidian-checklist-plugin/main.js delete mode 100644 .obsidian/plugins/obsidian-checklist-plugin/manifest.json delete mode 100644 .obsidian/plugins/obsidian-checklist-plugin/styles.css delete mode 100644 .obsidian/plugins/obsidian-day-planner/data.json delete mode 100644 .obsidian/plugins/obsidian-day-planner/main.js delete mode 100644 .obsidian/plugins/obsidian-day-planner/manifest.json delete mode 100644 .obsidian/plugins/obsidian-day-planner/styles.css delete mode 100644 .obsidian/plugins/obsidian-emoji-toolbar/main.js delete mode 100644 .obsidian/plugins/obsidian-emoji-toolbar/manifest.json delete mode 100644 .obsidian/plugins/obsidian-emoji-toolbar/styles.css delete mode 100644 .obsidian/plugins/obsidian-excalidraw-plugin/main.js delete mode 100644 .obsidian/plugins/obsidian-excalidraw-plugin/manifest.json delete mode 100644 .obsidian/plugins/obsidian-excalidraw-plugin/styles.css delete mode 100644 .obsidian/plugins/obsidian-git/data.json delete mode 100644 .obsidian/plugins/obsidian-git/main.js delete mode 100644 .obsidian/plugins/obsidian-git/manifest.json delete mode 100644 .obsidian/plugins/obsidian-journey-plugin/data.json delete mode 100644 .obsidian/plugins/obsidian-journey-plugin/main.js delete mode 100644 .obsidian/plugins/obsidian-journey-plugin/manifest.json delete mode 100644 .obsidian/plugins/obsidian-journey-plugin/styles.css delete mode 100644 .obsidian/plugins/obsidian-mind-map/main.js delete mode 100644 .obsidian/plugins/obsidian-mind-map/manifest.json delete mode 100644 .obsidian/plugins/obsidian-outliner/data.json delete mode 100644 .obsidian/plugins/obsidian-outliner/main.js delete mode 100644 .obsidian/plugins/obsidian-outliner/manifest.json delete mode 100644 .obsidian/plugins/obsidian-outliner/styles.css delete mode 100644 .obsidian/plugins/obsidian-plugin-todo/main.js delete mode 100644 .obsidian/plugins/obsidian-plugin-todo/manifest.json delete mode 100644 .obsidian/plugins/obsidian-plugin-todo/styles.css delete mode 100644 .obsidian/plugins/obsidian-pomodoro-plugin/main.js delete mode 100644 .obsidian/plugins/obsidian-pomodoro-plugin/manifest.json delete mode 100644 .obsidian/plugins/obsidian-pomodoro-plugin/styles.css delete mode 100644 .obsidian/plugins/obsidian-rollover-daily-todos/main.js delete mode 100644 .obsidian/plugins/obsidian-rollover-daily-todos/manifest.json delete mode 100644 .obsidian/plugins/obsidian-tabs/main.js delete mode 100644 .obsidian/plugins/obsidian-tabs/manifest.json delete mode 100644 .obsidian/plugins/obsidian-tabs/styles.css delete mode 100644 .obsidian/plugins/open-note-to-window-title/main.js delete mode 100644 .obsidian/plugins/open-note-to-window-title/manifest.json delete mode 100644 .obsidian/plugins/pdf-to-markdown-plugin/data.json delete mode 100644 .obsidian/plugins/pdf-to-markdown-plugin/main.js delete mode 100644 .obsidian/plugins/pdf-to-markdown-plugin/manifest.json delete mode 100644 .obsidian/plugins/pdf-to-markdown-plugin/styles.css delete mode 100644 .obsidian/plugins/periodic-notes/main.js delete mode 100644 .obsidian/plugins/periodic-notes/manifest.json delete mode 100644 .obsidian/plugins/periodic-notes/styles.css delete mode 100644 .obsidian/plugins/recent-files-obsidian/data.json delete mode 100644 .obsidian/plugins/recent-files-obsidian/main.js delete mode 100644 .obsidian/plugins/recent-files-obsidian/manifest.json delete mode 100644 .obsidian/plugins/recent-files-obsidian/styles.css delete mode 100644 .obsidian/plugins/review-obsidian/main.js delete mode 100644 .obsidian/plugins/review-obsidian/manifest.json delete mode 100644 .obsidian/plugins/slated-obsidian/data.json delete mode 100644 .obsidian/plugins/slated-obsidian/main.js delete mode 100644 .obsidian/plugins/slated-obsidian/manifest.json delete mode 100644 .obsidian/plugins/slated-obsidian/styles.css delete mode 100644 .obsidian/plugins/sliding-panes-obsidian/data.json delete mode 100644 .obsidian/plugins/sliding-panes-obsidian/main.js delete mode 100644 .obsidian/plugins/sliding-panes-obsidian/manifest.json delete mode 100644 .obsidian/plugins/sliding-panes-obsidian/styles.css delete mode 100644 .obsidian/plugins/templater-obsidian/main.js delete mode 100644 .obsidian/plugins/templater-obsidian/manifest.json delete mode 100644 .obsidian/plugins/templater-obsidian/styles.css delete mode 100644 .obsidian/starred.json delete mode 100644 .obsidian/workspace delete mode 100644 .obsidian/workspaces.json diff --git a/.gitignore b/.gitignore index 4602c993e..81b0a5752 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ +.obsidian .obsidian-git-data +.obsidian-git-data* diff --git a/.obsidian-git-data b/.obsidian-git-data deleted file mode 100644 index 28cc8cdf2..000000000 --- a/.obsidian-git-data +++ /dev/null @@ -1,12 +0,0 @@ -<<<<<<< HEAD -Sat Jul 10 2021 00:27:17 GMT+0200 (Central European Summer Time) -Sat Jul 10 2021 00:27:17 GMT+0200 (Central European Summer Time) -======= -Sat Jul 10 2021 00:27:33 GMT+0200 (Central European Summer Time) -Sat Jul 10 2021 00:26:33 GMT+0200 (Central European Summer Time) -Sat Jul 10 2021 00:26:33 GMT+0200 (Central European Summer Time) -======= -Sat Jul 10 2021 00:26:17 GMT+0200 (Central European Summer Time) -Sat Jul 10 2021 00:25:17 GMT+0200 (Central European Summer Time) ->>>>>>> b1893220e24f5e449a4d008f1a6d11e5f6049244 ->>>>>>> bb2b266a4ad1955da598f2d64adc55d047d768f3 diff --git a/.obsidian/config b/.obsidian/config deleted file mode 100644 index 520427bed..000000000 --- a/.obsidian/config +++ /dev/null @@ -1 +0,0 @@ -{"pluginEnabledStatus":{"file-explorer":true,"global-search":true,"switcher":true,"graph":false,"backlink":false,"command-palette":false,"markdown-importer":false,"word-count":false,"open-with-default-app":false,"file-recovery":false,"daily-notes":true,"templates":false,"random-note":false,"outline":false,"audio-recorder":false,"starred":false,"page-preview":false,"tag-pane":false,"workspaces":false},"vimMode":true,"strictLineBreaks":false,"enabledPlugins":["obsidian-git","obsidian-outliner","sliding-panes-obsidian"],"hotkeys":{"daily-notes":[{"modifiers":["Alt"],"key":"D"}],"daily-notes:goto-prev":[{"modifiers":["Alt"],"key":"Y"}],"daily-notes:goto-next":[{"modifiers":["Alt"],"key":"T"}],"editor:focus-top":[{"modifiers":["Alt","Mod"],"key":"K"}],"editor:focus-bottom":[{"modifiers":["Alt","Mod"],"key":"J"}],"editor:focus-left":[{"modifiers":["Alt","Mod"],"key":"H"}],"editor:focus-right":[{"modifiers":["Alt","Mod"],"key":"L"}],"insert-template":[{"modifiers":["Alt","Mod"],"key":"T"}],"backlink:open-backlinks":[{"modifiers":["Alt","Mod"],"key":"B"}],"random-note":[{"modifiers":["Alt","Mod"],"key":"R"}],"workspace:split-horizontal":[{"modifiers":["Alt","Mod"],"key":"-"}],"workspace:split-vertical":[{"modifiers":["Alt","Mod"],"key":"\\"}],"audio-recorder:start":[{"modifiers":["Alt","Mod"],"key":"A"}],"audio-recorder:stop":[{"modifiers":["Alt","Mod"],"key":"Q"}],"workspace:toggle-pin":[{"modifiers":["Alt","Mod"],"key":"P"}],"editor:open-link-in-new-leaf":[{"modifiers":["Mod"],"key":"]"}],"workspace:close":[{"modifiers":["Alt","Mod"],"key":"W"}],"file-explorer:reveal-active-file":[{"modifiers":["Alt","Mod"],"key":"N"}],"obsidian-git:push":[{"modifiers":["Mod","Shift"],"key":"A"}],"workspaces:save-and-load":[{"modifiers":["Mod","Shift"],"key":"S"}],"workspaces:open-modal":[{"modifiers":["Mod","Shift"],"key":"W"}],"workspaces:load":[{"modifiers":["Mod","Shift"],"key":"L"}],"backlink:open":[{"modifiers":["Mod","Shift"],"key":"B"}],"graph:open-local":[{"modifiers":["Mod","Shift"],"key":"G"}],"app:toggle-default-new-pane-mode":[{"modifiers":["Mod","Shift"],"key":"P"}]},"baseFontSize":15,"defaultViewMode":"source"} \ No newline at end of file diff --git a/.obsidian/daily-notes.json b/.obsidian/daily-notes.json deleted file mode 100644 index 5736e255c..000000000 --- a/.obsidian/daily-notes.json +++ /dev/null @@ -1 +0,0 @@ -{"autorun":true} \ No newline at end of file diff --git a/.obsidian/graph.json b/.obsidian/graph.json deleted file mode 100644 index fa35c1abb..000000000 --- a/.obsidian/graph.json +++ /dev/null @@ -1 +0,0 @@ -{"collapse-filter":false,"search":"","showTags":false,"showAttachments":false,"hideUnresolved":true,"showOrphans":true,"collapse-color-groups":false,"colorGroups":[],"collapse-display":false,"showArrow":false,"textFadeMultiplier":0,"nodeSizeMultiplier":1,"lineSizeMultiplier":1,"collapse-forces":false,"centerStrength":0.135294117647059,"repelStrength":16.3529411764706,"linkStrength":0.52247191011236,"linkDistance":416,"scale":0.013369370183441594,"close":false} \ No newline at end of file diff --git a/.obsidian/plugins/buttons/main.js b/.obsidian/plugins/buttons/main.js deleted file mode 100644 index 4f1e33cbb..000000000 --- a/.obsidian/plugins/buttons/main.js +++ /dev/null @@ -1,4098 +0,0 @@ -/* -THIS IS A GENERATED/BUNDLED FILE BY ROLLUP -if you want to view the source visit the plugins github repository -*/ - -'use strict'; - -var obsidian = require('obsidian'); - -let buttonStore; -const getStore = (isMobile) => isMobile ? buttonStore : JSON.parse(localStorage.getItem("buttons")); -const initializeButtonStore = (app) => { - const files = app.vault.getMarkdownFiles(); - const blocksArr = files - .map((file) => { - const cache = app.metadataCache.getFileCache(file); - return buildButtonArray(cache, file); - }) - .filter((arr) => arr !== undefined) - .flat(); - localStorage.setItem("buttons", JSON.stringify(blocksArr)); - buttonStore = blocksArr; -}; -const addButtonToStore = (app, file) => { - const cache = app.metadataCache.getFileCache(file); - const buttons = buildButtonArray(cache, file); - const store = getStore(app.isMobile); - const newStore = buttons && store - ? removeDuplicates([...buttons, ...store]) - : store - ? removeDuplicates(store) - : buttons - ? removeDuplicates(buttons) - : []; - localStorage.setItem("buttons", JSON.stringify(newStore)); - buttonStore = newStore; -}; -const getButtonFromStore = async (app, args) => { - const store = getStore(app.isMobile); - args.id; - if (args.id) { - const storedButton = store && - store.filter((item) => `button-${args.id}` === item.id)[0]; - if (storedButton) { - const file = app.vault.getAbstractFileByPath(storedButton.path); - const content = await app.vault.cachedRead(file); - const contentArray = content.split("\n"); - const button = contentArray - .slice(storedButton.position.start.line + 1, storedButton.position.end.line) - .join("\n"); - const storedArgs = createArgumentObject(button); - return { - args: { ...storedArgs, ...args }, - id: storedButton.id.split("button-")[1], - }; - } - } -}; -const getButtonById = async (app, id) => { - const store = getStore(app.isMobile); - const storedButton = store.filter((item) => `button-${id}` === item.id)[0]; - if (storedButton) { - const file = app.vault.getAbstractFileByPath(storedButton.path); - const content = await app.vault.cachedRead(file); - const contentArray = content.split("\n"); - const button = contentArray - .slice(storedButton.position.start.line + 1, storedButton.position.end.line) - .join("\n"); - return createArgumentObject(button); - } -}; -const getButtonSwapById = async (app, id) => { - const store = getStore(app.isMobile); - const storedButton = store.filter((item) => `button-${id}` === item.id)[0]; - if (storedButton) { - return storedButton.swap; - } -}; -const setButtonSwapById = async (app, id, newSwap) => { - const store = getStore(app.isMobile); - const storedButton = store.filter((item) => `button-${id}` === item.id)[0]; - if (storedButton) { - storedButton.swap = newSwap; - const newStore = removeDuplicates([...store, storedButton]); - localStorage.setItem("buttons", JSON.stringify(newStore)); - buttonStore = newStore; - } -}; -const buildButtonArray = (cache, file) => { - const blocks = cache && cache.blocks; - if (blocks) { - const blockKeys = Array.from(Object.keys(blocks)); - const blockArray = blockKeys - .map((key) => blocks[key]) - .map((obj) => { - obj["path"] = file.path; - obj["swap"] = 0; - return obj; - }) - .filter((block) => block.id.includes("button")); - return blockArray; - } -}; -function removeDuplicates(arr) { - return arr && arr[0] - ? arr.filter((v, i, a) => a.findIndex((t) => t.id === v.id || - (t.path === v.path && - t.position.start.line === v.position.start.line && - t.position.end.line === v.position.end.line)) === i) - : arr; -} - -function nanoid(num) { - let result = ""; - const characters = "abcdefghijklmnopqrstuvwxyz0123456789"; - const charactersLength = characters.length; - for (let i = 0; i < num; i++) { - result += characters.charAt(Math.floor(Math.random() * charactersLength)); - } - return result; -} -const insertButton = (app, outputObject) => { - const buttonArr = []; - buttonArr.push("```button"); - outputObject.name && buttonArr.push(`name ${outputObject.name}`); - outputObject.type && buttonArr.push(`type ${outputObject.type}`); - outputObject.action && buttonArr.push(`action ${outputObject.action}`); - outputObject.id && buttonArr.push(`id ${outputObject.id}`); - outputObject.swap && buttonArr.push(`swap ${outputObject.swap}`); - outputObject.remove && buttonArr.push(`remove ${outputObject.remove}`); - outputObject.replace && buttonArr.push(`replace ${outputObject.replace}`); - outputObject.templater === true && - buttonArr.push(`templater ${outputObject.templater}`); - outputObject.color && buttonArr.push(`color ${outputObject.color}`); - outputObject.class && buttonArr.push(`class ${outputObject.class}`); - buttonArr.push("```"); - outputObject.blockId - ? buttonArr.push(`^button-${outputObject.blockId}`) - : buttonArr.push(`^button-${nanoid(4)}`); - const page = app.workspace.getActiveViewOfType(obsidian.MarkdownView); - const editor = page.editor; - editor.replaceSelection(buttonArr.join("\n")); - addButtonToStore(app, page.file); -}; -const insertInlineButton = (app, id) => { - const page = app.workspace.getActiveViewOfType(obsidian.MarkdownView); - const editor = page.editor; - editor.replaceSelection(`\`button-${id}\``); -}; -const createArgumentObject = (source) => source.split("\n").reduce((acc, i) => { - const split = i.split(" "); - const key = split[0].toLowerCase(); - acc[key] = split.filter((item) => item !== split[0]).join(" "); - return acc; -}, {}); -const createContentArray = async (app) => { - const activeView = app.workspace.getActiveViewOfType(obsidian.MarkdownView); - if (activeView) { - const file = activeView.file; - const content = await app.vault.read(file); - return { contentArray: content.split("\n"), file }; - } - new obsidian.Notice("Could not get Active View", 1000); - console.error("could not get active view"); -}; -const handleValueArray = (value, callback) => { - if (value.includes("[") && value.includes("]")) { - const args = value.match(/\[(.*)\]/); - if (args[1]) { - const argArray = args[1].split(/,\s?/); - if (argArray[0]) { - callback(argArray); - } - } - } -}; -function getNewArgs(app, position) { - const promise = new Promise((resolve) => { - setTimeout(async () => { - const activeView = app.workspace.getActiveViewOfType(obsidian.MarkdownView); - const newContent = await app.vault - .cachedRead(activeView.file) - .then((content) => content.split("\n")); - const newButton = newContent - .splice(position.lineStart, position.lineEnd - position.lineStart) - .join("\n") - .replace("```button", "") - .replace("```", ""); - resolve({ args: createArgumentObject(newButton) }); - }, 150); - }); - return promise; -} -const wrapAround = (value, size) => { - return ((value % size) + size) % size; -}; - -const buttonEventListener = (app, callback) => { - return app.metadataCache.on("changed", (file) => { - callback(app, file); - }); -}; -const openFileListener = (app, callback) => { - return app.workspace.on("file-open", () => { - callback(app); - }); -}; - -var Mexp = function (parsed) { - this.value = parsed; -}; - -Mexp.math = { - isDegree: true, // mode of calculator - acos: function (x) { - return (Mexp.math.isDegree ? 180 / Math.PI * Math.acos(x) : Math.acos(x)) - }, - add: function (a, b) { - return a + b - }, - asin: function (x) { - return (Mexp.math.isDegree ? 180 / Math.PI * Math.asin(x) : Math.asin(x)) - }, - atan: function (x) { - return (Mexp.math.isDegree ? 180 / Math.PI * Math.atan(x) : Math.atan(x)) - }, - acosh: function (x) { - return Math.log(x + Math.sqrt(x * x - 1)) - }, - asinh: function (x) { - return Math.log(x + Math.sqrt(x * x + 1)) - }, - atanh: function (x) { - return Math.log((1 + x) / (1 - x)) - }, - C: function (n, r) { - var pro = 1; - var other = n - r; - var choice = r; - if (choice < other) { - choice = other; - other = r; - } - for (var i = choice + 1; i <= n; i++) { - pro *= i; - } - return pro / Mexp.math.fact(other) - }, - changeSign: function (x) { - return -x - }, - cos: function (x) { - if (Mexp.math.isDegree) x = Mexp.math.toRadian(x); - return Math.cos(x) - }, - cosh: function (x) { - return (Math.pow(Math.E, x) + Math.pow(Math.E, -1 * x)) / 2 - }, - div: function (a, b) { - return a / b - }, - fact: function (n) { - if (n % 1 !== 0) return 'NaN' - var pro = 1; - for (var i = 2; i <= n; i++) { - pro *= i; - } - return pro - }, - inverse: function (x) { - return 1 / x - }, - log: function (i) { - return Math.log(i) / Math.log(10) - }, - mod: function (a, b) { - return a % b - }, - mul: function (a, b) { - return a * b - }, - P: function (n, r) { - var pro = 1; - for (var i = Math.floor(n) - Math.floor(r) + 1; i <= Math.floor(n); i++) { - pro *= i; - } - return pro - }, - Pi: function (low, high, ex) { - var pro = 1; - for (var i = low; i <= high; i++) { - pro *= Number(ex.postfixEval({ - n: i - })); - } - return pro - }, - pow10x: function (e) { - var x = 1; - while (e--) { - x *= 10; - } - return x - }, - sigma: function (low, high, ex) { - var sum = 0; - for (var i = low; i <= high; i++) { - sum += Number(ex.postfixEval({ - n: i - })); - } - return sum - }, - sin: function (x) { - if (Mexp.math.isDegree) x = Mexp.math.toRadian(x); - return Math.sin(x) - }, - sinh: function (x) { - return (Math.pow(Math.E, x) - Math.pow(Math.E, -1 * x)) / 2 - }, - sub: function (a, b) { - return a - b - }, - tan: function (x) { - if (Mexp.math.isDegree) x = Mexp.math.toRadian(x); - return Math.tan(x) - }, - tanh: function (x) { - return Mexp.sinha(x) / Mexp.cosha(x) - }, - toRadian: function (x) { - return x * Math.PI / 180 - } -}; -Mexp.Exception = function (message) { - this.message = message; -}; -var math_function = Mexp; - -function inc(arr, val) { - for (var i = 0; i < arr.length; i++) { - arr[i] += val; - } - return arr -} -var token = ['sin', 'cos', 'tan', 'pi', '(', ')', 'P', 'C', ' ', - 'asin', 'acos', 'atan', '7', '8', '9', 'int', - 'cosh', 'acosh', 'ln', '^', 'root', '4', '5', '6', '/', '!', - 'tanh', 'atanh', 'Mod', '1', '2', '3', '*', - 'sinh', 'asinh', 'e', 'log', '0', '.', '+', '-', ',', 'Sigma', 'n', 'Pi', 'pow']; -var show = ['sin', 'cos', 'tan', 'π', '(', ')', 'P', 'C', ' ', - 'asin', 'acos', 'atan', '7', '8', '9', 'Int', - 'cosh', 'acosh', ' ln', '^', 'root', '4', '5', '6', '÷', '!', - 'tanh', 'atanh', ' Mod ', '1', '2', '3', '×', - 'sinh', 'asinh', 'e', ' log', '0', '.', '+', '-', ',', 'Σ', 'n', 'Π', 'pow']; -var eva = [math_function.math.sin, math_function.math.cos, math_function.math.tan, 'PI', '(', ')', math_function.math.P, math_function.math.C, ' '.anchor, -math_function.math.asin, math_function.math.acos, math_function.math.atan, '7', '8', '9', Math.floor, -math_function.math.cosh, math_function.math.acosh, Math.log, Math.pow, Math.sqrt, '4', '5', '6', math_function.math.div, math_function.math.fact, -math_function.math.tanh, math_function.math.atanh, math_function.math.mod, '1', '2', '3', math_function.math.mul, -math_function.math.sinh, math_function.math.asinh, 'E', math_function.math.log, '0', '.', math_function.math.add, math_function.math.sub, ',', math_function.math.sigma, 'n', math_function.math.Pi, Math.pow]; -var preced = { - 0: 11, - 1: 0, - 2: 3, - 3: 0, - 4: 0, - 5: 0, - 6: 0, - 7: 11, - 8: 11, - 9: 1, - 10: 10, - 11: 0, - 12: 11, - 13: 0, - 14: -1 // will be filtered after lexer -}; // stores precedence by types -var type = [0, 0, 0, 3, 4, 5, 10, 10, 14, - 0, 0, 0, 1, 1, 1, 0, - 0, 0, 0, 10, 0, 1, 1, 1, 2, 7, - 0, 0, 2, 1, 1, 1, 2, - 0, 0, 3, 0, 1, 6, 9, 9, 11, 12, 13, 12, 8]; -/* -0 : function with syntax function_name(Maths_exp) -1 : numbers -2 : binary operators like * / Mod left associate and same precedence -3 : Math constant values like e,pi,Cruncher ans -4 : opening bracket -5 : closing bracket -6 : decimal -7 : function with syntax (Math_exp)function_name -8: function with syntax function_name(Math_exp1,Math_exp2) -9 : binary operator like +,- -10: binary operator like P C or ^ -11: , -12: function with , seperated three parameters and third parameter is a string that will be mexp string -13: variable of Sigma function -*/ -var type0 = { - 0: true, - 1: true, - 3: true, - 4: true, - 6: true, - 8: true, - 9: true, - 12: true, - 13: true, - 14: true -}; // type2:true,type4:true,type9:true,type11:true,type21:true,type22 -var type1 = { - 0: true, - 1: true, - 2: true, - 3: true, - 4: true, - 5: true, - 6: true, - 7: true, - 8: true, - 9: true, - 10: true, - 11: true, - 12: true, - 13: true -}; // type3:true,type5:true,type7:true,type23 -var type1Asterick = { - 0: true, - 3: true, - 4: true, - 8: true, - 12: true, - 13: true -}; -var empty = {}; -var type3Asterick = { - 0: true, - 1: true, - 3: true, - 4: true, - 6: true, - 8: true, - 12: true, - 13: true -}; // type_5:true,type_7:true,type_23 -var type6 = { - 1: true -}; -var newAr = [ - [], - ['1', '2', '3', '7', '8', '9', '4', '5', '6', '+', '-', '*', '/', '(', ')', '^', '!', 'P', 'C', 'e', '0', '.', ',', 'n', ' '], - ['pi', 'ln', 'Pi'], - ['sin', 'cos', 'tan', 'Del', 'int', 'Mod', 'log', 'pow'], - ['asin', 'acos', 'atan', 'cosh', 'root', 'tanh', 'sinh'], - ['acosh', 'atanh', 'asinh', 'Sigma'] -]; - -function match(str1, str2, i, x) { - for (var f = 0; f < x; f++) { - if (str1[i + f] !== str2[f]) { - return false - } - } - return true -} -math_function.addToken = function (tokens) { - for (var i = 0; i < tokens.length; i++) { - var x = tokens[i].token.length; - var temp = -1; - - // newAr is a specially designed data structure index of 1d array = length of tokens - newAr[x] = newAr[x] || []; - for (var y = 0; y < newAr[x].length; y++) { - if (tokens[i].token === newAr[x][y]) { - temp = token.indexOf(newAr[x][y]); - break - } - } - if (temp === -1) { - token.push(tokens[i].token); - type.push(tokens[i].type); - if (newAr.length <= tokens[i].token.length) { - newAr[tokens[i].token.length] = []; - } - newAr[tokens[i].token.length].push(tokens[i].token); - eva.push(tokens[i].value); - show.push(tokens[i].show); - } else { // overwrite - token[temp] = tokens[i].token; - type[temp] = tokens[i].type; - eva[temp] = tokens[i].value; - show[temp] = tokens[i].show; - } - } -}; - -function tokenize(string) { - var nodes = []; - var length = string.length; - var key, x, y; - for (var i = 0; i < length; i++) { - if (i < length - 1 && string[i] === ' ' && string[i + 1] === ' ') { - continue - } - key = ''; - for (x = (string.length - i > (newAr.length - 2) ? newAr.length - 1 : string.length - i); x > 0; x--) { - if (newAr[x] === undefined) continue; - for (y = 0; y < newAr[x].length; y++) { - if (match(string, newAr[x][y], i, x)) { - key = newAr[x][y]; - y = newAr[x].length; - x = 0; - } - } - } - i += key.length - 1; - if (key === '') { - throw (new math_function.Exception('Can\'t understand after ' + string.slice(i))) - } - var index = token.indexOf(key); - nodes.push({ - index: index, - token: key, - type: type[index], - eval: eva[index], - precedence: preced[type[index]], - show: show[index] - }); - } - return nodes; -} - -math_function.lex = function (inp, tokens) { - - - var changeSignObj = { - value: math_function.math.changeSign, - type: 0, - pre: 21, - show: '-' - }; - var closingParObj = { - value: ')', - show: ')', - type: 5, - pre: 0 - }; - var openingParObj = { - value: '(', - type: 4, - pre: 0, - show: '(' - }; - var str = [openingParObj]; - - var ptc = []; // Parenthesis to close at the beginning is after one token - var inpStr = inp; - var allowed = type0; - var bracToClose = 0; - var asterick = empty; - var prevKey = ''; - var i; - if (typeof tokens !== 'undefined') { - math_function.addToken(tokens); - } - var obj = {}; - var nodes = tokenize(inpStr); - for (i = 0; i < nodes.length; i++) { - var node = nodes[i]; - if (node.type === 14) { - if (i > 0 && - i < nodes.length - 1 && - nodes[i + 1].type === 1 && - (nodes[i - 1].type === 1 || nodes[i - 1].type === 6)) - throw new math_function.Exception('Unexpected Space') - continue - } - - node.index; - var cToken = node.token; - var cType = node.type; - var cEv = node.eval; - var cPre = node.precedence; - var cShow = node.show; - var pre = str[str.length - 1]; - var j; - for (j = ptc.length; j--;) { // loop over ptc - if (ptc[j] === 0) { - if ([0, 2, 3, 4, 5, 9, 11, 12, 13].indexOf(cType) !== -1) { - if (allowed[cType] !== true) { - console.log(inp, node, nodes, allowed); - throw (new math_function.Exception(cToken + ' is not allowed after ' + prevKey)) - } - str.push(closingParObj); - allowed = type1; - asterick = type3Asterick; - inc(ptc, -1).pop(); - } - } else break - } - if (allowed[cType] !== true) { - throw (new math_function.Exception(cToken + ' is not allowed after ' + prevKey)) - } - if (asterick[cType] === true) { - cType = 2; - cEv = math_function.math.mul; - cShow = '×'; - cPre = 3; - i = i - cToken.length; - } - obj = { - value: cEv, - type: cType, - pre: cPre, - show: cShow - }; - if (cType === 0) { - allowed = type0; - asterick = empty; - inc(ptc, 2).push(2); - str.push(obj); - str.push(openingParObj); - } else if (cType === 1) { - if (pre.type === 1) { - pre.value += cEv; - inc(ptc, 1); - } else { - str.push(obj); - } - allowed = type1; - asterick = type1Asterick; - } else if (cType === 2) { - allowed = type0; - asterick = empty; - inc(ptc, 2); - str.push(obj); - } else if (cType === 3) { // constant - str.push(obj); - allowed = type1; - asterick = type3Asterick; - } else if (cType === 4) { - inc(ptc, 1); - bracToClose++; - allowed = type0; - asterick = empty; - str.push(obj); - } else if (cType === 5) { - if (!bracToClose) { - throw (new math_function.Exception('Closing parenthesis are more than opening one, wait What!!!')) - } - bracToClose--; - allowed = type1; - asterick = type3Asterick; - str.push(obj); - inc(ptc, 1); - } else if (cType === 6) { - if (pre.hasDec) { - throw (new math_function.Exception('Two decimals are not allowed in one number')) - } - if (pre.type !== 1) { - pre = { - value: 0, - type: 1, - pre: 0 - }; // pre needs to be changed as it will the last value now to be safe in later code - str.push(pre); - inc(ptc, -1); - } - allowed = type6; - inc(ptc, 1); - asterick = empty; - pre.value += cEv; - pre.hasDec = true; - } else if (cType === 7) { - allowed = type1; - asterick = type3Asterick; - inc(ptc, 1); - str.push(obj); - } - if (cType === 8) { - allowed = type0; - asterick = empty; - inc(ptc, 4).push(4); - str.push(obj); - str.push(openingParObj); - } else if (cType === 9) { - if (pre.type === 9) { - if (pre.value === math_function.math.add) { - pre.value = cEv; - pre.show = cShow; - inc(ptc, 1); - } else if (pre.value === math_function.math.sub && cShow === '-') { - pre.value = math_function.math.add; - pre.show = '+'; - inc(ptc, 1); - } - } else if (pre.type !== 5 && pre.type !== 7 && pre.type !== 1 && pre.type !== 3 && pre.type !== 13) { // changesign only when negative is found - if (cToken === '-') { // do nothing for + token - // don't add with the above if statement as that will run the else statement of parent if on Ctoken + - allowed = type0; - asterick = empty; - inc(ptc, 2).push(2); - str.push(changeSignObj); - str.push(openingParObj); - } - } else { - str.push(obj); - inc(ptc, 2); - } - allowed = type0; - asterick = empty; - } else if (cType === 10) { - allowed = type0; - asterick = empty; - inc(ptc, 2); - str.push(obj); - } else if (cType === 11) { - allowed = type0; - asterick = empty; - str.push(obj); - } else if (cType === 12) { - allowed = type0; - asterick = empty; - inc(ptc, 6).push(6); - str.push(obj); - str.push(openingParObj); - } else if (cType === 13) { - allowed = type1; - asterick = type3Asterick; - str.push(obj); - } - inc(ptc, -1); - prevKey = cToken; - } - for (j = ptc.length; j--;) { // loop over ptc - if (ptc[j] === 0) { - str.push(closingParObj); - inc(ptc, -1).pop(); - } else break // if it is not zero so before ptc also cant be zero - } - if (allowed[5] !== true) { - throw (new math_function.Exception('complete the expression')) - } - while (bracToClose--) { - str.push(closingParObj); - } - - str.push(closingParObj); - // console.log(str); - return new math_function(str) -}; -var lexer = math_function; - -lexer.prototype.toPostfix = function () { - var post = [], elem, popped, prep, pre, ele; - var stack = [{ value: "(", type: 4, pre: 0 }]; - var arr = this.value; - for (var i = 1; i < arr.length; i++) { - if (arr[i].type === 1 || arr[i].type === 3 || arr[i].type === 13) { //if token is number,constant,or n(which is also a special constant in our case) - if (arr[i].type === 1) - arr[i].value = Number(arr[i].value); - post.push(arr[i]); - } - else if (arr[i].type === 4) { - stack.push(arr[i]); - } - else if (arr[i].type === 5) { - while ((popped = stack.pop()).type !== 4) { - post.push(popped); - } - } - else if (arr[i].type === 11) { - while ((popped = stack.pop()).type !== 4) { - post.push(popped); - } - stack.push(popped); - } - else { - elem = arr[i]; - pre = elem.pre; - ele = stack[stack.length - 1]; - prep = ele.pre; - var flag = ele.value == 'Math.pow' && elem.value == 'Math.pow'; - if (pre > prep) stack.push(elem); - else { - while (prep >= pre && !flag || flag && pre < prep) { - popped = stack.pop(); - ele = stack[stack.length - 1]; - post.push(popped); - prep = ele.pre; - flag = elem.value == 'Math.pow' && ele.value == 'Math.pow'; - } - stack.push(elem); - } - } - } - return new lexer(post); -}; -var postfix = lexer; - -postfix.prototype.postfixEval = function (UserDefined) { - UserDefined=UserDefined||{}; - UserDefined.PI=Math.PI; - UserDefined.E=Math.E; - var stack=[],pop1,pop2,pop3; - var arr=this.value; - var bool=(typeof UserDefined.n!=="undefined"); - for(var i=0;i1) { - throw(new postfix.Exception("Uncaught Syntax error")); - } - return stack[0].value>1000000000000000?"Infinity":parseFloat(stack[0].value.toFixed(15)); -}; -postfix.eval=function(str,tokens,obj){ - if (typeof tokens==="undefined") { - return this.lex(str).toPostfix().postfixEval(); - } - else if (typeof obj==="undefined") { - if (typeof tokens.length!=="undefined") - return this.lex(str,tokens).toPostfix().postfixEval(); - else - return this.lex(str).toPostfix().postfixEval(tokens); - } - else - return this.lex(str,tokens).toPostfix().postfixEval(obj); -}; -var postfix_evaluator=postfix; - -postfix_evaluator.prototype.formulaEval = function () { - var pop1,pop2,pop3; - var disp=[]; - var arr=this.value; - for(var i=0;i"+pop2.value+""+arr[i].show+""+pop1.value+"",type:10}); - else disp.push({value:(pop2.type!=1?"(":"")+pop2.value+(pop2.type!=1?")":"")+""+pop1.value+"",type:1}); - } - else if(arr[i].type===2||arr[i].type===9){ - pop1=disp.pop(); - pop2=disp.pop(); - disp.push({value:(pop2.type!=1?"(":"")+pop2.value+(pop2.type!=1?")":"")+arr[i].show+(pop1.type!=1?"(":"")+pop1.value+(pop1.type!=1?")":""),type:arr[i].type}); - } - else if(arr[i].type===12){ - pop1=disp.pop(); - pop2=disp.pop(); - pop3=disp.pop(); - disp.push({value:arr[i].show+"("+pop3.value+","+pop2.value+","+pop1.value+")",type:12}); - } - } - return disp[0].value; -}; -var formula_evaluator=postfix_evaluator; - -const removeButton = async (app, remove, lineStart, lineEnd) => { - const { contentArray, file } = await createContentArray(app); - const store = getStore(app.isMobile); - if (remove === "true") { - const numberOfItems = lineEnd - lineStart; - contentArray.splice(lineStart, numberOfItems + 1); - if (contentArray[lineStart] && - contentArray[lineStart].includes("^button-")) { - contentArray.splice(lineStart, 1); - } - const content = contentArray.join("\n"); - await app.vault.modify(file, content); - } - if (lineStart === lineEnd) { - contentArray.splice(lineStart, 1); - const content = contentArray.join("\n"); - await app.vault.modify(file, content); - } - else { - handleValueArray(remove, async (argArray) => { - const buttons = store && - store.filter((item) => { - let exists; - argArray.forEach((arg) => { - if (item.id === `button-${arg}` && item.path === file.path) { - exists = true; - } - }); - return exists; - }); - if (buttons[0]) { - let offset = 0; - buttons.forEach((button) => { - const start = button.position.start.line - offset; - const numLines = button.position.end.line - button.position.start.line; - contentArray.splice(start, numLines + 2); - offset += numLines + 2; - }); - const content = contentArray.join("\n"); - await app.vault.modify(file, content); - } - }); - } -}; -const removeSection = async (app, section) => { - const { contentArray, file } = await createContentArray(app); - if (section.includes("[") && section.includes("]")) { - const args = section.match(/\[(.*)\]/); - if (args[1]) { - const argArray = args[1].split(/,\s?/); - if (argArray[0]) { - const start = parseInt(argArray[0]) - 1; - const end = parseInt(argArray[1]); - const numLines = end - start; - contentArray.splice(start, numLines); - const content = contentArray.join("\n"); - await app.vault.modify(file, content); - } - } - } -}; -const prependContent = async (app, insert, lineStart) => { - const activeView = app.workspace.getActiveViewOfType(obsidian.MarkdownView); - if (activeView) { - const file = activeView.file; - let content = await app.vault.read(file); - const contentArray = content.split("\n"); - contentArray.splice(lineStart, 0, insert); - content = contentArray.join("\n"); - await app.vault.modify(file, content); - } - else { - new obsidian.Notice("There was an issue prepending content, please try again", 2000); - } -}; -const appendContent = async (app, insert, lineEnd) => { - const activeView = app.workspace.getActiveViewOfType(obsidian.MarkdownView); - if (activeView) { - const file = activeView.file; - let content = await app.vault.read(file); - const contentArray = content.split("\n"); - let insertionPoint; - if (contentArray[lineEnd + 1] && - contentArray[lineEnd + 1].includes("^button")) { - insertionPoint = lineEnd + 2; - insert = `\n${insert}`; - } - else { - insertionPoint = lineEnd + 1; - } - contentArray.splice(insertionPoint, 0, `${insert}`); - content = contentArray.join("\n"); - await app.vault.modify(file, content); - } - else { - new obsidian.Notice("There was an issue appending content, please try again", 2000); - } -}; -const addContentAtLine = async (app, insert, type) => { - const lineNumber = type.match(/(\d+)/g); - if (lineNumber[0]) { - const insertionPoint = parseInt(lineNumber[0]) - 1; - const activeView = app.workspace.getActiveViewOfType(obsidian.MarkdownView); - if (activeView) { - const file = activeView.file; - let content = await app.vault.read(file); - const contentArray = content.split("\n"); - contentArray.splice(insertionPoint, 0, `${insert}`); - content = contentArray.join("\n"); - await app.vault.modify(file, content); - } - } - else { - new obsidian.Notice("There was an issue adding content, please try again", 2000); - } -}; -const createNote = async (app, content, type) => { - const path = type.match(/\(([\s\S]*?),?\s?(split)?\)/); - if (path) { - try { - await app.vault.create(`${path[1]}.md`, content); - const file = app.vault.getAbstractFileByPath(`${path[1]}.md`); - if (path[2]) { - await app.workspace.splitActiveLeaf().openFile(file); - } - else { - app.workspace.activeLeaf.openFile(file); - } - } - catch (e) { - new obsidian.Notice("There was an error! Maybe the file already exists?", 2000); - } - } - else { - new obsidian.Notice(`couldn't parse the path!`, 2000); - } -}; - -const getButtonPosition = (content, args) => { - let finalPosition; - const possiblePositions = []; - let possiblePosition = { lineStart: 0, lineEnd: 0 }; - const contentArray = content.split("\n"); - let open = false; - contentArray.forEach((item, index) => { - if (item.includes("```")) { - if (open === false) { - possiblePosition.lineStart = index; - open = true; - } - else { - possiblePosition.lineEnd = index; - possiblePositions.push(possiblePosition); - possiblePosition = { lineStart: 0, lineEnd: 0 }; - open = false; - } - } - }); - possiblePositions.forEach((position) => { - const codeblock = contentArray - .slice(position.lineStart, position.lineEnd + 1) - .join("\n"); - if (codeblock.includes("button") && codeblock.includes(args.name)) { - finalPosition = position; - } - }); - return finalPosition; -}; -const getInlineButtonPosition = async (app, id) => { - const content = await createContentArray(app); - const position = { lineStart: 0, lineEnd: 0 }; - content.contentArray - .map((line) => line.split(" ")) - .forEach((words, index) => { - words.forEach((word) => { - if (word.startsWith("`button")) { - if (word === `\`button-${id}\``) { - position.lineStart = index; - position.lineEnd = index; - } - } - }); - }); - return position; -}; -const findNumber = async (app, lineNumber) => { - const content = await createContentArray(app); - const value = []; - content.contentArray.forEach((line, index) => { - if (index === lineNumber - 1) { - value.push(line); - } - }); - const convertWords = value - .join("") - .replace("plus", "+") - .replace("minus", "-") - .replace("times", "*") - .replace(/divide(d)?(\sby)?/g, "/"); - const numbers = convertWords.replace(/\s/g, "").match(/[^\w:]*?\d+?/g); - return numbers; -}; - -const calculate = async (app, { action }, position) => { - let equation = action; - const variables = action.match(/\$[0-9]*/g); - if (variables) { - const output = variables.map(async (value) => { - const activeView = app.workspace.getActiveViewOfType(obsidian.MarkdownView); - if (activeView) { - const lineNumber = parseInt(value.substring(1)); - const numbers = await findNumber(app, lineNumber); - return { variable: value, numbers }; - } - else { - new obsidian.Notice(`couldn't read file`, 2000); - } - }); - const resolved = await Promise.all(output); - resolved.forEach((term) => { - if (term.numbers) { - equation = equation.replace(term.variable, term.numbers.join("")); - } - else { - new obsidian.Notice("Check the line number in your calculate button", 3000); - equation = undefined; - } - }); - } - const fun = equation && formula_evaluator.eval(equation); - fun && appendContent(app, `Result: ${fun}`, position.lineEnd); -}; -const remove = (app, { remove }, { lineStart, lineEnd }) => { - setTimeout(() => removeButton(app, remove, lineStart, lineEnd), 100); -}; -const replace = (app, { replace }) => { - removeSection(app, replace); -}; -const text = async (app, args, position) => { - // prepend template above the button - if (args.type.includes("prepend")) { - prependContent(app, args.action, position.lineStart); - } - // append template below the button - if (args.type.includes("append")) { - appendContent(app, args.action, position.lineEnd); - } - if (args.type.includes("note")) { - createNote(app, args.action, args.type); - } - if (args.type.includes("line")) { - addContentAtLine(app, args.action, args.type); - } -}; -const template = async (app, args, position) => { - const templatesEnabled = app.internalPlugins.plugins.templates.enabled; - const templaterPluginEnabled = app.plugins.plugins["templater-obsidian"]; - // only run if templates plugin is enabled - if (templatesEnabled || templaterPluginEnabled) { - const folders = [ - templatesEnabled && app.internalPlugins.plugins.templates.instance.options.folder?.toLowerCase(), - templaterPluginEnabled && app.plugins?.plugins["templater-obsidian"]?.settings.template_folder?.toLowerCase(), - ].filter((folder) => folder); - const templateFile = args.action.toLowerCase(); - const allFiles = app.vault.getFiles(); - const file = allFiles.filter((file) => { - let found = false; - folders[0] && - folders.forEach((folder) => { - if (file.path.toLowerCase() === `${folder}/${templateFile}.md`) { - found = true; - } - }); - return found; - })[0]; - if (file) { - const content = await app.vault.read(file); - // prepend template above the button - if (args.type.includes("prepend")) { - prependContent(app, content, position.lineStart); - setTimeout(() => app.commands.executeCommandById("templater-obsidian:replace-in-file-templater"), 100); - } - // append template below the button - if (args.type.includes("append")) { - appendContent(app, content, position.lineEnd); - setTimeout(() => app.commands.executeCommandById("templater-obsidian:replace-in-file-templater"), 100); - } - if (args.type.includes("note")) { - createNote(app, content, args.type); - } - if (args.type.includes("line")) { - addContentAtLine(app, content, args.type); - setTimeout(() => app.commands.executeCommandById("templater-obsidian:replace-in-file-templater"), 100); - } - } - else { - new obsidian.Notice(`Couldn't find the specified template, please check and try again`, 2000); - } - } - else { - new obsidian.Notice("You need to have the Templates or Templater plugin enabled and Template folder defined", 2000); - } -}; -const link = ({ action }) => { - const link = action.trim(); - window.open(link); -}; -const command = (app, { action }) => { - const allCommands = app.commands.listCommands(); - const command = allCommands.filter((command) => command.name.toUpperCase() === action.toUpperCase().trim())[0]; - app.commands.executeCommandById(command.id); -}; -const swap = async (app, swap, id, inline, file) => { - handleValueArray(swap, async (argArray) => { - const swap = await getButtonSwapById(app, id); - const newSwap = swap + 1 > argArray.length - 1 ? 0 : swap + 1; - setButtonSwapById(app, id, newSwap); - let args = await getButtonById(app, argArray[swap]); - let position; - let content; - if (args) { - if (args.templater) { - args = await templater(app, position); - if (inline) { - new obsidian.Notice("templater args don't work with inline buttons yet", 2000); - } - } - if (args.replace) { - replace(app, args); - } - if (args.type === "command") { - command(app, args); - } - // handle link buttons - if (args.type === "link") { - link(args); - } - // handle template buttons - if (args.type && args.type.includes("template")) { - setTimeout(async () => { - content = await app.vault.read(file); - position = inline - ? await getInlineButtonPosition(app, id) - : getButtonPosition(content, args); - template(app, args, position); - }, 50); - } - if (args.type === "calculate") { - calculate(app, args, position); - } - if (args.type && args.type.includes("text")) { - setTimeout(async () => { - content = await app.vault.read(file); - position = inline - ? await getInlineButtonPosition(app, id) - : getButtonPosition(content, args); - text(app, args, position); - }, 50); - } - // handle removing the button - if (args.remove) { - setTimeout(async () => { - content = await app.vault.read(file); - position = inline - ? await getInlineButtonPosition(app, id) - : getButtonPosition(content, args); - remove(app, args, position); - }, 75); - } - if (args.replace) { - replace(app, args); - } - } - }); -}; -const templater = async (app, position) => { - app.commands.executeCommandById("editor:save-file"); - const activeView = app.workspace.getActiveViewOfType(obsidian.MarkdownView); - if (activeView) { - const file = activeView.file; - const content = await app.vault.cachedRead(file); - app.commands.executeCommandById("templater-obsidian:replace-in-file-templater"); - const { args } = await getNewArgs(app, position); - const cachedData = []; - const cacheChange = app.vault.on("modify", (file) => { - cachedData.push(file.unsafeCachedData); - }); - setTimeout(async () => { - const button = content - .split("\n") - .splice(position.lineStart, position.lineEnd - position.lineStart + 2) - .join("\n"); - let finalContent; - if (cachedData[0]) { - const cachedContent = cachedData[cachedData.length - 1].split("\n"); - let addOne = false; - if (args.type.includes("prepend")) { - addOne = true; - } - else if (args.type.includes("line")) { - const lineNumber = args.type.match(/(\d+)/g); - if (lineNumber[0]) { - const line = parseInt(lineNumber[0]) - 1; - if (line < position.lineStart && !args.replace) { - addOne = true; - } - } - } - if (addOne) { - cachedContent.splice(position.lineStart + 1, position.lineEnd - position.lineStart + 2, button); - } - else { - cachedContent.splice(position.lineStart, position.lineEnd - position.lineStart + 2, button); - } - finalContent = cachedContent.join("\n"); - } - else { - finalContent = content; - } - await app.vault.modify(file, finalContent); - app.metadataCache.offref(cacheChange); - }, 200); - return args; - } -}; - -const createButton = ({ app, el, args, inline, id, clickOverride, }) => { - //create the button element - const button = el.createEl("button", { - text: args.name, - cls: args.class - ? `${args.class} ${args.color}` - : `button-default ${args.color ? args.color : ""}`, - }); - args.id ? button.setAttribute("id", args.id) : ""; - button.on("click", "button", () => { - clickOverride - ? clickOverride.click(...clickOverride.params) - : clickHandler(app, args, inline, id); - }); - return button; -}; -const clickHandler = async (app, args, inline, id) => { - const activeView = app.workspace.getActiveViewOfType(obsidian.MarkdownView); - let content = await app.vault.read(activeView.file); - let position = inline - ? await getInlineButtonPosition(app, id) - : getButtonPosition(content, args); - // handle command buttons - if (args.templater) { - args = await templater(app, position); - if (inline) { - new obsidian.Notice("templater args don't work with inline buttons yet", 2000); - } - } - if (args.replace) { - replace(app, args); - } - if (args.type === "command") { - command(app, args); - } - // handle link buttons - if (args.type === "link") { - link(args); - } - // handle template buttons - if (args.type && args.type.includes("template")) { - setTimeout(async () => { - content = await app.vault.read(activeView.file); - position = inline - ? await getInlineButtonPosition(app, id) - : getButtonPosition(content, args); - template(app, args, position); - }, 50); - } - if (args.type === "calculate") { - calculate(app, args, position); - } - if (args.type && args.type.includes("text")) { - setTimeout(async () => { - content = await app.vault.read(activeView.file); - position = inline - ? await getInlineButtonPosition(app, id) - : getButtonPosition(content, args); - text(app, args, position); - }, 50); - } - // handle removing the button - if (args.remove) { - setTimeout(async () => { - content = await app.vault.read(activeView.file); - position = inline - ? await getInlineButtonPosition(app, id) - : getButtonPosition(content, args); - remove(app, args, position); - }, 75); - } - if (args.swap) { - if (!inline) { - new obsidian.Notice("swap args only work in inline buttons for now", 2000); - } - else { - swap(app, args.swap, id, inline, activeView.file); - } - } -}; - -var top = 'top'; -var bottom = 'bottom'; -var right = 'right'; -var left = 'left'; -var auto = 'auto'; -var basePlacements = [top, bottom, right, left]; -var start = 'start'; -var end = 'end'; -var clippingParents = 'clippingParents'; -var viewport = 'viewport'; -var popper = 'popper'; -var reference = 'reference'; -var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) { - return acc.concat([placement + "-" + start, placement + "-" + end]); -}, []); -var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) { - return acc.concat([placement, placement + "-" + start, placement + "-" + end]); -}, []); // modifiers that need to read the DOM - -var beforeRead = 'beforeRead'; -var read = 'read'; -var afterRead = 'afterRead'; // pure-logic modifiers - -var beforeMain = 'beforeMain'; -var main = 'main'; -var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state) - -var beforeWrite = 'beforeWrite'; -var write = 'write'; -var afterWrite = 'afterWrite'; -var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite]; - -function getNodeName(element) { - return element ? (element.nodeName || '').toLowerCase() : null; -} - -function getWindow(node) { - if (node == null) { - return window; - } - - if (node.toString() !== '[object Window]') { - var ownerDocument = node.ownerDocument; - return ownerDocument ? ownerDocument.defaultView || window : window; - } - - return node; -} - -function isElement(node) { - var OwnElement = getWindow(node).Element; - return node instanceof OwnElement || node instanceof Element; -} - -function isHTMLElement(node) { - var OwnElement = getWindow(node).HTMLElement; - return node instanceof OwnElement || node instanceof HTMLElement; -} - -function isShadowRoot(node) { - // IE 11 has no ShadowRoot - if (typeof ShadowRoot === 'undefined') { - return false; - } - - var OwnElement = getWindow(node).ShadowRoot; - return node instanceof OwnElement || node instanceof ShadowRoot; -} - -// and applies them to the HTMLElements such as popper and arrow - -function applyStyles(_ref) { - var state = _ref.state; - Object.keys(state.elements).forEach(function (name) { - var style = state.styles[name] || {}; - var attributes = state.attributes[name] || {}; - var element = state.elements[name]; // arrow is optional + virtual elements - - if (!isHTMLElement(element) || !getNodeName(element)) { - return; - } // Flow doesn't support to extend this property, but it's the most - // effective way to apply styles to an HTMLElement - // $FlowFixMe[cannot-write] - - - Object.assign(element.style, style); - Object.keys(attributes).forEach(function (name) { - var value = attributes[name]; - - if (value === false) { - element.removeAttribute(name); - } else { - element.setAttribute(name, value === true ? '' : value); - } - }); - }); -} - -function effect$2(_ref2) { - var state = _ref2.state; - var initialStyles = { - popper: { - position: state.options.strategy, - left: '0', - top: '0', - margin: '0' - }, - arrow: { - position: 'absolute' - }, - reference: {} - }; - Object.assign(state.elements.popper.style, initialStyles.popper); - state.styles = initialStyles; - - if (state.elements.arrow) { - Object.assign(state.elements.arrow.style, initialStyles.arrow); - } - - return function () { - Object.keys(state.elements).forEach(function (name) { - var element = state.elements[name]; - var attributes = state.attributes[name] || {}; - var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them - - var style = styleProperties.reduce(function (style, property) { - style[property] = ''; - return style; - }, {}); // arrow is optional + virtual elements - - if (!isHTMLElement(element) || !getNodeName(element)) { - return; - } - - Object.assign(element.style, style); - Object.keys(attributes).forEach(function (attribute) { - element.removeAttribute(attribute); - }); - }); - }; -} // eslint-disable-next-line import/no-unused-modules - - -var applyStyles$1 = { - name: 'applyStyles', - enabled: true, - phase: 'write', - fn: applyStyles, - effect: effect$2, - requires: ['computeStyles'] -}; - -function getBasePlacement(placement) { - return placement.split('-')[0]; -} - -function getBoundingClientRect(element) { - var rect = element.getBoundingClientRect(); - return { - width: rect.width, - height: rect.height, - top: rect.top, - right: rect.right, - bottom: rect.bottom, - left: rect.left, - x: rect.left, - y: rect.top - }; -} - -// means it doesn't take into account transforms. - -function getLayoutRect(element) { - var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed. - // Fixes https://github.com/popperjs/popper-core/issues/1223 - - var width = element.offsetWidth; - var height = element.offsetHeight; - - if (Math.abs(clientRect.width - width) <= 1) { - width = clientRect.width; - } - - if (Math.abs(clientRect.height - height) <= 1) { - height = clientRect.height; - } - - return { - x: element.offsetLeft, - y: element.offsetTop, - width: width, - height: height - }; -} - -function contains(parent, child) { - var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method - - if (parent.contains(child)) { - return true; - } // then fallback to custom implementation with Shadow DOM support - else if (rootNode && isShadowRoot(rootNode)) { - var next = child; - - do { - if (next && parent.isSameNode(next)) { - return true; - } // $FlowFixMe[prop-missing]: need a better way to handle this... - - - next = next.parentNode || next.host; - } while (next); - } // Give up, the result is false - - - return false; -} - -function getComputedStyle(element) { - return getWindow(element).getComputedStyle(element); -} - -function isTableElement(element) { - return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0; -} - -function getDocumentElement(element) { - // $FlowFixMe[incompatible-return]: assume body is always available - return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing] - element.document) || window.document).documentElement; -} - -function getParentNode(element) { - if (getNodeName(element) === 'html') { - return element; - } - - return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle - // $FlowFixMe[incompatible-return] - // $FlowFixMe[prop-missing] - element.assignedSlot || // step into the shadow DOM of the parent of a slotted node - element.parentNode || ( // DOM Element detected - isShadowRoot(element) ? element.host : null) || // ShadowRoot detected - // $FlowFixMe[incompatible-call]: HTMLElement is a Node - getDocumentElement(element) // fallback - - ); -} - -function getTrueOffsetParent(element) { - if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837 - getComputedStyle(element).position === 'fixed') { - return null; - } - - return element.offsetParent; -} // `.offsetParent` reports `null` for fixed elements, while absolute elements -// return the containing block - - -function getContainingBlock(element) { - var isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') !== -1; - var isIE = navigator.userAgent.indexOf('Trident') !== -1; - - if (isIE && isHTMLElement(element)) { - // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport - var elementCss = getComputedStyle(element); - - if (elementCss.position === 'fixed') { - return null; - } - } - - var currentNode = getParentNode(element); - - while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) { - var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that - // create a containing block. - // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block - - if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') { - return currentNode; - } else { - currentNode = currentNode.parentNode; - } - } - - return null; -} // Gets the closest ancestor positioned element. Handles some edge cases, -// such as table ancestors and cross browser bugs. - - -function getOffsetParent(element) { - var window = getWindow(element); - var offsetParent = getTrueOffsetParent(element); - - while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') { - offsetParent = getTrueOffsetParent(offsetParent); - } - - if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) { - return window; - } - - return offsetParent || getContainingBlock(element) || window; -} - -function getMainAxisFromPlacement(placement) { - return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y'; -} - -var max = Math.max; -var min = Math.min; -var round = Math.round; - -function within(min$1, value, max$1) { - return max(min$1, min(value, max$1)); -} - -function getFreshSideObject() { - return { - top: 0, - right: 0, - bottom: 0, - left: 0 - }; -} - -function mergePaddingObject(paddingObject) { - return Object.assign({}, getFreshSideObject(), paddingObject); -} - -function expandToHashMap(value, keys) { - return keys.reduce(function (hashMap, key) { - hashMap[key] = value; - return hashMap; - }, {}); -} - -var toPaddingObject = function toPaddingObject(padding, state) { - padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, { - placement: state.placement - })) : padding; - return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements)); -}; - -function arrow(_ref) { - var _state$modifiersData$; - - var state = _ref.state, - name = _ref.name, - options = _ref.options; - var arrowElement = state.elements.arrow; - var popperOffsets = state.modifiersData.popperOffsets; - var basePlacement = getBasePlacement(state.placement); - var axis = getMainAxisFromPlacement(basePlacement); - var isVertical = [left, right].indexOf(basePlacement) >= 0; - var len = isVertical ? 'height' : 'width'; - - if (!arrowElement || !popperOffsets) { - return; - } - - var paddingObject = toPaddingObject(options.padding, state); - var arrowRect = getLayoutRect(arrowElement); - var minProp = axis === 'y' ? top : left; - var maxProp = axis === 'y' ? bottom : right; - var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len]; - var startDiff = popperOffsets[axis] - state.rects.reference[axis]; - var arrowOffsetParent = getOffsetParent(arrowElement); - var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0; - var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is - // outside of the popper bounds - - var min = paddingObject[minProp]; - var max = clientSize - arrowRect[len] - paddingObject[maxProp]; - var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference; - var offset = within(min, center, max); // Prevents breaking syntax highlighting... - - var axisProp = axis; - state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$); -} - -function effect$1(_ref2) { - var state = _ref2.state, - options = _ref2.options; - var _options$element = options.element, - arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element; - - if (arrowElement == null) { - return; - } // CSS selector - - - if (typeof arrowElement === 'string') { - arrowElement = state.elements.popper.querySelector(arrowElement); - - if (!arrowElement) { - return; - } - } - - if (process.env.NODE_ENV !== "production") { - if (!isHTMLElement(arrowElement)) { - console.error(['Popper: "arrow" element must be an HTMLElement (not an SVGElement).', 'To use an SVG arrow, wrap it in an HTMLElement that will be used as', 'the arrow.'].join(' ')); - } - } - - if (!contains(state.elements.popper, arrowElement)) { - if (process.env.NODE_ENV !== "production") { - console.error(['Popper: "arrow" modifier\'s `element` must be a child of the popper', 'element.'].join(' ')); - } - - return; - } - - state.elements.arrow = arrowElement; -} // eslint-disable-next-line import/no-unused-modules - - -var arrow$1 = { - name: 'arrow', - enabled: true, - phase: 'main', - fn: arrow, - effect: effect$1, - requires: ['popperOffsets'], - requiresIfExists: ['preventOverflow'] -}; - -var unsetSides = { - top: 'auto', - right: 'auto', - bottom: 'auto', - left: 'auto' -}; // Round the offsets to the nearest suitable subpixel based on the DPR. -// Zooming can change the DPR, but it seems to report a value that will -// cleanly divide the values into the appropriate subpixels. - -function roundOffsetsByDPR(_ref) { - var x = _ref.x, - y = _ref.y; - var win = window; - var dpr = win.devicePixelRatio || 1; - return { - x: round(round(x * dpr) / dpr) || 0, - y: round(round(y * dpr) / dpr) || 0 - }; -} - -function mapToStyles(_ref2) { - var _Object$assign2; - - var popper = _ref2.popper, - popperRect = _ref2.popperRect, - placement = _ref2.placement, - offsets = _ref2.offsets, - position = _ref2.position, - gpuAcceleration = _ref2.gpuAcceleration, - adaptive = _ref2.adaptive, - roundOffsets = _ref2.roundOffsets; - - var _ref3 = roundOffsets === true ? roundOffsetsByDPR(offsets) : typeof roundOffsets === 'function' ? roundOffsets(offsets) : offsets, - _ref3$x = _ref3.x, - x = _ref3$x === void 0 ? 0 : _ref3$x, - _ref3$y = _ref3.y, - y = _ref3$y === void 0 ? 0 : _ref3$y; - - var hasX = offsets.hasOwnProperty('x'); - var hasY = offsets.hasOwnProperty('y'); - var sideX = left; - var sideY = top; - var win = window; - - if (adaptive) { - var offsetParent = getOffsetParent(popper); - var heightProp = 'clientHeight'; - var widthProp = 'clientWidth'; - - if (offsetParent === getWindow(popper)) { - offsetParent = getDocumentElement(popper); - - if (getComputedStyle(offsetParent).position !== 'static') { - heightProp = 'scrollHeight'; - widthProp = 'scrollWidth'; - } - } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it - - - offsetParent = offsetParent; - - if (placement === top) { - sideY = bottom; // $FlowFixMe[prop-missing] - - y -= offsetParent[heightProp] - popperRect.height; - y *= gpuAcceleration ? 1 : -1; - } - - if (placement === left) { - sideX = right; // $FlowFixMe[prop-missing] - - x -= offsetParent[widthProp] - popperRect.width; - x *= gpuAcceleration ? 1 : -1; - } - } - - var commonStyles = Object.assign({ - position: position - }, adaptive && unsetSides); - - if (gpuAcceleration) { - var _Object$assign; - - return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) < 2 ? "translate(" + x + "px, " + y + "px)" : "translate3d(" + x + "px, " + y + "px, 0)", _Object$assign)); - } - - return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + "px" : '', _Object$assign2[sideX] = hasX ? x + "px" : '', _Object$assign2.transform = '', _Object$assign2)); -} - -function computeStyles(_ref4) { - var state = _ref4.state, - options = _ref4.options; - var _options$gpuAccelerat = options.gpuAcceleration, - gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat, - _options$adaptive = options.adaptive, - adaptive = _options$adaptive === void 0 ? true : _options$adaptive, - _options$roundOffsets = options.roundOffsets, - roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets; - - if (process.env.NODE_ENV !== "production") { - var transitionProperty = getComputedStyle(state.elements.popper).transitionProperty || ''; - - if (adaptive && ['transform', 'top', 'right', 'bottom', 'left'].some(function (property) { - return transitionProperty.indexOf(property) >= 0; - })) { - console.warn(['Popper: Detected CSS transitions on at least one of the following', 'CSS properties: "transform", "top", "right", "bottom", "left".', '\n\n', 'Disable the "computeStyles" modifier\'s `adaptive` option to allow', 'for smooth transitions, or remove these properties from the CSS', 'transition declaration on the popper element if only transitioning', 'opacity or background-color for example.', '\n\n', 'We recommend using the popper element as a wrapper around an inner', 'element that can have any CSS property transitioned for animations.'].join(' ')); - } - } - - var commonStyles = { - placement: getBasePlacement(state.placement), - popper: state.elements.popper, - popperRect: state.rects.popper, - gpuAcceleration: gpuAcceleration - }; - - if (state.modifiersData.popperOffsets != null) { - state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, { - offsets: state.modifiersData.popperOffsets, - position: state.options.strategy, - adaptive: adaptive, - roundOffsets: roundOffsets - }))); - } - - if (state.modifiersData.arrow != null) { - state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, { - offsets: state.modifiersData.arrow, - position: 'absolute', - adaptive: false, - roundOffsets: roundOffsets - }))); - } - - state.attributes.popper = Object.assign({}, state.attributes.popper, { - 'data-popper-placement': state.placement - }); -} // eslint-disable-next-line import/no-unused-modules - - -var computeStyles$1 = { - name: 'computeStyles', - enabled: true, - phase: 'beforeWrite', - fn: computeStyles, - data: {} -}; - -var passive = { - passive: true -}; - -function effect(_ref) { - var state = _ref.state, - instance = _ref.instance, - options = _ref.options; - var _options$scroll = options.scroll, - scroll = _options$scroll === void 0 ? true : _options$scroll, - _options$resize = options.resize, - resize = _options$resize === void 0 ? true : _options$resize; - var window = getWindow(state.elements.popper); - var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper); - - if (scroll) { - scrollParents.forEach(function (scrollParent) { - scrollParent.addEventListener('scroll', instance.update, passive); - }); - } - - if (resize) { - window.addEventListener('resize', instance.update, passive); - } - - return function () { - if (scroll) { - scrollParents.forEach(function (scrollParent) { - scrollParent.removeEventListener('scroll', instance.update, passive); - }); - } - - if (resize) { - window.removeEventListener('resize', instance.update, passive); - } - }; -} // eslint-disable-next-line import/no-unused-modules - - -var eventListeners = { - name: 'eventListeners', - enabled: true, - phase: 'write', - fn: function fn() {}, - effect: effect, - data: {} -}; - -var hash$1 = { - left: 'right', - right: 'left', - bottom: 'top', - top: 'bottom' -}; -function getOppositePlacement(placement) { - return placement.replace(/left|right|bottom|top/g, function (matched) { - return hash$1[matched]; - }); -} - -var hash = { - start: 'end', - end: 'start' -}; -function getOppositeVariationPlacement(placement) { - return placement.replace(/start|end/g, function (matched) { - return hash[matched]; - }); -} - -function getWindowScroll(node) { - var win = getWindow(node); - var scrollLeft = win.pageXOffset; - var scrollTop = win.pageYOffset; - return { - scrollLeft: scrollLeft, - scrollTop: scrollTop - }; -} - -function getWindowScrollBarX(element) { - // If has a CSS width greater than the viewport, then this will be - // incorrect for RTL. - // Popper 1 is broken in this case and never had a bug report so let's assume - // it's not an issue. I don't think anyone ever specifies width on - // anyway. - // Browsers where the left scrollbar doesn't cause an issue report `0` for - // this (e.g. Edge 2019, IE11, Safari) - return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft; -} - -function getViewportRect(element) { - var win = getWindow(element); - var html = getDocumentElement(element); - var visualViewport = win.visualViewport; - var width = html.clientWidth; - var height = html.clientHeight; - var x = 0; - var y = 0; // NB: This isn't supported on iOS <= 12. If the keyboard is open, the popper - // can be obscured underneath it. - // Also, `html.clientHeight` adds the bottom bar height in Safari iOS, even - // if it isn't open, so if this isn't available, the popper will be detected - // to overflow the bottom of the screen too early. - - if (visualViewport) { - width = visualViewport.width; - height = visualViewport.height; // Uses Layout Viewport (like Chrome; Safari does not currently) - // In Chrome, it returns a value very close to 0 (+/-) but contains rounding - // errors due to floating point numbers, so we need to check precision. - // Safari returns a number <= 0, usually < -1 when pinch-zoomed - // Feature detection fails in mobile emulation mode in Chrome. - // Math.abs(win.innerWidth / visualViewport.scale - visualViewport.width) < - // 0.001 - // Fallback here: "Not Safari" userAgent - - if (!/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) { - x = visualViewport.offsetLeft; - y = visualViewport.offsetTop; - } - } - - return { - width: width, - height: height, - x: x + getWindowScrollBarX(element), - y: y - }; -} - -// of the `` and `` rect bounds if horizontally scrollable - -function getDocumentRect(element) { - var _element$ownerDocumen; - - var html = getDocumentElement(element); - var winScroll = getWindowScroll(element); - var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body; - var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0); - var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0); - var x = -winScroll.scrollLeft + getWindowScrollBarX(element); - var y = -winScroll.scrollTop; - - if (getComputedStyle(body || html).direction === 'rtl') { - x += max(html.clientWidth, body ? body.clientWidth : 0) - width; - } - - return { - width: width, - height: height, - x: x, - y: y - }; -} - -function isScrollParent(element) { - // Firefox wants us to check `-x` and `-y` variations as well - var _getComputedStyle = getComputedStyle(element), - overflow = _getComputedStyle.overflow, - overflowX = _getComputedStyle.overflowX, - overflowY = _getComputedStyle.overflowY; - - return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX); -} - -function getScrollParent(node) { - if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) { - // $FlowFixMe[incompatible-return]: assume body is always available - return node.ownerDocument.body; - } - - if (isHTMLElement(node) && isScrollParent(node)) { - return node; - } - - return getScrollParent(getParentNode(node)); -} - -/* -given a DOM element, return the list of all scroll parents, up the list of ancesors -until we get to the top window object. This list is what we attach scroll listeners -to, because if any of these parent elements scroll, we'll need to re-calculate the -reference element's position. -*/ - -function listScrollParents(element, list) { - var _element$ownerDocumen; - - if (list === void 0) { - list = []; - } - - var scrollParent = getScrollParent(element); - var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body); - var win = getWindow(scrollParent); - var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent; - var updatedList = list.concat(target); - return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here - updatedList.concat(listScrollParents(getParentNode(target))); -} - -function rectToClientRect(rect) { - return Object.assign({}, rect, { - left: rect.x, - top: rect.y, - right: rect.x + rect.width, - bottom: rect.y + rect.height - }); -} - -function getInnerBoundingClientRect(element) { - var rect = getBoundingClientRect(element); - rect.top = rect.top + element.clientTop; - rect.left = rect.left + element.clientLeft; - rect.bottom = rect.top + element.clientHeight; - rect.right = rect.left + element.clientWidth; - rect.width = element.clientWidth; - rect.height = element.clientHeight; - rect.x = rect.left; - rect.y = rect.top; - return rect; -} - -function getClientRectFromMixedType(element, clippingParent) { - return clippingParent === viewport ? rectToClientRect(getViewportRect(element)) : isHTMLElement(clippingParent) ? getInnerBoundingClientRect(clippingParent) : rectToClientRect(getDocumentRect(getDocumentElement(element))); -} // A "clipping parent" is an overflowable container with the characteristic of -// clipping (or hiding) overflowing elements with a position different from -// `initial` - - -function getClippingParents(element) { - var clippingParents = listScrollParents(getParentNode(element)); - var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0; - var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element; - - if (!isElement(clipperElement)) { - return []; - } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414 - - - return clippingParents.filter(function (clippingParent) { - return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body'; - }); -} // Gets the maximum area that the element is visible in due to any number of -// clipping parents - - -function getClippingRect(element, boundary, rootBoundary) { - var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary); - var clippingParents = [].concat(mainClippingParents, [rootBoundary]); - var firstClippingParent = clippingParents[0]; - var clippingRect = clippingParents.reduce(function (accRect, clippingParent) { - var rect = getClientRectFromMixedType(element, clippingParent); - accRect.top = max(rect.top, accRect.top); - accRect.right = min(rect.right, accRect.right); - accRect.bottom = min(rect.bottom, accRect.bottom); - accRect.left = max(rect.left, accRect.left); - return accRect; - }, getClientRectFromMixedType(element, firstClippingParent)); - clippingRect.width = clippingRect.right - clippingRect.left; - clippingRect.height = clippingRect.bottom - clippingRect.top; - clippingRect.x = clippingRect.left; - clippingRect.y = clippingRect.top; - return clippingRect; -} - -function getVariation(placement) { - return placement.split('-')[1]; -} - -function computeOffsets(_ref) { - var reference = _ref.reference, - element = _ref.element, - placement = _ref.placement; - var basePlacement = placement ? getBasePlacement(placement) : null; - var variation = placement ? getVariation(placement) : null; - var commonX = reference.x + reference.width / 2 - element.width / 2; - var commonY = reference.y + reference.height / 2 - element.height / 2; - var offsets; - - switch (basePlacement) { - case top: - offsets = { - x: commonX, - y: reference.y - element.height - }; - break; - - case bottom: - offsets = { - x: commonX, - y: reference.y + reference.height - }; - break; - - case right: - offsets = { - x: reference.x + reference.width, - y: commonY - }; - break; - - case left: - offsets = { - x: reference.x - element.width, - y: commonY - }; - break; - - default: - offsets = { - x: reference.x, - y: reference.y - }; - } - - var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null; - - if (mainAxis != null) { - var len = mainAxis === 'y' ? 'height' : 'width'; - - switch (variation) { - case start: - offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2); - break; - - case end: - offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2); - break; - } - } - - return offsets; -} - -function detectOverflow(state, options) { - if (options === void 0) { - options = {}; - } - - var _options = options, - _options$placement = _options.placement, - placement = _options$placement === void 0 ? state.placement : _options$placement, - _options$boundary = _options.boundary, - boundary = _options$boundary === void 0 ? clippingParents : _options$boundary, - _options$rootBoundary = _options.rootBoundary, - rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary, - _options$elementConte = _options.elementContext, - elementContext = _options$elementConte === void 0 ? popper : _options$elementConte, - _options$altBoundary = _options.altBoundary, - altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary, - _options$padding = _options.padding, - padding = _options$padding === void 0 ? 0 : _options$padding; - var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements)); - var altContext = elementContext === popper ? reference : popper; - var referenceElement = state.elements.reference; - var popperRect = state.rects.popper; - var element = state.elements[altBoundary ? altContext : elementContext]; - var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary); - var referenceClientRect = getBoundingClientRect(referenceElement); - var popperOffsets = computeOffsets({ - reference: referenceClientRect, - element: popperRect, - strategy: 'absolute', - placement: placement - }); - var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets)); - var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect - // 0 or negative = within the clipping rect - - var overflowOffsets = { - top: clippingClientRect.top - elementClientRect.top + paddingObject.top, - bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom, - left: clippingClientRect.left - elementClientRect.left + paddingObject.left, - right: elementClientRect.right - clippingClientRect.right + paddingObject.right - }; - var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element - - if (elementContext === popper && offsetData) { - var offset = offsetData[placement]; - Object.keys(overflowOffsets).forEach(function (key) { - var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1; - var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x'; - overflowOffsets[key] += offset[axis] * multiply; - }); - } - - return overflowOffsets; -} - -function computeAutoPlacement(state, options) { - if (options === void 0) { - options = {}; - } - - var _options = options, - placement = _options.placement, - boundary = _options.boundary, - rootBoundary = _options.rootBoundary, - padding = _options.padding, - flipVariations = _options.flipVariations, - _options$allowedAutoP = _options.allowedAutoPlacements, - allowedAutoPlacements = _options$allowedAutoP === void 0 ? placements : _options$allowedAutoP; - var variation = getVariation(placement); - var placements$1 = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) { - return getVariation(placement) === variation; - }) : basePlacements; - var allowedPlacements = placements$1.filter(function (placement) { - return allowedAutoPlacements.indexOf(placement) >= 0; - }); - - if (allowedPlacements.length === 0) { - allowedPlacements = placements$1; - - if (process.env.NODE_ENV !== "production") { - console.error(['Popper: The `allowedAutoPlacements` option did not allow any', 'placements. Ensure the `placement` option matches the variation', 'of the allowed placements.', 'For example, "auto" cannot be used to allow "bottom-start".', 'Use "auto-start" instead.'].join(' ')); - } - } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions... - - - var overflows = allowedPlacements.reduce(function (acc, placement) { - acc[placement] = detectOverflow(state, { - placement: placement, - boundary: boundary, - rootBoundary: rootBoundary, - padding: padding - })[getBasePlacement(placement)]; - return acc; - }, {}); - return Object.keys(overflows).sort(function (a, b) { - return overflows[a] - overflows[b]; - }); -} - -function getExpandedFallbackPlacements(placement) { - if (getBasePlacement(placement) === auto) { - return []; - } - - var oppositePlacement = getOppositePlacement(placement); - return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)]; -} - -function flip(_ref) { - var state = _ref.state, - options = _ref.options, - name = _ref.name; - - if (state.modifiersData[name]._skip) { - return; - } - - var _options$mainAxis = options.mainAxis, - checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, - _options$altAxis = options.altAxis, - checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis, - specifiedFallbackPlacements = options.fallbackPlacements, - padding = options.padding, - boundary = options.boundary, - rootBoundary = options.rootBoundary, - altBoundary = options.altBoundary, - _options$flipVariatio = options.flipVariations, - flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio, - allowedAutoPlacements = options.allowedAutoPlacements; - var preferredPlacement = state.options.placement; - var basePlacement = getBasePlacement(preferredPlacement); - var isBasePlacement = basePlacement === preferredPlacement; - var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement)); - var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) { - return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, { - placement: placement, - boundary: boundary, - rootBoundary: rootBoundary, - padding: padding, - flipVariations: flipVariations, - allowedAutoPlacements: allowedAutoPlacements - }) : placement); - }, []); - var referenceRect = state.rects.reference; - var popperRect = state.rects.popper; - var checksMap = new Map(); - var makeFallbackChecks = true; - var firstFittingPlacement = placements[0]; - - for (var i = 0; i < placements.length; i++) { - var placement = placements[i]; - - var _basePlacement = getBasePlacement(placement); - - var isStartVariation = getVariation(placement) === start; - var isVertical = [top, bottom].indexOf(_basePlacement) >= 0; - var len = isVertical ? 'width' : 'height'; - var overflow = detectOverflow(state, { - placement: placement, - boundary: boundary, - rootBoundary: rootBoundary, - altBoundary: altBoundary, - padding: padding - }); - var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top; - - if (referenceRect[len] > popperRect[len]) { - mainVariationSide = getOppositePlacement(mainVariationSide); - } - - var altVariationSide = getOppositePlacement(mainVariationSide); - var checks = []; - - if (checkMainAxis) { - checks.push(overflow[_basePlacement] <= 0); - } - - if (checkAltAxis) { - checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0); - } - - if (checks.every(function (check) { - return check; - })) { - firstFittingPlacement = placement; - makeFallbackChecks = false; - break; - } - - checksMap.set(placement, checks); - } - - if (makeFallbackChecks) { - // `2` may be desired in some cases – research later - var numberOfChecks = flipVariations ? 3 : 1; - - var _loop = function _loop(_i) { - var fittingPlacement = placements.find(function (placement) { - var checks = checksMap.get(placement); - - if (checks) { - return checks.slice(0, _i).every(function (check) { - return check; - }); - } - }); - - if (fittingPlacement) { - firstFittingPlacement = fittingPlacement; - return "break"; - } - }; - - for (var _i = numberOfChecks; _i > 0; _i--) { - var _ret = _loop(_i); - - if (_ret === "break") break; - } - } - - if (state.placement !== firstFittingPlacement) { - state.modifiersData[name]._skip = true; - state.placement = firstFittingPlacement; - state.reset = true; - } -} // eslint-disable-next-line import/no-unused-modules - - -var flip$1 = { - name: 'flip', - enabled: true, - phase: 'main', - fn: flip, - requiresIfExists: ['offset'], - data: { - _skip: false - } -}; - -function getSideOffsets(overflow, rect, preventedOffsets) { - if (preventedOffsets === void 0) { - preventedOffsets = { - x: 0, - y: 0 - }; - } - - return { - top: overflow.top - rect.height - preventedOffsets.y, - right: overflow.right - rect.width + preventedOffsets.x, - bottom: overflow.bottom - rect.height + preventedOffsets.y, - left: overflow.left - rect.width - preventedOffsets.x - }; -} - -function isAnySideFullyClipped(overflow) { - return [top, right, bottom, left].some(function (side) { - return overflow[side] >= 0; - }); -} - -function hide(_ref) { - var state = _ref.state, - name = _ref.name; - var referenceRect = state.rects.reference; - var popperRect = state.rects.popper; - var preventedOffsets = state.modifiersData.preventOverflow; - var referenceOverflow = detectOverflow(state, { - elementContext: 'reference' - }); - var popperAltOverflow = detectOverflow(state, { - altBoundary: true - }); - var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect); - var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets); - var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets); - var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets); - state.modifiersData[name] = { - referenceClippingOffsets: referenceClippingOffsets, - popperEscapeOffsets: popperEscapeOffsets, - isReferenceHidden: isReferenceHidden, - hasPopperEscaped: hasPopperEscaped - }; - state.attributes.popper = Object.assign({}, state.attributes.popper, { - 'data-popper-reference-hidden': isReferenceHidden, - 'data-popper-escaped': hasPopperEscaped - }); -} // eslint-disable-next-line import/no-unused-modules - - -var hide$1 = { - name: 'hide', - enabled: true, - phase: 'main', - requiresIfExists: ['preventOverflow'], - fn: hide -}; - -function distanceAndSkiddingToXY(placement, rects, offset) { - var basePlacement = getBasePlacement(placement); - var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1; - - var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, { - placement: placement - })) : offset, - skidding = _ref[0], - distance = _ref[1]; - - skidding = skidding || 0; - distance = (distance || 0) * invertDistance; - return [left, right].indexOf(basePlacement) >= 0 ? { - x: distance, - y: skidding - } : { - x: skidding, - y: distance - }; -} - -function offset(_ref2) { - var state = _ref2.state, - options = _ref2.options, - name = _ref2.name; - var _options$offset = options.offset, - offset = _options$offset === void 0 ? [0, 0] : _options$offset; - var data = placements.reduce(function (acc, placement) { - acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset); - return acc; - }, {}); - var _data$state$placement = data[state.placement], - x = _data$state$placement.x, - y = _data$state$placement.y; - - if (state.modifiersData.popperOffsets != null) { - state.modifiersData.popperOffsets.x += x; - state.modifiersData.popperOffsets.y += y; - } - - state.modifiersData[name] = data; -} // eslint-disable-next-line import/no-unused-modules - - -var offset$1 = { - name: 'offset', - enabled: true, - phase: 'main', - requires: ['popperOffsets'], - fn: offset -}; - -function popperOffsets(_ref) { - var state = _ref.state, - name = _ref.name; - // Offsets are the actual position the popper needs to have to be - // properly positioned near its reference element - // This is the most basic placement, and will be adjusted by - // the modifiers in the next step - state.modifiersData[name] = computeOffsets({ - reference: state.rects.reference, - element: state.rects.popper, - strategy: 'absolute', - placement: state.placement - }); -} // eslint-disable-next-line import/no-unused-modules - - -var popperOffsets$1 = { - name: 'popperOffsets', - enabled: true, - phase: 'read', - fn: popperOffsets, - data: {} -}; - -function getAltAxis(axis) { - return axis === 'x' ? 'y' : 'x'; -} - -function preventOverflow(_ref) { - var state = _ref.state, - options = _ref.options, - name = _ref.name; - var _options$mainAxis = options.mainAxis, - checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, - _options$altAxis = options.altAxis, - checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis, - boundary = options.boundary, - rootBoundary = options.rootBoundary, - altBoundary = options.altBoundary, - padding = options.padding, - _options$tether = options.tether, - tether = _options$tether === void 0 ? true : _options$tether, - _options$tetherOffset = options.tetherOffset, - tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset; - var overflow = detectOverflow(state, { - boundary: boundary, - rootBoundary: rootBoundary, - padding: padding, - altBoundary: altBoundary - }); - var basePlacement = getBasePlacement(state.placement); - var variation = getVariation(state.placement); - var isBasePlacement = !variation; - var mainAxis = getMainAxisFromPlacement(basePlacement); - var altAxis = getAltAxis(mainAxis); - var popperOffsets = state.modifiersData.popperOffsets; - var referenceRect = state.rects.reference; - var popperRect = state.rects.popper; - var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, { - placement: state.placement - })) : tetherOffset; - var data = { - x: 0, - y: 0 - }; - - if (!popperOffsets) { - return; - } - - if (checkMainAxis || checkAltAxis) { - var mainSide = mainAxis === 'y' ? top : left; - var altSide = mainAxis === 'y' ? bottom : right; - var len = mainAxis === 'y' ? 'height' : 'width'; - var offset = popperOffsets[mainAxis]; - var min$1 = popperOffsets[mainAxis] + overflow[mainSide]; - var max$1 = popperOffsets[mainAxis] - overflow[altSide]; - var additive = tether ? -popperRect[len] / 2 : 0; - var minLen = variation === start ? referenceRect[len] : popperRect[len]; - var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go - // outside the reference bounds - - var arrowElement = state.elements.arrow; - var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : { - width: 0, - height: 0 - }; - var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject(); - var arrowPaddingMin = arrowPaddingObject[mainSide]; - var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want - // to include its full size in the calculation. If the reference is small - // and near the edge of a boundary, the popper can overflow even if the - // reference is not overflowing as well (e.g. virtual elements with no - // width or height) - - var arrowLen = within(0, referenceRect[len], arrowRect[len]); - var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - tetherOffsetValue : minLen - arrowLen - arrowPaddingMin - tetherOffsetValue; - var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + tetherOffsetValue : maxLen + arrowLen + arrowPaddingMax + tetherOffsetValue; - var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow); - var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0; - var offsetModifierValue = state.modifiersData.offset ? state.modifiersData.offset[state.placement][mainAxis] : 0; - var tetherMin = popperOffsets[mainAxis] + minOffset - offsetModifierValue - clientOffset; - var tetherMax = popperOffsets[mainAxis] + maxOffset - offsetModifierValue; - - if (checkMainAxis) { - var preventedOffset = within(tether ? min(min$1, tetherMin) : min$1, offset, tether ? max(max$1, tetherMax) : max$1); - popperOffsets[mainAxis] = preventedOffset; - data[mainAxis] = preventedOffset - offset; - } - - if (checkAltAxis) { - var _mainSide = mainAxis === 'x' ? top : left; - - var _altSide = mainAxis === 'x' ? bottom : right; - - var _offset = popperOffsets[altAxis]; - - var _min = _offset + overflow[_mainSide]; - - var _max = _offset - overflow[_altSide]; - - var _preventedOffset = within(tether ? min(_min, tetherMin) : _min, _offset, tether ? max(_max, tetherMax) : _max); - - popperOffsets[altAxis] = _preventedOffset; - data[altAxis] = _preventedOffset - _offset; - } - } - - state.modifiersData[name] = data; -} // eslint-disable-next-line import/no-unused-modules - - -var preventOverflow$1 = { - name: 'preventOverflow', - enabled: true, - phase: 'main', - fn: preventOverflow, - requiresIfExists: ['offset'] -}; - -function getHTMLElementScroll(element) { - return { - scrollLeft: element.scrollLeft, - scrollTop: element.scrollTop - }; -} - -function getNodeScroll(node) { - if (node === getWindow(node) || !isHTMLElement(node)) { - return getWindowScroll(node); - } else { - return getHTMLElementScroll(node); - } -} - -// Composite means it takes into account transforms as well as layout. - -function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) { - if (isFixed === void 0) { - isFixed = false; - } - - var documentElement = getDocumentElement(offsetParent); - var rect = getBoundingClientRect(elementOrVirtualElement); - var isOffsetParentAnElement = isHTMLElement(offsetParent); - var scroll = { - scrollLeft: 0, - scrollTop: 0 - }; - var offsets = { - x: 0, - y: 0 - }; - - if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { - if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078 - isScrollParent(documentElement)) { - scroll = getNodeScroll(offsetParent); - } - - if (isHTMLElement(offsetParent)) { - offsets = getBoundingClientRect(offsetParent); - offsets.x += offsetParent.clientLeft; - offsets.y += offsetParent.clientTop; - } else if (documentElement) { - offsets.x = getWindowScrollBarX(documentElement); - } - } - - return { - x: rect.left + scroll.scrollLeft - offsets.x, - y: rect.top + scroll.scrollTop - offsets.y, - width: rect.width, - height: rect.height - }; -} - -function order(modifiers) { - var map = new Map(); - var visited = new Set(); - var result = []; - modifiers.forEach(function (modifier) { - map.set(modifier.name, modifier); - }); // On visiting object, check for its dependencies and visit them recursively - - function sort(modifier) { - visited.add(modifier.name); - var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []); - requires.forEach(function (dep) { - if (!visited.has(dep)) { - var depModifier = map.get(dep); - - if (depModifier) { - sort(depModifier); - } - } - }); - result.push(modifier); - } - - modifiers.forEach(function (modifier) { - if (!visited.has(modifier.name)) { - // check for visited object - sort(modifier); - } - }); - return result; -} - -function orderModifiers(modifiers) { - // order based on dependencies - var orderedModifiers = order(modifiers); // order based on phase - - return modifierPhases.reduce(function (acc, phase) { - return acc.concat(orderedModifiers.filter(function (modifier) { - return modifier.phase === phase; - })); - }, []); -} - -function debounce(fn) { - var pending; - return function () { - if (!pending) { - pending = new Promise(function (resolve) { - Promise.resolve().then(function () { - pending = undefined; - resolve(fn()); - }); - }); - } - - return pending; - }; -} - -function format(str) { - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } - - return [].concat(args).reduce(function (p, c) { - return p.replace(/%s/, c); - }, str); -} - -var INVALID_MODIFIER_ERROR = 'Popper: modifier "%s" provided an invalid %s property, expected %s but got %s'; -var MISSING_DEPENDENCY_ERROR = 'Popper: modifier "%s" requires "%s", but "%s" modifier is not available'; -var VALID_PROPERTIES = ['name', 'enabled', 'phase', 'fn', 'effect', 'requires', 'options']; -function validateModifiers(modifiers) { - modifiers.forEach(function (modifier) { - Object.keys(modifier).forEach(function (key) { - switch (key) { - case 'name': - if (typeof modifier.name !== 'string') { - console.error(format(INVALID_MODIFIER_ERROR, String(modifier.name), '"name"', '"string"', "\"" + String(modifier.name) + "\"")); - } - - break; - - case 'enabled': - if (typeof modifier.enabled !== 'boolean') { - console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"enabled"', '"boolean"', "\"" + String(modifier.enabled) + "\"")); - } - - case 'phase': - if (modifierPhases.indexOf(modifier.phase) < 0) { - console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"phase"', "either " + modifierPhases.join(', '), "\"" + String(modifier.phase) + "\"")); - } - - break; - - case 'fn': - if (typeof modifier.fn !== 'function') { - console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"fn"', '"function"', "\"" + String(modifier.fn) + "\"")); - } - - break; - - case 'effect': - if (typeof modifier.effect !== 'function') { - console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"effect"', '"function"', "\"" + String(modifier.fn) + "\"")); - } - - break; - - case 'requires': - if (!Array.isArray(modifier.requires)) { - console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"requires"', '"array"', "\"" + String(modifier.requires) + "\"")); - } - - break; - - case 'requiresIfExists': - if (!Array.isArray(modifier.requiresIfExists)) { - console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"requiresIfExists"', '"array"', "\"" + String(modifier.requiresIfExists) + "\"")); - } - - break; - - case 'options': - case 'data': - break; - - default: - console.error("PopperJS: an invalid property has been provided to the \"" + modifier.name + "\" modifier, valid properties are " + VALID_PROPERTIES.map(function (s) { - return "\"" + s + "\""; - }).join(', ') + "; but \"" + key + "\" was provided."); - } - - modifier.requires && modifier.requires.forEach(function (requirement) { - if (modifiers.find(function (mod) { - return mod.name === requirement; - }) == null) { - console.error(format(MISSING_DEPENDENCY_ERROR, String(modifier.name), requirement, requirement)); - } - }); - }); - }); -} - -function uniqueBy(arr, fn) { - var identifiers = new Set(); - return arr.filter(function (item) { - var identifier = fn(item); - - if (!identifiers.has(identifier)) { - identifiers.add(identifier); - return true; - } - }); -} - -function mergeByName(modifiers) { - var merged = modifiers.reduce(function (merged, current) { - var existing = merged[current.name]; - merged[current.name] = existing ? Object.assign({}, existing, current, { - options: Object.assign({}, existing.options, current.options), - data: Object.assign({}, existing.data, current.data) - }) : current; - return merged; - }, {}); // IE11 does not support Object.values - - return Object.keys(merged).map(function (key) { - return merged[key]; - }); -} - -var INVALID_ELEMENT_ERROR = 'Popper: Invalid reference or popper argument provided. They must be either a DOM element or virtual element.'; -var INFINITE_LOOP_ERROR = 'Popper: An infinite loop in the modifiers cycle has been detected! The cycle has been interrupted to prevent a browser crash.'; -var DEFAULT_OPTIONS = { - placement: 'bottom', - modifiers: [], - strategy: 'absolute' -}; - -function areValidElements() { - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - - return !args.some(function (element) { - return !(element && typeof element.getBoundingClientRect === 'function'); - }); -} - -function popperGenerator(generatorOptions) { - if (generatorOptions === void 0) { - generatorOptions = {}; - } - - var _generatorOptions = generatorOptions, - _generatorOptions$def = _generatorOptions.defaultModifiers, - defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def, - _generatorOptions$def2 = _generatorOptions.defaultOptions, - defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2; - return function createPopper(reference, popper, options) { - if (options === void 0) { - options = defaultOptions; - } - - var state = { - placement: 'bottom', - orderedModifiers: [], - options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions), - modifiersData: {}, - elements: { - reference: reference, - popper: popper - }, - attributes: {}, - styles: {} - }; - var effectCleanupFns = []; - var isDestroyed = false; - var instance = { - state: state, - setOptions: function setOptions(options) { - cleanupModifierEffects(); - state.options = Object.assign({}, defaultOptions, state.options, options); - state.scrollParents = { - reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [], - popper: listScrollParents(popper) - }; // Orders the modifiers based on their dependencies and `phase` - // properties - - var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers - - state.orderedModifiers = orderedModifiers.filter(function (m) { - return m.enabled; - }); // Validate the provided modifiers so that the consumer will get warned - // if one of the modifiers is invalid for any reason - - if (process.env.NODE_ENV !== "production") { - var modifiers = uniqueBy([].concat(orderedModifiers, state.options.modifiers), function (_ref) { - var name = _ref.name; - return name; - }); - validateModifiers(modifiers); - - if (getBasePlacement(state.options.placement) === auto) { - var flipModifier = state.orderedModifiers.find(function (_ref2) { - var name = _ref2.name; - return name === 'flip'; - }); - - if (!flipModifier) { - console.error(['Popper: "auto" placements require the "flip" modifier be', 'present and enabled to work.'].join(' ')); - } - } - - var _getComputedStyle = getComputedStyle(popper), - marginTop = _getComputedStyle.marginTop, - marginRight = _getComputedStyle.marginRight, - marginBottom = _getComputedStyle.marginBottom, - marginLeft = _getComputedStyle.marginLeft; // We no longer take into account `margins` on the popper, and it can - // cause bugs with positioning, so we'll warn the consumer - - - if ([marginTop, marginRight, marginBottom, marginLeft].some(function (margin) { - return parseFloat(margin); - })) { - console.warn(['Popper: CSS "margin" styles cannot be used to apply padding', 'between the popper and its reference element or boundary.', 'To replicate margin, use the `offset` modifier, as well as', 'the `padding` option in the `preventOverflow` and `flip`', 'modifiers.'].join(' ')); - } - } - - runModifierEffects(); - return instance.update(); - }, - // Sync update – it will always be executed, even if not necessary. This - // is useful for low frequency updates where sync behavior simplifies the - // logic. - // For high frequency updates (e.g. `resize` and `scroll` events), always - // prefer the async Popper#update method - forceUpdate: function forceUpdate() { - if (isDestroyed) { - return; - } - - var _state$elements = state.elements, - reference = _state$elements.reference, - popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements - // anymore - - if (!areValidElements(reference, popper)) { - if (process.env.NODE_ENV !== "production") { - console.error(INVALID_ELEMENT_ERROR); - } - - return; - } // Store the reference and popper rects to be read by modifiers - - - state.rects = { - reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'), - popper: getLayoutRect(popper) - }; // Modifiers have the ability to reset the current update cycle. The - // most common use case for this is the `flip` modifier changing the - // placement, which then needs to re-run all the modifiers, because the - // logic was previously ran for the previous placement and is therefore - // stale/incorrect - - state.reset = false; - state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier - // is filled with the initial data specified by the modifier. This means - // it doesn't persist and is fresh on each update. - // To ensure persistent data, use `${name}#persistent` - - state.orderedModifiers.forEach(function (modifier) { - return state.modifiersData[modifier.name] = Object.assign({}, modifier.data); - }); - var __debug_loops__ = 0; - - for (var index = 0; index < state.orderedModifiers.length; index++) { - if (process.env.NODE_ENV !== "production") { - __debug_loops__ += 1; - - if (__debug_loops__ > 100) { - console.error(INFINITE_LOOP_ERROR); - break; - } - } - - if (state.reset === true) { - state.reset = false; - index = -1; - continue; - } - - var _state$orderedModifie = state.orderedModifiers[index], - fn = _state$orderedModifie.fn, - _state$orderedModifie2 = _state$orderedModifie.options, - _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2, - name = _state$orderedModifie.name; - - if (typeof fn === 'function') { - state = fn({ - state: state, - options: _options, - name: name, - instance: instance - }) || state; - } - } - }, - // Async and optimistically optimized update – it will not be executed if - // not necessary (debounced to run at most once-per-tick) - update: debounce(function () { - return new Promise(function (resolve) { - instance.forceUpdate(); - resolve(state); - }); - }), - destroy: function destroy() { - cleanupModifierEffects(); - isDestroyed = true; - } - }; - - if (!areValidElements(reference, popper)) { - if (process.env.NODE_ENV !== "production") { - console.error(INVALID_ELEMENT_ERROR); - } - - return instance; - } - - instance.setOptions(options).then(function (state) { - if (!isDestroyed && options.onFirstUpdate) { - options.onFirstUpdate(state); - } - }); // Modifiers have the ability to execute arbitrary code before the first - // update cycle runs. They will be executed in the same order as the update - // cycle. This is useful when a modifier adds some persistent data that - // other modifiers need to use, but the modifier is run after the dependent - // one. - - function runModifierEffects() { - state.orderedModifiers.forEach(function (_ref3) { - var name = _ref3.name, - _ref3$options = _ref3.options, - options = _ref3$options === void 0 ? {} : _ref3$options, - effect = _ref3.effect; - - if (typeof effect === 'function') { - var cleanupFn = effect({ - state: state, - name: name, - instance: instance, - options: options - }); - - var noopFn = function noopFn() {}; - - effectCleanupFns.push(cleanupFn || noopFn); - } - }); - } - - function cleanupModifierEffects() { - effectCleanupFns.forEach(function (fn) { - return fn(); - }); - effectCleanupFns = []; - } - - return instance; - }; -} - -var defaultModifiers = [eventListeners, popperOffsets$1, computeStyles$1, applyStyles$1, offset$1, flip$1, preventOverflow$1, arrow$1, hide$1]; -var createPopper = /*#__PURE__*/popperGenerator({ - defaultModifiers: defaultModifiers -}); // eslint-disable-next-line import/no-unused-modules - -// Stole All this from Liam's Periodic Notes Plugin: https://github.com/liamcain/obsidian-periodic-notes -class Suggest { - constructor(owner, containerEl, scope) { - this.owner = owner; - this.containerEl = containerEl; - containerEl.on("click", ".suggestion-item", this.onSuggestionClick.bind(this)); - containerEl.on("mousemove", ".suggestion-item", this.onSuggestionMouseover.bind(this)); - scope.register([], "ArrowUp", (event) => { - if (!event.isComposing) { - this.setSelectedItem(this.selectedItem - 1, true); - return false; - } - }); - scope.register([], "ArrowDown", (event) => { - if (!event.isComposing) { - this.setSelectedItem(this.selectedItem + 1, true); - return false; - } - }); - scope.register([], "Enter", (event) => { - if (!event.isComposing) { - this.useSelectedItem(event); - return false; - } - }); - } - onSuggestionClick(event, el) { - event.preventDefault(); - const item = this.suggestions.indexOf(el); - this.setSelectedItem(item, false); - this.useSelectedItem(event); - } - onSuggestionMouseover(_event, el) { - const item = this.suggestions.indexOf(el); - this.setSelectedItem(item, false); - } - setSuggestions(values) { - this.containerEl.empty(); - const suggestionEls = []; - values.forEach((value) => { - const suggestionEl = this.containerEl.createDiv("suggestion-item"); - this.owner.renderSuggestion(value, suggestionEl); - suggestionEls.push(suggestionEl); - }); - this.values = values; - this.suggestions = suggestionEls; - this.setSelectedItem(0, false); - } - useSelectedItem(event) { - const currentValue = this.values[this.selectedItem]; - if (currentValue) { - this.owner.selectSuggestion(currentValue, event); - } - } - setSelectedItem(selectedIndex, scrollIntoView) { - const normalizedIndex = wrapAround(selectedIndex, this.suggestions.length); - const prevSelectedSuggestion = this.suggestions[this.selectedItem]; - const selectedSuggestion = this.suggestions[normalizedIndex]; - prevSelectedSuggestion?.removeClass("is-selected"); - selectedSuggestion?.addClass("is-selected"); - this.selectedItem = normalizedIndex; - if (scrollIntoView) { - selectedSuggestion.scrollIntoView(false); - } - } -} -class TextInputSuggest { - constructor(app, inputEl) { - this.app = app; - this.inputEl = inputEl; - this.scope = new obsidian.Scope(); - this.suggestEl = createDiv("suggestion-container"); - const suggestion = this.suggestEl.createDiv("suggestion"); - this.suggest = new Suggest(this, suggestion, this.scope); - this.scope.register([], "Escape", this.close.bind(this)); - this.inputEl.addEventListener("input", this.onInputChanged.bind(this)); - this.inputEl.addEventListener("focus", this.onInputChanged.bind(this)); - this.inputEl.addEventListener("blur", this.close.bind(this)); - this.suggestEl.on("mousedown", ".suggestion-container", (event) => { - event.preventDefault(); - }); - } - onInputChanged() { - const inputStr = this.inputEl.value; - const suggestions = this.getSuggestions(inputStr); - if (suggestions.length > 0) { - this.suggest.setSuggestions(suggestions); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - this.open(this.app.dom.appContainerEl, this.inputEl); - } - } - open(container, inputEl) { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - this.app.keymap.pushScope(this.scope); - container.appendChild(this.suggestEl); - this.popper = createPopper(inputEl, this.suggestEl, { - placement: "bottom-start", - modifiers: [ - { - name: "sameWidth", - enabled: true, - fn: ({ state, instance }) => { - // Note: positioning needs to be calculated twice - - // first pass - positioning it according to the width of the popper - // second pass - position it with the width bound to the reference element - // we need to early exit to avoid an infinite loop - const targetWidth = `${state.rects.reference.width}px`; - if (state.styles.popper.width === targetWidth) { - return; - } - state.styles.popper.width = targetWidth; - instance.update(); - }, - phase: "beforeWrite", - requires: ["computeStyles"], - }, - ], - }); - } - close() { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - this.app.keymap.popScope(this.scope); - this.suggest.setSuggestions([]); - this.popper && this.popper.destroy(); - this.suggestEl.detach(); - } -} -class CommandSuggest extends TextInputSuggest { - getSuggestions(inputStr) { - const commands = this.app.commands.commands; - const commandNames = []; - const inputLowerCase = inputStr.toLowerCase(); - for (const command in commands) { - const commandObj = commands[command]; - if (commandObj.name.toLowerCase().contains(inputLowerCase)) { - commandNames.push(commandObj); - } - } - return commandNames; - } - renderSuggestion(command, el) { - el.setText(command.name); - } - selectSuggestion(command) { - this.inputEl.value = command.name; - this.inputEl.trigger("input"); - this.close(); - } -} -class TemplateSuggest extends TextInputSuggest { - constructor() { - super(...arguments); - this.templatesEnabled = this.app.internalPlugins.plugins.templates.enabled; - this.templaterPlugin = this.app.plugins.plugins["templater-obsidian"]; - // only run if templates plugin is enabled - this.folder = () => { - const folders = []; - if (this.templatesEnabled) { - const folder = this.app.internalPlugins.plugins.templates.instance.options - .folder; - if (folder) { - folders.push(folder.toLowerCase()); - } - if (this.templaterPlugin) { - const folder = this.templaterPlugin.settings.template_folder; - if (folder) { - folders.push(folder.toLowerCase()); - } - } - } - return folders[0] ? folders : undefined; - }; - } - getSuggestions(inputStr) { - const abstractFiles = this.app.vault.getAllLoadedFiles(); - const files = []; - const lowerCaseInputStr = inputStr.toLowerCase(); - const folders = this.folder(); - abstractFiles.forEach((file) => { - let exists = false; - folders && - folders.forEach((folder) => { - if (file.path.toLowerCase().contains(`${folder}/`)) { - exists = true; - } - }); - if (file instanceof obsidian.TFile && - file.extension === "md" && - exists && - file.path.toLowerCase().contains(lowerCaseInputStr)) { - files.push(file); - } - }); - return files; - } - renderSuggestion(file, el) { - el.setText(file.name.split(".")[0]); - } - selectSuggestion(file) { - this.inputEl.value = file.name.split(".")[0]; - this.inputEl.trigger("input"); - this.close(); - } -} -class ButtonSuggest extends TextInputSuggest { - getSuggestions() { - const buttonStore = getStore(this.app.isMobile); - const buttons = []; - buttonStore.forEach((button) => { - const trimmed = button.id.split("-")[1]; - buttons.push(trimmed); - }); - return buttons; - } - renderSuggestion(button, el) { - el.setText(button); - } - selectSuggestion(button) { - this.inputEl.value = this.inputEl.value + button; - this.inputEl.trigger("input"); - this.close(); - } -} - -class ButtonModal extends obsidian.Modal { - constructor(app) { - super(app); - this.buttonPreviewEl = createEl("p"); - this.commandSuggestEl = createEl("input", { type: "text" }); - this.fileSuggestEl = createEl("input", { type: "text" }); - this.removeSuggestEl = createEl("input", { type: "text" }); - this.swapSuggestEl = createEl("input", { type: "text" }); - this.idSuggestEl = createEl("input", { type: "text" }); - this.outputObject = { - name: "", - type: "", - action: "", - swap: "", - remove: "", - replace: "", - id: "", - templater: false, - class: "", - color: "", - blockId: "", - }; - this.commandSuggest = new CommandSuggest(this.app, this.commandSuggestEl); - this.commandSuggestEl.placeholder = "Toggle Pin"; - this.commandSuggestEl.addEventListener("change", (e) => { - this.outputObject.action = e.target.value; - }); - this.commandSuggestEl.addEventListener("blur", (e) => { - this.outputObject.action = e.target.value; - }); - this.fileSuggest = new TemplateSuggest(this.app, this.fileSuggestEl); - this.fileSuggestEl.placeholder = "My Template"; - this.fileSuggestEl.addEventListener("change", (e) => { - this.outputObject.action = e.target.value; - }); - this.fileSuggestEl.addEventListener("blur", (e) => { - this.outputObject.action = e.target.value; - }); - this.removeSuggest = new ButtonSuggest(this.app, this.removeSuggestEl); - this.removeSuggestEl.value = "true"; - this.removeSuggestEl.addEventListener("change", (e) => { - this.outputObject.remove = e.target.value; - }); - this.removeSuggestEl.addEventListener("blur", (e) => { - this.outputObject.remove = e.target.value; - }); - this.swapSuggest = new ButtonSuggest(this.app, this.swapSuggestEl); - this.swapSuggestEl.addEventListener("change", (e) => { - this.outputObject.swap = e.target.value; - }); - this.swapSuggestEl.addEventListener("blur", (e) => { - this.outputObject.swap = e.target.value; - }); - this.idSuggest = new ButtonSuggest(this.app, this.idSuggestEl); - this.idSuggestEl.addEventListener("change", (e) => { - this.outputObject.id = e.target.value; - }); - this.idSuggestEl.addEventListener("blur", (e) => { - this.outputObject.id = e.target.value; - }); - this.swapSuggestEl.placeholder = "[idOne, idTwo]"; - } - onOpen() { - const { titleEl, contentEl } = this; - titleEl.setText("Button Maker"); - contentEl.addClass("button-maker"); - contentEl.createEl("form", {}, (formEl) => { - new obsidian.Setting(formEl) - .setName("Button Name") - .setDesc("What would you like to call this button?") - .addText((textEl) => { - textEl.setPlaceholder("My Awesome Button"); - textEl.onChange((value) => { - this.buttonPreviewEl.setText(value); - this.outputObject.name = value; - }); - window.setTimeout(() => textEl.inputEl.focus(), 10); - }); - const typeContainer = createEl("div"); - const typeTitle = createEl("span", { cls: "setting-item-title" }); - typeTitle.setText("Button Type"); - const typeDesc = createEl("div", { cls: "setting-item-description" }); - typeDesc.setText("What type of button are you making?"); - formEl.appendChild(typeContainer); - typeContainer.appendChild(typeTitle); - typeContainer.appendChild(typeDesc); - new obsidian.Setting(typeDesc).addDropdown((drop) => { - drop.addOption("pre", "Select a Button Type"); - drop.addOption("command", "Command - run a command prompt command"); - drop.addOption("link", "Link - open a url or uri"); - drop.addOption("template", "Template - insert or create notes from templates"); - drop.addOption("text", "Text - insert or create notes with text"); - drop.addOption("calculate", "Calculate - run a mathematical calculation"); - drop.addOption("swap", "Swap - Create a multi-purpose Inline Button from other Buttons"); - const action = formEl.createEl("div"); - drop.onChange((value) => { - this.outputObject.type = value; - if (value === "link") { - action.empty(); - new obsidian.Setting(action) - .setName("Link") - .setDesc("Enter a link to open") - .addText((textEl) => { - textEl.setPlaceholder("https://obsidian.md"); - textEl.onChange((value) => (this.outputObject.action = value)); - }); - } - if (value === "command") { - action.empty(); - new obsidian.Setting(action) - .setName("Command") - .setDesc("Enter a command to run") - .addText((textEl) => { - textEl.inputEl.replaceWith(this.commandSuggestEl); - }); - } - if (value.includes("template")) { - action.empty(); - new obsidian.Setting(action) - .setName("Template") - .setDesc("Select a template note and what should happen") - .addDropdown((drop) => { - drop.addOption("pre", "Do this..."); - drop.addOption("prepend template", "Prepend"); - drop.addOption("append template", "Append"); - drop.addOption("line template", "Line"); - drop.addOption("note template", "Note"); - drop.onChange((value) => { - this.outputObject.type = value; - if (value == "line template") { - new obsidian.Setting(action) - .setName("Line Number") - .setDesc("At which line should the template be inserted?") - .addText((textEl) => { - textEl.setPlaceholder("69"); - textEl.onChange((value) => { - this.outputObject.type = `line(${value}) template`; - }); - }); - } - if (value == "note template") { - new obsidian.Setting(action) - .setName("Note Name") - .setDesc("What should the new note be named?") - .addText((textEl) => { - textEl.setPlaceholder("My New Note"); - new obsidian.Setting(action) - .setName("Split") - .setDesc("Should the new note open in a split pane?") - .addToggle((toggleEl) => { - this.outputObject.type = `note(${textEl.getValue}) template`; - textEl.onChange((textVal) => { - const toggleVal = toggleEl.getValue(); - if (toggleVal) { - this.outputObject.type = `note(${textVal}, split) template`; - } - if (!toggleVal) { - this.outputObject.type = `note(${textVal}) template`; - } - }); - toggleEl.onChange((toggleVal) => { - const textVal = textEl.getValue(); - if (toggleVal) { - this.outputObject.type = `note(${textVal}, split) template`; - } - if (!toggleVal) { - this.outputObject.type = `note(${textVal}) template`; - } - }); - }); - }); - } - }); - }) - .addText((textEl) => { - textEl.inputEl.replaceWith(this.fileSuggestEl); - }); - } - if (value.includes("text")) { - action.empty(); - new obsidian.Setting(action) - .setName("Text") - .setDesc("What text and where should it go?") - .addDropdown((drop) => { - drop.addOption("pre", "Do this..."); - drop.addOption("prepend text", "Prepend"); - drop.addOption("append text", "Append"); - drop.addOption("line text", "Line"); - drop.addOption("note text", "Note"); - drop.onChange((value) => { - this.outputObject.type = value; - if (value == "line text") { - new obsidian.Setting(action) - .setName("Line Number") - .setDesc("At which line should the template be inserted?") - .addText((textEl) => { - textEl.setPlaceholder("69"); - textEl.onChange((value) => { - this.outputObject.type = `line(${value}) text`; - }); - }); - } - if (value == "note text") { - new obsidian.Setting(action) - .setName("Note Name") - .setDesc("What should the new note be named?") - .addText((textEl) => { - textEl.setPlaceholder("My New Note"); - new obsidian.Setting(action) - .setName("Split") - .setDesc("Should the new note open in a split pane?") - .addToggle((toggleEl) => { - this.outputObject.type = `note(${textEl.getValue}) text`; - textEl.onChange((textVal) => { - const toggleVal = toggleEl.getValue(); - if (toggleVal) { - this.outputObject.type = `note(${textVal}, split) text`; - } - if (!toggleVal) { - this.outputObject.type = `note(${textVal}) text`; - } - }); - toggleEl.onChange((toggleVal) => { - const textVal = textEl.getValue(); - if (toggleVal) { - this.outputObject.type = `note(${textVal}, split) text`; - } - if (!toggleVal) { - this.outputObject.type = `note(${textVal}) text`; - } - }); - }); - }); - } - }); - }) - .addText((textEl) => { - textEl.setPlaceholder("My Text to Insert"); - textEl.onChange((value) => { - this.outputObject.action = value; - }); - }); - } - if (value === "calculate") { - action.empty(); - new obsidian.Setting(action) - .setName("Calculate") - .setDesc("Enter a calculation, you can reference a line number with $LineNumber") - .addText((textEl) => { - textEl.setPlaceholder("2+$10"); - textEl.onChange((value) => (this.outputObject.action = value)); - }); - } - if (value === "swap") { - this.outputObject.type = ""; - action.empty(); - new obsidian.Setting(action) - .setName("Swap") - .setDesc("choose buttons to be included in the Inline Swap Button") - .addText((textEl) => { - textEl.inputEl.replaceWith(this.swapSuggestEl); - }); - } - }); - }); - new obsidian.Setting(formEl) - .setName("Button Block ID") - .setDesc("Provide a custom button-block-id") - .addText((textEl) => { - textEl.setPlaceholder("buttonId"); - textEl.onChange((value) => { - this.outputObject.blockId = value; - }); - }); - new obsidian.Setting(formEl) - .setName("Remove") - .setDesc("Would you like to remove this button (or other buttons) after clicking?") - .addToggle((toggleEl) => { - toggleEl.onChange((value) => { - if (value) { - new obsidian.Setting(remove) - .setName("Select Remove") - .setDesc("Use true to remove this button, or supply an [array] of button block-ids") - .addText((textEl) => { - textEl.inputEl.replaceWith(this.removeSuggestEl); - }); - } - if (!value) { - this.outputObject.remove = ""; - remove.empty(); - } - }); - }); - const remove = formEl.createEl("div"); - new obsidian.Setting(formEl) - .setName("Replace") - .setDesc("Would you like to replace lines in the note after clicking?") - .addToggle((toggleEl) => { - toggleEl.onChange((value) => { - if (value) { - new obsidian.Setting(replace) - .setName("Select Lines") - .setDesc("Supply an array of [startingLine, endingLine] to be replaced") - .addText((textEl) => { - textEl.setValue("[]"); - textEl.onChange((value) => (this.outputObject.replace = value)); - }); - } - if (!value) { - replace.empty(); - } - }); - }); - const replace = formEl.createEl("div"); - new obsidian.Setting(formEl) - .setName("Inherit") - .setDesc("Would you like to inherit args by adding an existing button block-id?") - .addToggle((toggleEl) => { - toggleEl.onChange((value) => { - if (value) { - new obsidian.Setting(id) - .setName("id") - .setDesc("inherit from other Buttons by adding their button block-id") - .addText((textEl) => { - textEl.inputEl.replaceWith(this.idSuggestEl); - }); - } - if (!value) { - this.outputObject.replace = ""; - id.empty(); - } - }); - }); - const id = formEl.createEl("div"); - new obsidian.Setting(formEl) - .setName("Templater") - .setDesc("Do you want to convert a templater command inside your Button on each click?") - .addToggle((toggleEl) => { - toggleEl.setTooltip("Do not use for inline Button"); - toggleEl.onChange((value) => { - this.outputObject.templater = value; - }); - }); - new obsidian.Setting(formEl) - .setName("Custom Class") - .setDesc("Add a custom class for button styling") - .addText((textEl) => { - textEl.onChange((value) => { - this.buttonPreviewEl.setAttribute("class", value); - this.outputObject.class = value; - if (value === "") { - this.buttonPreviewEl.setAttribute("class", "button-default"); - } - }); - }); - new obsidian.Setting(formEl) - .setName("Color") - .setDesc("What color would you like your button to be?") - .addDropdown((drop) => { - drop.addOption("default", "Default Color"); - drop.addOption("blue", "Blue"); - drop.addOption("red", "Red"); - drop.addOption("green", "Green"); - drop.addOption("yellow", "Yellow"); - drop.addOption("purple", "Purple"); - drop.onChange((value) => { - this.outputObject.color = value; - const buttonClass = this.buttonPreviewEl - .getAttribute("class") - .replace(" blue", "") - .replace(" red", "") - .replace(" green", "") - .replace(" yellow", "") - .replace(" purple", ""); - if (value !== "default") { - this.buttonPreviewEl.setAttribute("class", `${buttonClass} ${value}`); - if (value === "blue") { - value = "#76b3fa"; - } - if (value === "purple") { - value = "#725585"; - } - this.buttonPreviewEl.setAttribute("style", `background: ${value}`); - } - else { - this.buttonPreviewEl.setAttribute("class", `${buttonClass}`); - this.buttonPreviewEl.removeAttribute("style"); - } - }); - }); - formEl.createDiv("modal-button-container", (buttonContainerEl) => { - buttonContainerEl - .createEl("button", { - attr: { type: "button" }, - cls: "button-default", - text: "Cancel", - }) - .addEventListener("click", () => this.close()); - buttonContainerEl.createEl("button", { - attr: { type: "submit" }, - cls: "button-default mod-cta", - text: "Insert Button", - }); - }); - formEl.addEventListener("submit", (e) => { - e.preventDefault(); - insertButton(this.app, this.outputObject); - this.close(); - }); - }); - contentEl.createEl("p").setText("Button Preview"); - this.buttonPreviewEl = createButton({ - app: this.app, - el: contentEl, - args: { name: "My Awesome Button" }, - }); - } - onClose() { - const { contentEl } = this; - contentEl.empty(); - } -} -class InlineButtonModal extends obsidian.Modal { - constructor(app) { - super(app); - this.buttonSuggestEl = createEl("input", { type: "text" }); - this.buttonSuggest = new ButtonSuggest(this.app, this.buttonSuggestEl); - this.buttonSuggestEl.setAttribute("style", "width: 100%; height: 40px"); - } - onOpen() { - const { titleEl, contentEl } = this; - titleEl.setText("Insert Inline Button"); - contentEl.createEl("form", {}, (formEl) => { - formEl.appendChild(this.buttonSuggestEl); - formEl.addEventListener("submit", (e) => { - e.preventDefault(); - insertInlineButton(this.app, this.buttonSuggestEl.value); - this.close(); - }); - }); - } - onClose() { - const { contentEl } = this; - contentEl.empty(); - } -} - -class ButtonsPlugin extends obsidian.Plugin { - async addButtonInEdit(app) { - let widget; - if (widget) { - widget.clear(); - } - const activeView = app.workspace.getActiveViewOfType(obsidian.MarkdownView); - if (activeView) { - const store = getStore(app.isMobile); - const buttonsInFile = store.filter((button) => button.path === activeView.file.path); - this.registerCodeMirror((cm) => { - buttonsInFile.forEach(async (button) => { - const widgetEl = document.createElement("div"); - const storeButton = await getButtonFromStore(app, { - id: button.id.split("-")[1], - }); - if (!app.isMobile && - storeButton && - storeButton?.args.editview === "true") { - widget = cm.addLineWidget(button.position.end.line + 1, createButton({ - app, - el: widgetEl, - args: storeButton.args, - inline: false, - id: button.id, - })); - } - }); - }); - } - } - async onload() { - initializeButtonStore(this.app); - this.buttonEvents = buttonEventListener(this.app, addButtonToStore); - this.closedFile = openFileListener(this.app, initializeButtonStore); - this.createButton = createButton; - this.buttonEdit = openFileListener(this.app, this.addButtonInEdit.bind(this)); - this.addCommand({ - id: "button-maker", - name: "Button Maker", - callback: () => new ButtonModal(this.app).open(), - }); - this.addCommand({ - id: "inline-button", - name: "Insert Inline Button", - callback: () => new InlineButtonModal(this.app).open(), - }); - this.registerMarkdownCodeBlockProcessor("button", async (source, el) => { - // create an object out of the arguments - const activeView = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView); - if (activeView) { - addButtonToStore(this.app, activeView.file); - let args = createArgumentObject(source); - const storeArgs = await getButtonFromStore(this.app, args); - args = storeArgs ? storeArgs.args : args; - const id = storeArgs && storeArgs.id; - createButton({ app: this.app, el, args, inline: false, id }); - } - }); - this.registerMarkdownPostProcessor(async (el, ctx) => { - // Search for blocks inside this element; for each one, look for things of the form ` - const codeblocks = el.querySelectorAll("code"); - for (let index = 0; index < codeblocks.length; index++) { - const codeblock = codeblocks.item(index); - const text = codeblock.innerText.trim(); - if (text.startsWith("button")) { - const id = text.split("button-")[1].trim(); - const args = await getButtonById(this.app, id); - if (args) { - ctx.addChild(new InlineButton(codeblock, this.app, args, id)); - } - } - } - }); - } - onunload() { - this.app.metadataCache.offref(this.buttonEvents); - this.app.workspace.offref(this.closedFile); - this.app.workspace.offref(this.buttonEdit); - } -} -class InlineButton extends obsidian.MarkdownRenderChild { - constructor(el, app, args, id) { - super(el); - this.el = el; - this.app = app; - this.args = args; - this.id = id; - } - async onload() { - const button = createButton({ - app: this.app, - el: this.el, - args: this.args, - inline: true, - id: this.id, - }); - this.el.replaceWith(button); - } -} - -module.exports = ButtonsPlugin; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsic3JjL2J1dHRvblN0b3JlLnRzIiwic3JjL3V0aWxzLnRzIiwic3JjL2V2ZW50cy50cyIsIm5vZGVfbW9kdWxlcy9tYXRoLWV4cHJlc3Npb24tZXZhbHVhdG9yL3NyYy9tYXRoX2Z1bmN0aW9uLmpzIiwibm9kZV9tb2R1bGVzL21hdGgtZXhwcmVzc2lvbi1ldmFsdWF0b3Ivc3JjL2xleGVyLmpzIiwibm9kZV9tb2R1bGVzL21hdGgtZXhwcmVzc2lvbi1ldmFsdWF0b3Ivc3JjL3Bvc3RmaXguanMiLCJub2RlX21vZHVsZXMvbWF0aC1leHByZXNzaW9uLWV2YWx1YXRvci9zcmMvcG9zdGZpeF9ldmFsdWF0b3IuanMiLCJub2RlX21vZHVsZXMvbWF0aC1leHByZXNzaW9uLWV2YWx1YXRvci9zcmMvZm9ybXVsYV9ldmFsdWF0b3IuanMiLCJzcmMvaGFuZGxlcnMudHMiLCJzcmMvcGFyc2VyLnRzIiwic3JjL2J1dHRvblR5cGVzLnRzIiwic3JjL2J1dHRvbi50cyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZW51bXMuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXROb2RlTmFtZS5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFdpbmRvdy5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2luc3RhbmNlT2YuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9hcHBseVN0eWxlcy5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldEJvdW5kaW5nQ2xpZW50UmVjdC5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldExheW91dFJlY3QuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9jb250YWlucy5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldENvbXB1dGVkU3R5bGUuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9pc1RhYmxlRWxlbWVudC5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldERvY3VtZW50RWxlbWVudC5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFBhcmVudE5vZGUuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldE1haW5BeGlzRnJvbVBsYWNlbWVudC5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvbWF0aC5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvd2l0aGluLmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRGcmVzaFNpZGVPYmplY3QuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL21lcmdlUGFkZGluZ09iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZXhwYW5kVG9IYXNoTWFwLmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvYXJyb3cuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9jb21wdXRlU3R5bGVzLmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvZXZlbnRMaXN0ZW5lcnMuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldE9wcG9zaXRlUGxhY2VtZW50LmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudC5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFdpbmRvd1Njcm9sbC5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFdpbmRvd1Njcm9sbEJhclguanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRWaWV3cG9ydFJlY3QuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXREb2N1bWVudFJlY3QuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9pc1Njcm9sbFBhcmVudC5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFNjcm9sbFBhcmVudC5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2xpc3RTY3JvbGxQYXJlbnRzLmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9yZWN0VG9DbGllbnRSZWN0LmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Q2xpcHBpbmdSZWN0LmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRWYXJpYXRpb24uanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2NvbXB1dGVPZmZzZXRzLmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9kZXRlY3RPdmVyZmxvdy5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvY29tcHV0ZUF1dG9QbGFjZW1lbnQuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9mbGlwLmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvaGlkZS5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL29mZnNldC5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL3BvcHBlck9mZnNldHMuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldEFsdEF4aXMuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9wcmV2ZW50T3ZlcmZsb3cuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRIVE1MRWxlbWVudFNjcm9sbC5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldE5vZGVTY3JvbGwuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRDb21wb3NpdGVSZWN0LmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9vcmRlck1vZGlmaWVycy5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZGVib3VuY2UuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2Zvcm1hdC5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvdmFsaWRhdGVNb2RpZmllcnMuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL3VuaXF1ZUJ5LmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9tZXJnZUJ5TmFtZS5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvY3JlYXRlUG9wcGVyLmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9wb3BwZXIuanMiLCJzcmMvc3VnZ2VzdC50cyIsInNyYy9tb2RhbC50cyIsInNyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcHAsIFRGaWxlLCBDYWNoZWRNZXRhZGF0YSB9IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IHsgRXh0ZW5kZWRCbG9ja0NhY2hlLCBBcmd1bWVudHMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgY3JlYXRlQXJndW1lbnRPYmplY3QgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5sZXQgYnV0dG9uU3RvcmU6IEV4dGVuZGVkQmxvY2tDYWNoZVtdO1xuXG5leHBvcnQgY29uc3QgZ2V0U3RvcmUgPSAoaXNNb2JpbGU6IGJvb2xlYW4pOiBFeHRlbmRlZEJsb2NrQ2FjaGVbXSA9PlxuICBpc01vYmlsZSA/IGJ1dHRvblN0b3JlIDogSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImJ1dHRvbnNcIikpO1xuXG5leHBvcnQgY29uc3QgaW5pdGlhbGl6ZUJ1dHRvblN0b3JlID0gKGFwcDogQXBwKTogdm9pZCA9PiB7XG4gIGNvbnN0IGZpbGVzID0gYXBwLnZhdWx0LmdldE1hcmtkb3duRmlsZXMoKTtcbiAgY29uc3QgYmxvY2tzQXJyID0gZmlsZXNcbiAgICAubWFwKChmaWxlKSA9PiB7XG4gICAgICBjb25zdCBjYWNoZSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShmaWxlKTtcbiAgICAgIHJldHVybiBidWlsZEJ1dHRvbkFycmF5KGNhY2hlLCBmaWxlKTtcbiAgICB9KVxuICAgIC5maWx0ZXIoKGFycikgPT4gYXJyICE9PSB1bmRlZmluZWQpXG4gICAgLmZsYXQoKTtcbiAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJidXR0b25zXCIsIEpTT04uc3RyaW5naWZ5KGJsb2Nrc0FycikpO1xuICBidXR0b25TdG9yZSA9IGJsb2Nrc0Fycjtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRCdXR0b25Ub1N0b3JlID0gKGFwcDogQXBwLCBmaWxlOiBURmlsZSk6IHZvaWQgPT4ge1xuICBjb25zdCBjYWNoZSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShmaWxlKTtcbiAgY29uc3QgYnV0dG9ucyA9IGJ1aWxkQnV0dG9uQXJyYXkoY2FjaGUsIGZpbGUpO1xuICBjb25zdCBzdG9yZSA9IGdldFN0b3JlKGFwcC5pc01vYmlsZSk7XG4gIGNvbnN0IG5ld1N0b3JlID1cbiAgICBidXR0b25zICYmIHN0b3JlXG4gICAgICA/IHJlbW92ZUR1cGxpY2F0ZXMoWy4uLmJ1dHRvbnMsIC4uLnN0b3JlXSlcbiAgICAgIDogc3RvcmVcbiAgICAgID8gcmVtb3ZlRHVwbGljYXRlcyhzdG9yZSlcbiAgICAgIDogYnV0dG9uc1xuICAgICAgPyByZW1vdmVEdXBsaWNhdGVzKGJ1dHRvbnMpXG4gICAgICA6IFtdO1xuICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImJ1dHRvbnNcIiwgSlNPTi5zdHJpbmdpZnkobmV3U3RvcmUpKTtcbiAgYnV0dG9uU3RvcmUgPSBuZXdTdG9yZTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCdXR0b25Gcm9tU3RvcmUgPSBhc3luYyAoXG4gIGFwcDogQXBwLFxuICBhcmdzOiBBcmd1bWVudHNcbik6IFByb21pc2U8eyBhcmdzOiBBcmd1bWVudHM7IGlkOiBzdHJpbmcgfT4gfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCBzdG9yZSA9IGdldFN0b3JlKGFwcC5pc01vYmlsZSk7XG4gIGFyZ3MuaWQ7XG4gIGlmIChhcmdzLmlkKSB7XG4gICAgY29uc3Qgc3RvcmVkQnV0dG9uID1cbiAgICAgIHN0b3JlICYmXG4gICAgICBzdG9yZS5maWx0ZXIoXG4gICAgICAgIChpdGVtOiBFeHRlbmRlZEJsb2NrQ2FjaGUpID0+IGBidXR0b24tJHthcmdzLmlkfWAgPT09IGl0ZW0uaWRcbiAgICAgIClbMF07XG4gICAgaWYgKHN0b3JlZEJ1dHRvbikge1xuICAgICAgY29uc3QgZmlsZSA9IGFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgoc3RvcmVkQnV0dG9uLnBhdGgpO1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGFwcC52YXVsdC5jYWNoZWRSZWFkKGZpbGUgYXMgVEZpbGUpO1xuICAgICAgY29uc3QgY29udGVudEFycmF5ID0gY29udGVudC5zcGxpdChcIlxcblwiKTtcbiAgICAgIGNvbnN0IGJ1dHRvbiA9IGNvbnRlbnRBcnJheVxuICAgICAgICAuc2xpY2UoXG4gICAgICAgICAgc3RvcmVkQnV0dG9uLnBvc2l0aW9uLnN0YXJ0LmxpbmUgKyAxLFxuICAgICAgICAgIHN0b3JlZEJ1dHRvbi5wb3NpdGlvbi5lbmQubGluZVxuICAgICAgICApXG4gICAgICAgIC5qb2luKFwiXFxuXCIpO1xuICAgICAgY29uc3Qgc3RvcmVkQXJncyA9IGNyZWF0ZUFyZ3VtZW50T2JqZWN0KGJ1dHRvbik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhcmdzOiB7IC4uLnN0b3JlZEFyZ3MsIC4uLmFyZ3MgfSxcbiAgICAgICAgaWQ6IHN0b3JlZEJ1dHRvbi5pZC5zcGxpdChcImJ1dHRvbi1cIilbMV0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGdldEJ1dHRvbkJ5SWQgPSBhc3luYyAoXG4gIGFwcDogQXBwLFxuICBpZDogc3RyaW5nXG4pOiBQcm9taXNlPEFyZ3VtZW50cz4gPT4ge1xuICBjb25zdCBzdG9yZSA9IGdldFN0b3JlKGFwcC5pc01vYmlsZSk7XG4gIGNvbnN0IHN0b3JlZEJ1dHRvbiA9IHN0b3JlLmZpbHRlcihcbiAgICAoaXRlbTogRXh0ZW5kZWRCbG9ja0NhY2hlKSA9PiBgYnV0dG9uLSR7aWR9YCA9PT0gaXRlbS5pZFxuICApWzBdO1xuICBpZiAoc3RvcmVkQnV0dG9uKSB7XG4gICAgY29uc3QgZmlsZSA9IGFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgoc3RvcmVkQnV0dG9uLnBhdGgpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBhcHAudmF1bHQuY2FjaGVkUmVhZChmaWxlIGFzIFRGaWxlKTtcbiAgICBjb25zdCBjb250ZW50QXJyYXkgPSBjb250ZW50LnNwbGl0KFwiXFxuXCIpO1xuICAgIGNvbnN0IGJ1dHRvbiA9IGNvbnRlbnRBcnJheVxuICAgICAgLnNsaWNlKFxuICAgICAgICBzdG9yZWRCdXR0b24ucG9zaXRpb24uc3RhcnQubGluZSArIDEsXG4gICAgICAgIHN0b3JlZEJ1dHRvbi5wb3NpdGlvbi5lbmQubGluZVxuICAgICAgKVxuICAgICAgLmpvaW4oXCJcXG5cIik7XG4gICAgcmV0dXJuIGNyZWF0ZUFyZ3VtZW50T2JqZWN0KGJ1dHRvbik7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCdXR0b25Td2FwQnlJZCA9IGFzeW5jIChcbiAgYXBwOiBBcHAsXG4gIGlkOiBzdHJpbmdcbik6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gIGNvbnN0IHN0b3JlID0gZ2V0U3RvcmUoYXBwLmlzTW9iaWxlKTtcbiAgY29uc3Qgc3RvcmVkQnV0dG9uID0gc3RvcmUuZmlsdGVyKFxuICAgIChpdGVtOiBFeHRlbmRlZEJsb2NrQ2FjaGUpID0+IGBidXR0b24tJHtpZH1gID09PSBpdGVtLmlkXG4gIClbMF07XG4gIGlmIChzdG9yZWRCdXR0b24pIHtcbiAgICByZXR1cm4gc3RvcmVkQnV0dG9uLnN3YXA7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBzZXRCdXR0b25Td2FwQnlJZCA9IGFzeW5jIChcbiAgYXBwOiBBcHAsXG4gIGlkOiBzdHJpbmcsXG4gIG5ld1N3YXA6IG51bWJlclxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHN0b3JlID0gZ2V0U3RvcmUoYXBwLmlzTW9iaWxlKTtcbiAgY29uc3Qgc3RvcmVkQnV0dG9uID0gc3RvcmUuZmlsdGVyKFxuICAgIChpdGVtOiBFeHRlbmRlZEJsb2NrQ2FjaGUpID0+IGBidXR0b24tJHtpZH1gID09PSBpdGVtLmlkXG4gIClbMF07XG4gIGlmIChzdG9yZWRCdXR0b24pIHtcbiAgICBzdG9yZWRCdXR0b24uc3dhcCA9IG5ld1N3YXA7XG4gICAgY29uc3QgbmV3U3RvcmUgPSByZW1vdmVEdXBsaWNhdGVzKFsuLi5zdG9yZSwgc3RvcmVkQnV0dG9uXSk7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJidXR0b25zXCIsIEpTT04uc3RyaW5naWZ5KG5ld1N0b3JlKSk7XG4gICAgYnV0dG9uU3RvcmUgPSBuZXdTdG9yZTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGJ1aWxkQnV0dG9uQXJyYXkgPSAoXG4gIGNhY2hlOiBDYWNoZWRNZXRhZGF0YSxcbiAgZmlsZTogVEZpbGVcbik6IEV4dGVuZGVkQmxvY2tDYWNoZVtdID0+IHtcbiAgY29uc3QgYmxvY2tzID0gY2FjaGUgJiYgY2FjaGUuYmxvY2tzO1xuICBpZiAoYmxvY2tzKSB7XG4gICAgY29uc3QgYmxvY2tLZXlzID0gQXJyYXkuZnJvbShPYmplY3Qua2V5cyhibG9ja3MpKTtcbiAgICBjb25zdCBibG9ja0FycmF5OiBFeHRlbmRlZEJsb2NrQ2FjaGVbXSA9IGJsb2NrS2V5c1xuICAgICAgLm1hcCgoa2V5KSA9PiBibG9ja3Nba2V5XSlcbiAgICAgIC5tYXAoKG9iajogRXh0ZW5kZWRCbG9ja0NhY2hlKSA9PiB7XG4gICAgICAgIG9ialtcInBhdGhcIl0gPSBmaWxlLnBhdGg7XG4gICAgICAgIG9ialtcInN3YXBcIl0gPSAwO1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKGJsb2NrKSA9PiBibG9jay5pZC5pbmNsdWRlcyhcImJ1dHRvblwiKSk7XG4gICAgcmV0dXJuIGJsb2NrQXJyYXk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHJlbW92ZUR1cGxpY2F0ZXMoYXJyOiBFeHRlbmRlZEJsb2NrQ2FjaGVbXSkge1xuICByZXR1cm4gYXJyICYmIGFyclswXVxuICAgID8gYXJyLmZpbHRlcihcbiAgICAgICAgKHYsIGksIGEpID0+XG4gICAgICAgICAgYS5maW5kSW5kZXgoXG4gICAgICAgICAgICAodCkgPT5cbiAgICAgICAgICAgICAgdC5pZCA9PT0gdi5pZCB8fFxuICAgICAgICAgICAgICAodC5wYXRoID09PSB2LnBhdGggJiZcbiAgICAgICAgICAgICAgICB0LnBvc2l0aW9uLnN0YXJ0LmxpbmUgPT09IHYucG9zaXRpb24uc3RhcnQubGluZSAmJlxuICAgICAgICAgICAgICAgIHQucG9zaXRpb24uZW5kLmxpbmUgPT09IHYucG9zaXRpb24uZW5kLmxpbmUpXG4gICAgICAgICAgKSA9PT0gaVxuICAgICAgKVxuICAgIDogYXJyO1xufVxuIiwiaW1wb3J0IHsgTWFya2Rvd25WaWV3LCBBcHAsIE5vdGljZSwgVEZpbGUgfSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCB7IEFyZ3VtZW50cywgUG9zaXRpb24gfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgYWRkQnV0dG9uVG9TdG9yZSB9IGZyb20gXCIuL2J1dHRvblN0b3JlXCI7XG5cbmZ1bmN0aW9uIG5hbm9pZChudW06IG51bWJlcikge1xuICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgY29uc3QgY2hhcmFjdGVycyA9IFwiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5XCI7XG4gIGNvbnN0IGNoYXJhY3RlcnNMZW5ndGggPSBjaGFyYWN0ZXJzLmxlbmd0aDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW07IGkrKykge1xuICAgIHJlc3VsdCArPSBjaGFyYWN0ZXJzLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjaGFyYWN0ZXJzTGVuZ3RoKSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuaW50ZXJmYWNlIE91dHB1dE9iamVjdCB7XG4gIG5hbWU6IHN0cmluZztcbiAgdHlwZTogc3RyaW5nO1xuICBhY3Rpb246IHN0cmluZztcbiAgc3dhcDogc3RyaW5nO1xuICByZW1vdmU6IHN0cmluZztcbiAgcmVwbGFjZTogc3RyaW5nO1xuICBpZDogc3RyaW5nO1xuICB0ZW1wbGF0ZXI6IGJvb2xlYW47XG4gIGNsYXNzOiBzdHJpbmc7XG4gIGNvbG9yOiBzdHJpbmc7XG4gIGJsb2NrSWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IGluc2VydEJ1dHRvbiA9IChhcHA6IEFwcCwgb3V0cHV0T2JqZWN0OiBPdXRwdXRPYmplY3QpOiB2b2lkID0+IHtcbiAgY29uc3QgYnV0dG9uQXJyID0gW107XG4gIGJ1dHRvbkFyci5wdXNoKFwiYGBgYnV0dG9uXCIpO1xuICBvdXRwdXRPYmplY3QubmFtZSAmJiBidXR0b25BcnIucHVzaChgbmFtZSAke291dHB1dE9iamVjdC5uYW1lfWApO1xuICBvdXRwdXRPYmplY3QudHlwZSAmJiBidXR0b25BcnIucHVzaChgdHlwZSAke291dHB1dE9iamVjdC50eXBlfWApO1xuICBvdXRwdXRPYmplY3QuYWN0aW9uICYmIGJ1dHRvbkFyci5wdXNoKGBhY3Rpb24gJHtvdXRwdXRPYmplY3QuYWN0aW9ufWApO1xuICBvdXRwdXRPYmplY3QuaWQgJiYgYnV0dG9uQXJyLnB1c2goYGlkICR7b3V0cHV0T2JqZWN0LmlkfWApO1xuICBvdXRwdXRPYmplY3Quc3dhcCAmJiBidXR0b25BcnIucHVzaChgc3dhcCAke291dHB1dE9iamVjdC5zd2FwfWApO1xuICBvdXRwdXRPYmplY3QucmVtb3ZlICYmIGJ1dHRvbkFyci5wdXNoKGByZW1vdmUgJHtvdXRwdXRPYmplY3QucmVtb3ZlfWApO1xuICBvdXRwdXRPYmplY3QucmVwbGFjZSAmJiBidXR0b25BcnIucHVzaChgcmVwbGFjZSAke291dHB1dE9iamVjdC5yZXBsYWNlfWApO1xuICBvdXRwdXRPYmplY3QudGVtcGxhdGVyID09PSB0cnVlICYmXG4gICAgYnV0dG9uQXJyLnB1c2goYHRlbXBsYXRlciAke291dHB1dE9iamVjdC50ZW1wbGF0ZXJ9YCk7XG4gIG91dHB1dE9iamVjdC5jb2xvciAmJiBidXR0b25BcnIucHVzaChgY29sb3IgJHtvdXRwdXRPYmplY3QuY29sb3J9YCk7XG4gIG91dHB1dE9iamVjdC5jbGFzcyAmJiBidXR0b25BcnIucHVzaChgY2xhc3MgJHtvdXRwdXRPYmplY3QuY2xhc3N9YCk7XG4gIGJ1dHRvbkFyci5wdXNoKFwiYGBgXCIpO1xuICBvdXRwdXRPYmplY3QuYmxvY2tJZFxuICAgID8gYnV0dG9uQXJyLnB1c2goYF5idXR0b24tJHtvdXRwdXRPYmplY3QuYmxvY2tJZH1gKVxuICAgIDogYnV0dG9uQXJyLnB1c2goYF5idXR0b24tJHtuYW5vaWQoNCl9YCk7XG4gIGNvbnN0IHBhZ2UgPSBhcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KTtcbiAgY29uc3QgZWRpdG9yID0gcGFnZS5lZGl0b3I7XG4gIGVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKGJ1dHRvbkFyci5qb2luKFwiXFxuXCIpKTtcbiAgYWRkQnV0dG9uVG9TdG9yZShhcHAsIHBhZ2UuZmlsZSk7XG59O1xuXG5leHBvcnQgY29uc3QgaW5zZXJ0SW5saW5lQnV0dG9uID0gKGFwcDogQXBwLCBpZDogc3RyaW5nKTogdm9pZCA9PiB7XG4gIGNvbnN0IHBhZ2UgPSBhcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KTtcbiAgY29uc3QgZWRpdG9yID0gcGFnZS5lZGl0b3I7XG4gIGVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKGBcXGBidXR0b24tJHtpZH1cXGBgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVBcmd1bWVudE9iamVjdCA9IChzb3VyY2U6IHN0cmluZyk6IEFyZ3VtZW50cyA9PlxuICBzb3VyY2Uuc3BsaXQoXCJcXG5cIikucmVkdWNlKChhY2M6IEFyZ3VtZW50cywgaTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3Qgc3BsaXQ6IHN0cmluZ1tdID0gaS5zcGxpdChcIiBcIik7XG4gICAgY29uc3Qga2V5OiBzdHJpbmcgPSBzcGxpdFswXS50b0xvd2VyQ2FzZSgpO1xuICAgIGFjY1trZXldID0gc3BsaXQuZmlsdGVyKChpdGVtKSA9PiBpdGVtICE9PSBzcGxpdFswXSkuam9pbihcIiBcIik7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30pO1xuXG5leHBvcnQgY29uc3QgY3JlYXRlQ29udGVudEFycmF5ID0gYXN5bmMgKFxuICBhcHA6IEFwcFxuKTogUHJvbWlzZTx7IGNvbnRlbnRBcnJheTogc3RyaW5nW107IGZpbGU6IFRGaWxlIH0+ID0+IHtcbiAgY29uc3QgYWN0aXZlVmlldyA9IGFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpO1xuICBpZiAoYWN0aXZlVmlldykge1xuICAgIGNvbnN0IGZpbGUgPSBhY3RpdmVWaWV3LmZpbGU7XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGFwcC52YXVsdC5yZWFkKGZpbGUpO1xuICAgIHJldHVybiB7IGNvbnRlbnRBcnJheTogY29udGVudC5zcGxpdChcIlxcblwiKSwgZmlsZSB9O1xuICB9XG4gIG5ldyBOb3RpY2UoXCJDb3VsZCBub3QgZ2V0IEFjdGl2ZSBWaWV3XCIsIDEwMDApO1xuICBjb25zb2xlLmVycm9yKFwiY291bGQgbm90IGdldCBhY3RpdmUgdmlld1wiKTtcbn07XG5cbmV4cG9ydCBjb25zdCBoYW5kbGVWYWx1ZUFycmF5ID0gKFxuICB2YWx1ZTogc3RyaW5nLFxuICBjYWxsYmFjazogKGFyZ0FycmF5OiBzdHJpbmdbXSkgPT4gdm9pZFxuKTogdm9pZCA9PiB7XG4gIGlmICh2YWx1ZS5pbmNsdWRlcyhcIltcIikgJiYgdmFsdWUuaW5jbHVkZXMoXCJdXCIpKSB7XG4gICAgY29uc3QgYXJncyA9IHZhbHVlLm1hdGNoKC9cXFsoLiopXFxdLyk7XG4gICAgaWYgKGFyZ3NbMV0pIHtcbiAgICAgIGNvbnN0IGFyZ0FycmF5ID0gYXJnc1sxXS5zcGxpdCgvLFxccz8vKTtcbiAgICAgIGlmIChhcmdBcnJheVswXSkge1xuICAgICAgICBjYWxsYmFjayhhcmdBcnJheSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmV3QXJncyhcbiAgYXBwOiBBcHAsXG4gIHBvc2l0aW9uOiBQb3NpdGlvblxuKTogUHJvbWlzZTx7IGFyZ3M6IEFyZ3VtZW50czsgY29udGVudDogc3RyaW5nIH0+IHtcbiAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBhY3RpdmVWaWV3ID0gYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldyk7XG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gYXdhaXQgYXBwLnZhdWx0XG4gICAgICAgIC5jYWNoZWRSZWFkKGFjdGl2ZVZpZXcuZmlsZSlcbiAgICAgICAgLnRoZW4oKGNvbnRlbnQ6IHN0cmluZykgPT4gY29udGVudC5zcGxpdChcIlxcblwiKSk7XG4gICAgICBjb25zdCBuZXdCdXR0b24gPSBuZXdDb250ZW50XG4gICAgICAgIC5zcGxpY2UocG9zaXRpb24ubGluZVN0YXJ0LCBwb3NpdGlvbi5saW5lRW5kIC0gcG9zaXRpb24ubGluZVN0YXJ0KVxuICAgICAgICAuam9pbihcIlxcblwiKVxuICAgICAgICAucmVwbGFjZShcImBgYGJ1dHRvblwiLCBcIlwiKVxuICAgICAgICAucmVwbGFjZShcImBgYFwiLCBcIlwiKTtcbiAgICAgIHJlc29sdmUoeyBhcmdzOiBjcmVhdGVBcmd1bWVudE9iamVjdChuZXdCdXR0b24pIH0pO1xuICAgIH0sIDE1MCk7XG4gIH0pO1xuICByZXR1cm4gcHJvbWlzZSBhcyBQcm9taXNlPHsgYXJnczogQXJndW1lbnRzOyBjb250ZW50OiBzdHJpbmcgfT47XG59XG5cbmV4cG9ydCBjb25zdCB3cmFwQXJvdW5kID0gKHZhbHVlOiBudW1iZXIsIHNpemU6IG51bWJlcik6IG51bWJlciA9PiB7XG4gIHJldHVybiAoKHZhbHVlICUgc2l6ZSkgKyBzaXplKSAlIHNpemU7XG59O1xuIiwiaW1wb3J0IHsgQXBwLCBFdmVudFJlZiwgVEZpbGUgfSBmcm9tIFwib2JzaWRpYW5cIjtcblxuZXhwb3J0IGNvbnN0IGJ1dHRvbkV2ZW50TGlzdGVuZXIgPSAoXG4gIGFwcDogQXBwLFxuICBjYWxsYmFjazogKGFwcDogQXBwLCBmaWxlOiBURmlsZSkgPT4gdm9pZFxuKTogRXZlbnRSZWYgPT4ge1xuICByZXR1cm4gYXBwLm1ldGFkYXRhQ2FjaGUub24oXCJjaGFuZ2VkXCIsIChmaWxlOiBURmlsZSkgPT4ge1xuICAgIGNhbGxiYWNrKGFwcCwgZmlsZSk7XG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGluaXRpYWxpemVMaXN0ZW5lciA9IChcbiAgYXBwOiBBcHAsXG4gIGNhbGxiYWNrOiAoYXBwOiBBcHApID0+IHZvaWRcbik6IEV2ZW50UmVmID0+IHtcbiAgcmV0dXJuIGFwcC5tZXRhZGF0YUNhY2hlLm9uKFwicmVzb2x2ZWRcIiwgKCkgPT4ge1xuICAgIGNhbGxiYWNrKGFwcCk7XG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IG9wZW5GaWxlTGlzdGVuZXIgPSAoXG4gIGFwcDogQXBwLFxuICBjYWxsYmFjazogKGFwcDogQXBwKSA9PiB2b2lkXG4pOiBFdmVudFJlZiA9PiB7XG4gIHJldHVybiBhcHAud29ya3NwYWNlLm9uKFwiZmlsZS1vcGVuXCIsICgpID0+IHtcbiAgICBjYWxsYmFjayhhcHApO1xuICB9KTtcbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcclxudmFyIE1leHAgPSBmdW5jdGlvbiAocGFyc2VkKSB7XHJcbiAgdGhpcy52YWx1ZSA9IHBhcnNlZFxyXG59XHJcblxyXG5NZXhwLm1hdGggPSB7XHJcbiAgaXNEZWdyZWU6IHRydWUsIC8vIG1vZGUgb2YgY2FsY3VsYXRvclxyXG4gIGFjb3M6IGZ1bmN0aW9uICh4KSB7XHJcbiAgICByZXR1cm4gKE1leHAubWF0aC5pc0RlZ3JlZSA/IDE4MCAvIE1hdGguUEkgKiBNYXRoLmFjb3MoeCkgOiBNYXRoLmFjb3MoeCkpXHJcbiAgfSxcclxuICBhZGQ6IGZ1bmN0aW9uIChhLCBiKSB7XHJcbiAgICByZXR1cm4gYSArIGJcclxuICB9LFxyXG4gIGFzaW46IGZ1bmN0aW9uICh4KSB7XHJcbiAgICByZXR1cm4gKE1leHAubWF0aC5pc0RlZ3JlZSA/IDE4MCAvIE1hdGguUEkgKiBNYXRoLmFzaW4oeCkgOiBNYXRoLmFzaW4oeCkpXHJcbiAgfSxcclxuICBhdGFuOiBmdW5jdGlvbiAoeCkge1xyXG4gICAgcmV0dXJuIChNZXhwLm1hdGguaXNEZWdyZWUgPyAxODAgLyBNYXRoLlBJICogTWF0aC5hdGFuKHgpIDogTWF0aC5hdGFuKHgpKVxyXG4gIH0sXHJcbiAgYWNvc2g6IGZ1bmN0aW9uICh4KSB7XHJcbiAgICByZXR1cm4gTWF0aC5sb2coeCArIE1hdGguc3FydCh4ICogeCAtIDEpKVxyXG4gIH0sXHJcbiAgYXNpbmg6IGZ1bmN0aW9uICh4KSB7XHJcbiAgICByZXR1cm4gTWF0aC5sb2coeCArIE1hdGguc3FydCh4ICogeCArIDEpKVxyXG4gIH0sXHJcbiAgYXRhbmg6IGZ1bmN0aW9uICh4KSB7XHJcbiAgICByZXR1cm4gTWF0aC5sb2coKDEgKyB4KSAvICgxIC0geCkpXHJcbiAgfSxcclxuICBDOiBmdW5jdGlvbiAobiwgcikge1xyXG4gICAgdmFyIHBybyA9IDFcclxuICAgIHZhciBvdGhlciA9IG4gLSByXHJcbiAgICB2YXIgY2hvaWNlID0gclxyXG4gICAgaWYgKGNob2ljZSA8IG90aGVyKSB7XHJcbiAgICAgIGNob2ljZSA9IG90aGVyXHJcbiAgICAgIG90aGVyID0gclxyXG4gICAgfVxyXG4gICAgZm9yICh2YXIgaSA9IGNob2ljZSArIDE7IGkgPD0gbjsgaSsrKSB7XHJcbiAgICAgIHBybyAqPSBpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gcHJvIC8gTWV4cC5tYXRoLmZhY3Qob3RoZXIpXHJcbiAgfSxcclxuICBjaGFuZ2VTaWduOiBmdW5jdGlvbiAoeCkge1xyXG4gICAgcmV0dXJuIC14XHJcbiAgfSxcclxuICBjb3M6IGZ1bmN0aW9uICh4KSB7XHJcbiAgICBpZiAoTWV4cC5tYXRoLmlzRGVncmVlKSB4ID0gTWV4cC5tYXRoLnRvUmFkaWFuKHgpXHJcbiAgICByZXR1cm4gTWF0aC5jb3MoeClcclxuICB9LFxyXG4gIGNvc2g6IGZ1bmN0aW9uICh4KSB7XHJcbiAgICByZXR1cm4gKE1hdGgucG93KE1hdGguRSwgeCkgKyBNYXRoLnBvdyhNYXRoLkUsIC0xICogeCkpIC8gMlxyXG4gIH0sXHJcbiAgZGl2OiBmdW5jdGlvbiAoYSwgYikge1xyXG4gICAgcmV0dXJuIGEgLyBiXHJcbiAgfSxcclxuICBmYWN0OiBmdW5jdGlvbiAobikge1xyXG4gICAgaWYgKG4gJSAxICE9PSAwKSByZXR1cm4gJ05hTidcclxuICAgIHZhciBwcm8gPSAxXHJcbiAgICBmb3IgKHZhciBpID0gMjsgaSA8PSBuOyBpKyspIHtcclxuICAgICAgcHJvICo9IGlcclxuICAgIH1cclxuICAgIHJldHVybiBwcm9cclxuICB9LFxyXG4gIGludmVyc2U6IGZ1bmN0aW9uICh4KSB7XHJcbiAgICByZXR1cm4gMSAvIHhcclxuICB9LFxyXG4gIGxvZzogZnVuY3Rpb24gKGkpIHtcclxuICAgIHJldHVybiBNYXRoLmxvZyhpKSAvIE1hdGgubG9nKDEwKVxyXG4gIH0sXHJcbiAgbW9kOiBmdW5jdGlvbiAoYSwgYikge1xyXG4gICAgcmV0dXJuIGEgJSBiXHJcbiAgfSxcclxuICBtdWw6IGZ1bmN0aW9uIChhLCBiKSB7XHJcbiAgICByZXR1cm4gYSAqIGJcclxuICB9LFxyXG4gIFA6IGZ1bmN0aW9uIChuLCByKSB7XHJcbiAgICB2YXIgcHJvID0gMVxyXG4gICAgZm9yICh2YXIgaSA9IE1hdGguZmxvb3IobikgLSBNYXRoLmZsb29yKHIpICsgMTsgaSA8PSBNYXRoLmZsb29yKG4pOyBpKyspIHtcclxuICAgICAgcHJvICo9IGlcclxuICAgIH1cclxuICAgIHJldHVybiBwcm9cclxuICB9LFxyXG4gIFBpOiBmdW5jdGlvbiAobG93LCBoaWdoLCBleCkge1xyXG4gICAgdmFyIHBybyA9IDFcclxuICAgIGZvciAodmFyIGkgPSBsb3c7IGkgPD0gaGlnaDsgaSsrKSB7XHJcbiAgICAgIHBybyAqPSBOdW1iZXIoZXgucG9zdGZpeEV2YWwoe1xyXG4gICAgICAgIG46IGlcclxuICAgICAgfSkpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gcHJvXHJcbiAgfSxcclxuICBwb3cxMHg6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICB2YXIgeCA9IDFcclxuICAgIHdoaWxlIChlLS0pIHtcclxuICAgICAgeCAqPSAxMFxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHhcclxuICB9LFxyXG4gIHNpZ21hOiBmdW5jdGlvbiAobG93LCBoaWdoLCBleCkge1xyXG4gICAgdmFyIHN1bSA9IDBcclxuICAgIGZvciAodmFyIGkgPSBsb3c7IGkgPD0gaGlnaDsgaSsrKSB7XHJcbiAgICAgIHN1bSArPSBOdW1iZXIoZXgucG9zdGZpeEV2YWwoe1xyXG4gICAgICAgIG46IGlcclxuICAgICAgfSkpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3VtXHJcbiAgfSxcclxuICBzaW46IGZ1bmN0aW9uICh4KSB7XHJcbiAgICBpZiAoTWV4cC5tYXRoLmlzRGVncmVlKSB4ID0gTWV4cC5tYXRoLnRvUmFkaWFuKHgpXHJcbiAgICByZXR1cm4gTWF0aC5zaW4oeClcclxuICB9LFxyXG4gIHNpbmg6IGZ1bmN0aW9uICh4KSB7XHJcbiAgICByZXR1cm4gKE1hdGgucG93KE1hdGguRSwgeCkgLSBNYXRoLnBvdyhNYXRoLkUsIC0xICogeCkpIC8gMlxyXG4gIH0sXHJcbiAgc3ViOiBmdW5jdGlvbiAoYSwgYikge1xyXG4gICAgcmV0dXJuIGEgLSBiXHJcbiAgfSxcclxuICB0YW46IGZ1bmN0aW9uICh4KSB7XHJcbiAgICBpZiAoTWV4cC5tYXRoLmlzRGVncmVlKSB4ID0gTWV4cC5tYXRoLnRvUmFkaWFuKHgpXHJcbiAgICByZXR1cm4gTWF0aC50YW4oeClcclxuICB9LFxyXG4gIHRhbmg6IGZ1bmN0aW9uICh4KSB7XHJcbiAgICByZXR1cm4gTWV4cC5zaW5oYSh4KSAvIE1leHAuY29zaGEoeClcclxuICB9LFxyXG4gIHRvUmFkaWFuOiBmdW5jdGlvbiAoeCkge1xyXG4gICAgcmV0dXJuIHggKiBNYXRoLlBJIC8gMTgwXHJcbiAgfVxyXG59XHJcbk1leHAuRXhjZXB0aW9uID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHtcclxuICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlXHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBNZXhwXHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG52YXIgTWV4cCA9IHJlcXVpcmUoJy4vbWF0aF9mdW5jdGlvbi5qcycpXHJcbmZ1bmN0aW9uIGluYyhhcnIsIHZhbCkge1xyXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICBhcnJbaV0gKz0gdmFsXHJcbiAgfVxyXG4gIHJldHVybiBhcnJcclxufVxyXG52YXIgdG9rZW4gPSBbJ3NpbicsICdjb3MnLCAndGFuJywgJ3BpJywgJygnLCAnKScsICdQJywgJ0MnLCAnICcsXHJcbiAgJ2FzaW4nLCAnYWNvcycsICdhdGFuJywgJzcnLCAnOCcsICc5JywgJ2ludCcsXHJcbiAgJ2Nvc2gnLCAnYWNvc2gnLCAnbG4nLCAnXicsICdyb290JywgJzQnLCAnNScsICc2JywgJy8nLCAnIScsXHJcbiAgJ3RhbmgnLCAnYXRhbmgnLCAnTW9kJywgJzEnLCAnMicsICczJywgJyonLFxyXG4gICdzaW5oJywgJ2FzaW5oJywgJ2UnLCAnbG9nJywgJzAnLCAnLicsICcrJywgJy0nLCAnLCcsICdTaWdtYScsICduJywgJ1BpJywgJ3BvdyddXHJcbnZhciBzaG93ID0gWydzaW4nLCAnY29zJywgJ3RhbicsICcmcGk7JywgJygnLCAnKScsICdQJywgJ0MnLCAnICcsXHJcbiAgJ2FzaW4nLCAnYWNvcycsICdhdGFuJywgJzcnLCAnOCcsICc5JywgJ0ludCcsXHJcbiAgJ2Nvc2gnLCAnYWNvc2gnLCAnIGxuJywgJ14nLCAncm9vdCcsICc0JywgJzUnLCAnNicsICcmZGl2aWRlOycsICchJyxcclxuICAndGFuaCcsICdhdGFuaCcsICcgTW9kICcsICcxJywgJzInLCAnMycsICcmdGltZXM7JyxcclxuICAnc2luaCcsICdhc2luaCcsICdlJywgJyBsb2cnLCAnMCcsICcuJywgJysnLCAnLScsICcsJywgJyZTaWdtYTsnLCAnbicsICcmUGk7JywgJ3BvdyddXHJcbnZhciBldmEgPSBbTWV4cC5tYXRoLnNpbiwgTWV4cC5tYXRoLmNvcywgTWV4cC5tYXRoLnRhbiwgJ1BJJywgJygnLCAnKScsIE1leHAubWF0aC5QLCBNZXhwLm1hdGguQywgJyAnLmFuY2hvcixcclxuTWV4cC5tYXRoLmFzaW4sIE1leHAubWF0aC5hY29zLCBNZXhwLm1hdGguYXRhbiwgJzcnLCAnOCcsICc5JywgTWF0aC5mbG9vcixcclxuTWV4cC5tYXRoLmNvc2gsIE1leHAubWF0aC5hY29zaCwgTWF0aC5sb2csIE1hdGgucG93LCBNYXRoLnNxcnQsICc0JywgJzUnLCAnNicsIE1leHAubWF0aC5kaXYsIE1leHAubWF0aC5mYWN0LFxyXG5NZXhwLm1hdGgudGFuaCwgTWV4cC5tYXRoLmF0YW5oLCBNZXhwLm1hdGgubW9kLCAnMScsICcyJywgJzMnLCBNZXhwLm1hdGgubXVsLFxyXG5NZXhwLm1hdGguc2luaCwgTWV4cC5tYXRoLmFzaW5oLCAnRScsIE1leHAubWF0aC5sb2csICcwJywgJy4nLCBNZXhwLm1hdGguYWRkLCBNZXhwLm1hdGguc3ViLCAnLCcsIE1leHAubWF0aC5zaWdtYSwgJ24nLCBNZXhwLm1hdGguUGksIE1hdGgucG93XVxyXG52YXIgcHJlY2VkID0ge1xyXG4gIDA6IDExLFxyXG4gIDE6IDAsXHJcbiAgMjogMyxcclxuICAzOiAwLFxyXG4gIDQ6IDAsXHJcbiAgNTogMCxcclxuICA2OiAwLFxyXG4gIDc6IDExLFxyXG4gIDg6IDExLFxyXG4gIDk6IDEsXHJcbiAgMTA6IDEwLFxyXG4gIDExOiAwLFxyXG4gIDEyOiAxMSxcclxuICAxMzogMCxcclxuICAxNDogLTEgLy8gd2lsbCBiZSBmaWx0ZXJlZCBhZnRlciBsZXhlclxyXG59IC8vIHN0b3JlcyBwcmVjZWRlbmNlIGJ5IHR5cGVzXHJcbnZhciB0eXBlID0gWzAsIDAsIDAsIDMsIDQsIDUsIDEwLCAxMCwgMTQsXHJcbiAgMCwgMCwgMCwgMSwgMSwgMSwgMCxcclxuICAwLCAwLCAwLCAxMCwgMCwgMSwgMSwgMSwgMiwgNyxcclxuICAwLCAwLCAyLCAxLCAxLCAxLCAyLFxyXG4gIDAsIDAsIDMsIDAsIDEsIDYsIDksIDksIDExLCAxMiwgMTMsIDEyLCA4XVxyXG4vKlxyXG4wIDogZnVuY3Rpb24gd2l0aCBzeW50YXggZnVuY3Rpb25fbmFtZShNYXRoc19leHApXHJcbjEgOiBudW1iZXJzXHJcbjIgOiBiaW5hcnkgb3BlcmF0b3JzIGxpa2UgKiAvIE1vZCBsZWZ0IGFzc29jaWF0ZSBhbmQgc2FtZSBwcmVjZWRlbmNlXHJcbjMgOiBNYXRoIGNvbnN0YW50IHZhbHVlcyBsaWtlIGUscGksQ3J1bmNoZXIgYW5zXHJcbjQgOiBvcGVuaW5nIGJyYWNrZXRcclxuNSA6IGNsb3NpbmcgYnJhY2tldFxyXG42IDogZGVjaW1hbFxyXG43IDogZnVuY3Rpb24gd2l0aCBzeW50YXggKE1hdGhfZXhwKWZ1bmN0aW9uX25hbWVcclxuODogZnVuY3Rpb24gd2l0aCBzeW50YXggZnVuY3Rpb25fbmFtZShNYXRoX2V4cDEsTWF0aF9leHAyKVxyXG45IDogYmluYXJ5IG9wZXJhdG9yIGxpa2UgKywtXHJcbjEwOiBiaW5hcnkgb3BlcmF0b3IgbGlrZSBQIEMgb3IgXlxyXG4xMTogLFxyXG4xMjogZnVuY3Rpb24gd2l0aCAsIHNlcGVyYXRlZCB0aHJlZSBwYXJhbWV0ZXJzIGFuZCB0aGlyZCBwYXJhbWV0ZXIgaXMgYSBzdHJpbmcgdGhhdCB3aWxsIGJlIG1leHAgc3RyaW5nXHJcbjEzOiB2YXJpYWJsZSBvZiBTaWdtYSBmdW5jdGlvblxyXG4qL1xyXG52YXIgdHlwZTAgPSB7XHJcbiAgMDogdHJ1ZSxcclxuICAxOiB0cnVlLFxyXG4gIDM6IHRydWUsXHJcbiAgNDogdHJ1ZSxcclxuICA2OiB0cnVlLFxyXG4gIDg6IHRydWUsXHJcbiAgOTogdHJ1ZSxcclxuICAxMjogdHJ1ZSxcclxuICAxMzogdHJ1ZSxcclxuICAxNDogdHJ1ZVxyXG59IC8vIHR5cGUyOnRydWUsdHlwZTQ6dHJ1ZSx0eXBlOTp0cnVlLHR5cGUxMTp0cnVlLHR5cGUyMTp0cnVlLHR5cGUyMlxyXG52YXIgdHlwZTEgPSB7XHJcbiAgMDogdHJ1ZSxcclxuICAxOiB0cnVlLFxyXG4gIDI6IHRydWUsXHJcbiAgMzogdHJ1ZSxcclxuICA0OiB0cnVlLFxyXG4gIDU6IHRydWUsXHJcbiAgNjogdHJ1ZSxcclxuICA3OiB0cnVlLFxyXG4gIDg6IHRydWUsXHJcbiAgOTogdHJ1ZSxcclxuICAxMDogdHJ1ZSxcclxuICAxMTogdHJ1ZSxcclxuICAxMjogdHJ1ZSxcclxuICAxMzogdHJ1ZVxyXG59IC8vIHR5cGUzOnRydWUsdHlwZTU6dHJ1ZSx0eXBlNzp0cnVlLHR5cGUyM1xyXG52YXIgdHlwZTFBc3RlcmljayA9IHtcclxuICAwOiB0cnVlLFxyXG4gIDM6IHRydWUsXHJcbiAgNDogdHJ1ZSxcclxuICA4OiB0cnVlLFxyXG4gIDEyOiB0cnVlLFxyXG4gIDEzOiB0cnVlXHJcbn1cclxudmFyIGVtcHR5ID0ge31cclxudmFyIHR5cGUzQXN0ZXJpY2sgPSB7XHJcbiAgMDogdHJ1ZSxcclxuICAxOiB0cnVlLFxyXG4gIDM6IHRydWUsXHJcbiAgNDogdHJ1ZSxcclxuICA2OiB0cnVlLFxyXG4gIDg6IHRydWUsXHJcbiAgMTI6IHRydWUsXHJcbiAgMTM6IHRydWVcclxufSAvLyB0eXBlXzU6dHJ1ZSx0eXBlXzc6dHJ1ZSx0eXBlXzIzXHJcbnZhciB0eXBlNiA9IHtcclxuICAxOiB0cnVlXHJcbn1cclxudmFyIG5ld0FyID0gW1xyXG4gIFtdLFxyXG4gIFsnMScsICcyJywgJzMnLCAnNycsICc4JywgJzknLCAnNCcsICc1JywgJzYnLCAnKycsICctJywgJyonLCAnLycsICcoJywgJyknLCAnXicsICchJywgJ1AnLCAnQycsICdlJywgJzAnLCAnLicsICcsJywgJ24nLCAnICddLFxyXG4gIFsncGknLCAnbG4nLCAnUGknXSxcclxuICBbJ3NpbicsICdjb3MnLCAndGFuJywgJ0RlbCcsICdpbnQnLCAnTW9kJywgJ2xvZycsICdwb3cnXSxcclxuICBbJ2FzaW4nLCAnYWNvcycsICdhdGFuJywgJ2Nvc2gnLCAncm9vdCcsICd0YW5oJywgJ3NpbmgnXSxcclxuICBbJ2Fjb3NoJywgJ2F0YW5oJywgJ2FzaW5oJywgJ1NpZ21hJ11cclxuXVxyXG5cclxuZnVuY3Rpb24gbWF0Y2goc3RyMSwgc3RyMiwgaSwgeCkge1xyXG4gIGZvciAodmFyIGYgPSAwOyBmIDwgeDsgZisrKSB7XHJcbiAgICBpZiAoc3RyMVtpICsgZl0gIT09IHN0cjJbZl0pIHtcclxuICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiB0cnVlXHJcbn1cclxuTWV4cC5hZGRUb2tlbiA9IGZ1bmN0aW9uICh0b2tlbnMpIHtcclxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykge1xyXG4gICAgdmFyIHggPSB0b2tlbnNbaV0udG9rZW4ubGVuZ3RoXHJcbiAgICB2YXIgdGVtcCA9IC0xXHJcblxyXG4gICAgLy8gbmV3QXIgaXMgYSBzcGVjaWFsbHkgZGVzaWduZWQgZGF0YSBzdHJ1Y3R1cmUgaW5kZXggb2YgMWQgYXJyYXkgPSBsZW5ndGggb2YgdG9rZW5zXHJcbiAgICBuZXdBclt4XSA9IG5ld0FyW3hdIHx8IFtdO1xyXG4gICAgZm9yICh2YXIgeSA9IDA7IHkgPCBuZXdBclt4XS5sZW5ndGg7IHkrKykge1xyXG4gICAgICBpZiAodG9rZW5zW2ldLnRva2VuID09PSBuZXdBclt4XVt5XSkge1xyXG4gICAgICAgIHRlbXAgPSB0b2tlbi5pbmRleE9mKG5ld0FyW3hdW3ldKVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0ZW1wID09PSAtMSkge1xyXG4gICAgICB0b2tlbi5wdXNoKHRva2Vuc1tpXS50b2tlbilcclxuICAgICAgdHlwZS5wdXNoKHRva2Vuc1tpXS50eXBlKVxyXG4gICAgICBpZiAobmV3QXIubGVuZ3RoIDw9IHRva2Vuc1tpXS50b2tlbi5sZW5ndGgpIHtcclxuICAgICAgICBuZXdBclt0b2tlbnNbaV0udG9rZW4ubGVuZ3RoXSA9IFtdXHJcbiAgICAgIH1cclxuICAgICAgbmV3QXJbdG9rZW5zW2ldLnRva2VuLmxlbmd0aF0ucHVzaCh0b2tlbnNbaV0udG9rZW4pXHJcbiAgICAgIGV2YS5wdXNoKHRva2Vuc1tpXS52YWx1ZSlcclxuICAgICAgc2hvdy5wdXNoKHRva2Vuc1tpXS5zaG93KVxyXG4gICAgfSBlbHNlIHsgLy8gb3ZlcndyaXRlXHJcbiAgICAgIHRva2VuW3RlbXBdID0gdG9rZW5zW2ldLnRva2VuXHJcbiAgICAgIHR5cGVbdGVtcF0gPSB0b2tlbnNbaV0udHlwZVxyXG4gICAgICBldmFbdGVtcF0gPSB0b2tlbnNbaV0udmFsdWVcclxuICAgICAgc2hvd1t0ZW1wXSA9IHRva2Vuc1tpXS5zaG93XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiB0b2tlbml6ZShzdHJpbmcpIHtcclxuICB2YXIgbm9kZXMgPSBbXTtcclxuICB2YXIgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aDtcclxuICB2YXIga2V5LCB4LCB5O1xyXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcclxuICAgIGlmIChpIDwgbGVuZ3RoIC0gMSAmJiBzdHJpbmdbaV0gPT09ICcgJyAmJiBzdHJpbmdbaSArIDFdID09PSAnICcpIHtcclxuICAgICAgY29udGludWVcclxuICAgIH1cclxuICAgIGtleSA9ICcnXHJcbiAgICBmb3IgKHggPSAoc3RyaW5nLmxlbmd0aCAtIGkgPiAobmV3QXIubGVuZ3RoIC0gMikgPyBuZXdBci5sZW5ndGggLSAxIDogc3RyaW5nLmxlbmd0aCAtIGkpOyB4ID4gMDsgeC0tKSB7XHJcbiAgICAgIGlmIChuZXdBclt4XSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcclxuICAgICAgZm9yICh5ID0gMDsgeSA8IG5ld0FyW3hdLmxlbmd0aDsgeSsrKSB7XHJcbiAgICAgICAgaWYgKG1hdGNoKHN0cmluZywgbmV3QXJbeF1beV0sIGksIHgpKSB7XHJcbiAgICAgICAgICBrZXkgPSBuZXdBclt4XVt5XVxyXG4gICAgICAgICAgeSA9IG5ld0FyW3hdLmxlbmd0aFxyXG4gICAgICAgICAgeCA9IDBcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGkgKz0ga2V5Lmxlbmd0aCAtIDFcclxuICAgIGlmIChrZXkgPT09ICcnKSB7XHJcbiAgICAgIHRocm93IChuZXcgTWV4cC5FeGNlcHRpb24oJ0NhblxcJ3QgdW5kZXJzdGFuZCBhZnRlciAnICsgc3RyaW5nLnNsaWNlKGkpKSlcclxuICAgIH1cclxuICAgIHZhciBpbmRleCA9IHRva2VuLmluZGV4T2Yoa2V5KTtcclxuICAgIG5vZGVzLnB1c2goe1xyXG4gICAgICBpbmRleDogaW5kZXgsXHJcbiAgICAgIHRva2VuOiBrZXksXHJcbiAgICAgIHR5cGU6IHR5cGVbaW5kZXhdLFxyXG4gICAgICBldmFsOiBldmFbaW5kZXhdLFxyXG4gICAgICBwcmVjZWRlbmNlOiBwcmVjZWRbdHlwZVtpbmRleF1dLFxyXG4gICAgICBzaG93OiBzaG93W2luZGV4XVxyXG4gICAgfSlcclxuICB9XHJcbiAgcmV0dXJuIG5vZGVzO1xyXG59XHJcblxyXG5NZXhwLmxleCA9IGZ1bmN0aW9uIChpbnAsIHRva2Vucykge1xyXG4gICd1c2Ugc3RyaWN0J1xyXG5cclxuXHJcbiAgdmFyIGNoYW5nZVNpZ25PYmogPSB7XHJcbiAgICB2YWx1ZTogTWV4cC5tYXRoLmNoYW5nZVNpZ24sXHJcbiAgICB0eXBlOiAwLFxyXG4gICAgcHJlOiAyMSxcclxuICAgIHNob3c6ICctJ1xyXG4gIH1cclxuICB2YXIgY2xvc2luZ1Bhck9iaiA9IHtcclxuICAgIHZhbHVlOiAnKScsXHJcbiAgICBzaG93OiAnKScsXHJcbiAgICB0eXBlOiA1LFxyXG4gICAgcHJlOiAwXHJcbiAgfVxyXG4gIHZhciBvcGVuaW5nUGFyT2JqID0ge1xyXG4gICAgdmFsdWU6ICcoJyxcclxuICAgIHR5cGU6IDQsXHJcbiAgICBwcmU6IDAsXHJcbiAgICBzaG93OiAnKCdcclxuICB9XHJcbiAgdmFyIHN0ciA9IFtvcGVuaW5nUGFyT2JqXVxyXG5cclxuICB2YXIgcHRjID0gW10gLy8gUGFyZW50aGVzaXMgdG8gY2xvc2UgYXQgdGhlIGJlZ2lubmluZyBpcyBhZnRlciBvbmUgdG9rZW5cclxuICB2YXIgaW5wU3RyID0gaW5wXHJcbiAgdmFyIGFsbG93ZWQgPSB0eXBlMFxyXG4gIHZhciBicmFjVG9DbG9zZSA9IDBcclxuICB2YXIgYXN0ZXJpY2sgPSBlbXB0eVxyXG4gIHZhciBwcmV2S2V5ID0gJydcclxuICB2YXIgaTtcclxuICBpZiAodHlwZW9mIHRva2VucyAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgIE1leHAuYWRkVG9rZW4odG9rZW5zKVxyXG4gIH1cclxuICB2YXIgb2JqID0ge31cclxuICB2YXIgbm9kZXMgPSB0b2tlbml6ZShpbnBTdHIpO1xyXG4gIGZvciAoaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcclxuICAgIGlmIChub2RlLnR5cGUgPT09IDE0KSB7XHJcbiAgICAgIGlmIChpID4gMCAmJlxyXG4gICAgICAgIGkgPCBub2Rlcy5sZW5ndGggLSAxICYmXHJcbiAgICAgICAgbm9kZXNbaSArIDFdLnR5cGUgPT09IDEgJiZcclxuICAgICAgICAobm9kZXNbaSAtIDFdLnR5cGUgPT09IDEgfHwgbm9kZXNbaSAtIDFdLnR5cGUgPT09IDYpKVxyXG4gICAgICAgIHRocm93IG5ldyBNZXhwLkV4Y2VwdGlvbignVW5leHBlY3RlZCBTcGFjZScpXHJcbiAgICAgIGNvbnRpbnVlXHJcbiAgICB9XHJcblxyXG4gICAgdmFyIGluZGV4ID0gbm9kZS5pbmRleFxyXG4gICAgdmFyIGNUb2tlbiA9IG5vZGUudG9rZW5cclxuICAgIHZhciBjVHlwZSA9IG5vZGUudHlwZVxyXG4gICAgdmFyIGNFdiA9IG5vZGUuZXZhbFxyXG4gICAgdmFyIGNQcmUgPSBub2RlLnByZWNlZGVuY2VcclxuICAgIHZhciBjU2hvdyA9IG5vZGUuc2hvd1xyXG4gICAgdmFyIHByZSA9IHN0cltzdHIubGVuZ3RoIC0gMV1cclxuICAgIHZhciBqXHJcbiAgICBmb3IgKGogPSBwdGMubGVuZ3RoOyBqLS07KSB7IC8vIGxvb3Agb3ZlciBwdGNcclxuICAgICAgaWYgKHB0Y1tqXSA9PT0gMCkge1xyXG4gICAgICAgIGlmIChbMCwgMiwgMywgNCwgNSwgOSwgMTEsIDEyLCAxM10uaW5kZXhPZihjVHlwZSkgIT09IC0xKSB7XHJcbiAgICAgICAgICBpZiAoYWxsb3dlZFtjVHlwZV0gIT09IHRydWUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coaW5wLCBub2RlLCBub2RlcywgYWxsb3dlZClcclxuICAgICAgICAgICAgdGhyb3cgKG5ldyBNZXhwLkV4Y2VwdGlvbihjVG9rZW4gKyAnIGlzIG5vdCBhbGxvd2VkIGFmdGVyICcgKyBwcmV2S2V5KSlcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHN0ci5wdXNoKGNsb3NpbmdQYXJPYmopXHJcbiAgICAgICAgICBhbGxvd2VkID0gdHlwZTFcclxuICAgICAgICAgIGFzdGVyaWNrID0gdHlwZTNBc3Rlcmlja1xyXG4gICAgICAgICAgaW5jKHB0YywgLTEpLnBvcCgpXHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgYnJlYWtcclxuICAgIH1cclxuICAgIGlmIChhbGxvd2VkW2NUeXBlXSAhPT0gdHJ1ZSkge1xyXG4gICAgICB0aHJvdyAobmV3IE1leHAuRXhjZXB0aW9uKGNUb2tlbiArICcgaXMgbm90IGFsbG93ZWQgYWZ0ZXIgJyArIHByZXZLZXkpKVxyXG4gICAgfVxyXG4gICAgaWYgKGFzdGVyaWNrW2NUeXBlXSA9PT0gdHJ1ZSkge1xyXG4gICAgICBjVHlwZSA9IDJcclxuICAgICAgY0V2ID0gTWV4cC5tYXRoLm11bFxyXG4gICAgICBjU2hvdyA9ICcmdGltZXM7J1xyXG4gICAgICBjUHJlID0gM1xyXG4gICAgICBpID0gaSAtIGNUb2tlbi5sZW5ndGhcclxuICAgIH1cclxuICAgIG9iaiA9IHtcclxuICAgICAgdmFsdWU6IGNFdixcclxuICAgICAgdHlwZTogY1R5cGUsXHJcbiAgICAgIHByZTogY1ByZSxcclxuICAgICAgc2hvdzogY1Nob3dcclxuICAgIH1cclxuICAgIGlmIChjVHlwZSA9PT0gMCkge1xyXG4gICAgICBhbGxvd2VkID0gdHlwZTBcclxuICAgICAgYXN0ZXJpY2sgPSBlbXB0eVxyXG4gICAgICBpbmMocHRjLCAyKS5wdXNoKDIpXHJcbiAgICAgIHN0ci5wdXNoKG9iailcclxuICAgICAgc3RyLnB1c2gob3BlbmluZ1Bhck9iailcclxuICAgIH0gZWxzZSBpZiAoY1R5cGUgPT09IDEpIHtcclxuICAgICAgaWYgKHByZS50eXBlID09PSAxKSB7XHJcbiAgICAgICAgcHJlLnZhbHVlICs9IGNFdlxyXG4gICAgICAgIGluYyhwdGMsIDEpXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc3RyLnB1c2gob2JqKVxyXG4gICAgICB9XHJcbiAgICAgIGFsbG93ZWQgPSB0eXBlMVxyXG4gICAgICBhc3RlcmljayA9IHR5cGUxQXN0ZXJpY2tcclxuICAgIH0gZWxzZSBpZiAoY1R5cGUgPT09IDIpIHtcclxuICAgICAgYWxsb3dlZCA9IHR5cGUwXHJcbiAgICAgIGFzdGVyaWNrID0gZW1wdHlcclxuICAgICAgaW5jKHB0YywgMilcclxuICAgICAgc3RyLnB1c2gob2JqKVxyXG4gICAgfSBlbHNlIGlmIChjVHlwZSA9PT0gMykgeyAvLyBjb25zdGFudFxyXG4gICAgICBzdHIucHVzaChvYmopXHJcbiAgICAgIGFsbG93ZWQgPSB0eXBlMVxyXG4gICAgICBhc3RlcmljayA9IHR5cGUzQXN0ZXJpY2tcclxuICAgIH0gZWxzZSBpZiAoY1R5cGUgPT09IDQpIHtcclxuICAgICAgaW5jKHB0YywgMSlcclxuICAgICAgYnJhY1RvQ2xvc2UrK1xyXG4gICAgICBhbGxvd2VkID0gdHlwZTBcclxuICAgICAgYXN0ZXJpY2sgPSBlbXB0eVxyXG4gICAgICBzdHIucHVzaChvYmopXHJcbiAgICB9IGVsc2UgaWYgKGNUeXBlID09PSA1KSB7XHJcbiAgICAgIGlmICghYnJhY1RvQ2xvc2UpIHtcclxuICAgICAgICB0aHJvdyAobmV3IE1leHAuRXhjZXB0aW9uKCdDbG9zaW5nIHBhcmVudGhlc2lzIGFyZSBtb3JlIHRoYW4gb3BlbmluZyBvbmUsIHdhaXQgV2hhdCEhIScpKVxyXG4gICAgICB9XHJcbiAgICAgIGJyYWNUb0Nsb3NlLS1cclxuICAgICAgYWxsb3dlZCA9IHR5cGUxXHJcbiAgICAgIGFzdGVyaWNrID0gdHlwZTNBc3Rlcmlja1xyXG4gICAgICBzdHIucHVzaChvYmopXHJcbiAgICAgIGluYyhwdGMsIDEpXHJcbiAgICB9IGVsc2UgaWYgKGNUeXBlID09PSA2KSB7XHJcbiAgICAgIGlmIChwcmUuaGFzRGVjKSB7XHJcbiAgICAgICAgdGhyb3cgKG5ldyBNZXhwLkV4Y2VwdGlvbignVHdvIGRlY2ltYWxzIGFyZSBub3QgYWxsb3dlZCBpbiBvbmUgbnVtYmVyJykpXHJcbiAgICAgIH1cclxuICAgICAgaWYgKHByZS50eXBlICE9PSAxKSB7XHJcbiAgICAgICAgcHJlID0ge1xyXG4gICAgICAgICAgdmFsdWU6IDAsXHJcbiAgICAgICAgICB0eXBlOiAxLFxyXG4gICAgICAgICAgcHJlOiAwXHJcbiAgICAgICAgfSAvLyBwcmUgbmVlZHMgdG8gYmUgY2hhbmdlZCBhcyBpdCB3aWxsIHRoZSBsYXN0IHZhbHVlIG5vdyB0byBiZSBzYWZlIGluIGxhdGVyIGNvZGVcclxuICAgICAgICBzdHIucHVzaChwcmUpXHJcbiAgICAgICAgaW5jKHB0YywgLTEpXHJcbiAgICAgIH1cclxuICAgICAgYWxsb3dlZCA9IHR5cGU2XHJcbiAgICAgIGluYyhwdGMsIDEpXHJcbiAgICAgIGFzdGVyaWNrID0gZW1wdHlcclxuICAgICAgcHJlLnZhbHVlICs9IGNFdlxyXG4gICAgICBwcmUuaGFzRGVjID0gdHJ1ZVxyXG4gICAgfSBlbHNlIGlmIChjVHlwZSA9PT0gNykge1xyXG4gICAgICBhbGxvd2VkID0gdHlwZTFcclxuICAgICAgYXN0ZXJpY2sgPSB0eXBlM0FzdGVyaWNrXHJcbiAgICAgIGluYyhwdGMsIDEpXHJcbiAgICAgIHN0ci5wdXNoKG9iailcclxuICAgIH1cclxuICAgIGlmIChjVHlwZSA9PT0gOCkge1xyXG4gICAgICBhbGxvd2VkID0gdHlwZTBcclxuICAgICAgYXN0ZXJpY2sgPSBlbXB0eVxyXG4gICAgICBpbmMocHRjLCA0KS5wdXNoKDQpXHJcbiAgICAgIHN0ci5wdXNoKG9iailcclxuICAgICAgc3RyLnB1c2gob3BlbmluZ1Bhck9iailcclxuICAgIH0gZWxzZSBpZiAoY1R5cGUgPT09IDkpIHtcclxuICAgICAgaWYgKHByZS50eXBlID09PSA5KSB7XHJcbiAgICAgICAgaWYgKHByZS52YWx1ZSA9PT0gTWV4cC5tYXRoLmFkZCkge1xyXG4gICAgICAgICAgcHJlLnZhbHVlID0gY0V2XHJcbiAgICAgICAgICBwcmUuc2hvdyA9IGNTaG93XHJcbiAgICAgICAgICBpbmMocHRjLCAxKVxyXG4gICAgICAgIH0gZWxzZSBpZiAocHJlLnZhbHVlID09PSBNZXhwLm1hdGguc3ViICYmIGNTaG93ID09PSAnLScpIHtcclxuICAgICAgICAgIHByZS52YWx1ZSA9IE1leHAubWF0aC5hZGRcclxuICAgICAgICAgIHByZS5zaG93ID0gJysnXHJcbiAgICAgICAgICBpbmMocHRjLCAxKVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChwcmUudHlwZSAhPT0gNSAmJiBwcmUudHlwZSAhPT0gNyAmJiBwcmUudHlwZSAhPT0gMSAmJiBwcmUudHlwZSAhPT0gMyAmJiBwcmUudHlwZSAhPT0gMTMpIHsgLy8gY2hhbmdlc2lnbiBvbmx5IHdoZW4gbmVnYXRpdmUgaXMgZm91bmRcclxuICAgICAgICBpZiAoY1Rva2VuID09PSAnLScpIHsgLy8gZG8gbm90aGluZyBmb3IgKyB0b2tlblxyXG4gICAgICAgICAgLy8gZG9uJ3QgYWRkIHdpdGggdGhlIGFib3ZlIGlmIHN0YXRlbWVudCBhcyB0aGF0IHdpbGwgcnVuIHRoZSBlbHNlIHN0YXRlbWVudCBvZiBwYXJlbnQgaWYgb24gQ3Rva2VuICtcclxuICAgICAgICAgIGFsbG93ZWQgPSB0eXBlMFxyXG4gICAgICAgICAgYXN0ZXJpY2sgPSBlbXB0eVxyXG4gICAgICAgICAgaW5jKHB0YywgMikucHVzaCgyKVxyXG4gICAgICAgICAgc3RyLnB1c2goY2hhbmdlU2lnbk9iailcclxuICAgICAgICAgIHN0ci5wdXNoKG9wZW5pbmdQYXJPYmopXHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHN0ci5wdXNoKG9iailcclxuICAgICAgICBpbmMocHRjLCAyKVxyXG4gICAgICB9XHJcbiAgICAgIGFsbG93ZWQgPSB0eXBlMFxyXG4gICAgICBhc3RlcmljayA9IGVtcHR5XHJcbiAgICB9IGVsc2UgaWYgKGNUeXBlID09PSAxMCkge1xyXG4gICAgICBhbGxvd2VkID0gdHlwZTBcclxuICAgICAgYXN0ZXJpY2sgPSBlbXB0eVxyXG4gICAgICBpbmMocHRjLCAyKVxyXG4gICAgICBzdHIucHVzaChvYmopXHJcbiAgICB9IGVsc2UgaWYgKGNUeXBlID09PSAxMSkge1xyXG4gICAgICBhbGxvd2VkID0gdHlwZTBcclxuICAgICAgYXN0ZXJpY2sgPSBlbXB0eVxyXG4gICAgICBzdHIucHVzaChvYmopXHJcbiAgICB9IGVsc2UgaWYgKGNUeXBlID09PSAxMikge1xyXG4gICAgICBhbGxvd2VkID0gdHlwZTBcclxuICAgICAgYXN0ZXJpY2sgPSBlbXB0eVxyXG4gICAgICBpbmMocHRjLCA2KS5wdXNoKDYpXHJcbiAgICAgIHN0ci5wdXNoKG9iailcclxuICAgICAgc3RyLnB1c2gob3BlbmluZ1Bhck9iailcclxuICAgIH0gZWxzZSBpZiAoY1R5cGUgPT09IDEzKSB7XHJcbiAgICAgIGFsbG93ZWQgPSB0eXBlMVxyXG4gICAgICBhc3RlcmljayA9IHR5cGUzQXN0ZXJpY2tcclxuICAgICAgc3RyLnB1c2gob2JqKVxyXG4gICAgfVxyXG4gICAgaW5jKHB0YywgLTEpXHJcbiAgICBwcmV2S2V5ID0gY1Rva2VuXHJcbiAgfVxyXG4gIGZvciAoaiA9IHB0Yy5sZW5ndGg7IGotLTspIHsgLy8gbG9vcCBvdmVyIHB0Y1xyXG4gICAgaWYgKHB0Y1tqXSA9PT0gMCkge1xyXG4gICAgICBzdHIucHVzaChjbG9zaW5nUGFyT2JqKVxyXG4gICAgICBpbmMocHRjLCAtMSkucG9wKClcclxuICAgIH0gZWxzZSBicmVhayAgLy8gaWYgaXQgaXMgbm90IHplcm8gc28gYmVmb3JlIHB0YyBhbHNvIGNhbnQgYmUgemVyb1xyXG4gIH1cclxuICBpZiAoYWxsb3dlZFs1XSAhPT0gdHJ1ZSkge1xyXG4gICAgdGhyb3cgKG5ldyBNZXhwLkV4Y2VwdGlvbignY29tcGxldGUgdGhlIGV4cHJlc3Npb24nKSlcclxuICB9XHJcbiAgd2hpbGUgKGJyYWNUb0Nsb3NlLS0pIHtcclxuICAgIHN0ci5wdXNoKGNsb3NpbmdQYXJPYmopXHJcbiAgfVxyXG5cclxuICBzdHIucHVzaChjbG9zaW5nUGFyT2JqKVxyXG4gIC8vICAgICAgICBjb25zb2xlLmxvZyhzdHIpO1xyXG4gIHJldHVybiBuZXcgTWV4cChzdHIpXHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBNZXhwXHJcbiIsIlxyXG52YXIgTWV4cCA9IHJlcXVpcmUoJy4vbGV4ZXIuanMnKTtcclxuXHJcbk1leHAucHJvdG90eXBlLnRvUG9zdGZpeCA9IGZ1bmN0aW9uICgpIHtcclxuXHQndXNlIHN0cmljdCc7XHJcblx0dmFyIHBvc3QgPSBbXSwgZWxlbSwgcG9wcGVkLCBwcmVwLCBwcmUsIGVsZTtcclxuXHR2YXIgc3RhY2sgPSBbeyB2YWx1ZTogXCIoXCIsIHR5cGU6IDQsIHByZTogMCB9XTtcclxuXHR2YXIgYXJyID0gdGhpcy52YWx1ZTtcclxuXHRmb3IgKHZhciBpID0gMTsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xyXG5cdFx0aWYgKGFycltpXS50eXBlID09PSAxIHx8IGFycltpXS50eXBlID09PSAzIHx8IGFycltpXS50eXBlID09PSAxMykge1x0Ly9pZiB0b2tlbiBpcyBudW1iZXIsY29uc3RhbnQsb3Igbih3aGljaCBpcyBhbHNvIGEgc3BlY2lhbCBjb25zdGFudCBpbiBvdXIgY2FzZSlcclxuXHRcdFx0aWYgKGFycltpXS50eXBlID09PSAxKVxyXG5cdFx0XHRcdGFycltpXS52YWx1ZSA9IE51bWJlcihhcnJbaV0udmFsdWUpO1xyXG5cdFx0XHRwb3N0LnB1c2goYXJyW2ldKTtcclxuXHRcdH1cclxuXHRcdGVsc2UgaWYgKGFycltpXS50eXBlID09PSA0KSB7XHJcblx0XHRcdHN0YWNrLnB1c2goYXJyW2ldKTtcclxuXHRcdH1cclxuXHRcdGVsc2UgaWYgKGFycltpXS50eXBlID09PSA1KSB7XHJcblx0XHRcdHdoaWxlICgocG9wcGVkID0gc3RhY2sucG9wKCkpLnR5cGUgIT09IDQpIHtcclxuXHRcdFx0XHRwb3N0LnB1c2gocG9wcGVkKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0ZWxzZSBpZiAoYXJyW2ldLnR5cGUgPT09IDExKSB7XHJcblx0XHRcdHdoaWxlICgocG9wcGVkID0gc3RhY2sucG9wKCkpLnR5cGUgIT09IDQpIHtcclxuXHRcdFx0XHRwb3N0LnB1c2gocG9wcGVkKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRzdGFjay5wdXNoKHBvcHBlZCk7XHJcblx0XHR9XHJcblx0XHRlbHNlIHtcclxuXHRcdFx0ZWxlbSA9IGFycltpXTtcclxuXHRcdFx0cHJlID0gZWxlbS5wcmU7XHJcblx0XHRcdGVsZSA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xyXG5cdFx0XHRwcmVwID0gZWxlLnByZTtcclxuXHRcdFx0dmFyIGZsYWcgPSBlbGUudmFsdWUgPT0gJ01hdGgucG93JyAmJiBlbGVtLnZhbHVlID09ICdNYXRoLnBvdyc7XHJcblx0XHRcdGlmIChwcmUgPiBwcmVwKSBzdGFjay5wdXNoKGVsZW0pO1xyXG5cdFx0XHRlbHNlIHtcclxuXHRcdFx0XHR3aGlsZSAocHJlcCA+PSBwcmUgJiYgIWZsYWcgfHwgZmxhZyAmJiBwcmUgPCBwcmVwKSB7XHJcblx0XHRcdFx0XHRwb3BwZWQgPSBzdGFjay5wb3AoKTtcclxuXHRcdFx0XHRcdGVsZSA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xyXG5cdFx0XHRcdFx0cG9zdC5wdXNoKHBvcHBlZCk7XHJcblx0XHRcdFx0XHRwcmVwID0gZWxlLnByZTtcclxuXHRcdFx0XHRcdGZsYWcgPSBlbGVtLnZhbHVlID09ICdNYXRoLnBvdycgJiYgZWxlLnZhbHVlID09ICdNYXRoLnBvdyc7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHN0YWNrLnB1c2goZWxlbSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblx0cmV0dXJuIG5ldyBNZXhwKHBvc3QpO1xyXG59O1xyXG5tb2R1bGUuZXhwb3J0cyA9IE1leHA7IiwidmFyIE1leHA9cmVxdWlyZSgnLi9wb3N0Zml4LmpzJyk7XHJcbk1leHAucHJvdG90eXBlLnBvc3RmaXhFdmFsID0gZnVuY3Rpb24gKFVzZXJEZWZpbmVkKSB7XHJcblx0J3VzZSBzdHJpY3QnO1xyXG5cdFVzZXJEZWZpbmVkPVVzZXJEZWZpbmVkfHx7fTtcclxuXHRVc2VyRGVmaW5lZC5QST1NYXRoLlBJO1xyXG5cdFVzZXJEZWZpbmVkLkU9TWF0aC5FO1xyXG5cdHZhciBzdGFjaz1bXSxwb3AxLHBvcDIscG9wMztcclxuXHR2YXIgZGlzcD1bXTtcclxuXHR2YXIgdGVtcD0nJztcclxuXHR2YXIgYXJyPXRoaXMudmFsdWU7XHJcblx0dmFyIGJvb2w9KHR5cGVvZiBVc2VyRGVmaW5lZC5uIT09XCJ1bmRlZmluZWRcIik7XHJcblx0Zm9yKHZhciBpPTA7aTxhcnIubGVuZ3RoO2krKyl7XHJcblx0XHRpZihhcnJbaV0udHlwZT09PTEpe1xyXG5cdFx0XHRzdGFjay5wdXNoKHt2YWx1ZTphcnJbaV0udmFsdWUsdHlwZToxfSk7XHJcblx0XHR9XHJcblx0XHRlbHNlIGlmKGFycltpXS50eXBlPT09Myl7XHJcblx0XHRcdHN0YWNrLnB1c2goe3ZhbHVlOlVzZXJEZWZpbmVkW2FycltpXS52YWx1ZV0sdHlwZToxfSk7XHJcblx0XHR9XHJcblx0XHRlbHNlIGlmKGFycltpXS50eXBlPT09MCl7XHJcblx0XHRcdGlmKHR5cGVvZiBzdGFja1tzdGFjay5sZW5ndGgtMV0udHlwZT09PVwidW5kZWZpbmVkXCIpe1xyXG5cdFx0XHRcdHN0YWNrW3N0YWNrLmxlbmd0aC0xXS52YWx1ZS5wdXNoKGFycltpXSk7XHJcblx0XHRcdH1cclxuXHRcdFx0ZWxzZSBzdGFja1tzdGFjay5sZW5ndGgtMV0udmFsdWU9YXJyW2ldLnZhbHVlKHN0YWNrW3N0YWNrLmxlbmd0aC0xXS52YWx1ZSk7XHJcblx0XHR9XHJcblx0XHRlbHNlIGlmKGFycltpXS50eXBlPT09Nyl7XHJcblx0XHRcdGlmKHR5cGVvZiBzdGFja1tzdGFjay5sZW5ndGgtMV0udHlwZT09PVwidW5kZWZpbmVkXCIpe1xyXG5cdFx0XHRcdHN0YWNrW3N0YWNrLmxlbmd0aC0xXS52YWx1ZS5wdXNoKGFycltpXSk7XHJcblx0XHRcdH1cclxuXHRcdFx0ZWxzZSBzdGFja1tzdGFjay5sZW5ndGgtMV0udmFsdWU9YXJyW2ldLnZhbHVlKHN0YWNrW3N0YWNrLmxlbmd0aC0xXS52YWx1ZSk7XHJcblx0XHR9XHJcblx0XHRlbHNlIGlmKGFycltpXS50eXBlPT09OCl7XHJcblx0XHRcdHBvcDE9c3RhY2sucG9wKCk7XHJcblx0XHRcdHBvcDI9c3RhY2sucG9wKCk7XHJcblx0XHRcdHN0YWNrLnB1c2goe3R5cGU6MSx2YWx1ZTphcnJbaV0udmFsdWUocG9wMi52YWx1ZSxwb3AxLnZhbHVlKX0pO1xyXG5cdFx0fVxyXG5cdFx0ZWxzZSBpZihhcnJbaV0udHlwZT09PTEwKXtcclxuXHRcdFx0cG9wMT1zdGFjay5wb3AoKTtcclxuXHRcdFx0cG9wMj1zdGFjay5wb3AoKTtcclxuXHRcdFx0aWYodHlwZW9mIHBvcDIudHlwZT09PVwidW5kZWZpbmVkXCIpe1xyXG5cdFx0XHRcdHBvcDIudmFsdWU9cG9wMi5jb25jYXQocG9wMSk7XHJcblx0XHRcdFx0cG9wMi52YWx1ZS5wdXNoKGFycltpXSk7XHJcblx0XHRcdFx0c3RhY2sucHVzaChwb3AyKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRlbHNlIGlmICh0eXBlb2YgcG9wMS50eXBlPT09XCJ1bmRlZmluZWRcIikge1xyXG5cdFx0XHRcdHBvcDEudW5zaGlmdChwb3AyKTtcclxuXHRcdFx0XHRwb3AxLnB1c2goYXJyW2ldKTtcclxuXHRcdFx0XHRzdGFjay5wdXNoKHBvcDEpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGVsc2V7XHJcblx0XHRcdFx0c3RhY2sucHVzaCh7dHlwZToxLHZhbHVlOmFycltpXS52YWx1ZShwb3AyLnZhbHVlLHBvcDEudmFsdWUpfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHRcdH1cclxuXHRcdGVsc2UgaWYoYXJyW2ldLnR5cGU9PT0yfHxhcnJbaV0udHlwZT09PTkpe1xyXG5cdFx0XHRwb3AxPXN0YWNrLnBvcCgpO1xyXG5cdFx0XHRwb3AyPXN0YWNrLnBvcCgpO1xyXG5cdFx0XHRpZih0eXBlb2YgcG9wMi50eXBlPT09XCJ1bmRlZmluZWRcIil7XHJcblx0XHRcdFx0cG9wMj1wb3AyLmNvbmNhdChwb3AxKTtcclxuXHRcdFx0XHRwb3AyLnB1c2goYXJyW2ldKTtcclxuXHRcdFx0XHRzdGFjay5wdXNoKHBvcDIpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGVsc2UgaWYgKHR5cGVvZiBwb3AxLnR5cGU9PT1cInVuZGVmaW5lZFwiKSB7XHJcblx0XHRcdFx0cG9wMS51bnNoaWZ0KHBvcDIpO1xyXG5cdFx0XHRcdHBvcDEucHVzaChhcnJbaV0pO1xyXG5cdFx0XHRcdHN0YWNrLnB1c2gocG9wMSk7XHJcblx0XHRcdH1cclxuXHRcdFx0ZWxzZXtcclxuXHRcdFx0XHRzdGFjay5wdXNoKHt0eXBlOjEsdmFsdWU6YXJyW2ldLnZhbHVlKHBvcDIudmFsdWUscG9wMS52YWx1ZSl9KTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0ZWxzZSBpZihhcnJbaV0udHlwZT09PTEyKXtcclxuXHRcdFx0cG9wMT1zdGFjay5wb3AoKTtcclxuXHRcdFx0aWYgKHR5cGVvZiBwb3AxLnR5cGUhPT1cInVuZGVmaW5lZFwiKSB7XHJcblx0XHRcdFx0cG9wMT1bcG9wMV07XHJcblx0XHRcdH1cclxuXHRcdFx0cG9wMj1zdGFjay5wb3AoKTtcclxuXHRcdFx0cG9wMz1zdGFjay5wb3AoKTtcclxuXHRcdFx0c3RhY2sucHVzaCh7dHlwZToxLHZhbHVlOmFycltpXS52YWx1ZShwb3AzLnZhbHVlLHBvcDIudmFsdWUsbmV3IE1leHAocG9wMSkpfSk7XHJcblx0XHR9XHJcblx0XHRlbHNlIGlmKGFycltpXS50eXBlPT09MTMpe1xyXG5cdFx0XHRpZihib29sKXtcclxuXHRcdFx0XHRzdGFjay5wdXNoKHt2YWx1ZTpVc2VyRGVmaW5lZFthcnJbaV0udmFsdWVdLHR5cGU6M30pO1xyXG5cdFx0XHR9XHJcblx0XHRcdGVsc2Ugc3RhY2sucHVzaChbYXJyW2ldXSk7XHJcblx0XHR9XHJcblx0fVxyXG5cdGlmIChzdGFjay5sZW5ndGg+MSkge1xyXG5cdFx0dGhyb3cobmV3IE1leHAuRXhjZXB0aW9uKFwiVW5jYXVnaHQgU3ludGF4IGVycm9yXCIpKTtcclxuXHR9XHJcblx0cmV0dXJuIHN0YWNrWzBdLnZhbHVlPjEwMDAwMDAwMDAwMDAwMDA/XCJJbmZpbml0eVwiOnBhcnNlRmxvYXQoc3RhY2tbMF0udmFsdWUudG9GaXhlZCgxNSkpO1xyXG59O1xyXG5NZXhwLmV2YWw9ZnVuY3Rpb24oc3RyLHRva2VucyxvYmope1xyXG5cdGlmICh0eXBlb2YgdG9rZW5zPT09XCJ1bmRlZmluZWRcIikge1xyXG5cdFx0cmV0dXJuIHRoaXMubGV4KHN0cikudG9Qb3N0Zml4KCkucG9zdGZpeEV2YWwoKTtcclxuXHR9XHJcblx0ZWxzZSBpZiAodHlwZW9mIG9iaj09PVwidW5kZWZpbmVkXCIpIHtcclxuXHRcdGlmICh0eXBlb2YgdG9rZW5zLmxlbmd0aCE9PVwidW5kZWZpbmVkXCIpIFxyXG5cdFx0XHRyZXR1cm4gdGhpcy5sZXgoc3RyLHRva2VucykudG9Qb3N0Zml4KCkucG9zdGZpeEV2YWwoKTtcclxuXHRcdGVsc2VcclxuXHRcdFx0cmV0dXJuIHRoaXMubGV4KHN0cikudG9Qb3N0Zml4KCkucG9zdGZpeEV2YWwodG9rZW5zKTtcclxuXHR9XHJcblx0ZWxzZVxyXG5cdFx0cmV0dXJuIHRoaXMubGV4KHN0cix0b2tlbnMpLnRvUG9zdGZpeCgpLnBvc3RmaXhFdmFsKG9iaik7XHJcbn07XHJcbm1vZHVsZS5leHBvcnRzPU1leHA7IiwidmFyIE1leHA9cmVxdWlyZSgnLi9wb3N0Zml4X2V2YWx1YXRvci5qcycpO1xyXG5NZXhwLnByb3RvdHlwZS5mb3JtdWxhRXZhbCA9IGZ1bmN0aW9uICgpIHtcclxuXHRcInVzZSBzdHJpY3RcIjtcclxuXHR2YXIgc3RhY2s9W10scG9wMSxwb3AyLHBvcDM7XHJcblx0dmFyIGRpc3A9W107XHJcblx0dmFyIHRlbXA9Jyc7XHJcblx0dmFyIGFycj10aGlzLnZhbHVlO1xyXG5cdGZvcih2YXIgaT0wO2k8YXJyLmxlbmd0aDtpKyspe1xyXG5cdFx0aWYoYXJyW2ldLnR5cGU9PT0xfHxhcnJbaV0udHlwZT09PTMpe1xyXG5cdFx0XHRkaXNwLnB1c2goe3ZhbHVlOmFycltpXS50eXBlPT09Mz9hcnJbaV0uc2hvdzphcnJbaV0udmFsdWUsdHlwZToxfSk7XHJcblx0XHR9XHJcblx0XHRlbHNlIGlmKGFycltpXS50eXBlPT09MTMpe1xyXG5cdFx0XHRkaXNwLnB1c2goe3ZhbHVlOmFycltpXS5zaG93LHR5cGU6MX0pO1xyXG5cdFx0fVxyXG5cdFx0ZWxzZSBpZihhcnJbaV0udHlwZT09PTApe1xyXG5cdFx0XHRkaXNwW2Rpc3AubGVuZ3RoLTFdPXt2YWx1ZTphcnJbaV0uc2hvdysoYXJyW2ldLnNob3chPVwiLVwiP1wiKFwiOlwiXCIpK2Rpc3BbZGlzcC5sZW5ndGgtMV0udmFsdWUrKGFycltpXS5zaG93IT1cIi1cIj9cIilcIjpcIlwiKSx0eXBlOjB9O1xyXG5cdFx0fVxyXG5cdFx0ZWxzZSBpZihhcnJbaV0udHlwZT09PTcpe1xyXG5cdFx0XHRkaXNwW2Rpc3AubGVuZ3RoLTFdPXt2YWx1ZTooZGlzcFtkaXNwLmxlbmd0aC0xXS50eXBlIT0xP1wiKFwiOlwiXCIpK2Rpc3BbZGlzcC5sZW5ndGgtMV0udmFsdWUrKGRpc3BbZGlzcC5sZW5ndGgtMV0udHlwZSE9MT9cIilcIjpcIlwiKSthcnJbaV0uc2hvdyx0eXBlOjd9O1xyXG5cdFx0fVxyXG5cdFx0ZWxzZSBpZihhcnJbaV0udHlwZT09PTEwKXtcclxuXHRcdFx0cG9wMT1kaXNwLnBvcCgpO1xyXG5cdFx0XHRwb3AyPWRpc3AucG9wKCk7XHJcblx0XHRcdGlmKGFycltpXS5zaG93PT09J1AnfHxhcnJbaV0uc2hvdz09PSdDJylkaXNwLnB1c2goe3ZhbHVlOlwiPHN1cD5cIitwb3AyLnZhbHVlK1wiPC9zdXA+XCIrYXJyW2ldLnNob3crXCI8c3ViPlwiK3BvcDEudmFsdWUrXCI8L3N1Yj5cIix0eXBlOjEwfSk7XHJcblx0XHRcdGVsc2UgZGlzcC5wdXNoKHt2YWx1ZToocG9wMi50eXBlIT0xP1wiKFwiOlwiXCIpK3BvcDIudmFsdWUrKHBvcDIudHlwZSE9MT9cIilcIjpcIlwiKStcIjxzdXA+XCIrcG9wMS52YWx1ZStcIjwvc3VwPlwiLHR5cGU6MX0pO1xyXG5cdFx0fVxyXG5cdFx0ZWxzZSBpZihhcnJbaV0udHlwZT09PTJ8fGFycltpXS50eXBlPT09OSl7XHJcblx0XHRcdHBvcDE9ZGlzcC5wb3AoKTtcclxuXHRcdFx0cG9wMj1kaXNwLnBvcCgpO1xyXG5cdFx0XHRkaXNwLnB1c2goe3ZhbHVlOihwb3AyLnR5cGUhPTE/XCIoXCI6XCJcIikrcG9wMi52YWx1ZSsocG9wMi50eXBlIT0xP1wiKVwiOlwiXCIpK2FycltpXS5zaG93Kyhwb3AxLnR5cGUhPTE/XCIoXCI6XCJcIikrcG9wMS52YWx1ZSsocG9wMS50eXBlIT0xP1wiKVwiOlwiXCIpLHR5cGU6YXJyW2ldLnR5cGV9KTtcclxuXHRcdH1cclxuXHRcdGVsc2UgaWYoYXJyW2ldLnR5cGU9PT0xMil7XHJcblx0XHRcdHBvcDE9ZGlzcC5wb3AoKTtcclxuXHRcdFx0cG9wMj1kaXNwLnBvcCgpO1xyXG5cdFx0XHRwb3AzPWRpc3AucG9wKCk7XHJcblx0XHRcdGRpc3AucHVzaCh7dmFsdWU6YXJyW2ldLnNob3crXCIoXCIrcG9wMy52YWx1ZStcIixcIitwb3AyLnZhbHVlK1wiLFwiK3BvcDEudmFsdWUrXCIpXCIsdHlwZToxMn0pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4gZGlzcFswXS52YWx1ZTtcclxufTtcclxubW9kdWxlLmV4cG9ydHM9TWV4cDsiLCJpbXBvcnQgeyBNYXJrZG93blZpZXcsIEFwcCwgTm90aWNlLCBURmlsZSB9IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IHsgRXh0ZW5kZWRCbG9ja0NhY2hlIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGdldFN0b3JlIH0gZnJvbSBcIi4vYnV0dG9uU3RvcmVcIjtcbmltcG9ydCB7IGNyZWF0ZUNvbnRlbnRBcnJheSwgaGFuZGxlVmFsdWVBcnJheSB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmV4cG9ydCBjb25zdCByZW1vdmVCdXR0b24gPSBhc3luYyAoXG4gIGFwcDogQXBwLFxuICByZW1vdmU6IHN0cmluZyxcbiAgbGluZVN0YXJ0OiBudW1iZXIsXG4gIGxpbmVFbmQ6IG51bWJlclxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHsgY29udGVudEFycmF5LCBmaWxlIH0gPSBhd2FpdCBjcmVhdGVDb250ZW50QXJyYXkoYXBwKTtcbiAgY29uc3Qgc3RvcmUgPSBnZXRTdG9yZShhcHAuaXNNb2JpbGUpO1xuICBpZiAocmVtb3ZlID09PSBcInRydWVcIikge1xuICAgIGNvbnN0IG51bWJlck9mSXRlbXMgPSBsaW5lRW5kIC0gbGluZVN0YXJ0O1xuICAgIGNvbnRlbnRBcnJheS5zcGxpY2UobGluZVN0YXJ0LCBudW1iZXJPZkl0ZW1zICsgMSk7XG4gICAgaWYgKFxuICAgICAgY29udGVudEFycmF5W2xpbmVTdGFydF0gJiZcbiAgICAgIGNvbnRlbnRBcnJheVtsaW5lU3RhcnRdLmluY2x1ZGVzKFwiXmJ1dHRvbi1cIilcbiAgICApIHtcbiAgICAgIGNvbnRlbnRBcnJheS5zcGxpY2UobGluZVN0YXJ0LCAxKTtcbiAgICB9XG4gICAgY29uc3QgY29udGVudCA9IGNvbnRlbnRBcnJheS5qb2luKFwiXFxuXCIpO1xuICAgIGF3YWl0IGFwcC52YXVsdC5tb2RpZnkoZmlsZSwgY29udGVudCk7XG4gIH1cbiAgaWYgKGxpbmVTdGFydCA9PT0gbGluZUVuZCkge1xuICAgIGNvbnRlbnRBcnJheS5zcGxpY2UobGluZVN0YXJ0LCAxKTtcbiAgICBjb25zdCBjb250ZW50ID0gY29udGVudEFycmF5LmpvaW4oXCJcXG5cIik7XG4gICAgYXdhaXQgYXBwLnZhdWx0Lm1vZGlmeShmaWxlLCBjb250ZW50KTtcbiAgfSBlbHNlIHtcbiAgICBoYW5kbGVWYWx1ZUFycmF5KHJlbW92ZSwgYXN5bmMgKGFyZ0FycmF5KSA9PiB7XG4gICAgICBjb25zdCBidXR0b25zID1cbiAgICAgICAgc3RvcmUgJiZcbiAgICAgICAgc3RvcmUuZmlsdGVyKChpdGVtOiBFeHRlbmRlZEJsb2NrQ2FjaGUpID0+IHtcbiAgICAgICAgICBsZXQgZXhpc3RzO1xuICAgICAgICAgIGFyZ0FycmF5LmZvckVhY2goKGFyZykgPT4ge1xuICAgICAgICAgICAgaWYgKGl0ZW0uaWQgPT09IGBidXR0b24tJHthcmd9YCAmJiBpdGVtLnBhdGggPT09IGZpbGUucGF0aCkge1xuICAgICAgICAgICAgICBleGlzdHMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBleGlzdHM7XG4gICAgICAgIH0pO1xuICAgICAgaWYgKGJ1dHRvbnNbMF0pIHtcbiAgICAgICAgbGV0IG9mZnNldCA9IDA7XG4gICAgICAgIGJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uOiBFeHRlbmRlZEJsb2NrQ2FjaGUpID0+IHtcbiAgICAgICAgICBjb25zdCBzdGFydCA9IGJ1dHRvbi5wb3NpdGlvbi5zdGFydC5saW5lIC0gb2Zmc2V0O1xuICAgICAgICAgIGNvbnN0IG51bUxpbmVzID1cbiAgICAgICAgICAgIGJ1dHRvbi5wb3NpdGlvbi5lbmQubGluZSAtIGJ1dHRvbi5wb3NpdGlvbi5zdGFydC5saW5lO1xuICAgICAgICAgIGNvbnRlbnRBcnJheS5zcGxpY2Uoc3RhcnQsIG51bUxpbmVzICsgMik7XG4gICAgICAgICAgb2Zmc2V0ICs9IG51bUxpbmVzICsgMjtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBjb250ZW50QXJyYXkuam9pbihcIlxcblwiKTtcbiAgICAgICAgYXdhaXQgYXBwLnZhdWx0Lm1vZGlmeShmaWxlLCBjb250ZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHJlbW92ZVNlY3Rpb24gPSBhc3luYyAoXG4gIGFwcDogQXBwLFxuICBzZWN0aW9uOiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCB7IGNvbnRlbnRBcnJheSwgZmlsZSB9ID0gYXdhaXQgY3JlYXRlQ29udGVudEFycmF5KGFwcCk7XG4gIGlmIChzZWN0aW9uLmluY2x1ZGVzKFwiW1wiKSAmJiBzZWN0aW9uLmluY2x1ZGVzKFwiXVwiKSkge1xuICAgIGNvbnN0IGFyZ3MgPSBzZWN0aW9uLm1hdGNoKC9cXFsoLiopXFxdLyk7XG4gICAgaWYgKGFyZ3NbMV0pIHtcbiAgICAgIGNvbnN0IGFyZ0FycmF5ID0gYXJnc1sxXS5zcGxpdCgvLFxccz8vKTtcbiAgICAgIGlmIChhcmdBcnJheVswXSkge1xuICAgICAgICBjb25zdCBzdGFydCA9IHBhcnNlSW50KGFyZ0FycmF5WzBdKSAtIDE7XG4gICAgICAgIGNvbnN0IGVuZCA9IHBhcnNlSW50KGFyZ0FycmF5WzFdKTtcbiAgICAgICAgY29uc3QgbnVtTGluZXMgPSBlbmQgLSBzdGFydDtcbiAgICAgICAgY29udGVudEFycmF5LnNwbGljZShzdGFydCwgbnVtTGluZXMpO1xuICAgICAgICBjb25zdCBjb250ZW50ID0gY29udGVudEFycmF5LmpvaW4oXCJcXG5cIik7XG4gICAgICAgIGF3YWl0IGFwcC52YXVsdC5tb2RpZnkoZmlsZSwgY29udGVudCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgY29uc3QgcHJlcGVuZENvbnRlbnQgPSBhc3luYyAoXG4gIGFwcDogQXBwLFxuICBpbnNlcnQ6IHN0cmluZyxcbiAgbGluZVN0YXJ0OiBudW1iZXJcbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCBhY3RpdmVWaWV3ID0gYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldyk7XG4gIGlmIChhY3RpdmVWaWV3KSB7XG4gICAgY29uc3QgZmlsZSA9IGFjdGl2ZVZpZXcuZmlsZTtcbiAgICBsZXQgY29udGVudCA9IGF3YWl0IGFwcC52YXVsdC5yZWFkKGZpbGUpO1xuICAgIGNvbnN0IGNvbnRlbnRBcnJheSA9IGNvbnRlbnQuc3BsaXQoXCJcXG5cIik7XG4gICAgY29udGVudEFycmF5LnNwbGljZShsaW5lU3RhcnQsIDAsIGluc2VydCk7XG4gICAgY29udGVudCA9IGNvbnRlbnRBcnJheS5qb2luKFwiXFxuXCIpO1xuICAgIGF3YWl0IGFwcC52YXVsdC5tb2RpZnkoZmlsZSwgY29udGVudCk7XG4gIH0gZWxzZSB7XG4gICAgbmV3IE5vdGljZShcIlRoZXJlIHdhcyBhbiBpc3N1ZSBwcmVwZW5kaW5nIGNvbnRlbnQsIHBsZWFzZSB0cnkgYWdhaW5cIiwgMjAwMCk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBhcHBlbmRDb250ZW50ID0gYXN5bmMgKFxuICBhcHA6IEFwcCxcbiAgaW5zZXJ0OiBzdHJpbmcsXG4gIGxpbmVFbmQ6IG51bWJlclxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IGFjdGl2ZVZpZXcgPSBhcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KTtcbiAgaWYgKGFjdGl2ZVZpZXcpIHtcbiAgICBjb25zdCBmaWxlID0gYWN0aXZlVmlldy5maWxlO1xuICAgIGxldCBjb250ZW50ID0gYXdhaXQgYXBwLnZhdWx0LnJlYWQoZmlsZSk7XG4gICAgY29uc3QgY29udGVudEFycmF5ID0gY29udGVudC5zcGxpdChcIlxcblwiKTtcbiAgICBsZXQgaW5zZXJ0aW9uUG9pbnQ7XG4gICAgaWYgKFxuICAgICAgY29udGVudEFycmF5W2xpbmVFbmQgKyAxXSAmJlxuICAgICAgY29udGVudEFycmF5W2xpbmVFbmQgKyAxXS5pbmNsdWRlcyhcIl5idXR0b25cIilcbiAgICApIHtcbiAgICAgIGluc2VydGlvblBvaW50ID0gbGluZUVuZCArIDI7XG4gICAgICBpbnNlcnQgPSBgXFxuJHtpbnNlcnR9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5zZXJ0aW9uUG9pbnQgPSBsaW5lRW5kICsgMTtcbiAgICB9XG4gICAgY29udGVudEFycmF5LnNwbGljZShpbnNlcnRpb25Qb2ludCwgMCwgYCR7aW5zZXJ0fWApO1xuICAgIGNvbnRlbnQgPSBjb250ZW50QXJyYXkuam9pbihcIlxcblwiKTtcbiAgICBhd2FpdCBhcHAudmF1bHQubW9kaWZ5KGZpbGUsIGNvbnRlbnQpO1xuICB9IGVsc2Uge1xuICAgIG5ldyBOb3RpY2UoXCJUaGVyZSB3YXMgYW4gaXNzdWUgYXBwZW5kaW5nIGNvbnRlbnQsIHBsZWFzZSB0cnkgYWdhaW5cIiwgMjAwMCk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBhZGRDb250ZW50QXRMaW5lID0gYXN5bmMgKFxuICBhcHA6IEFwcCxcbiAgaW5zZXJ0OiBzdHJpbmcsXG4gIHR5cGU6IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IGxpbmVOdW1iZXIgPSB0eXBlLm1hdGNoKC8oXFxkKykvZyk7XG4gIGlmIChsaW5lTnVtYmVyWzBdKSB7XG4gICAgY29uc3QgaW5zZXJ0aW9uUG9pbnQgPSBwYXJzZUludChsaW5lTnVtYmVyWzBdKSAtIDE7XG4gICAgY29uc3QgYWN0aXZlVmlldyA9IGFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpO1xuICAgIGlmIChhY3RpdmVWaWV3KSB7XG4gICAgICBjb25zdCBmaWxlID0gYWN0aXZlVmlldy5maWxlO1xuICAgICAgbGV0IGNvbnRlbnQgPSBhd2FpdCBhcHAudmF1bHQucmVhZChmaWxlKTtcbiAgICAgIGNvbnN0IGNvbnRlbnRBcnJheSA9IGNvbnRlbnQuc3BsaXQoXCJcXG5cIik7XG4gICAgICBjb250ZW50QXJyYXkuc3BsaWNlKGluc2VydGlvblBvaW50LCAwLCBgJHtpbnNlcnR9YCk7XG4gICAgICBjb250ZW50ID0gY29udGVudEFycmF5LmpvaW4oXCJcXG5cIik7XG4gICAgICBhd2FpdCBhcHAudmF1bHQubW9kaWZ5KGZpbGUsIGNvbnRlbnQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBuZXcgTm90aWNlKFwiVGhlcmUgd2FzIGFuIGlzc3VlIGFkZGluZyBjb250ZW50LCBwbGVhc2UgdHJ5IGFnYWluXCIsIDIwMDApO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlTm90ZSA9IGFzeW5jIChcbiAgYXBwOiBBcHAsXG4gIGNvbnRlbnQ6IHN0cmluZyxcbiAgdHlwZTogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgcGF0aCA9IHR5cGUubWF0Y2goL1xcKChbXFxzXFxTXSo/KSw/XFxzPyhzcGxpdCk/XFwpLyk7XG4gIGlmIChwYXRoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGFwcC52YXVsdC5jcmVhdGUoYCR7cGF0aFsxXX0ubWRgLCBjb250ZW50KTtcbiAgICAgIGNvbnN0IGZpbGUgPSBhcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKGAke3BhdGhbMV19Lm1kYCkgYXMgVEZpbGU7XG4gICAgICBpZiAocGF0aFsyXSkge1xuICAgICAgICBhd2FpdCBhcHAud29ya3NwYWNlLnNwbGl0QWN0aXZlTGVhZigpLm9wZW5GaWxlKGZpbGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXBwLndvcmtzcGFjZS5hY3RpdmVMZWFmLm9wZW5GaWxlKGZpbGUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIG5ldyBOb3RpY2UoXCJUaGVyZSB3YXMgYW4gZXJyb3IhIE1heWJlIHRoZSBmaWxlIGFscmVhZHkgZXhpc3RzP1wiLCAyMDAwKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbmV3IE5vdGljZShgY291bGRuJ3QgcGFyc2UgdGhlIHBhdGghYCwgMjAwMCk7XG4gIH1cbn07XG4iLCJpbXBvcnQgeyBBcHAgfSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCB7IEFyZ3VtZW50cywgUG9zaXRpb24gfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgY3JlYXRlQ29udGVudEFycmF5IH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGNvbnN0IGdldEJ1dHRvblBvc2l0aW9uID0gKFxuICBjb250ZW50OiBzdHJpbmcsXG4gIGFyZ3M6IEFyZ3VtZW50c1xuKTogUG9zaXRpb24gPT4ge1xuICBsZXQgZmluYWxQb3NpdGlvbjogUG9zaXRpb247XG4gIGNvbnN0IHBvc3NpYmxlUG9zaXRpb25zOiBQb3NpdGlvbltdID0gW107XG4gIGxldCBwb3NzaWJsZVBvc2l0aW9uOiBQb3NpdGlvbiA9IHsgbGluZVN0YXJ0OiAwLCBsaW5lRW5kOiAwIH07XG4gIGNvbnN0IGNvbnRlbnRBcnJheSA9IGNvbnRlbnQuc3BsaXQoXCJcXG5cIik7XG4gIGxldCBvcGVuID0gZmFsc2U7XG4gIGNvbnRlbnRBcnJheS5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgIGlmIChpdGVtLmluY2x1ZGVzKFwiYGBgXCIpKSB7XG4gICAgICBpZiAob3BlbiA9PT0gZmFsc2UpIHtcbiAgICAgICAgcG9zc2libGVQb3NpdGlvbi5saW5lU3RhcnQgPSBpbmRleDtcbiAgICAgICAgb3BlbiA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwb3NzaWJsZVBvc2l0aW9uLmxpbmVFbmQgPSBpbmRleDtcbiAgICAgICAgcG9zc2libGVQb3NpdGlvbnMucHVzaChwb3NzaWJsZVBvc2l0aW9uKTtcbiAgICAgICAgcG9zc2libGVQb3NpdGlvbiA9IHsgbGluZVN0YXJ0OiAwLCBsaW5lRW5kOiAwIH07XG4gICAgICAgIG9wZW4gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICBwb3NzaWJsZVBvc2l0aW9ucy5mb3JFYWNoKChwb3NpdGlvbikgPT4ge1xuICAgIGNvbnN0IGNvZGVibG9jayA9IGNvbnRlbnRBcnJheVxuICAgICAgLnNsaWNlKHBvc2l0aW9uLmxpbmVTdGFydCwgcG9zaXRpb24ubGluZUVuZCArIDEpXG4gICAgICAuam9pbihcIlxcblwiKTtcbiAgICBpZiAoY29kZWJsb2NrLmluY2x1ZGVzKFwiYnV0dG9uXCIpICYmIGNvZGVibG9jay5pbmNsdWRlcyhhcmdzLm5hbWUpKSB7XG4gICAgICBmaW5hbFBvc2l0aW9uID0gcG9zaXRpb247XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGZpbmFsUG9zaXRpb247XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SW5saW5lQnV0dG9uUG9zaXRpb24gPSBhc3luYyAoXG4gIGFwcDogQXBwLFxuICBpZDogc3RyaW5nXG4pOiBQcm9taXNlPFBvc2l0aW9uPiA9PiB7XG4gIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBjcmVhdGVDb250ZW50QXJyYXkoYXBwKTtcbiAgY29uc3QgcG9zaXRpb24gPSB7IGxpbmVTdGFydDogMCwgbGluZUVuZDogMCB9O1xuICBjb250ZW50LmNvbnRlbnRBcnJheVxuICAgIC5tYXAoKGxpbmU6IHN0cmluZykgPT4gbGluZS5zcGxpdChcIiBcIikpXG4gICAgLmZvckVhY2goKHdvcmRzLCBpbmRleCkgPT4ge1xuICAgICAgd29yZHMuZm9yRWFjaCgod29yZCkgPT4ge1xuICAgICAgICBpZiAod29yZC5zdGFydHNXaXRoKFwiYGJ1dHRvblwiKSkge1xuICAgICAgICAgIGlmICh3b3JkID09PSBgXFxgYnV0dG9uLSR7aWR9XFxgYCkge1xuICAgICAgICAgICAgcG9zaXRpb24ubGluZVN0YXJ0ID0gaW5kZXg7XG4gICAgICAgICAgICBwb3NpdGlvbi5saW5lRW5kID0gaW5kZXg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgcmV0dXJuIHBvc2l0aW9uO1xufTtcblxuZXhwb3J0IGNvbnN0IGZpbmROdW1iZXIgPSBhc3luYyAoXG4gIGFwcDogQXBwLFxuICBsaW5lTnVtYmVyOiBudW1iZXJcbik6IFByb21pc2U8c3RyaW5nW10+ID0+IHtcbiAgY29uc3QgY29udGVudCA9IGF3YWl0IGNyZWF0ZUNvbnRlbnRBcnJheShhcHApO1xuICBjb25zdCB2YWx1ZTogc3RyaW5nW10gPSBbXTtcbiAgY29udGVudC5jb250ZW50QXJyYXkuZm9yRWFjaCgobGluZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgaWYgKGluZGV4ID09PSBsaW5lTnVtYmVyIC0gMSkge1xuICAgICAgdmFsdWUucHVzaChsaW5lKTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBjb252ZXJ0V29yZHMgPSB2YWx1ZVxuICAgIC5qb2luKFwiXCIpXG4gICAgLnJlcGxhY2UoXCJwbHVzXCIsIFwiK1wiKVxuICAgIC5yZXBsYWNlKFwibWludXNcIiwgXCItXCIpXG4gICAgLnJlcGxhY2UoXCJ0aW1lc1wiLCBcIipcIilcbiAgICAucmVwbGFjZSgvZGl2aWRlKGQpPyhcXHNieSk/L2csIFwiL1wiKTtcbiAgY29uc3QgbnVtYmVycyA9IGNvbnZlcnRXb3Jkcy5yZXBsYWNlKC9cXHMvZywgXCJcIikubWF0Y2goL1teXFx3Ol0qP1xcZCs/L2cpO1xuICByZXR1cm4gbnVtYmVycztcbn07XG4iLCJpbXBvcnQgeyBBcHAsIE1hcmtkb3duVmlldywgTm90aWNlLCBURmlsZSB9IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IG1leHAgZnJvbSBcIm1hdGgtZXhwcmVzc2lvbi1ldmFsdWF0b3JcIjtcblxuaW1wb3J0IHsgQXJndW1lbnRzLCBQb3NpdGlvbiB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQge1xuICBhcHBlbmRDb250ZW50LFxuICBjcmVhdGVOb3RlLFxuICBwcmVwZW5kQ29udGVudCxcbiAgYWRkQ29udGVudEF0TGluZSxcbiAgcmVtb3ZlQnV0dG9uLFxuICByZW1vdmVTZWN0aW9uLFxufSBmcm9tIFwiLi9oYW5kbGVyc1wiO1xuaW1wb3J0IHtcbiAgZ2V0QnV0dG9uUG9zaXRpb24sXG4gIGdldElubGluZUJ1dHRvblBvc2l0aW9uLFxuICBmaW5kTnVtYmVyLFxufSBmcm9tIFwiLi9wYXJzZXJcIjtcbmltcG9ydCB7IGhhbmRsZVZhbHVlQXJyYXksIGdldE5ld0FyZ3MgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHtcbiAgZ2V0QnV0dG9uU3dhcEJ5SWQsXG4gIHNldEJ1dHRvblN3YXBCeUlkLFxuICBnZXRCdXR0b25CeUlkLFxufSBmcm9tIFwiLi9idXR0b25TdG9yZVwiO1xuXG5leHBvcnQgY29uc3QgY2FsY3VsYXRlID0gYXN5bmMgKFxuICBhcHA6IEFwcCxcbiAgeyBhY3Rpb24gfTogQXJndW1lbnRzLFxuICBwb3NpdGlvbjogUG9zaXRpb25cbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBsZXQgZXF1YXRpb24gPSBhY3Rpb247XG4gIGNvbnN0IHZhcmlhYmxlcyA9IGFjdGlvbi5tYXRjaCgvXFwkWzAtOV0qL2cpO1xuICBpZiAodmFyaWFibGVzKSB7XG4gICAgY29uc3Qgb3V0cHV0ID0gdmFyaWFibGVzLm1hcChhc3luYyAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IGFjdGl2ZVZpZXcgPSBhcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KTtcbiAgICAgIGlmIChhY3RpdmVWaWV3KSB7XG4gICAgICAgIGNvbnN0IGxpbmVOdW1iZXIgPSBwYXJzZUludCh2YWx1ZS5zdWJzdHJpbmcoMSkpO1xuICAgICAgICBjb25zdCBudW1iZXJzID0gYXdhaXQgZmluZE51bWJlcihhcHAsIGxpbmVOdW1iZXIpO1xuICAgICAgICByZXR1cm4geyB2YXJpYWJsZTogdmFsdWUsIG51bWJlcnMgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ldyBOb3RpY2UoYGNvdWxkbid0IHJlYWQgZmlsZWAsIDIwMDApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgUHJvbWlzZS5hbGwob3V0cHV0KTtcbiAgICByZXNvbHZlZC5mb3JFYWNoKCh0ZXJtOiB7IHZhcmlhYmxlOiBzdHJpbmc7IG51bWJlcnM6IHN0cmluZ1tdIH0pID0+IHtcbiAgICAgIGlmICh0ZXJtLm51bWJlcnMpIHtcbiAgICAgICAgZXF1YXRpb24gPSBlcXVhdGlvbi5yZXBsYWNlKHRlcm0udmFyaWFibGUsIHRlcm0ubnVtYmVycy5qb2luKFwiXCIpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ldyBOb3RpY2UoXCJDaGVjayB0aGUgbGluZSBudW1iZXIgaW4geW91ciBjYWxjdWxhdGUgYnV0dG9uXCIsIDMwMDApO1xuICAgICAgICBlcXVhdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBjb25zdCBmdW4gPSBlcXVhdGlvbiAmJiBtZXhwLmV2YWwoZXF1YXRpb24pO1xuICBmdW4gJiYgYXBwZW5kQ29udGVudChhcHAsIGBSZXN1bHQ6ICR7ZnVufWAsIHBvc2l0aW9uLmxpbmVFbmQpO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlbW92ZSA9IChcbiAgYXBwOiBBcHAsXG4gIHsgcmVtb3ZlIH06IEFyZ3VtZW50cyxcbiAgeyBsaW5lU3RhcnQsIGxpbmVFbmQgfTogeyBsaW5lU3RhcnQ6IG51bWJlcjsgbGluZUVuZDogbnVtYmVyIH1cbik6IHZvaWQgPT4ge1xuICBzZXRUaW1lb3V0KCgpID0+IHJlbW92ZUJ1dHRvbihhcHAsIHJlbW92ZSwgbGluZVN0YXJ0LCBsaW5lRW5kKSwgMTAwKTtcbn07XG5cbmV4cG9ydCBjb25zdCByZXBsYWNlID0gKGFwcDogQXBwLCB7IHJlcGxhY2UgfTogQXJndW1lbnRzKTogdm9pZCA9PiB7XG4gIHJlbW92ZVNlY3Rpb24oYXBwLCByZXBsYWNlKTtcbn07XG5leHBvcnQgY29uc3QgdGV4dCA9IGFzeW5jIChcbiAgYXBwOiBBcHAsXG4gIGFyZ3M6IEFyZ3VtZW50cyxcbiAgcG9zaXRpb246IFBvc2l0aW9uXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgLy8gcHJlcGVuZCB0ZW1wbGF0ZSBhYm92ZSB0aGUgYnV0dG9uXG4gIGlmIChhcmdzLnR5cGUuaW5jbHVkZXMoXCJwcmVwZW5kXCIpKSB7XG4gICAgcHJlcGVuZENvbnRlbnQoYXBwLCBhcmdzLmFjdGlvbiwgcG9zaXRpb24ubGluZVN0YXJ0KTtcbiAgfVxuICAvLyBhcHBlbmQgdGVtcGxhdGUgYmVsb3cgdGhlIGJ1dHRvblxuICBpZiAoYXJncy50eXBlLmluY2x1ZGVzKFwiYXBwZW5kXCIpKSB7XG4gICAgYXBwZW5kQ29udGVudChhcHAsIGFyZ3MuYWN0aW9uLCBwb3NpdGlvbi5saW5lRW5kKTtcbiAgfVxuICBpZiAoYXJncy50eXBlLmluY2x1ZGVzKFwibm90ZVwiKSkge1xuICAgIGNyZWF0ZU5vdGUoYXBwLCBhcmdzLmFjdGlvbiwgYXJncy50eXBlKTtcbiAgfVxuICBpZiAoYXJncy50eXBlLmluY2x1ZGVzKFwibGluZVwiKSkge1xuICAgIGFkZENvbnRlbnRBdExpbmUoYXBwLCBhcmdzLmFjdGlvbiwgYXJncy50eXBlKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHRlbXBsYXRlID0gYXN5bmMgKFxuICBhcHA6IEFwcCxcbiAgYXJnczogQXJndW1lbnRzLFxuICBwb3NpdGlvbjogUG9zaXRpb25cbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCB0ZW1wbGF0ZXNFbmFibGVkID0gYXBwLmludGVybmFsUGx1Z2lucy5wbHVnaW5zLnRlbXBsYXRlcy5lbmFibGVkO1xuICBjb25zdCB0ZW1wbGF0ZXJQbHVnaW5FbmFibGVkID1cbiAgICBhcHAucGx1Z2lucy5wbHVnaW5zW1widGVtcGxhdGVyLW9ic2lkaWFuXCJdO1xuXG4gIC8vIG9ubHkgcnVuIGlmIHRlbXBsYXRlcyBwbHVnaW4gaXMgZW5hYmxlZFxuICBpZiAodGVtcGxhdGVzRW5hYmxlZCB8fCB0ZW1wbGF0ZXJQbHVnaW5FbmFibGVkKSB7XG4gICAgY29uc3QgZm9sZGVyczogc3RyaW5nW10gPSBbXG4gICAgICB0ZW1wbGF0ZXNFbmFibGVkICYmIGFwcC5pbnRlcm5hbFBsdWdpbnMucGx1Z2lucy50ZW1wbGF0ZXMuaW5zdGFuY2Uub3B0aW9ucy5mb2xkZXI/LnRvTG93ZXJDYXNlKCksXG4gICAgICB0ZW1wbGF0ZXJQbHVnaW5FbmFibGVkICYmIGFwcC5wbHVnaW5zPy5wbHVnaW5zW1xuICAgICAgICBcInRlbXBsYXRlci1vYnNpZGlhblwiXG4gICAgICBdPy5zZXR0aW5ncy50ZW1wbGF0ZV9mb2xkZXI/LnRvTG93ZXJDYXNlKCksXG4gICAgXS5maWx0ZXIoKGZvbGRlcikgPT4gZm9sZGVyKTtcbiAgICBjb25zdCB0ZW1wbGF0ZUZpbGUgPSBhcmdzLmFjdGlvbi50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGFsbEZpbGVzID0gYXBwLnZhdWx0LmdldEZpbGVzKCk7XG4gICAgY29uc3QgZmlsZTogVEZpbGUgPSBhbGxGaWxlcy5maWx0ZXIoKGZpbGUpID0+IHtcbiAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgICAgZm9sZGVyc1swXSAmJlxuICAgICAgICBmb2xkZXJzLmZvckVhY2goKGZvbGRlcikgPT4ge1xuICAgICAgICAgIGlmIChmaWxlLnBhdGgudG9Mb3dlckNhc2UoKSA9PT0gYCR7Zm9sZGVyfS8ke3RlbXBsYXRlRmlsZX0ubWRgKSB7XG4gICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIHJldHVybiBmb3VuZDtcbiAgICB9KVswXTtcbiAgICBpZiAoZmlsZSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGFwcC52YXVsdC5yZWFkKGZpbGUpO1xuICAgICAgLy8gcHJlcGVuZCB0ZW1wbGF0ZSBhYm92ZSB0aGUgYnV0dG9uXG4gICAgICBpZiAoYXJncy50eXBlLmluY2x1ZGVzKFwicHJlcGVuZFwiKSkge1xuICAgICAgICBwcmVwZW5kQ29udGVudChhcHAsIGNvbnRlbnQsIHBvc2l0aW9uLmxpbmVTdGFydCk7XG4gICAgICAgIHNldFRpbWVvdXQoXG4gICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgIGFwcC5jb21tYW5kcy5leGVjdXRlQ29tbWFuZEJ5SWQoXG4gICAgICAgICAgICAgIFwidGVtcGxhdGVyLW9ic2lkaWFuOnJlcGxhY2UtaW4tZmlsZS10ZW1wbGF0ZXJcIlxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAxMDBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8vIGFwcGVuZCB0ZW1wbGF0ZSBiZWxvdyB0aGUgYnV0dG9uXG4gICAgICBpZiAoYXJncy50eXBlLmluY2x1ZGVzKFwiYXBwZW5kXCIpKSB7XG4gICAgICAgIGFwcGVuZENvbnRlbnQoYXBwLCBjb250ZW50LCBwb3NpdGlvbi5saW5lRW5kKTtcbiAgICAgICAgc2V0VGltZW91dChcbiAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgYXBwLmNvbW1hbmRzLmV4ZWN1dGVDb21tYW5kQnlJZChcbiAgICAgICAgICAgICAgXCJ0ZW1wbGF0ZXItb2JzaWRpYW46cmVwbGFjZS1pbi1maWxlLXRlbXBsYXRlclwiXG4gICAgICAgICAgICApLFxuICAgICAgICAgIDEwMFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKGFyZ3MudHlwZS5pbmNsdWRlcyhcIm5vdGVcIikpIHtcbiAgICAgICAgY3JlYXRlTm90ZShhcHAsIGNvbnRlbnQsIGFyZ3MudHlwZSk7XG4gICAgICB9XG4gICAgICBpZiAoYXJncy50eXBlLmluY2x1ZGVzKFwibGluZVwiKSkge1xuICAgICAgICBhZGRDb250ZW50QXRMaW5lKGFwcCwgY29udGVudCwgYXJncy50eXBlKTtcbiAgICAgICAgc2V0VGltZW91dChcbiAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgYXBwLmNvbW1hbmRzLmV4ZWN1dGVDb21tYW5kQnlJZChcbiAgICAgICAgICAgICAgXCJ0ZW1wbGF0ZXItb2JzaWRpYW46cmVwbGFjZS1pbi1maWxlLXRlbXBsYXRlclwiXG4gICAgICAgICAgICApLFxuICAgICAgICAgIDEwMFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuZXcgTm90aWNlKFxuICAgICAgICBgQ291bGRuJ3QgZmluZCB0aGUgc3BlY2lmaWVkIHRlbXBsYXRlLCBwbGVhc2UgY2hlY2sgYW5kIHRyeSBhZ2FpbmAsXG4gICAgICAgIDIwMDBcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG5ldyBOb3RpY2UoXG4gICAgICBcIllvdSBuZWVkIHRvIGhhdmUgdGhlIFRlbXBsYXRlcyBvciBUZW1wbGF0ZXIgcGx1Z2luIGVuYWJsZWQgYW5kIFRlbXBsYXRlIGZvbGRlciBkZWZpbmVkXCIsXG4gICAgICAyMDAwXG4gICAgKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGxpbmsgPSAoeyBhY3Rpb24gfTogQXJndW1lbnRzKTogdm9pZCA9PiB7XG4gIGNvbnN0IGxpbmsgPSBhY3Rpb24udHJpbSgpO1xuICB3aW5kb3cub3BlbihsaW5rKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjb21tYW5kID0gKGFwcDogQXBwLCB7IGFjdGlvbiB9OiBBcmd1bWVudHMpOiB2b2lkID0+IHtcbiAgY29uc3QgYWxsQ29tbWFuZHMgPSBhcHAuY29tbWFuZHMubGlzdENvbW1hbmRzKCk7XG4gIGNvbnN0IGNvbW1hbmQgPSBhbGxDb21tYW5kcy5maWx0ZXIoXG4gICAgKGNvbW1hbmQpID0+IGNvbW1hbmQubmFtZS50b1VwcGVyQ2FzZSgpID09PSBhY3Rpb24udG9VcHBlckNhc2UoKS50cmltKClcbiAgKVswXTtcbiAgYXBwLmNvbW1hbmRzLmV4ZWN1dGVDb21tYW5kQnlJZChjb21tYW5kLmlkKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzd2FwID0gYXN5bmMgKFxuICBhcHA6IEFwcCxcbiAgc3dhcDogc3RyaW5nLFxuICBpZDogc3RyaW5nLFxuICBpbmxpbmU6IGJvb2xlYW4sXG4gIGZpbGU6IFRGaWxlXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgaGFuZGxlVmFsdWVBcnJheShzd2FwLCBhc3luYyAoYXJnQXJyYXkpID0+IHtcbiAgICBjb25zdCBzd2FwID0gYXdhaXQgZ2V0QnV0dG9uU3dhcEJ5SWQoYXBwLCBpZCk7XG4gICAgY29uc3QgbmV3U3dhcCA9IHN3YXAgKyAxID4gYXJnQXJyYXkubGVuZ3RoIC0gMSA/IDAgOiBzd2FwICsgMTtcbiAgICBzZXRCdXR0b25Td2FwQnlJZChhcHAsIGlkLCBuZXdTd2FwKTtcbiAgICBsZXQgYXJncyA9IGF3YWl0IGdldEJ1dHRvbkJ5SWQoYXBwLCBhcmdBcnJheVtzd2FwXSk7XG4gICAgbGV0IHBvc2l0aW9uO1xuICAgIGxldCBjb250ZW50O1xuICAgIGlmIChhcmdzKSB7XG4gICAgICBpZiAoYXJncy50ZW1wbGF0ZXIpIHtcbiAgICAgICAgYXJncyA9IGF3YWl0IHRlbXBsYXRlcihhcHAsIHBvc2l0aW9uKTtcbiAgICAgICAgaWYgKGlubGluZSkge1xuICAgICAgICAgIG5ldyBOb3RpY2UoXCJ0ZW1wbGF0ZXIgYXJncyBkb24ndCB3b3JrIHdpdGggaW5saW5lIGJ1dHRvbnMgeWV0XCIsIDIwMDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoYXJncy5yZXBsYWNlKSB7XG4gICAgICAgIHJlcGxhY2UoYXBwLCBhcmdzKTtcbiAgICAgIH1cbiAgICAgIGlmIChhcmdzLnR5cGUgPT09IFwiY29tbWFuZFwiKSB7XG4gICAgICAgIGNvbW1hbmQoYXBwLCBhcmdzKTtcbiAgICAgIH1cbiAgICAgIC8vIGhhbmRsZSBsaW5rIGJ1dHRvbnNcbiAgICAgIGlmIChhcmdzLnR5cGUgPT09IFwibGlua1wiKSB7XG4gICAgICAgIGxpbmsoYXJncyk7XG4gICAgICB9XG4gICAgICAvLyBoYW5kbGUgdGVtcGxhdGUgYnV0dG9uc1xuICAgICAgaWYgKGFyZ3MudHlwZSAmJiBhcmdzLnR5cGUuaW5jbHVkZXMoXCJ0ZW1wbGF0ZVwiKSkge1xuICAgICAgICBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb250ZW50ID0gYXdhaXQgYXBwLnZhdWx0LnJlYWQoZmlsZSk7XG4gICAgICAgICAgcG9zaXRpb24gPSBpbmxpbmVcbiAgICAgICAgICAgID8gYXdhaXQgZ2V0SW5saW5lQnV0dG9uUG9zaXRpb24oYXBwLCBpZClcbiAgICAgICAgICAgIDogZ2V0QnV0dG9uUG9zaXRpb24oY29udGVudCwgYXJncyk7XG4gICAgICAgICAgdGVtcGxhdGUoYXBwLCBhcmdzLCBwb3NpdGlvbik7XG4gICAgICAgIH0sIDUwKTtcbiAgICAgIH1cbiAgICAgIGlmIChhcmdzLnR5cGUgPT09IFwiY2FsY3VsYXRlXCIpIHtcbiAgICAgICAgY2FsY3VsYXRlKGFwcCwgYXJncywgcG9zaXRpb24pO1xuICAgICAgfVxuICAgICAgaWYgKGFyZ3MudHlwZSAmJiBhcmdzLnR5cGUuaW5jbHVkZXMoXCJ0ZXh0XCIpKSB7XG4gICAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnRlbnQgPSBhd2FpdCBhcHAudmF1bHQucmVhZChmaWxlKTtcbiAgICAgICAgICBwb3NpdGlvbiA9IGlubGluZVxuICAgICAgICAgICAgPyBhd2FpdCBnZXRJbmxpbmVCdXR0b25Qb3NpdGlvbihhcHAsIGlkKVxuICAgICAgICAgICAgOiBnZXRCdXR0b25Qb3NpdGlvbihjb250ZW50LCBhcmdzKTtcbiAgICAgICAgICB0ZXh0KGFwcCwgYXJncywgcG9zaXRpb24pO1xuICAgICAgICB9LCA1MCk7XG4gICAgICB9XG4gICAgICAvLyBoYW5kbGUgcmVtb3ZpbmcgdGhlIGJ1dHRvblxuICAgICAgaWYgKGFyZ3MucmVtb3ZlKSB7XG4gICAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnRlbnQgPSBhd2FpdCBhcHAudmF1bHQucmVhZChmaWxlKTtcbiAgICAgICAgICBwb3NpdGlvbiA9IGlubGluZVxuICAgICAgICAgICAgPyBhd2FpdCBnZXRJbmxpbmVCdXR0b25Qb3NpdGlvbihhcHAsIGlkKVxuICAgICAgICAgICAgOiBnZXRCdXR0b25Qb3NpdGlvbihjb250ZW50LCBhcmdzKTtcbiAgICAgICAgICByZW1vdmUoYXBwLCBhcmdzLCBwb3NpdGlvbik7XG4gICAgICAgIH0sIDc1KTtcbiAgICAgIH1cbiAgICAgIGlmIChhcmdzLnJlcGxhY2UpIHtcbiAgICAgICAgcmVwbGFjZShhcHAsIGFyZ3MpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgdGVtcGxhdGVyID0gYXN5bmMgKFxuICBhcHA6IEFwcCxcbiAgcG9zaXRpb246IFBvc2l0aW9uXG4pOiBQcm9taXNlPEFyZ3VtZW50cz4gPT4ge1xuICBhcHAuY29tbWFuZHMuZXhlY3V0ZUNvbW1hbmRCeUlkKFwiZWRpdG9yOnNhdmUtZmlsZVwiKTtcbiAgY29uc3QgYWN0aXZlVmlldyA9IGFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpO1xuICBpZiAoYWN0aXZlVmlldykge1xuICAgIGNvbnN0IGZpbGUgPSBhY3RpdmVWaWV3LmZpbGU7XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGFwcC52YXVsdC5jYWNoZWRSZWFkKGZpbGUpO1xuICAgIGFwcC5jb21tYW5kcy5leGVjdXRlQ29tbWFuZEJ5SWQoXG4gICAgICBcInRlbXBsYXRlci1vYnNpZGlhbjpyZXBsYWNlLWluLWZpbGUtdGVtcGxhdGVyXCJcbiAgICApO1xuICAgIGNvbnN0IHsgYXJncyB9ID0gYXdhaXQgZ2V0TmV3QXJncyhhcHAsIHBvc2l0aW9uKTtcbiAgICBjb25zdCBjYWNoZWREYXRhOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGNhY2hlQ2hhbmdlID0gYXBwLnZhdWx0Lm9uKFwibW9kaWZ5XCIsIChmaWxlKSA9PiB7XG4gICAgICBjYWNoZWREYXRhLnB1c2goZmlsZS51bnNhZmVDYWNoZWREYXRhKTtcbiAgICB9KTtcbiAgICBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1dHRvbiA9IGNvbnRlbnRcbiAgICAgICAgLnNwbGl0KFwiXFxuXCIpXG4gICAgICAgIC5zcGxpY2UocG9zaXRpb24ubGluZVN0YXJ0LCBwb3NpdGlvbi5saW5lRW5kIC0gcG9zaXRpb24ubGluZVN0YXJ0ICsgMilcbiAgICAgICAgLmpvaW4oXCJcXG5cIik7XG4gICAgICBsZXQgZmluYWxDb250ZW50O1xuICAgICAgaWYgKGNhY2hlZERhdGFbMF0pIHtcbiAgICAgICAgY29uc3QgY2FjaGVkQ29udGVudCA9IGNhY2hlZERhdGFbY2FjaGVkRGF0YS5sZW5ndGggLSAxXS5zcGxpdChcIlxcblwiKTtcbiAgICAgICAgbGV0IGFkZE9uZSA9IGZhbHNlO1xuICAgICAgICBpZiAoYXJncy50eXBlLmluY2x1ZGVzKFwicHJlcGVuZFwiKSkge1xuICAgICAgICAgIGFkZE9uZSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoYXJncy50eXBlLmluY2x1ZGVzKFwibGluZVwiKSkge1xuICAgICAgICAgIGNvbnN0IGxpbmVOdW1iZXIgPSBhcmdzLnR5cGUubWF0Y2goLyhcXGQrKS9nKTtcbiAgICAgICAgICBpZiAobGluZU51bWJlclswXSkge1xuICAgICAgICAgICAgY29uc3QgbGluZSA9IHBhcnNlSW50KGxpbmVOdW1iZXJbMF0pIC0gMTtcbiAgICAgICAgICAgIGlmIChsaW5lIDwgcG9zaXRpb24ubGluZVN0YXJ0ICYmICFhcmdzLnJlcGxhY2UpIHtcbiAgICAgICAgICAgICAgYWRkT25lID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFkZE9uZSkge1xuICAgICAgICAgIGNhY2hlZENvbnRlbnQuc3BsaWNlKFxuICAgICAgICAgICAgcG9zaXRpb24ubGluZVN0YXJ0ICsgMSxcbiAgICAgICAgICAgIHBvc2l0aW9uLmxpbmVFbmQgLSBwb3NpdGlvbi5saW5lU3RhcnQgKyAyLFxuICAgICAgICAgICAgYnV0dG9uXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYWNoZWRDb250ZW50LnNwbGljZShcbiAgICAgICAgICAgIHBvc2l0aW9uLmxpbmVTdGFydCxcbiAgICAgICAgICAgIHBvc2l0aW9uLmxpbmVFbmQgLSBwb3NpdGlvbi5saW5lU3RhcnQgKyAyLFxuICAgICAgICAgICAgYnV0dG9uXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbENvbnRlbnQgPSBjYWNoZWRDb250ZW50LmpvaW4oXCJcXG5cIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaW5hbENvbnRlbnQgPSBjb250ZW50O1xuICAgICAgfVxuICAgICAgYXdhaXQgYXBwLnZhdWx0Lm1vZGlmeShmaWxlLCBmaW5hbENvbnRlbnQpO1xuICAgICAgYXBwLm1ldGFkYXRhQ2FjaGUub2ZmcmVmKGNhY2hlQ2hhbmdlKTtcbiAgICB9LCAyMDApO1xuICAgIHJldHVybiBhcmdzO1xuICB9XG59O1xuIiwiaW1wb3J0IHsgQXBwLCBOb3RpY2UsIE1hcmtkb3duVmlldyB9IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IHsgQXJndW1lbnRzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIGNhbGN1bGF0ZSxcbiAgcmVtb3ZlLFxuICByZXBsYWNlLFxuICB0ZW1wbGF0ZSxcbiAgbGluayxcbiAgY29tbWFuZCxcbiAgc3dhcCxcbiAgdGVtcGxhdGVyLFxuICB0ZXh0LFxufSBmcm9tIFwiLi9idXR0b25UeXBlc1wiO1xuaW1wb3J0IHsgZ2V0QnV0dG9uUG9zaXRpb24sIGdldElubGluZUJ1dHRvblBvc2l0aW9uIH0gZnJvbSBcIi4vcGFyc2VyXCI7XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVCdXR0b24gPSAoe1xuICBhcHAsXG4gIGVsLFxuICBhcmdzLFxuICBpbmxpbmUsXG4gIGlkLFxuICBjbGlja092ZXJyaWRlLFxufToge1xuICBhcHA/OiBBcHA7XG4gIGVsOiBIVE1MRWxlbWVudDtcbiAgYXJncz86IEFyZ3VtZW50cztcbiAgaW5saW5lPzogYm9vbGVhbjtcbiAgaWQ/OiBzdHJpbmc7XG4gIGNsaWNrT3ZlcnJpZGU/OiB7XG4gICAgcGFyYW1zOiBhbnlbXTtcbiAgICBjbGljazogKC4uLnBhcmFtczogYW55W10pID0+IHZvaWQ7XG4gIH07XG59KTogSFRNTEVsZW1lbnQgPT4ge1xuICAvL2NyZWF0ZSB0aGUgYnV0dG9uIGVsZW1lbnRcbiAgY29uc3QgYnV0dG9uID0gZWwuY3JlYXRlRWwoXCJidXR0b25cIiwge1xuICAgIHRleHQ6IGFyZ3MubmFtZSxcbiAgICBjbHM6IGFyZ3MuY2xhc3NcbiAgICAgID8gYCR7YXJncy5jbGFzc30gJHthcmdzLmNvbG9yfWBcbiAgICAgIDogYGJ1dHRvbi1kZWZhdWx0ICR7YXJncy5jb2xvciA/IGFyZ3MuY29sb3IgOiBcIlwifWAsXG4gIH0pO1xuICBhcmdzLmlkID8gYnV0dG9uLnNldEF0dHJpYnV0ZShcImlkXCIsIGFyZ3MuaWQpIDogXCJcIjtcbiAgYnV0dG9uLm9uKFwiY2xpY2tcIiwgXCJidXR0b25cIiwgKCkgPT4ge1xuICAgIGNsaWNrT3ZlcnJpZGVcbiAgICAgID8gY2xpY2tPdmVycmlkZS5jbGljayguLi5jbGlja092ZXJyaWRlLnBhcmFtcylcbiAgICAgIDogY2xpY2tIYW5kbGVyKGFwcCwgYXJncywgaW5saW5lLCBpZCk7XG4gIH0pO1xuICByZXR1cm4gYnV0dG9uO1xufTtcblxuY29uc3QgY2xpY2tIYW5kbGVyID0gYXN5bmMgKFxuICBhcHA6IEFwcCxcbiAgYXJnczogQXJndW1lbnRzLFxuICBpbmxpbmU6IGJvb2xlYW4sXG4gIGlkOiBzdHJpbmdcbikgPT4ge1xuICBjb25zdCBhY3RpdmVWaWV3ID0gYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldyk7XG4gIGxldCBjb250ZW50ID0gYXdhaXQgYXBwLnZhdWx0LnJlYWQoYWN0aXZlVmlldy5maWxlKTtcbiAgbGV0IHBvc2l0aW9uID0gaW5saW5lXG4gICAgPyBhd2FpdCBnZXRJbmxpbmVCdXR0b25Qb3NpdGlvbihhcHAsIGlkKVxuICAgIDogZ2V0QnV0dG9uUG9zaXRpb24oY29udGVudCwgYXJncyk7XG4gIC8vIGhhbmRsZSBjb21tYW5kIGJ1dHRvbnNcbiAgaWYgKGFyZ3MudGVtcGxhdGVyKSB7XG4gICAgYXJncyA9IGF3YWl0IHRlbXBsYXRlcihhcHAsIHBvc2l0aW9uKTtcbiAgICBpZiAoaW5saW5lKSB7XG4gICAgICBuZXcgTm90aWNlKFwidGVtcGxhdGVyIGFyZ3MgZG9uJ3Qgd29yayB3aXRoIGlubGluZSBidXR0b25zIHlldFwiLCAyMDAwKTtcbiAgICB9XG4gIH1cbiAgaWYgKGFyZ3MucmVwbGFjZSkge1xuICAgIHJlcGxhY2UoYXBwLCBhcmdzKTtcbiAgfVxuICBpZiAoYXJncy50eXBlID09PSBcImNvbW1hbmRcIikge1xuICAgIGNvbW1hbmQoYXBwLCBhcmdzKTtcbiAgfVxuICAvLyBoYW5kbGUgbGluayBidXR0b25zXG4gIGlmIChhcmdzLnR5cGUgPT09IFwibGlua1wiKSB7XG4gICAgbGluayhhcmdzKTtcbiAgfVxuICAvLyBoYW5kbGUgdGVtcGxhdGUgYnV0dG9uc1xuICBpZiAoYXJncy50eXBlICYmIGFyZ3MudHlwZS5pbmNsdWRlcyhcInRlbXBsYXRlXCIpKSB7XG4gICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICBjb250ZW50ID0gYXdhaXQgYXBwLnZhdWx0LnJlYWQoYWN0aXZlVmlldy5maWxlKTtcbiAgICAgIHBvc2l0aW9uID0gaW5saW5lXG4gICAgICAgID8gYXdhaXQgZ2V0SW5saW5lQnV0dG9uUG9zaXRpb24oYXBwLCBpZClcbiAgICAgICAgOiBnZXRCdXR0b25Qb3NpdGlvbihjb250ZW50LCBhcmdzKTtcbiAgICAgIHRlbXBsYXRlKGFwcCwgYXJncywgcG9zaXRpb24pO1xuICAgIH0sIDUwKTtcbiAgfVxuICBpZiAoYXJncy50eXBlID09PSBcImNhbGN1bGF0ZVwiKSB7XG4gICAgY2FsY3VsYXRlKGFwcCwgYXJncywgcG9zaXRpb24pO1xuICB9XG4gIGlmIChhcmdzLnR5cGUgJiYgYXJncy50eXBlLmluY2x1ZGVzKFwidGV4dFwiKSkge1xuICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgY29udGVudCA9IGF3YWl0IGFwcC52YXVsdC5yZWFkKGFjdGl2ZVZpZXcuZmlsZSk7XG4gICAgICBwb3NpdGlvbiA9IGlubGluZVxuICAgICAgICA/IGF3YWl0IGdldElubGluZUJ1dHRvblBvc2l0aW9uKGFwcCwgaWQpXG4gICAgICAgIDogZ2V0QnV0dG9uUG9zaXRpb24oY29udGVudCwgYXJncyk7XG4gICAgICB0ZXh0KGFwcCwgYXJncywgcG9zaXRpb24pO1xuICAgIH0sIDUwKTtcbiAgfVxuICAvLyBoYW5kbGUgcmVtb3ZpbmcgdGhlIGJ1dHRvblxuICBpZiAoYXJncy5yZW1vdmUpIHtcbiAgICBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnRlbnQgPSBhd2FpdCBhcHAudmF1bHQucmVhZChhY3RpdmVWaWV3LmZpbGUpO1xuICAgICAgcG9zaXRpb24gPSBpbmxpbmVcbiAgICAgICAgPyBhd2FpdCBnZXRJbmxpbmVCdXR0b25Qb3NpdGlvbihhcHAsIGlkKVxuICAgICAgICA6IGdldEJ1dHRvblBvc2l0aW9uKGNvbnRlbnQsIGFyZ3MpO1xuICAgICAgcmVtb3ZlKGFwcCwgYXJncywgcG9zaXRpb24pO1xuICAgIH0sIDc1KTtcbiAgfVxuICBpZiAoYXJncy5zd2FwKSB7XG4gICAgaWYgKCFpbmxpbmUpIHtcbiAgICAgIG5ldyBOb3RpY2UoXCJzd2FwIGFyZ3Mgb25seSB3b3JrIGluIGlubGluZSBidXR0b25zIGZvciBub3dcIiwgMjAwMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN3YXAoYXBwLCBhcmdzLnN3YXAsIGlkLCBpbmxpbmUsIGFjdGl2ZVZpZXcuZmlsZSk7XG4gICAgfVxuICB9XG59O1xuIiwiZXhwb3J0IHZhciB0b3AgPSAndG9wJztcbmV4cG9ydCB2YXIgYm90dG9tID0gJ2JvdHRvbSc7XG5leHBvcnQgdmFyIHJpZ2h0ID0gJ3JpZ2h0JztcbmV4cG9ydCB2YXIgbGVmdCA9ICdsZWZ0JztcbmV4cG9ydCB2YXIgYXV0byA9ICdhdXRvJztcbmV4cG9ydCB2YXIgYmFzZVBsYWNlbWVudHMgPSBbdG9wLCBib3R0b20sIHJpZ2h0LCBsZWZ0XTtcbmV4cG9ydCB2YXIgc3RhcnQgPSAnc3RhcnQnO1xuZXhwb3J0IHZhciBlbmQgPSAnZW5kJztcbmV4cG9ydCB2YXIgY2xpcHBpbmdQYXJlbnRzID0gJ2NsaXBwaW5nUGFyZW50cyc7XG5leHBvcnQgdmFyIHZpZXdwb3J0ID0gJ3ZpZXdwb3J0JztcbmV4cG9ydCB2YXIgcG9wcGVyID0gJ3BvcHBlcic7XG5leHBvcnQgdmFyIHJlZmVyZW5jZSA9ICdyZWZlcmVuY2UnO1xuZXhwb3J0IHZhciB2YXJpYXRpb25QbGFjZW1lbnRzID0gLyojX19QVVJFX18qL2Jhc2VQbGFjZW1lbnRzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIGFjYy5jb25jYXQoW3BsYWNlbWVudCArIFwiLVwiICsgc3RhcnQsIHBsYWNlbWVudCArIFwiLVwiICsgZW5kXSk7XG59LCBbXSk7XG5leHBvcnQgdmFyIHBsYWNlbWVudHMgPSAvKiNfX1BVUkVfXyovW10uY29uY2F0KGJhc2VQbGFjZW1lbnRzLCBbYXV0b10pLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIGFjYy5jb25jYXQoW3BsYWNlbWVudCwgcGxhY2VtZW50ICsgXCItXCIgKyBzdGFydCwgcGxhY2VtZW50ICsgXCItXCIgKyBlbmRdKTtcbn0sIFtdKTsgLy8gbW9kaWZpZXJzIHRoYXQgbmVlZCB0byByZWFkIHRoZSBET01cblxuZXhwb3J0IHZhciBiZWZvcmVSZWFkID0gJ2JlZm9yZVJlYWQnO1xuZXhwb3J0IHZhciByZWFkID0gJ3JlYWQnO1xuZXhwb3J0IHZhciBhZnRlclJlYWQgPSAnYWZ0ZXJSZWFkJzsgLy8gcHVyZS1sb2dpYyBtb2RpZmllcnNcblxuZXhwb3J0IHZhciBiZWZvcmVNYWluID0gJ2JlZm9yZU1haW4nO1xuZXhwb3J0IHZhciBtYWluID0gJ21haW4nO1xuZXhwb3J0IHZhciBhZnRlck1haW4gPSAnYWZ0ZXJNYWluJzsgLy8gbW9kaWZpZXIgd2l0aCB0aGUgcHVycG9zZSB0byB3cml0ZSB0byB0aGUgRE9NIChvciB3cml0ZSBpbnRvIGEgZnJhbWV3b3JrIHN0YXRlKVxuXG5leHBvcnQgdmFyIGJlZm9yZVdyaXRlID0gJ2JlZm9yZVdyaXRlJztcbmV4cG9ydCB2YXIgd3JpdGUgPSAnd3JpdGUnO1xuZXhwb3J0IHZhciBhZnRlcldyaXRlID0gJ2FmdGVyV3JpdGUnO1xuZXhwb3J0IHZhciBtb2RpZmllclBoYXNlcyA9IFtiZWZvcmVSZWFkLCByZWFkLCBhZnRlclJlYWQsIGJlZm9yZU1haW4sIG1haW4sIGFmdGVyTWFpbiwgYmVmb3JlV3JpdGUsIHdyaXRlLCBhZnRlcldyaXRlXTsiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXROb2RlTmFtZShlbGVtZW50KSB7XG4gIHJldHVybiBlbGVtZW50ID8gKGVsZW1lbnQubm9kZU5hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkgOiBudWxsO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFdpbmRvdyhub2RlKSB7XG4gIGlmIChub2RlID09IG51bGwpIHtcbiAgICByZXR1cm4gd2luZG93O1xuICB9XG5cbiAgaWYgKG5vZGUudG9TdHJpbmcoKSAhPT0gJ1tvYmplY3QgV2luZG93XScpIHtcbiAgICB2YXIgb3duZXJEb2N1bWVudCA9IG5vZGUub3duZXJEb2N1bWVudDtcbiAgICByZXR1cm4gb3duZXJEb2N1bWVudCA/IG93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgd2luZG93IDogd2luZG93O1xuICB9XG5cbiAgcmV0dXJuIG5vZGU7XG59IiwiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcblxuZnVuY3Rpb24gaXNFbGVtZW50KG5vZGUpIHtcbiAgdmFyIE93bkVsZW1lbnQgPSBnZXRXaW5kb3cobm9kZSkuRWxlbWVudDtcbiAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBPd25FbGVtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50O1xufVxuXG5mdW5jdGlvbiBpc0hUTUxFbGVtZW50KG5vZGUpIHtcbiAgdmFyIE93bkVsZW1lbnQgPSBnZXRXaW5kb3cobm9kZSkuSFRNTEVsZW1lbnQ7XG4gIHJldHVybiBub2RlIGluc3RhbmNlb2YgT3duRWxlbWVudCB8fCBub2RlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIGlzU2hhZG93Um9vdChub2RlKSB7XG4gIC8vIElFIDExIGhhcyBubyBTaGFkb3dSb290XG4gIGlmICh0eXBlb2YgU2hhZG93Um9vdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgT3duRWxlbWVudCA9IGdldFdpbmRvdyhub2RlKS5TaGFkb3dSb290O1xuICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIE93bkVsZW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3Q7XG59XG5cbmV4cG9ydCB7IGlzRWxlbWVudCwgaXNIVE1MRWxlbWVudCwgaXNTaGFkb3dSb290IH07IiwiaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi4vZG9tLXV0aWxzL2luc3RhbmNlT2YuanNcIjsgLy8gVGhpcyBtb2RpZmllciB0YWtlcyB0aGUgc3R5bGVzIHByZXBhcmVkIGJ5IHRoZSBgY29tcHV0ZVN0eWxlc2AgbW9kaWZpZXJcbi8vIGFuZCBhcHBsaWVzIHRoZW0gdG8gdGhlIEhUTUxFbGVtZW50cyBzdWNoIGFzIHBvcHBlciBhbmQgYXJyb3dcblxuZnVuY3Rpb24gYXBwbHlTdHlsZXMoX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlO1xuICBPYmplY3Qua2V5cyhzdGF0ZS5lbGVtZW50cykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgIHZhciBzdHlsZSA9IHN0YXRlLnN0eWxlc1tuYW1lXSB8fCB7fTtcbiAgICB2YXIgYXR0cmlidXRlcyA9IHN0YXRlLmF0dHJpYnV0ZXNbbmFtZV0gfHwge307XG4gICAgdmFyIGVsZW1lbnQgPSBzdGF0ZS5lbGVtZW50c1tuYW1lXTsgLy8gYXJyb3cgaXMgb3B0aW9uYWwgKyB2aXJ0dWFsIGVsZW1lbnRzXG5cbiAgICBpZiAoIWlzSFRNTEVsZW1lbnQoZWxlbWVudCkgfHwgIWdldE5vZGVOYW1lKGVsZW1lbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBGbG93IGRvZXNuJ3Qgc3VwcG9ydCB0byBleHRlbmQgdGhpcyBwcm9wZXJ0eSwgYnV0IGl0J3MgdGhlIG1vc3RcbiAgICAvLyBlZmZlY3RpdmUgd2F5IHRvIGFwcGx5IHN0eWxlcyB0byBhbiBIVE1MRWxlbWVudFxuICAgIC8vICRGbG93Rml4TWVbY2Fubm90LXdyaXRlXVxuXG5cbiAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHN0eWxlKTtcbiAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhdHRyaWJ1dGVzW25hbWVdO1xuXG4gICAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUgPT09IHRydWUgPyAnJyA6IHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVmZmVjdChfcmVmMikge1xuICB2YXIgc3RhdGUgPSBfcmVmMi5zdGF0ZTtcbiAgdmFyIGluaXRpYWxTdHlsZXMgPSB7XG4gICAgcG9wcGVyOiB7XG4gICAgICBwb3NpdGlvbjogc3RhdGUub3B0aW9ucy5zdHJhdGVneSxcbiAgICAgIGxlZnQ6ICcwJyxcbiAgICAgIHRvcDogJzAnLFxuICAgICAgbWFyZ2luOiAnMCdcbiAgICB9LFxuICAgIGFycm93OiB7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJ1xuICAgIH0sXG4gICAgcmVmZXJlbmNlOiB7fVxuICB9O1xuICBPYmplY3QuYXNzaWduKHN0YXRlLmVsZW1lbnRzLnBvcHBlci5zdHlsZSwgaW5pdGlhbFN0eWxlcy5wb3BwZXIpO1xuICBzdGF0ZS5zdHlsZXMgPSBpbml0aWFsU3R5bGVzO1xuXG4gIGlmIChzdGF0ZS5lbGVtZW50cy5hcnJvdykge1xuICAgIE9iamVjdC5hc3NpZ24oc3RhdGUuZWxlbWVudHMuYXJyb3cuc3R5bGUsIGluaXRpYWxTdHlsZXMuYXJyb3cpO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBPYmplY3Qua2V5cyhzdGF0ZS5lbGVtZW50cykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgdmFyIGVsZW1lbnQgPSBzdGF0ZS5lbGVtZW50c1tuYW1lXTtcbiAgICAgIHZhciBhdHRyaWJ1dGVzID0gc3RhdGUuYXR0cmlidXRlc1tuYW1lXSB8fCB7fTtcbiAgICAgIHZhciBzdHlsZVByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhzdGF0ZS5zdHlsZXMuaGFzT3duUHJvcGVydHkobmFtZSkgPyBzdGF0ZS5zdHlsZXNbbmFtZV0gOiBpbml0aWFsU3R5bGVzW25hbWVdKTsgLy8gU2V0IGFsbCB2YWx1ZXMgdG8gYW4gZW1wdHkgc3RyaW5nIHRvIHVuc2V0IHRoZW1cblxuICAgICAgdmFyIHN0eWxlID0gc3R5bGVQcm9wZXJ0aWVzLnJlZHVjZShmdW5jdGlvbiAoc3R5bGUsIHByb3BlcnR5KSB7XG4gICAgICAgIHN0eWxlW3Byb3BlcnR5XSA9ICcnO1xuICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgICB9LCB7fSk7IC8vIGFycm93IGlzIG9wdGlvbmFsICsgdmlydHVhbCBlbGVtZW50c1xuXG4gICAgICBpZiAoIWlzSFRNTEVsZW1lbnQoZWxlbWVudCkgfHwgIWdldE5vZGVOYW1lKGVsZW1lbnQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgT2JqZWN0LmFzc2lnbihlbGVtZW50LnN0eWxlLCBzdHlsZSk7XG4gICAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGUpIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnYXBwbHlTdHlsZXMnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ3dyaXRlJyxcbiAgZm46IGFwcGx5U3R5bGVzLFxuICBlZmZlY3Q6IGVmZmVjdCxcbiAgcmVxdWlyZXM6IFsnY29tcHV0ZVN0eWxlcyddXG59OyIsImltcG9ydCB7IGF1dG8gfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQuc3BsaXQoJy0nKVswXTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCkge1xuICB2YXIgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHJldHVybiB7XG4gICAgd2lkdGg6IHJlY3Qud2lkdGgsXG4gICAgaGVpZ2h0OiByZWN0LmhlaWdodCxcbiAgICB0b3A6IHJlY3QudG9wLFxuICAgIHJpZ2h0OiByZWN0LnJpZ2h0LFxuICAgIGJvdHRvbTogcmVjdC5ib3R0b20sXG4gICAgbGVmdDogcmVjdC5sZWZ0LFxuICAgIHg6IHJlY3QubGVmdCxcbiAgICB5OiByZWN0LnRvcFxuICB9O1xufSIsImltcG9ydCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZnJvbSBcIi4vZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzXCI7IC8vIFJldHVybnMgdGhlIGxheW91dCByZWN0IG9mIGFuIGVsZW1lbnQgcmVsYXRpdmUgdG8gaXRzIG9mZnNldFBhcmVudC4gTGF5b3V0XG4vLyBtZWFucyBpdCBkb2Vzbid0IHRha2UgaW50byBhY2NvdW50IHRyYW5zZm9ybXMuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldExheW91dFJlY3QoZWxlbWVudCkge1xuICB2YXIgY2xpZW50UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50KTsgLy8gVXNlIHRoZSBjbGllbnRSZWN0IHNpemVzIGlmIGl0J3Mgbm90IGJlZW4gdHJhbnNmb3JtZWQuXG4gIC8vIEZpeGVzIGh0dHBzOi8vZ2l0aHViLmNvbS9wb3BwZXJqcy9wb3BwZXItY29yZS9pc3N1ZXMvMTIyM1xuXG4gIHZhciB3aWR0aCA9IGVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gIHZhciBoZWlnaHQgPSBlbGVtZW50Lm9mZnNldEhlaWdodDtcblxuICBpZiAoTWF0aC5hYnMoY2xpZW50UmVjdC53aWR0aCAtIHdpZHRoKSA8PSAxKSB7XG4gICAgd2lkdGggPSBjbGllbnRSZWN0LndpZHRoO1xuICB9XG5cbiAgaWYgKE1hdGguYWJzKGNsaWVudFJlY3QuaGVpZ2h0IC0gaGVpZ2h0KSA8PSAxKSB7XG4gICAgaGVpZ2h0ID0gY2xpZW50UmVjdC5oZWlnaHQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHg6IGVsZW1lbnQub2Zmc2V0TGVmdCxcbiAgICB5OiBlbGVtZW50Lm9mZnNldFRvcCxcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHRcbiAgfTtcbn0iLCJpbXBvcnQgeyBpc1NoYWRvd1Jvb3QgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb250YWlucyhwYXJlbnQsIGNoaWxkKSB7XG4gIHZhciByb290Tm9kZSA9IGNoaWxkLmdldFJvb3ROb2RlICYmIGNoaWxkLmdldFJvb3ROb2RlKCk7IC8vIEZpcnN0LCBhdHRlbXB0IHdpdGggZmFzdGVyIG5hdGl2ZSBtZXRob2RcblxuICBpZiAocGFyZW50LmNvbnRhaW5zKGNoaWxkKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIHRoZW4gZmFsbGJhY2sgdG8gY3VzdG9tIGltcGxlbWVudGF0aW9uIHdpdGggU2hhZG93IERPTSBzdXBwb3J0XG4gIGVsc2UgaWYgKHJvb3ROb2RlICYmIGlzU2hhZG93Um9vdChyb290Tm9kZSkpIHtcbiAgICAgIHZhciBuZXh0ID0gY2hpbGQ7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKG5leHQgJiYgcGFyZW50LmlzU2FtZU5vZGUobmV4dCkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ106IG5lZWQgYSBiZXR0ZXIgd2F5IHRvIGhhbmRsZSB0aGlzLi4uXG5cblxuICAgICAgICBuZXh0ID0gbmV4dC5wYXJlbnROb2RlIHx8IG5leHQuaG9zdDtcbiAgICAgIH0gd2hpbGUgKG5leHQpO1xuICAgIH0gLy8gR2l2ZSB1cCwgdGhlIHJlc3VsdCBpcyBmYWxzZVxuXG5cbiAgcmV0dXJuIGZhbHNlO1xufSIsImltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpIHtcbiAgcmV0dXJuIGdldFdpbmRvdyhlbGVtZW50KS5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xufSIsImltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNUYWJsZUVsZW1lbnQoZWxlbWVudCkge1xuICByZXR1cm4gWyd0YWJsZScsICd0ZCcsICd0aCddLmluZGV4T2YoZ2V0Tm9kZU5hbWUoZWxlbWVudCkpID49IDA7XG59IiwiaW1wb3J0IHsgaXNFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpIHtcbiAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtcmV0dXJuXTogYXNzdW1lIGJvZHkgaXMgYWx3YXlzIGF2YWlsYWJsZVxuICByZXR1cm4gKChpc0VsZW1lbnQoZWxlbWVudCkgPyBlbGVtZW50Lm93bmVyRG9jdW1lbnQgOiAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ11cbiAgZWxlbWVudC5kb2N1bWVudCkgfHwgd2luZG93LmRvY3VtZW50KS5kb2N1bWVudEVsZW1lbnQ7XG59IiwiaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IHsgaXNTaGFkb3dSb290IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0UGFyZW50Tm9kZShlbGVtZW50KSB7XG4gIGlmIChnZXROb2RlTmFtZShlbGVtZW50KSA9PT0gJ2h0bWwnKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cblxuICByZXR1cm4gKC8vIHRoaXMgaXMgYSBxdWlja2VyIChidXQgbGVzcyB0eXBlIHNhZmUpIHdheSB0byBzYXZlIHF1aXRlIHNvbWUgYnl0ZXMgZnJvbSB0aGUgYnVuZGxlXG4gICAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtcmV0dXJuXVxuICAgIC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICAgIGVsZW1lbnQuYXNzaWduZWRTbG90IHx8IC8vIHN0ZXAgaW50byB0aGUgc2hhZG93IERPTSBvZiB0aGUgcGFyZW50IG9mIGEgc2xvdHRlZCBub2RlXG4gICAgZWxlbWVudC5wYXJlbnROb2RlIHx8ICggLy8gRE9NIEVsZW1lbnQgZGV0ZWN0ZWRcbiAgICBpc1NoYWRvd1Jvb3QoZWxlbWVudCkgPyBlbGVtZW50Lmhvc3QgOiBudWxsKSB8fCAvLyBTaGFkb3dSb290IGRldGVjdGVkXG4gICAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtY2FsbF06IEhUTUxFbGVtZW50IGlzIGEgTm9kZVxuICAgIGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSAvLyBmYWxsYmFja1xuXG4gICk7XG59IiwiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuaW1wb3J0IGdldENvbXB1dGVkU3R5bGUgZnJvbSBcIi4vZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCBpc1RhYmxlRWxlbWVudCBmcm9tIFwiLi9pc1RhYmxlRWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldFBhcmVudE5vZGUgZnJvbSBcIi4vZ2V0UGFyZW50Tm9kZS5qc1wiO1xuXG5mdW5jdGlvbiBnZXRUcnVlT2Zmc2V0UGFyZW50KGVsZW1lbnQpIHtcbiAgaWYgKCFpc0hUTUxFbGVtZW50KGVsZW1lbnQpIHx8IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wb3BwZXJqcy9wb3BwZXItY29yZS9pc3N1ZXMvODM3XG4gIGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkucG9zaXRpb24gPT09ICdmaXhlZCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50Lm9mZnNldFBhcmVudDtcbn0gLy8gYC5vZmZzZXRQYXJlbnRgIHJlcG9ydHMgYG51bGxgIGZvciBmaXhlZCBlbGVtZW50cywgd2hpbGUgYWJzb2x1dGUgZWxlbWVudHNcbi8vIHJldHVybiB0aGUgY29udGFpbmluZyBibG9ja1xuXG5cbmZ1bmN0aW9uIGdldENvbnRhaW5pbmdCbG9jayhlbGVtZW50KSB7XG4gIHZhciBpc0ZpcmVmb3ggPSBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZignZmlyZWZveCcpICE9PSAtMTtcbiAgdmFyIGlzSUUgPSBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ1RyaWRlbnQnKSAhPT0gLTE7XG5cbiAgaWYgKGlzSUUgJiYgaXNIVE1MRWxlbWVudChlbGVtZW50KSkge1xuICAgIC8vIEluIElFIDksIDEwIGFuZCAxMSBmaXhlZCBlbGVtZW50cyBjb250YWluaW5nIGJsb2NrIGlzIGFsd2F5cyBlc3RhYmxpc2hlZCBieSB0aGUgdmlld3BvcnRcbiAgICB2YXIgZWxlbWVudENzcyA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG5cbiAgICBpZiAoZWxlbWVudENzcy5wb3NpdGlvbiA9PT0gJ2ZpeGVkJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgdmFyIGN1cnJlbnROb2RlID0gZ2V0UGFyZW50Tm9kZShlbGVtZW50KTtcblxuICB3aGlsZSAoaXNIVE1MRWxlbWVudChjdXJyZW50Tm9kZSkgJiYgWydodG1sJywgJ2JvZHknXS5pbmRleE9mKGdldE5vZGVOYW1lKGN1cnJlbnROb2RlKSkgPCAwKSB7XG4gICAgdmFyIGNzcyA9IGdldENvbXB1dGVkU3R5bGUoY3VycmVudE5vZGUpOyAvLyBUaGlzIGlzIG5vbi1leGhhdXN0aXZlIGJ1dCBjb3ZlcnMgdGhlIG1vc3QgY29tbW9uIENTUyBwcm9wZXJ0aWVzIHRoYXRcbiAgICAvLyBjcmVhdGUgYSBjb250YWluaW5nIGJsb2NrLlxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9Db250YWluaW5nX2Jsb2NrI2lkZW50aWZ5aW5nX3RoZV9jb250YWluaW5nX2Jsb2NrXG5cbiAgICBpZiAoY3NzLnRyYW5zZm9ybSAhPT0gJ25vbmUnIHx8IGNzcy5wZXJzcGVjdGl2ZSAhPT0gJ25vbmUnIHx8IGNzcy5jb250YWluID09PSAncGFpbnQnIHx8IFsndHJhbnNmb3JtJywgJ3BlcnNwZWN0aXZlJ10uaW5kZXhPZihjc3Mud2lsbENoYW5nZSkgIT09IC0xIHx8IGlzRmlyZWZveCAmJiBjc3Mud2lsbENoYW5nZSA9PT0gJ2ZpbHRlcicgfHwgaXNGaXJlZm94ICYmIGNzcy5maWx0ZXIgJiYgY3NzLmZpbHRlciAhPT0gJ25vbmUnKSB7XG4gICAgICByZXR1cm4gY3VycmVudE5vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUucGFyZW50Tm9kZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn0gLy8gR2V0cyB0aGUgY2xvc2VzdCBhbmNlc3RvciBwb3NpdGlvbmVkIGVsZW1lbnQuIEhhbmRsZXMgc29tZSBlZGdlIGNhc2VzLFxuLy8gc3VjaCBhcyB0YWJsZSBhbmNlc3RvcnMgYW5kIGNyb3NzIGJyb3dzZXIgYnVncy5cblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRPZmZzZXRQYXJlbnQoZWxlbWVudCkge1xuICB2YXIgd2luZG93ID0gZ2V0V2luZG93KGVsZW1lbnQpO1xuICB2YXIgb2Zmc2V0UGFyZW50ID0gZ2V0VHJ1ZU9mZnNldFBhcmVudChlbGVtZW50KTtcblxuICB3aGlsZSAob2Zmc2V0UGFyZW50ICYmIGlzVGFibGVFbGVtZW50KG9mZnNldFBhcmVudCkgJiYgZ2V0Q29tcHV0ZWRTdHlsZShvZmZzZXRQYXJlbnQpLnBvc2l0aW9uID09PSAnc3RhdGljJykge1xuICAgIG9mZnNldFBhcmVudCA9IGdldFRydWVPZmZzZXRQYXJlbnQob2Zmc2V0UGFyZW50KTtcbiAgfVxuXG4gIGlmIChvZmZzZXRQYXJlbnQgJiYgKGdldE5vZGVOYW1lKG9mZnNldFBhcmVudCkgPT09ICdodG1sJyB8fCBnZXROb2RlTmFtZShvZmZzZXRQYXJlbnQpID09PSAnYm9keScgJiYgZ2V0Q29tcHV0ZWRTdHlsZShvZmZzZXRQYXJlbnQpLnBvc2l0aW9uID09PSAnc3RhdGljJykpIHtcbiAgICByZXR1cm4gd2luZG93O1xuICB9XG5cbiAgcmV0dXJuIG9mZnNldFBhcmVudCB8fCBnZXRDb250YWluaW5nQmxvY2soZWxlbWVudCkgfHwgd2luZG93O1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIFsndG9wJywgJ2JvdHRvbSddLmluZGV4T2YocGxhY2VtZW50KSA+PSAwID8gJ3gnIDogJ3knO1xufSIsImV4cG9ydCB2YXIgbWF4ID0gTWF0aC5tYXg7XG5leHBvcnQgdmFyIG1pbiA9IE1hdGgubWluO1xuZXhwb3J0IHZhciByb3VuZCA9IE1hdGgucm91bmQ7IiwiaW1wb3J0IHsgbWF4IGFzIG1hdGhNYXgsIG1pbiBhcyBtYXRoTWluIH0gZnJvbSBcIi4vbWF0aC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gd2l0aGluKG1pbiwgdmFsdWUsIG1heCkge1xuICByZXR1cm4gbWF0aE1heChtaW4sIG1hdGhNaW4odmFsdWUsIG1heCkpO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEZyZXNoU2lkZU9iamVjdCgpIHtcbiAgcmV0dXJuIHtcbiAgICB0b3A6IDAsXG4gICAgcmlnaHQ6IDAsXG4gICAgYm90dG9tOiAwLFxuICAgIGxlZnQ6IDBcbiAgfTtcbn0iLCJpbXBvcnQgZ2V0RnJlc2hTaWRlT2JqZWN0IGZyb20gXCIuL2dldEZyZXNoU2lkZU9iamVjdC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWVyZ2VQYWRkaW5nT2JqZWN0KHBhZGRpbmdPYmplY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGdldEZyZXNoU2lkZU9iamVjdCgpLCBwYWRkaW5nT2JqZWN0KTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBleHBhbmRUb0hhc2hNYXAodmFsdWUsIGtleXMpIHtcbiAgcmV0dXJuIGtleXMucmVkdWNlKGZ1bmN0aW9uIChoYXNoTWFwLCBrZXkpIHtcbiAgICBoYXNoTWFwW2tleV0gPSB2YWx1ZTtcbiAgICByZXR1cm4gaGFzaE1hcDtcbiAgfSwge30pO1xufSIsImltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0TGF5b3V0UmVjdCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldExheW91dFJlY3QuanNcIjtcbmltcG9ydCBjb250YWlucyBmcm9tIFwiLi4vZG9tLXV0aWxzL2NvbnRhaW5zLmpzXCI7XG5pbXBvcnQgZ2V0T2Zmc2V0UGFyZW50IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQuanNcIjtcbmltcG9ydCB3aXRoaW4gZnJvbSBcIi4uL3V0aWxzL3dpdGhpbi5qc1wiO1xuaW1wb3J0IG1lcmdlUGFkZGluZ09iamVjdCBmcm9tIFwiLi4vdXRpbHMvbWVyZ2VQYWRkaW5nT2JqZWN0LmpzXCI7XG5pbXBvcnQgZXhwYW5kVG9IYXNoTWFwIGZyb20gXCIuLi91dGlscy9leHBhbmRUb0hhc2hNYXAuanNcIjtcbmltcG9ydCB7IGxlZnQsIHJpZ2h0LCBiYXNlUGxhY2VtZW50cywgdG9wLCBib3R0b20gfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi4vZG9tLXV0aWxzL2luc3RhbmNlT2YuanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG52YXIgdG9QYWRkaW5nT2JqZWN0ID0gZnVuY3Rpb24gdG9QYWRkaW5nT2JqZWN0KHBhZGRpbmcsIHN0YXRlKSB7XG4gIHBhZGRpbmcgPSB0eXBlb2YgcGFkZGluZyA9PT0gJ2Z1bmN0aW9uJyA/IHBhZGRpbmcoT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUucmVjdHMsIHtcbiAgICBwbGFjZW1lbnQ6IHN0YXRlLnBsYWNlbWVudFxuICB9KSkgOiBwYWRkaW5nO1xuICByZXR1cm4gbWVyZ2VQYWRkaW5nT2JqZWN0KHR5cGVvZiBwYWRkaW5nICE9PSAnbnVtYmVyJyA/IHBhZGRpbmcgOiBleHBhbmRUb0hhc2hNYXAocGFkZGluZywgYmFzZVBsYWNlbWVudHMpKTtcbn07XG5cbmZ1bmN0aW9uIGFycm93KF9yZWYpIHtcbiAgdmFyIF9zdGF0ZSRtb2RpZmllcnNEYXRhJDtcblxuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgbmFtZSA9IF9yZWYubmFtZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnM7XG4gIHZhciBhcnJvd0VsZW1lbnQgPSBzdGF0ZS5lbGVtZW50cy5hcnJvdztcbiAgdmFyIHBvcHBlck9mZnNldHMgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHM7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gZ2V0QmFzZVBsYWNlbWVudChzdGF0ZS5wbGFjZW1lbnQpO1xuICB2YXIgYXhpcyA9IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChiYXNlUGxhY2VtZW50KTtcbiAgdmFyIGlzVmVydGljYWwgPSBbbGVmdCwgcmlnaHRdLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgPj0gMDtcbiAgdmFyIGxlbiA9IGlzVmVydGljYWwgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG5cbiAgaWYgKCFhcnJvd0VsZW1lbnQgfHwgIXBvcHBlck9mZnNldHMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgcGFkZGluZ09iamVjdCA9IHRvUGFkZGluZ09iamVjdChvcHRpb25zLnBhZGRpbmcsIHN0YXRlKTtcbiAgdmFyIGFycm93UmVjdCA9IGdldExheW91dFJlY3QoYXJyb3dFbGVtZW50KTtcbiAgdmFyIG1pblByb3AgPSBheGlzID09PSAneScgPyB0b3AgOiBsZWZ0O1xuICB2YXIgbWF4UHJvcCA9IGF4aXMgPT09ICd5JyA/IGJvdHRvbSA6IHJpZ2h0O1xuICB2YXIgZW5kRGlmZiA9IHN0YXRlLnJlY3RzLnJlZmVyZW5jZVtsZW5dICsgc3RhdGUucmVjdHMucmVmZXJlbmNlW2F4aXNdIC0gcG9wcGVyT2Zmc2V0c1theGlzXSAtIHN0YXRlLnJlY3RzLnBvcHBlcltsZW5dO1xuICB2YXIgc3RhcnREaWZmID0gcG9wcGVyT2Zmc2V0c1theGlzXSAtIHN0YXRlLnJlY3RzLnJlZmVyZW5jZVtheGlzXTtcbiAgdmFyIGFycm93T2Zmc2V0UGFyZW50ID0gZ2V0T2Zmc2V0UGFyZW50KGFycm93RWxlbWVudCk7XG4gIHZhciBjbGllbnRTaXplID0gYXJyb3dPZmZzZXRQYXJlbnQgPyBheGlzID09PSAneScgPyBhcnJvd09mZnNldFBhcmVudC5jbGllbnRIZWlnaHQgfHwgMCA6IGFycm93T2Zmc2V0UGFyZW50LmNsaWVudFdpZHRoIHx8IDAgOiAwO1xuICB2YXIgY2VudGVyVG9SZWZlcmVuY2UgPSBlbmREaWZmIC8gMiAtIHN0YXJ0RGlmZiAvIDI7IC8vIE1ha2Ugc3VyZSB0aGUgYXJyb3cgZG9lc24ndCBvdmVyZmxvdyB0aGUgcG9wcGVyIGlmIHRoZSBjZW50ZXIgcG9pbnQgaXNcbiAgLy8gb3V0c2lkZSBvZiB0aGUgcG9wcGVyIGJvdW5kc1xuXG4gIHZhciBtaW4gPSBwYWRkaW5nT2JqZWN0W21pblByb3BdO1xuICB2YXIgbWF4ID0gY2xpZW50U2l6ZSAtIGFycm93UmVjdFtsZW5dIC0gcGFkZGluZ09iamVjdFttYXhQcm9wXTtcbiAgdmFyIGNlbnRlciA9IGNsaWVudFNpemUgLyAyIC0gYXJyb3dSZWN0W2xlbl0gLyAyICsgY2VudGVyVG9SZWZlcmVuY2U7XG4gIHZhciBvZmZzZXQgPSB3aXRoaW4obWluLCBjZW50ZXIsIG1heCk7IC8vIFByZXZlbnRzIGJyZWFraW5nIHN5bnRheCBoaWdobGlnaHRpbmcuLi5cblxuICB2YXIgYXhpc1Byb3AgPSBheGlzO1xuICBzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdID0gKF9zdGF0ZSRtb2RpZmllcnNEYXRhJCA9IHt9LCBfc3RhdGUkbW9kaWZpZXJzRGF0YSRbYXhpc1Byb3BdID0gb2Zmc2V0LCBfc3RhdGUkbW9kaWZpZXJzRGF0YSQuY2VudGVyT2Zmc2V0ID0gb2Zmc2V0IC0gY2VudGVyLCBfc3RhdGUkbW9kaWZpZXJzRGF0YSQpO1xufVxuXG5mdW5jdGlvbiBlZmZlY3QoX3JlZjIpIHtcbiAgdmFyIHN0YXRlID0gX3JlZjIuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZjIub3B0aW9ucztcbiAgdmFyIF9vcHRpb25zJGVsZW1lbnQgPSBvcHRpb25zLmVsZW1lbnQsXG4gICAgICBhcnJvd0VsZW1lbnQgPSBfb3B0aW9ucyRlbGVtZW50ID09PSB2b2lkIDAgPyAnW2RhdGEtcG9wcGVyLWFycm93XScgOiBfb3B0aW9ucyRlbGVtZW50O1xuXG4gIGlmIChhcnJvd0VsZW1lbnQgPT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfSAvLyBDU1Mgc2VsZWN0b3JcblxuXG4gIGlmICh0eXBlb2YgYXJyb3dFbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgIGFycm93RWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzLnBvcHBlci5xdWVyeVNlbGVjdG9yKGFycm93RWxlbWVudCk7XG5cbiAgICBpZiAoIWFycm93RWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICBpZiAoIWlzSFRNTEVsZW1lbnQoYXJyb3dFbGVtZW50KSkge1xuICAgICAgY29uc29sZS5lcnJvcihbJ1BvcHBlcjogXCJhcnJvd1wiIGVsZW1lbnQgbXVzdCBiZSBhbiBIVE1MRWxlbWVudCAobm90IGFuIFNWR0VsZW1lbnQpLicsICdUbyB1c2UgYW4gU1ZHIGFycm93LCB3cmFwIGl0IGluIGFuIEhUTUxFbGVtZW50IHRoYXQgd2lsbCBiZSB1c2VkIGFzJywgJ3RoZSBhcnJvdy4nXS5qb2luKCcgJykpO1xuICAgIH1cbiAgfVxuXG4gIGlmICghY29udGFpbnMoc3RhdGUuZWxlbWVudHMucG9wcGVyLCBhcnJvd0VsZW1lbnQpKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgY29uc29sZS5lcnJvcihbJ1BvcHBlcjogXCJhcnJvd1wiIG1vZGlmaWVyXFwncyBgZWxlbWVudGAgbXVzdCBiZSBhIGNoaWxkIG9mIHRoZSBwb3BwZXInLCAnZWxlbWVudC4nXS5qb2luKCcgJykpO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIHN0YXRlLmVsZW1lbnRzLmFycm93ID0gYXJyb3dFbGVtZW50O1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnYXJyb3cnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICBmbjogYXJyb3csXG4gIGVmZmVjdDogZWZmZWN0LFxuICByZXF1aXJlczogWydwb3BwZXJPZmZzZXRzJ10sXG4gIHJlcXVpcmVzSWZFeGlzdHM6IFsncHJldmVudE92ZXJmbG93J11cbn07IiwiaW1wb3J0IHsgdG9wLCBsZWZ0LCByaWdodCwgYm90dG9tIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgZ2V0T2Zmc2V0UGFyZW50IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0V2luZG93LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldENvbXB1dGVkU3R5bGUuanNcIjtcbmltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgeyByb3VuZCB9IGZyb20gXCIuLi91dGlscy9tYXRoLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxudmFyIHVuc2V0U2lkZXMgPSB7XG4gIHRvcDogJ2F1dG8nLFxuICByaWdodDogJ2F1dG8nLFxuICBib3R0b206ICdhdXRvJyxcbiAgbGVmdDogJ2F1dG8nXG59OyAvLyBSb3VuZCB0aGUgb2Zmc2V0cyB0byB0aGUgbmVhcmVzdCBzdWl0YWJsZSBzdWJwaXhlbCBiYXNlZCBvbiB0aGUgRFBSLlxuLy8gWm9vbWluZyBjYW4gY2hhbmdlIHRoZSBEUFIsIGJ1dCBpdCBzZWVtcyB0byByZXBvcnQgYSB2YWx1ZSB0aGF0IHdpbGxcbi8vIGNsZWFubHkgZGl2aWRlIHRoZSB2YWx1ZXMgaW50byB0aGUgYXBwcm9wcmlhdGUgc3VicGl4ZWxzLlxuXG5mdW5jdGlvbiByb3VuZE9mZnNldHNCeURQUihfcmVmKSB7XG4gIHZhciB4ID0gX3JlZi54LFxuICAgICAgeSA9IF9yZWYueTtcbiAgdmFyIHdpbiA9IHdpbmRvdztcbiAgdmFyIGRwciA9IHdpbi5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG4gIHJldHVybiB7XG4gICAgeDogcm91bmQocm91bmQoeCAqIGRwcikgLyBkcHIpIHx8IDAsXG4gICAgeTogcm91bmQocm91bmQoeSAqIGRwcikgLyBkcHIpIHx8IDBcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hcFRvU3R5bGVzKF9yZWYyKSB7XG4gIHZhciBfT2JqZWN0JGFzc2lnbjI7XG5cbiAgdmFyIHBvcHBlciA9IF9yZWYyLnBvcHBlcixcbiAgICAgIHBvcHBlclJlY3QgPSBfcmVmMi5wb3BwZXJSZWN0LFxuICAgICAgcGxhY2VtZW50ID0gX3JlZjIucGxhY2VtZW50LFxuICAgICAgb2Zmc2V0cyA9IF9yZWYyLm9mZnNldHMsXG4gICAgICBwb3NpdGlvbiA9IF9yZWYyLnBvc2l0aW9uLFxuICAgICAgZ3B1QWNjZWxlcmF0aW9uID0gX3JlZjIuZ3B1QWNjZWxlcmF0aW9uLFxuICAgICAgYWRhcHRpdmUgPSBfcmVmMi5hZGFwdGl2ZSxcbiAgICAgIHJvdW5kT2Zmc2V0cyA9IF9yZWYyLnJvdW5kT2Zmc2V0cztcblxuICB2YXIgX3JlZjMgPSByb3VuZE9mZnNldHMgPT09IHRydWUgPyByb3VuZE9mZnNldHNCeURQUihvZmZzZXRzKSA6IHR5cGVvZiByb3VuZE9mZnNldHMgPT09ICdmdW5jdGlvbicgPyByb3VuZE9mZnNldHMob2Zmc2V0cykgOiBvZmZzZXRzLFxuICAgICAgX3JlZjMkeCA9IF9yZWYzLngsXG4gICAgICB4ID0gX3JlZjMkeCA9PT0gdm9pZCAwID8gMCA6IF9yZWYzJHgsXG4gICAgICBfcmVmMyR5ID0gX3JlZjMueSxcbiAgICAgIHkgPSBfcmVmMyR5ID09PSB2b2lkIDAgPyAwIDogX3JlZjMkeTtcblxuICB2YXIgaGFzWCA9IG9mZnNldHMuaGFzT3duUHJvcGVydHkoJ3gnKTtcbiAgdmFyIGhhc1kgPSBvZmZzZXRzLmhhc093blByb3BlcnR5KCd5Jyk7XG4gIHZhciBzaWRlWCA9IGxlZnQ7XG4gIHZhciBzaWRlWSA9IHRvcDtcbiAgdmFyIHdpbiA9IHdpbmRvdztcblxuICBpZiAoYWRhcHRpdmUpIHtcbiAgICB2YXIgb2Zmc2V0UGFyZW50ID0gZ2V0T2Zmc2V0UGFyZW50KHBvcHBlcik7XG4gICAgdmFyIGhlaWdodFByb3AgPSAnY2xpZW50SGVpZ2h0JztcbiAgICB2YXIgd2lkdGhQcm9wID0gJ2NsaWVudFdpZHRoJztcblxuICAgIGlmIChvZmZzZXRQYXJlbnQgPT09IGdldFdpbmRvdyhwb3BwZXIpKSB7XG4gICAgICBvZmZzZXRQYXJlbnQgPSBnZXREb2N1bWVudEVsZW1lbnQocG9wcGVyKTtcblxuICAgICAgaWYgKGdldENvbXB1dGVkU3R5bGUob2Zmc2V0UGFyZW50KS5wb3NpdGlvbiAhPT0gJ3N0YXRpYycpIHtcbiAgICAgICAgaGVpZ2h0UHJvcCA9ICdzY3JvbGxIZWlnaHQnO1xuICAgICAgICB3aWR0aFByb3AgPSAnc2Nyb2xsV2lkdGgnO1xuICAgICAgfVxuICAgIH0gLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtY2FzdF06IGZvcmNlIHR5cGUgcmVmaW5lbWVudCwgd2UgY29tcGFyZSBvZmZzZXRQYXJlbnQgd2l0aCB3aW5kb3cgYWJvdmUsIGJ1dCBGbG93IGRvZXNuJ3QgZGV0ZWN0IGl0XG5cblxuICAgIG9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudDtcblxuICAgIGlmIChwbGFjZW1lbnQgPT09IHRvcCkge1xuICAgICAgc2lkZVkgPSBib3R0b207IC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuXG4gICAgICB5IC09IG9mZnNldFBhcmVudFtoZWlnaHRQcm9wXSAtIHBvcHBlclJlY3QuaGVpZ2h0O1xuICAgICAgeSAqPSBncHVBY2NlbGVyYXRpb24gPyAxIDogLTE7XG4gICAgfVxuXG4gICAgaWYgKHBsYWNlbWVudCA9PT0gbGVmdCkge1xuICAgICAgc2lkZVggPSByaWdodDsgLy8gJEZsb3dGaXhNZVtwcm9wLW1pc3NpbmddXG5cbiAgICAgIHggLT0gb2Zmc2V0UGFyZW50W3dpZHRoUHJvcF0gLSBwb3BwZXJSZWN0LndpZHRoO1xuICAgICAgeCAqPSBncHVBY2NlbGVyYXRpb24gPyAxIDogLTE7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbW1vblN0eWxlcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgIHBvc2l0aW9uOiBwb3NpdGlvblxuICB9LCBhZGFwdGl2ZSAmJiB1bnNldFNpZGVzKTtcblxuICBpZiAoZ3B1QWNjZWxlcmF0aW9uKSB7XG4gICAgdmFyIF9PYmplY3QkYXNzaWduO1xuXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGNvbW1vblN0eWxlcywgKF9PYmplY3QkYXNzaWduID0ge30sIF9PYmplY3QkYXNzaWduW3NpZGVZXSA9IGhhc1kgPyAnMCcgOiAnJywgX09iamVjdCRhc3NpZ25bc2lkZVhdID0gaGFzWCA/ICcwJyA6ICcnLCBfT2JqZWN0JGFzc2lnbi50cmFuc2Zvcm0gPSAod2luLmRldmljZVBpeGVsUmF0aW8gfHwgMSkgPCAyID8gXCJ0cmFuc2xhdGUoXCIgKyB4ICsgXCJweCwgXCIgKyB5ICsgXCJweClcIiA6IFwidHJhbnNsYXRlM2QoXCIgKyB4ICsgXCJweCwgXCIgKyB5ICsgXCJweCwgMClcIiwgX09iamVjdCRhc3NpZ24pKTtcbiAgfVxuXG4gIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBjb21tb25TdHlsZXMsIChfT2JqZWN0JGFzc2lnbjIgPSB7fSwgX09iamVjdCRhc3NpZ24yW3NpZGVZXSA9IGhhc1kgPyB5ICsgXCJweFwiIDogJycsIF9PYmplY3QkYXNzaWduMltzaWRlWF0gPSBoYXNYID8geCArIFwicHhcIiA6ICcnLCBfT2JqZWN0JGFzc2lnbjIudHJhbnNmb3JtID0gJycsIF9PYmplY3QkYXNzaWduMikpO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlU3R5bGVzKF9yZWY0KSB7XG4gIHZhciBzdGF0ZSA9IF9yZWY0LnN0YXRlLFxuICAgICAgb3B0aW9ucyA9IF9yZWY0Lm9wdGlvbnM7XG4gIHZhciBfb3B0aW9ucyRncHVBY2NlbGVyYXQgPSBvcHRpb25zLmdwdUFjY2VsZXJhdGlvbixcbiAgICAgIGdwdUFjY2VsZXJhdGlvbiA9IF9vcHRpb25zJGdwdUFjY2VsZXJhdCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJGdwdUFjY2VsZXJhdCxcbiAgICAgIF9vcHRpb25zJGFkYXB0aXZlID0gb3B0aW9ucy5hZGFwdGl2ZSxcbiAgICAgIGFkYXB0aXZlID0gX29wdGlvbnMkYWRhcHRpdmUgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRhZGFwdGl2ZSxcbiAgICAgIF9vcHRpb25zJHJvdW5kT2Zmc2V0cyA9IG9wdGlvbnMucm91bmRPZmZzZXRzLFxuICAgICAgcm91bmRPZmZzZXRzID0gX29wdGlvbnMkcm91bmRPZmZzZXRzID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkcm91bmRPZmZzZXRzO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICB2YXIgdHJhbnNpdGlvblByb3BlcnR5ID0gZ2V0Q29tcHV0ZWRTdHlsZShzdGF0ZS5lbGVtZW50cy5wb3BwZXIpLnRyYW5zaXRpb25Qcm9wZXJ0eSB8fCAnJztcblxuICAgIGlmIChhZGFwdGl2ZSAmJiBbJ3RyYW5zZm9ybScsICd0b3AnLCAncmlnaHQnLCAnYm90dG9tJywgJ2xlZnQnXS5zb21lKGZ1bmN0aW9uIChwcm9wZXJ0eSkge1xuICAgICAgcmV0dXJuIHRyYW5zaXRpb25Qcm9wZXJ0eS5pbmRleE9mKHByb3BlcnR5KSA+PSAwO1xuICAgIH0pKSB7XG4gICAgICBjb25zb2xlLndhcm4oWydQb3BwZXI6IERldGVjdGVkIENTUyB0cmFuc2l0aW9ucyBvbiBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZycsICdDU1MgcHJvcGVydGllczogXCJ0cmFuc2Zvcm1cIiwgXCJ0b3BcIiwgXCJyaWdodFwiLCBcImJvdHRvbVwiLCBcImxlZnRcIi4nLCAnXFxuXFxuJywgJ0Rpc2FibGUgdGhlIFwiY29tcHV0ZVN0eWxlc1wiIG1vZGlmaWVyXFwncyBgYWRhcHRpdmVgIG9wdGlvbiB0byBhbGxvdycsICdmb3Igc21vb3RoIHRyYW5zaXRpb25zLCBvciByZW1vdmUgdGhlc2UgcHJvcGVydGllcyBmcm9tIHRoZSBDU1MnLCAndHJhbnNpdGlvbiBkZWNsYXJhdGlvbiBvbiB0aGUgcG9wcGVyIGVsZW1lbnQgaWYgb25seSB0cmFuc2l0aW9uaW5nJywgJ29wYWNpdHkgb3IgYmFja2dyb3VuZC1jb2xvciBmb3IgZXhhbXBsZS4nLCAnXFxuXFxuJywgJ1dlIHJlY29tbWVuZCB1c2luZyB0aGUgcG9wcGVyIGVsZW1lbnQgYXMgYSB3cmFwcGVyIGFyb3VuZCBhbiBpbm5lcicsICdlbGVtZW50IHRoYXQgY2FuIGhhdmUgYW55IENTUyBwcm9wZXJ0eSB0cmFuc2l0aW9uZWQgZm9yIGFuaW1hdGlvbnMuJ10uam9pbignICcpKTtcbiAgICB9XG4gIH1cblxuICB2YXIgY29tbW9uU3R5bGVzID0ge1xuICAgIHBsYWNlbWVudDogZ2V0QmFzZVBsYWNlbWVudChzdGF0ZS5wbGFjZW1lbnQpLFxuICAgIHBvcHBlcjogc3RhdGUuZWxlbWVudHMucG9wcGVyLFxuICAgIHBvcHBlclJlY3Q6IHN0YXRlLnJlY3RzLnBvcHBlcixcbiAgICBncHVBY2NlbGVyYXRpb246IGdwdUFjY2VsZXJhdGlvblxuICB9O1xuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMgIT0gbnVsbCkge1xuICAgIHN0YXRlLnN0eWxlcy5wb3BwZXIgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5zdHlsZXMucG9wcGVyLCBtYXBUb1N0eWxlcyhPYmplY3QuYXNzaWduKHt9LCBjb21tb25TdHlsZXMsIHtcbiAgICAgIG9mZnNldHM6IHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cyxcbiAgICAgIHBvc2l0aW9uOiBzdGF0ZS5vcHRpb25zLnN0cmF0ZWd5LFxuICAgICAgYWRhcHRpdmU6IGFkYXB0aXZlLFxuICAgICAgcm91bmRPZmZzZXRzOiByb3VuZE9mZnNldHNcbiAgICB9KSkpO1xuICB9XG5cbiAgaWYgKHN0YXRlLm1vZGlmaWVyc0RhdGEuYXJyb3cgIT0gbnVsbCkge1xuICAgIHN0YXRlLnN0eWxlcy5hcnJvdyA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnN0eWxlcy5hcnJvdywgbWFwVG9TdHlsZXMoT2JqZWN0LmFzc2lnbih7fSwgY29tbW9uU3R5bGVzLCB7XG4gICAgICBvZmZzZXRzOiBzdGF0ZS5tb2RpZmllcnNEYXRhLmFycm93LFxuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBhZGFwdGl2ZTogZmFsc2UsXG4gICAgICByb3VuZE9mZnNldHM6IHJvdW5kT2Zmc2V0c1xuICAgIH0pKSk7XG4gIH1cblxuICBzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlciA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmF0dHJpYnV0ZXMucG9wcGVyLCB7XG4gICAgJ2RhdGEtcG9wcGVyLXBsYWNlbWVudCc6IHN0YXRlLnBsYWNlbWVudFxuICB9KTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ2NvbXB1dGVTdHlsZXMnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ2JlZm9yZVdyaXRlJyxcbiAgZm46IGNvbXB1dGVTdHlsZXMsXG4gIGRhdGE6IHt9XG59OyIsImltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRXaW5kb3cuanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG52YXIgcGFzc2l2ZSA9IHtcbiAgcGFzc2l2ZTogdHJ1ZVxufTtcblxuZnVuY3Rpb24gZWZmZWN0KF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIGluc3RhbmNlID0gX3JlZi5pbnN0YW5jZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnM7XG4gIHZhciBfb3B0aW9ucyRzY3JvbGwgPSBvcHRpb25zLnNjcm9sbCxcbiAgICAgIHNjcm9sbCA9IF9vcHRpb25zJHNjcm9sbCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJHNjcm9sbCxcbiAgICAgIF9vcHRpb25zJHJlc2l6ZSA9IG9wdGlvbnMucmVzaXplLFxuICAgICAgcmVzaXplID0gX29wdGlvbnMkcmVzaXplID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkcmVzaXplO1xuICB2YXIgd2luZG93ID0gZ2V0V2luZG93KHN0YXRlLmVsZW1lbnRzLnBvcHBlcik7XG4gIHZhciBzY3JvbGxQYXJlbnRzID0gW10uY29uY2F0KHN0YXRlLnNjcm9sbFBhcmVudHMucmVmZXJlbmNlLCBzdGF0ZS5zY3JvbGxQYXJlbnRzLnBvcHBlcik7XG5cbiAgaWYgKHNjcm9sbCkge1xuICAgIHNjcm9sbFBhcmVudHMuZm9yRWFjaChmdW5jdGlvbiAoc2Nyb2xsUGFyZW50KSB7XG4gICAgICBzY3JvbGxQYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgaW5zdGFuY2UudXBkYXRlLCBwYXNzaXZlKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChyZXNpemUpIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgaW5zdGFuY2UudXBkYXRlLCBwYXNzaXZlKTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHNjcm9sbCkge1xuICAgICAgc2Nyb2xsUGFyZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChzY3JvbGxQYXJlbnQpIHtcbiAgICAgICAgc2Nyb2xsUGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAocmVzaXplKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgaW5zdGFuY2UudXBkYXRlLCBwYXNzaXZlKTtcbiAgICB9XG4gIH07XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdldmVudExpc3RlbmVycycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnd3JpdGUnLFxuICBmbjogZnVuY3Rpb24gZm4oKSB7fSxcbiAgZWZmZWN0OiBlZmZlY3QsXG4gIGRhdGE6IHt9XG59OyIsInZhciBoYXNoID0ge1xuICBsZWZ0OiAncmlnaHQnLFxuICByaWdodDogJ2xlZnQnLFxuICBib3R0b206ICd0b3AnLFxuICB0b3A6ICdib3R0b20nXG59O1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQucmVwbGFjZSgvbGVmdHxyaWdodHxib3R0b218dG9wL2csIGZ1bmN0aW9uIChtYXRjaGVkKSB7XG4gICAgcmV0dXJuIGhhc2hbbWF0Y2hlZF07XG4gIH0pO1xufSIsInZhciBoYXNoID0ge1xuICBzdGFydDogJ2VuZCcsXG4gIGVuZDogJ3N0YXJ0J1xufTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnJlcGxhY2UoL3N0YXJ0fGVuZC9nLCBmdW5jdGlvbiAobWF0Y2hlZCkge1xuICAgIHJldHVybiBoYXNoW21hdGNoZWRdO1xuICB9KTtcbn0iLCJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0V2luZG93U2Nyb2xsKG5vZGUpIHtcbiAgdmFyIHdpbiA9IGdldFdpbmRvdyhub2RlKTtcbiAgdmFyIHNjcm9sbExlZnQgPSB3aW4ucGFnZVhPZmZzZXQ7XG4gIHZhciBzY3JvbGxUb3AgPSB3aW4ucGFnZVlPZmZzZXQ7XG4gIHJldHVybiB7XG4gICAgc2Nyb2xsTGVmdDogc2Nyb2xsTGVmdCxcbiAgICBzY3JvbGxUb3A6IHNjcm9sbFRvcFxuICB9O1xufSIsImltcG9ydCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZnJvbSBcIi4vZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldFdpbmRvd1Njcm9sbCBmcm9tIFwiLi9nZXRXaW5kb3dTY3JvbGwuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFdpbmRvd1Njcm9sbEJhclgoZWxlbWVudCkge1xuICAvLyBJZiA8aHRtbD4gaGFzIGEgQ1NTIHdpZHRoIGdyZWF0ZXIgdGhhbiB0aGUgdmlld3BvcnQsIHRoZW4gdGhpcyB3aWxsIGJlXG4gIC8vIGluY29ycmVjdCBmb3IgUlRMLlxuICAvLyBQb3BwZXIgMSBpcyBicm9rZW4gaW4gdGhpcyBjYXNlIGFuZCBuZXZlciBoYWQgYSBidWcgcmVwb3J0IHNvIGxldCdzIGFzc3VtZVxuICAvLyBpdCdzIG5vdCBhbiBpc3N1ZS4gSSBkb24ndCB0aGluayBhbnlvbmUgZXZlciBzcGVjaWZpZXMgd2lkdGggb24gPGh0bWw+XG4gIC8vIGFueXdheS5cbiAgLy8gQnJvd3NlcnMgd2hlcmUgdGhlIGxlZnQgc2Nyb2xsYmFyIGRvZXNuJ3QgY2F1c2UgYW4gaXNzdWUgcmVwb3J0IGAwYCBmb3JcbiAgLy8gdGhpcyAoZS5nLiBFZGdlIDIwMTksIElFMTEsIFNhZmFyaSlcbiAgcmV0dXJuIGdldEJvdW5kaW5nQ2xpZW50UmVjdChnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCkpLmxlZnQgKyBnZXRXaW5kb3dTY3JvbGwoZWxlbWVudCkuc2Nyb2xsTGVmdDtcbn0iLCJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGxCYXJYIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbEJhclguanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFZpZXdwb3J0UmVjdChlbGVtZW50KSB7XG4gIHZhciB3aW4gPSBnZXRXaW5kb3coZWxlbWVudCk7XG4gIHZhciBodG1sID0gZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpO1xuICB2YXIgdmlzdWFsVmlld3BvcnQgPSB3aW4udmlzdWFsVmlld3BvcnQ7XG4gIHZhciB3aWR0aCA9IGh0bWwuY2xpZW50V2lkdGg7XG4gIHZhciBoZWlnaHQgPSBodG1sLmNsaWVudEhlaWdodDtcbiAgdmFyIHggPSAwO1xuICB2YXIgeSA9IDA7IC8vIE5COiBUaGlzIGlzbid0IHN1cHBvcnRlZCBvbiBpT1MgPD0gMTIuIElmIHRoZSBrZXlib2FyZCBpcyBvcGVuLCB0aGUgcG9wcGVyXG4gIC8vIGNhbiBiZSBvYnNjdXJlZCB1bmRlcm5lYXRoIGl0LlxuICAvLyBBbHNvLCBgaHRtbC5jbGllbnRIZWlnaHRgIGFkZHMgdGhlIGJvdHRvbSBiYXIgaGVpZ2h0IGluIFNhZmFyaSBpT1MsIGV2ZW5cbiAgLy8gaWYgaXQgaXNuJ3Qgb3Blbiwgc28gaWYgdGhpcyBpc24ndCBhdmFpbGFibGUsIHRoZSBwb3BwZXIgd2lsbCBiZSBkZXRlY3RlZFxuICAvLyB0byBvdmVyZmxvdyB0aGUgYm90dG9tIG9mIHRoZSBzY3JlZW4gdG9vIGVhcmx5LlxuXG4gIGlmICh2aXN1YWxWaWV3cG9ydCkge1xuICAgIHdpZHRoID0gdmlzdWFsVmlld3BvcnQud2lkdGg7XG4gICAgaGVpZ2h0ID0gdmlzdWFsVmlld3BvcnQuaGVpZ2h0OyAvLyBVc2VzIExheW91dCBWaWV3cG9ydCAobGlrZSBDaHJvbWU7IFNhZmFyaSBkb2VzIG5vdCBjdXJyZW50bHkpXG4gICAgLy8gSW4gQ2hyb21lLCBpdCByZXR1cm5zIGEgdmFsdWUgdmVyeSBjbG9zZSB0byAwICgrLy0pIGJ1dCBjb250YWlucyByb3VuZGluZ1xuICAgIC8vIGVycm9ycyBkdWUgdG8gZmxvYXRpbmcgcG9pbnQgbnVtYmVycywgc28gd2UgbmVlZCB0byBjaGVjayBwcmVjaXNpb24uXG4gICAgLy8gU2FmYXJpIHJldHVybnMgYSBudW1iZXIgPD0gMCwgdXN1YWxseSA8IC0xIHdoZW4gcGluY2gtem9vbWVkXG4gICAgLy8gRmVhdHVyZSBkZXRlY3Rpb24gZmFpbHMgaW4gbW9iaWxlIGVtdWxhdGlvbiBtb2RlIGluIENocm9tZS5cbiAgICAvLyBNYXRoLmFicyh3aW4uaW5uZXJXaWR0aCAvIHZpc3VhbFZpZXdwb3J0LnNjYWxlIC0gdmlzdWFsVmlld3BvcnQud2lkdGgpIDxcbiAgICAvLyAwLjAwMVxuICAgIC8vIEZhbGxiYWNrIGhlcmU6IFwiTm90IFNhZmFyaVwiIHVzZXJBZ2VudFxuXG4gICAgaWYgKCEvXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKSB7XG4gICAgICB4ID0gdmlzdWFsVmlld3BvcnQub2Zmc2V0TGVmdDtcbiAgICAgIHkgPSB2aXN1YWxWaWV3cG9ydC5vZmZzZXRUb3A7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgeDogeCArIGdldFdpbmRvd1Njcm9sbEJhclgoZWxlbWVudCksXG4gICAgeTogeVxuICB9O1xufSIsImltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi9nZXRDb21wdXRlZFN0eWxlLmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93U2Nyb2xsQmFyWCBmcm9tIFwiLi9nZXRXaW5kb3dTY3JvbGxCYXJYLmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93U2Nyb2xsIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbC5qc1wiO1xuaW1wb3J0IHsgbWF4IH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjsgLy8gR2V0cyB0aGUgZW50aXJlIHNpemUgb2YgdGhlIHNjcm9sbGFibGUgZG9jdW1lbnQgYXJlYSwgZXZlbiBleHRlbmRpbmcgb3V0c2lkZVxuLy8gb2YgdGhlIGA8aHRtbD5gIGFuZCBgPGJvZHk+YCByZWN0IGJvdW5kcyBpZiBob3Jpem9udGFsbHkgc2Nyb2xsYWJsZVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXREb2N1bWVudFJlY3QoZWxlbWVudCkge1xuICB2YXIgX2VsZW1lbnQkb3duZXJEb2N1bWVuO1xuXG4gIHZhciBodG1sID0gZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpO1xuICB2YXIgd2luU2Nyb2xsID0gZ2V0V2luZG93U2Nyb2xsKGVsZW1lbnQpO1xuICB2YXIgYm9keSA9IChfZWxlbWVudCRvd25lckRvY3VtZW4gPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQpID09IG51bGwgPyB2b2lkIDAgOiBfZWxlbWVudCRvd25lckRvY3VtZW4uYm9keTtcbiAgdmFyIHdpZHRoID0gbWF4KGh0bWwuc2Nyb2xsV2lkdGgsIGh0bWwuY2xpZW50V2lkdGgsIGJvZHkgPyBib2R5LnNjcm9sbFdpZHRoIDogMCwgYm9keSA/IGJvZHkuY2xpZW50V2lkdGggOiAwKTtcbiAgdmFyIGhlaWdodCA9IG1heChodG1sLnNjcm9sbEhlaWdodCwgaHRtbC5jbGllbnRIZWlnaHQsIGJvZHkgPyBib2R5LnNjcm9sbEhlaWdodCA6IDAsIGJvZHkgPyBib2R5LmNsaWVudEhlaWdodCA6IDApO1xuICB2YXIgeCA9IC13aW5TY3JvbGwuc2Nyb2xsTGVmdCArIGdldFdpbmRvd1Njcm9sbEJhclgoZWxlbWVudCk7XG4gIHZhciB5ID0gLXdpblNjcm9sbC5zY3JvbGxUb3A7XG5cbiAgaWYgKGdldENvbXB1dGVkU3R5bGUoYm9keSB8fCBodG1sKS5kaXJlY3Rpb24gPT09ICdydGwnKSB7XG4gICAgeCArPSBtYXgoaHRtbC5jbGllbnRXaWR0aCwgYm9keSA/IGJvZHkuY2xpZW50V2lkdGggOiAwKSAtIHdpZHRoO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH07XG59IiwiaW1wb3J0IGdldENvbXB1dGVkU3R5bGUgZnJvbSBcIi4vZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNTY3JvbGxQYXJlbnQoZWxlbWVudCkge1xuICAvLyBGaXJlZm94IHdhbnRzIHVzIHRvIGNoZWNrIGAteGAgYW5kIGAteWAgdmFyaWF0aW9ucyBhcyB3ZWxsXG4gIHZhciBfZ2V0Q29tcHV0ZWRTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCksXG4gICAgICBvdmVyZmxvdyA9IF9nZXRDb21wdXRlZFN0eWxlLm92ZXJmbG93LFxuICAgICAgb3ZlcmZsb3dYID0gX2dldENvbXB1dGVkU3R5bGUub3ZlcmZsb3dYLFxuICAgICAgb3ZlcmZsb3dZID0gX2dldENvbXB1dGVkU3R5bGUub3ZlcmZsb3dZO1xuXG4gIHJldHVybiAvYXV0b3xzY3JvbGx8b3ZlcmxheXxoaWRkZW4vLnRlc3Qob3ZlcmZsb3cgKyBvdmVyZmxvd1kgKyBvdmVyZmxvd1gpO1xufSIsImltcG9ydCBnZXRQYXJlbnROb2RlIGZyb20gXCIuL2dldFBhcmVudE5vZGUuanNcIjtcbmltcG9ydCBpc1Njcm9sbFBhcmVudCBmcm9tIFwiLi9pc1Njcm9sbFBhcmVudC5qc1wiO1xuaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0U2Nyb2xsUGFyZW50KG5vZGUpIHtcbiAgaWYgKFsnaHRtbCcsICdib2R5JywgJyNkb2N1bWVudCddLmluZGV4T2YoZ2V0Tm9kZU5hbWUobm9kZSkpID49IDApIHtcbiAgICAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1yZXR1cm5dOiBhc3N1bWUgYm9keSBpcyBhbHdheXMgYXZhaWxhYmxlXG4gICAgcmV0dXJuIG5vZGUub3duZXJEb2N1bWVudC5ib2R5O1xuICB9XG5cbiAgaWYgKGlzSFRNTEVsZW1lbnQobm9kZSkgJiYgaXNTY3JvbGxQYXJlbnQobm9kZSkpIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIHJldHVybiBnZXRTY3JvbGxQYXJlbnQoZ2V0UGFyZW50Tm9kZShub2RlKSk7XG59IiwiaW1wb3J0IGdldFNjcm9sbFBhcmVudCBmcm9tIFwiLi9nZXRTY3JvbGxQYXJlbnQuanNcIjtcbmltcG9ydCBnZXRQYXJlbnROb2RlIGZyb20gXCIuL2dldFBhcmVudE5vZGUuanNcIjtcbmltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5pbXBvcnQgaXNTY3JvbGxQYXJlbnQgZnJvbSBcIi4vaXNTY3JvbGxQYXJlbnQuanNcIjtcbi8qXG5naXZlbiBhIERPTSBlbGVtZW50LCByZXR1cm4gdGhlIGxpc3Qgb2YgYWxsIHNjcm9sbCBwYXJlbnRzLCB1cCB0aGUgbGlzdCBvZiBhbmNlc29yc1xudW50aWwgd2UgZ2V0IHRvIHRoZSB0b3Agd2luZG93IG9iamVjdC4gVGhpcyBsaXN0IGlzIHdoYXQgd2UgYXR0YWNoIHNjcm9sbCBsaXN0ZW5lcnNcbnRvLCBiZWNhdXNlIGlmIGFueSBvZiB0aGVzZSBwYXJlbnQgZWxlbWVudHMgc2Nyb2xsLCB3ZSdsbCBuZWVkIHRvIHJlLWNhbGN1bGF0ZSB0aGVcbnJlZmVyZW5jZSBlbGVtZW50J3MgcG9zaXRpb24uXG4qL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsaXN0U2Nyb2xsUGFyZW50cyhlbGVtZW50LCBsaXN0KSB7XG4gIHZhciBfZWxlbWVudCRvd25lckRvY3VtZW47XG5cbiAgaWYgKGxpc3QgPT09IHZvaWQgMCkge1xuICAgIGxpc3QgPSBbXTtcbiAgfVxuXG4gIHZhciBzY3JvbGxQYXJlbnQgPSBnZXRTY3JvbGxQYXJlbnQoZWxlbWVudCk7XG4gIHZhciBpc0JvZHkgPSBzY3JvbGxQYXJlbnQgPT09ICgoX2VsZW1lbnQkb3duZXJEb2N1bWVuID0gZWxlbWVudC5vd25lckRvY3VtZW50KSA9PSBudWxsID8gdm9pZCAwIDogX2VsZW1lbnQkb3duZXJEb2N1bWVuLmJvZHkpO1xuICB2YXIgd2luID0gZ2V0V2luZG93KHNjcm9sbFBhcmVudCk7XG4gIHZhciB0YXJnZXQgPSBpc0JvZHkgPyBbd2luXS5jb25jYXQod2luLnZpc3VhbFZpZXdwb3J0IHx8IFtdLCBpc1Njcm9sbFBhcmVudChzY3JvbGxQYXJlbnQpID8gc2Nyb2xsUGFyZW50IDogW10pIDogc2Nyb2xsUGFyZW50O1xuICB2YXIgdXBkYXRlZExpc3QgPSBsaXN0LmNvbmNhdCh0YXJnZXQpO1xuICByZXR1cm4gaXNCb2R5ID8gdXBkYXRlZExpc3QgOiAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1jYWxsXTogaXNCb2R5IHRlbGxzIHVzIHRhcmdldCB3aWxsIGJlIGFuIEhUTUxFbGVtZW50IGhlcmVcbiAgdXBkYXRlZExpc3QuY29uY2F0KGxpc3RTY3JvbGxQYXJlbnRzKGdldFBhcmVudE5vZGUodGFyZ2V0KSkpO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlY3RUb0NsaWVudFJlY3QocmVjdCkge1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgcmVjdCwge1xuICAgIGxlZnQ6IHJlY3QueCxcbiAgICB0b3A6IHJlY3QueSxcbiAgICByaWdodDogcmVjdC54ICsgcmVjdC53aWR0aCxcbiAgICBib3R0b206IHJlY3QueSArIHJlY3QuaGVpZ2h0XG4gIH0pO1xufSIsImltcG9ydCB7IHZpZXdwb3J0IH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgZ2V0Vmlld3BvcnRSZWN0IGZyb20gXCIuL2dldFZpZXdwb3J0UmVjdC5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50UmVjdCBmcm9tIFwiLi9nZXREb2N1bWVudFJlY3QuanNcIjtcbmltcG9ydCBsaXN0U2Nyb2xsUGFyZW50cyBmcm9tIFwiLi9saXN0U2Nyb2xsUGFyZW50cy5qc1wiO1xuaW1wb3J0IGdldE9mZnNldFBhcmVudCBmcm9tIFwiLi9nZXRPZmZzZXRQYXJlbnQuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi9nZXRDb21wdXRlZFN0eWxlLmpzXCI7XG5pbXBvcnQgeyBpc0VsZW1lbnQsIGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZyb20gXCIuL2dldEJvdW5kaW5nQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IGdldFBhcmVudE5vZGUgZnJvbSBcIi4vZ2V0UGFyZW50Tm9kZS5qc1wiO1xuaW1wb3J0IGNvbnRhaW5zIGZyb20gXCIuL2NvbnRhaW5zLmpzXCI7XG5pbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4vZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCByZWN0VG9DbGllbnRSZWN0IGZyb20gXCIuLi91dGlscy9yZWN0VG9DbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgeyBtYXgsIG1pbiB9IGZyb20gXCIuLi91dGlscy9tYXRoLmpzXCI7XG5cbmZ1bmN0aW9uIGdldElubmVyQm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQpIHtcbiAgdmFyIHJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCk7XG4gIHJlY3QudG9wID0gcmVjdC50b3AgKyBlbGVtZW50LmNsaWVudFRvcDtcbiAgcmVjdC5sZWZ0ID0gcmVjdC5sZWZ0ICsgZWxlbWVudC5jbGllbnRMZWZ0O1xuICByZWN0LmJvdHRvbSA9IHJlY3QudG9wICsgZWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gIHJlY3QucmlnaHQgPSByZWN0LmxlZnQgKyBlbGVtZW50LmNsaWVudFdpZHRoO1xuICByZWN0LndpZHRoID0gZWxlbWVudC5jbGllbnRXaWR0aDtcbiAgcmVjdC5oZWlnaHQgPSBlbGVtZW50LmNsaWVudEhlaWdodDtcbiAgcmVjdC54ID0gcmVjdC5sZWZ0O1xuICByZWN0LnkgPSByZWN0LnRvcDtcbiAgcmV0dXJuIHJlY3Q7XG59XG5cbmZ1bmN0aW9uIGdldENsaWVudFJlY3RGcm9tTWl4ZWRUeXBlKGVsZW1lbnQsIGNsaXBwaW5nUGFyZW50KSB7XG4gIHJldHVybiBjbGlwcGluZ1BhcmVudCA9PT0gdmlld3BvcnQgPyByZWN0VG9DbGllbnRSZWN0KGdldFZpZXdwb3J0UmVjdChlbGVtZW50KSkgOiBpc0hUTUxFbGVtZW50KGNsaXBwaW5nUGFyZW50KSA/IGdldElubmVyQm91bmRpbmdDbGllbnRSZWN0KGNsaXBwaW5nUGFyZW50KSA6IHJlY3RUb0NsaWVudFJlY3QoZ2V0RG9jdW1lbnRSZWN0KGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSkpO1xufSAvLyBBIFwiY2xpcHBpbmcgcGFyZW50XCIgaXMgYW4gb3ZlcmZsb3dhYmxlIGNvbnRhaW5lciB3aXRoIHRoZSBjaGFyYWN0ZXJpc3RpYyBvZlxuLy8gY2xpcHBpbmcgKG9yIGhpZGluZykgb3ZlcmZsb3dpbmcgZWxlbWVudHMgd2l0aCBhIHBvc2l0aW9uIGRpZmZlcmVudCBmcm9tXG4vLyBgaW5pdGlhbGBcblxuXG5mdW5jdGlvbiBnZXRDbGlwcGluZ1BhcmVudHMoZWxlbWVudCkge1xuICB2YXIgY2xpcHBpbmdQYXJlbnRzID0gbGlzdFNjcm9sbFBhcmVudHMoZ2V0UGFyZW50Tm9kZShlbGVtZW50KSk7XG4gIHZhciBjYW5Fc2NhcGVDbGlwcGluZyA9IFsnYWJzb2x1dGUnLCAnZml4ZWQnXS5pbmRleE9mKGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkucG9zaXRpb24pID49IDA7XG4gIHZhciBjbGlwcGVyRWxlbWVudCA9IGNhbkVzY2FwZUNsaXBwaW5nICYmIGlzSFRNTEVsZW1lbnQoZWxlbWVudCkgPyBnZXRPZmZzZXRQYXJlbnQoZWxlbWVudCkgOiBlbGVtZW50O1xuXG4gIGlmICghaXNFbGVtZW50KGNsaXBwZXJFbGVtZW50KSkge1xuICAgIHJldHVybiBbXTtcbiAgfSAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1yZXR1cm5dOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmxvdy9pc3N1ZXMvMTQxNFxuXG5cbiAgcmV0dXJuIGNsaXBwaW5nUGFyZW50cy5maWx0ZXIoZnVuY3Rpb24gKGNsaXBwaW5nUGFyZW50KSB7XG4gICAgcmV0dXJuIGlzRWxlbWVudChjbGlwcGluZ1BhcmVudCkgJiYgY29udGFpbnMoY2xpcHBpbmdQYXJlbnQsIGNsaXBwZXJFbGVtZW50KSAmJiBnZXROb2RlTmFtZShjbGlwcGluZ1BhcmVudCkgIT09ICdib2R5JztcbiAgfSk7XG59IC8vIEdldHMgdGhlIG1heGltdW0gYXJlYSB0aGF0IHRoZSBlbGVtZW50IGlzIHZpc2libGUgaW4gZHVlIHRvIGFueSBudW1iZXIgb2Zcbi8vIGNsaXBwaW5nIHBhcmVudHNcblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRDbGlwcGluZ1JlY3QoZWxlbWVudCwgYm91bmRhcnksIHJvb3RCb3VuZGFyeSkge1xuICB2YXIgbWFpbkNsaXBwaW5nUGFyZW50cyA9IGJvdW5kYXJ5ID09PSAnY2xpcHBpbmdQYXJlbnRzJyA/IGdldENsaXBwaW5nUGFyZW50cyhlbGVtZW50KSA6IFtdLmNvbmNhdChib3VuZGFyeSk7XG4gIHZhciBjbGlwcGluZ1BhcmVudHMgPSBbXS5jb25jYXQobWFpbkNsaXBwaW5nUGFyZW50cywgW3Jvb3RCb3VuZGFyeV0pO1xuICB2YXIgZmlyc3RDbGlwcGluZ1BhcmVudCA9IGNsaXBwaW5nUGFyZW50c1swXTtcbiAgdmFyIGNsaXBwaW5nUmVjdCA9IGNsaXBwaW5nUGFyZW50cy5yZWR1Y2UoZnVuY3Rpb24gKGFjY1JlY3QsIGNsaXBwaW5nUGFyZW50KSB7XG4gICAgdmFyIHJlY3QgPSBnZXRDbGllbnRSZWN0RnJvbU1peGVkVHlwZShlbGVtZW50LCBjbGlwcGluZ1BhcmVudCk7XG4gICAgYWNjUmVjdC50b3AgPSBtYXgocmVjdC50b3AsIGFjY1JlY3QudG9wKTtcbiAgICBhY2NSZWN0LnJpZ2h0ID0gbWluKHJlY3QucmlnaHQsIGFjY1JlY3QucmlnaHQpO1xuICAgIGFjY1JlY3QuYm90dG9tID0gbWluKHJlY3QuYm90dG9tLCBhY2NSZWN0LmJvdHRvbSk7XG4gICAgYWNjUmVjdC5sZWZ0ID0gbWF4KHJlY3QubGVmdCwgYWNjUmVjdC5sZWZ0KTtcbiAgICByZXR1cm4gYWNjUmVjdDtcbiAgfSwgZ2V0Q2xpZW50UmVjdEZyb21NaXhlZFR5cGUoZWxlbWVudCwgZmlyc3RDbGlwcGluZ1BhcmVudCkpO1xuICBjbGlwcGluZ1JlY3Qud2lkdGggPSBjbGlwcGluZ1JlY3QucmlnaHQgLSBjbGlwcGluZ1JlY3QubGVmdDtcbiAgY2xpcHBpbmdSZWN0LmhlaWdodCA9IGNsaXBwaW5nUmVjdC5ib3R0b20gLSBjbGlwcGluZ1JlY3QudG9wO1xuICBjbGlwcGluZ1JlY3QueCA9IGNsaXBwaW5nUmVjdC5sZWZ0O1xuICBjbGlwcGluZ1JlY3QueSA9IGNsaXBwaW5nUmVjdC50b3A7XG4gIHJldHVybiBjbGlwcGluZ1JlY3Q7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnNwbGl0KCctJylbMV07XG59IiwiaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4vZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldFZhcmlhdGlvbiBmcm9tIFwiLi9nZXRWYXJpYXRpb24uanNcIjtcbmltcG9ydCBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQgZnJvbSBcIi4vZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgeyB0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQsIHN0YXJ0LCBlbmQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbXB1dGVPZmZzZXRzKF9yZWYpIHtcbiAgdmFyIHJlZmVyZW5jZSA9IF9yZWYucmVmZXJlbmNlLFxuICAgICAgZWxlbWVudCA9IF9yZWYuZWxlbWVudCxcbiAgICAgIHBsYWNlbWVudCA9IF9yZWYucGxhY2VtZW50O1xuICB2YXIgYmFzZVBsYWNlbWVudCA9IHBsYWNlbWVudCA/IGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KSA6IG51bGw7XG4gIHZhciB2YXJpYXRpb24gPSBwbGFjZW1lbnQgPyBnZXRWYXJpYXRpb24ocGxhY2VtZW50KSA6IG51bGw7XG4gIHZhciBjb21tb25YID0gcmVmZXJlbmNlLnggKyByZWZlcmVuY2Uud2lkdGggLyAyIC0gZWxlbWVudC53aWR0aCAvIDI7XG4gIHZhciBjb21tb25ZID0gcmVmZXJlbmNlLnkgKyByZWZlcmVuY2UuaGVpZ2h0IC8gMiAtIGVsZW1lbnQuaGVpZ2h0IC8gMjtcbiAgdmFyIG9mZnNldHM7XG5cbiAgc3dpdGNoIChiYXNlUGxhY2VtZW50KSB7XG4gICAgY2FzZSB0b3A6XG4gICAgICBvZmZzZXRzID0ge1xuICAgICAgICB4OiBjb21tb25YLFxuICAgICAgICB5OiByZWZlcmVuY2UueSAtIGVsZW1lbnQuaGVpZ2h0XG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIGJvdHRvbTpcbiAgICAgIG9mZnNldHMgPSB7XG4gICAgICAgIHg6IGNvbW1vblgsXG4gICAgICAgIHk6IHJlZmVyZW5jZS55ICsgcmVmZXJlbmNlLmhlaWdodFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSByaWdodDpcbiAgICAgIG9mZnNldHMgPSB7XG4gICAgICAgIHg6IHJlZmVyZW5jZS54ICsgcmVmZXJlbmNlLndpZHRoLFxuICAgICAgICB5OiBjb21tb25ZXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIGxlZnQ6XG4gICAgICBvZmZzZXRzID0ge1xuICAgICAgICB4OiByZWZlcmVuY2UueCAtIGVsZW1lbnQud2lkdGgsXG4gICAgICAgIHk6IGNvbW1vbllcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBvZmZzZXRzID0ge1xuICAgICAgICB4OiByZWZlcmVuY2UueCxcbiAgICAgICAgeTogcmVmZXJlbmNlLnlcbiAgICAgIH07XG4gIH1cblxuICB2YXIgbWFpbkF4aXMgPSBiYXNlUGxhY2VtZW50ID8gZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50KGJhc2VQbGFjZW1lbnQpIDogbnVsbDtcblxuICBpZiAobWFpbkF4aXMgIT0gbnVsbCkge1xuICAgIHZhciBsZW4gPSBtYWluQXhpcyA9PT0gJ3knID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xuXG4gICAgc3dpdGNoICh2YXJpYXRpb24pIHtcbiAgICAgIGNhc2Ugc3RhcnQ6XG4gICAgICAgIG9mZnNldHNbbWFpbkF4aXNdID0gb2Zmc2V0c1ttYWluQXhpc10gLSAocmVmZXJlbmNlW2xlbl0gLyAyIC0gZWxlbWVudFtsZW5dIC8gMik7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIGVuZDpcbiAgICAgICAgb2Zmc2V0c1ttYWluQXhpc10gPSBvZmZzZXRzW21haW5BeGlzXSArIChyZWZlcmVuY2VbbGVuXSAvIDIgLSBlbGVtZW50W2xlbl0gLyAyKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9mZnNldHM7XG59IiwiaW1wb3J0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldEJvdW5kaW5nQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IGdldENsaXBwaW5nUmVjdCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldENsaXBwaW5nUmVjdC5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGNvbXB1dGVPZmZzZXRzIGZyb20gXCIuL2NvbXB1dGVPZmZzZXRzLmpzXCI7XG5pbXBvcnQgcmVjdFRvQ2xpZW50UmVjdCBmcm9tIFwiLi9yZWN0VG9DbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgeyBjbGlwcGluZ1BhcmVudHMsIHJlZmVyZW5jZSwgcG9wcGVyLCBib3R0b20sIHRvcCwgcmlnaHQsIGJhc2VQbGFjZW1lbnRzLCB2aWV3cG9ydCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IHsgaXNFbGVtZW50IH0gZnJvbSBcIi4uL2RvbS11dGlscy9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgbWVyZ2VQYWRkaW5nT2JqZWN0IGZyb20gXCIuL21lcmdlUGFkZGluZ09iamVjdC5qc1wiO1xuaW1wb3J0IGV4cGFuZFRvSGFzaE1hcCBmcm9tIFwiLi9leHBhbmRUb0hhc2hNYXAuanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgdmFyIF9vcHRpb25zID0gb3B0aW9ucyxcbiAgICAgIF9vcHRpb25zJHBsYWNlbWVudCA9IF9vcHRpb25zLnBsYWNlbWVudCxcbiAgICAgIHBsYWNlbWVudCA9IF9vcHRpb25zJHBsYWNlbWVudCA9PT0gdm9pZCAwID8gc3RhdGUucGxhY2VtZW50IDogX29wdGlvbnMkcGxhY2VtZW50LFxuICAgICAgX29wdGlvbnMkYm91bmRhcnkgPSBfb3B0aW9ucy5ib3VuZGFyeSxcbiAgICAgIGJvdW5kYXJ5ID0gX29wdGlvbnMkYm91bmRhcnkgPT09IHZvaWQgMCA/IGNsaXBwaW5nUGFyZW50cyA6IF9vcHRpb25zJGJvdW5kYXJ5LFxuICAgICAgX29wdGlvbnMkcm9vdEJvdW5kYXJ5ID0gX29wdGlvbnMucm9vdEJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5ID0gX29wdGlvbnMkcm9vdEJvdW5kYXJ5ID09PSB2b2lkIDAgPyB2aWV3cG9ydCA6IF9vcHRpb25zJHJvb3RCb3VuZGFyeSxcbiAgICAgIF9vcHRpb25zJGVsZW1lbnRDb250ZSA9IF9vcHRpb25zLmVsZW1lbnRDb250ZXh0LFxuICAgICAgZWxlbWVudENvbnRleHQgPSBfb3B0aW9ucyRlbGVtZW50Q29udGUgPT09IHZvaWQgMCA/IHBvcHBlciA6IF9vcHRpb25zJGVsZW1lbnRDb250ZSxcbiAgICAgIF9vcHRpb25zJGFsdEJvdW5kYXJ5ID0gX29wdGlvbnMuYWx0Qm91bmRhcnksXG4gICAgICBhbHRCb3VuZGFyeSA9IF9vcHRpb25zJGFsdEJvdW5kYXJ5ID09PSB2b2lkIDAgPyBmYWxzZSA6IF9vcHRpb25zJGFsdEJvdW5kYXJ5LFxuICAgICAgX29wdGlvbnMkcGFkZGluZyA9IF9vcHRpb25zLnBhZGRpbmcsXG4gICAgICBwYWRkaW5nID0gX29wdGlvbnMkcGFkZGluZyA9PT0gdm9pZCAwID8gMCA6IF9vcHRpb25zJHBhZGRpbmc7XG4gIHZhciBwYWRkaW5nT2JqZWN0ID0gbWVyZ2VQYWRkaW5nT2JqZWN0KHR5cGVvZiBwYWRkaW5nICE9PSAnbnVtYmVyJyA/IHBhZGRpbmcgOiBleHBhbmRUb0hhc2hNYXAocGFkZGluZywgYmFzZVBsYWNlbWVudHMpKTtcbiAgdmFyIGFsdENvbnRleHQgPSBlbGVtZW50Q29udGV4dCA9PT0gcG9wcGVyID8gcmVmZXJlbmNlIDogcG9wcGVyO1xuICB2YXIgcmVmZXJlbmNlRWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzLnJlZmVyZW5jZTtcbiAgdmFyIHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIHZhciBlbGVtZW50ID0gc3RhdGUuZWxlbWVudHNbYWx0Qm91bmRhcnkgPyBhbHRDb250ZXh0IDogZWxlbWVudENvbnRleHRdO1xuICB2YXIgY2xpcHBpbmdDbGllbnRSZWN0ID0gZ2V0Q2xpcHBpbmdSZWN0KGlzRWxlbWVudChlbGVtZW50KSA/IGVsZW1lbnQgOiBlbGVtZW50LmNvbnRleHRFbGVtZW50IHx8IGdldERvY3VtZW50RWxlbWVudChzdGF0ZS5lbGVtZW50cy5wb3BwZXIpLCBib3VuZGFyeSwgcm9vdEJvdW5kYXJ5KTtcbiAgdmFyIHJlZmVyZW5jZUNsaWVudFJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QocmVmZXJlbmNlRWxlbWVudCk7XG4gIHZhciBwb3BwZXJPZmZzZXRzID0gY29tcHV0ZU9mZnNldHMoe1xuICAgIHJlZmVyZW5jZTogcmVmZXJlbmNlQ2xpZW50UmVjdCxcbiAgICBlbGVtZW50OiBwb3BwZXJSZWN0LFxuICAgIHN0cmF0ZWd5OiAnYWJzb2x1dGUnLFxuICAgIHBsYWNlbWVudDogcGxhY2VtZW50XG4gIH0pO1xuICB2YXIgcG9wcGVyQ2xpZW50UmVjdCA9IHJlY3RUb0NsaWVudFJlY3QoT2JqZWN0LmFzc2lnbih7fSwgcG9wcGVyUmVjdCwgcG9wcGVyT2Zmc2V0cykpO1xuICB2YXIgZWxlbWVudENsaWVudFJlY3QgPSBlbGVtZW50Q29udGV4dCA9PT0gcG9wcGVyID8gcG9wcGVyQ2xpZW50UmVjdCA6IHJlZmVyZW5jZUNsaWVudFJlY3Q7IC8vIHBvc2l0aXZlID0gb3ZlcmZsb3dpbmcgdGhlIGNsaXBwaW5nIHJlY3RcbiAgLy8gMCBvciBuZWdhdGl2ZSA9IHdpdGhpbiB0aGUgY2xpcHBpbmcgcmVjdFxuXG4gIHZhciBvdmVyZmxvd09mZnNldHMgPSB7XG4gICAgdG9wOiBjbGlwcGluZ0NsaWVudFJlY3QudG9wIC0gZWxlbWVudENsaWVudFJlY3QudG9wICsgcGFkZGluZ09iamVjdC50b3AsXG4gICAgYm90dG9tOiBlbGVtZW50Q2xpZW50UmVjdC5ib3R0b20gLSBjbGlwcGluZ0NsaWVudFJlY3QuYm90dG9tICsgcGFkZGluZ09iamVjdC5ib3R0b20sXG4gICAgbGVmdDogY2xpcHBpbmdDbGllbnRSZWN0LmxlZnQgLSBlbGVtZW50Q2xpZW50UmVjdC5sZWZ0ICsgcGFkZGluZ09iamVjdC5sZWZ0LFxuICAgIHJpZ2h0OiBlbGVtZW50Q2xpZW50UmVjdC5yaWdodCAtIGNsaXBwaW5nQ2xpZW50UmVjdC5yaWdodCArIHBhZGRpbmdPYmplY3QucmlnaHRcbiAgfTtcbiAgdmFyIG9mZnNldERhdGEgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLm9mZnNldDsgLy8gT2Zmc2V0cyBjYW4gYmUgYXBwbGllZCBvbmx5IHRvIHRoZSBwb3BwZXIgZWxlbWVudFxuXG4gIGlmIChlbGVtZW50Q29udGV4dCA9PT0gcG9wcGVyICYmIG9mZnNldERhdGEpIHtcbiAgICB2YXIgb2Zmc2V0ID0gb2Zmc2V0RGF0YVtwbGFjZW1lbnRdO1xuICAgIE9iamVjdC5rZXlzKG92ZXJmbG93T2Zmc2V0cykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICB2YXIgbXVsdGlwbHkgPSBbcmlnaHQsIGJvdHRvbV0uaW5kZXhPZihrZXkpID49IDAgPyAxIDogLTE7XG4gICAgICB2YXIgYXhpcyA9IFt0b3AsIGJvdHRvbV0uaW5kZXhPZihrZXkpID49IDAgPyAneScgOiAneCc7XG4gICAgICBvdmVyZmxvd09mZnNldHNba2V5XSArPSBvZmZzZXRbYXhpc10gKiBtdWx0aXBseTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBvdmVyZmxvd09mZnNldHM7XG59IiwiaW1wb3J0IGdldFZhcmlhdGlvbiBmcm9tIFwiLi9nZXRWYXJpYXRpb24uanNcIjtcbmltcG9ydCB7IHZhcmlhdGlvblBsYWNlbWVudHMsIGJhc2VQbGFjZW1lbnRzLCBwbGFjZW1lbnRzIGFzIGFsbFBsYWNlbWVudHMgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBkZXRlY3RPdmVyZmxvdyBmcm9tIFwiLi9kZXRlY3RPdmVyZmxvdy5qc1wiO1xuaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4vZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29tcHV0ZUF1dG9QbGFjZW1lbnQoc3RhdGUsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIHZhciBfb3B0aW9ucyA9IG9wdGlvbnMsXG4gICAgICBwbGFjZW1lbnQgPSBfb3B0aW9ucy5wbGFjZW1lbnQsXG4gICAgICBib3VuZGFyeSA9IF9vcHRpb25zLmJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5ID0gX29wdGlvbnMucm9vdEJvdW5kYXJ5LFxuICAgICAgcGFkZGluZyA9IF9vcHRpb25zLnBhZGRpbmcsXG4gICAgICBmbGlwVmFyaWF0aW9ucyA9IF9vcHRpb25zLmZsaXBWYXJpYXRpb25zLFxuICAgICAgX29wdGlvbnMkYWxsb3dlZEF1dG9QID0gX29wdGlvbnMuYWxsb3dlZEF1dG9QbGFjZW1lbnRzLFxuICAgICAgYWxsb3dlZEF1dG9QbGFjZW1lbnRzID0gX29wdGlvbnMkYWxsb3dlZEF1dG9QID09PSB2b2lkIDAgPyBhbGxQbGFjZW1lbnRzIDogX29wdGlvbnMkYWxsb3dlZEF1dG9QO1xuICB2YXIgdmFyaWF0aW9uID0gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCk7XG4gIHZhciBwbGFjZW1lbnRzID0gdmFyaWF0aW9uID8gZmxpcFZhcmlhdGlvbnMgPyB2YXJpYXRpb25QbGFjZW1lbnRzIDogdmFyaWF0aW9uUGxhY2VtZW50cy5maWx0ZXIoZnVuY3Rpb24gKHBsYWNlbWVudCkge1xuICAgIHJldHVybiBnZXRWYXJpYXRpb24ocGxhY2VtZW50KSA9PT0gdmFyaWF0aW9uO1xuICB9KSA6IGJhc2VQbGFjZW1lbnRzO1xuICB2YXIgYWxsb3dlZFBsYWNlbWVudHMgPSBwbGFjZW1lbnRzLmZpbHRlcihmdW5jdGlvbiAocGxhY2VtZW50KSB7XG4gICAgcmV0dXJuIGFsbG93ZWRBdXRvUGxhY2VtZW50cy5pbmRleE9mKHBsYWNlbWVudCkgPj0gMDtcbiAgfSk7XG5cbiAgaWYgKGFsbG93ZWRQbGFjZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIGFsbG93ZWRQbGFjZW1lbnRzID0gcGxhY2VtZW50cztcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoWydQb3BwZXI6IFRoZSBgYWxsb3dlZEF1dG9QbGFjZW1lbnRzYCBvcHRpb24gZGlkIG5vdCBhbGxvdyBhbnknLCAncGxhY2VtZW50cy4gRW5zdXJlIHRoZSBgcGxhY2VtZW50YCBvcHRpb24gbWF0Y2hlcyB0aGUgdmFyaWF0aW9uJywgJ29mIHRoZSBhbGxvd2VkIHBsYWNlbWVudHMuJywgJ0ZvciBleGFtcGxlLCBcImF1dG9cIiBjYW5ub3QgYmUgdXNlZCB0byBhbGxvdyBcImJvdHRvbS1zdGFydFwiLicsICdVc2UgXCJhdXRvLXN0YXJ0XCIgaW5zdGVhZC4nXS5qb2luKCcgJykpO1xuICAgIH1cbiAgfSAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS10eXBlXTogRmxvdyBzZWVtcyB0byBoYXZlIHByb2JsZW1zIHdpdGggdHdvIGFycmF5IHVuaW9ucy4uLlxuXG5cbiAgdmFyIG92ZXJmbG93cyA9IGFsbG93ZWRQbGFjZW1lbnRzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgICBhY2NbcGxhY2VtZW50XSA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudCxcbiAgICAgIGJvdW5kYXJ5OiBib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeTogcm9vdEJvdW5kYXJ5LFxuICAgICAgcGFkZGluZzogcGFkZGluZ1xuICAgIH0pW2dldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KV07XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30pO1xuICByZXR1cm4gT2JqZWN0LmtleXMob3ZlcmZsb3dzKS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIG92ZXJmbG93c1thXSAtIG92ZXJmbG93c1tiXTtcbiAgfSk7XG59IiwiaW1wb3J0IGdldE9wcG9zaXRlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRPcHBvc2l0ZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0T3Bwb3NpdGVWYXJpYXRpb25QbGFjZW1lbnQuanNcIjtcbmltcG9ydCBkZXRlY3RPdmVyZmxvdyBmcm9tIFwiLi4vdXRpbHMvZGV0ZWN0T3ZlcmZsb3cuanNcIjtcbmltcG9ydCBjb21wdXRlQXV0b1BsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvY29tcHV0ZUF1dG9QbGFjZW1lbnQuanNcIjtcbmltcG9ydCB7IGJvdHRvbSwgdG9wLCBzdGFydCwgcmlnaHQsIGxlZnQsIGF1dG8gfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4uL3V0aWxzL2dldFZhcmlhdGlvbi5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmZ1bmN0aW9uIGdldEV4cGFuZGVkRmFsbGJhY2tQbGFjZW1lbnRzKHBsYWNlbWVudCkge1xuICBpZiAoZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpID09PSBhdXRvKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgdmFyIG9wcG9zaXRlUGxhY2VtZW50ID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocGxhY2VtZW50KTtcbiAgcmV0dXJuIFtnZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudChwbGFjZW1lbnQpLCBvcHBvc2l0ZVBsYWNlbWVudCwgZ2V0T3Bwb3NpdGVWYXJpYXRpb25QbGFjZW1lbnQob3Bwb3NpdGVQbGFjZW1lbnQpXTtcbn1cblxuZnVuY3Rpb24gZmxpcChfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZi5vcHRpb25zLFxuICAgICAgbmFtZSA9IF9yZWYubmFtZTtcblxuICBpZiAoc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXS5fc2tpcCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBfb3B0aW9ucyRtYWluQXhpcyA9IG9wdGlvbnMubWFpbkF4aXMsXG4gICAgICBjaGVja01haW5BeGlzID0gX29wdGlvbnMkbWFpbkF4aXMgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRtYWluQXhpcyxcbiAgICAgIF9vcHRpb25zJGFsdEF4aXMgPSBvcHRpb25zLmFsdEF4aXMsXG4gICAgICBjaGVja0FsdEF4aXMgPSBfb3B0aW9ucyRhbHRBeGlzID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkYWx0QXhpcyxcbiAgICAgIHNwZWNpZmllZEZhbGxiYWNrUGxhY2VtZW50cyA9IG9wdGlvbnMuZmFsbGJhY2tQbGFjZW1lbnRzLFxuICAgICAgcGFkZGluZyA9IG9wdGlvbnMucGFkZGluZyxcbiAgICAgIGJvdW5kYXJ5ID0gb3B0aW9ucy5ib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeSA9IG9wdGlvbnMucm9vdEJvdW5kYXJ5LFxuICAgICAgYWx0Qm91bmRhcnkgPSBvcHRpb25zLmFsdEJvdW5kYXJ5LFxuICAgICAgX29wdGlvbnMkZmxpcFZhcmlhdGlvID0gb3B0aW9ucy5mbGlwVmFyaWF0aW9ucyxcbiAgICAgIGZsaXBWYXJpYXRpb25zID0gX29wdGlvbnMkZmxpcFZhcmlhdGlvID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkZmxpcFZhcmlhdGlvLFxuICAgICAgYWxsb3dlZEF1dG9QbGFjZW1lbnRzID0gb3B0aW9ucy5hbGxvd2VkQXV0b1BsYWNlbWVudHM7XG4gIHZhciBwcmVmZXJyZWRQbGFjZW1lbnQgPSBzdGF0ZS5vcHRpb25zLnBsYWNlbWVudDtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHByZWZlcnJlZFBsYWNlbWVudCk7XG4gIHZhciBpc0Jhc2VQbGFjZW1lbnQgPSBiYXNlUGxhY2VtZW50ID09PSBwcmVmZXJyZWRQbGFjZW1lbnQ7XG4gIHZhciBmYWxsYmFja1BsYWNlbWVudHMgPSBzcGVjaWZpZWRGYWxsYmFja1BsYWNlbWVudHMgfHwgKGlzQmFzZVBsYWNlbWVudCB8fCAhZmxpcFZhcmlhdGlvbnMgPyBbZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocHJlZmVycmVkUGxhY2VtZW50KV0gOiBnZXRFeHBhbmRlZEZhbGxiYWNrUGxhY2VtZW50cyhwcmVmZXJyZWRQbGFjZW1lbnQpKTtcbiAgdmFyIHBsYWNlbWVudHMgPSBbcHJlZmVycmVkUGxhY2VtZW50XS5jb25jYXQoZmFsbGJhY2tQbGFjZW1lbnRzKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGxhY2VtZW50KSB7XG4gICAgcmV0dXJuIGFjYy5jb25jYXQoZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpID09PSBhdXRvID8gY29tcHV0ZUF1dG9QbGFjZW1lbnQoc3RhdGUsIHtcbiAgICAgIHBsYWNlbWVudDogcGxhY2VtZW50LFxuICAgICAgYm91bmRhcnk6IGJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5OiByb290Qm91bmRhcnksXG4gICAgICBwYWRkaW5nOiBwYWRkaW5nLFxuICAgICAgZmxpcFZhcmlhdGlvbnM6IGZsaXBWYXJpYXRpb25zLFxuICAgICAgYWxsb3dlZEF1dG9QbGFjZW1lbnRzOiBhbGxvd2VkQXV0b1BsYWNlbWVudHNcbiAgICB9KSA6IHBsYWNlbWVudCk7XG4gIH0sIFtdKTtcbiAgdmFyIHJlZmVyZW5jZVJlY3QgPSBzdGF0ZS5yZWN0cy5yZWZlcmVuY2U7XG4gIHZhciBwb3BwZXJSZWN0ID0gc3RhdGUucmVjdHMucG9wcGVyO1xuICB2YXIgY2hlY2tzTWFwID0gbmV3IE1hcCgpO1xuICB2YXIgbWFrZUZhbGxiYWNrQ2hlY2tzID0gdHJ1ZTtcbiAgdmFyIGZpcnN0Rml0dGluZ1BsYWNlbWVudCA9IHBsYWNlbWVudHNbMF07XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwbGFjZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHBsYWNlbWVudCA9IHBsYWNlbWVudHNbaV07XG5cbiAgICB2YXIgX2Jhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCk7XG5cbiAgICB2YXIgaXNTdGFydFZhcmlhdGlvbiA9IGdldFZhcmlhdGlvbihwbGFjZW1lbnQpID09PSBzdGFydDtcbiAgICB2YXIgaXNWZXJ0aWNhbCA9IFt0b3AsIGJvdHRvbV0uaW5kZXhPZihfYmFzZVBsYWNlbWVudCkgPj0gMDtcbiAgICB2YXIgbGVuID0gaXNWZXJ0aWNhbCA/ICd3aWR0aCcgOiAnaGVpZ2h0JztcbiAgICB2YXIgb3ZlcmZsb3cgPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgICAgcGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgICBib3VuZGFyeTogYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnk6IHJvb3RCb3VuZGFyeSxcbiAgICAgIGFsdEJvdW5kYXJ5OiBhbHRCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmc6IHBhZGRpbmdcbiAgICB9KTtcbiAgICB2YXIgbWFpblZhcmlhdGlvblNpZGUgPSBpc1ZlcnRpY2FsID8gaXNTdGFydFZhcmlhdGlvbiA/IHJpZ2h0IDogbGVmdCA6IGlzU3RhcnRWYXJpYXRpb24gPyBib3R0b20gOiB0b3A7XG5cbiAgICBpZiAocmVmZXJlbmNlUmVjdFtsZW5dID4gcG9wcGVyUmVjdFtsZW5dKSB7XG4gICAgICBtYWluVmFyaWF0aW9uU2lkZSA9IGdldE9wcG9zaXRlUGxhY2VtZW50KG1haW5WYXJpYXRpb25TaWRlKTtcbiAgICB9XG5cbiAgICB2YXIgYWx0VmFyaWF0aW9uU2lkZSA9IGdldE9wcG9zaXRlUGxhY2VtZW50KG1haW5WYXJpYXRpb25TaWRlKTtcbiAgICB2YXIgY2hlY2tzID0gW107XG5cbiAgICBpZiAoY2hlY2tNYWluQXhpcykge1xuICAgICAgY2hlY2tzLnB1c2gob3ZlcmZsb3dbX2Jhc2VQbGFjZW1lbnRdIDw9IDApO1xuICAgIH1cblxuICAgIGlmIChjaGVja0FsdEF4aXMpIHtcbiAgICAgIGNoZWNrcy5wdXNoKG92ZXJmbG93W21haW5WYXJpYXRpb25TaWRlXSA8PSAwLCBvdmVyZmxvd1thbHRWYXJpYXRpb25TaWRlXSA8PSAwKTtcbiAgICB9XG5cbiAgICBpZiAoY2hlY2tzLmV2ZXJ5KGZ1bmN0aW9uIChjaGVjaykge1xuICAgICAgcmV0dXJuIGNoZWNrO1xuICAgIH0pKSB7XG4gICAgICBmaXJzdEZpdHRpbmdQbGFjZW1lbnQgPSBwbGFjZW1lbnQ7XG4gICAgICBtYWtlRmFsbGJhY2tDaGVja3MgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNoZWNrc01hcC5zZXQocGxhY2VtZW50LCBjaGVja3MpO1xuICB9XG5cbiAgaWYgKG1ha2VGYWxsYmFja0NoZWNrcykge1xuICAgIC8vIGAyYCBtYXkgYmUgZGVzaXJlZCBpbiBzb21lIGNhc2VzIOKAkyByZXNlYXJjaCBsYXRlclxuICAgIHZhciBudW1iZXJPZkNoZWNrcyA9IGZsaXBWYXJpYXRpb25zID8gMyA6IDE7XG5cbiAgICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcChfaSkge1xuICAgICAgdmFyIGZpdHRpbmdQbGFjZW1lbnQgPSBwbGFjZW1lbnRzLmZpbmQoZnVuY3Rpb24gKHBsYWNlbWVudCkge1xuICAgICAgICB2YXIgY2hlY2tzID0gY2hlY2tzTWFwLmdldChwbGFjZW1lbnQpO1xuXG4gICAgICAgIGlmIChjaGVja3MpIHtcbiAgICAgICAgICByZXR1cm4gY2hlY2tzLnNsaWNlKDAsIF9pKS5ldmVyeShmdW5jdGlvbiAoY2hlY2spIHtcbiAgICAgICAgICAgIHJldHVybiBjaGVjaztcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChmaXR0aW5nUGxhY2VtZW50KSB7XG4gICAgICAgIGZpcnN0Rml0dGluZ1BsYWNlbWVudCA9IGZpdHRpbmdQbGFjZW1lbnQ7XG4gICAgICAgIHJldHVybiBcImJyZWFrXCI7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZvciAodmFyIF9pID0gbnVtYmVyT2ZDaGVja3M7IF9pID4gMDsgX2ktLSkge1xuICAgICAgdmFyIF9yZXQgPSBfbG9vcChfaSk7XG5cbiAgICAgIGlmIChfcmV0ID09PSBcImJyZWFrXCIpIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzdGF0ZS5wbGFjZW1lbnQgIT09IGZpcnN0Rml0dGluZ1BsYWNlbWVudCkge1xuICAgIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0uX3NraXAgPSB0cnVlO1xuICAgIHN0YXRlLnBsYWNlbWVudCA9IGZpcnN0Rml0dGluZ1BsYWNlbWVudDtcbiAgICBzdGF0ZS5yZXNldCA9IHRydWU7XG4gIH1cbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ2ZsaXAnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICBmbjogZmxpcCxcbiAgcmVxdWlyZXNJZkV4aXN0czogWydvZmZzZXQnXSxcbiAgZGF0YToge1xuICAgIF9za2lwOiBmYWxzZVxuICB9XG59OyIsImltcG9ydCB7IHRvcCwgYm90dG9tLCBsZWZ0LCByaWdodCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGRldGVjdE92ZXJmbG93IGZyb20gXCIuLi91dGlscy9kZXRlY3RPdmVyZmxvdy5qc1wiO1xuXG5mdW5jdGlvbiBnZXRTaWRlT2Zmc2V0cyhvdmVyZmxvdywgcmVjdCwgcHJldmVudGVkT2Zmc2V0cykge1xuICBpZiAocHJldmVudGVkT2Zmc2V0cyA9PT0gdm9pZCAwKSB7XG4gICAgcHJldmVudGVkT2Zmc2V0cyA9IHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdG9wOiBvdmVyZmxvdy50b3AgLSByZWN0LmhlaWdodCAtIHByZXZlbnRlZE9mZnNldHMueSxcbiAgICByaWdodDogb3ZlcmZsb3cucmlnaHQgLSByZWN0LndpZHRoICsgcHJldmVudGVkT2Zmc2V0cy54LFxuICAgIGJvdHRvbTogb3ZlcmZsb3cuYm90dG9tIC0gcmVjdC5oZWlnaHQgKyBwcmV2ZW50ZWRPZmZzZXRzLnksXG4gICAgbGVmdDogb3ZlcmZsb3cubGVmdCAtIHJlY3Qud2lkdGggLSBwcmV2ZW50ZWRPZmZzZXRzLnhcbiAgfTtcbn1cblxuZnVuY3Rpb24gaXNBbnlTaWRlRnVsbHlDbGlwcGVkKG92ZXJmbG93KSB7XG4gIHJldHVybiBbdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0XS5zb21lKGZ1bmN0aW9uIChzaWRlKSB7XG4gICAgcmV0dXJuIG92ZXJmbG93W3NpZGVdID49IDA7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBoaWRlKF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG5hbWUgPSBfcmVmLm5hbWU7XG4gIHZhciByZWZlcmVuY2VSZWN0ID0gc3RhdGUucmVjdHMucmVmZXJlbmNlO1xuICB2YXIgcG9wcGVyUmVjdCA9IHN0YXRlLnJlY3RzLnBvcHBlcjtcbiAgdmFyIHByZXZlbnRlZE9mZnNldHMgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLnByZXZlbnRPdmVyZmxvdztcbiAgdmFyIHJlZmVyZW5jZU92ZXJmbG93ID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICBlbGVtZW50Q29udGV4dDogJ3JlZmVyZW5jZSdcbiAgfSk7XG4gIHZhciBwb3BwZXJBbHRPdmVyZmxvdyA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgYWx0Qm91bmRhcnk6IHRydWVcbiAgfSk7XG4gIHZhciByZWZlcmVuY2VDbGlwcGluZ09mZnNldHMgPSBnZXRTaWRlT2Zmc2V0cyhyZWZlcmVuY2VPdmVyZmxvdywgcmVmZXJlbmNlUmVjdCk7XG4gIHZhciBwb3BwZXJFc2NhcGVPZmZzZXRzID0gZ2V0U2lkZU9mZnNldHMocG9wcGVyQWx0T3ZlcmZsb3csIHBvcHBlclJlY3QsIHByZXZlbnRlZE9mZnNldHMpO1xuICB2YXIgaXNSZWZlcmVuY2VIaWRkZW4gPSBpc0FueVNpZGVGdWxseUNsaXBwZWQocmVmZXJlbmNlQ2xpcHBpbmdPZmZzZXRzKTtcbiAgdmFyIGhhc1BvcHBlckVzY2FwZWQgPSBpc0FueVNpZGVGdWxseUNsaXBwZWQocG9wcGVyRXNjYXBlT2Zmc2V0cyk7XG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSB7XG4gICAgcmVmZXJlbmNlQ2xpcHBpbmdPZmZzZXRzOiByZWZlcmVuY2VDbGlwcGluZ09mZnNldHMsXG4gICAgcG9wcGVyRXNjYXBlT2Zmc2V0czogcG9wcGVyRXNjYXBlT2Zmc2V0cyxcbiAgICBpc1JlZmVyZW5jZUhpZGRlbjogaXNSZWZlcmVuY2VIaWRkZW4sXG4gICAgaGFzUG9wcGVyRXNjYXBlZDogaGFzUG9wcGVyRXNjYXBlZFxuICB9O1xuICBzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlciA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmF0dHJpYnV0ZXMucG9wcGVyLCB7XG4gICAgJ2RhdGEtcG9wcGVyLXJlZmVyZW5jZS1oaWRkZW4nOiBpc1JlZmVyZW5jZUhpZGRlbixcbiAgICAnZGF0YS1wb3BwZXItZXNjYXBlZCc6IGhhc1BvcHBlckVzY2FwZWRcbiAgfSk7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdoaWRlJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgcmVxdWlyZXNJZkV4aXN0czogWydwcmV2ZW50T3ZlcmZsb3cnXSxcbiAgZm46IGhpZGVcbn07IiwiaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCB7IHRvcCwgbGVmdCwgcmlnaHQsIHBsYWNlbWVudHMgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmV4cG9ydCBmdW5jdGlvbiBkaXN0YW5jZUFuZFNraWRkaW5nVG9YWShwbGFjZW1lbnQsIHJlY3RzLCBvZmZzZXQpIHtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCk7XG4gIHZhciBpbnZlcnREaXN0YW5jZSA9IFtsZWZ0LCB0b3BdLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgPj0gMCA/IC0xIDogMTtcblxuICB2YXIgX3JlZiA9IHR5cGVvZiBvZmZzZXQgPT09ICdmdW5jdGlvbicgPyBvZmZzZXQoT2JqZWN0LmFzc2lnbih7fSwgcmVjdHMsIHtcbiAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudFxuICB9KSkgOiBvZmZzZXQsXG4gICAgICBza2lkZGluZyA9IF9yZWZbMF0sXG4gICAgICBkaXN0YW5jZSA9IF9yZWZbMV07XG5cbiAgc2tpZGRpbmcgPSBza2lkZGluZyB8fCAwO1xuICBkaXN0YW5jZSA9IChkaXN0YW5jZSB8fCAwKSAqIGludmVydERpc3RhbmNlO1xuICByZXR1cm4gW2xlZnQsIHJpZ2h0XS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpID49IDAgPyB7XG4gICAgeDogZGlzdGFuY2UsXG4gICAgeTogc2tpZGRpbmdcbiAgfSA6IHtcbiAgICB4OiBza2lkZGluZyxcbiAgICB5OiBkaXN0YW5jZVxuICB9O1xufVxuXG5mdW5jdGlvbiBvZmZzZXQoX3JlZjIpIHtcbiAgdmFyIHN0YXRlID0gX3JlZjIuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZjIub3B0aW9ucyxcbiAgICAgIG5hbWUgPSBfcmVmMi5uYW1lO1xuICB2YXIgX29wdGlvbnMkb2Zmc2V0ID0gb3B0aW9ucy5vZmZzZXQsXG4gICAgICBvZmZzZXQgPSBfb3B0aW9ucyRvZmZzZXQgPT09IHZvaWQgMCA/IFswLCAwXSA6IF9vcHRpb25zJG9mZnNldDtcbiAgdmFyIGRhdGEgPSBwbGFjZW1lbnRzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgICBhY2NbcGxhY2VtZW50XSA9IGRpc3RhbmNlQW5kU2tpZGRpbmdUb1hZKHBsYWNlbWVudCwgc3RhdGUucmVjdHMsIG9mZnNldCk7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30pO1xuICB2YXIgX2RhdGEkc3RhdGUkcGxhY2VtZW50ID0gZGF0YVtzdGF0ZS5wbGFjZW1lbnRdLFxuICAgICAgeCA9IF9kYXRhJHN0YXRlJHBsYWNlbWVudC54LFxuICAgICAgeSA9IF9kYXRhJHN0YXRlJHBsYWNlbWVudC55O1xuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMgIT0gbnVsbCkge1xuICAgIHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cy54ICs9IHg7XG4gICAgc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzLnkgKz0geTtcbiAgfVxuXG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSBkYXRhO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnb2Zmc2V0JyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgcmVxdWlyZXM6IFsncG9wcGVyT2Zmc2V0cyddLFxuICBmbjogb2Zmc2V0XG59OyIsImltcG9ydCBjb21wdXRlT2Zmc2V0cyBmcm9tIFwiLi4vdXRpbHMvY29tcHV0ZU9mZnNldHMuanNcIjtcblxuZnVuY3Rpb24gcG9wcGVyT2Zmc2V0cyhfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuICAvLyBPZmZzZXRzIGFyZSB0aGUgYWN0dWFsIHBvc2l0aW9uIHRoZSBwb3BwZXIgbmVlZHMgdG8gaGF2ZSB0byBiZVxuICAvLyBwcm9wZXJseSBwb3NpdGlvbmVkIG5lYXIgaXRzIHJlZmVyZW5jZSBlbGVtZW50XG4gIC8vIFRoaXMgaXMgdGhlIG1vc3QgYmFzaWMgcGxhY2VtZW50LCBhbmQgd2lsbCBiZSBhZGp1c3RlZCBieVxuICAvLyB0aGUgbW9kaWZpZXJzIGluIHRoZSBuZXh0IHN0ZXBcbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IGNvbXB1dGVPZmZzZXRzKHtcbiAgICByZWZlcmVuY2U6IHN0YXRlLnJlY3RzLnJlZmVyZW5jZSxcbiAgICBlbGVtZW50OiBzdGF0ZS5yZWN0cy5wb3BwZXIsXG4gICAgc3RyYXRlZ3k6ICdhYnNvbHV0ZScsXG4gICAgcGxhY2VtZW50OiBzdGF0ZS5wbGFjZW1lbnRcbiAgfSk7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdwb3BwZXJPZmZzZXRzJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdyZWFkJyxcbiAgZm46IHBvcHBlck9mZnNldHMsXG4gIGRhdGE6IHt9XG59OyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEFsdEF4aXMoYXhpcykge1xuICByZXR1cm4gYXhpcyA9PT0gJ3gnID8gJ3knIDogJ3gnO1xufSIsImltcG9ydCB7IHRvcCwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgc3RhcnQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRBbHRBeGlzIGZyb20gXCIuLi91dGlscy9nZXRBbHRBeGlzLmpzXCI7XG5pbXBvcnQgd2l0aGluIGZyb20gXCIuLi91dGlscy93aXRoaW4uanNcIjtcbmltcG9ydCBnZXRMYXlvdXRSZWN0IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0TGF5b3V0UmVjdC5qc1wiO1xuaW1wb3J0IGdldE9mZnNldFBhcmVudCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldE9mZnNldFBhcmVudC5qc1wiO1xuaW1wb3J0IGRldGVjdE92ZXJmbG93IGZyb20gXCIuLi91dGlscy9kZXRlY3RPdmVyZmxvdy5qc1wiO1xuaW1wb3J0IGdldFZhcmlhdGlvbiBmcm9tIFwiLi4vdXRpbHMvZ2V0VmFyaWF0aW9uLmpzXCI7XG5pbXBvcnQgZ2V0RnJlc2hTaWRlT2JqZWN0IGZyb20gXCIuLi91dGlscy9nZXRGcmVzaFNpZGVPYmplY3QuanNcIjtcbmltcG9ydCB7IG1heCBhcyBtYXRoTWF4LCBtaW4gYXMgbWF0aE1pbiB9IGZyb20gXCIuLi91dGlscy9tYXRoLmpzXCI7XG5cbmZ1bmN0aW9uIHByZXZlbnRPdmVyZmxvdyhfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZi5vcHRpb25zLFxuICAgICAgbmFtZSA9IF9yZWYubmFtZTtcbiAgdmFyIF9vcHRpb25zJG1haW5BeGlzID0gb3B0aW9ucy5tYWluQXhpcyxcbiAgICAgIGNoZWNrTWFpbkF4aXMgPSBfb3B0aW9ucyRtYWluQXhpcyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJG1haW5BeGlzLFxuICAgICAgX29wdGlvbnMkYWx0QXhpcyA9IG9wdGlvbnMuYWx0QXhpcyxcbiAgICAgIGNoZWNrQWx0QXhpcyA9IF9vcHRpb25zJGFsdEF4aXMgPT09IHZvaWQgMCA/IGZhbHNlIDogX29wdGlvbnMkYWx0QXhpcyxcbiAgICAgIGJvdW5kYXJ5ID0gb3B0aW9ucy5ib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeSA9IG9wdGlvbnMucm9vdEJvdW5kYXJ5LFxuICAgICAgYWx0Qm91bmRhcnkgPSBvcHRpb25zLmFsdEJvdW5kYXJ5LFxuICAgICAgcGFkZGluZyA9IG9wdGlvbnMucGFkZGluZyxcbiAgICAgIF9vcHRpb25zJHRldGhlciA9IG9wdGlvbnMudGV0aGVyLFxuICAgICAgdGV0aGVyID0gX29wdGlvbnMkdGV0aGVyID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkdGV0aGVyLFxuICAgICAgX29wdGlvbnMkdGV0aGVyT2Zmc2V0ID0gb3B0aW9ucy50ZXRoZXJPZmZzZXQsXG4gICAgICB0ZXRoZXJPZmZzZXQgPSBfb3B0aW9ucyR0ZXRoZXJPZmZzZXQgPT09IHZvaWQgMCA/IDAgOiBfb3B0aW9ucyR0ZXRoZXJPZmZzZXQ7XG4gIHZhciBvdmVyZmxvdyA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgYm91bmRhcnk6IGJvdW5kYXJ5LFxuICAgIHJvb3RCb3VuZGFyeTogcm9vdEJvdW5kYXJ5LFxuICAgIHBhZGRpbmc6IHBhZGRpbmcsXG4gICAgYWx0Qm91bmRhcnk6IGFsdEJvdW5kYXJ5XG4gIH0pO1xuICB2YXIgYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQoc3RhdGUucGxhY2VtZW50KTtcbiAgdmFyIHZhcmlhdGlvbiA9IGdldFZhcmlhdGlvbihzdGF0ZS5wbGFjZW1lbnQpO1xuICB2YXIgaXNCYXNlUGxhY2VtZW50ID0gIXZhcmlhdGlvbjtcbiAgdmFyIG1haW5BeGlzID0gZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50KGJhc2VQbGFjZW1lbnQpO1xuICB2YXIgYWx0QXhpcyA9IGdldEFsdEF4aXMobWFpbkF4aXMpO1xuICB2YXIgcG9wcGVyT2Zmc2V0cyA9IHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cztcbiAgdmFyIHJlZmVyZW5jZVJlY3QgPSBzdGF0ZS5yZWN0cy5yZWZlcmVuY2U7XG4gIHZhciBwb3BwZXJSZWN0ID0gc3RhdGUucmVjdHMucG9wcGVyO1xuICB2YXIgdGV0aGVyT2Zmc2V0VmFsdWUgPSB0eXBlb2YgdGV0aGVyT2Zmc2V0ID09PSAnZnVuY3Rpb24nID8gdGV0aGVyT2Zmc2V0KE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnJlY3RzLCB7XG4gICAgcGxhY2VtZW50OiBzdGF0ZS5wbGFjZW1lbnRcbiAgfSkpIDogdGV0aGVyT2Zmc2V0O1xuICB2YXIgZGF0YSA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDBcbiAgfTtcblxuICBpZiAoIXBvcHBlck9mZnNldHMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoY2hlY2tNYWluQXhpcyB8fCBjaGVja0FsdEF4aXMpIHtcbiAgICB2YXIgbWFpblNpZGUgPSBtYWluQXhpcyA9PT0gJ3knID8gdG9wIDogbGVmdDtcbiAgICB2YXIgYWx0U2lkZSA9IG1haW5BeGlzID09PSAneScgPyBib3R0b20gOiByaWdodDtcbiAgICB2YXIgbGVuID0gbWFpbkF4aXMgPT09ICd5JyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcbiAgICB2YXIgb2Zmc2V0ID0gcG9wcGVyT2Zmc2V0c1ttYWluQXhpc107XG4gICAgdmFyIG1pbiA9IHBvcHBlck9mZnNldHNbbWFpbkF4aXNdICsgb3ZlcmZsb3dbbWFpblNpZGVdO1xuICAgIHZhciBtYXggPSBwb3BwZXJPZmZzZXRzW21haW5BeGlzXSAtIG92ZXJmbG93W2FsdFNpZGVdO1xuICAgIHZhciBhZGRpdGl2ZSA9IHRldGhlciA/IC1wb3BwZXJSZWN0W2xlbl0gLyAyIDogMDtcbiAgICB2YXIgbWluTGVuID0gdmFyaWF0aW9uID09PSBzdGFydCA/IHJlZmVyZW5jZVJlY3RbbGVuXSA6IHBvcHBlclJlY3RbbGVuXTtcbiAgICB2YXIgbWF4TGVuID0gdmFyaWF0aW9uID09PSBzdGFydCA/IC1wb3BwZXJSZWN0W2xlbl0gOiAtcmVmZXJlbmNlUmVjdFtsZW5dOyAvLyBXZSBuZWVkIHRvIGluY2x1ZGUgdGhlIGFycm93IGluIHRoZSBjYWxjdWxhdGlvbiBzbyB0aGUgYXJyb3cgZG9lc24ndCBnb1xuICAgIC8vIG91dHNpZGUgdGhlIHJlZmVyZW5jZSBib3VuZHNcblxuICAgIHZhciBhcnJvd0VsZW1lbnQgPSBzdGF0ZS5lbGVtZW50cy5hcnJvdztcbiAgICB2YXIgYXJyb3dSZWN0ID0gdGV0aGVyICYmIGFycm93RWxlbWVudCA/IGdldExheW91dFJlY3QoYXJyb3dFbGVtZW50KSA6IHtcbiAgICAgIHdpZHRoOiAwLFxuICAgICAgaGVpZ2h0OiAwXG4gICAgfTtcbiAgICB2YXIgYXJyb3dQYWRkaW5nT2JqZWN0ID0gc3RhdGUubW9kaWZpZXJzRGF0YVsnYXJyb3cjcGVyc2lzdGVudCddID8gc3RhdGUubW9kaWZpZXJzRGF0YVsnYXJyb3cjcGVyc2lzdGVudCddLnBhZGRpbmcgOiBnZXRGcmVzaFNpZGVPYmplY3QoKTtcbiAgICB2YXIgYXJyb3dQYWRkaW5nTWluID0gYXJyb3dQYWRkaW5nT2JqZWN0W21haW5TaWRlXTtcbiAgICB2YXIgYXJyb3dQYWRkaW5nTWF4ID0gYXJyb3dQYWRkaW5nT2JqZWN0W2FsdFNpZGVdOyAvLyBJZiB0aGUgcmVmZXJlbmNlIGxlbmd0aCBpcyBzbWFsbGVyIHRoYW4gdGhlIGFycm93IGxlbmd0aCwgd2UgZG9uJ3Qgd2FudFxuICAgIC8vIHRvIGluY2x1ZGUgaXRzIGZ1bGwgc2l6ZSBpbiB0aGUgY2FsY3VsYXRpb24uIElmIHRoZSByZWZlcmVuY2UgaXMgc21hbGxcbiAgICAvLyBhbmQgbmVhciB0aGUgZWRnZSBvZiBhIGJvdW5kYXJ5LCB0aGUgcG9wcGVyIGNhbiBvdmVyZmxvdyBldmVuIGlmIHRoZVxuICAgIC8vIHJlZmVyZW5jZSBpcyBub3Qgb3ZlcmZsb3dpbmcgYXMgd2VsbCAoZS5nLiB2aXJ0dWFsIGVsZW1lbnRzIHdpdGggbm9cbiAgICAvLyB3aWR0aCBvciBoZWlnaHQpXG5cbiAgICB2YXIgYXJyb3dMZW4gPSB3aXRoaW4oMCwgcmVmZXJlbmNlUmVjdFtsZW5dLCBhcnJvd1JlY3RbbGVuXSk7XG4gICAgdmFyIG1pbk9mZnNldCA9IGlzQmFzZVBsYWNlbWVudCA/IHJlZmVyZW5jZVJlY3RbbGVuXSAvIDIgLSBhZGRpdGl2ZSAtIGFycm93TGVuIC0gYXJyb3dQYWRkaW5nTWluIC0gdGV0aGVyT2Zmc2V0VmFsdWUgOiBtaW5MZW4gLSBhcnJvd0xlbiAtIGFycm93UGFkZGluZ01pbiAtIHRldGhlck9mZnNldFZhbHVlO1xuICAgIHZhciBtYXhPZmZzZXQgPSBpc0Jhc2VQbGFjZW1lbnQgPyAtcmVmZXJlbmNlUmVjdFtsZW5dIC8gMiArIGFkZGl0aXZlICsgYXJyb3dMZW4gKyBhcnJvd1BhZGRpbmdNYXggKyB0ZXRoZXJPZmZzZXRWYWx1ZSA6IG1heExlbiArIGFycm93TGVuICsgYXJyb3dQYWRkaW5nTWF4ICsgdGV0aGVyT2Zmc2V0VmFsdWU7XG4gICAgdmFyIGFycm93T2Zmc2V0UGFyZW50ID0gc3RhdGUuZWxlbWVudHMuYXJyb3cgJiYgZ2V0T2Zmc2V0UGFyZW50KHN0YXRlLmVsZW1lbnRzLmFycm93KTtcbiAgICB2YXIgY2xpZW50T2Zmc2V0ID0gYXJyb3dPZmZzZXRQYXJlbnQgPyBtYWluQXhpcyA9PT0gJ3knID8gYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50VG9wIHx8IDAgOiBhcnJvd09mZnNldFBhcmVudC5jbGllbnRMZWZ0IHx8IDAgOiAwO1xuICAgIHZhciBvZmZzZXRNb2RpZmllclZhbHVlID0gc3RhdGUubW9kaWZpZXJzRGF0YS5vZmZzZXQgPyBzdGF0ZS5tb2RpZmllcnNEYXRhLm9mZnNldFtzdGF0ZS5wbGFjZW1lbnRdW21haW5BeGlzXSA6IDA7XG4gICAgdmFyIHRldGhlck1pbiA9IHBvcHBlck9mZnNldHNbbWFpbkF4aXNdICsgbWluT2Zmc2V0IC0gb2Zmc2V0TW9kaWZpZXJWYWx1ZSAtIGNsaWVudE9mZnNldDtcbiAgICB2YXIgdGV0aGVyTWF4ID0gcG9wcGVyT2Zmc2V0c1ttYWluQXhpc10gKyBtYXhPZmZzZXQgLSBvZmZzZXRNb2RpZmllclZhbHVlO1xuXG4gICAgaWYgKGNoZWNrTWFpbkF4aXMpIHtcbiAgICAgIHZhciBwcmV2ZW50ZWRPZmZzZXQgPSB3aXRoaW4odGV0aGVyID8gbWF0aE1pbihtaW4sIHRldGhlck1pbikgOiBtaW4sIG9mZnNldCwgdGV0aGVyID8gbWF0aE1heChtYXgsIHRldGhlck1heCkgOiBtYXgpO1xuICAgICAgcG9wcGVyT2Zmc2V0c1ttYWluQXhpc10gPSBwcmV2ZW50ZWRPZmZzZXQ7XG4gICAgICBkYXRhW21haW5BeGlzXSA9IHByZXZlbnRlZE9mZnNldCAtIG9mZnNldDtcbiAgICB9XG5cbiAgICBpZiAoY2hlY2tBbHRBeGlzKSB7XG4gICAgICB2YXIgX21haW5TaWRlID0gbWFpbkF4aXMgPT09ICd4JyA/IHRvcCA6IGxlZnQ7XG5cbiAgICAgIHZhciBfYWx0U2lkZSA9IG1haW5BeGlzID09PSAneCcgPyBib3R0b20gOiByaWdodDtcblxuICAgICAgdmFyIF9vZmZzZXQgPSBwb3BwZXJPZmZzZXRzW2FsdEF4aXNdO1xuXG4gICAgICB2YXIgX21pbiA9IF9vZmZzZXQgKyBvdmVyZmxvd1tfbWFpblNpZGVdO1xuXG4gICAgICB2YXIgX21heCA9IF9vZmZzZXQgLSBvdmVyZmxvd1tfYWx0U2lkZV07XG5cbiAgICAgIHZhciBfcHJldmVudGVkT2Zmc2V0ID0gd2l0aGluKHRldGhlciA/IG1hdGhNaW4oX21pbiwgdGV0aGVyTWluKSA6IF9taW4sIF9vZmZzZXQsIHRldGhlciA/IG1hdGhNYXgoX21heCwgdGV0aGVyTWF4KSA6IF9tYXgpO1xuXG4gICAgICBwb3BwZXJPZmZzZXRzW2FsdEF4aXNdID0gX3ByZXZlbnRlZE9mZnNldDtcbiAgICAgIGRhdGFbYWx0QXhpc10gPSBfcHJldmVudGVkT2Zmc2V0IC0gX29mZnNldDtcbiAgICB9XG4gIH1cblxuICBzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdID0gZGF0YTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ3ByZXZlbnRPdmVyZmxvdycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnbWFpbicsXG4gIGZuOiBwcmV2ZW50T3ZlcmZsb3csXG4gIHJlcXVpcmVzSWZFeGlzdHM6IFsnb2Zmc2V0J11cbn07IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0SFRNTEVsZW1lbnRTY3JvbGwoZWxlbWVudCkge1xuICByZXR1cm4ge1xuICAgIHNjcm9sbExlZnQ6IGVsZW1lbnQuc2Nyb2xsTGVmdCxcbiAgICBzY3JvbGxUb3A6IGVsZW1lbnQuc2Nyb2xsVG9wXG4gIH07XG59IiwiaW1wb3J0IGdldFdpbmRvd1Njcm9sbCBmcm9tIFwiLi9nZXRXaW5kb3dTY3JvbGwuanNcIjtcbmltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IGdldEhUTUxFbGVtZW50U2Nyb2xsIGZyb20gXCIuL2dldEhUTUxFbGVtZW50U2Nyb2xsLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXROb2RlU2Nyb2xsKG5vZGUpIHtcbiAgaWYgKG5vZGUgPT09IGdldFdpbmRvdyhub2RlKSB8fCAhaXNIVE1MRWxlbWVudChub2RlKSkge1xuICAgIHJldHVybiBnZXRXaW5kb3dTY3JvbGwobm9kZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGdldEhUTUxFbGVtZW50U2Nyb2xsKG5vZGUpO1xuICB9XG59IiwiaW1wb3J0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmcm9tIFwiLi9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCBnZXROb2RlU2Nyb2xsIGZyb20gXCIuL2dldE5vZGVTY3JvbGwuanNcIjtcbmltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGxCYXJYIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbEJhclguanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgaXNTY3JvbGxQYXJlbnQgZnJvbSBcIi4vaXNTY3JvbGxQYXJlbnQuanNcIjsgLy8gUmV0dXJucyB0aGUgY29tcG9zaXRlIHJlY3Qgb2YgYW4gZWxlbWVudCByZWxhdGl2ZSB0byBpdHMgb2Zmc2V0UGFyZW50LlxuLy8gQ29tcG9zaXRlIG1lYW5zIGl0IHRha2VzIGludG8gYWNjb3VudCB0cmFuc2Zvcm1zIGFzIHdlbGwgYXMgbGF5b3V0LlxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRDb21wb3NpdGVSZWN0KGVsZW1lbnRPclZpcnR1YWxFbGVtZW50LCBvZmZzZXRQYXJlbnQsIGlzRml4ZWQpIHtcbiAgaWYgKGlzRml4ZWQgPT09IHZvaWQgMCkge1xuICAgIGlzRml4ZWQgPSBmYWxzZTtcbiAgfVxuXG4gIHZhciBkb2N1bWVudEVsZW1lbnQgPSBnZXREb2N1bWVudEVsZW1lbnQob2Zmc2V0UGFyZW50KTtcbiAgdmFyIHJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudE9yVmlydHVhbEVsZW1lbnQpO1xuICB2YXIgaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgPSBpc0hUTUxFbGVtZW50KG9mZnNldFBhcmVudCk7XG4gIHZhciBzY3JvbGwgPSB7XG4gICAgc2Nyb2xsTGVmdDogMCxcbiAgICBzY3JvbGxUb3A6IDBcbiAgfTtcbiAgdmFyIG9mZnNldHMgPSB7XG4gICAgeDogMCxcbiAgICB5OiAwXG4gIH07XG5cbiAgaWYgKGlzT2Zmc2V0UGFyZW50QW5FbGVtZW50IHx8ICFpc09mZnNldFBhcmVudEFuRWxlbWVudCAmJiAhaXNGaXhlZCkge1xuICAgIGlmIChnZXROb2RlTmFtZShvZmZzZXRQYXJlbnQpICE9PSAnYm9keScgfHwgLy8gaHR0cHM6Ly9naXRodWIuY29tL3BvcHBlcmpzL3BvcHBlci1jb3JlL2lzc3Vlcy8xMDc4XG4gICAgaXNTY3JvbGxQYXJlbnQoZG9jdW1lbnRFbGVtZW50KSkge1xuICAgICAgc2Nyb2xsID0gZ2V0Tm9kZVNjcm9sbChvZmZzZXRQYXJlbnQpO1xuICAgIH1cblxuICAgIGlmIChpc0hUTUxFbGVtZW50KG9mZnNldFBhcmVudCkpIHtcbiAgICAgIG9mZnNldHMgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3Qob2Zmc2V0UGFyZW50KTtcbiAgICAgIG9mZnNldHMueCArPSBvZmZzZXRQYXJlbnQuY2xpZW50TGVmdDtcbiAgICAgIG9mZnNldHMueSArPSBvZmZzZXRQYXJlbnQuY2xpZW50VG9wO1xuICAgIH0gZWxzZSBpZiAoZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICBvZmZzZXRzLnggPSBnZXRXaW5kb3dTY3JvbGxCYXJYKGRvY3VtZW50RWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB4OiByZWN0LmxlZnQgKyBzY3JvbGwuc2Nyb2xsTGVmdCAtIG9mZnNldHMueCxcbiAgICB5OiByZWN0LnRvcCArIHNjcm9sbC5zY3JvbGxUb3AgLSBvZmZzZXRzLnksXG4gICAgd2lkdGg6IHJlY3Qud2lkdGgsXG4gICAgaGVpZ2h0OiByZWN0LmhlaWdodFxuICB9O1xufSIsImltcG9ydCB7IG1vZGlmaWVyUGhhc2VzIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7IC8vIHNvdXJjZTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDk4NzUyNTVcblxuZnVuY3Rpb24gb3JkZXIobW9kaWZpZXJzKSB7XG4gIHZhciBtYXAgPSBuZXcgTWFwKCk7XG4gIHZhciB2aXNpdGVkID0gbmV3IFNldCgpO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIG1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgIG1hcC5zZXQobW9kaWZpZXIubmFtZSwgbW9kaWZpZXIpO1xuICB9KTsgLy8gT24gdmlzaXRpbmcgb2JqZWN0LCBjaGVjayBmb3IgaXRzIGRlcGVuZGVuY2llcyBhbmQgdmlzaXQgdGhlbSByZWN1cnNpdmVseVxuXG4gIGZ1bmN0aW9uIHNvcnQobW9kaWZpZXIpIHtcbiAgICB2aXNpdGVkLmFkZChtb2RpZmllci5uYW1lKTtcbiAgICB2YXIgcmVxdWlyZXMgPSBbXS5jb25jYXQobW9kaWZpZXIucmVxdWlyZXMgfHwgW10sIG1vZGlmaWVyLnJlcXVpcmVzSWZFeGlzdHMgfHwgW10pO1xuICAgIHJlcXVpcmVzLmZvckVhY2goZnVuY3Rpb24gKGRlcCkge1xuICAgICAgaWYgKCF2aXNpdGVkLmhhcyhkZXApKSB7XG4gICAgICAgIHZhciBkZXBNb2RpZmllciA9IG1hcC5nZXQoZGVwKTtcblxuICAgICAgICBpZiAoZGVwTW9kaWZpZXIpIHtcbiAgICAgICAgICBzb3J0KGRlcE1vZGlmaWVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJlc3VsdC5wdXNoKG1vZGlmaWVyKTtcbiAgfVxuXG4gIG1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgIGlmICghdmlzaXRlZC5oYXMobW9kaWZpZXIubmFtZSkpIHtcbiAgICAgIC8vIGNoZWNrIGZvciB2aXNpdGVkIG9iamVjdFxuICAgICAgc29ydChtb2RpZmllcik7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gb3JkZXJNb2RpZmllcnMobW9kaWZpZXJzKSB7XG4gIC8vIG9yZGVyIGJhc2VkIG9uIGRlcGVuZGVuY2llc1xuICB2YXIgb3JkZXJlZE1vZGlmaWVycyA9IG9yZGVyKG1vZGlmaWVycyk7IC8vIG9yZGVyIGJhc2VkIG9uIHBoYXNlXG5cbiAgcmV0dXJuIG1vZGlmaWVyUGhhc2VzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwaGFzZSkge1xuICAgIHJldHVybiBhY2MuY29uY2F0KG9yZGVyZWRNb2RpZmllcnMuZmlsdGVyKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgICAgcmV0dXJuIG1vZGlmaWVyLnBoYXNlID09PSBwaGFzZTtcbiAgICB9KSk7XG4gIH0sIFtdKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZWJvdW5jZShmbikge1xuICB2YXIgcGVuZGluZztcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgIHBlbmRpbmcgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBwZW5kaW5nID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHJlc29sdmUoZm4oKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBlbmRpbmc7XG4gIH07XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZm9ybWF0KHN0cikge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICByZXR1cm4gW10uY29uY2F0KGFyZ3MpLnJlZHVjZShmdW5jdGlvbiAocCwgYykge1xuICAgIHJldHVybiBwLnJlcGxhY2UoLyVzLywgYyk7XG4gIH0sIHN0cik7XG59IiwiaW1wb3J0IGZvcm1hdCBmcm9tIFwiLi9mb3JtYXQuanNcIjtcbmltcG9ydCB7IG1vZGlmaWVyUGhhc2VzIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG52YXIgSU5WQUxJRF9NT0RJRklFUl9FUlJPUiA9ICdQb3BwZXI6IG1vZGlmaWVyIFwiJXNcIiBwcm92aWRlZCBhbiBpbnZhbGlkICVzIHByb3BlcnR5LCBleHBlY3RlZCAlcyBidXQgZ290ICVzJztcbnZhciBNSVNTSU5HX0RFUEVOREVOQ1lfRVJST1IgPSAnUG9wcGVyOiBtb2RpZmllciBcIiVzXCIgcmVxdWlyZXMgXCIlc1wiLCBidXQgXCIlc1wiIG1vZGlmaWVyIGlzIG5vdCBhdmFpbGFibGUnO1xudmFyIFZBTElEX1BST1BFUlRJRVMgPSBbJ25hbWUnLCAnZW5hYmxlZCcsICdwaGFzZScsICdmbicsICdlZmZlY3QnLCAncmVxdWlyZXMnLCAnb3B0aW9ucyddO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVNb2RpZmllcnMobW9kaWZpZXJzKSB7XG4gIG1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgIE9iamVjdC5rZXlzKG1vZGlmaWVyKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgIGNhc2UgJ25hbWUnOlxuICAgICAgICAgIGlmICh0eXBlb2YgbW9kaWZpZXIubmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZm9ybWF0KElOVkFMSURfTU9ESUZJRVJfRVJST1IsIFN0cmluZyhtb2RpZmllci5uYW1lKSwgJ1wibmFtZVwiJywgJ1wic3RyaW5nXCInLCBcIlxcXCJcIiArIFN0cmluZyhtb2RpZmllci5uYW1lKSArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnZW5hYmxlZCc6XG4gICAgICAgICAgaWYgKHR5cGVvZiBtb2RpZmllci5lbmFibGVkICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZm9ybWF0KElOVkFMSURfTU9ESUZJRVJfRVJST1IsIG1vZGlmaWVyLm5hbWUsICdcImVuYWJsZWRcIicsICdcImJvb2xlYW5cIicsIFwiXFxcIlwiICsgU3RyaW5nKG1vZGlmaWVyLmVuYWJsZWQpICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAncGhhc2UnOlxuICAgICAgICAgIGlmIChtb2RpZmllclBoYXNlcy5pbmRleE9mKG1vZGlmaWVyLnBoYXNlKSA8IDApIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZm9ybWF0KElOVkFMSURfTU9ESUZJRVJfRVJST1IsIG1vZGlmaWVyLm5hbWUsICdcInBoYXNlXCInLCBcImVpdGhlciBcIiArIG1vZGlmaWVyUGhhc2VzLmpvaW4oJywgJyksIFwiXFxcIlwiICsgU3RyaW5nKG1vZGlmaWVyLnBoYXNlKSArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnZm4nOlxuICAgICAgICAgIGlmICh0eXBlb2YgbW9kaWZpZXIuZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZm9ybWF0KElOVkFMSURfTU9ESUZJRVJfRVJST1IsIG1vZGlmaWVyLm5hbWUsICdcImZuXCInLCAnXCJmdW5jdGlvblwiJywgXCJcXFwiXCIgKyBTdHJpbmcobW9kaWZpZXIuZm4pICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdlZmZlY3QnOlxuICAgICAgICAgIGlmICh0eXBlb2YgbW9kaWZpZXIuZWZmZWN0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGZvcm1hdChJTlZBTElEX01PRElGSUVSX0VSUk9SLCBtb2RpZmllci5uYW1lLCAnXCJlZmZlY3RcIicsICdcImZ1bmN0aW9uXCInLCBcIlxcXCJcIiArIFN0cmluZyhtb2RpZmllci5mbikgKyBcIlxcXCJcIikpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3JlcXVpcmVzJzpcbiAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkobW9kaWZpZXIucmVxdWlyZXMpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGZvcm1hdChJTlZBTElEX01PRElGSUVSX0VSUk9SLCBtb2RpZmllci5uYW1lLCAnXCJyZXF1aXJlc1wiJywgJ1wiYXJyYXlcIicsIFwiXFxcIlwiICsgU3RyaW5nKG1vZGlmaWVyLnJlcXVpcmVzKSArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAncmVxdWlyZXNJZkV4aXN0cyc6XG4gICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG1vZGlmaWVyLnJlcXVpcmVzSWZFeGlzdHMpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGZvcm1hdChJTlZBTElEX01PRElGSUVSX0VSUk9SLCBtb2RpZmllci5uYW1lLCAnXCJyZXF1aXJlc0lmRXhpc3RzXCInLCAnXCJhcnJheVwiJywgXCJcXFwiXCIgKyBTdHJpbmcobW9kaWZpZXIucmVxdWlyZXNJZkV4aXN0cykgKyBcIlxcXCJcIikpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ29wdGlvbnMnOlxuICAgICAgICBjYXNlICdkYXRhJzpcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJQb3BwZXJKUzogYW4gaW52YWxpZCBwcm9wZXJ0eSBoYXMgYmVlbiBwcm92aWRlZCB0byB0aGUgXFxcIlwiICsgbW9kaWZpZXIubmFtZSArIFwiXFxcIiBtb2RpZmllciwgdmFsaWQgcHJvcGVydGllcyBhcmUgXCIgKyBWQUxJRF9QUk9QRVJUSUVTLm1hcChmdW5jdGlvbiAocykge1xuICAgICAgICAgICAgcmV0dXJuIFwiXFxcIlwiICsgcyArIFwiXFxcIlwiO1xuICAgICAgICAgIH0pLmpvaW4oJywgJykgKyBcIjsgYnV0IFxcXCJcIiArIGtleSArIFwiXFxcIiB3YXMgcHJvdmlkZWQuXCIpO1xuICAgICAgfVxuXG4gICAgICBtb2RpZmllci5yZXF1aXJlcyAmJiBtb2RpZmllci5yZXF1aXJlcy5mb3JFYWNoKGZ1bmN0aW9uIChyZXF1aXJlbWVudCkge1xuICAgICAgICBpZiAobW9kaWZpZXJzLmZpbmQoZnVuY3Rpb24gKG1vZCkge1xuICAgICAgICAgIHJldHVybiBtb2QubmFtZSA9PT0gcmVxdWlyZW1lbnQ7XG4gICAgICAgIH0pID09IG51bGwpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGZvcm1hdChNSVNTSU5HX0RFUEVOREVOQ1lfRVJST1IsIFN0cmluZyhtb2RpZmllci5uYW1lKSwgcmVxdWlyZW1lbnQsIHJlcXVpcmVtZW50KSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1bmlxdWVCeShhcnIsIGZuKSB7XG4gIHZhciBpZGVudGlmaWVycyA9IG5ldyBTZXQoKTtcbiAgcmV0dXJuIGFyci5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICB2YXIgaWRlbnRpZmllciA9IGZuKGl0ZW0pO1xuXG4gICAgaWYgKCFpZGVudGlmaWVycy5oYXMoaWRlbnRpZmllcikpIHtcbiAgICAgIGlkZW50aWZpZXJzLmFkZChpZGVudGlmaWVyKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSk7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWVyZ2VCeU5hbWUobW9kaWZpZXJzKSB7XG4gIHZhciBtZXJnZWQgPSBtb2RpZmllcnMucmVkdWNlKGZ1bmN0aW9uIChtZXJnZWQsIGN1cnJlbnQpIHtcbiAgICB2YXIgZXhpc3RpbmcgPSBtZXJnZWRbY3VycmVudC5uYW1lXTtcbiAgICBtZXJnZWRbY3VycmVudC5uYW1lXSA9IGV4aXN0aW5nID8gT2JqZWN0LmFzc2lnbih7fSwgZXhpc3RpbmcsIGN1cnJlbnQsIHtcbiAgICAgIG9wdGlvbnM6IE9iamVjdC5hc3NpZ24oe30sIGV4aXN0aW5nLm9wdGlvbnMsIGN1cnJlbnQub3B0aW9ucyksXG4gICAgICBkYXRhOiBPYmplY3QuYXNzaWduKHt9LCBleGlzdGluZy5kYXRhLCBjdXJyZW50LmRhdGEpXG4gICAgfSkgOiBjdXJyZW50O1xuICAgIHJldHVybiBtZXJnZWQ7XG4gIH0sIHt9KTsgLy8gSUUxMSBkb2VzIG5vdCBzdXBwb3J0IE9iamVjdC52YWx1ZXNcblxuICByZXR1cm4gT2JqZWN0LmtleXMobWVyZ2VkKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBtZXJnZWRba2V5XTtcbiAgfSk7XG59IiwiaW1wb3J0IGdldENvbXBvc2l0ZVJlY3QgZnJvbSBcIi4vZG9tLXV0aWxzL2dldENvbXBvc2l0ZVJlY3QuanNcIjtcbmltcG9ydCBnZXRMYXlvdXRSZWN0IGZyb20gXCIuL2RvbS11dGlscy9nZXRMYXlvdXRSZWN0LmpzXCI7XG5pbXBvcnQgbGlzdFNjcm9sbFBhcmVudHMgZnJvbSBcIi4vZG9tLXV0aWxzL2xpc3RTY3JvbGxQYXJlbnRzLmpzXCI7XG5pbXBvcnQgZ2V0T2Zmc2V0UGFyZW50IGZyb20gXCIuL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQuanNcIjtcbmltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gXCIuL2RvbS11dGlscy9nZXRDb21wdXRlZFN0eWxlLmpzXCI7XG5pbXBvcnQgb3JkZXJNb2RpZmllcnMgZnJvbSBcIi4vdXRpbHMvb3JkZXJNb2RpZmllcnMuanNcIjtcbmltcG9ydCBkZWJvdW5jZSBmcm9tIFwiLi91dGlscy9kZWJvdW5jZS5qc1wiO1xuaW1wb3J0IHZhbGlkYXRlTW9kaWZpZXJzIGZyb20gXCIuL3V0aWxzL3ZhbGlkYXRlTW9kaWZpZXJzLmpzXCI7XG5pbXBvcnQgdW5pcXVlQnkgZnJvbSBcIi4vdXRpbHMvdW5pcXVlQnkuanNcIjtcbmltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBtZXJnZUJ5TmFtZSBmcm9tIFwiLi91dGlscy9tZXJnZUJ5TmFtZS5qc1wiO1xuaW1wb3J0IGRldGVjdE92ZXJmbG93IGZyb20gXCIuL3V0aWxzL2RldGVjdE92ZXJmbG93LmpzXCI7XG5pbXBvcnQgeyBpc0VsZW1lbnQgfSBmcm9tIFwiLi9kb20tdXRpbHMvaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IHsgYXV0byB9IGZyb20gXCIuL2VudW1zLmpzXCI7XG52YXIgSU5WQUxJRF9FTEVNRU5UX0VSUk9SID0gJ1BvcHBlcjogSW52YWxpZCByZWZlcmVuY2Ugb3IgcG9wcGVyIGFyZ3VtZW50IHByb3ZpZGVkLiBUaGV5IG11c3QgYmUgZWl0aGVyIGEgRE9NIGVsZW1lbnQgb3IgdmlydHVhbCBlbGVtZW50Lic7XG52YXIgSU5GSU5JVEVfTE9PUF9FUlJPUiA9ICdQb3BwZXI6IEFuIGluZmluaXRlIGxvb3AgaW4gdGhlIG1vZGlmaWVycyBjeWNsZSBoYXMgYmVlbiBkZXRlY3RlZCEgVGhlIGN5Y2xlIGhhcyBiZWVuIGludGVycnVwdGVkIHRvIHByZXZlbnQgYSBicm93c2VyIGNyYXNoLic7XG52YXIgREVGQVVMVF9PUFRJT05TID0ge1xuICBwbGFjZW1lbnQ6ICdib3R0b20nLFxuICBtb2RpZmllcnM6IFtdLFxuICBzdHJhdGVneTogJ2Fic29sdXRlJ1xufTtcblxuZnVuY3Rpb24gYXJlVmFsaWRFbGVtZW50cygpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHJldHVybiAhYXJncy5zb21lKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgcmV0dXJuICEoZWxlbWVudCAmJiB0eXBlb2YgZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QgPT09ICdmdW5jdGlvbicpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBvcHBlckdlbmVyYXRvcihnZW5lcmF0b3JPcHRpb25zKSB7XG4gIGlmIChnZW5lcmF0b3JPcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBnZW5lcmF0b3JPcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgX2dlbmVyYXRvck9wdGlvbnMgPSBnZW5lcmF0b3JPcHRpb25zLFxuICAgICAgX2dlbmVyYXRvck9wdGlvbnMkZGVmID0gX2dlbmVyYXRvck9wdGlvbnMuZGVmYXVsdE1vZGlmaWVycyxcbiAgICAgIGRlZmF1bHRNb2RpZmllcnMgPSBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYgPT09IHZvaWQgMCA/IFtdIDogX2dlbmVyYXRvck9wdGlvbnMkZGVmLFxuICAgICAgX2dlbmVyYXRvck9wdGlvbnMkZGVmMiA9IF9nZW5lcmF0b3JPcHRpb25zLmRlZmF1bHRPcHRpb25zLFxuICAgICAgZGVmYXVsdE9wdGlvbnMgPSBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYyID09PSB2b2lkIDAgPyBERUZBVUxUX09QVElPTlMgOiBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYyO1xuICByZXR1cm4gZnVuY3Rpb24gY3JlYXRlUG9wcGVyKHJlZmVyZW5jZSwgcG9wcGVyLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zO1xuICAgIH1cblxuICAgIHZhciBzdGF0ZSA9IHtcbiAgICAgIHBsYWNlbWVudDogJ2JvdHRvbScsXG4gICAgICBvcmRlcmVkTW9kaWZpZXJzOiBbXSxcbiAgICAgIG9wdGlvbnM6IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfT1BUSU9OUywgZGVmYXVsdE9wdGlvbnMpLFxuICAgICAgbW9kaWZpZXJzRGF0YToge30sXG4gICAgICBlbGVtZW50czoge1xuICAgICAgICByZWZlcmVuY2U6IHJlZmVyZW5jZSxcbiAgICAgICAgcG9wcGVyOiBwb3BwZXJcbiAgICAgIH0sXG4gICAgICBhdHRyaWJ1dGVzOiB7fSxcbiAgICAgIHN0eWxlczoge31cbiAgICB9O1xuICAgIHZhciBlZmZlY3RDbGVhbnVwRm5zID0gW107XG4gICAgdmFyIGlzRGVzdHJveWVkID0gZmFsc2U7XG4gICAgdmFyIGluc3RhbmNlID0ge1xuICAgICAgc3RhdGU6IHN0YXRlLFxuICAgICAgc2V0T3B0aW9uczogZnVuY3Rpb24gc2V0T3B0aW9ucyhvcHRpb25zKSB7XG4gICAgICAgIGNsZWFudXBNb2RpZmllckVmZmVjdHMoKTtcbiAgICAgICAgc3RhdGUub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRPcHRpb25zLCBzdGF0ZS5vcHRpb25zLCBvcHRpb25zKTtcbiAgICAgICAgc3RhdGUuc2Nyb2xsUGFyZW50cyA9IHtcbiAgICAgICAgICByZWZlcmVuY2U6IGlzRWxlbWVudChyZWZlcmVuY2UpID8gbGlzdFNjcm9sbFBhcmVudHMocmVmZXJlbmNlKSA6IHJlZmVyZW5jZS5jb250ZXh0RWxlbWVudCA/IGxpc3RTY3JvbGxQYXJlbnRzKHJlZmVyZW5jZS5jb250ZXh0RWxlbWVudCkgOiBbXSxcbiAgICAgICAgICBwb3BwZXI6IGxpc3RTY3JvbGxQYXJlbnRzKHBvcHBlcilcbiAgICAgICAgfTsgLy8gT3JkZXJzIHRoZSBtb2RpZmllcnMgYmFzZWQgb24gdGhlaXIgZGVwZW5kZW5jaWVzIGFuZCBgcGhhc2VgXG4gICAgICAgIC8vIHByb3BlcnRpZXNcblxuICAgICAgICB2YXIgb3JkZXJlZE1vZGlmaWVycyA9IG9yZGVyTW9kaWZpZXJzKG1lcmdlQnlOYW1lKFtdLmNvbmNhdChkZWZhdWx0TW9kaWZpZXJzLCBzdGF0ZS5vcHRpb25zLm1vZGlmaWVycykpKTsgLy8gU3RyaXAgb3V0IGRpc2FibGVkIG1vZGlmaWVyc1xuXG4gICAgICAgIHN0YXRlLm9yZGVyZWRNb2RpZmllcnMgPSBvcmRlcmVkTW9kaWZpZXJzLmZpbHRlcihmdW5jdGlvbiAobSkge1xuICAgICAgICAgIHJldHVybiBtLmVuYWJsZWQ7XG4gICAgICAgIH0pOyAvLyBWYWxpZGF0ZSB0aGUgcHJvdmlkZWQgbW9kaWZpZXJzIHNvIHRoYXQgdGhlIGNvbnN1bWVyIHdpbGwgZ2V0IHdhcm5lZFxuICAgICAgICAvLyBpZiBvbmUgb2YgdGhlIG1vZGlmaWVycyBpcyBpbnZhbGlkIGZvciBhbnkgcmVhc29uXG5cbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICAgIHZhciBtb2RpZmllcnMgPSB1bmlxdWVCeShbXS5jb25jYXQob3JkZXJlZE1vZGlmaWVycywgc3RhdGUub3B0aW9ucy5tb2RpZmllcnMpLCBmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICAgICAgdmFyIG5hbWUgPSBfcmVmLm5hbWU7XG4gICAgICAgICAgICByZXR1cm4gbmFtZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB2YWxpZGF0ZU1vZGlmaWVycyhtb2RpZmllcnMpO1xuXG4gICAgICAgICAgaWYgKGdldEJhc2VQbGFjZW1lbnQoc3RhdGUub3B0aW9ucy5wbGFjZW1lbnQpID09PSBhdXRvKSB7XG4gICAgICAgICAgICB2YXIgZmxpcE1vZGlmaWVyID0gc3RhdGUub3JkZXJlZE1vZGlmaWVycy5maW5kKGZ1bmN0aW9uIChfcmVmMikge1xuICAgICAgICAgICAgICB2YXIgbmFtZSA9IF9yZWYyLm5hbWU7XG4gICAgICAgICAgICAgIHJldHVybiBuYW1lID09PSAnZmxpcCc7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKCFmbGlwTW9kaWZpZXIpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihbJ1BvcHBlcjogXCJhdXRvXCIgcGxhY2VtZW50cyByZXF1aXJlIHRoZSBcImZsaXBcIiBtb2RpZmllciBiZScsICdwcmVzZW50IGFuZCBlbmFibGVkIHRvIHdvcmsuJ10uam9pbignICcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgX2dldENvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKHBvcHBlciksXG4gICAgICAgICAgICAgIG1hcmdpblRvcCA9IF9nZXRDb21wdXRlZFN0eWxlLm1hcmdpblRvcCxcbiAgICAgICAgICAgICAgbWFyZ2luUmlnaHQgPSBfZ2V0Q29tcHV0ZWRTdHlsZS5tYXJnaW5SaWdodCxcbiAgICAgICAgICAgICAgbWFyZ2luQm90dG9tID0gX2dldENvbXB1dGVkU3R5bGUubWFyZ2luQm90dG9tLFxuICAgICAgICAgICAgICBtYXJnaW5MZWZ0ID0gX2dldENvbXB1dGVkU3R5bGUubWFyZ2luTGVmdDsgLy8gV2Ugbm8gbG9uZ2VyIHRha2UgaW50byBhY2NvdW50IGBtYXJnaW5zYCBvbiB0aGUgcG9wcGVyLCBhbmQgaXQgY2FuXG4gICAgICAgICAgLy8gY2F1c2UgYnVncyB3aXRoIHBvc2l0aW9uaW5nLCBzbyB3ZSdsbCB3YXJuIHRoZSBjb25zdW1lclxuXG5cbiAgICAgICAgICBpZiAoW21hcmdpblRvcCwgbWFyZ2luUmlnaHQsIG1hcmdpbkJvdHRvbSwgbWFyZ2luTGVmdF0uc29tZShmdW5jdGlvbiAobWFyZ2luKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChtYXJnaW4pO1xuICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oWydQb3BwZXI6IENTUyBcIm1hcmdpblwiIHN0eWxlcyBjYW5ub3QgYmUgdXNlZCB0byBhcHBseSBwYWRkaW5nJywgJ2JldHdlZW4gdGhlIHBvcHBlciBhbmQgaXRzIHJlZmVyZW5jZSBlbGVtZW50IG9yIGJvdW5kYXJ5LicsICdUbyByZXBsaWNhdGUgbWFyZ2luLCB1c2UgdGhlIGBvZmZzZXRgIG1vZGlmaWVyLCBhcyB3ZWxsIGFzJywgJ3RoZSBgcGFkZGluZ2Agb3B0aW9uIGluIHRoZSBgcHJldmVudE92ZXJmbG93YCBhbmQgYGZsaXBgJywgJ21vZGlmaWVycy4nXS5qb2luKCcgJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJ1bk1vZGlmaWVyRWZmZWN0cygpO1xuICAgICAgICByZXR1cm4gaW5zdGFuY2UudXBkYXRlKCk7XG4gICAgICB9LFxuICAgICAgLy8gU3luYyB1cGRhdGUg4oCTIGl0IHdpbGwgYWx3YXlzIGJlIGV4ZWN1dGVkLCBldmVuIGlmIG5vdCBuZWNlc3NhcnkuIFRoaXNcbiAgICAgIC8vIGlzIHVzZWZ1bCBmb3IgbG93IGZyZXF1ZW5jeSB1cGRhdGVzIHdoZXJlIHN5bmMgYmVoYXZpb3Igc2ltcGxpZmllcyB0aGVcbiAgICAgIC8vIGxvZ2ljLlxuICAgICAgLy8gRm9yIGhpZ2ggZnJlcXVlbmN5IHVwZGF0ZXMgKGUuZy4gYHJlc2l6ZWAgYW5kIGBzY3JvbGxgIGV2ZW50cyksIGFsd2F5c1xuICAgICAgLy8gcHJlZmVyIHRoZSBhc3luYyBQb3BwZXIjdXBkYXRlIG1ldGhvZFxuICAgICAgZm9yY2VVcGRhdGU6IGZ1bmN0aW9uIGZvcmNlVXBkYXRlKCkge1xuICAgICAgICBpZiAoaXNEZXN0cm95ZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgX3N0YXRlJGVsZW1lbnRzID0gc3RhdGUuZWxlbWVudHMsXG4gICAgICAgICAgICByZWZlcmVuY2UgPSBfc3RhdGUkZWxlbWVudHMucmVmZXJlbmNlLFxuICAgICAgICAgICAgcG9wcGVyID0gX3N0YXRlJGVsZW1lbnRzLnBvcHBlcjsgLy8gRG9uJ3QgcHJvY2VlZCBpZiBgcmVmZXJlbmNlYCBvciBgcG9wcGVyYCBhcmUgbm90IHZhbGlkIGVsZW1lbnRzXG4gICAgICAgIC8vIGFueW1vcmVcblxuICAgICAgICBpZiAoIWFyZVZhbGlkRWxlbWVudHMocmVmZXJlbmNlLCBwb3BwZXIpKSB7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihJTlZBTElEX0VMRU1FTlRfRVJST1IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSAvLyBTdG9yZSB0aGUgcmVmZXJlbmNlIGFuZCBwb3BwZXIgcmVjdHMgdG8gYmUgcmVhZCBieSBtb2RpZmllcnNcblxuXG4gICAgICAgIHN0YXRlLnJlY3RzID0ge1xuICAgICAgICAgIHJlZmVyZW5jZTogZ2V0Q29tcG9zaXRlUmVjdChyZWZlcmVuY2UsIGdldE9mZnNldFBhcmVudChwb3BwZXIpLCBzdGF0ZS5vcHRpb25zLnN0cmF0ZWd5ID09PSAnZml4ZWQnKSxcbiAgICAgICAgICBwb3BwZXI6IGdldExheW91dFJlY3QocG9wcGVyKVxuICAgICAgICB9OyAvLyBNb2RpZmllcnMgaGF2ZSB0aGUgYWJpbGl0eSB0byByZXNldCB0aGUgY3VycmVudCB1cGRhdGUgY3ljbGUuIFRoZVxuICAgICAgICAvLyBtb3N0IGNvbW1vbiB1c2UgY2FzZSBmb3IgdGhpcyBpcyB0aGUgYGZsaXBgIG1vZGlmaWVyIGNoYW5naW5nIHRoZVxuICAgICAgICAvLyBwbGFjZW1lbnQsIHdoaWNoIHRoZW4gbmVlZHMgdG8gcmUtcnVuIGFsbCB0aGUgbW9kaWZpZXJzLCBiZWNhdXNlIHRoZVxuICAgICAgICAvLyBsb2dpYyB3YXMgcHJldmlvdXNseSByYW4gZm9yIHRoZSBwcmV2aW91cyBwbGFjZW1lbnQgYW5kIGlzIHRoZXJlZm9yZVxuICAgICAgICAvLyBzdGFsZS9pbmNvcnJlY3RcblxuICAgICAgICBzdGF0ZS5yZXNldCA9IGZhbHNlO1xuICAgICAgICBzdGF0ZS5wbGFjZW1lbnQgPSBzdGF0ZS5vcHRpb25zLnBsYWNlbWVudDsgLy8gT24gZWFjaCB1cGRhdGUgY3ljbGUsIHRoZSBgbW9kaWZpZXJzRGF0YWAgcHJvcGVydHkgZm9yIGVhY2ggbW9kaWZpZXJcbiAgICAgICAgLy8gaXMgZmlsbGVkIHdpdGggdGhlIGluaXRpYWwgZGF0YSBzcGVjaWZpZWQgYnkgdGhlIG1vZGlmaWVyLiBUaGlzIG1lYW5zXG4gICAgICAgIC8vIGl0IGRvZXNuJ3QgcGVyc2lzdCBhbmQgaXMgZnJlc2ggb24gZWFjaCB1cGRhdGUuXG4gICAgICAgIC8vIFRvIGVuc3VyZSBwZXJzaXN0ZW50IGRhdGEsIHVzZSBgJHtuYW1lfSNwZXJzaXN0ZW50YFxuXG4gICAgICAgIHN0YXRlLm9yZGVyZWRNb2RpZmllcnMuZm9yRWFjaChmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICAgICAgICByZXR1cm4gc3RhdGUubW9kaWZpZXJzRGF0YVttb2RpZmllci5uYW1lXSA9IE9iamVjdC5hc3NpZ24oe30sIG1vZGlmaWVyLmRhdGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIF9fZGVidWdfbG9vcHNfXyA9IDA7XG5cbiAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IHN0YXRlLm9yZGVyZWRNb2RpZmllcnMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICAgICAgX19kZWJ1Z19sb29wc19fICs9IDE7XG5cbiAgICAgICAgICAgIGlmIChfX2RlYnVnX2xvb3BzX18gPiAxMDApIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihJTkZJTklURV9MT09QX0VSUk9SKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHN0YXRlLnJlc2V0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICBzdGF0ZS5yZXNldCA9IGZhbHNlO1xuICAgICAgICAgICAgaW5kZXggPSAtMTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBfc3RhdGUkb3JkZXJlZE1vZGlmaWUgPSBzdGF0ZS5vcmRlcmVkTW9kaWZpZXJzW2luZGV4XSxcbiAgICAgICAgICAgICAgZm4gPSBfc3RhdGUkb3JkZXJlZE1vZGlmaWUuZm4sXG4gICAgICAgICAgICAgIF9zdGF0ZSRvcmRlcmVkTW9kaWZpZTIgPSBfc3RhdGUkb3JkZXJlZE1vZGlmaWUub3B0aW9ucyxcbiAgICAgICAgICAgICAgX29wdGlvbnMgPSBfc3RhdGUkb3JkZXJlZE1vZGlmaWUyID09PSB2b2lkIDAgPyB7fSA6IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZTIsXG4gICAgICAgICAgICAgIG5hbWUgPSBfc3RhdGUkb3JkZXJlZE1vZGlmaWUubmFtZTtcblxuICAgICAgICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHN0YXRlID0gZm4oe1xuICAgICAgICAgICAgICBzdGF0ZTogc3RhdGUsXG4gICAgICAgICAgICAgIG9wdGlvbnM6IF9vcHRpb25zLFxuICAgICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgICBpbnN0YW5jZTogaW5zdGFuY2VcbiAgICAgICAgICAgIH0pIHx8IHN0YXRlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIEFzeW5jIGFuZCBvcHRpbWlzdGljYWxseSBvcHRpbWl6ZWQgdXBkYXRlIOKAkyBpdCB3aWxsIG5vdCBiZSBleGVjdXRlZCBpZlxuICAgICAgLy8gbm90IG5lY2Vzc2FyeSAoZGVib3VuY2VkIHRvIHJ1biBhdCBtb3N0IG9uY2UtcGVyLXRpY2spXG4gICAgICB1cGRhdGU6IGRlYm91bmNlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgaW5zdGFuY2UuZm9yY2VVcGRhdGUoKTtcbiAgICAgICAgICByZXNvbHZlKHN0YXRlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KSxcbiAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICAgIGNsZWFudXBNb2RpZmllckVmZmVjdHMoKTtcbiAgICAgICAgaXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoIWFyZVZhbGlkRWxlbWVudHMocmVmZXJlbmNlLCBwb3BwZXIpKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoSU5WQUxJRF9FTEVNRU5UX0VSUk9SKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cblxuICAgIGluc3RhbmNlLnNldE9wdGlvbnMob3B0aW9ucykudGhlbihmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgIGlmICghaXNEZXN0cm95ZWQgJiYgb3B0aW9ucy5vbkZpcnN0VXBkYXRlKSB7XG4gICAgICAgIG9wdGlvbnMub25GaXJzdFVwZGF0ZShzdGF0ZSk7XG4gICAgICB9XG4gICAgfSk7IC8vIE1vZGlmaWVycyBoYXZlIHRoZSBhYmlsaXR5IHRvIGV4ZWN1dGUgYXJiaXRyYXJ5IGNvZGUgYmVmb3JlIHRoZSBmaXJzdFxuICAgIC8vIHVwZGF0ZSBjeWNsZSBydW5zLiBUaGV5IHdpbGwgYmUgZXhlY3V0ZWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIHVwZGF0ZVxuICAgIC8vIGN5Y2xlLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGEgbW9kaWZpZXIgYWRkcyBzb21lIHBlcnNpc3RlbnQgZGF0YSB0aGF0XG4gICAgLy8gb3RoZXIgbW9kaWZpZXJzIG5lZWQgdG8gdXNlLCBidXQgdGhlIG1vZGlmaWVyIGlzIHJ1biBhZnRlciB0aGUgZGVwZW5kZW50XG4gICAgLy8gb25lLlxuXG4gICAgZnVuY3Rpb24gcnVuTW9kaWZpZXJFZmZlY3RzKCkge1xuICAgICAgc3RhdGUub3JkZXJlZE1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmMykge1xuICAgICAgICB2YXIgbmFtZSA9IF9yZWYzLm5hbWUsXG4gICAgICAgICAgICBfcmVmMyRvcHRpb25zID0gX3JlZjMub3B0aW9ucyxcbiAgICAgICAgICAgIG9wdGlvbnMgPSBfcmVmMyRvcHRpb25zID09PSB2b2lkIDAgPyB7fSA6IF9yZWYzJG9wdGlvbnMsXG4gICAgICAgICAgICBlZmZlY3QgPSBfcmVmMy5lZmZlY3Q7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBlZmZlY3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB2YXIgY2xlYW51cEZuID0gZWZmZWN0KHtcbiAgICAgICAgICAgIHN0YXRlOiBzdGF0ZSxcbiAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICBpbnN0YW5jZTogaW5zdGFuY2UsXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB2YXIgbm9vcEZuID0gZnVuY3Rpb24gbm9vcEZuKCkge307XG5cbiAgICAgICAgICBlZmZlY3RDbGVhbnVwRm5zLnB1c2goY2xlYW51cEZuIHx8IG5vb3BGbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNsZWFudXBNb2RpZmllckVmZmVjdHMoKSB7XG4gICAgICBlZmZlY3RDbGVhbnVwRm5zLmZvckVhY2goZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgIHJldHVybiBmbigpO1xuICAgICAgfSk7XG4gICAgICBlZmZlY3RDbGVhbnVwRm5zID0gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9O1xufVxuZXhwb3J0IHZhciBjcmVhdGVQb3BwZXIgPSAvKiNfX1BVUkVfXyovcG9wcGVyR2VuZXJhdG9yKCk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0IHsgZGV0ZWN0T3ZlcmZsb3cgfTsiLCJpbXBvcnQgeyBwb3BwZXJHZW5lcmF0b3IsIGRldGVjdE92ZXJmbG93IH0gZnJvbSBcIi4vY3JlYXRlUG9wcGVyLmpzXCI7XG5pbXBvcnQgZXZlbnRMaXN0ZW5lcnMgZnJvbSBcIi4vbW9kaWZpZXJzL2V2ZW50TGlzdGVuZXJzLmpzXCI7XG5pbXBvcnQgcG9wcGVyT2Zmc2V0cyBmcm9tIFwiLi9tb2RpZmllcnMvcG9wcGVyT2Zmc2V0cy5qc1wiO1xuaW1wb3J0IGNvbXB1dGVTdHlsZXMgZnJvbSBcIi4vbW9kaWZpZXJzL2NvbXB1dGVTdHlsZXMuanNcIjtcbmltcG9ydCBhcHBseVN0eWxlcyBmcm9tIFwiLi9tb2RpZmllcnMvYXBwbHlTdHlsZXMuanNcIjtcbmltcG9ydCBvZmZzZXQgZnJvbSBcIi4vbW9kaWZpZXJzL29mZnNldC5qc1wiO1xuaW1wb3J0IGZsaXAgZnJvbSBcIi4vbW9kaWZpZXJzL2ZsaXAuanNcIjtcbmltcG9ydCBwcmV2ZW50T3ZlcmZsb3cgZnJvbSBcIi4vbW9kaWZpZXJzL3ByZXZlbnRPdmVyZmxvdy5qc1wiO1xuaW1wb3J0IGFycm93IGZyb20gXCIuL21vZGlmaWVycy9hcnJvdy5qc1wiO1xuaW1wb3J0IGhpZGUgZnJvbSBcIi4vbW9kaWZpZXJzL2hpZGUuanNcIjtcbnZhciBkZWZhdWx0TW9kaWZpZXJzID0gW2V2ZW50TGlzdGVuZXJzLCBwb3BwZXJPZmZzZXRzLCBjb21wdXRlU3R5bGVzLCBhcHBseVN0eWxlcywgb2Zmc2V0LCBmbGlwLCBwcmV2ZW50T3ZlcmZsb3csIGFycm93LCBoaWRlXTtcbnZhciBjcmVhdGVQb3BwZXIgPSAvKiNfX1BVUkVfXyovcG9wcGVyR2VuZXJhdG9yKHtcbiAgZGVmYXVsdE1vZGlmaWVyczogZGVmYXVsdE1vZGlmaWVyc1xufSk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0IHsgY3JlYXRlUG9wcGVyLCBwb3BwZXJHZW5lcmF0b3IsIGRlZmF1bHRNb2RpZmllcnMsIGRldGVjdE92ZXJmbG93IH07IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0IHsgY3JlYXRlUG9wcGVyIGFzIGNyZWF0ZVBvcHBlckxpdGUgfSBmcm9tIFwiLi9wb3BwZXItbGl0ZS5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCAqIGZyb20gXCIuL21vZGlmaWVycy9pbmRleC5qc1wiOyIsIi8vIFN0b2xlIEFsbCB0aGlzIGZyb20gTGlhbSdzIFBlcmlvZGljIE5vdGVzIFBsdWdpbjogaHR0cHM6Ly9naXRodWIuY29tL2xpYW1jYWluL29ic2lkaWFuLXBlcmlvZGljLW5vdGVzXG5cbmltcG9ydCB7IEFwcCwgSVN1Z2dlc3RPd25lciwgU2NvcGUsIFRGaWxlLCBUQWJzdHJhY3RGaWxlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQgeyBjcmVhdGVQb3BwZXIsIEluc3RhbmNlIGFzIFBvcHBlckluc3RhbmNlIH0gZnJvbSBcIkBwb3BwZXJqcy9jb3JlXCI7XG5pbXBvcnQgeyBFeHRlbmRlZEJsb2NrQ2FjaGUgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgZ2V0U3RvcmUgfSBmcm9tIFwiLi9idXR0b25TdG9yZVwiO1xuXG5pbXBvcnQgeyB3cmFwQXJvdW5kIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuY2xhc3MgU3VnZ2VzdDxUPiB7XG4gIHByaXZhdGUgb3duZXI6IElTdWdnZXN0T3duZXI8VD47XG4gIHByaXZhdGUgdmFsdWVzOiBUW107XG4gIHByaXZhdGUgc3VnZ2VzdGlvbnM6IEhUTUxEaXZFbGVtZW50W107XG4gIHByaXZhdGUgc2VsZWN0ZWRJdGVtOiBudW1iZXI7XG4gIHByaXZhdGUgY29udGFpbmVyRWw6IEhUTUxFbGVtZW50O1xuXG4gIGNvbnN0cnVjdG9yKG93bmVyOiBJU3VnZ2VzdE93bmVyPFQ+LCBjb250YWluZXJFbDogSFRNTEVsZW1lbnQsIHNjb3BlOiBTY29wZSkge1xuICAgIHRoaXMub3duZXIgPSBvd25lcjtcbiAgICB0aGlzLmNvbnRhaW5lckVsID0gY29udGFpbmVyRWw7XG5cbiAgICBjb250YWluZXJFbC5vbihcbiAgICAgIFwiY2xpY2tcIixcbiAgICAgIFwiLnN1Z2dlc3Rpb24taXRlbVwiLFxuICAgICAgdGhpcy5vblN1Z2dlc3Rpb25DbGljay5iaW5kKHRoaXMpXG4gICAgKTtcbiAgICBjb250YWluZXJFbC5vbihcbiAgICAgIFwibW91c2Vtb3ZlXCIsXG4gICAgICBcIi5zdWdnZXN0aW9uLWl0ZW1cIixcbiAgICAgIHRoaXMub25TdWdnZXN0aW9uTW91c2VvdmVyLmJpbmQodGhpcylcbiAgICApO1xuXG4gICAgc2NvcGUucmVnaXN0ZXIoW10sIFwiQXJyb3dVcFwiLCAoZXZlbnQpID0+IHtcbiAgICAgIGlmICghZXZlbnQuaXNDb21wb3NpbmcpIHtcbiAgICAgICAgdGhpcy5zZXRTZWxlY3RlZEl0ZW0odGhpcy5zZWxlY3RlZEl0ZW0gLSAxLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgc2NvcGUucmVnaXN0ZXIoW10sIFwiQXJyb3dEb3duXCIsIChldmVudCkgPT4ge1xuICAgICAgaWYgKCFldmVudC5pc0NvbXBvc2luZykge1xuICAgICAgICB0aGlzLnNldFNlbGVjdGVkSXRlbSh0aGlzLnNlbGVjdGVkSXRlbSArIDEsIHRydWUpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBzY29wZS5yZWdpc3RlcihbXSwgXCJFbnRlclwiLCAoZXZlbnQpID0+IHtcbiAgICAgIGlmICghZXZlbnQuaXNDb21wb3NpbmcpIHtcbiAgICAgICAgdGhpcy51c2VTZWxlY3RlZEl0ZW0oZXZlbnQpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBvblN1Z2dlc3Rpb25DbGljayhldmVudDogTW91c2VFdmVudCwgZWw6IEhUTUxEaXZFbGVtZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLnN1Z2dlc3Rpb25zLmluZGV4T2YoZWwpO1xuICAgIHRoaXMuc2V0U2VsZWN0ZWRJdGVtKGl0ZW0sIGZhbHNlKTtcbiAgICB0aGlzLnVzZVNlbGVjdGVkSXRlbShldmVudCk7XG4gIH1cblxuICBvblN1Z2dlc3Rpb25Nb3VzZW92ZXIoX2V2ZW50OiBNb3VzZUV2ZW50LCBlbDogSFRNTERpdkVsZW1lbnQpOiB2b2lkIHtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5zdWdnZXN0aW9ucy5pbmRleE9mKGVsKTtcbiAgICB0aGlzLnNldFNlbGVjdGVkSXRlbShpdGVtLCBmYWxzZSk7XG4gIH1cblxuICBzZXRTdWdnZXN0aW9ucyh2YWx1ZXM6IFRbXSkge1xuICAgIHRoaXMuY29udGFpbmVyRWwuZW1wdHkoKTtcbiAgICBjb25zdCBzdWdnZXN0aW9uRWxzOiBIVE1MRGl2RWxlbWVudFtdID0gW107XG5cbiAgICB2YWx1ZXMuZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IHN1Z2dlc3Rpb25FbCA9IHRoaXMuY29udGFpbmVyRWwuY3JlYXRlRGl2KFwic3VnZ2VzdGlvbi1pdGVtXCIpO1xuICAgICAgdGhpcy5vd25lci5yZW5kZXJTdWdnZXN0aW9uKHZhbHVlLCBzdWdnZXN0aW9uRWwpO1xuICAgICAgc3VnZ2VzdGlvbkVscy5wdXNoKHN1Z2dlc3Rpb25FbCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnZhbHVlcyA9IHZhbHVlcztcbiAgICB0aGlzLnN1Z2dlc3Rpb25zID0gc3VnZ2VzdGlvbkVscztcbiAgICB0aGlzLnNldFNlbGVjdGVkSXRlbSgwLCBmYWxzZSk7XG4gIH1cblxuICB1c2VTZWxlY3RlZEl0ZW0oZXZlbnQ6IE1vdXNlRXZlbnQgfCBLZXlib2FyZEV2ZW50KSB7XG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy52YWx1ZXNbdGhpcy5zZWxlY3RlZEl0ZW1dO1xuICAgIGlmIChjdXJyZW50VmFsdWUpIHtcbiAgICAgIHRoaXMub3duZXIuc2VsZWN0U3VnZ2VzdGlvbihjdXJyZW50VmFsdWUsIGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBzZXRTZWxlY3RlZEl0ZW0oc2VsZWN0ZWRJbmRleDogbnVtYmVyLCBzY3JvbGxJbnRvVmlldzogYm9vbGVhbikge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRJbmRleCA9IHdyYXBBcm91bmQoc2VsZWN0ZWRJbmRleCwgdGhpcy5zdWdnZXN0aW9ucy5sZW5ndGgpO1xuICAgIGNvbnN0IHByZXZTZWxlY3RlZFN1Z2dlc3Rpb24gPSB0aGlzLnN1Z2dlc3Rpb25zW3RoaXMuc2VsZWN0ZWRJdGVtXTtcbiAgICBjb25zdCBzZWxlY3RlZFN1Z2dlc3Rpb24gPSB0aGlzLnN1Z2dlc3Rpb25zW25vcm1hbGl6ZWRJbmRleF07XG5cbiAgICBwcmV2U2VsZWN0ZWRTdWdnZXN0aW9uPy5yZW1vdmVDbGFzcyhcImlzLXNlbGVjdGVkXCIpO1xuICAgIHNlbGVjdGVkU3VnZ2VzdGlvbj8uYWRkQ2xhc3MoXCJpcy1zZWxlY3RlZFwiKTtcblxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gbm9ybWFsaXplZEluZGV4O1xuXG4gICAgaWYgKHNjcm9sbEludG9WaWV3KSB7XG4gICAgICBzZWxlY3RlZFN1Z2dlc3Rpb24uc2Nyb2xsSW50b1ZpZXcoZmFsc2UpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVGV4dElucHV0U3VnZ2VzdDxUPiBpbXBsZW1lbnRzIElTdWdnZXN0T3duZXI8VD4ge1xuICBwcm90ZWN0ZWQgYXBwOiBBcHA7XG4gIHByb3RlY3RlZCBpbnB1dEVsOiBIVE1MSW5wdXRFbGVtZW50O1xuXG4gIHByaXZhdGUgcG9wcGVyOiBQb3BwZXJJbnN0YW5jZTtcbiAgcHJpdmF0ZSBzY29wZTogU2NvcGU7XG4gIHByaXZhdGUgc3VnZ2VzdEVsOiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBzdWdnZXN0OiBTdWdnZXN0PFQ+O1xuXG4gIGNvbnN0cnVjdG9yKGFwcDogQXBwLCBpbnB1dEVsOiBIVE1MSW5wdXRFbGVtZW50KSB7XG4gICAgdGhpcy5hcHAgPSBhcHA7XG4gICAgdGhpcy5pbnB1dEVsID0gaW5wdXRFbDtcbiAgICB0aGlzLnNjb3BlID0gbmV3IFNjb3BlKCk7XG5cbiAgICB0aGlzLnN1Z2dlc3RFbCA9IGNyZWF0ZURpdihcInN1Z2dlc3Rpb24tY29udGFpbmVyXCIpO1xuICAgIGNvbnN0IHN1Z2dlc3Rpb24gPSB0aGlzLnN1Z2dlc3RFbC5jcmVhdGVEaXYoXCJzdWdnZXN0aW9uXCIpO1xuICAgIHRoaXMuc3VnZ2VzdCA9IG5ldyBTdWdnZXN0KHRoaXMsIHN1Z2dlc3Rpb24sIHRoaXMuc2NvcGUpO1xuXG4gICAgdGhpcy5zY29wZS5yZWdpc3RlcihbXSwgXCJFc2NhcGVcIiwgdGhpcy5jbG9zZS5iaW5kKHRoaXMpKTtcblxuICAgIHRoaXMuaW5wdXRFbC5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgdGhpcy5vbklucHV0Q2hhbmdlZC5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLmlucHV0RWwuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsIHRoaXMub25JbnB1dENoYW5nZWQuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5pbnB1dEVsLmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIHRoaXMuY2xvc2UuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5zdWdnZXN0RWwub24oXG4gICAgICBcIm1vdXNlZG93blwiLFxuICAgICAgXCIuc3VnZ2VzdGlvbi1jb250YWluZXJcIixcbiAgICAgIChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBvbklucHV0Q2hhbmdlZCgpOiB2b2lkIHtcbiAgICBjb25zdCBpbnB1dFN0ciA9IHRoaXMuaW5wdXRFbC52YWx1ZTtcbiAgICBjb25zdCBzdWdnZXN0aW9ucyA9IHRoaXMuZ2V0U3VnZ2VzdGlvbnMoaW5wdXRTdHIpO1xuXG4gICAgaWYgKHN1Z2dlc3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc3VnZ2VzdC5zZXRTdWdnZXN0aW9ucyhzdWdnZXN0aW9ucyk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgdGhpcy5vcGVuKCg8YW55PnRoaXMuYXBwKS5kb20uYXBwQ29udGFpbmVyRWwsIHRoaXMuaW5wdXRFbCk7XG4gICAgfVxuICB9XG5cbiAgb3Blbihjb250YWluZXI6IEhUTUxFbGVtZW50LCBpbnB1dEVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgKDxhbnk+dGhpcy5hcHApLmtleW1hcC5wdXNoU2NvcGUodGhpcy5zY29wZSk7XG5cbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5zdWdnZXN0RWwpO1xuICAgIHRoaXMucG9wcGVyID0gY3JlYXRlUG9wcGVyKGlucHV0RWwsIHRoaXMuc3VnZ2VzdEVsLCB7XG4gICAgICBwbGFjZW1lbnQ6IFwiYm90dG9tLXN0YXJ0XCIsXG4gICAgICBtb2RpZmllcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwic2FtZVdpZHRoXCIsXG4gICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICBmbjogKHsgc3RhdGUsIGluc3RhbmNlIH0pID0+IHtcbiAgICAgICAgICAgIC8vIE5vdGU6IHBvc2l0aW9uaW5nIG5lZWRzIHRvIGJlIGNhbGN1bGF0ZWQgdHdpY2UgLVxuICAgICAgICAgICAgLy8gZmlyc3QgcGFzcyAtIHBvc2l0aW9uaW5nIGl0IGFjY29yZGluZyB0byB0aGUgd2lkdGggb2YgdGhlIHBvcHBlclxuICAgICAgICAgICAgLy8gc2Vjb25kIHBhc3MgLSBwb3NpdGlvbiBpdCB3aXRoIHRoZSB3aWR0aCBib3VuZCB0byB0aGUgcmVmZXJlbmNlIGVsZW1lbnRcbiAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gZWFybHkgZXhpdCB0byBhdm9pZCBhbiBpbmZpbml0ZSBsb29wXG4gICAgICAgICAgICBjb25zdCB0YXJnZXRXaWR0aCA9IGAke3N0YXRlLnJlY3RzLnJlZmVyZW5jZS53aWR0aH1weGA7XG4gICAgICAgICAgICBpZiAoc3RhdGUuc3R5bGVzLnBvcHBlci53aWR0aCA9PT0gdGFyZ2V0V2lkdGgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RhdGUuc3R5bGVzLnBvcHBlci53aWR0aCA9IHRhcmdldFdpZHRoO1xuICAgICAgICAgICAgaW5zdGFuY2UudXBkYXRlKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBwaGFzZTogXCJiZWZvcmVXcml0ZVwiLFxuICAgICAgICAgIHJlcXVpcmVzOiBbXCJjb21wdXRlU3R5bGVzXCJdLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIGNsb3NlKCk6IHZvaWQge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgKDxhbnk+dGhpcy5hcHApLmtleW1hcC5wb3BTY29wZSh0aGlzLnNjb3BlKTtcblxuICAgIHRoaXMuc3VnZ2VzdC5zZXRTdWdnZXN0aW9ucyhbXSk7XG4gICAgdGhpcy5wb3BwZXIgJiYgdGhpcy5wb3BwZXIuZGVzdHJveSgpO1xuICAgIHRoaXMuc3VnZ2VzdEVsLmRldGFjaCgpO1xuICB9XG5cbiAgYWJzdHJhY3QgZ2V0U3VnZ2VzdGlvbnMoaW5wdXRTdHI6IHN0cmluZyk6IFRbXTtcbiAgYWJzdHJhY3QgcmVuZGVyU3VnZ2VzdGlvbihpdGVtOiBULCBlbDogSFRNTEVsZW1lbnQpOiB2b2lkO1xuICBhYnN0cmFjdCBzZWxlY3RTdWdnZXN0aW9uKGl0ZW06IFQpOiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgQ29tbWFuZCB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIENvbW1hbmRTdWdnZXN0IGV4dGVuZHMgVGV4dElucHV0U3VnZ2VzdDxDb21tYW5kPiB7XG4gIGdldFN1Z2dlc3Rpb25zKGlucHV0U3RyOiBzdHJpbmcpOiBDb21tYW5kW10ge1xuICAgIGNvbnN0IGNvbW1hbmRzID0gdGhpcy5hcHAuY29tbWFuZHMuY29tbWFuZHM7XG4gICAgY29uc3QgY29tbWFuZE5hbWVzOiBDb21tYW5kW10gPSBbXTtcbiAgICBjb25zdCBpbnB1dExvd2VyQ2FzZSA9IGlucHV0U3RyLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBmb3IgKGNvbnN0IGNvbW1hbmQgaW4gY29tbWFuZHMpIHtcbiAgICAgIGNvbnN0IGNvbW1hbmRPYmogPSBjb21tYW5kc1tjb21tYW5kXTtcbiAgICAgIGlmIChjb21tYW5kT2JqLm5hbWUudG9Mb3dlckNhc2UoKS5jb250YWlucyhpbnB1dExvd2VyQ2FzZSkpIHtcbiAgICAgICAgY29tbWFuZE5hbWVzLnB1c2goY29tbWFuZE9iaik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb21tYW5kTmFtZXM7XG4gIH1cblxuICByZW5kZXJTdWdnZXN0aW9uKGNvbW1hbmQ6IENvbW1hbmQsIGVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGVsLnNldFRleHQoY29tbWFuZC5uYW1lKTtcbiAgfVxuXG4gIHNlbGVjdFN1Z2dlc3Rpb24oY29tbWFuZDogQ29tbWFuZCk6IHZvaWQge1xuICAgIHRoaXMuaW5wdXRFbC52YWx1ZSA9IGNvbW1hbmQubmFtZTtcbiAgICB0aGlzLmlucHV0RWwudHJpZ2dlcihcImlucHV0XCIpO1xuICAgIHRoaXMuY2xvc2UoKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVTdWdnZXN0IGV4dGVuZHMgVGV4dElucHV0U3VnZ2VzdDxURmlsZT4ge1xuICBwcml2YXRlIHRlbXBsYXRlc0VuYWJsZWQgPSB0aGlzLmFwcC5pbnRlcm5hbFBsdWdpbnMucGx1Z2lucy50ZW1wbGF0ZXMuZW5hYmxlZDtcbiAgcHJpdmF0ZSB0ZW1wbGF0ZXJQbHVnaW4gPSB0aGlzLmFwcC5wbHVnaW5zLnBsdWdpbnNbXCJ0ZW1wbGF0ZXItb2JzaWRpYW5cIl07XG4gIC8vIG9ubHkgcnVuIGlmIHRlbXBsYXRlcyBwbHVnaW4gaXMgZW5hYmxlZFxuICBwcml2YXRlIGZvbGRlciA9ICgpOiBzdHJpbmdbXSA9PiB7XG4gICAgY29uc3QgZm9sZGVycyA9IFtdO1xuICAgIGlmICh0aGlzLnRlbXBsYXRlc0VuYWJsZWQpIHtcbiAgICAgIGNvbnN0IGZvbGRlciA9IHRoaXMuYXBwLmludGVybmFsUGx1Z2lucy5wbHVnaW5zLnRlbXBsYXRlcy5pbnN0YW5jZS5vcHRpb25zXG4gICAgICAgIC5mb2xkZXI7XG4gICAgICBpZiAoZm9sZGVyKSB7XG4gICAgICAgIGZvbGRlcnMucHVzaChmb2xkZXIudG9Mb3dlckNhc2UoKSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy50ZW1wbGF0ZXJQbHVnaW4pIHtcbiAgICAgICAgY29uc3QgZm9sZGVyID0gdGhpcy50ZW1wbGF0ZXJQbHVnaW4uc2V0dGluZ3MudGVtcGxhdGVfZm9sZGVyO1xuICAgICAgICBpZiAoZm9sZGVyKSB7XG4gICAgICAgICAgZm9sZGVycy5wdXNoKGZvbGRlci50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm9sZGVyc1swXSA/IGZvbGRlcnMgOiB1bmRlZmluZWQ7XG4gIH07XG5cbiAgZ2V0U3VnZ2VzdGlvbnMoaW5wdXRTdHI6IHN0cmluZyk6IFRGaWxlW10ge1xuICAgIGNvbnN0IGFic3RyYWN0RmlsZXMgPSB0aGlzLmFwcC52YXVsdC5nZXRBbGxMb2FkZWRGaWxlcygpO1xuICAgIGNvbnN0IGZpbGVzOiBURmlsZVtdID0gW107XG4gICAgY29uc3QgbG93ZXJDYXNlSW5wdXRTdHIgPSBpbnB1dFN0ci50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGZvbGRlcnMgPSB0aGlzLmZvbGRlcigpO1xuXG4gICAgYWJzdHJhY3RGaWxlcy5mb3JFYWNoKChmaWxlOiBUQWJzdHJhY3RGaWxlKSA9PiB7XG4gICAgICBsZXQgZXhpc3RzID0gZmFsc2U7XG4gICAgICBmb2xkZXJzICYmXG4gICAgICAgIGZvbGRlcnMuZm9yRWFjaCgoZm9sZGVyKSA9PiB7XG4gICAgICAgICAgaWYgKGZpbGUucGF0aC50b0xvd2VyQ2FzZSgpLmNvbnRhaW5zKGAke2ZvbGRlcn0vYCkpIHtcbiAgICAgICAgICAgIGV4aXN0cyA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIGlmIChcbiAgICAgICAgZmlsZSBpbnN0YW5jZW9mIFRGaWxlICYmXG4gICAgICAgIGZpbGUuZXh0ZW5zaW9uID09PSBcIm1kXCIgJiZcbiAgICAgICAgZXhpc3RzICYmXG4gICAgICAgIGZpbGUucGF0aC50b0xvd2VyQ2FzZSgpLmNvbnRhaW5zKGxvd2VyQ2FzZUlucHV0U3RyKVxuICAgICAgKSB7XG4gICAgICAgIGZpbGVzLnB1c2goZmlsZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZmlsZXM7XG4gIH1cblxuICByZW5kZXJTdWdnZXN0aW9uKGZpbGU6IFRGaWxlLCBlbDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBlbC5zZXRUZXh0KGZpbGUubmFtZS5zcGxpdChcIi5cIilbMF0pO1xuICB9XG5cbiAgc2VsZWN0U3VnZ2VzdGlvbihmaWxlOiBURmlsZSk6IHZvaWQge1xuICAgIHRoaXMuaW5wdXRFbC52YWx1ZSA9IGZpbGUubmFtZS5zcGxpdChcIi5cIilbMF07XG4gICAgdGhpcy5pbnB1dEVsLnRyaWdnZXIoXCJpbnB1dFwiKTtcbiAgICB0aGlzLmNsb3NlKCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJ1dHRvblN1Z2dlc3QgZXh0ZW5kcyBUZXh0SW5wdXRTdWdnZXN0PHN0cmluZz4ge1xuICBnZXRTdWdnZXN0aW9ucygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgYnV0dG9uU3RvcmUgPSBnZXRTdG9yZSh0aGlzLmFwcC5pc01vYmlsZSk7XG4gICAgY29uc3QgYnV0dG9uczogc3RyaW5nW10gPSBbXTtcblxuICAgIGJ1dHRvblN0b3JlLmZvckVhY2goKGJ1dHRvbjogRXh0ZW5kZWRCbG9ja0NhY2hlKSA9PiB7XG4gICAgICBjb25zdCB0cmltbWVkID0gYnV0dG9uLmlkLnNwbGl0KFwiLVwiKVsxXTtcbiAgICAgIGJ1dHRvbnMucHVzaCh0cmltbWVkKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBidXR0b25zO1xuICB9XG5cbiAgcmVuZGVyU3VnZ2VzdGlvbihidXR0b246IHN0cmluZywgZWw6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgZWwuc2V0VGV4dChidXR0b24pO1xuICB9XG5cbiAgc2VsZWN0U3VnZ2VzdGlvbihidXR0b246IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuaW5wdXRFbC52YWx1ZSA9IHRoaXMuaW5wdXRFbC52YWx1ZSArIGJ1dHRvbjtcbiAgICB0aGlzLmlucHV0RWwudHJpZ2dlcihcImlucHV0XCIpO1xuICAgIHRoaXMuY2xvc2UoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTW9kYWwsIEFwcCwgU2V0dGluZywgTWFya2Rvd25WaWV3LCBFZGl0b3IgfSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCB7IGNyZWF0ZUJ1dHRvbiB9IGZyb20gXCIuL2J1dHRvblwiO1xuaW1wb3J0IHsgQ29tbWFuZFN1Z2dlc3QsIFRlbXBsYXRlU3VnZ2VzdCwgQnV0dG9uU3VnZ2VzdCB9IGZyb20gXCIuL3N1Z2dlc3RcIjtcbmltcG9ydCB7IGluc2VydEJ1dHRvbiwgaW5zZXJ0SW5saW5lQnV0dG9uIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGNsYXNzIEJ1dHRvbk1vZGFsIGV4dGVuZHMgTW9kYWwge1xuICBhY3RpdmVWaWV3OiBNYXJrZG93blZpZXc7XG4gIGFjdGl2ZUVkaXRvcjogRWRpdG9yO1xuICBhY3RpdmVDdXJzb3I6IENvZGVNaXJyb3IuUG9zaXRpb247XG4gIGFjdGlvbkludGVydmFsOiBUaW1lb3V0O1xuICBidXR0b25QcmV2aWV3RWw6IEhUTUxFbGVtZW50ID0gY3JlYXRlRWwoXCJwXCIpO1xuICBjb21tYW5kU3VnZ2VzdEVsOiBIVE1MSW5wdXRFbGVtZW50ID0gY3JlYXRlRWwoXCJpbnB1dFwiLCB7IHR5cGU6IFwidGV4dFwiIH0pO1xuICBmaWxlU3VnZ2VzdEVsOiBIVE1MSW5wdXRFbGVtZW50ID0gY3JlYXRlRWwoXCJpbnB1dFwiLCB7IHR5cGU6IFwidGV4dFwiIH0pO1xuICByZW1vdmVTdWdnZXN0RWw6IEhUTUxJbnB1dEVsZW1lbnQgPSBjcmVhdGVFbChcImlucHV0XCIsIHsgdHlwZTogXCJ0ZXh0XCIgfSk7XG4gIHN3YXBTdWdnZXN0RWw6IEhUTUxJbnB1dEVsZW1lbnQgPSBjcmVhdGVFbChcImlucHV0XCIsIHsgdHlwZTogXCJ0ZXh0XCIgfSk7XG4gIGlkU3VnZ2VzdEVsOiBIVE1MSW5wdXRFbGVtZW50ID0gY3JlYXRlRWwoXCJpbnB1dFwiLCB7IHR5cGU6IFwidGV4dFwiIH0pO1xuICByZW1vdmVTdWdnZXN0O1xuICBzd2FwU3VnZ2VzdDtcbiAgaWRTdWdnZXN0O1xuICBjb21tYW5kU3VnZ2VzdDtcbiAgZmlsZVN1Z2dlc3Q7XG5cbiAgY29uc3RydWN0b3IoYXBwOiBBcHApIHtcbiAgICBzdXBlcihhcHApO1xuICAgIHRoaXMuY29tbWFuZFN1Z2dlc3QgPSBuZXcgQ29tbWFuZFN1Z2dlc3QodGhpcy5hcHAsIHRoaXMuY29tbWFuZFN1Z2dlc3RFbCk7XG4gICAgdGhpcy5jb21tYW5kU3VnZ2VzdEVsLnBsYWNlaG9sZGVyID0gXCJUb2dnbGUgUGluXCI7XG4gICAgdGhpcy5jb21tYW5kU3VnZ2VzdEVsLmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgKGU6IEV2ZW50KSA9PiB7XG4gICAgICB0aGlzLm91dHB1dE9iamVjdC5hY3Rpb24gPSAoPEhUTUxJbnB1dEVsZW1lbnQ+ZS50YXJnZXQpLnZhbHVlO1xuICAgIH0pO1xuICAgIHRoaXMuY29tbWFuZFN1Z2dlc3RFbC5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCAoZTogRXZlbnQpID0+IHtcbiAgICAgIHRoaXMub3V0cHV0T2JqZWN0LmFjdGlvbiA9ICg8SFRNTElucHV0RWxlbWVudD5lLnRhcmdldCkudmFsdWU7XG4gICAgfSk7XG4gICAgdGhpcy5maWxlU3VnZ2VzdCA9IG5ldyBUZW1wbGF0ZVN1Z2dlc3QodGhpcy5hcHAsIHRoaXMuZmlsZVN1Z2dlc3RFbCk7XG4gICAgdGhpcy5maWxlU3VnZ2VzdEVsLnBsYWNlaG9sZGVyID0gXCJNeSBUZW1wbGF0ZVwiO1xuICAgIHRoaXMuZmlsZVN1Z2dlc3RFbC5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIChlKSA9PiB7XG4gICAgICB0aGlzLm91dHB1dE9iamVjdC5hY3Rpb24gPSAoPEhUTUxJbnB1dEVsZW1lbnQ+ZS50YXJnZXQpLnZhbHVlO1xuICAgIH0pO1xuICAgIHRoaXMuZmlsZVN1Z2dlc3RFbC5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCAoZSkgPT4ge1xuICAgICAgdGhpcy5vdXRwdXRPYmplY3QuYWN0aW9uID0gKDxIVE1MSW5wdXRFbGVtZW50PmUudGFyZ2V0KS52YWx1ZTtcbiAgICB9KTtcbiAgICB0aGlzLnJlbW92ZVN1Z2dlc3QgPSBuZXcgQnV0dG9uU3VnZ2VzdCh0aGlzLmFwcCwgdGhpcy5yZW1vdmVTdWdnZXN0RWwpO1xuICAgIHRoaXMucmVtb3ZlU3VnZ2VzdEVsLnZhbHVlID0gXCJ0cnVlXCI7XG4gICAgdGhpcy5yZW1vdmVTdWdnZXN0RWwuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCAoZSkgPT4ge1xuICAgICAgdGhpcy5vdXRwdXRPYmplY3QucmVtb3ZlID0gKDxIVE1MSW5wdXRFbGVtZW50PmUudGFyZ2V0KS52YWx1ZTtcbiAgICB9KTtcbiAgICB0aGlzLnJlbW92ZVN1Z2dlc3RFbC5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCAoZSkgPT4ge1xuICAgICAgdGhpcy5vdXRwdXRPYmplY3QucmVtb3ZlID0gKDxIVE1MSW5wdXRFbGVtZW50PmUudGFyZ2V0KS52YWx1ZTtcbiAgICB9KTtcbiAgICB0aGlzLnN3YXBTdWdnZXN0ID0gbmV3IEJ1dHRvblN1Z2dlc3QodGhpcy5hcHAsIHRoaXMuc3dhcFN1Z2dlc3RFbCk7XG4gICAgdGhpcy5zd2FwU3VnZ2VzdEVsLmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgKGUpID0+IHtcbiAgICAgIHRoaXMub3V0cHV0T2JqZWN0LnN3YXAgPSAoPEhUTUxJbnB1dEVsZW1lbnQ+ZS50YXJnZXQpLnZhbHVlO1xuICAgIH0pO1xuICAgIHRoaXMuc3dhcFN1Z2dlc3RFbC5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCAoZSkgPT4ge1xuICAgICAgdGhpcy5vdXRwdXRPYmplY3Quc3dhcCA9ICg8SFRNTElucHV0RWxlbWVudD5lLnRhcmdldCkudmFsdWU7XG4gICAgfSk7XG4gICAgdGhpcy5pZFN1Z2dlc3QgPSBuZXcgQnV0dG9uU3VnZ2VzdCh0aGlzLmFwcCwgdGhpcy5pZFN1Z2dlc3RFbCk7XG4gICAgdGhpcy5pZFN1Z2dlc3RFbC5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIChlKSA9PiB7XG4gICAgICB0aGlzLm91dHB1dE9iamVjdC5pZCA9ICg8SFRNTElucHV0RWxlbWVudD5lLnRhcmdldCkudmFsdWU7XG4gICAgfSk7XG4gICAgdGhpcy5pZFN1Z2dlc3RFbC5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCAoZSkgPT4ge1xuICAgICAgdGhpcy5vdXRwdXRPYmplY3QuaWQgPSAoPEhUTUxJbnB1dEVsZW1lbnQ+ZS50YXJnZXQpLnZhbHVlO1xuICAgIH0pO1xuICAgIHRoaXMuc3dhcFN1Z2dlc3RFbC5wbGFjZWhvbGRlciA9IFwiW2lkT25lLCBpZFR3b11cIjtcbiAgfVxuXG4gIHByaXZhdGUgb3V0cHV0T2JqZWN0ID0ge1xuICAgIG5hbWU6IFwiXCIsXG4gICAgdHlwZTogXCJcIixcbiAgICBhY3Rpb246IFwiXCIsXG4gICAgc3dhcDogXCJcIixcbiAgICByZW1vdmU6IFwiXCIsXG4gICAgcmVwbGFjZTogXCJcIixcbiAgICBpZDogXCJcIixcbiAgICB0ZW1wbGF0ZXI6IGZhbHNlLFxuICAgIGNsYXNzOiBcIlwiLFxuICAgIGNvbG9yOiBcIlwiLFxuICAgIGJsb2NrSWQ6IFwiXCIsXG4gIH07XG5cbiAgb25PcGVuKCk6IHZvaWQge1xuICAgIGNvbnN0IHsgdGl0bGVFbCwgY29udGVudEVsIH0gPSB0aGlzO1xuICAgIHRpdGxlRWwuc2V0VGV4dChcIkJ1dHRvbiBNYWtlclwiKTtcbiAgICBjb250ZW50RWwuYWRkQ2xhc3MoXCJidXR0b24tbWFrZXJcIik7XG4gICAgY29udGVudEVsLmNyZWF0ZUVsKFwiZm9ybVwiLCB7fSwgKGZvcm1FbCkgPT4ge1xuICAgICAgbmV3IFNldHRpbmcoZm9ybUVsKVxuICAgICAgICAuc2V0TmFtZShcIkJ1dHRvbiBOYW1lXCIpXG4gICAgICAgIC5zZXREZXNjKFwiV2hhdCB3b3VsZCB5b3UgbGlrZSB0byBjYWxsIHRoaXMgYnV0dG9uP1wiKVxuICAgICAgICAuYWRkVGV4dCgodGV4dEVsKSA9PiB7XG4gICAgICAgICAgdGV4dEVsLnNldFBsYWNlaG9sZGVyKFwiTXkgQXdlc29tZSBCdXR0b25cIik7XG4gICAgICAgICAgdGV4dEVsLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5idXR0b25QcmV2aWV3RWwuc2V0VGV4dCh2YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLm91dHB1dE9iamVjdC5uYW1lID0gdmFsdWU7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB0ZXh0RWwuaW5wdXRFbC5mb2N1cygpLCAxMCk7XG4gICAgICAgIH0pO1xuICAgICAgY29uc3QgdHlwZUNvbnRhaW5lciA9IGNyZWF0ZUVsKFwiZGl2XCIpO1xuICAgICAgY29uc3QgdHlwZVRpdGxlID0gY3JlYXRlRWwoXCJzcGFuXCIsIHsgY2xzOiBcInNldHRpbmctaXRlbS10aXRsZVwiIH0pO1xuICAgICAgdHlwZVRpdGxlLnNldFRleHQoXCJCdXR0b24gVHlwZVwiKTtcbiAgICAgIGNvbnN0IHR5cGVEZXNjID0gY3JlYXRlRWwoXCJkaXZcIiwgeyBjbHM6IFwic2V0dGluZy1pdGVtLWRlc2NyaXB0aW9uXCIgfSk7XG4gICAgICB0eXBlRGVzYy5zZXRUZXh0KFwiV2hhdCB0eXBlIG9mIGJ1dHRvbiBhcmUgeW91IG1ha2luZz9cIik7XG4gICAgICBmb3JtRWwuYXBwZW5kQ2hpbGQodHlwZUNvbnRhaW5lcik7XG4gICAgICB0eXBlQ29udGFpbmVyLmFwcGVuZENoaWxkKHR5cGVUaXRsZSk7XG4gICAgICB0eXBlQ29udGFpbmVyLmFwcGVuZENoaWxkKHR5cGVEZXNjKTtcbiAgICAgIG5ldyBTZXR0aW5nKHR5cGVEZXNjKS5hZGREcm9wZG93bigoZHJvcCkgPT4ge1xuICAgICAgICBkcm9wLmFkZE9wdGlvbihcInByZVwiLCBcIlNlbGVjdCBhIEJ1dHRvbiBUeXBlXCIpO1xuICAgICAgICBkcm9wLmFkZE9wdGlvbihcImNvbW1hbmRcIiwgXCJDb21tYW5kIC0gcnVuIGEgY29tbWFuZCBwcm9tcHQgY29tbWFuZFwiKTtcbiAgICAgICAgZHJvcC5hZGRPcHRpb24oXCJsaW5rXCIsIFwiTGluayAtIG9wZW4gYSB1cmwgb3IgdXJpXCIpO1xuICAgICAgICBkcm9wLmFkZE9wdGlvbihcbiAgICAgICAgICBcInRlbXBsYXRlXCIsXG4gICAgICAgICAgXCJUZW1wbGF0ZSAtIGluc2VydCBvciBjcmVhdGUgbm90ZXMgZnJvbSB0ZW1wbGF0ZXNcIlxuICAgICAgICApO1xuICAgICAgICBkcm9wLmFkZE9wdGlvbihcInRleHRcIiwgXCJUZXh0IC0gaW5zZXJ0IG9yIGNyZWF0ZSBub3RlcyB3aXRoIHRleHRcIik7XG4gICAgICAgIGRyb3AuYWRkT3B0aW9uKFxuICAgICAgICAgIFwiY2FsY3VsYXRlXCIsXG4gICAgICAgICAgXCJDYWxjdWxhdGUgLSBydW4gYSBtYXRoZW1hdGljYWwgY2FsY3VsYXRpb25cIlxuICAgICAgICApO1xuICAgICAgICBkcm9wLmFkZE9wdGlvbihcbiAgICAgICAgICBcInN3YXBcIixcbiAgICAgICAgICBcIlN3YXAgLSBDcmVhdGUgYSBtdWx0aS1wdXJwb3NlIElubGluZSBCdXR0b24gZnJvbSBvdGhlciBCdXR0b25zXCJcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgYWN0aW9uID0gZm9ybUVsLmNyZWF0ZUVsKFwiZGl2XCIpO1xuICAgICAgICBkcm9wLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgIHRoaXMub3V0cHV0T2JqZWN0LnR5cGUgPSB2YWx1ZTtcbiAgICAgICAgICBpZiAodmFsdWUgPT09IFwibGlua1wiKSB7XG4gICAgICAgICAgICBhY3Rpb24uZW1wdHkoKTtcbiAgICAgICAgICAgIG5ldyBTZXR0aW5nKGFjdGlvbilcbiAgICAgICAgICAgICAgLnNldE5hbWUoXCJMaW5rXCIpXG4gICAgICAgICAgICAgIC5zZXREZXNjKFwiRW50ZXIgYSBsaW5rIHRvIG9wZW5cIilcbiAgICAgICAgICAgICAgLmFkZFRleHQoKHRleHRFbCkgPT4ge1xuICAgICAgICAgICAgICAgIHRleHRFbC5zZXRQbGFjZWhvbGRlcihcImh0dHBzOi8vb2JzaWRpYW4ubWRcIik7XG4gICAgICAgICAgICAgICAgdGV4dEVsLm9uQ2hhbmdlKCh2YWx1ZSkgPT4gKHRoaXMub3V0cHV0T2JqZWN0LmFjdGlvbiA9IHZhbHVlKSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmFsdWUgPT09IFwiY29tbWFuZFwiKSB7XG4gICAgICAgICAgICBhY3Rpb24uZW1wdHkoKTtcbiAgICAgICAgICAgIG5ldyBTZXR0aW5nKGFjdGlvbilcbiAgICAgICAgICAgICAgLnNldE5hbWUoXCJDb21tYW5kXCIpXG4gICAgICAgICAgICAgIC5zZXREZXNjKFwiRW50ZXIgYSBjb21tYW5kIHRvIHJ1blwiKVxuICAgICAgICAgICAgICAuYWRkVGV4dCgodGV4dEVsKSA9PiB7XG4gICAgICAgICAgICAgICAgdGV4dEVsLmlucHV0RWwucmVwbGFjZVdpdGgodGhpcy5jb21tYW5kU3VnZ2VzdEVsKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh2YWx1ZS5pbmNsdWRlcyhcInRlbXBsYXRlXCIpKSB7XG4gICAgICAgICAgICBhY3Rpb24uZW1wdHkoKTtcbiAgICAgICAgICAgIG5ldyBTZXR0aW5nKGFjdGlvbilcbiAgICAgICAgICAgICAgLnNldE5hbWUoXCJUZW1wbGF0ZVwiKVxuICAgICAgICAgICAgICAuc2V0RGVzYyhcIlNlbGVjdCBhIHRlbXBsYXRlIG5vdGUgYW5kIHdoYXQgc2hvdWxkIGhhcHBlblwiKVxuICAgICAgICAgICAgICAuYWRkRHJvcGRvd24oKGRyb3ApID0+IHtcbiAgICAgICAgICAgICAgICBkcm9wLmFkZE9wdGlvbihcInByZVwiLCBcIkRvIHRoaXMuLi5cIik7XG4gICAgICAgICAgICAgICAgZHJvcC5hZGRPcHRpb24oXCJwcmVwZW5kIHRlbXBsYXRlXCIsIFwiUHJlcGVuZFwiKTtcbiAgICAgICAgICAgICAgICBkcm9wLmFkZE9wdGlvbihcImFwcGVuZCB0ZW1wbGF0ZVwiLCBcIkFwcGVuZFwiKTtcbiAgICAgICAgICAgICAgICBkcm9wLmFkZE9wdGlvbihcImxpbmUgdGVtcGxhdGVcIiwgXCJMaW5lXCIpO1xuICAgICAgICAgICAgICAgIGRyb3AuYWRkT3B0aW9uKFwibm90ZSB0ZW1wbGF0ZVwiLCBcIk5vdGVcIik7XG4gICAgICAgICAgICAgICAgZHJvcC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgIHRoaXMub3V0cHV0T2JqZWN0LnR5cGUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBcImxpbmUgdGVtcGxhdGVcIikge1xuICAgICAgICAgICAgICAgICAgICBuZXcgU2V0dGluZyhhY3Rpb24pXG4gICAgICAgICAgICAgICAgICAgICAgLnNldE5hbWUoXCJMaW5lIE51bWJlclwiKVxuICAgICAgICAgICAgICAgICAgICAgIC5zZXREZXNjKFwiQXQgd2hpY2ggbGluZSBzaG91bGQgdGhlIHRlbXBsYXRlIGJlIGluc2VydGVkP1wiKVxuICAgICAgICAgICAgICAgICAgICAgIC5hZGRUZXh0KCh0ZXh0RWwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRFbC5zZXRQbGFjZWhvbGRlcihcIjY5XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEVsLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm91dHB1dE9iamVjdC50eXBlID0gYGxpbmUoJHt2YWx1ZX0pIHRlbXBsYXRlYDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IFwibm90ZSB0ZW1wbGF0ZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ldyBTZXR0aW5nKGFjdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAuc2V0TmFtZShcIk5vdGUgTmFtZVwiKVxuICAgICAgICAgICAgICAgICAgICAgIC5zZXREZXNjKFwiV2hhdCBzaG91bGQgdGhlIG5ldyBub3RlIGJlIG5hbWVkP1wiKVxuICAgICAgICAgICAgICAgICAgICAgIC5hZGRUZXh0KCh0ZXh0RWwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRFbC5zZXRQbGFjZWhvbGRlcihcIk15IE5ldyBOb3RlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNldHRpbmcoYWN0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TmFtZShcIlNwbGl0XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXREZXNjKFwiU2hvdWxkIHRoZSBuZXcgbm90ZSBvcGVuIGluIGEgc3BsaXQgcGFuZT9cIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFRvZ2dsZSgodG9nZ2xlRWwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm91dHB1dE9iamVjdC50eXBlID0gYG5vdGUoJHt0ZXh0RWwuZ2V0VmFsdWV9KSB0ZW1wbGF0ZWA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEVsLm9uQ2hhbmdlKCh0ZXh0VmFsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0b2dnbGVWYWwgPSB0b2dnbGVFbC5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvZ2dsZVZhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm91dHB1dE9iamVjdC50eXBlID0gYG5vdGUoJHt0ZXh0VmFsfSwgc3BsaXQpIHRlbXBsYXRlYDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdG9nZ2xlVmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3V0cHV0T2JqZWN0LnR5cGUgPSBgbm90ZSgke3RleHRWYWx9KSB0ZW1wbGF0ZWA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlRWwub25DaGFuZ2UoKHRvZ2dsZVZhbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dFZhbCA9IHRleHRFbC5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvZ2dsZVZhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm91dHB1dE9iamVjdC50eXBlID0gYG5vdGUoJHt0ZXh0VmFsfSwgc3BsaXQpIHRlbXBsYXRlYDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdG9nZ2xlVmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3V0cHV0T2JqZWN0LnR5cGUgPSBgbm90ZSgke3RleHRWYWx9KSB0ZW1wbGF0ZWA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAuYWRkVGV4dCgodGV4dEVsKSA9PiB7XG4gICAgICAgICAgICAgICAgdGV4dEVsLmlucHV0RWwucmVwbGFjZVdpdGgodGhpcy5maWxlU3VnZ2VzdEVsKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh2YWx1ZS5pbmNsdWRlcyhcInRleHRcIikpIHtcbiAgICAgICAgICAgIGFjdGlvbi5lbXB0eSgpO1xuICAgICAgICAgICAgbmV3IFNldHRpbmcoYWN0aW9uKVxuICAgICAgICAgICAgICAuc2V0TmFtZShcIlRleHRcIilcbiAgICAgICAgICAgICAgLnNldERlc2MoXCJXaGF0IHRleHQgYW5kIHdoZXJlIHNob3VsZCBpdCBnbz9cIilcbiAgICAgICAgICAgICAgLmFkZERyb3Bkb3duKChkcm9wKSA9PiB7XG4gICAgICAgICAgICAgICAgZHJvcC5hZGRPcHRpb24oXCJwcmVcIiwgXCJEbyB0aGlzLi4uXCIpO1xuICAgICAgICAgICAgICAgIGRyb3AuYWRkT3B0aW9uKFwicHJlcGVuZCB0ZXh0XCIsIFwiUHJlcGVuZFwiKTtcbiAgICAgICAgICAgICAgICBkcm9wLmFkZE9wdGlvbihcImFwcGVuZCB0ZXh0XCIsIFwiQXBwZW5kXCIpO1xuICAgICAgICAgICAgICAgIGRyb3AuYWRkT3B0aW9uKFwibGluZSB0ZXh0XCIsIFwiTGluZVwiKTtcbiAgICAgICAgICAgICAgICBkcm9wLmFkZE9wdGlvbihcIm5vdGUgdGV4dFwiLCBcIk5vdGVcIik7XG4gICAgICAgICAgICAgICAgZHJvcC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgIHRoaXMub3V0cHV0T2JqZWN0LnR5cGUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBcImxpbmUgdGV4dFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ldyBTZXR0aW5nKGFjdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAuc2V0TmFtZShcIkxpbmUgTnVtYmVyXCIpXG4gICAgICAgICAgICAgICAgICAgICAgLnNldERlc2MoXCJBdCB3aGljaCBsaW5lIHNob3VsZCB0aGUgdGVtcGxhdGUgYmUgaW5zZXJ0ZWQ/XCIpXG4gICAgICAgICAgICAgICAgICAgICAgLmFkZFRleHQoKHRleHRFbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEVsLnNldFBsYWNlaG9sZGVyKFwiNjlcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RWwub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3V0cHV0T2JqZWN0LnR5cGUgPSBgbGluZSgke3ZhbHVlfSkgdGV4dGA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBcIm5vdGUgdGV4dFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ldyBTZXR0aW5nKGFjdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAuc2V0TmFtZShcIk5vdGUgTmFtZVwiKVxuICAgICAgICAgICAgICAgICAgICAgIC5zZXREZXNjKFwiV2hhdCBzaG91bGQgdGhlIG5ldyBub3RlIGJlIG5hbWVkP1wiKVxuICAgICAgICAgICAgICAgICAgICAgIC5hZGRUZXh0KCh0ZXh0RWwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRFbC5zZXRQbGFjZWhvbGRlcihcIk15IE5ldyBOb3RlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNldHRpbmcoYWN0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TmFtZShcIlNwbGl0XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXREZXNjKFwiU2hvdWxkIHRoZSBuZXcgbm90ZSBvcGVuIGluIGEgc3BsaXQgcGFuZT9cIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFRvZ2dsZSgodG9nZ2xlRWwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm91dHB1dE9iamVjdC50eXBlID0gYG5vdGUoJHt0ZXh0RWwuZ2V0VmFsdWV9KSB0ZXh0YDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RWwub25DaGFuZ2UoKHRleHRWYWwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvZ2dsZVZhbCA9IHRvZ2dsZUVsLmdldFZhbHVlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9nZ2xlVmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3V0cHV0T2JqZWN0LnR5cGUgPSBgbm90ZSgke3RleHRWYWx9LCBzcGxpdCkgdGV4dGA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRvZ2dsZVZhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm91dHB1dE9iamVjdC50eXBlID0gYG5vdGUoJHt0ZXh0VmFsfSkgdGV4dGA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlRWwub25DaGFuZ2UoKHRvZ2dsZVZhbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dFZhbCA9IHRleHRFbC5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvZ2dsZVZhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm91dHB1dE9iamVjdC50eXBlID0gYG5vdGUoJHt0ZXh0VmFsfSwgc3BsaXQpIHRleHRgO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0b2dnbGVWYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vdXRwdXRPYmplY3QudHlwZSA9IGBub3RlKCR7dGV4dFZhbH0pIHRleHRgO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmFkZFRleHQoKHRleHRFbCkgPT4ge1xuICAgICAgICAgICAgICAgIHRleHRFbC5zZXRQbGFjZWhvbGRlcihcIk15IFRleHQgdG8gSW5zZXJ0XCIpO1xuICAgICAgICAgICAgICAgIHRleHRFbC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgIHRoaXMub3V0cHV0T2JqZWN0LmFjdGlvbiA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZhbHVlID09PSBcImNhbGN1bGF0ZVwiKSB7XG4gICAgICAgICAgICBhY3Rpb24uZW1wdHkoKTtcbiAgICAgICAgICAgIG5ldyBTZXR0aW5nKGFjdGlvbilcbiAgICAgICAgICAgICAgLnNldE5hbWUoXCJDYWxjdWxhdGVcIilcbiAgICAgICAgICAgICAgLnNldERlc2MoXG4gICAgICAgICAgICAgICAgXCJFbnRlciBhIGNhbGN1bGF0aW9uLCB5b3UgY2FuIHJlZmVyZW5jZSBhIGxpbmUgbnVtYmVyIHdpdGggJExpbmVOdW1iZXJcIlxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIC5hZGRUZXh0KCh0ZXh0RWwpID0+IHtcbiAgICAgICAgICAgICAgICB0ZXh0RWwuc2V0UGxhY2Vob2xkZXIoXCIyKyQxMFwiKTtcbiAgICAgICAgICAgICAgICB0ZXh0RWwub25DaGFuZ2UoKHZhbHVlKSA9PiAodGhpcy5vdXRwdXRPYmplY3QuYWN0aW9uID0gdmFsdWUpKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gXCJzd2FwXCIpIHtcbiAgICAgICAgICAgIHRoaXMub3V0cHV0T2JqZWN0LnR5cGUgPSBcIlwiO1xuICAgICAgICAgICAgYWN0aW9uLmVtcHR5KCk7XG4gICAgICAgICAgICBuZXcgU2V0dGluZyhhY3Rpb24pXG4gICAgICAgICAgICAgIC5zZXROYW1lKFwiU3dhcFwiKVxuICAgICAgICAgICAgICAuc2V0RGVzYyhcbiAgICAgICAgICAgICAgICBcImNob29zZSBidXR0b25zIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBJbmxpbmUgU3dhcCBCdXR0b25cIlxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIC5hZGRUZXh0KCh0ZXh0RWwpID0+IHtcbiAgICAgICAgICAgICAgICB0ZXh0RWwuaW5wdXRFbC5yZXBsYWNlV2l0aCh0aGlzLnN3YXBTdWdnZXN0RWwpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICBuZXcgU2V0dGluZyhmb3JtRWwpXG4gICAgICAgIC5zZXROYW1lKFwiQnV0dG9uIEJsb2NrIElEXCIpXG4gICAgICAgIC5zZXREZXNjKFwiUHJvdmlkZSBhIGN1c3RvbSBidXR0b24tYmxvY2staWRcIilcbiAgICAgICAgLmFkZFRleHQoKHRleHRFbCkgPT4ge1xuICAgICAgICAgIHRleHRFbC5zZXRQbGFjZWhvbGRlcihcImJ1dHRvbklkXCIpO1xuICAgICAgICAgIHRleHRFbC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgIHRoaXMub3V0cHV0T2JqZWN0LmJsb2NrSWQgPSB2YWx1ZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICBuZXcgU2V0dGluZyhmb3JtRWwpXG4gICAgICAgIC5zZXROYW1lKFwiUmVtb3ZlXCIpXG4gICAgICAgIC5zZXREZXNjKFxuICAgICAgICAgIFwiV291bGQgeW91IGxpa2UgdG8gcmVtb3ZlIHRoaXMgYnV0dG9uIChvciBvdGhlciBidXR0b25zKSBhZnRlciBjbGlja2luZz9cIlxuICAgICAgICApXG4gICAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZUVsKSA9PiB7XG4gICAgICAgICAgdG9nZ2xlRWwub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgbmV3IFNldHRpbmcocmVtb3ZlKVxuICAgICAgICAgICAgICAgIC5zZXROYW1lKFwiU2VsZWN0IFJlbW92ZVwiKVxuICAgICAgICAgICAgICAgIC5zZXREZXNjKFxuICAgICAgICAgICAgICAgICAgXCJVc2UgdHJ1ZSB0byByZW1vdmUgdGhpcyBidXR0b24sIG9yIHN1cHBseSBhbiBbYXJyYXldIG9mIGJ1dHRvbiBibG9jay1pZHNcIlxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuYWRkVGV4dCgodGV4dEVsKSA9PiB7XG4gICAgICAgICAgICAgICAgICB0ZXh0RWwuaW5wdXRFbC5yZXBsYWNlV2l0aCh0aGlzLnJlbW92ZVN1Z2dlc3RFbCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICAgIHRoaXMub3V0cHV0T2JqZWN0LnJlbW92ZSA9IFwiXCI7XG4gICAgICAgICAgICAgIHJlbW92ZS5lbXB0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIGNvbnN0IHJlbW92ZSA9IGZvcm1FbC5jcmVhdGVFbChcImRpdlwiKTtcbiAgICAgIG5ldyBTZXR0aW5nKGZvcm1FbClcbiAgICAgICAgLnNldE5hbWUoXCJSZXBsYWNlXCIpXG4gICAgICAgIC5zZXREZXNjKFwiV291bGQgeW91IGxpa2UgdG8gcmVwbGFjZSBsaW5lcyBpbiB0aGUgbm90ZSBhZnRlciBjbGlja2luZz9cIilcbiAgICAgICAgLmFkZFRvZ2dsZSgodG9nZ2xlRWwpID0+IHtcbiAgICAgICAgICB0b2dnbGVFbC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICBuZXcgU2V0dGluZyhyZXBsYWNlKVxuICAgICAgICAgICAgICAgIC5zZXROYW1lKFwiU2VsZWN0IExpbmVzXCIpXG4gICAgICAgICAgICAgICAgLnNldERlc2MoXG4gICAgICAgICAgICAgICAgICBcIlN1cHBseSBhbiBhcnJheSBvZiBbc3RhcnRpbmdMaW5lLCBlbmRpbmdMaW5lXSB0byBiZSByZXBsYWNlZFwiXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5hZGRUZXh0KCh0ZXh0RWwpID0+IHtcbiAgICAgICAgICAgICAgICAgIHRleHRFbC5zZXRWYWx1ZShcIltdXCIpO1xuICAgICAgICAgICAgICAgICAgdGV4dEVsLm9uQ2hhbmdlKFxuICAgICAgICAgICAgICAgICAgICAodmFsdWUpID0+ICh0aGlzLm91dHB1dE9iamVjdC5yZXBsYWNlID0gdmFsdWUpXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgICByZXBsYWNlLmVtcHR5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgY29uc3QgcmVwbGFjZSA9IGZvcm1FbC5jcmVhdGVFbChcImRpdlwiKTtcbiAgICAgIG5ldyBTZXR0aW5nKGZvcm1FbClcbiAgICAgICAgLnNldE5hbWUoXCJJbmhlcml0XCIpXG4gICAgICAgIC5zZXREZXNjKFxuICAgICAgICAgIFwiV291bGQgeW91IGxpa2UgdG8gaW5oZXJpdCBhcmdzIGJ5IGFkZGluZyBhbiBleGlzdGluZyBidXR0b24gYmxvY2staWQ/XCJcbiAgICAgICAgKVxuICAgICAgICAuYWRkVG9nZ2xlKCh0b2dnbGVFbCkgPT4ge1xuICAgICAgICAgIHRvZ2dsZUVsLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgIG5ldyBTZXR0aW5nKGlkKVxuICAgICAgICAgICAgICAgIC5zZXROYW1lKFwiaWRcIilcbiAgICAgICAgICAgICAgICAuc2V0RGVzYyhcbiAgICAgICAgICAgICAgICAgIFwiaW5oZXJpdCBmcm9tIG90aGVyIEJ1dHRvbnMgYnkgYWRkaW5nIHRoZWlyIGJ1dHRvbiBibG9jay1pZFwiXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5hZGRUZXh0KCh0ZXh0RWwpID0+IHtcbiAgICAgICAgICAgICAgICAgIHRleHRFbC5pbnB1dEVsLnJlcGxhY2VXaXRoKHRoaXMuaWRTdWdnZXN0RWwpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgICB0aGlzLm91dHB1dE9iamVjdC5yZXBsYWNlID0gXCJcIjtcbiAgICAgICAgICAgICAgaWQuZW1wdHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICBjb25zdCBpZCA9IGZvcm1FbC5jcmVhdGVFbChcImRpdlwiKTtcbiAgICAgIG5ldyBTZXR0aW5nKGZvcm1FbClcbiAgICAgICAgLnNldE5hbWUoXCJUZW1wbGF0ZXJcIilcbiAgICAgICAgLnNldERlc2MoXG4gICAgICAgICAgXCJEbyB5b3Ugd2FudCB0byBjb252ZXJ0IGEgdGVtcGxhdGVyIGNvbW1hbmQgaW5zaWRlIHlvdXIgQnV0dG9uIG9uIGVhY2ggY2xpY2s/XCJcbiAgICAgICAgKVxuICAgICAgICAuYWRkVG9nZ2xlKCh0b2dnbGVFbCkgPT4ge1xuICAgICAgICAgIHRvZ2dsZUVsLnNldFRvb2x0aXAoXCJEbyBub3QgdXNlIGZvciBpbmxpbmUgQnV0dG9uXCIpO1xuICAgICAgICAgIHRvZ2dsZUVsLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vdXRwdXRPYmplY3QudGVtcGxhdGVyID0gdmFsdWU7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgbmV3IFNldHRpbmcoZm9ybUVsKVxuICAgICAgICAuc2V0TmFtZShcIkN1c3RvbSBDbGFzc1wiKVxuICAgICAgICAuc2V0RGVzYyhcIkFkZCBhIGN1c3RvbSBjbGFzcyBmb3IgYnV0dG9uIHN0eWxpbmdcIilcbiAgICAgICAgLmFkZFRleHQoKHRleHRFbCkgPT4ge1xuICAgICAgICAgIHRleHRFbC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYnV0dG9uUHJldmlld0VsLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIHZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMub3V0cHV0T2JqZWN0LmNsYXNzID0gdmFsdWU7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgdGhpcy5idXR0b25QcmV2aWV3RWwuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgXCJidXR0b24tZGVmYXVsdFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICBuZXcgU2V0dGluZyhmb3JtRWwpXG4gICAgICAgIC5zZXROYW1lKFwiQ29sb3JcIilcbiAgICAgICAgLnNldERlc2MoXCJXaGF0IGNvbG9yIHdvdWxkIHlvdSBsaWtlIHlvdXIgYnV0dG9uIHRvIGJlP1wiKVxuICAgICAgICAuYWRkRHJvcGRvd24oKGRyb3ApID0+IHtcbiAgICAgICAgICBkcm9wLmFkZE9wdGlvbihcImRlZmF1bHRcIiwgXCJEZWZhdWx0IENvbG9yXCIpO1xuICAgICAgICAgIGRyb3AuYWRkT3B0aW9uKFwiYmx1ZVwiLCBcIkJsdWVcIik7XG4gICAgICAgICAgZHJvcC5hZGRPcHRpb24oXCJyZWRcIiwgXCJSZWRcIik7XG4gICAgICAgICAgZHJvcC5hZGRPcHRpb24oXCJncmVlblwiLCBcIkdyZWVuXCIpO1xuICAgICAgICAgIGRyb3AuYWRkT3B0aW9uKFwieWVsbG93XCIsIFwiWWVsbG93XCIpO1xuICAgICAgICAgIGRyb3AuYWRkT3B0aW9uKFwicHVycGxlXCIsIFwiUHVycGxlXCIpO1xuICAgICAgICAgIGRyb3Aub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm91dHB1dE9iamVjdC5jb2xvciA9IHZhbHVlO1xuICAgICAgICAgICAgY29uc3QgYnV0dG9uQ2xhc3MgPSB0aGlzLmJ1dHRvblByZXZpZXdFbFxuICAgICAgICAgICAgICAuZ2V0QXR0cmlidXRlKFwiY2xhc3NcIilcbiAgICAgICAgICAgICAgLnJlcGxhY2UoXCIgYmx1ZVwiLCBcIlwiKVxuICAgICAgICAgICAgICAucmVwbGFjZShcIiByZWRcIiwgXCJcIilcbiAgICAgICAgICAgICAgLnJlcGxhY2UoXCIgZ3JlZW5cIiwgXCJcIilcbiAgICAgICAgICAgICAgLnJlcGxhY2UoXCIgeWVsbG93XCIsIFwiXCIpXG4gICAgICAgICAgICAgIC5yZXBsYWNlKFwiIHB1cnBsZVwiLCBcIlwiKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gXCJkZWZhdWx0XCIpIHtcbiAgICAgICAgICAgICAgdGhpcy5idXR0b25QcmV2aWV3RWwuc2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgICAgIFwiY2xhc3NcIixcbiAgICAgICAgICAgICAgICBgJHtidXR0b25DbGFzc30gJHt2YWx1ZX1gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gXCJibHVlXCIpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IFwiIzc2YjNmYVwiO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gXCJwdXJwbGVcIikge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gXCIjNzI1NTg1XCI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5idXR0b25QcmV2aWV3RWwuc2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgICAgIFwic3R5bGVcIixcbiAgICAgICAgICAgICAgICBgYmFja2dyb3VuZDogJHt2YWx1ZX1gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmJ1dHRvblByZXZpZXdFbC5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCBgJHtidXR0b25DbGFzc31gKTtcbiAgICAgICAgICAgICAgdGhpcy5idXR0b25QcmV2aWV3RWwucmVtb3ZlQXR0cmlidXRlKFwic3R5bGVcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgZm9ybUVsLmNyZWF0ZURpdihcIm1vZGFsLWJ1dHRvbi1jb250YWluZXJcIiwgKGJ1dHRvbkNvbnRhaW5lckVsKSA9PiB7XG4gICAgICAgIGJ1dHRvbkNvbnRhaW5lckVsXG4gICAgICAgICAgLmNyZWF0ZUVsKFwiYnV0dG9uXCIsIHtcbiAgICAgICAgICAgIGF0dHI6IHsgdHlwZTogXCJidXR0b25cIiB9LFxuICAgICAgICAgICAgY2xzOiBcImJ1dHRvbi1kZWZhdWx0XCIsXG4gICAgICAgICAgICB0ZXh0OiBcIkNhbmNlbFwiLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB0aGlzLmNsb3NlKCkpO1xuICAgICAgICBidXR0b25Db250YWluZXJFbC5jcmVhdGVFbChcImJ1dHRvblwiLCB7XG4gICAgICAgICAgYXR0cjogeyB0eXBlOiBcInN1Ym1pdFwiIH0sXG4gICAgICAgICAgY2xzOiBcImJ1dHRvbi1kZWZhdWx0IG1vZC1jdGFcIixcbiAgICAgICAgICB0ZXh0OiBcIkluc2VydCBCdXR0b25cIixcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgZm9ybUVsLmFkZEV2ZW50TGlzdGVuZXIoXCJzdWJtaXRcIiwgKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaW5zZXJ0QnV0dG9uKHRoaXMuYXBwLCB0aGlzLm91dHB1dE9iamVjdCk7XG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGNvbnRlbnRFbC5jcmVhdGVFbChcInBcIikuc2V0VGV4dChcIkJ1dHRvbiBQcmV2aWV3XCIpO1xuICAgIHRoaXMuYnV0dG9uUHJldmlld0VsID0gY3JlYXRlQnV0dG9uKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBlbDogY29udGVudEVsLFxuICAgICAgYXJnczogeyBuYW1lOiBcIk15IEF3ZXNvbWUgQnV0dG9uXCIgfSxcbiAgICB9KTtcbiAgfVxuXG4gIG9uQ2xvc2UoKSB7XG4gICAgY29uc3QgeyBjb250ZW50RWwgfSA9IHRoaXM7XG4gICAgY29udGVudEVsLmVtcHR5KCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIElubGluZUJ1dHRvbk1vZGFsIGV4dGVuZHMgTW9kYWwge1xuICBidXR0b25TdWdnZXN0RWw6IEhUTUxJbnB1dEVsZW1lbnQgPSBjcmVhdGVFbChcImlucHV0XCIsIHsgdHlwZTogXCJ0ZXh0XCIgfSk7XG4gIGJ1dHRvblN1Z2dlc3Q7XG5cbiAgY29uc3RydWN0b3IoYXBwOiBBcHApIHtcbiAgICBzdXBlcihhcHApO1xuICAgIHRoaXMuYnV0dG9uU3VnZ2VzdCA9IG5ldyBCdXR0b25TdWdnZXN0KHRoaXMuYXBwLCB0aGlzLmJ1dHRvblN1Z2dlc3RFbCk7XG4gICAgdGhpcy5idXR0b25TdWdnZXN0RWwuc2V0QXR0cmlidXRlKFwic3R5bGVcIiwgXCJ3aWR0aDogMTAwJTsgaGVpZ2h0OiA0MHB4XCIpO1xuICB9XG5cbiAgb25PcGVuKCkge1xuICAgIGNvbnN0IHsgdGl0bGVFbCwgY29udGVudEVsIH0gPSB0aGlzO1xuICAgIHRpdGxlRWwuc2V0VGV4dChcIkluc2VydCBJbmxpbmUgQnV0dG9uXCIpO1xuICAgIGNvbnRlbnRFbC5jcmVhdGVFbChcImZvcm1cIiwge30sIChmb3JtRWwpID0+IHtcbiAgICAgIGZvcm1FbC5hcHBlbmRDaGlsZCh0aGlzLmJ1dHRvblN1Z2dlc3RFbCk7XG4gICAgICBmb3JtRWwuYWRkRXZlbnRMaXN0ZW5lcihcInN1Ym1pdFwiLCAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpbnNlcnRJbmxpbmVCdXR0b24odGhpcy5hcHAsIHRoaXMuYnV0dG9uU3VnZ2VzdEVsLnZhbHVlKTtcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBvbkNsb3NlKCkge1xuICAgIGNvbnN0IHsgY29udGVudEVsIH0gPSB0aGlzO1xuICAgIGNvbnRlbnRFbC5lbXB0eSgpO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBBcHAsXG4gIFBsdWdpbixcbiAgRXZlbnRSZWYsXG4gIE1hcmtkb3duVmlldyxcbiAgTWFya2Rvd25SZW5kZXJDaGlsZCxcbn0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQgeyBjcmVhdGVBcmd1bWVudE9iamVjdCB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQge1xuICBpbml0aWFsaXplQnV0dG9uU3RvcmUsXG4gIGFkZEJ1dHRvblRvU3RvcmUsXG4gIGdldEJ1dHRvbkZyb21TdG9yZSxcbiAgZ2V0QnV0dG9uQnlJZCxcbiAgZ2V0U3RvcmUsXG59IGZyb20gXCIuL2J1dHRvblN0b3JlXCI7XG5pbXBvcnQgeyBidXR0b25FdmVudExpc3RlbmVyLCBvcGVuRmlsZUxpc3RlbmVyIH0gZnJvbSBcIi4vZXZlbnRzXCI7XG5pbXBvcnQgeyBBcmd1bWVudHMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgQnV0dG9uTW9kYWwsIElubGluZUJ1dHRvbk1vZGFsIH0gZnJvbSBcIi4vbW9kYWxcIjtcbmltcG9ydCB7IGNyZWF0ZUJ1dHRvbiB9IGZyb20gXCIuL2J1dHRvblwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCdXR0b25zUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcbiAgcHJpdmF0ZSBidXR0b25FdmVudHM6IEV2ZW50UmVmO1xuICBwcml2YXRlIGNsb3NlZEZpbGU6IEV2ZW50UmVmO1xuICBwcml2YXRlIGJ1dHRvbkVkaXQ6IEV2ZW50UmVmO1xuICBwcml2YXRlIGNyZWF0ZUJ1dHRvbjtcblxuICBwcml2YXRlIGFzeW5jIGFkZEJ1dHRvbkluRWRpdChhcHA6IEFwcCkge1xuICAgIGxldCB3aWRnZXQ6IENvZGVNaXJyb3IuTGluZVdpZGdldDtcbiAgICBpZiAod2lkZ2V0KSB7XG4gICAgICB3aWRnZXQuY2xlYXIoKTtcbiAgICB9XG4gICAgY29uc3QgYWN0aXZlVmlldyA9IGFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpO1xuICAgIGlmIChhY3RpdmVWaWV3KSB7XG4gICAgICBjb25zdCBzdG9yZSA9IGdldFN0b3JlKGFwcC5pc01vYmlsZSk7XG4gICAgICBjb25zdCBidXR0b25zSW5GaWxlID0gc3RvcmUuZmlsdGVyKFxuICAgICAgICAoYnV0dG9uKSA9PiBidXR0b24ucGF0aCA9PT0gYWN0aXZlVmlldy5maWxlLnBhdGhcbiAgICAgICk7XG4gICAgICB0aGlzLnJlZ2lzdGVyQ29kZU1pcnJvcigoY206IENvZGVNaXJyb3IuRWRpdG9yKSA9PiB7XG4gICAgICAgIGJ1dHRvbnNJbkZpbGUuZm9yRWFjaChhc3luYyAoYnV0dG9uKSA9PiB7XG4gICAgICAgICAgY29uc3Qgd2lkZ2V0RWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgIGNvbnN0IHN0b3JlQnV0dG9uID0gYXdhaXQgZ2V0QnV0dG9uRnJvbVN0b3JlKGFwcCwge1xuICAgICAgICAgICAgaWQ6IGJ1dHRvbi5pZC5zcGxpdChcIi1cIilbMV0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIWFwcC5pc01vYmlsZSAmJlxuICAgICAgICAgICAgc3RvcmVCdXR0b24gJiZcbiAgICAgICAgICAgIHN0b3JlQnV0dG9uPy5hcmdzLmVkaXR2aWV3ID09PSBcInRydWVcIlxuICAgICAgICAgICkge1xuICAgICAgICAgICAgd2lkZ2V0ID0gY20uYWRkTGluZVdpZGdldChcbiAgICAgICAgICAgICAgYnV0dG9uLnBvc2l0aW9uLmVuZC5saW5lICsgMSxcbiAgICAgICAgICAgICAgY3JlYXRlQnV0dG9uKHtcbiAgICAgICAgICAgICAgICBhcHAsXG4gICAgICAgICAgICAgICAgZWw6IHdpZGdldEVsLFxuICAgICAgICAgICAgICAgIGFyZ3M6IHN0b3JlQnV0dG9uLmFyZ3MsXG4gICAgICAgICAgICAgICAgaW5saW5lOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpZDogYnV0dG9uLmlkLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGFzeW5jIG9ubG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpbml0aWFsaXplQnV0dG9uU3RvcmUodGhpcy5hcHApO1xuICAgIHRoaXMuYnV0dG9uRXZlbnRzID0gYnV0dG9uRXZlbnRMaXN0ZW5lcih0aGlzLmFwcCwgYWRkQnV0dG9uVG9TdG9yZSk7XG4gICAgdGhpcy5jbG9zZWRGaWxlID0gb3BlbkZpbGVMaXN0ZW5lcih0aGlzLmFwcCwgaW5pdGlhbGl6ZUJ1dHRvblN0b3JlKTtcbiAgICB0aGlzLmNyZWF0ZUJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbjtcblxuICAgIHRoaXMuYnV0dG9uRWRpdCA9IG9wZW5GaWxlTGlzdGVuZXIoXG4gICAgICB0aGlzLmFwcCxcbiAgICAgIHRoaXMuYWRkQnV0dG9uSW5FZGl0LmJpbmQodGhpcylcbiAgICApO1xuXG4gICAgdGhpcy5hZGRDb21tYW5kKHtcbiAgICAgIGlkOiBcImJ1dHRvbi1tYWtlclwiLFxuICAgICAgbmFtZTogXCJCdXR0b24gTWFrZXJcIixcbiAgICAgIGNhbGxiYWNrOiAoKSA9PiBuZXcgQnV0dG9uTW9kYWwodGhpcy5hcHApLm9wZW4oKSxcbiAgICB9KTtcblxuICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICBpZDogXCJpbmxpbmUtYnV0dG9uXCIsXG4gICAgICBuYW1lOiBcIkluc2VydCBJbmxpbmUgQnV0dG9uXCIsXG4gICAgICBjYWxsYmFjazogKCkgPT4gbmV3IElubGluZUJ1dHRvbk1vZGFsKHRoaXMuYXBwKS5vcGVuKCksXG4gICAgfSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyTWFya2Rvd25Db2RlQmxvY2tQcm9jZXNzb3IoXCJidXR0b25cIiwgYXN5bmMgKHNvdXJjZSwgZWwpID0+IHtcbiAgICAgIC8vIGNyZWF0ZSBhbiBvYmplY3Qgb3V0IG9mIHRoZSBhcmd1bWVudHNcbiAgICAgIGNvbnN0IGFjdGl2ZVZpZXcgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpO1xuICAgICAgaWYgKGFjdGl2ZVZpZXcpIHtcbiAgICAgICAgYWRkQnV0dG9uVG9TdG9yZSh0aGlzLmFwcCwgYWN0aXZlVmlldy5maWxlKTtcbiAgICAgICAgbGV0IGFyZ3MgPSBjcmVhdGVBcmd1bWVudE9iamVjdChzb3VyY2UpO1xuICAgICAgICBjb25zdCBzdG9yZUFyZ3MgPSBhd2FpdCBnZXRCdXR0b25Gcm9tU3RvcmUodGhpcy5hcHAsIGFyZ3MpO1xuICAgICAgICBhcmdzID0gc3RvcmVBcmdzID8gc3RvcmVBcmdzLmFyZ3MgOiBhcmdzO1xuICAgICAgICBjb25zdCBpZCA9IHN0b3JlQXJncyAmJiBzdG9yZUFyZ3MuaWQ7XG4gICAgICAgIGNyZWF0ZUJ1dHRvbih7IGFwcDogdGhpcy5hcHAsIGVsLCBhcmdzLCBpbmxpbmU6IGZhbHNlLCBpZCB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMucmVnaXN0ZXJNYXJrZG93blBvc3RQcm9jZXNzb3IoYXN5bmMgKGVsLCBjdHgpID0+IHtcbiAgICAgIC8vIFNlYXJjaCBmb3IgPGNvZGU+IGJsb2NrcyBpbnNpZGUgdGhpcyBlbGVtZW50OyBmb3IgZWFjaCBvbmUsIGxvb2sgZm9yIHRoaW5ncyBvZiB0aGUgZm9ybSBgXG4gICAgICBjb25zdCBjb2RlYmxvY2tzID0gZWwucXVlcnlTZWxlY3RvckFsbChcImNvZGVcIik7XG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY29kZWJsb2Nrcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgY29uc3QgY29kZWJsb2NrID0gY29kZWJsb2Nrcy5pdGVtKGluZGV4KTtcblxuICAgICAgICBjb25zdCB0ZXh0ID0gY29kZWJsb2NrLmlubmVyVGV4dC50cmltKCk7XG4gICAgICAgIGlmICh0ZXh0LnN0YXJ0c1dpdGgoXCJidXR0b25cIikpIHtcbiAgICAgICAgICBjb25zdCBpZCA9IHRleHQuc3BsaXQoXCJidXR0b24tXCIpWzFdLnRyaW0oKTtcbiAgICAgICAgICBjb25zdCBhcmdzID0gYXdhaXQgZ2V0QnV0dG9uQnlJZCh0aGlzLmFwcCwgaWQpO1xuICAgICAgICAgIGlmIChhcmdzKSB7XG4gICAgICAgICAgICBjdHguYWRkQ2hpbGQobmV3IElubGluZUJ1dHRvbihjb2RlYmxvY2ssIHRoaXMuYXBwLCBhcmdzLCBpZCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIG9udW5sb2FkKCk6IHZvaWQge1xuICAgIHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUub2ZmcmVmKHRoaXMuYnV0dG9uRXZlbnRzKTtcbiAgICB0aGlzLmFwcC53b3Jrc3BhY2Uub2ZmcmVmKHRoaXMuY2xvc2VkRmlsZSk7XG4gICAgdGhpcy5hcHAud29ya3NwYWNlLm9mZnJlZih0aGlzLmJ1dHRvbkVkaXQpO1xuICB9XG59XG5cbmNsYXNzIElubGluZUJ1dHRvbiBleHRlbmRzIE1hcmtkb3duUmVuZGVyQ2hpbGQge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZWw6IEhUTUxFbGVtZW50LFxuICAgIHB1YmxpYyBhcHA6IEFwcCxcbiAgICBwdWJsaWMgYXJnczogQXJndW1lbnRzLFxuICAgIHB1YmxpYyBpZDogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKGVsKTtcbiAgfVxuICBhc3luYyBvbmxvYWQoKSB7XG4gICAgY29uc3QgYnV0dG9uID0gY3JlYXRlQnV0dG9uKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBlbDogdGhpcy5lbCxcbiAgICAgIGFyZ3M6IHRoaXMuYXJncyxcbiAgICAgIGlubGluZTogdHJ1ZSxcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgIH0pO1xuICAgIHRoaXMuZWwucmVwbGFjZVdpdGgoYnV0dG9uKTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbIk1hcmtkb3duVmlldyIsIk5vdGljZSIsIk1leHAiLCJtZXhwIiwiZWZmZWN0IiwibWluIiwibWF4IiwibWF0aE1heCIsIm1hdGhNaW4iLCJoYXNoIiwiYWxsUGxhY2VtZW50cyIsInBsYWNlbWVudHMiLCJwb3BwZXJPZmZzZXRzIiwiY29tcHV0ZVN0eWxlcyIsImFwcGx5U3R5bGVzIiwib2Zmc2V0IiwiZmxpcCIsInByZXZlbnRPdmVyZmxvdyIsImFycm93IiwiaGlkZSIsIlNjb3BlIiwiVEZpbGUiLCJNb2RhbCIsIlNldHRpbmciLCJQbHVnaW4iLCJNYXJrZG93blJlbmRlckNoaWxkIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFJQSxJQUFJLFdBQWlDLENBQUM7QUFFL0IsTUFBTSxRQUFRLEdBQUcsQ0FBQyxRQUFpQixLQUN4QyxRQUFRLEdB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Q0FBQyxFQUFFO0FBQ3ZCLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQztBQUNoQixHQUFHO0FBQ0gsRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLEVBQUU7QUFDckIsSUFBSSxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3RSxHQUFHO0FBQ0gsRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLEVBQUU7QUFDckIsSUFBSSxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3RSxHQUFHO0FBQ0gsRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLEVBQUU7QUFDdEIsSUFBSSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM3QyxHQUFHO0FBQ0gsRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLEVBQUU7QUFDdEIsSUFBSSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM3QyxHQUFHO0FBQ0gsRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLEVBQUU7QUFDdEIsSUFBSSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN0QyxHQUFHO0FBQ0gsRUFBRSxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FB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TSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSztBQUM5QyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLEdBQUc7QUFDckUsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxTQUFTO0FBQ3BELEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFDO0FBQ3ZGLElBQUksR0FBRyxHQUFHLENBQUNFLGFBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFQSxhQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRUEsYUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUVBLGFBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFQSxhQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsTUFBTTtBQUM1R0EsYUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUVBLGFBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFQSxhQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSztBQUN6RUEsYUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUVBLGFBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFQSxhQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRUEsYUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJO0FBQzVHQSxhQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRUEsYUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUVBLGFBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFQSxhQUFJLENBQUMsSUFBSSxDQUFDLEdBQUc7QUFDNUVBLGFBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFQSxhQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUVBLGFBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUVBLGFBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFQSxhQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUVBLGFBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRUEsYUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBQztBQUMvSSxJQUFJLE1BQU0sR0FBRztBQUNiLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDUCxFQUFFLENBQUMsRUFBRSxDQUFDO0FBQ04sRUFBRSxDQUFDLEVBQUUsQ0FBQztBQUNOLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDTixFQUFFLENBQUMsRUFBRSxDQUFDO0FBQ04sRUFBRSxDQUFDLEVBQUUsQ0FBQztBQUNOLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDTixFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ1AsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNQLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDTixFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ1IsRUFBRSxFQUFFLEVBQUUsQ0FBQztBQUNQLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFDUixFQUFFLEVBQUUsRUFBRSxDQUFDO0FBQ1AsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ1IsRUFBQztBQUNELElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ3hDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztBQUNyQixFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDL0IsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0FBQ3JCLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxLQUFLLEdBQUc7QUFDWixFQUFFLENBQUMsRUFBRSxJQUFJO0FBQ1QsRUFBRSxDQUFDLEVBQUUsSUFBSTtBQUNULEVBQUUsQ0FBQyxFQUFFLElBQUk7QUFDVCxFQUFFLENBQUMsRUFBRSxJQUFJO0FBQ1QsRUFBRSxDQUFDLEVBQUUsSUFBSTtBQUNULEVBQUUsQ0FBQyxFQUFFLElBQUk7QUFDVCxFQUFFLENBQUMsRUFBRSxJQUFJO0FBQ1QsRUFBRSxFQUFFLEVBQUUsSUFBSTtBQUNWLEVBQUUsRUFBRSxFQUFFLElBQUk7QUFDVixFQUFFLEVBQUUsRUFBRSxJQUFJO0FBQ1YsRUFBQztBQUNELElBQUksS0FBSyxHQUFHO0FBQ1osRUFBRSxDQUFDLEVBQUUsSUFBSTtBQUNULEVBQUUsQ0FBQyxFQUFFLElBQUk7QUFDVCxFQUFFLENBQUMsRUFBRSxJQUFJO0FBQ1QsRUFBRSxDQUFDLEVBQUUsSUFBSTtBQUNULEVBQUUsQ0FBQyxFQUFFLElBQUk7QUFDVCxFQUFFLENBQUMsRUFBRSxJQUFJO0FBQ1QsRUFBRSxDQUFDLEVBQUUsSUFBSTtBQUNULEVBQUUsQ0FBQyxFQUFFLElBQUk7QUFDVCxFQUFFLENBQUMsRUFBRSxJQUFJO0FBQ1QsRUFBRSxDQUFDLEVBQUUsSUFBSTtBQUNULEVBQUUsRUFBRSxFQUFFLElBQUk7QUFDVixFQUFFLEVBQUUsRUFBRSxJQUFJO0FBQ1YsRUFBRSxFQUFFLEVBQUUsSUFBSTtBQUNWLEVBQUUsRUFBRSxFQUFFLElBQUk7QUFDVixFQUFDO0FBQ0QsSUFBSSxhQUFhLEdBQUc7QUFDcEIsRUFBRSxDQUFDLEVBQUUsSUFBSTtBQUNULEVBQUUsQ0FBQyxFQUFFLElBQUk7QUFDVCxFQUFFLENBQUMsRUFBRSxJQUFJO0FBQ1QsRUFBRSxDQUFDLEVBQUUsSUFBSTtBQUNULEVBQUUsRUFBRSxFQUFFLElBQUk7QUFDVixFQUFFLEVBQUUsRUFBRSxJQUFJO0FBQ1YsRUFBQztBQUNELElBQUksS0FBSyxHQUFHLEdBQUU7QUFDZCxJQUFJLGFBQWEsR0FBRztBQUNwQixFQUFFLENBQUMsRUFBRSxJQUFJO0FBQ1QsRUFBRSxDQUFDLEVBQUUsSUFBSTtBQUNULEVBQUUsQ0FBQyxFQUFFLElBQUk7QUFDVCxFQUFFLENBQUMsRUFBRSxJQUFJO0FBQ1QsRUFBRSxDQUFDLEVBQUUsSUFBSTtBQUNULEVBQUUsQ0FBQyxFQUFFLElBQUk7QUFDVCxFQUFFLEVBQUUsRUFBRSxJQUFJO0FBQ1YsRUFBRSxFQUFFLEVBQUUsSUFBSTtBQUNWLEVBQUM7QUFDRCxJQUFJLEtBQUssR0FBRztBQUNaLEVBQUUsQ0FBQyxFQUFFLElBQUk7QUFDVCxFQUFDO0FBQ0QsSUFBSSxLQUFLLEdBQUc7QUFDWixFQUFFLEVBQUU7QUFDSixFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0FBQy9ILEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQztBQUNwQixFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQztBQUMxRCxFQUFFLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDO0FBQzFELEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUM7QUFDdEMsRUFBQztBQUNEO0FBQ0EsU0FBUyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ2pDLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUM5QixJQUFJLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDakMsTUFBTSxPQUFPLEtBQUs7QUFDbEIsS0FBSztBQUNMLEdBQUc7QUFDSCxFQUFFLE9BQU8sSUFBSTtBQUNiLENBQUM7QUFDREEsYUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLE1BQU0sRUFBRTtBQUNsQyxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzFDLElBQUksSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFNO0FBQ2xDLElBQUksSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFDO0FBQ2pCO0FBQ0E7QUFDQSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQzlCLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDOUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQzNDLFFBQVEsSUFBSSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDO0FBQ3pDLFFBQVEsS0FBSztBQUNiLE9BQU87QUFDUCxLQUFLO0FBQ0wsSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLENBQUMsRUFBRTtBQUNyQixNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBQztBQUNqQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBQztBQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRTtBQUNsRCxRQUFRLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUU7QUFDMUMsT0FBTztBQUNQLE1BQU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUM7QUFDekQsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUM7QUFDL0IsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUM7QUFDL0IsS0FBSyxNQUFNO0FBQ1gsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQUs7QUFDbkMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUk7QUFDakMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQUs7QUFDakMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUk7QUFDakMsS0FBSztBQUNMLEdBQUc7QUFDSCxFQUFDO0FBQ0Q7QUFDQSxTQUFTLFFBQVEsQ0FBQyxNQUFNLEVBQUU7QUFDMUIsRUFBRSxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7QUFDakIsRUFBRSxJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0FBQzdCLEVBQUUsSUFBSSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNoQixFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDbkMsSUFBSSxJQUFJLENBQUMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUU7QUFDdEUsTUFBTSxRQUFRO0FBQ2QsS0FBSztBQUNMLElBQUksR0FBRyxHQUFHLEdBQUU7QUFDWixJQUFJLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzFHLE1BQU0sSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxFQUFFLFNBQVM7QUFDM0MsTUFBTSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDNUMsUUFBUSxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRTtBQUM5QyxVQUFVLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDO0FBQzNCLFVBQVUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFNO0FBQzdCLFVBQVUsQ0FBQyxHQUFHLEVBQUM7QUFDZixTQUFTO0FBQ1QsT0FBTztBQUNQLEtBQUs7QUFDTCxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLEVBQUM7QUFDdkIsSUFBSSxJQUFJLEdBQUcsS0FBSyxFQUFFLEVBQUU7QUFDcEIsTUFBTSxPQUFPLElBQUlBLGFBQUksQ0FBQyxTQUFTLENBQUMsMEJBQTBCLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlFLEtBQUs7QUFDTCxJQUFJLElBQUksS0FBSyxH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LEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0FBQzdDLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMvQyxDQUFDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7QUFDdEIsQ0FBQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN0QyxFQUFFLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxFQUFFLEVBQUU7QUFDcEUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQztBQUN4QixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN4QyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckIsR0FBRztBQUNILE9BQU8sSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtBQUM5QixHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsR0FBRztBQUNILE9BQU8sSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtBQUM5QixHQUFHLE9BQU8sQ0FBQyxNQUFNLEdBQUcsS0FB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QyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQyxHQUFHO0FBQ0gsT0FBTyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0FBQzFCLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hELEdBQUc7QUFDSCxPQUFPLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7QUFDMUIsR0FBRyxHQUFHLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQztBQUN0RCxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0MsSUFBSTtBQUNKLFFBQVEsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDOUUsR0FBRztBQUNILE9BQU8sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUMxQixHQUFHLEdBQUcsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDO0FBQ3RELElBQUksS0FBSyxDQUFD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QyxDQUFDLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUMzQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6QyxHQUFHO0FBQ0gsT0FBTyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0FBQzFCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEksR0FBRztBQUNILE9BQU8sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUMxQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0SixHQUFHO0FBQ0gsT0FBTyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQzNCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNuQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbkIsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzFJLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JILEdBQUc7QUFDSCxPQUFPLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7QUFDM0MsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ25CLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNuQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNqSyxHQUFHO0FBQ0gsT0FBTyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQzNCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNuQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbkIsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ25CLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMz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 diff --git a/.obsidian/plugins/buttons/manifest.json b/.obsidian/plugins/buttons/manifest.json deleted file mode 100644 index b7aba1e2e..000000000 --- a/.obsidian/plugins/buttons/manifest.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "id": "buttons", - "name": "Buttons", - "description": "Create Buttons in your Obsidian notes to run commands, open links, and insert templates", - "version": "0.4.11", - "author": "shabegom", - "authorUrl": "https://shbgm.ca", - "isDesktopOnly": false, - "minAppVersion": "0.10.8" -} diff --git a/.obsidian/plugins/buttons/styles.css b/.obsidian/plugins/buttons/styles.css deleted file mode 100644 index 58fc929bf..000000000 --- a/.obsidian/plugins/buttons/styles.css +++ /dev/null @@ -1,142 +0,0 @@ -/* @settings - -name: Buttons -id: buttons-styles -settings: - - - id: button-background - title: Background - type: variable-themed-color - format: hex - opacity: false - default-light: '#f5f6f8' - default-dark: '#1b1b1b' - - - id: button-text - title: Text - type: variable-themed-color - format: hex - opacity: false - default-light: '#1b1b1b' - default-dark: '#f5f6f8' - - - id: button-border - title: Border - type: variable-themed-color - format: hex - opacity: false - default-light: '#7a9486' - default-dark: '#84a83a' - - - id: button-box-shadow - title: Box Shadow - type: variable-themed-color - format: rgb - opacity: true - default-light: '#1b1b1b' - default-dark: '#f5f6f8' - - - id: button-border-radius - title: Border Radius - type: variable-number - format: px - default: 5 - - - id: button-size - title: Font Size - type: variable-number - format: em - default: 1 - -*/ - -.block-language-button { - padding: 5px; -} - -.button-default { - border: 0.5px solid var(--button-border, #7a9486); - border-radius: var(--button-border-radius, 5px); - background-color: var(--button-background); - padding: 10px 30px; - color: var(--button-text); - text-decoration: none; - font-size: var(--button-size); - margin: 0 5px; - box-shadow: 0 1px 3px var(--button-box-shadow, rgba(0, 0, 0, 0.12)), - 0 1px 2px var(--button-box-shadow, rgba(0, 0, 0, 0.24)); - transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); -} - -.button-default:hover { - z-index: 100; - box-shadow: 0 4px 4px var(--button-box-shadow, rgba(0, 0, 0, 0.25)), - 0 10px 10px var(--button-box-shadow, rgba(0, 0, 0, 0.22)); - transform: translate3d(0px, -1.5px, 0px); - background-color: var(--button-background); -} - -.theme-dark .button-default { - border: 0.5px solid var(--button-border, #84a83a); -} - -.theme-dark .button-default:hover { - z-index: 100; - box-shadow: 0 4px 4px var(--button-box-shadow, rgba(210, 210, 210, 0.25)), - 0 10px 10px var(--button-box-shadow, rgba(210, 210, 210, 0.22)); - transform: translate3d(0px, -1.5px, 0px); -} - -.blue { - background: #76b3fa; - color: black; -} - -.red { - background: red; -} - -.green { - background: green; -} - -.yellow { - background: yellow; - color: black; -} - -.purple { - background: #725585; -} - -.blue:hover { - background: #76b3fa; - color: black; -} - -.red:hover { - background: red; -} - -.green:hover { - background: green; -} - -.yellow:hover { - background: yellow; - color: black; -} - -.purple:hover { - background: #725585; -} - -.button-maker { - max-width: 35rem; - width: 35rem; - overflow-y: auto; - max-height: 30rem; - padding-left: 0.5rem; - padding-right: 0.5rem; - overflow-x: hidden; -} diff --git a/.obsidian/plugins/css-snippets/main.js b/.obsidian/plugins/css-snippets/main.js deleted file mode 100644 index 9c2591ad6..000000000 --- a/.obsidian/plugins/css-snippets/main.js +++ /dev/null @@ -1,57 +0,0 @@ -'use strict'; - -var obsidian = require('obsidian'); - -const defSnippetFolder = "css-snippets"; -class CssSnippetsPlugin extends obsidian.Plugin { - constructor(app, pluginManifest) { - super(app, pluginManifest); - } - async onload() { - this.addCommand({ - id: "refresh-styles", - name: "Reload", - callback: async () => { - this.loadSnippets(); - }, - }); - this.addCommand({ - id: "unload-styles", - name: "Unload", - callback: async () => { - this.unloadSnippets(); - }, - }); - this.loadedStyles = Array(0); - this.loadSnippets(); - } - onunload() { - this.unloadSnippets(); - } - async loadSnippets() { - this.unloadSnippets(); - // enumerate the style files - let style_files = await this.app.vault.adapter.list(defSnippetFolder); - style_files.files; - for (let fstyle of style_files.files) { - // console.log( "Found file: ", fstyle ); - if (fstyle.indexOf(".css") < 0) ; - let content = await this.app.vault.adapter.read(fstyle); - let css = content; - var style = document.createElement("style"); - style.innerHTML = css; - document.head.appendChild(style); - this.loadedStyles.push(style); - } - } - async unloadSnippets() { - for (let tag of this.loadedStyles) { - // console.log( "Removing style tag: ", tag ); - document.head.removeChild(tag); - } - this.loadedStyles = Array(0); - } -} - -module.exports = CssSnippetsPlugin; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbbnVsbF0sIm5hbWVzIjpbIlBsdWdpbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUVBLE1BQU0sZ0JBQWdCLEdBQVcsY0FBYyxDQUFDO01BRTNCLGlCQUFrQixTQUFRQSxlQUFNO0lBR25ELFlBQVksR0FBUSxFQUFFLGNBQThCO1FBQ2xELEtBQUssQ0FBQyxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUM7S0FDNUI7SUFFRCxNQUFNLE1BQU07UUFDVixJQUFJLENBQUMsVUFBVSxDQUFDO1lBQ2QsRUFBRSxFQUFFLGdCQUFnQjtZQUNwQixJQUFJLEVBQUUsUUFBUTtZQUNkLFFBQVEsRUFBRTtnQkFDUixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7YUFDckI7U0FDRixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQ2QsRUFBRSxFQUFFLGVBQWU7WUFDbkIsSUFBSSxFQUFFLFFBQVE7WUFDZCxRQUFRLEVBQUU7Z0JBQ1IsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2FBQ3ZCO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQW1CLENBQUMsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztLQUNyQjtJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7S0FDdkI7SUFFRCxNQUFNLFlBQVk7UUFDaEIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDOztRQUd0QixJQUFJLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUN0RSxXQUFXLENBQUMsS0FBSyxDQUFDO1FBQ2xCLEtBQUssSUFBSSxNQUFNLElBQUksV0FBVyxDQUFDLEtBQUssRUFBRTs7WUFFcEMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUUvQjtZQUVELElBQUksT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN4RCxJQUFJLEdBQUcsR0FBRyxPQUFPLENBQUM7WUFFbEIsSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM1QyxLQUFLLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQztZQUN0QixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUMvQjtLQUNGO0lBRUQsTUFBTSxjQUFjO1FBQ2xCLEtBQUssSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTs7WUFFakMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDaEM7UUFDRCxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBbUIsQ0FBQyxDQUFDLENBQUM7S0FDaEQ7Ozs7OyJ9 diff --git a/.obsidian/plugins/css-snippets/manifest.json b/.obsidian/plugins/css-snippets/manifest.json deleted file mode 100644 index d46160f7d..000000000 --- a/.obsidian/plugins/css-snippets/manifest.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "id": "css-snippets", - "name": "css snippets", - "version": "0.1.2", - "description": "Load and manage css snippets", - "author": "dandandan", - "authorUrl": "https://github.com/jdbrice/obsidian-css-snippets", - "isDesktopOnly": "true" -} diff --git a/.obsidian/plugins/darlal-switcher-plus/main.js b/.obsidian/plugins/darlal-switcher-plus/main.js deleted file mode 100644 index 54cb6dfc6..000000000 --- a/.obsidian/plugins/darlal-switcher-plus/main.js +++ /dev/null @@ -1,985 +0,0 @@ -'use strict'; - -var obsidian = require('obsidian'); - -/*! ***************************************************************************** -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -***************************************************************************** */ -/* global Reflect, Promise */ - -var extendStatics = function(d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); -}; - -function __extends(d, b) { - if (typeof b !== "function" && b !== null) - throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -} - -var __assign = function() { - __assign = Object.assign || function __assign(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); -}; - -function __rest(s, e) { - var t = {}; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) - t[p] = s[p]; - if (s != null && typeof Object.getOwnPropertySymbols === "function") - for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { - if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) - t[p[i]] = s[p[i]]; - } - return t; -} - -function __decorate(decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -} - -function __param(paramIndex, decorator) { - return function (target, key) { decorator(target, key, paramIndex); } -} - -function __metadata(metadataKey, metadataValue) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue); -} - -function __awaiter(thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -} - -function __generator(thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -} - -var __createBinding = Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -}); - -function __exportStar(m, o) { - for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p); -} - -function __values(o) { - var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; - if (m) return m.call(o); - if (o && typeof o.length === "number") return { - next: function () { - if (o && i >= o.length) o = void 0; - return { value: o && o[i++], done: !o }; - } - }; - throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); -} - -function __read(o, n) { - var m = typeof Symbol === "function" && o[Symbol.iterator]; - if (!m) return o; - var i = m.call(o), r, ar = [], e; - try { - while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); - } - catch (error) { e = { error: error }; } - finally { - try { - if (r && !r.done && (m = i["return"])) m.call(i); - } - finally { if (e) throw e.error; } - } - return ar; -} - -/** @deprecated */ -function __spread() { - for (var ar = [], i = 0; i < arguments.length; i++) - ar = ar.concat(__read(arguments[i])); - return ar; -} - -/** @deprecated */ -function __spreadArrays() { - for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; - for (var r = Array(s), k = 0, i = 0; i < il; i++) - for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) - r[k] = a[j]; - return r; -} - -function __spreadArray(to, from) { - for (var i = 0, il = from.length, j = to.length; i < il; i++, j++) - to[j] = from[i]; - return to; -} - -function __await(v) { - return this instanceof __await ? (this.v = v, this) : new __await(v); -} - -function __asyncGenerator(thisArg, _arguments, generator) { - if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var g = generator.apply(thisArg, _arguments || []), i, q = []; - return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i; - function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; } - function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } } - function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); } - function fulfill(value) { resume("next", value); } - function reject(value) { resume("throw", value); } - function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); } -} - -function __asyncDelegator(o) { - var i, p; - return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i; - function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; } -} - -function __asyncValues(o) { - if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var m = o[Symbol.asyncIterator], i; - return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); - function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } - function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); } -} - -function __makeTemplateObject(cooked, raw) { - if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; } - return cooked; -}; - -var __setModuleDefault = Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}; - -function __importStar(mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -} - -function __importDefault(mod) { - return (mod && mod.__esModule) ? mod : { default: mod }; -} - -function __classPrivateFieldGet(receiver, state, kind, f) { - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); - return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); -} - -function __classPrivateFieldSet(receiver, state, value, kind, f) { - if (kind === "m") throw new TypeError("Private method is not writable"); - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); - return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; -} - -var DefaultConfig = { - editorListCommand: 'edt ', - symbolListCommand: '@', - excludeViewTypes: ['empty'], -}; -function getDefaultData() { - return { - alwaysNewPaneForSymbols: false, - symbolsInLineOrder: true, - showExistingOnly: false, - }; -} -var SwitcherPlusSettings = /** @class */ (function () { - function SwitcherPlusSettings(plugin) { - this.plugin = plugin; - this.data = getDefaultData(); - } - Object.defineProperty(SwitcherPlusSettings.prototype, "alwaysNewPaneForSymbols", { - get: function () { - return this.data.alwaysNewPaneForSymbols; - }, - set: function (value) { - this.data.alwaysNewPaneForSymbols = value; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(SwitcherPlusSettings.prototype, "symbolsInlineOrder", { - get: function () { - return this.data.symbolsInLineOrder; - }, - set: function (value) { - this.data.symbolsInLineOrder = value; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(SwitcherPlusSettings.prototype, "showExistingOnly", { - get: function () { - return this.data.showExistingOnly; - }, - set: function (value) { - this.data.showExistingOnly = value; - }, - enumerable: false, - configurable: true - }); - SwitcherPlusSettings.prototype.loadSettings = function () { - return __awaiter(this, void 0, void 0, function () { - var plugin, savedData; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - plugin = this.plugin; - return [4 /*yield*/, plugin.loadData()]; - case 1: - savedData = (_a.sent()); - this.data = __assign(__assign({}, getDefaultData()), savedData); - return [2 /*return*/]; - } - }); - }); - }; - SwitcherPlusSettings.prototype.saveSettings = function () { - var _a = this, plugin = _a.plugin, data = _a.data; - if (plugin && data) { - plugin.saveData(data).catch(function () { - console.log('Switcher++: Error saving settings data'); - }); - } - }; - return SwitcherPlusSettings; -}()); - -var SwitcherPlusSettingTab = /** @class */ (function (_super) { - __extends(SwitcherPlusSettingTab, _super); - function SwitcherPlusSettingTab(app, plugin, settings) { - var _this = _super.call(this, app, plugin) || this; - _this.settings = settings; - return _this; - } - SwitcherPlusSettingTab.prototype.display = function () { - var _a = this, containerEl = _a.containerEl, settings = _a.settings; - containerEl.empty(); - SwitcherPlusSettingTab.setAlwaysNewPaneForSymbols(containerEl, settings); - SwitcherPlusSettingTab.setSymbolsInLineOrder(containerEl, settings); - SwitcherPlusSettingTab.setShowExistingOnly(containerEl, settings); - }; - SwitcherPlusSettingTab.setAlwaysNewPaneForSymbols = function (containerEl, settings) { - new obsidian.Setting(containerEl) - .setName('Open Symbols in new pane') - .setDesc('Enabled, always open a new pane when navigating to Symbols. Disabled, navigate in an already open pane (if one exists)') - .addToggle(function (toggle) { - return toggle.setValue(settings.alwaysNewPaneForSymbols).onChange(function (value) { - settings.alwaysNewPaneForSymbols = value; - settings.saveSettings(); - }); - }); - }; - SwitcherPlusSettingTab.setSymbolsInLineOrder = function (containerEl, settings) { - new obsidian.Setting(containerEl) - .setName('List symbols in order they appear') - .setDesc('Enabled, symbols will be displayed in the (line) order they appear in the source text, indented under any preceding heading. Disabled, symbols will be grouped by type: Headings, Tags, Links, Embeds.') - .addToggle(function (toggle) { - return toggle.setValue(settings.symbolsInlineOrder).onChange(function (value) { - settings.symbolsInlineOrder = value; - settings.saveSettings(); - }); - }); - }; - SwitcherPlusSettingTab.setShowExistingOnly = function (containerEl, settings) { - new obsidian.Setting(containerEl) - .setName('Show existing only') - .setDesc('Whether to show links to files that are not yet created.') - .addToggle(function (toggle) { - return toggle.setValue(settings.showExistingOnly).onChange(function (value) { - settings.showExistingOnly = value; - settings.saveSettings(); - }); - }); - }; - return SwitcherPlusSettingTab; -}(obsidian.PluginSettingTab)); - -function isOfType(obj, discriminator, val) { - var ret = false; - if (obj && obj[discriminator] !== undefined) { - ret = true; - if (val !== undefined && val !== obj[discriminator]) { - ret = false; - } - } - return ret; -} -function isSymbolSuggestion(obj) { - return isOfType(obj, 'type', 'Symbol'); -} -function isEditorSuggestion(obj) { - return isOfType(obj, 'type', 'Editor'); -} -function isFileSuggestion(obj) { - return isOfType(obj, 'type', 'file'); -} -function isAliasSuggestion(obj) { - return isOfType(obj, 'type', 'alias'); -} -function isUnresolvedSuggestion(obj) { - return isOfType(obj, 'type', 'unresolved'); -} -function isSystemSuggestion(obj) { - return isFileSuggestion(obj) || isUnresolvedSuggestion(obj) || isAliasSuggestion(obj); -} -function isHeadingCache(obj) { - return isOfType(obj, 'level'); -} - -var Mode; -(function (Mode) { - Mode[Mode["Standard"] = 1] = "Standard"; - Mode[Mode["EditorList"] = 2] = "EditorList"; - Mode[Mode["SymbolList"] = 4] = "SymbolList"; -})(Mode || (Mode = {})); -var SymbolType; -(function (SymbolType) { - SymbolType[SymbolType["Link"] = 1] = "Link"; - SymbolType[SymbolType["Embed"] = 2] = "Embed"; - SymbolType[SymbolType["Tag"] = 4] = "Tag"; - SymbolType[SymbolType["Heading"] = 8] = "Heading"; -})(SymbolType || (SymbolType = {})); -var SymbolIndicators = {}; -SymbolIndicators[SymbolType.Link] = '🔗'; -SymbolIndicators[SymbolType.Embed] = '!'; -SymbolIndicators[SymbolType.Tag] = '#'; -SymbolIndicators[SymbolType.Heading] = 'H'; -var HeadingIndicators = {}; -HeadingIndicators[1] = 'H₁'; -HeadingIndicators[2] = 'H₂'; -HeadingIndicators[3] = 'H₃'; -HeadingIndicators[4] = 'H₄'; -HeadingIndicators[5] = 'H₅'; -HeadingIndicators[6] = 'H₆'; - -var ReferenceViews = ['backlink', 'outline', 'localgraph']; -function fileFromView(view) { - var _a; - return (_a = view) === null || _a === void 0 ? void 0 : _a.file; -} -var ModeHandler = /** @class */ (function () { - function ModeHandler(app, settings) { - this.app = app; - this.settings = settings; - this._mode = Mode.Standard; - this.symbolTarget = null; - this.hasSearchTerm = false; - } - Object.defineProperty(ModeHandler.prototype, "mode", { - get: function () { - return this._mode; - }, - enumerable: false, - configurable: true - }); - ModeHandler.prototype.reset = function () { - this.symbolTarget = null; - }; - ModeHandler.prototype.getCommandStringForMode = function (mode) { - var val = ''; - if (mode === Mode.EditorList) { - val = DefaultConfig.editorListCommand; - } - else if (mode === Mode.SymbolList) { - val = DefaultConfig.symbolListCommand; - } - return val; - }; - ModeHandler.prototype.onChooseSuggestion = function (sugg) { - if (isEditorSuggestion(sugg)) { - var item = sugg.item; - this.app.workspace.setActiveLeaf(item); - item.view.setEphemeralState({ focus: true }); - } - else { - this.navigateToSymbol(sugg); - } - }; - ModeHandler.prototype.renderSuggestion = function (sugg, parentEl) { - var containerEl = parentEl; - if (isSymbolSuggestion(sugg)) { - var item = sugg.item; - if (this.settings.symbolsInlineOrder && !this.hasSearchTerm) { - parentEl.addClass("qsp-symbol-l" + item.indentLevel); - } - ModeHandler.addSymbolIndicator(item, containerEl); - containerEl = createSpan({ - cls: 'qsp-symbol-text', - parent: containerEl, - }); - } - var text = ModeHandler.getItemText(sugg.item); - obsidian.renderResults(containerEl, text, sugg.match); - }; - ModeHandler.prototype.determineRunMode = function (input, activeSuggestion) { - var editorListCommand = DefaultConfig.editorListCommand, symbolListCommand = DefaultConfig.symbolListCommand; - // determine if the editor command exists and if it's valid - var hasEditorCmdPrefix = input.indexOf(editorListCommand) === 0; - // get the index of symbol command and determine if it exists - var symbolCmdIndex = input.indexOf(symbolListCommand); - var hasSymbolCmd = symbolCmdIndex !== -1; - var hasSymbolCmdPrefix = symbolCmdIndex === 0; - // determine if the chooser is showing suggestions, and if so, is the - // currently selected suggestion a valid target for symbols - var activeSuggInfo = ModeHandler.getActiveSuggestionInfo(hasSymbolCmd, activeSuggestion); - // determine if the current active editor pane a valid target for symbols - var activeEditorInfo = this.getActiveEditorInfo(hasSymbolCmdPrefix, activeSuggInfo.isValidSymbolTarget); - return this.setupRunMode(hasEditorCmdPrefix, hasSymbolCmd, activeSuggInfo, activeEditorInfo); - }; - ModeHandler.prototype.getActiveEditorInfo = function (hasSymbolCmdPrefix, isActiveSuggValidSymbolTarget) { - var _a = this.app.workspace, activeLeaf = _a.activeLeaf, view = _a.activeLeaf.view; - var excludeViewTypes = DefaultConfig.excludeViewTypes; - // determine if the current active editor pane is valid - var isCurrentEditorValid = !excludeViewTypes.includes(view.getViewType()); - // whether or not the current active editor can be used as the target for - // symbol search - var isValidSymbolTarget = hasSymbolCmdPrefix && - !isActiveSuggValidSymbolTarget && - isCurrentEditorValid && - !!fileFromView(view); - return { isValidSymbolTarget: isValidSymbolTarget, editor: activeLeaf }; - }; - ModeHandler.getActiveSuggestionInfo = function (hasSymbolCmd, activeSuggestion) { - var sugg = activeSuggestion; - if (hasSymbolCmd && isSymbolSuggestion(sugg)) { - // symbol suggestions don't point to a file and can't - //themselves be used for symbol suggestions - sugg = null; - } - // whether or not the current suggestion can be used for symbol search - var isValidSymbolTarget = !!sugg; - return { suggestion: sugg, isValidSymbolTarget: isValidSymbolTarget }; - }; - ModeHandler.prototype.setupRunMode = function (hasEditorCmdPrefix, hasSymbolCmd, activeSuggInfo, activeEditorInfo) { - var _a = this, mode = _a.mode, symbolTarget = _a.symbolTarget; - if (hasSymbolCmd) { - mode = Mode.SymbolList; - symbolTarget = ModeHandler.getTargetForSymbolMode(mode, activeSuggInfo, activeEditorInfo, symbolTarget); - } - else if (hasEditorCmdPrefix) { - mode = Mode.EditorList; - symbolTarget = null; - } - else { - mode = Mode.Standard; - symbolTarget = null; - } - this.symbolTarget = symbolTarget; - this._mode = mode; - return mode; - }; - ModeHandler.getTargetForSymbolMode = function (mode, activeSuggInfo, activeEditorInfo, oldSymbolTarget) { - // wether or not a symbol target file exists. Indicates that the previous - // operation was a symbol operation - var hasExistingSymbolTarget = mode === Mode.SymbolList && !!oldSymbolTarget; - var symbolTarget = oldSymbolTarget; - if (activeSuggInfo.isValidSymbolTarget) { - symbolTarget = ModeHandler.targetFromSuggestion(activeSuggInfo.suggestion); - } - else if (!hasExistingSymbolTarget && activeEditorInfo.isValidSymbolTarget) { - var leaf = activeEditorInfo.editor; - var file = fileFromView(leaf.view); - symbolTarget = { file: file, leaf: leaf }; - } - return symbolTarget; - }; - ModeHandler.targetFromSuggestion = function (sugg) { - var file = null, leaf = null, ret = null; - if (!isSymbolSuggestion(sugg) && !isUnresolvedSuggestion(sugg)) { - if (isEditorSuggestion(sugg)) { - leaf = sugg.item; - file = fileFromView(leaf.view); - } - else { - file = sugg.file; - } - ret = { file: file, leaf: leaf }; - } - return ret; - }; - ModeHandler.extractSearchQuery = function (input, mode) { - if (input === void 0) { input = ''; } - var editorListCommand = DefaultConfig.editorListCommand, symbolListCommand = DefaultConfig.symbolListCommand; - var startIndex = 0; - if (mode === Mode.SymbolList) { - var symbolCmdIndex = input.indexOf(symbolListCommand); - startIndex = symbolCmdIndex + symbolListCommand.length; - } - else if (mode === Mode.EditorList) { - startIndex = editorListCommand.length; - } - var queryStr = input.slice(startIndex).trim().toLowerCase(); - return obsidian.prepareQuery(queryStr); - }; - ModeHandler.prototype.getSuggestions = function (input) { - var _a; - var _b = this, mode = _b.mode, symbolTarget = _b.symbolTarget; - var suggestions = []; - var prepQuery = ModeHandler.extractSearchQuery(input, mode); - var hasSearchTerm = ((_a = prepQuery === null || prepQuery === void 0 ? void 0 : prepQuery.query) === null || _a === void 0 ? void 0 : _a.length) > 0; - this.hasSearchTerm = hasSearchTerm; - var items = this.getItems(mode, symbolTarget); - var push = function (item, match) { - if (item instanceof obsidian.WorkspaceLeaf) { - suggestions.push({ type: 'Editor', item: item, match: match }); - } - else { - suggestions.push({ type: 'Symbol', item: item, match: match }); - } - }; - items.forEach(function (item) { - var match = null; - if (hasSearchTerm) { - var text = ModeHandler.getItemText(item); - match = obsidian.fuzzySearch(prepQuery, text); - if (match) { - push(item, match); - } - } - else { - push(item, null); - } - }); - if (hasSearchTerm) { - obsidian.sortSearchResults(suggestions); - } - return suggestions; - }; - ModeHandler.prototype.getItems = function (mode, symbolTarget) { - var items; - if (mode === Mode.EditorList) { - items = this.getOpenRootSplits(); - } - else if (mode === Mode.SymbolList) { - items = this.getSymbolsForTarget(symbolTarget); - } - return items; - }; - ModeHandler.prototype.getOpenRootSplits = function () { - var workspace = this.app.workspace; - var leaves = []; - var saveLeaf = function (l) { - if (!DefaultConfig.excludeViewTypes.includes(l.view.getViewType())) { - leaves.push(l); - } - }; - workspace.iterateRootLeaves(saveLeaf); - return leaves; - }; - ModeHandler.prototype.getSymbolsForTarget = function (symbolTarget) { - var metadataCache = this.app.metadataCache; - var ret = []; - if (symbolTarget && symbolTarget.file) { - var file = symbolTarget.file; - var symbolData = metadataCache.getFileCache(file); - if (symbolData) { - var push = function (symbols, type) { - if (symbols === void 0) { symbols = []; } - symbols.forEach(function (symbol) { return ret.push({ symbol: symbol, type: type }); }); - }; - push(symbolData.headings, SymbolType.Heading); - push(symbolData.tags, SymbolType.Tag); - push(symbolData.links, SymbolType.Link); - push(symbolData.embeds, SymbolType.Embed); - } - } - return this.settings.symbolsInlineOrder && !this.hasSearchTerm - ? this.orderSymbolsByLineNumber(ret) - : ret; - }; - ModeHandler.prototype.orderSymbolsByLineNumber = function (symbols) { - if (symbols === void 0) { symbols = []; } - var sorted = symbols.sort(function (a, b) { - var aStart = a.symbol.position.start; - var bStart = b.symbol.position.start; - var lineDiff = aStart.line - bStart.line; - return lineDiff === 0 ? aStart.col - bStart.col : lineDiff; - }); - var currIndentLevel = 0; - sorted.forEach(function (si) { - var indentLevel = 0; - if (isHeadingCache(si.symbol)) { - currIndentLevel = si.symbol.level; - indentLevel = si.symbol.level - 1; - } - else { - indentLevel = currIndentLevel; - } - si.indentLevel = indentLevel; - }); - return sorted; - }; - ModeHandler.getItemText = function (item) { - var text; - if (item instanceof obsidian.WorkspaceLeaf) { - text = item.getDisplayText(); - } - else { - text = ModeHandler.getSuggestionTextForSymbol(item); - } - return text; - }; - ModeHandler.getSuggestionTextForSymbol = function (symbolInfo) { - var symbol = symbolInfo.symbol; - var text; - if (isHeadingCache(symbol)) { - text = symbol.heading; - } - else if (isOfType(symbol, 'tag')) { - text = symbol.tag.slice(1); - } - else { - var refCache = symbol; - (text = refCache.link); - var displayText = refCache.displayText; - if (displayText && displayText !== text) { - text += "|" + displayText; - } - } - return text; - }; - ModeHandler.prototype.navigateToSymbol = function (sugg) { - var workspace = this.app.workspace; - // determine if the target is already open in a pane - var _a = this.findOpenEditorMatchingSymbolTarget(), leaf = _a.leaf, path = _a.file.path; - var _b = sugg.item.symbol.position, _c = _b.start, line = _c.line, col = _c.col, endLoc = _b.end; - // object containing the state information for the target editor, - // start with the range to highlight in target editor - var eState = { - startLoc: { line: line, col: col }, - endLoc: endLoc, - line: line, - focus: true, - cursor: { - from: { line: line, ch: col }, - to: { line: line, ch: col }, - }, - }; - if (leaf && !this.settings.alwaysNewPaneForSymbols) { - // activate the already open pane, and set state - workspace.setActiveLeaf(leaf, true); - leaf.view.setEphemeralState(eState); - } - else { - workspace - .openLinkText(path, '', true, { eState: eState }) - .catch(function () { return console.log('Switcher++: unable to navigate to symbol'); }); - } - }; - ModeHandler.prototype.findOpenEditorMatchingSymbolTarget = function () { - var _a = this.symbolTarget, file = _a.file, leaf = _a.leaf; - var isTargetLeaf = !!leaf; - var predicate = function (l) { - var val = false; - var isRefView = ReferenceViews.includes(l.view.getViewType()); - var isTargetRefView = isTargetLeaf && ReferenceViews.includes(leaf.view.getViewType()); - if (!isRefView) { - val = - isTargetLeaf && !isTargetRefView ? l === leaf : fileFromView(l.view) === file; - } - return val; - }; - var l = this.getOpenRootSplits().find(predicate); - return { leaf: l, file: file }; - }; - ModeHandler.addSymbolIndicator = function (symbolInfo, parentEl) { - var type = symbolInfo.type, symbol = symbolInfo.symbol; - var indicator; - if (isHeadingCache(symbol)) { - indicator = HeadingIndicators[symbol.level]; - } - else { - indicator = SymbolIndicators[type]; - } - createDiv({ - text: indicator, - cls: 'qsp-symbol-indicator', - parent: parentEl, - }); - }; - return ModeHandler; -}()); - -var Keymap = /** @class */ (function () { - function Keymap(scope, chooser, modalContainerEl) { - this.scope = scope; - this.chooser = chooser; - this.modalContainerEl = modalContainerEl; - } - Object.defineProperty(Keymap.prototype, "isOpen", { - get: function () { - return this._isOpen; - }, - set: function (value) { - this._isOpen = value; - }, - enumerable: false, - configurable: true - }); - Keymap.prototype.registerBindings = function () { - var scope = this.scope; - scope.register(['Ctrl'], 'n', this.navigateItems.bind(this)); - scope.register(['Ctrl'], 'p', this.navigateItems.bind(this)); - }; - Keymap.prototype.navigateItems = function (_evt, ctx) { - var _a = this, isOpen = _a.isOpen, chooser = _a.chooser; - if (isOpen) { - var isNext = ctx.key === 'n'; - var index = chooser.selectedItem; - chooser.setSelectedItem(isNext ? index + 1 : index - 1); - } - return false; - }; - Keymap.updateHelperTextForMode = function (mode, containerEl) { - var selector = '.prompt-instructions'; - var el = containerEl.querySelector(selector); - if (el) { - el.style.display = mode === Mode.Standard ? '' : 'none'; - } - }; - Keymap.prototype.updateKeymapForMode = function (mode) { - var keys = this.scope.keys; - var _a = this.backupKeys, backupKeys = _a === void 0 ? [] : _a; - Keymap.updateHelperTextForMode(mode, this.modalContainerEl); - if (mode === Mode.Standard) { - if (backupKeys.length) { - backupKeys.forEach(function (key) { return keys.push(key); }); - } - backupKeys = undefined; - } - else { - // unregister unused hotkeys for custom modes - for (var i = keys.length - 1; i >= 0; --i) { - var key = keys[i]; - if (key.key === 'Enter' && - (key.modifiers === 'Meta' || key.modifiers === 'Shift')) { - keys.splice(i, 1); - backupKeys.push(key); - } - } - } - this.backupKeys = backupKeys; - }; - return Keymap; -}()); - -var QUICK_SWITCHER_ID = 'switcher'; -function getSystemSwitcher(app) { - var switcher = app.internalPlugins.getPluginById(QUICK_SWITCHER_ID); - if (!switcher) { - return null; - } - return switcher.instance.modal.constructor; -} -function createSwitcherPlus(app, plugin) { - var systemSwitcher = getSystemSwitcher(app); - if (systemSwitcher === null) { - return null; - } - var switcherPlusClass = /** @class */ (function (_super) { - __extends(class_1, _super); - function class_1(app, plugin) { - var _this = _super.call(this, app) || this; - _this.plugin = plugin; - _this.openWithCommandStr = null; - _this.exMode = new ModeHandler(app, plugin.options); - _this.exKeymap = new Keymap(_this.scope, _this.chooser, _this.containerEl); - return _this; - } - class_1.prototype.openInMode = function (mode) { - var exMode = this.exMode; - exMode.reset(); - this.chooser.setSuggestions([]); - if (mode !== Mode.Standard) { - this.openWithCommandStr = exMode.getCommandStringForMode(mode); - } - this.open(); - }; - class_1.prototype.onOpen = function () { - this.exKeymap.isOpen = true; - _super.prototype.onOpen.call(this); - }; - class_1.prototype.onClose = function () { - _super.prototype.onClose.call(this); - this.exKeymap.isOpen = false; - }; - class_1.prototype.updateSuggestions = function () { - var _a = this, exMode = _a.exMode, exKeymap = _a.exKeymap, chooser = _a.chooser, openWithCommandStr = _a.openWithCommandStr; - if (openWithCommandStr !== null && openWithCommandStr !== '') { - // update UI with current command string in the case were openInMode was called - this.inputEl.value = openWithCommandStr; - // reset to null so user input is not overridden the next time onInput is called - this.openWithCommandStr = null; - } - var activeSugg = this.getActiveSuggestion(); - var input = this.inputEl.value; - var mode = exMode.determineRunMode(input, activeSugg); - exKeymap.updateKeymapForMode(mode); - if (mode === Mode.Standard) { - _super.prototype.updateSuggestions.call(this); - } - else { - chooser.setSuggestions([]); - var suggestions = exMode.getSuggestions(input); - chooser.setSuggestions(suggestions); - } - }; - class_1.prototype.onChooseSuggestion = function (item, evt) { - var exMode = this.exMode; - if (isSystemSuggestion(item) || exMode.mode === Mode.Standard) { - _super.prototype.onChooseSuggestion.call(this, item, evt); - } - else { - exMode.onChooseSuggestion(item); - } - }; - class_1.prototype.renderSuggestion = function (value, parentEl) { - var exMode = this.exMode; - if (isSystemSuggestion(value) || exMode.mode === Mode.Standard) { - _super.prototype.renderSuggestion.call(this, value, parentEl); - } - else { - exMode.renderSuggestion(value, parentEl); - } - }; - class_1.prototype.getActiveSuggestion = function () { - var chooser = this.chooser; - var activeSuggestion = null; - if (chooser === null || chooser === void 0 ? void 0 : chooser.values) { - activeSuggestion = chooser.values[chooser.selectedItem]; - } - return activeSuggestion; - }; - return class_1; - }(systemSwitcher)); - return new switcherPlusClass(app, plugin); -} - -var SwitcherPlusPlugin = /** @class */ (function (_super) { - __extends(SwitcherPlusPlugin, _super); - function SwitcherPlusPlugin() { - return _super !== null && _super.apply(this, arguments) || this; - } - SwitcherPlusPlugin.prototype.onload = function () { - return __awaiter(this, void 0, void 0, function () { - var options; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - options = new SwitcherPlusSettings(this); - return [4 /*yield*/, options.loadSettings()]; - case 1: - _a.sent(); - this.options = options; - this.addSettingTab(new SwitcherPlusSettingTab(this.app, this, options)); - this.registerCommand('switcher-plus:open', 'Open', Mode.Standard); - this.registerCommand('switcher-plus:open-editors', 'Open in Editor Mode', Mode.EditorList); - this.registerCommand('switcher-plus:open-symbols', 'Open in Symbol Mode', Mode.SymbolList); - return [2 /*return*/]; - } - }); - }); - }; - SwitcherPlusPlugin.prototype.onunload = function () { - this.modal = null; - }; - SwitcherPlusPlugin.prototype.registerCommand = function (id, name, mode) { - var _this = this; - this.addCommand({ - id: id, - name: name, - hotkeys: [], - checkCallback: function (checking) { - var modal = _this.getModal(); - if (modal) { - if (!checking) { - modal.openInMode(mode); - } - return true; - } - return false; - }, - }); - }; - SwitcherPlusPlugin.prototype.getModal = function () { - var modal = this.modal; - if (modal) { - return modal; - } - modal = createSwitcherPlus(this.app, this); - this.modal = modal; - return modal; - }; - return SwitcherPlusPlugin; -}(obsidian.Plugin)); - -module.exports = SwitcherPlusPlugin; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsiLi4vLi4vbm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIi4uLy4uL3NyYy9zZXR0aW5ncy9zd2l0Y2hlclBsdXNTZXR0aW5ncy50cyIsIi4uLy4uL3NyYy9zZXR0aW5ncy9zd2l0Y2hlclBsdXNTZXR0aW5nVGFiLnRzIiwiLi4vLi4vc3JjL3V0aWxzLnRzIiwiLi4vLi4vc3JjL3R5cGVzL3NoYXJlZFR5cGVzLnRzIiwiLi4vLi4vc3JjL3N3aXRjaGVyUGx1cy9tb2RlSGFuZGxlci50cyIsIi4uLy4uL3NyYy9zd2l0Y2hlclBsdXMva2V5bWFwLnRzIiwiLi4vLi4vc3JjL3N3aXRjaGVyUGx1cy9zd2l0Y2hlclBsdXMudHMiLCIuLi8uLi9zcmMvbWFpbi50cyJdLCJzb3VyY2VzQ29udGVudCI6bnVsbCwibmFtZXMiOlsiU2V0dGluZyIsIlBsdWdpblNldHRpbmdUYWIiLCJyZW5kZXJSZXN1bHRzIiwicHJlcGFyZVF1ZXJ5IiwiV29ya3NwYWNlTGVhZiIsImZ1enp5U2VhcmNoIiwic29ydFNlYXJjaFJlc3VsdHMiLCJQbHVnaW4iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksYUFBYSxHQUFHLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNuQyxJQUFJLGFBQWEsR0FBRyxNQUFNLENBQUMsY0FBYztBQUN6QyxTQUFTLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxZQUFZLEtBQUssSUFBSSxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDcEYsUUFBUSxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLE1BQU0sQ0FBQyxT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QVEsU0FBUyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO0FBQ3RHLFFBQVEsU0FBUyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFO0FBQ3RILFFBQVEsSUFBSSxDQUFDLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLFVBQVUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzlFLEtBQUssQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUNEO0FBQ08sU0FBUyxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRTtBQUMzQyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDckgsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxNQUFNLEtBQUssVUFBVSxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsV0FBVyxFQUFFLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM3SixJQUFJLFNBQVMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLE9BQU8sVUFBVSxDQUFDLEVBQUUsRUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3RFLElBQUksU0FBUyxJQUFJLENBQUMsRUFBRSxFQUFFO0FBQ3RCLFFBQVEsSUFBSSxDQUFDLEVBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0FBQ3RFLFFBQVEsT0FBTyxDQUFDLEVBQUUsSUFBSTtBQUN0QixZQUFZLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3pLLFlBQVksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFL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LENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO0FBQ3RGLElBQUksU0FBUyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssWUFBWSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQzVILElBQUksU0FBUyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFO0FBQ3RELElBQUksU0FBUyxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFO0FBQ3RELElBQUksU0FBUyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUN0RixDQUFDO0FBQ0Q7QUFDTyxTQUFTLGdCQUFnQixDQUFDLENBQUMsRUFBRTtBQUNwQyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNiLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxFQUFFLEVBQUUsTUFBTSxD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 diff --git a/.obsidian/plugins/darlal-switcher-plus/manifest.json b/.obsidian/plugins/darlal-switcher-plus/manifest.json deleted file mode 100644 index 5ea13ed2e..000000000 --- a/.obsidian/plugins/darlal-switcher-plus/manifest.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "id": "darlal-switcher-plus", - "name": "Quick Switcher++", - "version": "0.0.11", - "minAppVersion": "0.12.4", - "description": "Enhanced Quick Switcher, search open panels, and symbols.", - "author": "darlal", - "authorUrl": "https://github.com/darlal/obsidian-switcher-plus", - "isDesktopOnly": false -} diff --git a/.obsidian/plugins/darlal-switcher-plus/styles.css b/.obsidian/plugins/darlal-switcher-plus/styles.css deleted file mode 100644 index 0d72a6988..000000000 --- a/.obsidian/plugins/darlal-switcher-plus/styles.css +++ /dev/null @@ -1,38 +0,0 @@ -:root { - --symbol-base-padding: 0px; - --symbol-indent-padding: 12px; -} - -.qsp-symbol-indicator { - color: var(--text-accent); - width: 2.5em; - text-align: center; - float:left; - font-weight:800; -} - -.qsp-symbol-text {} - -.qsp-symbol-l0 { - padding-left: var(--symbol-base-padding); -} - -.qsp-symbol-l1 { - padding-left: calc(var(--symbol-base-padding) + var(--symbol-indent-padding)) -} - -.qsp-symbol-l2 { - padding-left: calc(var(--symbol-base-padding) + (2 * var(--symbol-indent-padding))) -} -.qsp-symbol-l3 { - padding-left: calc(var(--symbol-base-padding) + (3 * var(--symbol-indent-padding))) -} -.qsp-symbol-l4 { - padding-left: calc(var(--symbol-base-padding) + (4 * var(--symbol-indent-padding))) -} -.qsp-symbol-l5 { - padding-left: calc(var(--symbol-base-padding) + (5 * var(--symbol-indent-padding))) -} -.qsp-symbol-l6 { - padding-left: calc(var(--symbol-base-padding) + (6 * var(--symbol-indent-padding))) -} diff --git a/.obsidian/plugins/find-unlinked-files/data.json b/.obsidian/plugins/find-unlinked-files/data.json deleted file mode 100644 index cb331f7e0..000000000 --- a/.obsidian/plugins/find-unlinked-files/data.json +++ /dev/null @@ -1 +0,0 @@ -{"outputFileName":"unlinked","disableWorkingLinks":false,"directoriesToIgnore":[],"filesToIgnore":[],"fileTypesToIgnore":[],"linksToIgnore":[],"tagsToIgnore":[],"fileTypesToDelete":[],"ignoreFileTypes":true,"ignoreDirectories":true,"unresolvedLinksOutputFileName":"unresolved links output","unresolvedLinksDirectoriesToIgnore":[],"unresolvedLinksFilesToIgnore":[],"unresolvedLinksFileTypesToIgnore":[],"unresolvedLinksLinksToIgnore":[],"unresolvedLinksTagsToIgnore":[]} \ No newline at end of file diff --git a/.obsidian/plugins/find-unlinked-files/main.js b/.obsidian/plugins/find-unlinked-files/main.js deleted file mode 100644 index 0697af57a..000000000 --- a/.obsidian/plugins/find-unlinked-files/main.js +++ /dev/null @@ -1,637 +0,0 @@ -'use strict'; - -var obsidian = require('obsidian'); - -/*! ***************************************************************************** -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -***************************************************************************** */ -/* global Reflect, Promise */ - -var extendStatics = function(d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); -}; - -function __extends(d, b) { - if (typeof b !== "function" && b !== null) - throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -} - -function __awaiter(thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -} - -function __generator(thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -} - -function __spreadArray(to, from) { - for (var i = 0, il = from.length, j = to.length; i < il; i++, j++) - to[j] = from[i]; - return to; -} - -var DeleteFilesModal = /** @class */ (function (_super) { - __extends(DeleteFilesModal, _super); - function DeleteFilesModal(app, filesToDelete) { - var _this = _super.call(this, app) || this; - _this.filesToDelete = filesToDelete; - return _this; - } - DeleteFilesModal.prototype.onOpen = function () { - var _this = this; - var _a = this, contentEl = _a.contentEl, titleEl = _a.titleEl; - titleEl.setText('Move ' + this.filesToDelete.length + ' files to system trash?'); - contentEl - .createEl("button", { text: "Cancel" }) - .addEventListener("click", function () { return _this.close(); }); - contentEl - .setAttr("margin", "auto"); - contentEl - .createEl("button", { - cls: "mod-cta", - text: "Confirm" - }) - .addEventListener("click", function () { return __awaiter(_this, void 0, void 0, function () { - var _i, _a, file; - return __generator(this, function (_b) { - switch (_b.label) { - case 0: - _i = 0, _a = this.filesToDelete; - _b.label = 1; - case 1: - if (!(_i < _a.length)) return [3 /*break*/, 4]; - file = _a[_i]; - return [4 /*yield*/, this.app.vault.trash(file, true)]; - case 2: - _b.sent(); - _b.label = 3; - case 3: - _i++; - return [3 /*break*/, 1]; - case 4: - this.close(); - return [2 /*return*/]; - } - }); - }); }); - }; - DeleteFilesModal.prototype.onClose = function () { - var contentEl = this.contentEl; - contentEl.empty(); - }; - return DeleteFilesModal; -}(obsidian.Modal)); - -var SettingsTab = /** @class */ (function (_super) { - __extends(SettingsTab, _super); - function SettingsTab(app, plugin, defaultSettings) { - var _this = _super.call(this, app, plugin) || this; - _this.defaultSettings = defaultSettings; - _this.plugin = plugin; - return _this; - } - SettingsTab.prototype.formatPath = function (path, addDirectorySlash) { - if (path.length == 0) - return path; - path = obsidian.normalizePath(path); - if (addDirectorySlash) - return path + "/"; - else - return path; - }; - SettingsTab.prototype.display = function () { - var _this = this; - var containerEl = this.containerEl; - containerEl.empty(); - containerEl.createEl("h2", { text: this.plugin.manifest.name }); - containerEl.createEl("h4", { text: "Settings for find unlinked files" }); - new obsidian.Setting(containerEl) - .setName('Output file name') - .setDesc('Set name of output file (without file extension). Make sure no file exists with this name because it will be overwritten! If the name is empty, the default name is set.') - .addText(function (cb) { return cb.onChange(function (value) { - if (value.length == 0) { - _this.plugin.settings.outputFileName = _this.defaultSettings.outputFileName; - } - else { - _this.plugin.settings.outputFileName = value; - } - _this.plugin.saveSettings(); - }).setValue(_this.plugin.settings.outputFileName); }); - new obsidian.Setting(containerEl) - .setName('Disable working links') - .setDesc('Indent lines to disable the link and to clean up the graph view') - .addToggle(function (cb) { return cb.onChange(function (value) { - _this.plugin.settings.disableWorkingLinks = value; - _this.plugin.saveSettings(); - }).setValue(_this.plugin.settings.disableWorkingLinks); }); - new obsidian.Setting(containerEl) - .setName("Ignore or include files in the given directories") - .setDesc("Enable to ignore files in the given directories. Disable to only include files in the given filetypes") - .addToggle(function (cb) { - return cb.setValue(_this.plugin.settings.ignoreDirectories) - .onChange(function (value) { - _this.plugin.settings.ignoreDirectories = value; - _this.plugin.saveSettings(); - }); - }); - new obsidian.Setting(containerEl) - .setName("Directories") - .setDesc("Add each directory path in a new line") - .addTextArea(function (cb) { return cb - .setPlaceholder("Directory/Subdirectory") - .setValue(_this.plugin.settings.directoriesToIgnore.join("\n")) - .onChange(function (value) { - var paths = value.trim().split("\n").map(function (value) { return _this.formatPath(value, true); }); - _this.plugin.settings.directoriesToIgnore = paths; - _this.plugin.saveSettings(); - }); }); - new obsidian.Setting(containerEl) - .setName("Files to ignore.") - .setDesc("Add each file path in a new line (with file extension!)") - .addTextArea(function (cb) { return cb - .setPlaceholder("Directory/file.md") - .setValue(_this.plugin.settings.filesToIgnore.join("\n")) - .onChange(function (value) { - var paths = value.trim().split("\n").map(function (value) { return _this.formatPath(value, false); }); - _this.plugin.settings.filesToIgnore = paths; - _this.plugin.saveSettings(); - }); }); - new obsidian.Setting(containerEl) - .setName("Links to ignore.") - .setDesc("Ignore files, which contain the given file as link. Add each file path in a new line (with file extension!). Set it to `*` to ignore files with links.") - .addTextArea(function (cb) { return cb - .setPlaceholder("Directory/file.md") - .setValue(_this.plugin.settings.linksToIgnore.join("\n")) - .onChange(function (value) { - var paths = value.trim().split("\n").map(function (value) { return _this.formatPath(value, false); }); - _this.plugin.settings.linksToIgnore = paths; - _this.plugin.saveSettings(); - }); }); - new obsidian.Setting(containerEl) - .setName("Ignore or include files with the given filetypes") - .setDesc("Enable to ignore files with the given filetypes. Disable to only include files with the given filetypes") - .addToggle(function (cb) { - return cb.setValue(_this.plugin.settings.ignoreFileTypes) - .onChange(function (value) { - _this.plugin.settings.ignoreFileTypes = value; - _this.plugin.saveSettings(); - }); - }); - new obsidian.Setting(containerEl) - .setName("File types") - .setDesc("Effect depends on toggle above") - .addTextArea(function (cb) { return cb - .setPlaceholder("docx,txt") - .setValue(_this.plugin.settings.fileTypesToIgnore.join(",")) - .onChange(function (value) { - var extensions = value.trim().split(","); - _this.plugin.settings.fileTypesToIgnore = extensions; - _this.plugin.saveSettings(); - }); }); - new obsidian.Setting(containerEl) - .setName("Tags to ignore.") - .setDesc("Ignore files, which contain the given tag. Add each tag separated by comma (without `#`)") - .addTextArea(function (cb) { return cb - .setPlaceholder("todo,unfinished") - .setValue(_this.plugin.settings.tagsToIgnore.join(",")) - .onChange(function (value) { - var tags = value.trim().split(","); - _this.plugin.settings.tagsToIgnore = tags; - _this.plugin.saveSettings(); - }); }); - new obsidian.Setting(containerEl) - .setName("Filetypes to delete per command. See README.") - .setDesc("Add each filetype separated by comma. ") - .addTextArea(function (cb) { return cb - .setPlaceholder("jpg,png") - .setValue(_this.plugin.settings.fileTypesToDelete.join(",")) - .onChange(function (value) { - var extensions = value.trim().split(","); - _this.plugin.settings.fileTypesToDelete = extensions; - _this.plugin.saveSettings(); - }); }); - /// Settings for find unresolvedLinks - containerEl.createEl("h4", { text: "Settings for find unresolved links" }); - new obsidian.Setting(containerEl) - .setName('Output file name') - .setDesc('Set name of output file (without file extension). Make sure no file exists with this name because it will be overwritten! If the name is empty, the default name is set.') - .addText(function (cb) { return cb.onChange(function (value) { - if (value.length == 0) { - _this.plugin.settings.unresolvedLinksOutputFileName = _this.defaultSettings.unresolvedLinksOutputFileName; - } - else { - _this.plugin.settings.unresolvedLinksOutputFileName = value; - } - _this.plugin.saveSettings(); - }).setValue(_this.plugin.settings.unresolvedLinksOutputFileName); }); - new obsidian.Setting(containerEl) - .setName("Directories to ignore.") - .setDesc("Ignore links in files in the specified directory. Add each directory path in a new line") - .addTextArea(function (cb) { return cb - .setPlaceholder("Directory/Subdirectory") - .setValue(_this.plugin.settings.unresolvedLinksDirectoriesToIgnore.join("\n")) - .onChange(function (value) { - var paths = value.trim().split("\n").map(function (value) { return _this.formatPath(value, true); }); - _this.plugin.settings.unresolvedLinksDirectoriesToIgnore = paths; - _this.plugin.saveSettings(); - }); }); - new obsidian.Setting(containerEl) - .setName("Files to ignore.") - .setDesc("Ignore links in the specified file. Add each file path in a new line (with file extension!)") - .addTextArea(function (cb) { return cb - .setPlaceholder("Directory/file.md") - .setValue(_this.plugin.settings.unresolvedLinksFilesToIgnore.join("\n")) - .onChange(function (value) { - var paths = value.trim().split("\n").map(function (value) { return _this.formatPath(value, false); }); - _this.plugin.settings.unresolvedLinksFilesToIgnore = paths; - _this.plugin.saveSettings(); - }); }); - new obsidian.Setting(containerEl) - .setName("Links to ignore.") - .setDesc("Ignore files, which contain the given file as link. Add each file path in a new line (with file extension!). Set it to `*` to ignore files with links.") - .addTextArea(function (cb) { return cb - .setPlaceholder("Directory/file.md") - .setValue(_this.plugin.settings.unresolvedLinksLinksToIgnore.join("\n")) - .onChange(function (value) { - var paths = value.trim().split("\n").map(function (value) { return _this.formatPath(value, false); }); - _this.plugin.settings.unresolvedLinksLinksToIgnore = paths; - _this.plugin.saveSettings(); - }); }); - new obsidian.Setting(containerEl) - .setName("Filetypes to ignore.") - .setDesc("Ignore links with the specified filetype. Add each filetype separated by comma") - .addTextArea(function (cb) { return cb - .setPlaceholder("docx,txt") - .setValue(_this.plugin.settings.unresolvedLinksFileTypesToIgnore.join(",")) - .onChange(function (value) { - var extensions = value.trim().split(","); - _this.plugin.settings.unresolvedLinksFileTypesToIgnore = extensions; - _this.plugin.saveSettings(); - }); }); - new obsidian.Setting(containerEl) - .setName("Tags to ignore.") - .setDesc("Ignore links in files, which contain the given tag. Add each tag separated by comma (without `#`)") - .addTextArea(function (cb) { return cb - .setPlaceholder("todo,unfinished") - .setValue(_this.plugin.settings.unresolvedLinksTagsToIgnore.join(",")) - .onChange(function (value) { - var tags = value.trim().split(","); - _this.plugin.settings.unresolvedLinksTagsToIgnore = tags; - _this.plugin.saveSettings(); - }); }); - }; - return SettingsTab; -}(obsidian.PluginSettingTab)); - -var Utils = /** @class */ (function () { - /** - * Checks for the given settings. Is used for `Find unlinked files` and `Find unresolved links` - * @param app - * @param filePath - * @param tagsToIgnore - * @param linksToIgnore - * @param directoriesToIgnore - * @param filesToIgnore - * @param ignoreDirectories - */ - function Utils(app, filePath, tagsToIgnore, linksToIgnore, directoriesToIgnore, filesToIgnore, ignoreDirectories) { - if (ignoreDirectories === void 0) { ignoreDirectories = true; } - this.app = app; - this.filePath = filePath; - this.tagsToIgnore = tagsToIgnore; - this.linksToIgnore = linksToIgnore; - this.directoriesToIgnore = directoriesToIgnore; - this.filesToIgnore = filesToIgnore; - this.ignoreDirectories = ignoreDirectories; - this.fileCache = app.metadataCache.getCache(filePath); - } - Utils.prototype.hasTagsToIgnore = function () { - var _this = this; - var tags = obsidian.getAllTags(this.fileCache); - return (tags === null || tags === void 0 ? void 0 : tags.find(function (tag) { return _this.tagsToIgnore.contains(tag.substring(1)); })) !== undefined; - }; - Utils.prototype.hasLinksToIgnore = function () { - var _this = this; - var _a, _b; - if ((((_a = this.fileCache) === null || _a === void 0 ? void 0 : _a.embeds) != null || ((_b = this.fileCache) === null || _b === void 0 ? void 0 : _b.links) != null) && this.linksToIgnore[0] == "*") { - return true; - } - return obsidian.iterateCacheRefs(this.fileCache, function (cb) { - var _a; - var link = (_a = _this.app.metadataCache.getFirstLinkpathDest(cb.link, _this.filePath)) === null || _a === void 0 ? void 0 : _a.path; - return _this.linksToIgnore.contains(link); - }); - }; - Utils.prototype.checkDirectory = function () { - var _this = this; - var contains = this.directoriesToIgnore.find(function (value) { return _this.filePath.startsWith(value) && value.length != 0; }) !== undefined; - if (this.ignoreDirectories) { - return contains; - } - else { - return !contains; - } - }; - Utils.prototype.isFileToIgnore = function () { - return this.filesToIgnore.contains(this.filePath); - }; - Utils.prototype.isValid = function () { - return !this.hasTagsToIgnore() && !this.hasLinksToIgnore() && !this.checkDirectory() && !this.isFileToIgnore(); - }; - /** - * Writes the text to the file and opens the file in a new pane if it is not opened yet - * @param app - * @param outputFileName name of the output file - * @param text data to be written to the file - */ - Utils.writeAndOpenFile = function (app, outputFileName, text) { - return __awaiter(this, void 0, void 0, function () { - var fileIsAlreadyOpened; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: return [4 /*yield*/, app.vault.adapter.write(outputFileName, text)]; - case 1: - _a.sent(); - fileIsAlreadyOpened = false; - app.workspace.iterateAllLeaves(function (leaf) { - if (leaf.getDisplayText() != "" && outputFileName.startsWith(leaf.getDisplayText())) { - fileIsAlreadyOpened = true; - } - }); - if (!fileIsAlreadyOpened) - app.workspace.openLinkText(outputFileName, "/", true); - return [2 /*return*/]; - } - }); - }); - }; - return Utils; -}()); - -var DEFAULT_SETTINGS = { - outputFileName: "unlinked files output", - disableWorkingLinks: false, - directoriesToIgnore: [], - filesToIgnore: [], - fileTypesToIgnore: [], - linksToIgnore: [], - tagsToIgnore: [], - fileTypesToDelete: [], - ignoreFileTypes: true, - ignoreDirectories: true, - unresolvedLinksOutputFileName: "unresolved links output", - unresolvedLinksDirectoriesToIgnore: [], - unresolvedLinksFilesToIgnore: [], - unresolvedLinksFileTypesToIgnore: [], - unresolvedLinksLinksToIgnore: [], - unresolvedLinksTagsToIgnore: [], -}; -var FindUnlinkedFilesPlugin = /** @class */ (function (_super) { - __extends(FindUnlinkedFilesPlugin, _super); - function FindUnlinkedFilesPlugin() { - return _super !== null && _super.apply(this, arguments) || this; - } - FindUnlinkedFilesPlugin.prototype.onload = function () { - return __awaiter(this, void 0, void 0, function () { - var _this = this; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - console.log('loading ' + this.manifest.name + " plugin"); - return [4 /*yield*/, this.loadSettings()]; - case 1: - _a.sent(); - this.addCommand({ - id: 'find-unlinked-files', - name: 'Find unlinked files', - callback: function () { return _this.findUnlinkedFiles(); }, - }); - this.addCommand({ - id: 'find-unresolved-link', - name: 'Find unresolved links', - callback: function () { return _this.findUnresolvedLinks(); }, - }); - this.addCommand({ - id: "delete-unlinked-files", - name: "Delete unlinked files with certain extension. See README", - callback: function () { return _this.deleteUnlinkedFiles(); } - }); - this.addSettingTab(new SettingsTab(this.app, this, DEFAULT_SETTINGS)); - return [2 /*return*/]; - } - }); - }); - }; - FindUnlinkedFilesPlugin.prototype.findUnlinkedFiles = function () { - var _this = this; - var outFileName = this.settings.outputFileName + ".md"; - var outFile; - var files = this.app.vault.getFiles(); - var markdownFiles = this.app.vault.getMarkdownFiles(); - var links = []; - markdownFiles.forEach(function (markFile) { - if (markFile.path == outFileName) { - outFile = markFile; - return; - } - obsidian.iterateCacheRefs(_this.app.metadataCache.getFileCache(markFile), function (cb) { - var txt = _this.app.metadataCache.getFirstLinkpathDest(obsidian.getLinkpath(cb.link), markFile.path); - if (txt != null) - links.push(txt.path); - }); - }); - var notLinkedFiles = files.filter(function (file) { return _this.isValid(file, links); }); - notLinkedFiles.remove(outFile); - var text = ""; - var prefix; - if (this.settings.disableWorkingLinks) - prefix = " "; - else - prefix = ""; - notLinkedFiles.forEach(function (file) { - text += prefix + "- [[" + _this.app.metadataCache.fileToLinktext(file, "/") + "]]\n"; - }); - Utils.writeAndOpenFile(this.app, outFileName, text); - }; - FindUnlinkedFilesPlugin.prototype.deleteUnlinkedFiles = function () { - var _a, _b; - return __awaiter(this, void 0, void 0, function () { - var links, filesToDelete; - var _this = this; - return __generator(this, function (_c) { - switch (_c.label) { - case 0: return [4 /*yield*/, this.app.vault.adapter.exists(this.settings.outputFileName + ".md")]; - case 1: - if (!(_c.sent())) { - new obsidian.Notice("Can't find file - Please run the `Find unlinked files' command before"); - return [2 /*return*/]; - } - links = (_b = (_a = this.app.metadataCache.getCache(this.settings.outputFileName + ".md")) === null || _a === void 0 ? void 0 : _a.links) !== null && _b !== void 0 ? _b : []; - filesToDelete = []; - links.forEach(function (link) { - var file = _this.app.metadataCache.getFirstLinkpathDest(link.link, "/"); - if (!file) - return; - if (_this.settings.fileTypesToDelete.contains(file.extension)) { - filesToDelete.push(file); - } - }); - if (filesToDelete.length > 0) - new DeleteFilesModal(this.app, filesToDelete).open(); - return [2 /*return*/]; - } - }); - }); - }; - FindUnlinkedFilesPlugin.prototype.findUnresolvedLinks = function () { - var outFileName = this.settings.unresolvedLinksOutputFileName + ".md"; - var links = []; - var unresolvedLinks = this.app.metadataCache.unresolvedLinks; - for (var filePath in unresolvedLinks) { - if (filePath == this.settings.unresolvedLinksOutputFileName + ".md") - continue; - var fileType = filePath.substring(filePath.lastIndexOf(".") + 1); - var utils = new Utils(this.app, filePath, this.settings.unresolvedLinksTagsToIgnore, this.settings.unresolvedLinksLinksToIgnore, this.settings.unresolvedLinksDirectoriesToIgnore, this.settings.unresolvedLinksFilesToIgnore); - if (!utils.isValid()) - continue; - var _loop_1 = function (link) { - var linkFileType = link.substring(link.lastIndexOf(".") + 1); - console.log(linkFileType); - if (this_1.settings.unresolvedLinksFileTypesToIgnore.contains(linkFileType)) - return "continue"; - var formattedFilePath = filePath; - if (fileType == "md") { - formattedFilePath = filePath.substring(0, filePath.lastIndexOf(".md")); - } - var unresolvedLink = { files: [formattedFilePath], link: link }; - if (links.contains(unresolvedLink)) - return "continue"; - var duplication = links.find(function (e) { return e.link == link; }); - if (duplication) { - duplication.files.push(formattedFilePath); - } - else { - links.push(unresolvedLink); - } - }; - var this_1 = this; - for (var link in unresolvedLinks[filePath]) { - _loop_1(link); - } - } - Utils.writeAndOpenFile(this.app, outFileName, __spreadArray([ - "Don't forget that creating the file from here may create the file in the wrong directory!" - ], links.map(function (e) { return "- [[" + e.link + "]] in [[" + e.files.join("]], [[") + "]]"; })).join("\n")); - }; - /** - * Checks if the given file in an unlinked file - * - * @param file file to check - * @param links all links in the vault - */ - FindUnlinkedFilesPlugin.prototype.isValid = function (file, links) { - if (links.contains(file.path)) - return false; - //filetypes to ignore by default - if (file.extension == "css") - return false; - if (this.settings.fileTypesToIgnore[0] !== "") { - var containsFileType = this.settings.fileTypesToIgnore.contains(file.extension); - if (this.settings.ignoreFileTypes) { - if (containsFileType) - return; - } - else { - if (!containsFileType) - return; - } - } - var utils = new Utils(this.app, file.path, this.settings.tagsToIgnore, this.settings.linksToIgnore, this.settings.directoriesToIgnore, this.settings.filesToIgnore, this.settings.ignoreDirectories); - if (!utils.isValid()) - return false; - return true; - }; - FindUnlinkedFilesPlugin.prototype.onunload = function () { - console.log('unloading ' + this.manifest.name + " plugin"); - }; - FindUnlinkedFilesPlugin.prototype.loadSettings = function () { - return __awaiter(this, void 0, void 0, function () { - var _a, _b, _c, _d; - return __generator(this, function (_e) { - switch (_e.label) { - case 0: - _a = this; - _c = (_b = Object).assign; - _d = [DEFAULT_SETTINGS]; - return [4 /*yield*/, this.loadData()]; - case 1: - _a.settings = _c.apply(_b, _d.concat([_e.sent()])); - return [2 /*return*/]; - } - }); - }); - }; - FindUnlinkedFilesPlugin.prototype.saveSettings = function () { - return __awaiter(this, void 0, void 0, function () { - return __generator(this, function (_a) { - switch (_a.label) { - case 0: return [4 /*yield*/, this.saveData(this.settings)]; - case 1: - _a.sent(); - return [2 /*return*/]; - } - }); - }); - }; - return FindUnlinkedFilesPlugin; -}(obsidian.Plugin)); - -module.exports = FindUnlinkedFilesPlugin; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsInNyYy9kZWxldGVGaWxlc01vZGFsLnRzIiwic3JjL3NldHRpbmdzVGFiLnRzIiwic3JjL3V0aWxzLnRzIiwic3JjL21haW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XHJcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH1cclxuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcclxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgICAgIH1cclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcclxuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcclxuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XHJcbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcclxufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBvW2syXSA9IG1ba107XHJcbn0pO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBvKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XHJcbiAgICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcclxuICAgIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcclxuICAgICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcclxuICAgICAgICAgICAgcltrXSA9IGFbal07XHJcbiAgICByZXR1cm4gcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20pIHtcclxuICAgIGZvciAodmFyIGkgPSAwLCBpbCA9IGZyb20ubGVuZ3RoLCBqID0gdG8ubGVuZ3RoOyBpIDwgaWw7IGkrKywgaisrKVxyXG4gICAgICAgIHRvW2pdID0gZnJvbVtpXTtcclxuICAgIHJldHVybiB0bztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxyXG4gICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XHJcbiAgICB2YXIgaSwgcDtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBuID09PSBcInJldHVyblwiIH0gOiBmID8gZih2KSA6IHY7IH0gOiBmOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcclxuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XHJcbiAgICByZXR1cm4gY29va2VkO1xyXG59O1xyXG5cclxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xyXG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XHJcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xyXG4gICAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xyXG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XHJcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IGRlZmF1bHQ6IG1vZCB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgc3RhdGUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIGdldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHJlYWQgcHJpdmF0ZSBtZW1iZXIgZnJvbSBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgcmV0dXJuIGtpbmQgPT09IFwibVwiID8gZiA6IGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyKSA6IGYgPyBmLnZhbHVlIDogc3RhdGUuZ2V0KHJlY2VpdmVyKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRTZXQocmVjZWl2ZXIsIHN0YXRlLCB2YWx1ZSwga2luZCwgZikge1xyXG4gICAgaWYgKGtpbmQgPT09IFwibVwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBtZXRob2QgaXMgbm90IHdyaXRhYmxlXCIpO1xyXG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgc2V0dGVyXCIpO1xyXG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3Qgd3JpdGUgcHJpdmF0ZSBtZW1iZXIgdG8gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiAoa2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIsIHZhbHVlKSA6IGYgPyBmLnZhbHVlID0gdmFsdWUgOiBzdGF0ZS5zZXQocmVjZWl2ZXIsIHZhbHVlKSksIHZhbHVlO1xyXG59XHJcbiIsImltcG9ydCB7IEFwcCwgTW9kYWwsIFRGaWxlIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5leHBvcnQgY2xhc3MgRGVsZXRlRmlsZXNNb2RhbCBleHRlbmRzIE1vZGFsIHtcblx0ZmlsZXNUb0RlbGV0ZTogVEZpbGVbXTtcblx0Y29uc3RydWN0b3IoYXBwOiBBcHAsIGZpbGVzVG9EZWxldGU6IFRGaWxlW10pIHtcblx0XHRzdXBlcihhcHApO1xuXHRcdHRoaXMuZmlsZXNUb0RlbGV0ZSA9IGZpbGVzVG9EZWxldGU7XG5cdH1cblxuXHRvbk9wZW4oKSB7XG5cdFx0bGV0IHsgY29udGVudEVsLCB0aXRsZUVsIH0gPSB0aGlzO1xuXHRcdHRpdGxlRWwuc2V0VGV4dCgnTW92ZSAnICsgdGhpcy5maWxlc1RvRGVsZXRlLmxlbmd0aCArICcgZmlsZXMgdG8gc3lzdGVtIHRyYXNoPycpO1xuXHRcdGNvbnRlbnRFbFxuXHRcdFx0LmNyZWF0ZUVsKFwiYnV0dG9uXCIsIHsgdGV4dDogXCJDYW5jZWxcIiB9KVxuXHRcdFx0LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB0aGlzLmNsb3NlKCkpO1xuXHRcdGNvbnRlbnRFbFxuXHRcdFx0LnNldEF0dHIoXCJtYXJnaW5cIiwgXCJhdXRvXCIpO1xuXG5cdFx0Y29udGVudEVsXG5cdFx0XHQuY3JlYXRlRWwoXCJidXR0b25cIixcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGNsczogXCJtb2QtY3RhXCIsXG5cdFx0XHRcdFx0dGV4dDogXCJDb25maXJtXCJcblx0XHRcdFx0fSlcblx0XHRcdC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRmb3IgKGNvbnN0IGZpbGUgb2YgdGhpcy5maWxlc1RvRGVsZXRlKSB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5hcHAudmF1bHQudHJhc2goZmlsZSwgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5jbG9zZSgpO1xuXHRcdFx0fSk7XG5cblx0fVxuXG5cdG9uQ2xvc2UoKSB7XG5cdFx0bGV0IHsgY29udGVudEVsIH0gPSB0aGlzO1xuXHRcdGNvbnRlbnRFbC5lbXB0eSgpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBBcHAsIG5vcm1hbGl6ZVBhdGgsIFBsdWdpblNldHRpbmdUYWIsIFNldHRpbmcgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgRmluZFVubGlua2VkRmlsZXNQbHVnaW4sIHsgU2V0dGluZ3MgfSBmcm9tICcuL21haW4nO1xuXG5leHBvcnQgY2xhc3MgU2V0dGluZ3NUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcbiAgICBwbHVnaW46IEZpbmRVbmxpbmtlZEZpbGVzUGx1Z2luO1xuICAgIGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW46IEZpbmRVbmxpbmtlZEZpbGVzUGx1Z2luLCBwcml2YXRlIGRlZmF1bHRTZXR0aW5nczogU2V0dGluZ3MpIHtcbiAgICAgICAgc3VwZXIoYXBwLCBwbHVnaW4pO1xuICAgICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcbiAgICB9XG4gICAgZm9ybWF0UGF0aChwYXRoOiBzdHJpbmcsIGFkZERpcmVjdG9yeVNsYXNoOiBib29sZWFuKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHBhdGgubGVuZ3RoID09IDApXG4gICAgICAgICAgICByZXR1cm4gcGF0aDtcbiAgICAgICAgcGF0aCA9IG5vcm1hbGl6ZVBhdGgocGF0aCk7XG4gICAgICAgIGlmIChhZGREaXJlY3RvcnlTbGFzaClcbiAgICAgICAgICAgIHJldHVybiBwYXRoICsgXCIvXCI7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBwYXRoO1xuICAgIH1cblxuICAgIGRpc3BsYXkoKTogdm9pZCB7XG4gICAgICAgIGxldCB7IGNvbnRhaW5lckVsIH0gPSB0aGlzO1xuICAgICAgICBjb250YWluZXJFbC5lbXB0eSgpO1xuICAgICAgICBjb250YWluZXJFbC5jcmVhdGVFbChcImgyXCIsIHsgdGV4dDogdGhpcy5wbHVnaW4ubWFuaWZlc3QubmFtZSB9KTtcblxuICAgICAgICBjb250YWluZXJFbC5jcmVhdGVFbChcImg0XCIsIHsgdGV4dDogXCJTZXR0aW5ncyBmb3IgZmluZCB1bmxpbmtlZCBmaWxlc1wiIH0pO1xuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKCdPdXRwdXQgZmlsZSBuYW1lJylcbiAgICAgICAgICAgIC5zZXREZXNjKCdTZXQgbmFtZSBvZiBvdXRwdXQgZmlsZSAod2l0aG91dCBmaWxlIGV4dGVuc2lvbikuIE1ha2Ugc3VyZSBubyBmaWxlIGV4aXN0cyB3aXRoIHRoaXMgbmFtZSBiZWNhdXNlIGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4hIElmIHRoZSBuYW1lIGlzIGVtcHR5LCB0aGUgZGVmYXVsdCBuYW1lIGlzIHNldC4nKVxuICAgICAgICAgICAgLmFkZFRleHQoY2IgPT4gY2Iub25DaGFuZ2UodmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5vdXRwdXRGaWxlTmFtZSA9IHRoaXMuZGVmYXVsdFNldHRpbmdzLm91dHB1dEZpbGVOYW1lO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLm91dHB1dEZpbGVOYW1lID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgfSkuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3Mub3V0cHV0RmlsZU5hbWUpKTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKCdEaXNhYmxlIHdvcmtpbmcgbGlua3MnKVxuICAgICAgICAgICAgLnNldERlc2MoJ0luZGVudCBsaW5lcyB0byBkaXNhYmxlIHRoZSBsaW5rIGFuZCB0byBjbGVhbiB1cCB0aGUgZ3JhcGggdmlldycpXG4gICAgICAgICAgICAuYWRkVG9nZ2xlKGNiID0+IGNiLm9uQ2hhbmdlKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5kaXNhYmxlV29ya2luZ0xpbmtzID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICApLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmRpc2FibGVXb3JraW5nTGlua3MpKTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKFwiSWdub3JlIG9yIGluY2x1ZGUgZmlsZXMgaW4gdGhlIGdpdmVuIGRpcmVjdG9yaWVzXCIpXG4gICAgICAgICAgICAuc2V0RGVzYyhcIkVuYWJsZSB0byBpZ25vcmUgZmlsZXMgaW4gdGhlIGdpdmVuIGRpcmVjdG9yaWVzLiBEaXNhYmxlIHRvIG9ubHkgaW5jbHVkZSBmaWxlcyBpbiB0aGUgZ2l2ZW4gZmlsZXR5cGVzXCIpXG4gICAgICAgICAgICAuYWRkVG9nZ2xlKGNiID0+XG4gICAgICAgICAgICAgICAgY2Iuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuaWdub3JlRGlyZWN0b3JpZXMpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZSh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5pZ25vcmVEaXJlY3RvcmllcyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKFwiRGlyZWN0b3JpZXNcIilcbiAgICAgICAgICAgIC5zZXREZXNjKFwiQWRkIGVhY2ggZGlyZWN0b3J5IHBhdGggaW4gYSBuZXcgbGluZVwiKVxuICAgICAgICAgICAgLmFkZFRleHRBcmVhKGNiID0+IGNiXG4gICAgICAgICAgICAgICAgLnNldFBsYWNlaG9sZGVyKFwiRGlyZWN0b3J5L1N1YmRpcmVjdG9yeVwiKVxuICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5kaXJlY3Rvcmllc1RvSWdub3JlLmpvaW4oXCJcXG5cIikpXG4gICAgICAgICAgICAgICAgLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGF0aHMgPSB2YWx1ZS50cmltKCkuc3BsaXQoXCJcXG5cIikubWFwKHZhbHVlID0+IHRoaXMuZm9ybWF0UGF0aCh2YWx1ZSwgdHJ1ZSkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5kaXJlY3Rvcmllc1RvSWdub3JlID0gcGF0aHM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZShcIkZpbGVzIHRvIGlnbm9yZS5cIilcbiAgICAgICAgICAgIC5zZXREZXNjKFwiQWRkIGVhY2ggZmlsZSBwYXRoIGluIGEgbmV3IGxpbmUgKHdpdGggZmlsZSBleHRlbnNpb24hKVwiKVxuICAgICAgICAgICAgLmFkZFRleHRBcmVhKGNiID0+IGNiXG4gICAgICAgICAgICAgICAgLnNldFBsYWNlaG9sZGVyKFwiRGlyZWN0b3J5L2ZpbGUubWRcIilcbiAgICAgICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZmlsZXNUb0lnbm9yZS5qb2luKFwiXFxuXCIpKVxuICAgICAgICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhdGhzID0gdmFsdWUudHJpbSgpLnNwbGl0KFwiXFxuXCIpLm1hcCh2YWx1ZSA9PiB0aGlzLmZvcm1hdFBhdGgodmFsdWUsIGZhbHNlKSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmZpbGVzVG9JZ25vcmUgPSBwYXRocztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKFwiTGlua3MgdG8gaWdub3JlLlwiKVxuICAgICAgICAgICAgLnNldERlc2MoXCJJZ25vcmUgZmlsZXMsIHdoaWNoIGNvbnRhaW4gdGhlIGdpdmVuIGZpbGUgYXMgbGluay4gQWRkIGVhY2ggZmlsZSBwYXRoIGluIGEgbmV3IGxpbmUgKHdpdGggZmlsZSBleHRlbnNpb24hKS4gU2V0IGl0IHRvIGAqYCB0byBpZ25vcmUgZmlsZXMgd2l0aCBsaW5rcy5cIilcbiAgICAgICAgICAgIC5hZGRUZXh0QXJlYShjYiA9PiBjYlxuICAgICAgICAgICAgICAgIC5zZXRQbGFjZWhvbGRlcihcIkRpcmVjdG9yeS9maWxlLm1kXCIpXG4gICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmxpbmtzVG9JZ25vcmUuam9pbihcIlxcblwiKSlcbiAgICAgICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXRocyA9IHZhbHVlLnRyaW0oKS5zcGxpdChcIlxcblwiKS5tYXAodmFsdWUgPT4gdGhpcy5mb3JtYXRQYXRoKHZhbHVlLCBmYWxzZSkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5saW5rc1RvSWdub3JlID0gcGF0aHM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZShcIklnbm9yZSBvciBpbmNsdWRlIGZpbGVzIHdpdGggdGhlIGdpdmVuIGZpbGV0eXBlc1wiKVxuICAgICAgICAgICAgLnNldERlc2MoXCJFbmFibGUgdG8gaWdub3JlIGZpbGVzIHdpdGggdGhlIGdpdmVuIGZpbGV0eXBlcy4gRGlzYWJsZSB0byBvbmx5IGluY2x1ZGUgZmlsZXMgd2l0aCB0aGUgZ2l2ZW4gZmlsZXR5cGVzXCIpXG4gICAgICAgICAgICAuYWRkVG9nZ2xlKGNiID0+XG4gICAgICAgICAgICAgICAgY2Iuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuaWdub3JlRmlsZVR5cGVzKVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UodmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuaWdub3JlRmlsZVR5cGVzID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKFwiRmlsZSB0eXBlc1wiKVxuICAgICAgICAgICAgLnNldERlc2MoXCJFZmZlY3QgZGVwZW5kcyBvbiB0b2dnbGUgYWJvdmVcIilcbiAgICAgICAgICAgIC5hZGRUZXh0QXJlYShjYiA9PiBjYlxuICAgICAgICAgICAgICAgIC5zZXRQbGFjZWhvbGRlcihcImRvY3gsdHh0XCIpXG4gICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmZpbGVUeXBlc1RvSWdub3JlLmpvaW4oXCIsXCIpKVxuICAgICAgICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGV4dGVuc2lvbnMgPSB2YWx1ZS50cmltKCkuc3BsaXQoXCIsXCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5maWxlVHlwZXNUb0lnbm9yZSA9IGV4dGVuc2lvbnM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZShcIlRhZ3MgdG8gaWdub3JlLlwiKVxuICAgICAgICAgICAgLnNldERlc2MoXCJJZ25vcmUgZmlsZXMsIHdoaWNoIGNvbnRhaW4gdGhlIGdpdmVuIHRhZy4gQWRkIGVhY2ggdGFnIHNlcGFyYXRlZCBieSBjb21tYSAod2l0aG91dCBgI2ApXCIpXG4gICAgICAgICAgICAuYWRkVGV4dEFyZWEoY2IgPT4gY2JcbiAgICAgICAgICAgICAgICAuc2V0UGxhY2Vob2xkZXIoXCJ0b2RvLHVuZmluaXNoZWRcIilcbiAgICAgICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MudGFnc1RvSWdub3JlLmpvaW4oXCIsXCIpKVxuICAgICAgICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRhZ3MgPSB2YWx1ZS50cmltKCkuc3BsaXQoXCIsXCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy50YWdzVG9JZ25vcmUgPSB0YWdzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoXCJGaWxldHlwZXMgdG8gZGVsZXRlIHBlciBjb21tYW5kLiBTZWUgUkVBRE1FLlwiKVxuICAgICAgICAgICAgLnNldERlc2MoXCJBZGQgZWFjaCBmaWxldHlwZSBzZXBhcmF0ZWQgYnkgY29tbWEuIFwiKVxuICAgICAgICAgICAgLmFkZFRleHRBcmVhKGNiID0+IGNiXG4gICAgICAgICAgICAgICAgLnNldFBsYWNlaG9sZGVyKFwianBnLHBuZ1wiKVxuICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5maWxlVHlwZXNUb0RlbGV0ZS5qb2luKFwiLFwiKSlcbiAgICAgICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBleHRlbnNpb25zID0gdmFsdWUudHJpbSgpLnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuZmlsZVR5cGVzVG9EZWxldGUgPSBleHRlbnNpb25zO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICB9KSk7XG5cblxuICAgICAgICAvLy8gU2V0dGluZ3MgZm9yIGZpbmQgdW5yZXNvbHZlZExpbmtzXG4gICAgICAgIGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiaDRcIiwgeyB0ZXh0OiBcIlNldHRpbmdzIGZvciBmaW5kIHVucmVzb2x2ZWQgbGlua3NcIiB9KTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKCdPdXRwdXQgZmlsZSBuYW1lJylcbiAgICAgICAgICAgIC5zZXREZXNjKCdTZXQgbmFtZSBvZiBvdXRwdXQgZmlsZSAod2l0aG91dCBmaWxlIGV4dGVuc2lvbikuIE1ha2Ugc3VyZSBubyBmaWxlIGV4aXN0cyB3aXRoIHRoaXMgbmFtZSBiZWNhdXNlIGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4hIElmIHRoZSBuYW1lIGlzIGVtcHR5LCB0aGUgZGVmYXVsdCBuYW1lIGlzIHNldC4nKVxuICAgICAgICAgICAgLmFkZFRleHQoY2IgPT4gY2Iub25DaGFuZ2UodmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy51bnJlc29sdmVkTGlua3NPdXRwdXRGaWxlTmFtZSA9IHRoaXMuZGVmYXVsdFNldHRpbmdzLnVucmVzb2x2ZWRMaW5rc091dHB1dEZpbGVOYW1lO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLnVucmVzb2x2ZWRMaW5rc091dHB1dEZpbGVOYW1lID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgfSkuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MudW5yZXNvbHZlZExpbmtzT3V0cHV0RmlsZU5hbWUpKTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKFwiRGlyZWN0b3JpZXMgdG8gaWdub3JlLlwiKVxuICAgICAgICAgICAgLnNldERlc2MoXCJJZ25vcmUgbGlua3MgaW4gZmlsZXMgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkuIEFkZCBlYWNoIGRpcmVjdG9yeSBwYXRoIGluIGEgbmV3IGxpbmVcIilcbiAgICAgICAgICAgIC5hZGRUZXh0QXJlYShjYiA9PiBjYlxuICAgICAgICAgICAgICAgIC5zZXRQbGFjZWhvbGRlcihcIkRpcmVjdG9yeS9TdWJkaXJlY3RvcnlcIilcbiAgICAgICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MudW5yZXNvbHZlZExpbmtzRGlyZWN0b3JpZXNUb0lnbm9yZS5qb2luKFwiXFxuXCIpKVxuICAgICAgICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhdGhzID0gdmFsdWUudHJpbSgpLnNwbGl0KFwiXFxuXCIpLm1hcCh2YWx1ZSA9PiB0aGlzLmZvcm1hdFBhdGgodmFsdWUsIHRydWUpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MudW5yZXNvbHZlZExpbmtzRGlyZWN0b3JpZXNUb0lnbm9yZSA9IHBhdGhzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoXCJGaWxlcyB0byBpZ25vcmUuXCIpXG4gICAgICAgICAgICAuc2V0RGVzYyhcIklnbm9yZSBsaW5rcyBpbiB0aGUgc3BlY2lmaWVkIGZpbGUuIEFkZCBlYWNoIGZpbGUgcGF0aCBpbiBhIG5ldyBsaW5lICh3aXRoIGZpbGUgZXh0ZW5zaW9uISlcIilcbiAgICAgICAgICAgIC5hZGRUZXh0QXJlYShjYiA9PiBjYlxuICAgICAgICAgICAgICAgIC5zZXRQbGFjZWhvbGRlcihcIkRpcmVjdG9yeS9maWxlLm1kXCIpXG4gICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVucmVzb2x2ZWRMaW5rc0ZpbGVzVG9JZ25vcmUuam9pbihcIlxcblwiKSlcbiAgICAgICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXRocyA9IHZhbHVlLnRyaW0oKS5zcGxpdChcIlxcblwiKS5tYXAodmFsdWUgPT4gdGhpcy5mb3JtYXRQYXRoKHZhbHVlLCBmYWxzZSkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy51bnJlc29sdmVkTGlua3NGaWxlc1RvSWdub3JlID0gcGF0aHM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZShcIkxpbmtzIHRvIGlnbm9yZS5cIilcbiAgICAgICAgICAgIC5zZXREZXNjKFwiSWdub3JlIGZpbGVzLCB3aGljaCBjb250YWluIHRoZSBnaXZlbiBmaWxlIGFzIGxpbmsuIEFkZCBlYWNoIGZpbGUgcGF0aCBpbiBhIG5ldyBsaW5lICh3aXRoIGZpbGUgZXh0ZW5zaW9uISkuIFNldCBpdCB0byBgKmAgdG8gaWdub3JlIGZpbGVzIHdpdGggbGlua3MuXCIpXG4gICAgICAgICAgICAuYWRkVGV4dEFyZWEoY2IgPT4gY2JcbiAgICAgICAgICAgICAgICAuc2V0UGxhY2Vob2xkZXIoXCJEaXJlY3RvcnkvZmlsZS5tZFwiKVxuICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy51bnJlc29sdmVkTGlua3NMaW5rc1RvSWdub3JlLmpvaW4oXCJcXG5cIikpXG4gICAgICAgICAgICAgICAgLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGF0aHMgPSB2YWx1ZS50cmltKCkuc3BsaXQoXCJcXG5cIikubWFwKHZhbHVlID0+IHRoaXMuZm9ybWF0UGF0aCh2YWx1ZSwgZmFsc2UpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MudW5yZXNvbHZlZExpbmtzTGlua3NUb0lnbm9yZSA9IHBhdGhzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoXCJGaWxldHlwZXMgdG8gaWdub3JlLlwiKVxuICAgICAgICAgICAgLnNldERlc2MoXCJJZ25vcmUgbGlua3Mgd2l0aCB0aGUgc3BlY2lmaWVkIGZpbGV0eXBlLiBBZGQgZWFjaCBmaWxldHlwZSBzZXBhcmF0ZWQgYnkgY29tbWFcIilcbiAgICAgICAgICAgIC5hZGRUZXh0QXJlYShjYiA9PiBjYlxuICAgICAgICAgICAgICAgIC5zZXRQbGFjZWhvbGRlcihcImRvY3gsdHh0XCIpXG4gICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVucmVzb2x2ZWRMaW5rc0ZpbGVUeXBlc1RvSWdub3JlLmpvaW4oXCIsXCIpKVxuICAgICAgICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGV4dGVuc2lvbnMgPSB2YWx1ZS50cmltKCkuc3BsaXQoXCIsXCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy51bnJlc29sdmVkTGlua3NGaWxlVHlwZXNUb0lnbm9yZSA9IGV4dGVuc2lvbnM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZShcIlRhZ3MgdG8gaWdub3JlLlwiKVxuICAgICAgICAgICAgLnNldERlc2MoXCJJZ25vcmUgbGlua3MgaW4gZmlsZXMsIHdoaWNoIGNvbnRhaW4gdGhlIGdpdmVuIHRhZy4gQWRkIGVhY2ggdGFnIHNlcGFyYXRlZCBieSBjb21tYSAod2l0aG91dCBgI2ApXCIpXG4gICAgICAgICAgICAuYWRkVGV4dEFyZWEoY2IgPT4gY2JcbiAgICAgICAgICAgICAgICAuc2V0UGxhY2Vob2xkZXIoXCJ0b2RvLHVuZmluaXNoZWRcIilcbiAgICAgICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MudW5yZXNvbHZlZExpbmtzVGFnc1RvSWdub3JlLmpvaW4oXCIsXCIpKVxuICAgICAgICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRhZ3MgPSB2YWx1ZS50cmltKCkuc3BsaXQoXCIsXCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy51bnJlc29sdmVkTGlua3NUYWdzVG9JZ25vcmUgPSB0YWdzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQXBwLCBDYWNoZWRNZXRhZGF0YSwgZ2V0QWxsVGFncywgaXRlcmF0ZUNhY2hlUmVmcyB9IGZyb20gXCJvYnNpZGlhblwiO1xuXG5leHBvcnQgY2xhc3MgVXRpbHMge1xuICAgIHByaXZhdGUgZmlsZUNhY2hlOiBDYWNoZWRNZXRhZGF0YTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBmb3IgdGhlIGdpdmVuIHNldHRpbmdzLiBJcyB1c2VkIGZvciBgRmluZCB1bmxpbmtlZCBmaWxlc2AgYW5kIGBGaW5kIHVucmVzb2x2ZWQgbGlua3NgXG4gICAgICogQHBhcmFtIGFwcCBcbiAgICAgKiBAcGFyYW0gZmlsZVBhdGggXG4gICAgICogQHBhcmFtIHRhZ3NUb0lnbm9yZSBcbiAgICAgKiBAcGFyYW0gbGlua3NUb0lnbm9yZSBcbiAgICAgKiBAcGFyYW0gZGlyZWN0b3JpZXNUb0lnbm9yZSBcbiAgICAgKiBAcGFyYW0gZmlsZXNUb0lnbm9yZSBcbiAgICAgKiBAcGFyYW0gaWdub3JlRGlyZWN0b3JpZXNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBhcHA6IEFwcCxcbiAgICAgICAgcHJpdmF0ZSBmaWxlUGF0aDogc3RyaW5nLFxuICAgICAgICBwcml2YXRlIHRhZ3NUb0lnbm9yZTogc3RyaW5nW10sXG4gICAgICAgIHByaXZhdGUgbGlua3NUb0lnbm9yZTogc3RyaW5nW10sXG4gICAgICAgIHByaXZhdGUgZGlyZWN0b3JpZXNUb0lnbm9yZTogc3RyaW5nW10sXG4gICAgICAgIHByaXZhdGUgZmlsZXNUb0lnbm9yZTogc3RyaW5nW10sXG4gICAgICAgIHByaXZhdGUgaWdub3JlRGlyZWN0b3JpZXM6IGJvb2xlYW4gPSB0cnVlLFxuICAgICkge1xuICAgICAgICB0aGlzLmZpbGVDYWNoZSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldENhY2hlKGZpbGVQYXRoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhc1RhZ3NUb0lnbm9yZSgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgdGFncyA9IGdldEFsbFRhZ3ModGhpcy5maWxlQ2FjaGUpO1xuICAgICAgICByZXR1cm4gdGFncz8uZmluZCgodGFnKSA9PiB0aGlzLnRhZ3NUb0lnbm9yZS5jb250YWlucyh0YWcuc3Vic3RyaW5nKDEpKSkgIT09IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcHJpdmF0ZSBoYXNMaW5rc1RvSWdub3JlKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoKHRoaXMuZmlsZUNhY2hlPy5lbWJlZHMgIT0gbnVsbCB8fCB0aGlzLmZpbGVDYWNoZT8ubGlua3MgIT0gbnVsbCkgJiYgdGhpcy5saW5rc1RvSWdub3JlWzBdID09IFwiKlwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpdGVyYXRlQ2FjaGVSZWZzKHRoaXMuZmlsZUNhY2hlLCBjYiA9PiB7XG4gICAgICAgICAgICBjb25zdCBsaW5rID0gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChjYi5saW5rLCB0aGlzLmZpbGVQYXRoKT8ucGF0aDtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxpbmtzVG9JZ25vcmUuY29udGFpbnMobGluayk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2hlY2tEaXJlY3RvcnkoKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5zID0gdGhpcy5kaXJlY3Rvcmllc1RvSWdub3JlLmZpbmQoKHZhbHVlKSA9PiB0aGlzLmZpbGVQYXRoLnN0YXJ0c1dpdGgodmFsdWUpICYmIHZhbHVlLmxlbmd0aCAhPSAwKSAhPT0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAodGhpcy5pZ25vcmVEaXJlY3Rvcmllcykge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuICFjb250YWlucztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaXNGaWxlVG9JZ25vcmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbGVzVG9JZ25vcmUuY29udGFpbnModGhpcy5maWxlUGF0aCk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzVmFsaWQoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5oYXNUYWdzVG9JZ25vcmUoKSAmJiAhdGhpcy5oYXNMaW5rc1RvSWdub3JlKCkgJiYgIXRoaXMuY2hlY2tEaXJlY3RvcnkoKSAmJiAhdGhpcy5pc0ZpbGVUb0lnbm9yZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdyaXRlcyB0aGUgdGV4dCB0byB0aGUgZmlsZSBhbmQgb3BlbnMgdGhlIGZpbGUgaW4gYSBuZXcgcGFuZSBpZiBpdCBpcyBub3Qgb3BlbmVkIHlldFxuICAgICAqIEBwYXJhbSBhcHAgXG4gICAgICogQHBhcmFtIG91dHB1dEZpbGVOYW1lIG5hbWUgb2YgdGhlIG91dHB1dCBmaWxlXG4gICAgICogQHBhcmFtIHRleHQgZGF0YSB0byBiZSB3cml0dGVuIHRvIHRoZSBmaWxlXG4gICAgICovXG4gICAgc3RhdGljIGFzeW5jIHdyaXRlQW5kT3BlbkZpbGUoYXBwOiBBcHAsIG91dHB1dEZpbGVOYW1lOiBzdHJpbmcsIHRleHQ6IHN0cmluZykge1xuICAgICAgICBhd2FpdCBhcHAudmF1bHQuYWRhcHRlci53cml0ZShvdXRwdXRGaWxlTmFtZSwgdGV4dCk7XG5cbiAgICAgICAgbGV0IGZpbGVJc0FscmVhZHlPcGVuZWQgPSBmYWxzZTtcbiAgICAgICAgYXBwLndvcmtzcGFjZS5pdGVyYXRlQWxsTGVhdmVzKGxlYWYgPT4ge1xuICAgICAgICAgICAgaWYgKGxlYWYuZ2V0RGlzcGxheVRleHQoKSAhPSBcIlwiICYmIG91dHB1dEZpbGVOYW1lLnN0YXJ0c1dpdGgobGVhZi5nZXREaXNwbGF5VGV4dCgpKSkge1xuICAgICAgICAgICAgICAgIGZpbGVJc0FscmVhZHlPcGVuZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFmaWxlSXNBbHJlYWR5T3BlbmVkKVxuICAgICAgICAgICAgYXBwLndvcmtzcGFjZS5vcGVuTGlua1RleHQob3V0cHV0RmlsZU5hbWUsIFwiL1wiLCB0cnVlKTtcbiAgICB9XG59IiwiaW1wb3J0IHsgZ2V0TGlua3BhdGgsIGl0ZXJhdGVDYWNoZVJlZnMsIE5vdGljZSwgUGx1Z2luLCBURmlsZSB9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IHsgRGVsZXRlRmlsZXNNb2RhbCB9IGZyb20gJy4vZGVsZXRlRmlsZXNNb2RhbCc7XHJcbmltcG9ydCB7IFNldHRpbmdzVGFiIH0gZnJvbSAnLi9zZXR0aW5nc1RhYic7XHJcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi91dGlscyc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNldHRpbmdzIHtcclxuXHRvdXRwdXRGaWxlTmFtZTogc3RyaW5nO1xyXG5cdGRpc2FibGVXb3JraW5nTGlua3M6IGJvb2xlYW47XHJcblx0ZGlyZWN0b3JpZXNUb0lnbm9yZTogc3RyaW5nW107XHJcblx0ZmlsZXNUb0lnbm9yZTogc3RyaW5nW107XHJcblx0ZmlsZVR5cGVzVG9JZ25vcmU6IHN0cmluZ1tdO1xyXG5cdGxpbmtzVG9JZ25vcmU6IHN0cmluZ1tdO1xyXG5cdHRhZ3NUb0lnbm9yZTogc3RyaW5nW107XHJcblx0ZmlsZVR5cGVzVG9EZWxldGU6IHN0cmluZ1tdO1xyXG5cdGlnbm9yZUZpbGVUeXBlczogYm9vbGVhbjtcclxuXHRpZ25vcmVEaXJlY3RvcmllczogYm9vbGVhbjtcclxuXHR1bnJlc29sdmVkTGlua3NEaXJlY3Rvcmllc1RvSWdub3JlOiBzdHJpbmdbXTtcclxuXHR1bnJlc29sdmVkTGlua3NGaWxlc1RvSWdub3JlOiBzdHJpbmdbXTtcclxuXHR1bnJlc29sdmVkTGlua3NGaWxlVHlwZXNUb0lnbm9yZTogc3RyaW5nW107XHJcblx0dW5yZXNvbHZlZExpbmtzTGlua3NUb0lnbm9yZTogc3RyaW5nW107XHJcblx0dW5yZXNvbHZlZExpbmtzVGFnc1RvSWdub3JlOiBzdHJpbmdbXTtcclxuXHR1bnJlc29sdmVkTGlua3NPdXRwdXRGaWxlTmFtZTogc3RyaW5nO1xyXG59XHJcbmNvbnN0IERFRkFVTFRfU0VUVElOR1M6IFNldHRpbmdzID0ge1xyXG5cdG91dHB1dEZpbGVOYW1lOiBcInVubGlua2VkIGZpbGVzIG91dHB1dFwiLFxyXG5cdGRpc2FibGVXb3JraW5nTGlua3M6IGZhbHNlLFxyXG5cdGRpcmVjdG9yaWVzVG9JZ25vcmU6IFtdLFxyXG5cdGZpbGVzVG9JZ25vcmU6IFtdLFxyXG5cdGZpbGVUeXBlc1RvSWdub3JlOiBbXSxcclxuXHRsaW5rc1RvSWdub3JlOiBbXSxcclxuXHR0YWdzVG9JZ25vcmU6IFtdLFxyXG5cdGZpbGVUeXBlc1RvRGVsZXRlOiBbXSxcclxuXHRpZ25vcmVGaWxlVHlwZXM6IHRydWUsXHJcblx0aWdub3JlRGlyZWN0b3JpZXM6IHRydWUsXHJcblx0dW5yZXNvbHZlZExpbmtzT3V0cHV0RmlsZU5hbWU6IFwidW5yZXNvbHZlZCBsaW5rcyBvdXRwdXRcIixcclxuXHR1bnJlc29sdmVkTGlua3NEaXJlY3Rvcmllc1RvSWdub3JlOiBbXSxcclxuXHR1bnJlc29sdmVkTGlua3NGaWxlc1RvSWdub3JlOiBbXSxcclxuXHR1bnJlc29sdmVkTGlua3NGaWxlVHlwZXNUb0lnbm9yZTogW10sXHJcblx0dW5yZXNvbHZlZExpbmtzTGlua3NUb0lnbm9yZTogW10sXHJcblx0dW5yZXNvbHZlZExpbmtzVGFnc1RvSWdub3JlOiBbXSxcclxufTtcclxuaW50ZXJmYWNlIFVucmVzb2x2ZWRMaW5rIHtcclxuXHRsaW5rOiBzdHJpbmc7XHJcblx0ZmlsZXM6IHN0cmluZ1tdO1xyXG59XHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZpbmRVbmxpbmtlZEZpbGVzUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcclxuXHRzZXR0aW5nczogU2V0dGluZ3M7XHJcblx0YXN5bmMgb25sb2FkKCkge1xyXG5cdFx0Y29uc29sZS5sb2coJ2xvYWRpbmcgJyArIHRoaXMubWFuaWZlc3QubmFtZSArIFwiIHBsdWdpblwiKTtcclxuXHRcdGF3YWl0IHRoaXMubG9hZFNldHRpbmdzKCk7XHJcblx0XHR0aGlzLmFkZENvbW1hbmQoe1xyXG5cdFx0XHRpZDogJ2ZpbmQtdW5saW5rZWQtZmlsZXMnLFxyXG5cdFx0XHRuYW1lOiAnRmluZCB1bmxpbmtlZCBmaWxlcycsXHJcblx0XHRcdGNhbGxiYWNrOiAoKSA9PiB0aGlzLmZpbmRVbmxpbmtlZEZpbGVzKCksXHJcblx0XHR9KTtcclxuXHRcdHRoaXMuYWRkQ29tbWFuZCh7XHJcblx0XHRcdGlkOiAnZmluZC11bnJlc29sdmVkLWxpbmsnLFxyXG5cdFx0XHRuYW1lOiAnRmluZCB1bnJlc29sdmVkIGxpbmtzJyxcclxuXHRcdFx0Y2FsbGJhY2s6ICgpID0+IHRoaXMuZmluZFVucmVzb2x2ZWRMaW5rcygpLFxyXG5cdFx0fSk7XHJcblx0XHR0aGlzLmFkZENvbW1hbmQoe1xyXG5cdFx0XHRpZDogXCJkZWxldGUtdW5saW5rZWQtZmlsZXNcIixcclxuXHRcdFx0bmFtZTogXCJEZWxldGUgdW5saW5rZWQgZmlsZXMgd2l0aCBjZXJ0YWluIGV4dGVuc2lvbi4gU2VlIFJFQURNRVwiLFxyXG5cdFx0XHRjYWxsYmFjazogKCkgPT4gdGhpcy5kZWxldGVVbmxpbmtlZEZpbGVzKClcclxuXHRcdH0pO1xyXG5cdFx0dGhpcy5hZGRTZXR0aW5nVGFiKG5ldyBTZXR0aW5nc1RhYih0aGlzLmFwcCwgdGhpcywgREVGQVVMVF9TRVRUSU5HUykpO1xyXG5cdH1cclxuXHRmaW5kVW5saW5rZWRGaWxlcygpIHtcclxuXHRcdGNvbnN0IG91dEZpbGVOYW1lID0gdGhpcy5zZXR0aW5ncy5vdXRwdXRGaWxlTmFtZSArIFwiLm1kXCI7XHJcblx0XHRsZXQgb3V0RmlsZTogVEZpbGU7XHJcblx0XHRjb25zdCBmaWxlcyA9IHRoaXMuYXBwLnZhdWx0LmdldEZpbGVzKCk7XHJcblx0XHRjb25zdCBtYXJrZG93bkZpbGVzID0gdGhpcy5hcHAudmF1bHQuZ2V0TWFya2Rvd25GaWxlcygpO1xyXG5cdFx0bGV0IGxpbmtzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuXHRcdG1hcmtkb3duRmlsZXMuZm9yRWFjaCgobWFya0ZpbGU6IFRGaWxlKSA9PiB7XHJcblx0XHRcdGlmIChtYXJrRmlsZS5wYXRoID09IG91dEZpbGVOYW1lKSB7XHJcblx0XHRcdFx0b3V0RmlsZSA9IG1hcmtGaWxlO1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fSBpdGVyYXRlQ2FjaGVSZWZzKHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKG1hcmtGaWxlKSwgY2IgPT4ge1xyXG5cdFx0XHRcdGxldCB0eHQgPSB0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KGdldExpbmtwYXRoKGNiLmxpbmspLCBtYXJrRmlsZS5wYXRoKTtcclxuXHRcdFx0XHRpZiAodHh0ICE9IG51bGwpXHJcblx0XHRcdFx0XHRsaW5rcy5wdXNoKHR4dC5wYXRoKTtcclxuXHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHRcdGNvbnN0IG5vdExpbmtlZEZpbGVzID0gZmlsZXMuZmlsdGVyKChmaWxlKSA9PiB0aGlzLmlzVmFsaWQoZmlsZSwgbGlua3MpKTtcclxuXHRcdG5vdExpbmtlZEZpbGVzLnJlbW92ZShvdXRGaWxlKTtcclxuXHJcblxyXG5cdFx0bGV0IHRleHQgPSBcIlwiO1xyXG5cdFx0bGV0IHByZWZpeDogc3RyaW5nO1xyXG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MuZGlzYWJsZVdvcmtpbmdMaW5rcylcclxuXHRcdFx0cHJlZml4ID0gXCJcdFwiO1xyXG5cdFx0ZWxzZVxyXG5cdFx0XHRwcmVmaXggPSBcIlwiO1xyXG5cdFx0bm90TGlua2VkRmlsZXMuZm9yRWFjaCgoZmlsZSkgPT4ge1xyXG5cdFx0XHR0ZXh0ICs9IHByZWZpeCArIFwiLSBbW1wiICsgdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5maWxlVG9MaW5rdGV4dChmaWxlLCBcIi9cIikgKyBcIl1dXFxuXCI7XHJcblx0XHR9KTtcclxuXHRcdFV0aWxzLndyaXRlQW5kT3BlbkZpbGUodGhpcy5hcHAsIG91dEZpbGVOYW1lLCB0ZXh0KTtcclxuXHJcblx0fVxyXG5cdGFzeW5jIGRlbGV0ZVVubGlua2VkRmlsZXMoKSB7XHJcblx0XHRpZiAoIWF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIuZXhpc3RzKHRoaXMuc2V0dGluZ3Mub3V0cHV0RmlsZU5hbWUgKyBcIi5tZFwiKSkge1xyXG5cdFx0XHRuZXcgTm90aWNlKFwiQ2FuJ3QgZmluZCBmaWxlIC0gUGxlYXNlIHJ1biB0aGUgYEZpbmQgdW5saW5rZWQgZmlsZXMnIGNvbW1hbmQgYmVmb3JlXCIpO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHRjb25zdCBsaW5rcyA9IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Q2FjaGUodGhpcy5zZXR0aW5ncy5vdXRwdXRGaWxlTmFtZSArIFwiLm1kXCIpPy5saW5rcyA/PyBbXTtcclxuXHRcdGNvbnN0IGZpbGVzVG9EZWxldGU6IFRGaWxlW10gPSBbXTtcclxuXHRcdGxpbmtzLmZvckVhY2goKGxpbmspID0+IHtcclxuXHRcdFx0Y29uc3QgZmlsZSA9IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QobGluay5saW5rLCBcIi9cIik7XHJcblx0XHRcdGlmICghZmlsZSlcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdGlmICh0aGlzLnNldHRpbmdzLmZpbGVUeXBlc1RvRGVsZXRlLmNvbnRhaW5zKGZpbGUuZXh0ZW5zaW9uKSkge1xyXG5cdFx0XHRcdGZpbGVzVG9EZWxldGUucHVzaChmaWxlKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0XHRpZiAoZmlsZXNUb0RlbGV0ZS5sZW5ndGggPiAwKVxyXG5cdFx0XHRuZXcgRGVsZXRlRmlsZXNNb2RhbCh0aGlzLmFwcCwgZmlsZXNUb0RlbGV0ZSkub3BlbigpO1xyXG5cdH1cclxuXHRmaW5kVW5yZXNvbHZlZExpbmtzKCkge1xyXG5cdFx0Y29uc3Qgb3V0RmlsZU5hbWUgPSB0aGlzLnNldHRpbmdzLnVucmVzb2x2ZWRMaW5rc091dHB1dEZpbGVOYW1lICsgXCIubWRcIjtcclxuXHRcdGNvbnN0IGxpbmtzOiBVbnJlc29sdmVkTGlua1tdID0gW107XHJcblx0XHRjb25zdCB1bnJlc29sdmVkTGlua3MgPSB0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLnVucmVzb2x2ZWRMaW5rcztcclxuXHJcblx0XHRmb3IgKGxldCBmaWxlUGF0aCBpbiB1bnJlc29sdmVkTGlua3MpIHtcclxuXHRcdFx0aWYgKGZpbGVQYXRoID09IHRoaXMuc2V0dGluZ3MudW5yZXNvbHZlZExpbmtzT3V0cHV0RmlsZU5hbWUgKyBcIi5tZFwiKSBjb250aW51ZTtcclxuXHJcblx0XHRcdGNvbnN0IGZpbGVUeXBlID0gZmlsZVBhdGguc3Vic3RyaW5nKGZpbGVQYXRoLmxhc3RJbmRleE9mKFwiLlwiKSArIDEpO1xyXG5cclxuXHRcdFx0Y29uc3QgdXRpbHMgPSBuZXcgVXRpbHMoXHJcblx0XHRcdFx0dGhpcy5hcHAsXHJcblx0XHRcdFx0ZmlsZVBhdGgsXHJcblx0XHRcdFx0dGhpcy5zZXR0aW5ncy51bnJlc29sdmVkTGlua3NUYWdzVG9JZ25vcmUsXHJcblx0XHRcdFx0dGhpcy5zZXR0aW5ncy51bnJlc29sdmVkTGlua3NMaW5rc1RvSWdub3JlLFxyXG5cdFx0XHRcdHRoaXMuc2V0dGluZ3MudW5yZXNvbHZlZExpbmtzRGlyZWN0b3JpZXNUb0lnbm9yZSxcclxuXHRcdFx0XHR0aGlzLnNldHRpbmdzLnVucmVzb2x2ZWRMaW5rc0ZpbGVzVG9JZ25vcmVcclxuXHRcdFx0KTtcclxuXHRcdFx0aWYgKCF1dGlscy5pc1ZhbGlkKCkpIGNvbnRpbnVlO1xyXG5cclxuXHRcdFx0Zm9yIChjb25zdCBsaW5rIGluIHVucmVzb2x2ZWRMaW5rc1tmaWxlUGF0aF0pIHtcclxuXHRcdFx0XHRjb25zdCBsaW5rRmlsZVR5cGUgPSBsaW5rLnN1YnN0cmluZyhsaW5rLmxhc3RJbmRleE9mKFwiLlwiKSArIDEpO1xyXG5cdFx0XHRcdGNvbnNvbGUubG9nKGxpbmtGaWxlVHlwZSk7XHJcblxyXG5cdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLnVucmVzb2x2ZWRMaW5rc0ZpbGVUeXBlc1RvSWdub3JlLmNvbnRhaW5zKGxpbmtGaWxlVHlwZSkpIGNvbnRpbnVlO1xyXG5cclxuXHRcdFx0XHRsZXQgZm9ybWF0dGVkRmlsZVBhdGggPSBmaWxlUGF0aDtcclxuXHRcdFx0XHRpZiAoZmlsZVR5cGUgPT0gXCJtZFwiKSB7XHJcblx0XHRcdFx0XHRmb3JtYXR0ZWRGaWxlUGF0aCA9IGZpbGVQYXRoLnN1YnN0cmluZygwLCBmaWxlUGF0aC5sYXN0SW5kZXhPZihcIi5tZFwiKSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGNvbnN0IHVucmVzb2x2ZWRMaW5rOiBVbnJlc29sdmVkTGluayA9IHsgZmlsZXM6IFtmb3JtYXR0ZWRGaWxlUGF0aF0sIGxpbms6IGxpbmsgfTtcclxuXHRcdFx0XHRpZiAobGlua3MuY29udGFpbnModW5yZXNvbHZlZExpbmspKVxyXG5cdFx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdFx0Y29uc3QgZHVwbGljYXRpb24gPSBsaW5rcy5maW5kKChlKSA9PiBlLmxpbmsgPT0gbGluayk7XHJcblx0XHRcdFx0aWYgKGR1cGxpY2F0aW9uKSB7XHJcblx0XHRcdFx0XHRkdXBsaWNhdGlvbi5maWxlcy5wdXNoKGZvcm1hdHRlZEZpbGVQYXRoKTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0bGlua3MucHVzaCh1bnJlc29sdmVkTGluayk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRVdGlscy53cml0ZUFuZE9wZW5GaWxlKFxyXG5cdFx0XHR0aGlzLmFwcCxcclxuXHRcdFx0b3V0RmlsZU5hbWUsXHJcblx0XHRcdFtcclxuXHRcdFx0XHRcIkRvbid0IGZvcmdldCB0aGF0IGNyZWF0aW5nIHRoZSBmaWxlIGZyb20gaGVyZSBtYXkgY3JlYXRlIHRoZSBmaWxlIGluIHRoZSB3cm9uZyBkaXJlY3RvcnkhXCIsXHJcblx0XHRcdFx0Li4ubGlua3MubWFwKChlKSA9PiBgLSBbWyR7ZS5saW5rfV1dIGluIFtbJHtlLmZpbGVzLmpvaW4oXCJdXSwgW1tcIil9XV1gKVxyXG5cdFx0XHRdLmpvaW4oXCJcXG5cIikpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gZmlsZSBpbiBhbiB1bmxpbmtlZCBmaWxlXHJcblx0ICogXHJcblx0ICogQHBhcmFtIGZpbGUgZmlsZSB0byBjaGVja1xyXG5cdCAqIEBwYXJhbSBsaW5rcyBhbGwgbGlua3MgaW4gdGhlIHZhdWx0XHJcblx0ICovXHJcblx0aXNWYWxpZChmaWxlOiBURmlsZSwgbGlua3M6IHN0cmluZ1tdKTogYm9vbGVhbiB7XHJcblx0XHRpZiAobGlua3MuY29udGFpbnMoZmlsZS5wYXRoKSlcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cclxuXHRcdC8vZmlsZXR5cGVzIHRvIGlnbm9yZSBieSBkZWZhdWx0XHJcblx0XHRpZiAoZmlsZS5leHRlbnNpb24gPT0gXCJjc3NcIilcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cclxuXHRcdGlmICh0aGlzLnNldHRpbmdzLmZpbGVUeXBlc1RvSWdub3JlWzBdICE9PSBcIlwiKSB7XHJcblx0XHRcdGNvbnN0IGNvbnRhaW5zRmlsZVR5cGUgPSB0aGlzLnNldHRpbmdzLmZpbGVUeXBlc1RvSWdub3JlLmNvbnRhaW5zKGZpbGUuZXh0ZW5zaW9uKTtcclxuXHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuaWdub3JlRmlsZVR5cGVzKSB7XHJcblx0XHRcdFx0aWYgKGNvbnRhaW5zRmlsZVR5cGUpIHJldHVybjtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRpZiAoIWNvbnRhaW5zRmlsZVR5cGUpIHJldHVybjtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHV0aWxzID0gbmV3IFV0aWxzKFxyXG5cdFx0XHR0aGlzLmFwcCxcclxuXHRcdFx0ZmlsZS5wYXRoLFxyXG5cdFx0XHR0aGlzLnNldHRpbmdzLnRhZ3NUb0lnbm9yZSxcclxuXHRcdFx0dGhpcy5zZXR0aW5ncy5saW5rc1RvSWdub3JlLFxyXG5cdFx0XHR0aGlzLnNldHRpbmdzLmRpcmVjdG9yaWVzVG9JZ25vcmUsXHJcblx0XHRcdHRoaXMuc2V0dGluZ3MuZmlsZXNUb0lnbm9yZSxcclxuXHRcdFx0dGhpcy5zZXR0aW5ncy5pZ25vcmVEaXJlY3Rvcmllc1xyXG5cdFx0KTtcclxuXHRcdGlmICghdXRpbHMuaXNWYWxpZCgpKVxyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdFx0cmV0dXJuIHRydWU7XHJcblx0fVxyXG5cclxuXHJcblxyXG5cdG9udW5sb2FkKCkge1xyXG5cdFx0Y29uc29sZS5sb2coJ3VubG9hZGluZyAnICsgdGhpcy5tYW5pZmVzdC5uYW1lICsgXCIgcGx1Z2luXCIpO1xyXG5cdH1cclxuXHRhc3luYyBsb2FkU2V0dGluZ3MoKSB7XHJcblx0XHR0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbihERUZBVUxUX1NFVFRJTkdTLCBhd2FpdCB0aGlzLmxvYWREYXRhKCkpO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgc2F2ZVNldHRpbmdzKCkge1xyXG5cdFx0YXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKTtcclxuXHR9XHJcbn1cclxuIl0sIm5hbWVzIjpbIk1vZGFsIiwibm9ybWFsaXplUGF0aCIsIlNldHRpbmciLCJQbHVnaW5TZXR0aW5nVGFiIiwiZ2V0QWxsVGFncyIsIml0ZXJhdGVDYWNoZVJlZnMiLCJnZXRMaW5rcGF0aCIsIk5vdGljZSIsIlBsdWdpbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxhQUFhLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ25DLElBQUksYUFBYSxHQUFHLE1BQU0sQ0FBQyxjQUFjO0FBQ3pDLFNBQVMsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLFlBQVksS0FBSyxJQUFJLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNwRixRQUFRLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUMxRyxJQUFJLE9BQU8sYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMvQixDQUFDLENBQUM7QUFDRjtBQUNPLFNBQVMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDaEMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxLQUFLLFVBQVUsSUFBSSxDQUFDLEtBQUssSUFBSTtBQUM3QyxRQUFRLE1BQU0sSUFBSSxTQUFTLENBQUMsc0JBQXNCLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLCtCQUErQixDQUFDLENBQUM7QUFDbEcsSUFBSSxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLElBQUksU0FBUyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxFQUFFO0FBQzNDLElBQUksQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLEtBQUssSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztBQUN6RixDQUFDO0FBdUNEO0FBQ08sU0FBUyxTQUFTLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFO0FBQzdELElBQUksU0FBUyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxLQUFLLFlBQVksQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxVQUFVLE9BQU8sRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFO0FBQ2hILElBQUksT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDLEVBQUUsVUFBVSxPQUFPLEVBQUUsTUFBTSxFQUFFO0FBQy9ELFFBQVEsU0FBUyxTQUFTLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtBQUNuRyxRQUFRLFNBQVMsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtBQUN0RyxRQUFRLFNBQVMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRTtBQUN0SCxRQUFRLElBQUksQ0FBQyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxVQUFVLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUM5RSxLQUFLLENBQUMsQ0FBQztBQUNQLENBQUM7QUFDRDtBQUNPLFNBQVMsV0FBVyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUU7QUFDM0MsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3JILElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLE9BQU8sTUFBTSxLQUFLLFVBQVUsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLFdBQVcsRUFBRSxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDN0osSUFBSSxTQUFTLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLFVBQVUsQ0FBQyxFQUFFLEVBQUUsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUN0RSxJQUFJLFNBQVMsSUFBSSxDQUFDLEVBQUUsRUFBRTtBQUN0QixRQUFRLElBQUksQ0FBQyxFQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsaUNBQWlDLENBQUMsQ0FBQztBQUN0RSxRQUFRLE9BQU8sQ0FBQyxFQUFFLElBQUk7QUFDdEIsWUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN6SyxZQUFZLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDcEQsWUFBWSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDekIsZ0JBQWdCLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLE1BQU07QUFDOUMsZ0JBQWdCLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUN4RSxnQkFBZ0IsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztBQUNqRSxnQkFBZ0IsS0FBSyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsU0FBUztBQUNqRSxnQkFBZ0I7QUFDaEIsb0JBQW9CLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUU7QUFDaEksb0JBQW9CLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUU7QUFDMUcsb0JBQW9CLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRTtBQUN6RixvQkFBb0IsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVB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 diff --git a/.obsidian/plugins/find-unlinked-files/manifest.json b/.obsidian/plugins/find-unlinked-files/manifest.json deleted file mode 100644 index 570abd086..000000000 --- a/.obsidian/plugins/find-unlinked-files/manifest.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "id": "find-unlinked-files", - "name": "Find unlinked files and unresolved links", - "version": "1.2.1", - "description": "Find files that are not linked anywhere and would otherwise be lost in your vault. In other words: files with no backlinks.", - "author": "Vinzent", - "authorUrl": "https://github.com/Vinzent03", - "isDesktopOnly": false -} \ No newline at end of file diff --git a/.obsidian/plugins/hotkeysplus-obsidian/main.js b/.obsidian/plugins/hotkeysplus-obsidian/main.js deleted file mode 100644 index dce3de3ed..000000000 --- a/.obsidian/plugins/hotkeysplus-obsidian/main.js +++ /dev/null @@ -1,256 +0,0 @@ -'use strict'; - -var obsidian = require('obsidian'); - -/*! ***************************************************************************** -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -***************************************************************************** */ -/* global Reflect, Promise */ - -var extendStatics = function(d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); -}; - -function __extends(d, b) { - if (typeof b !== "function" && b !== null) - throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -} - -var HotkeysPlus = /** @class */ (function (_super) { - __extends(HotkeysPlus, _super); - function HotkeysPlus() { - return _super !== null && _super.apply(this, arguments) || this; - } - HotkeysPlus.prototype.onInit = function () { }; - HotkeysPlus.prototype.onload = function () { - var _this = this; - console.log("Loading Hotkeys++ plugin"); - this.addCommand({ - id: "better-toggle-todo", - name: "Toggle to-do lists", - callback: function () { return _this.toggleTodos(); }, - hotkeys: [ - { - modifiers: ["Mod"], - key: "m", - }, - ], - }); - this.addCommand({ - id: "toggle-bullet-number", - name: "Toggle line to bulleted or numbered lists", - callback: function () { return _this.toggleLists(); }, - hotkeys: [ - { - modifiers: ["Mod", "Shift"], - key: "m", - }, - ], - }); - this.addCommand({ - id: "toggle-block-quote", - name: "Toggle line to block quote", - callback: function () { return _this.toggleBlockQuote(); }, - hotkeys: [ - { - modifiers: ["Mod"], - key: "<", - }, - ], - }); - this.addCommand({ - id: "toggle-embed", - name: "Toggle line to embed internal links", - callback: function () { return _this.toggleEmbed(); }, - hotkeys: [ - { - modifiers: ["Mod", "Shift"], - key: "1", - }, - ], - }); - this.addCommand({ - id: "duplicate-lines", - name: "Duplicate the current line or selected lines", - callback: function () { return _this.duplicateLines(); }, - }); - this.addCommand({ - id: 'insert-line-above', - name: 'Insert line above current line', - callback: function () { return _this.insertLine("above"); }, - }); - this.addCommand({ - id: 'insert-line-below', - name: 'Insert line below current line', - callback: function () { return _this.insertLine("below"); }, - }); - }; - HotkeysPlus.prototype.insertLine = function (mode) { - var view = this.app.workspace.activeLeaf.view; - var editor = view.sourceMode.cmEditor; - var lineNumber = editor.getCursor().line; - var currentLineText = editor.getLine(lineNumber); - var newLineText = ""; - if (currentLineText.trim().startsWith("- ")) { - newLineText = currentLineText.substring(0, currentLineText.indexOf("- ") + 2); - } - for (var i = 1; i < 30; i++) { - if (currentLineText.trim().startsWith(i.toString() + ". ")) { - var correction = void 0; - if (mode == "above") - correction = -1; - else - correction = 1; - newLineText = currentLineText.substring(0, currentLineText.indexOf(i.toString() + ". ")) + (i + correction).toString() + ". "; - } - } - if (mode == "above") { - editor.replaceRange(newLineText + "\n", { line: lineNumber, ch: 0 }); - editor.setCursor({ line: lineNumber, ch: newLineText.length }); - } - else { - editor.replaceRange("\n" + newLineText, { line: lineNumber, ch: currentLineText.length }); - editor.setCursor({ line: lineNumber + 1, ch: newLineText.length }); - } - }; - HotkeysPlus.prototype.duplicateLines = function () { - var activeLeaf = this.app.workspace.activeLeaf; - var editor = activeLeaf.view.sourceMode.cmEditor; - var selectedText = this.getSelectedText(editor); - var newString = selectedText.content + "\n"; - editor.replaceRange(newString, selectedText.start, selectedText.start); - }; - HotkeysPlus.prototype.onunload = function () { - console.log("Unloading Hotkeys++ plugin"); - }; - HotkeysPlus.prototype.getSelectedText = function (editor) { - if (editor.somethingSelected()) { - // Toggle to-dos under the selection - var cursorStart = editor.getCursor(true); - var cursorEnd = editor.getCursor(false); - var content = editor.getRange({ line: cursorStart.line, ch: 0 }, { line: cursorEnd.line, ch: editor.getLine(cursorEnd.line).length }); - return { - start: { line: cursorStart.line, ch: 0 }, - end: { - line: cursorEnd.line, - ch: editor.getLine(cursorEnd.line).length, - }, - content: content, - }; - } - else { - // Toggle the todo in the line - var lineNr = editor.getCursor().line; - var contents = editor.getDoc().getLine(lineNr); - var cursorStart = { - line: lineNr, - ch: 0, - }; - var cursorEnd = { - line: lineNr, - ch: contents.length, - }; - var content = editor.getRange(cursorStart, cursorEnd); - return { start: cursorStart, end: cursorEnd, content: content }; - } - }; - HotkeysPlus.prototype.toggleElement = function (re, subst) { - var activeLeaf = this.app.workspace.activeLeaf; - var editor = activeLeaf.view.sourceMode.cmEditor; - var selection = editor.somethingSelected(); - var selectedText = this.getSelectedText(editor); - var newString = selectedText.content.replace(re, subst); - editor.replaceRange(newString, selectedText.start, selectedText.end); - // Keep cursor in the same place - if (selection) { - editor.setSelection(selectedText.start, { - line: selectedText.end.line, - ch: editor.getLine(selectedText.end.line).length, - }); - } - }; - HotkeysPlus.prototype.toggleTodos = function () { - var re = /(^\s*|^\t*)(-\s\[ \]\s|-\s\[x\]\s|\*\s|-\s|\d*\.\s|\*\s|\b|^)([^\n\r]*)/gim; - return this.toggleElement(re, this.replaceTodoElement); - }; - HotkeysPlus.prototype.toggleLists = function () { - var re = /(^\s*|^\t*)(-\s\[ \]\s|-\s\[x\]\s|\*\s|-\s|\d*\.\s|\*\s|\b|^)([^\n\r]*)/gim; - return this.toggleElement(re, this.replaceListElement); - }; - HotkeysPlus.prototype.toggleBlockQuote = function () { - var re = />\s|^/gim; - return this.toggleElement(re, this.replaceBlockQuote); - }; - HotkeysPlus.prototype.toggleEmbed = function () { - var re = /\S*\[\[/gim; - return this.toggleElement(re, this.replaceEmbed); - }; - HotkeysPlus.prototype.replaceListElement = function (match, spaces, startText, sentence) { - if (startText === "- ") { - return spaces + "1. " + sentence; - } - else if (startText === "") { - return spaces + "- " + sentence; - } - else if (startText === "1. ") { - return spaces + "" + sentence; - } - else { - return spaces + "- " + sentence; - } - }; - HotkeysPlus.prototype.replaceBlockQuote = function (startText) { - if (startText === "> ") { - return ""; - } - else if (startText === "") { - return "> "; - } - else { - return "> "; - } - }; - HotkeysPlus.prototype.replaceEmbed = function (startText) { - if (startText === "![[") { - return "[["; - } - else if (startText === "[[") { - return "![["; - } - else { - return ""; - } - }; - HotkeysPlus.prototype.replaceTodoElement = function (match, spaces, startText, sentence) { - if (startText === "- [ ] ") { - return spaces + "- [x] " + sentence; - } - else if (startText === "- [x] ") { - return spaces + "- " + sentence; - } - else { - return spaces + "- [ ] " + sentence; - } - }; - return HotkeysPlus; -}(obsidian.Plugin)); - -module.exports = HotkeysPlus; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIm1haW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XHJcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH1cclxuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcclxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgICAgIH1cclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcclxuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcclxuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XHJcbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcclxufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBvW2syXSA9IG1ba107XHJcbn0pO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBvKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XHJcbiAgICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcclxuICAgIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcclxuICAgICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcclxuICAgICAgICAgICAgcltrXSA9IGFbal07XHJcbiAgICByZXR1cm4gcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20pIHtcclxuICAgIGZvciAodmFyIGkgPSAwLCBpbCA9IGZyb20ubGVuZ3RoLCBqID0gdG8ubGVuZ3RoOyBpIDwgaWw7IGkrKywgaisrKVxyXG4gICAgICAgIHRvW2pdID0gZnJvbVtpXTtcclxuICAgIHJldHVybiB0bztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxyXG4gICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XHJcbiAgICB2YXIgaSwgcDtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBuID09PSBcInJldHVyblwiIH0gOiBmID8gZih2KSA6IHY7IH0gOiBmOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcclxuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XHJcbiAgICByZXR1cm4gY29va2VkO1xyXG59O1xyXG5cclxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xyXG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XHJcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xyXG4gICAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xyXG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XHJcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IGRlZmF1bHQ6IG1vZCB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgcHJpdmF0ZU1hcCkge1xyXG4gICAgaWYgKCFwcml2YXRlTWFwLmhhcyhyZWNlaXZlcikpIHtcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXR0ZW1wdGVkIHRvIGdldCBwcml2YXRlIGZpZWxkIG9uIG5vbi1pbnN0YW5jZVwiKTtcclxuICAgIH1cclxuICAgIHJldHVybiBwcml2YXRlTWFwLmdldChyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBwcml2YXRlTWFwLCB2YWx1ZSkge1xyXG4gICAgaWYgKCFwcml2YXRlTWFwLmhhcyhyZWNlaXZlcikpIHtcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXR0ZW1wdGVkIHRvIHNldCBwcml2YXRlIGZpZWxkIG9uIG5vbi1pbnN0YW5jZVwiKTtcclxuICAgIH1cclxuICAgIHByaXZhdGVNYXAuc2V0KHJlY2VpdmVyLCB2YWx1ZSk7XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbn1cclxuIiwiaW1wb3J0IHtcclxuICBNYXJrZG93blZpZXcsXHJcbiAgUGx1Z2luXHJcbn0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIb3RrZXlzUGx1cyBleHRlbmRzIFBsdWdpbiB7XHJcbiAgb25Jbml0KCkgeyB9XHJcblxyXG4gIG9ubG9hZCgpIHtcclxuICAgIGNvbnNvbGUubG9nKFwiTG9hZGluZyBIb3RrZXlzKysgcGx1Z2luXCIpO1xyXG5cclxuICAgIHRoaXMuYWRkQ29tbWFuZCh7XHJcbiAgICAgIGlkOiBcImJldHRlci10b2dnbGUtdG9kb1wiLFxyXG4gICAgICBuYW1lOiBcIlRvZ2dsZSB0by1kbyBsaXN0c1wiLFxyXG4gICAgICBjYWxsYmFjazogKCkgPT4gdGhpcy50b2dnbGVUb2RvcygpLFxyXG4gICAgICBob3RrZXlzOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbW9kaWZpZXJzOiBbXCJNb2RcIl0sXHJcbiAgICAgICAgICBrZXk6IFwibVwiLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIF0sXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmFkZENvbW1hbmQoe1xyXG4gICAgICBpZDogXCJ0b2dnbGUtYnVsbGV0LW51bWJlclwiLFxyXG4gICAgICBuYW1lOiBcIlRvZ2dsZSBsaW5lIHRvIGJ1bGxldGVkIG9yIG51bWJlcmVkIGxpc3RzXCIsXHJcbiAgICAgIGNhbGxiYWNrOiAoKSA9PiB0aGlzLnRvZ2dsZUxpc3RzKCksXHJcbiAgICAgIGhvdGtleXM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBtb2RpZmllcnM6IFtcIk1vZFwiLCBcIlNoaWZ0XCJdLFxyXG4gICAgICAgICAga2V5OiBcIm1cIixcclxuICAgICAgICB9LFxyXG4gICAgICBdLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5hZGRDb21tYW5kKHtcclxuICAgICAgaWQ6IFwidG9nZ2xlLWJsb2NrLXF1b3RlXCIsXHJcbiAgICAgIG5hbWU6IFwiVG9nZ2xlIGxpbmUgdG8gYmxvY2sgcXVvdGVcIixcclxuICAgICAgY2FsbGJhY2s6ICgpID0+IHRoaXMudG9nZ2xlQmxvY2tRdW90ZSgpLFxyXG4gICAgICBob3RrZXlzOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbW9kaWZpZXJzOiBbXCJNb2RcIl0sXHJcbiAgICAgICAgICBrZXk6IFwiPFwiLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIF0sXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmFkZENvbW1hbmQoe1xyXG4gICAgICBpZDogXCJ0b2dnbGUtZW1iZWRcIixcclxuICAgICAgbmFtZTogXCJUb2dnbGUgbGluZSB0byBlbWJlZCBpbnRlcm5hbCBsaW5rc1wiLFxyXG4gICAgICBjYWxsYmFjazogKCkgPT4gdGhpcy50b2dnbGVFbWJlZCgpLFxyXG4gICAgICBob3RrZXlzOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbW9kaWZpZXJzOiBbXCJNb2RcIiwgXCJTaGlmdFwiXSxcclxuICAgICAgICAgIGtleTogXCIxXCIsXHJcbiAgICAgICAgfSxcclxuICAgICAgXSxcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuYWRkQ29tbWFuZCh7XHJcbiAgICAgIGlkOiBcImR1cGxpY2F0ZS1saW5lc1wiLFxyXG4gICAgICBuYW1lOiBcIkR1cGxpY2F0ZSB0aGUgY3VycmVudCBsaW5lIG9yIHNlbGVjdGVkIGxpbmVzXCIsXHJcbiAgICAgIGNhbGxiYWNrOiAoKSA9PiB0aGlzLmR1cGxpY2F0ZUxpbmVzKCksXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmFkZENvbW1hbmQoe1xyXG4gICAgICBpZDogJ2luc2VydC1saW5lLWFib3ZlJyxcclxuICAgICAgbmFtZTogJ0luc2VydCBsaW5lIGFib3ZlIGN1cnJlbnQgbGluZScsXHJcbiAgICAgIGNhbGxiYWNrOiAoKSA9PiB0aGlzLmluc2VydExpbmUoXCJhYm92ZVwiKSxcclxuICAgIH0pO1xyXG4gICAgdGhpcy5hZGRDb21tYW5kKHtcclxuICAgICAgaWQ6ICdpbnNlcnQtbGluZS1iZWxvdycsXHJcbiAgICAgIG5hbWU6ICdJbnNlcnQgbGluZSBiZWxvdyBjdXJyZW50IGxpbmUnLFxyXG4gICAgICBjYWxsYmFjazogKCkgPT4gdGhpcy5pbnNlcnRMaW5lKFwiYmVsb3dcIiksXHJcbiAgICB9KTtcclxuICB9XHJcbiAgaW5zZXJ0TGluZShtb2RlOiBcImFib3ZlXCIgfCBcImJlbG93XCIpIHtcclxuICAgIGNvbnN0IHZpZXcgPSB0aGlzLmFwcC53b3Jrc3BhY2UuYWN0aXZlTGVhZi52aWV3IGFzIE1hcmtkb3duVmlldztcclxuICAgIGNvbnN0IGVkaXRvciA9IHZpZXcuc291cmNlTW9kZS5jbUVkaXRvciBhcyBDb2RlTWlycm9yLkVkaXRvcjtcclxuICAgIGNvbnN0IGxpbmVOdW1iZXIgPSBlZGl0b3IuZ2V0Q3Vyc29yKCkubGluZTtcclxuICAgIGNvbnN0IGN1cnJlbnRMaW5lVGV4dCA9IGVkaXRvci5nZXRMaW5lKGxpbmVOdW1iZXIpO1xyXG4gICAgbGV0IG5ld0xpbmVUZXh0ID0gXCJcIjtcclxuICAgIGlmIChjdXJyZW50TGluZVRleHQudHJpbSgpLnN0YXJ0c1dpdGgoXCItIFwiKSkge1xyXG4gICAgICBuZXdMaW5lVGV4dCA9IGN1cnJlbnRMaW5lVGV4dC5zdWJzdHJpbmcoMCwgY3VycmVudExpbmVUZXh0LmluZGV4T2YoXCItIFwiKSArIDIpO1xyXG4gICAgfVxyXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCAzMDsgaSsrKSB7XHJcbiAgICAgIGlmIChjdXJyZW50TGluZVRleHQudHJpbSgpLnN0YXJ0c1dpdGgoaS50b1N0cmluZygpICsgXCIuIFwiKSkge1xyXG4gICAgICAgIGxldCBjb3JyZWN0aW9uOiBudW1iZXI7XHJcbiAgICAgICAgaWYgKG1vZGUgPT0gXCJhYm92ZVwiKVxyXG4gICAgICAgICAgY29ycmVjdGlvbiA9IC0xO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGNvcnJlY3Rpb24gPSAxO1xyXG4gICAgICAgIG5ld0xpbmVUZXh0ID0gY3VycmVudExpbmVUZXh0LnN1YnN0cmluZygwLCBjdXJyZW50TGluZVRleHQuaW5kZXhPZihpLnRvU3RyaW5nKCkgKyBcIi4gXCIpKSArIChpICsgY29ycmVjdGlvbikudG9TdHJpbmcoKSArIFwiLiBcIjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKG1vZGUgPT0gXCJhYm92ZVwiKSB7XHJcbiAgICAgIGVkaXRvci5yZXBsYWNlUmFuZ2UobmV3TGluZVRleHQgKyBcIlxcblwiLCB7IGxpbmU6IGxpbmVOdW1iZXIsIGNoOiAwIH0pO1xyXG4gICAgICBlZGl0b3Iuc2V0Q3Vyc29yKHsgbGluZTogbGluZU51bWJlciwgY2g6IG5ld0xpbmVUZXh0Lmxlbmd0aCB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGVkaXRvci5yZXBsYWNlUmFuZ2UoXCJcXG5cIiArIG5ld0xpbmVUZXh0LCB7IGxpbmU6IGxpbmVOdW1iZXIsIGNoOiBjdXJyZW50TGluZVRleHQubGVuZ3RoIH0pO1xyXG4gICAgICBlZGl0b3Iuc2V0Q3Vyc29yKHsgbGluZTogbGluZU51bWJlciArIDEsIGNoOiBuZXdMaW5lVGV4dC5sZW5ndGggfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkdXBsaWNhdGVMaW5lcygpIHtcclxuICAgIHZhciBhY3RpdmVMZWFmOiBhbnkgPSB0aGlzLmFwcC53b3Jrc3BhY2UuYWN0aXZlTGVhZjtcclxuICAgIHZhciBlZGl0b3IgPSBhY3RpdmVMZWFmLnZpZXcuc291cmNlTW9kZS5jbUVkaXRvcjtcclxuICAgIHZhciBzZWxlY3RlZFRleHQgPSB0aGlzLmdldFNlbGVjdGVkVGV4dChlZGl0b3IpO1xyXG4gICAgdmFyIG5ld1N0cmluZyA9IHNlbGVjdGVkVGV4dC5jb250ZW50ICsgXCJcXG5cIjtcclxuICAgIGVkaXRvci5yZXBsYWNlUmFuZ2UobmV3U3RyaW5nLCBzZWxlY3RlZFRleHQuc3RhcnQsIHNlbGVjdGVkVGV4dC5zdGFydCk7XHJcbiAgfVxyXG5cclxuICBvbnVubG9hZCgpIHtcclxuICAgIGNvbnNvbGUubG9nKFwiVW5sb2FkaW5nIEhvdGtleXMrKyBwbHVnaW5cIik7XHJcbiAgfVxyXG5cclxuICBnZXRTZWxlY3RlZFRleHQoZWRpdG9yOiBhbnkpIHtcclxuICAgIGlmIChlZGl0b3Iuc29tZXRoaW5nU2VsZWN0ZWQoKSkge1xyXG4gICAgICAvLyBUb2dnbGUgdG8tZG9zIHVuZGVyIHRoZSBzZWxlY3Rpb25cclxuICAgICAgbGV0IGN1cnNvclN0YXJ0ID0gZWRpdG9yLmdldEN1cnNvcih0cnVlKTtcclxuICAgICAgbGV0IGN1cnNvckVuZCA9IGVkaXRvci5nZXRDdXJzb3IoZmFsc2UpO1xyXG4gICAgICBsZXQgY29udGVudCA9IGVkaXRvci5nZXRSYW5nZShcclxuICAgICAgICB7IGxpbmU6IGN1cnNvclN0YXJ0LmxpbmUsIGNoOiAwIH0sXHJcbiAgICAgICAgeyBsaW5lOiBjdXJzb3JFbmQubGluZSwgY2g6IGVkaXRvci5nZXRMaW5lKGN1cnNvckVuZC5saW5lKS5sZW5ndGggfVxyXG4gICAgICApO1xyXG5cclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBzdGFydDogeyBsaW5lOiBjdXJzb3JTdGFydC5saW5lLCBjaDogMCB9LFxyXG4gICAgICAgIGVuZDoge1xyXG4gICAgICAgICAgbGluZTogY3Vyc29yRW5kLmxpbmUsXHJcbiAgICAgICAgICBjaDogZWRpdG9yLmdldExpbmUoY3Vyc29yRW5kLmxpbmUpLmxlbmd0aCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQsXHJcbiAgICAgIH07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBUb2dnbGUgdGhlIHRvZG8gaW4gdGhlIGxpbmVcclxuICAgICAgdmFyIGxpbmVOciA9IGVkaXRvci5nZXRDdXJzb3IoKS5saW5lO1xyXG4gICAgICB2YXIgY29udGVudHMgPSBlZGl0b3IuZ2V0RG9jKCkuZ2V0TGluZShsaW5lTnIpO1xyXG4gICAgICBsZXQgY3Vyc29yU3RhcnQgPSB7XHJcbiAgICAgICAgbGluZTogbGluZU5yLFxyXG4gICAgICAgIGNoOiAwLFxyXG4gICAgICB9O1xyXG4gICAgICBsZXQgY3Vyc29yRW5kID0ge1xyXG4gICAgICAgIGxpbmU6IGxpbmVOcixcclxuICAgICAgICBjaDogY29udGVudHMubGVuZ3RoLFxyXG4gICAgICB9O1xyXG4gICAgICBsZXQgY29udGVudCA9IGVkaXRvci5nZXRSYW5nZShjdXJzb3JTdGFydCwgY3Vyc29yRW5kKTtcclxuICAgICAgcmV0dXJuIHsgc3RhcnQ6IGN1cnNvclN0YXJ0LCBlbmQ6IGN1cnNvckVuZCwgY29udGVudDogY29udGVudCB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG9nZ2xlRWxlbWVudChyZTogUmVnRXhwLCBzdWJzdDogYW55KSB7XHJcbiAgICB2YXIgYWN0aXZlTGVhZjogYW55ID0gdGhpcy5hcHAud29ya3NwYWNlLmFjdGl2ZUxlYWY7XHJcbiAgICB2YXIgZWRpdG9yID0gYWN0aXZlTGVhZi52aWV3LnNvdXJjZU1vZGUuY21FZGl0b3I7XHJcbiAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLnNvbWV0aGluZ1NlbGVjdGVkKCk7XHJcbiAgICB2YXIgc2VsZWN0ZWRUZXh0ID0gdGhpcy5nZXRTZWxlY3RlZFRleHQoZWRpdG9yKTtcclxuXHJcbiAgICB2YXIgbmV3U3RyaW5nID0gc2VsZWN0ZWRUZXh0LmNvbnRlbnQucmVwbGFjZShyZSwgc3Vic3QpO1xyXG4gICAgZWRpdG9yLnJlcGxhY2VSYW5nZShuZXdTdHJpbmcsIHNlbGVjdGVkVGV4dC5zdGFydCwgc2VsZWN0ZWRUZXh0LmVuZCk7XHJcblxyXG4gICAgLy8gS2VlcCBjdXJzb3IgaW4gdGhlIHNhbWUgcGxhY2VcclxuICAgIGlmIChzZWxlY3Rpb24pIHtcclxuICAgICAgZWRpdG9yLnNldFNlbGVjdGlvbihzZWxlY3RlZFRleHQuc3RhcnQsIHtcclxuICAgICAgICBsaW5lOiBzZWxlY3RlZFRleHQuZW5kLmxpbmUsXHJcbiAgICAgICAgY2g6IGVkaXRvci5nZXRMaW5lKHNlbGVjdGVkVGV4dC5lbmQubGluZSkubGVuZ3RoLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRvZ2dsZVRvZG9zKCkge1xyXG4gICAgdmFyIHJlID0gLyheXFxzKnxeXFx0KikoLVxcc1xcWyBcXF1cXHN8LVxcc1xcW3hcXF1cXHN8XFwqXFxzfC1cXHN8XFxkKlxcLlxcc3xcXCpcXHN8XFxifF4pKFteXFxuXFxyXSopL2dpbTtcclxuICAgIHJldHVybiB0aGlzLnRvZ2dsZUVsZW1lbnQocmUsIHRoaXMucmVwbGFjZVRvZG9FbGVtZW50KTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZUxpc3RzKCkge1xyXG4gICAgdmFyIHJlID0gLyheXFxzKnxeXFx0KikoLVxcc1xcWyBcXF1cXHN8LVxcc1xcW3hcXF1cXHN8XFwqXFxzfC1cXHN8XFxkKlxcLlxcc3xcXCpcXHN8XFxifF4pKFteXFxuXFxyXSopL2dpbTtcclxuICAgIHJldHVybiB0aGlzLnRvZ2dsZUVsZW1lbnQocmUsIHRoaXMucmVwbGFjZUxpc3RFbGVtZW50KTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZUJsb2NrUXVvdGUoKSB7XHJcbiAgICB2YXIgcmUgPSAvPlxcc3xeL2dpbTtcclxuICAgIHJldHVybiB0aGlzLnRvZ2dsZUVsZW1lbnQocmUsIHRoaXMucmVwbGFjZUJsb2NrUXVvdGUpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlRW1iZWQoKSB7XHJcbiAgICB2YXIgcmUgPSAvXFxTKlxcW1xcWy9naW07XHJcbiAgICByZXR1cm4gdGhpcy50b2dnbGVFbGVtZW50KHJlLCB0aGlzLnJlcGxhY2VFbWJlZCk7XHJcbiAgfVxyXG5cclxuICByZXBsYWNlTGlzdEVsZW1lbnQobWF0Y2g6c3RyaW5nLCBzcGFjZXM6c3RyaW5nLCBzdGFydFRleHQ6IHN0cmluZywgc2VudGVuY2U6IHN0cmluZykge1xyXG4gICAgaWYgKHN0YXJ0VGV4dCA9PT0gXCItIFwiKSB7XHJcbiAgICAgIHJldHVybiBzcGFjZXMgKyBcIjEuIFwiICsgc2VudGVuY2U7XHJcbiAgICB9IGVsc2UgaWYgKHN0YXJ0VGV4dCA9PT0gXCJcIikge1xyXG4gICAgICByZXR1cm4gc3BhY2VzICsgXCItIFwiICsgc2VudGVuY2U7XHJcbiAgICB9IGVsc2UgaWYgKHN0YXJ0VGV4dCA9PT0gXCIxLiBcIikge1xyXG4gICAgICByZXR1cm4gc3BhY2VzICsgXCJcIiArIHNlbnRlbmNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHNwYWNlcyArIFwiLSBcIiArIHNlbnRlbmNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVwbGFjZUJsb2NrUXVvdGUoc3RhcnRUZXh0OiBzdHJpbmcpIHtcclxuICAgIGlmIChzdGFydFRleHQgPT09IFwiPiBcIikge1xyXG4gICAgICByZXR1cm4gXCJcIjtcclxuICAgIH0gZWxzZSBpZiAoc3RhcnRUZXh0ID09PSBcIlwiKSB7XHJcbiAgICAgIHJldHVybiBcIj4gXCI7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gXCI+IFwiO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVwbGFjZUVtYmVkKHN0YXJ0VGV4dDogc3RyaW5nKSB7XHJcbiAgICBpZiAoc3RhcnRUZXh0ID09PSBcIiFbW1wiKSB7XHJcbiAgICAgIHJldHVybiBcIltbXCI7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChzdGFydFRleHQgPT09IFwiW1tcIikge1xyXG4gICAgICByZXR1cm4gXCIhW1tcIjtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXR1cm4gXCJcIjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlcGxhY2VUb2RvRWxlbWVudChtYXRjaDpzdHJpbmcsIHNwYWNlczpzdHJpbmcsIHN0YXJ0VGV4dDogc3RyaW5nLCBzZW50ZW5jZTogc3RyaW5nKSB7XHJcbiAgICBpZiAoc3RhcnRUZXh0ID09PSBcIi0gWyBdIFwiKSB7XHJcbiAgICAgIHJldHVybiBzcGFjZXMgKyBcIi0gW3hdIFwiICsgc2VudGVuY2U7XHJcbiAgICB9IGVsc2UgaWYgKHN0YXJ0VGV4dCA9PT0gXCItIFt4XSBcIikge1xyXG4gICAgICByZXR1cm4gc3BhY2VzICsgXCItIFwiICsgc2VudGVuY2U7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gc3BhY2VzICsgXCItIFsgXSBcIiArIHNlbnRlbmNlO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXSwibmFtZXMiOlsiUGx1Z2luIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLGFBQWEsR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDbkMsSUFBSSxhQUFhLEdBQUcsTUFBTSxDQUFDLGNBQWM7QUFDekMsU0FBUyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsWUFBWSxLQUFLLElBQUksVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ3BGLFFBQVEsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQzFHLElBQUksT0FBTyxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQy9CLENBQUMsQ0FBQztBQUNGO0FBQ08sU0FBUyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNoQyxJQUFJLElBQUksT0FBTyxDQUFD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 diff --git a/.obsidian/plugins/hotkeysplus-obsidian/manifest.json b/.obsidian/plugins/hotkeysplus-obsidian/manifest.json deleted file mode 100644 index d5a44b36e..000000000 --- a/.obsidian/plugins/hotkeysplus-obsidian/manifest.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "id": "hotkeysplus-obsidian", - "name": "Hotkeys++", - "description": "Additional hotkeys to do common things in Obsidian", - "version": "0.2.5", - "author": "Argentina Ortega Sainz", - "authorUrl": "", - "isDesktopOnly": false -} \ No newline at end of file diff --git a/.obsidian/plugins/markdown-prettifier/data.json b/.obsidian/plugins/markdown-prettifier/data.json deleted file mode 100644 index 66e4113b5..000000000 --- a/.obsidian/plugins/markdown-prettifier/data.json +++ /dev/null @@ -1 +0,0 @@ -{"bullet":"-","emphasis":"_","rule":"-","createHeaderIfNotPresent":false,"updateHeader":true,"newHeaderTemplate":"\ndate updated: '{{date:YYYY-MM-DDTHH:mm:ssZ}}' \n","listItemIndent":"one"} \ No newline at end of file diff --git a/.obsidian/plugins/markdown-prettifier/main.js b/.obsidian/plugins/markdown-prettifier/main.js deleted file mode 100644 index b7539a31b..000000000 --- a/.obsidian/plugins/markdown-prettifier/main.js +++ /dev/null @@ -1,54768 +0,0 @@ -'use strict'; - -var obsidian = require('obsidian'); -var require$$0 = require('path'); - -function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } - -var require$$0__default = /*#__PURE__*/_interopDefaultLegacy(require$$0); - -/*! ***************************************************************************** -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -***************************************************************************** */ -/* global Reflect, Promise */ - -var extendStatics = function(d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); -}; - -function __extends(d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -} - -function __awaiter(thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -} - -function __generator(thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -} - -const DEFAULT_DATE_FORMAT = 'YYYYMMDDHHmm'; -const DATE_REGEX = /(?{{date:?(?[^}]*)}})/g; - -const NEW_HEADER_TEMPLATE =` -date updated: '{{date:YYYY-MM-DDTHH:mm:ssZ}}' -`; - -var constants = { - NEW_HEADER_TEMPLATE: NEW_HEADER_TEMPLATE, - DATE_REGEX: DATE_REGEX, - DEFAULT_DATE_FORMAT: DEFAULT_DATE_FORMAT -}; - -function isNothing(subject) { - return (typeof subject === 'undefined') || (subject === null); -} - - -function isObject(subject) { - return (typeof subject === 'object') && (subject !== null); -} - - -function toArray(sequence) { - if (Array.isArray(sequence)) return sequence; - else if (isNothing(sequence)) return []; - - return [ sequence ]; -} - - -function extend(target, source) { - var index, length, key, sourceKeys; - - if (source) { - sourceKeys = Object.keys(source); - - for (index = 0, length = sourceKeys.length; index < length; index += 1) { - key = sourceKeys[index]; - target[key] = source[key]; - } - } - - return target; -} - - -function repeat(string, count) { - var result = '', cycle; - - for (cycle = 0; cycle < count; cycle += 1) { - result += string; - } - - return result; -} - - -function isNegativeZero(number) { - return (number === 0) && (Number.NEGATIVE_INFINITY === 1 / number); -} - - -var isNothing_1 = isNothing; -var isObject_1 = isObject; -var toArray_1 = toArray; -var repeat_1 = repeat; -var isNegativeZero_1 = isNegativeZero; -var extend_1 = extend; - -var common = { - isNothing: isNothing_1, - isObject: isObject_1, - toArray: toArray_1, - repeat: repeat_1, - isNegativeZero: isNegativeZero_1, - extend: extend_1 -}; - -// YAML error class. http://stackoverflow.com/questions/8458984 - - -function formatError(exception, compact) { - var where = '', message = exception.reason || '(unknown reason)'; - - if (!exception.mark) return message; - - if (exception.mark.name) { - where += 'in "' + exception.mark.name + '" '; - } - - where += '(' + (exception.mark.line + 1) + ':' + (exception.mark.column + 1) + ')'; - - if (!compact && exception.mark.snippet) { - where += '\n\n' + exception.mark.snippet; - } - - return message + ' ' + where; -} - - -function YAMLException(reason, mark) { - // Super constructor - Error.call(this); - - this.name = 'YAMLException'; - this.reason = reason; - this.mark = mark; - this.message = formatError(this, false); - - // Include stack trace in error object - if (Error.captureStackTrace) { - // Chrome and NodeJS - Error.captureStackTrace(this, this.constructor); - } else { - // FF, IE 10+ and Safari 6+. Fallback for others - this.stack = (new Error()).stack || ''; - } -} - - -// Inherit from Error -YAMLException.prototype = Object.create(Error.prototype); -YAMLException.prototype.constructor = YAMLException; - - -YAMLException.prototype.toString = function toString(compact) { - return this.name + ': ' + formatError(this, compact); -}; - - -var exception = YAMLException; - -// get snippet for a single line, respecting maxLength -function getLine(buffer, lineStart, lineEnd, position, maxLineLength) { - var head = ''; - var tail = ''; - var maxHalfLength = Math.floor(maxLineLength / 2) - 1; - - if (position - lineStart > maxHalfLength) { - head = ' ... '; - lineStart = position - maxHalfLength + head.length; - } - - if (lineEnd - position > maxHalfLength) { - tail = ' ...'; - lineEnd = position + maxHalfLength - tail.length; - } - - return { - str: head + buffer.slice(lineStart, lineEnd).replace(/\t/g, '→') + tail, - pos: position - lineStart + head.length // relative position - }; -} - - -function padStart(string, max) { - return common.repeat(' ', max - string.length) + string; -} - - -function makeSnippet(mark, options) { - options = Object.create(options || null); - - if (!mark.buffer) return null; - - if (!options.maxLength) options.maxLength = 79; - if (typeof options.indent !== 'number') options.indent = 1; - if (typeof options.linesBefore !== 'number') options.linesBefore = 3; - if (typeof options.linesAfter !== 'number') options.linesAfter = 2; - - var re = /\r?\n|\r|\0/g; - var lineStarts = [ 0 ]; - var lineEnds = []; - var match; - var foundLineNo = -1; - - while ((match = re.exec(mark.buffer))) { - lineEnds.push(match.index); - lineStarts.push(match.index + match[0].length); - - if (mark.position <= match.index && foundLineNo < 0) { - foundLineNo = lineStarts.length - 2; - } - } - - if (foundLineNo < 0) foundLineNo = lineStarts.length - 1; - - var result = '', i, line; - var lineNoLength = Math.min(mark.line + options.linesAfter, lineEnds.length).toString().length; - var maxLineLength = options.maxLength - (options.indent + lineNoLength + 3); - - for (i = 1; i <= options.linesBefore; i++) { - if (foundLineNo - i < 0) break; - line = getLine( - mark.buffer, - lineStarts[foundLineNo - i], - lineEnds[foundLineNo - i], - mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo - i]), - maxLineLength - ); - result = common.repeat(' ', options.indent) + padStart((mark.line - i + 1).toString(), lineNoLength) + - ' | ' + line.str + '\n' + result; - } - - line = getLine(mark.buffer, lineStarts[foundLineNo], lineEnds[foundLineNo], mark.position, maxLineLength); - result += common.repeat(' ', options.indent) + padStart((mark.line + 1).toString(), lineNoLength) + - ' | ' + line.str + '\n'; - result += common.repeat('-', options.indent + lineNoLength + 3 + line.pos) + '^' + '\n'; - - for (i = 1; i <= options.linesAfter; i++) { - if (foundLineNo + i >= lineEnds.length) break; - line = getLine( - mark.buffer, - lineStarts[foundLineNo + i], - lineEnds[foundLineNo + i], - mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo + i]), - maxLineLength - ); - result += common.repeat(' ', options.indent) + padStart((mark.line + i + 1).toString(), lineNoLength) + - ' | ' + line.str + '\n'; - } - - return result.replace(/\n$/, ''); -} - - -var snippet = makeSnippet; - -var TYPE_CONSTRUCTOR_OPTIONS = [ - 'kind', - 'multi', - 'resolve', - 'construct', - 'instanceOf', - 'predicate', - 'represent', - 'representName', - 'defaultStyle', - 'styleAliases' -]; - -var YAML_NODE_KINDS = [ - 'scalar', - 'sequence', - 'mapping' -]; - -function compileStyleAliases(map) { - var result = {}; - - if (map !== null) { - Object.keys(map).forEach(function (style) { - map[style].forEach(function (alias) { - result[String(alias)] = style; - }); - }); - } - - return result; -} - -function Type(tag, options) { - options = options || {}; - - Object.keys(options).forEach(function (name) { - if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) { - throw new exception('Unknown option "' + name + '" is met in definition of "' + tag + '" YAML type.'); - } - }); - - // TODO: Add tag format check. - this.tag = tag; - this.kind = options['kind'] || null; - this.resolve = options['resolve'] || function () { return true; }; - this.construct = options['construct'] || function (data) { return data; }; - this.instanceOf = options['instanceOf'] || null; - this.predicate = options['predicate'] || null; - this.represent = options['represent'] || null; - this.representName = options['representName'] || null; - this.defaultStyle = options['defaultStyle'] || null; - this.multi = options['multi'] || false; - this.styleAliases = compileStyleAliases(options['styleAliases'] || null); - - if (YAML_NODE_KINDS.indexOf(this.kind) === -1) { - throw new exception('Unknown kind "' + this.kind + '" is specified for "' + tag + '" YAML type.'); - } -} - -var type = Type; - -/*eslint-disable max-len*/ - - - - - -function compileList(schema, name, result) { - var exclude = []; - - schema[name].forEach(function (currentType) { - result.forEach(function (previousType, previousIndex) { - if (previousType.tag === currentType.tag && - previousType.kind === currentType.kind && - previousType.multi === currentType.multi) { - - exclude.push(previousIndex); - } - }); - - result.push(currentType); - }); - - return result.filter(function (type, index) { - return exclude.indexOf(index) === -1; - }); -} - - -function compileMap(/* lists... */) { - var result = { - scalar: {}, - sequence: {}, - mapping: {}, - fallback: {}, - multi: { - scalar: [], - sequence: [], - mapping: [], - fallback: [] - } - }, index, length; - - function collectType(type) { - if (type.multi) { - result.multi[type.kind].push(type); - result.multi['fallback'].push(type); - } else { - result[type.kind][type.tag] = result['fallback'][type.tag] = type; - } - } - - for (index = 0, length = arguments.length; index < length; index += 1) { - arguments[index].forEach(collectType); - } - return result; -} - - -function Schema(definition) { - return this.extend(definition); -} - - -Schema.prototype.extend = function extend(definition) { - var implicit = []; - var explicit = []; - - if (definition instanceof type) { - // Schema.extend(type) - explicit.push(definition); - - } else if (Array.isArray(definition)) { - // Schema.extend([ type1, type2, ... ]) - explicit = explicit.concat(definition); - - } else if (definition && (Array.isArray(definition.implicit) || Array.isArray(definition.explicit))) { - // Schema.extend({ explicit: [ type1, type2, ... ], implicit: [ type1, type2, ... ] }) - if (definition.implicit) implicit = implicit.concat(definition.implicit); - if (definition.explicit) explicit = explicit.concat(definition.explicit); - - } else { - throw new exception('Schema.extend argument should be a Type, [ Type ], ' + - 'or a schema definition ({ implicit: [...], explicit: [...] })'); - } - - implicit.forEach(function (type$1) { - if (!(type$1 instanceof type)) { - throw new exception('Specified list of YAML types (or a single Type object) contains a non-Type object.'); - } - - if (type$1.loadKind && type$1.loadKind !== 'scalar') { - throw new exception('There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.'); - } - - if (type$1.multi) { - throw new exception('There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.'); - } - }); - - explicit.forEach(function (type$1) { - if (!(type$1 instanceof type)) { - throw new exception('Specified list of YAML types (or a single Type object) contains a non-Type object.'); - } - }); - - var result = Object.create(Schema.prototype); - - result.implicit = (this.implicit || []).concat(implicit); - result.explicit = (this.explicit || []).concat(explicit); - - result.compiledImplicit = compileList(result, 'implicit', []); - result.compiledExplicit = compileList(result, 'explicit', []); - result.compiledTypeMap = compileMap(result.compiledImplicit, result.compiledExplicit); - - return result; -}; - - -var schema = Schema; - -var str = new type('tag:yaml.org,2002:str', { - kind: 'scalar', - construct: function (data) { return data !== null ? data : ''; } -}); - -var seq = new type('tag:yaml.org,2002:seq', { - kind: 'sequence', - construct: function (data) { return data !== null ? data : []; } -}); - -var map = new type('tag:yaml.org,2002:map', { - kind: 'mapping', - construct: function (data) { return data !== null ? data : {}; } -}); - -var failsafe = new schema({ - explicit: [ - str, - seq, - map - ] -}); - -function resolveYamlNull(data) { - if (data === null) return true; - - var max = data.length; - - return (max === 1 && data === '~') || - (max === 4 && (data === 'null' || data === 'Null' || data === 'NULL')); -} - -function constructYamlNull() { - return null; -} - -function isNull(object) { - return object === null; -} - -var _null = new type('tag:yaml.org,2002:null', { - kind: 'scalar', - resolve: resolveYamlNull, - construct: constructYamlNull, - predicate: isNull, - represent: { - canonical: function () { return '~'; }, - lowercase: function () { return 'null'; }, - uppercase: function () { return 'NULL'; }, - camelcase: function () { return 'Null'; }, - empty: function () { return ''; } - }, - defaultStyle: 'lowercase' -}); - -function resolveYamlBoolean(data) { - if (data === null) return false; - - var max = data.length; - - return (max === 4 && (data === 'true' || data === 'True' || data === 'TRUE')) || - (max === 5 && (data === 'false' || data === 'False' || data === 'FALSE')); -} - -function constructYamlBoolean(data) { - return data === 'true' || - data === 'True' || - data === 'TRUE'; -} - -function isBoolean(object) { - return Object.prototype.toString.call(object) === '[object Boolean]'; -} - -var bool = new type('tag:yaml.org,2002:bool', { - kind: 'scalar', - resolve: resolveYamlBoolean, - construct: constructYamlBoolean, - predicate: isBoolean, - represent: { - lowercase: function (object) { return object ? 'true' : 'false'; }, - uppercase: function (object) { return object ? 'TRUE' : 'FALSE'; }, - camelcase: function (object) { return object ? 'True' : 'False'; } - }, - defaultStyle: 'lowercase' -}); - -function isHexCode(c) { - return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) || - ((0x41/* A */ <= c) && (c <= 0x46/* F */)) || - ((0x61/* a */ <= c) && (c <= 0x66/* f */)); -} - -function isOctCode(c) { - return ((0x30/* 0 */ <= c) && (c <= 0x37/* 7 */)); -} - -function isDecCode(c) { - return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)); -} - -function resolveYamlInteger(data) { - if (data === null) return false; - - var max = data.length, - index = 0, - hasDigits = false, - ch; - - if (!max) return false; - - ch = data[index]; - - // sign - if (ch === '-' || ch === '+') { - ch = data[++index]; - } - - if (ch === '0') { - // 0 - if (index + 1 === max) return true; - ch = data[++index]; - - // base 2, base 8, base 16 - - if (ch === 'b') { - // base 2 - index++; - - for (; index < max; index++) { - ch = data[index]; - if (ch === '_') continue; - if (ch !== '0' && ch !== '1') return false; - hasDigits = true; - } - return hasDigits && ch !== '_'; - } - - - if (ch === 'x') { - // base 16 - index++; - - for (; index < max; index++) { - ch = data[index]; - if (ch === '_') continue; - if (!isHexCode(data.charCodeAt(index))) return false; - hasDigits = true; - } - return hasDigits && ch !== '_'; - } - - - if (ch === 'o') { - // base 8 - index++; - - for (; index < max; index++) { - ch = data[index]; - if (ch === '_') continue; - if (!isOctCode(data.charCodeAt(index))) return false; - hasDigits = true; - } - return hasDigits && ch !== '_'; - } - } - - // base 10 (except 0) - - // value should not start with `_`; - if (ch === '_') return false; - - for (; index < max; index++) { - ch = data[index]; - if (ch === '_') continue; - if (!isDecCode(data.charCodeAt(index))) { - return false; - } - hasDigits = true; - } - - // Should have digits and should not end with `_` - if (!hasDigits || ch === '_') return false; - - return true; -} - -function constructYamlInteger(data) { - var value = data, sign = 1, ch; - - if (value.indexOf('_') !== -1) { - value = value.replace(/_/g, ''); - } - - ch = value[0]; - - if (ch === '-' || ch === '+') { - if (ch === '-') sign = -1; - value = value.slice(1); - ch = value[0]; - } - - if (value === '0') return 0; - - if (ch === '0') { - if (value[1] === 'b') return sign * parseInt(value.slice(2), 2); - if (value[1] === 'x') return sign * parseInt(value.slice(2), 16); - if (value[1] === 'o') return sign * parseInt(value.slice(2), 8); - } - - return sign * parseInt(value, 10); -} - -function isInteger(object) { - return (Object.prototype.toString.call(object)) === '[object Number]' && - (object % 1 === 0 && !common.isNegativeZero(object)); -} - -var int_1 = new type('tag:yaml.org,2002:int', { - kind: 'scalar', - resolve: resolveYamlInteger, - construct: constructYamlInteger, - predicate: isInteger, - represent: { - binary: function (obj) { return obj >= 0 ? '0b' + obj.toString(2) : '-0b' + obj.toString(2).slice(1); }, - octal: function (obj) { return obj >= 0 ? '0o' + obj.toString(8) : '-0o' + obj.toString(8).slice(1); }, - decimal: function (obj) { return obj.toString(10); }, - /* eslint-disable max-len */ - hexadecimal: function (obj) { return obj >= 0 ? '0x' + obj.toString(16).toUpperCase() : '-0x' + obj.toString(16).toUpperCase().slice(1); } - }, - defaultStyle: 'decimal', - styleAliases: { - binary: [ 2, 'bin' ], - octal: [ 8, 'oct' ], - decimal: [ 10, 'dec' ], - hexadecimal: [ 16, 'hex' ] - } -}); - -var YAML_FLOAT_PATTERN = new RegExp( - // 2.5e4, 2.5 and integers - '^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?' + - // .2e4, .2 - // special case, seems not from spec - '|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?' + - // .inf - '|[-+]?\\.(?:inf|Inf|INF)' + - // .nan - '|\\.(?:nan|NaN|NAN))$'); - -function resolveYamlFloat(data) { - if (data === null) return false; - - if (!YAML_FLOAT_PATTERN.test(data) || - // Quick hack to not allow integers end with `_` - // Probably should update regexp & check speed - data[data.length - 1] === '_') { - return false; - } - - return true; -} - -function constructYamlFloat(data) { - var value, sign; - - value = data.replace(/_/g, '').toLowerCase(); - sign = value[0] === '-' ? -1 : 1; - - if ('+-'.indexOf(value[0]) >= 0) { - value = value.slice(1); - } - - if (value === '.inf') { - return (sign === 1) ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY; - - } else if (value === '.nan') { - return NaN; - } - return sign * parseFloat(value, 10); -} - - -var SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/; - -function representYamlFloat(object, style) { - var res; - - if (isNaN(object)) { - switch (style) { - case 'lowercase': return '.nan'; - case 'uppercase': return '.NAN'; - case 'camelcase': return '.NaN'; - } - } else if (Number.POSITIVE_INFINITY === object) { - switch (style) { - case 'lowercase': return '.inf'; - case 'uppercase': return '.INF'; - case 'camelcase': return '.Inf'; - } - } else if (Number.NEGATIVE_INFINITY === object) { - switch (style) { - case 'lowercase': return '-.inf'; - case 'uppercase': return '-.INF'; - case 'camelcase': return '-.Inf'; - } - } else if (common.isNegativeZero(object)) { - return '-0.0'; - } - - res = object.toString(10); - - // JS stringifier can build scientific format without dots: 5e-100, - // while YAML requres dot: 5.e-100. Fix it with simple hack - - return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace('e', '.e') : res; -} - -function isFloat(object) { - return (Object.prototype.toString.call(object) === '[object Number]') && - (object % 1 !== 0 || common.isNegativeZero(object)); -} - -var float_1 = new type('tag:yaml.org,2002:float', { - kind: 'scalar', - resolve: resolveYamlFloat, - construct: constructYamlFloat, - predicate: isFloat, - represent: representYamlFloat, - defaultStyle: 'lowercase' -}); - -var json = failsafe.extend({ - implicit: [ - _null, - bool, - int_1, - float_1 - ] -}); - -var core = json; - -var YAML_DATE_REGEXP = new RegExp( - '^([0-9][0-9][0-9][0-9])' + // [1] year - '-([0-9][0-9])' + // [2] month - '-([0-9][0-9])$'); // [3] day - -var YAML_TIMESTAMP_REGEXP = new RegExp( - '^([0-9][0-9][0-9][0-9])' + // [1] year - '-([0-9][0-9]?)' + // [2] month - '-([0-9][0-9]?)' + // [3] day - '(?:[Tt]|[ \\t]+)' + // ... - '([0-9][0-9]?)' + // [4] hour - ':([0-9][0-9])' + // [5] minute - ':([0-9][0-9])' + // [6] second - '(?:\\.([0-9]*))?' + // [7] fraction - '(?:[ \\t]*(Z|([-+])([0-9][0-9]?)' + // [8] tz [9] tz_sign [10] tz_hour - '(?::([0-9][0-9]))?))?$'); // [11] tz_minute - -function resolveYamlTimestamp(data) { - if (data === null) return false; - if (YAML_DATE_REGEXP.exec(data) !== null) return true; - if (YAML_TIMESTAMP_REGEXP.exec(data) !== null) return true; - return false; -} - -function constructYamlTimestamp(data) { - var match, year, month, day, hour, minute, second, fraction = 0, - delta = null, tz_hour, tz_minute, date; - - match = YAML_DATE_REGEXP.exec(data); - if (match === null) match = YAML_TIMESTAMP_REGEXP.exec(data); - - if (match === null) throw new Error('Date resolve error'); - - // match: [1] year [2] month [3] day - - year = +(match[1]); - month = +(match[2]) - 1; // JS month starts with 0 - day = +(match[3]); - - if (!match[4]) { // no hour - return new Date(Date.UTC(year, month, day)); - } - - // match: [4] hour [5] minute [6] second [7] fraction - - hour = +(match[4]); - minute = +(match[5]); - second = +(match[6]); - - if (match[7]) { - fraction = match[7].slice(0, 3); - while (fraction.length < 3) { // milli-seconds - fraction += '0'; - } - fraction = +fraction; - } - - // match: [8] tz [9] tz_sign [10] tz_hour [11] tz_minute - - if (match[9]) { - tz_hour = +(match[10]); - tz_minute = +(match[11] || 0); - delta = (tz_hour * 60 + tz_minute) * 60000; // delta in mili-seconds - if (match[9] === '-') delta = -delta; - } - - date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction)); - - if (delta) date.setTime(date.getTime() - delta); - - return date; -} - -function representYamlTimestamp(object /*, style*/) { - return object.toISOString(); -} - -var timestamp = new type('tag:yaml.org,2002:timestamp', { - kind: 'scalar', - resolve: resolveYamlTimestamp, - construct: constructYamlTimestamp, - instanceOf: Date, - represent: representYamlTimestamp -}); - -function resolveYamlMerge(data) { - return data === '<<' || data === null; -} - -var merge = new type('tag:yaml.org,2002:merge', { - kind: 'scalar', - resolve: resolveYamlMerge -}); - -/*eslint-disable no-bitwise*/ - - - - - -// [ 64, 65, 66 ] -> [ padding, CR, LF ] -var BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r'; - - -function resolveYamlBinary(data) { - if (data === null) return false; - - var code, idx, bitlen = 0, max = data.length, map = BASE64_MAP; - - // Convert one by one. - for (idx = 0; idx < max; idx++) { - code = map.indexOf(data.charAt(idx)); - - // Skip CR/LF - if (code > 64) continue; - - // Fail on illegal characters - if (code < 0) return false; - - bitlen += 6; - } - - // If there are any bits left, source was corrupted - return (bitlen % 8) === 0; -} - -function constructYamlBinary(data) { - var idx, tailbits, - input = data.replace(/[\r\n=]/g, ''), // remove CR/LF & padding to simplify scan - max = input.length, - map = BASE64_MAP, - bits = 0, - result = []; - - // Collect by 6*4 bits (3 bytes) - - for (idx = 0; idx < max; idx++) { - if ((idx % 4 === 0) && idx) { - result.push((bits >> 16) & 0xFF); - result.push((bits >> 8) & 0xFF); - result.push(bits & 0xFF); - } - - bits = (bits << 6) | map.indexOf(input.charAt(idx)); - } - - // Dump tail - - tailbits = (max % 4) * 6; - - if (tailbits === 0) { - result.push((bits >> 16) & 0xFF); - result.push((bits >> 8) & 0xFF); - result.push(bits & 0xFF); - } else if (tailbits === 18) { - result.push((bits >> 10) & 0xFF); - result.push((bits >> 2) & 0xFF); - } else if (tailbits === 12) { - result.push((bits >> 4) & 0xFF); - } - - return new Uint8Array(result); -} - -function representYamlBinary(object /*, style*/) { - var result = '', bits = 0, idx, tail, - max = object.length, - map = BASE64_MAP; - - // Convert every three bytes to 4 ASCII characters. - - for (idx = 0; idx < max; idx++) { - if ((idx % 3 === 0) && idx) { - result += map[(bits >> 18) & 0x3F]; - result += map[(bits >> 12) & 0x3F]; - result += map[(bits >> 6) & 0x3F]; - result += map[bits & 0x3F]; - } - - bits = (bits << 8) + object[idx]; - } - - // Dump tail - - tail = max % 3; - - if (tail === 0) { - result += map[(bits >> 18) & 0x3F]; - result += map[(bits >> 12) & 0x3F]; - result += map[(bits >> 6) & 0x3F]; - result += map[bits & 0x3F]; - } else if (tail === 2) { - result += map[(bits >> 10) & 0x3F]; - result += map[(bits >> 4) & 0x3F]; - result += map[(bits << 2) & 0x3F]; - result += map[64]; - } else if (tail === 1) { - result += map[(bits >> 2) & 0x3F]; - result += map[(bits << 4) & 0x3F]; - result += map[64]; - result += map[64]; - } - - return result; -} - -function isBinary(obj) { - return Object.prototype.toString.call(obj) === '[object Uint8Array]'; -} - -var binary = new type('tag:yaml.org,2002:binary', { - kind: 'scalar', - resolve: resolveYamlBinary, - construct: constructYamlBinary, - predicate: isBinary, - represent: representYamlBinary -}); - -var _hasOwnProperty = Object.prototype.hasOwnProperty; -var _toString = Object.prototype.toString; - -function resolveYamlOmap(data) { - if (data === null) return true; - - var objectKeys = [], index, length, pair, pairKey, pairHasKey, - object = data; - - for (index = 0, length = object.length; index < length; index += 1) { - pair = object[index]; - pairHasKey = false; - - if (_toString.call(pair) !== '[object Object]') return false; - - for (pairKey in pair) { - if (_hasOwnProperty.call(pair, pairKey)) { - if (!pairHasKey) pairHasKey = true; - else return false; - } - } - - if (!pairHasKey) return false; - - if (objectKeys.indexOf(pairKey) === -1) objectKeys.push(pairKey); - else return false; - } - - return true; -} - -function constructYamlOmap(data) { - return data !== null ? data : []; -} - -var omap = new type('tag:yaml.org,2002:omap', { - kind: 'sequence', - resolve: resolveYamlOmap, - construct: constructYamlOmap -}); - -var _toString$1 = Object.prototype.toString; - -function resolveYamlPairs(data) { - if (data === null) return true; - - var index, length, pair, keys, result, - object = data; - - result = new Array(object.length); - - for (index = 0, length = object.length; index < length; index += 1) { - pair = object[index]; - - if (_toString$1.call(pair) !== '[object Object]') return false; - - keys = Object.keys(pair); - - if (keys.length !== 1) return false; - - result[index] = [ keys[0], pair[keys[0]] ]; - } - - return true; -} - -function constructYamlPairs(data) { - if (data === null) return []; - - var index, length, pair, keys, result, - object = data; - - result = new Array(object.length); - - for (index = 0, length = object.length; index < length; index += 1) { - pair = object[index]; - - keys = Object.keys(pair); - - result[index] = [ keys[0], pair[keys[0]] ]; - } - - return result; -} - -var pairs = new type('tag:yaml.org,2002:pairs', { - kind: 'sequence', - resolve: resolveYamlPairs, - construct: constructYamlPairs -}); - -var _hasOwnProperty$1 = Object.prototype.hasOwnProperty; - -function resolveYamlSet(data) { - if (data === null) return true; - - var key, object = data; - - for (key in object) { - if (_hasOwnProperty$1.call(object, key)) { - if (object[key] !== null) return false; - } - } - - return true; -} - -function constructYamlSet(data) { - return data !== null ? data : {}; -} - -var set = new type('tag:yaml.org,2002:set', { - kind: 'mapping', - resolve: resolveYamlSet, - construct: constructYamlSet -}); - -var _default = core.extend({ - implicit: [ - timestamp, - merge - ], - explicit: [ - binary, - omap, - pairs, - set - ] -}); - -/*eslint-disable max-len,no-use-before-define*/ - - - - - - - -var _hasOwnProperty$2 = Object.prototype.hasOwnProperty; - - -var CONTEXT_FLOW_IN = 1; -var CONTEXT_FLOW_OUT = 2; -var CONTEXT_BLOCK_IN = 3; -var CONTEXT_BLOCK_OUT = 4; - - -var CHOMPING_CLIP = 1; -var CHOMPING_STRIP = 2; -var CHOMPING_KEEP = 3; - - -var PATTERN_NON_PRINTABLE = /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/; -var PATTERN_NON_ASCII_LINE_BREAKS = /[\x85\u2028\u2029]/; -var PATTERN_FLOW_INDICATORS = /[,\[\]\{\}]/; -var PATTERN_TAG_HANDLE = /^(?:!|!!|![a-z\-]+!)$/i; -var PATTERN_TAG_URI = /^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i; - - -function _class(obj) { return Object.prototype.toString.call(obj); } - -function is_EOL(c) { - return (c === 0x0A/* LF */) || (c === 0x0D/* CR */); -} - -function is_WHITE_SPACE(c) { - return (c === 0x09/* Tab */) || (c === 0x20/* Space */); -} - -function is_WS_OR_EOL(c) { - return (c === 0x09/* Tab */) || - (c === 0x20/* Space */) || - (c === 0x0A/* LF */) || - (c === 0x0D/* CR */); -} - -function is_FLOW_INDICATOR(c) { - return c === 0x2C/* , */ || - c === 0x5B/* [ */ || - c === 0x5D/* ] */ || - c === 0x7B/* { */ || - c === 0x7D/* } */; -} - -function fromHexCode(c) { - var lc; - - if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) { - return c - 0x30; - } - - /*eslint-disable no-bitwise*/ - lc = c | 0x20; - - if ((0x61/* a */ <= lc) && (lc <= 0x66/* f */)) { - return lc - 0x61 + 10; - } - - return -1; -} - -function escapedHexLen(c) { - if (c === 0x78/* x */) { return 2; } - if (c === 0x75/* u */) { return 4; } - if (c === 0x55/* U */) { return 8; } - return 0; -} - -function fromDecimalCode(c) { - if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) { - return c - 0x30; - } - - return -1; -} - -function simpleEscapeSequence(c) { - /* eslint-disable indent */ - return (c === 0x30/* 0 */) ? '\x00' : - (c === 0x61/* a */) ? '\x07' : - (c === 0x62/* b */) ? '\x08' : - (c === 0x74/* t */) ? '\x09' : - (c === 0x09/* Tab */) ? '\x09' : - (c === 0x6E/* n */) ? '\x0A' : - (c === 0x76/* v */) ? '\x0B' : - (c === 0x66/* f */) ? '\x0C' : - (c === 0x72/* r */) ? '\x0D' : - (c === 0x65/* e */) ? '\x1B' : - (c === 0x20/* Space */) ? ' ' : - (c === 0x22/* " */) ? '\x22' : - (c === 0x2F/* / */) ? '/' : - (c === 0x5C/* \ */) ? '\x5C' : - (c === 0x4E/* N */) ? '\x85' : - (c === 0x5F/* _ */) ? '\xA0' : - (c === 0x4C/* L */) ? '\u2028' : - (c === 0x50/* P */) ? '\u2029' : ''; -} - -function charFromCodepoint(c) { - if (c <= 0xFFFF) { - return String.fromCharCode(c); - } - // Encode UTF-16 surrogate pair - // https://en.wikipedia.org/wiki/UTF-16#Code_points_U.2B010000_to_U.2B10FFFF - return String.fromCharCode( - ((c - 0x010000) >> 10) + 0xD800, - ((c - 0x010000) & 0x03FF) + 0xDC00 - ); -} - -var simpleEscapeCheck = new Array(256); // integer, for fast access -var simpleEscapeMap = new Array(256); -for (var i = 0; i < 256; i++) { - simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0; - simpleEscapeMap[i] = simpleEscapeSequence(i); -} - - -function State(input, options) { - this.input = input; - - this.filename = options['filename'] || null; - this.schema = options['schema'] || _default; - this.onWarning = options['onWarning'] || null; - // (Hidden) Remove? makes the loader to expect YAML 1.1 documents - // if such documents have no explicit %YAML directive - this.legacy = options['legacy'] || false; - - this.json = options['json'] || false; - this.listener = options['listener'] || null; - - this.implicitTypes = this.schema.compiledImplicit; - this.typeMap = this.schema.compiledTypeMap; - - this.length = input.length; - this.position = 0; - this.line = 0; - this.lineStart = 0; - this.lineIndent = 0; - - // position of first leading tab in the current line, - // used to make sure there are no tabs in the indentation - this.firstTabInLine = -1; - - this.documents = []; - - /* - this.version; - this.checkLineBreaks; - this.tagMap; - this.anchorMap; - this.tag; - this.anchor; - this.kind; - this.result;*/ - -} - - -function generateError(state, message) { - var mark = { - name: state.filename, - buffer: state.input.slice(0, -1), // omit trailing \0 - position: state.position, - line: state.line, - column: state.position - state.lineStart - }; - - mark.snippet = snippet(mark); - - return new exception(message, mark); -} - -function throwError(state, message) { - throw generateError(state, message); -} - -function throwWarning(state, message) { - if (state.onWarning) { - state.onWarning.call(null, generateError(state, message)); - } -} - - -var directiveHandlers = { - - YAML: function handleYamlDirective(state, name, args) { - - var match, major, minor; - - if (state.version !== null) { - throwError(state, 'duplication of %YAML directive'); - } - - if (args.length !== 1) { - throwError(state, 'YAML directive accepts exactly one argument'); - } - - match = /^([0-9]+)\.([0-9]+)$/.exec(args[0]); - - if (match === null) { - throwError(state, 'ill-formed argument of the YAML directive'); - } - - major = parseInt(match[1], 10); - minor = parseInt(match[2], 10); - - if (major !== 1) { - throwError(state, 'unacceptable YAML version of the document'); - } - - state.version = args[0]; - state.checkLineBreaks = (minor < 2); - - if (minor !== 1 && minor !== 2) { - throwWarning(state, 'unsupported YAML version of the document'); - } - }, - - TAG: function handleTagDirective(state, name, args) { - - var handle, prefix; - - if (args.length !== 2) { - throwError(state, 'TAG directive accepts exactly two arguments'); - } - - handle = args[0]; - prefix = args[1]; - - if (!PATTERN_TAG_HANDLE.test(handle)) { - throwError(state, 'ill-formed tag handle (first argument) of the TAG directive'); - } - - if (_hasOwnProperty$2.call(state.tagMap, handle)) { - throwError(state, 'there is a previously declared suffix for "' + handle + '" tag handle'); - } - - if (!PATTERN_TAG_URI.test(prefix)) { - throwError(state, 'ill-formed tag prefix (second argument) of the TAG directive'); - } - - try { - prefix = decodeURIComponent(prefix); - } catch (err) { - throwError(state, 'tag prefix is malformed: ' + prefix); - } - - state.tagMap[handle] = prefix; - } -}; - - -function captureSegment(state, start, end, checkJson) { - var _position, _length, _character, _result; - - if (start < end) { - _result = state.input.slice(start, end); - - if (checkJson) { - for (_position = 0, _length = _result.length; _position < _length; _position += 1) { - _character = _result.charCodeAt(_position); - if (!(_character === 0x09 || - (0x20 <= _character && _character <= 0x10FFFF))) { - throwError(state, 'expected valid JSON character'); - } - } - } else if (PATTERN_NON_PRINTABLE.test(_result)) { - throwError(state, 'the stream contains non-printable characters'); - } - - state.result += _result; - } -} - -function mergeMappings(state, destination, source, overridableKeys) { - var sourceKeys, key, index, quantity; - - if (!common.isObject(source)) { - throwError(state, 'cannot merge mappings; the provided source object is unacceptable'); - } - - sourceKeys = Object.keys(source); - - for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) { - key = sourceKeys[index]; - - if (!_hasOwnProperty$2.call(destination, key)) { - destination[key] = source[key]; - overridableKeys[key] = true; - } - } -} - -function storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, - startLine, startLineStart, startPos) { - - var index, quantity; - - // The output is a plain object here, so keys can only be strings. - // We need to convert keyNode to a string, but doing so can hang the process - // (deeply nested arrays that explode exponentially using aliases). - if (Array.isArray(keyNode)) { - keyNode = Array.prototype.slice.call(keyNode); - - for (index = 0, quantity = keyNode.length; index < quantity; index += 1) { - if (Array.isArray(keyNode[index])) { - throwError(state, 'nested arrays are not supported inside keys'); - } - - if (typeof keyNode === 'object' && _class(keyNode[index]) === '[object Object]') { - keyNode[index] = '[object Object]'; - } - } - } - - // Avoid code execution in load() via toString property - // (still use its own toString for arrays, timestamps, - // and whatever user schema extensions happen to have @@toStringTag) - if (typeof keyNode === 'object' && _class(keyNode) === '[object Object]') { - keyNode = '[object Object]'; - } - - - keyNode = String(keyNode); - - if (_result === null) { - _result = {}; - } - - if (keyTag === 'tag:yaml.org,2002:merge') { - if (Array.isArray(valueNode)) { - for (index = 0, quantity = valueNode.length; index < quantity; index += 1) { - mergeMappings(state, _result, valueNode[index], overridableKeys); - } - } else { - mergeMappings(state, _result, valueNode, overridableKeys); - } - } else { - if (!state.json && - !_hasOwnProperty$2.call(overridableKeys, keyNode) && - _hasOwnProperty$2.call(_result, keyNode)) { - state.line = startLine || state.line; - state.lineStart = startLineStart || state.lineStart; - state.position = startPos || state.position; - throwError(state, 'duplicated mapping key'); - } - - // used for this specific key only because Object.defineProperty is slow - if (keyNode === '__proto__') { - Object.defineProperty(_result, keyNode, { - configurable: true, - enumerable: true, - writable: true, - value: valueNode - }); - } else { - _result[keyNode] = valueNode; - } - delete overridableKeys[keyNode]; - } - - return _result; -} - -function readLineBreak(state) { - var ch; - - ch = state.input.charCodeAt(state.position); - - if (ch === 0x0A/* LF */) { - state.position++; - } else if (ch === 0x0D/* CR */) { - state.position++; - if (state.input.charCodeAt(state.position) === 0x0A/* LF */) { - state.position++; - } - } else { - throwError(state, 'a line break is expected'); - } - - state.line += 1; - state.lineStart = state.position; - state.firstTabInLine = -1; -} - -function skipSeparationSpace(state, allowComments, checkIndent) { - var lineBreaks = 0, - ch = state.input.charCodeAt(state.position); - - while (ch !== 0) { - while (is_WHITE_SPACE(ch)) { - if (ch === 0x09/* Tab */ && state.firstTabInLine === -1) { - state.firstTabInLine = state.position; - } - ch = state.input.charCodeAt(++state.position); - } - - if (allowComments && ch === 0x23/* # */) { - do { - ch = state.input.charCodeAt(++state.position); - } while (ch !== 0x0A/* LF */ && ch !== 0x0D/* CR */ && ch !== 0); - } - - if (is_EOL(ch)) { - readLineBreak(state); - - ch = state.input.charCodeAt(state.position); - lineBreaks++; - state.lineIndent = 0; - - while (ch === 0x20/* Space */) { - state.lineIndent++; - ch = state.input.charCodeAt(++state.position); - } - } else { - break; - } - } - - if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) { - throwWarning(state, 'deficient indentation'); - } - - return lineBreaks; -} - -function testDocumentSeparator(state) { - var _position = state.position, - ch; - - ch = state.input.charCodeAt(_position); - - // Condition state.position === state.lineStart is tested - // in parent on each call, for efficiency. No needs to test here again. - if ((ch === 0x2D/* - */ || ch === 0x2E/* . */) && - ch === state.input.charCodeAt(_position + 1) && - ch === state.input.charCodeAt(_position + 2)) { - - _position += 3; - - ch = state.input.charCodeAt(_position); - - if (ch === 0 || is_WS_OR_EOL(ch)) { - return true; - } - } - - return false; -} - -function writeFoldedLines(state, count) { - if (count === 1) { - state.result += ' '; - } else if (count > 1) { - state.result += common.repeat('\n', count - 1); - } -} - - -function readPlainScalar(state, nodeIndent, withinFlowCollection) { - var preceding, - following, - captureStart, - captureEnd, - hasPendingContent, - _line, - _lineStart, - _lineIndent, - _kind = state.kind, - _result = state.result, - ch; - - ch = state.input.charCodeAt(state.position); - - if (is_WS_OR_EOL(ch) || - is_FLOW_INDICATOR(ch) || - ch === 0x23/* # */ || - ch === 0x26/* & */ || - ch === 0x2A/* * */ || - ch === 0x21/* ! */ || - ch === 0x7C/* | */ || - ch === 0x3E/* > */ || - ch === 0x27/* ' */ || - ch === 0x22/* " */ || - ch === 0x25/* % */ || - ch === 0x40/* @ */ || - ch === 0x60/* ` */) { - return false; - } - - if (ch === 0x3F/* ? */ || ch === 0x2D/* - */) { - following = state.input.charCodeAt(state.position + 1); - - if (is_WS_OR_EOL(following) || - withinFlowCollection && is_FLOW_INDICATOR(following)) { - return false; - } - } - - state.kind = 'scalar'; - state.result = ''; - captureStart = captureEnd = state.position; - hasPendingContent = false; - - while (ch !== 0) { - if (ch === 0x3A/* : */) { - following = state.input.charCodeAt(state.position + 1); - - if (is_WS_OR_EOL(following) || - withinFlowCollection && is_FLOW_INDICATOR(following)) { - break; - } - - } else if (ch === 0x23/* # */) { - preceding = state.input.charCodeAt(state.position - 1); - - if (is_WS_OR_EOL(preceding)) { - break; - } - - } else if ((state.position === state.lineStart && testDocumentSeparator(state)) || - withinFlowCollection && is_FLOW_INDICATOR(ch)) { - break; - - } else if (is_EOL(ch)) { - _line = state.line; - _lineStart = state.lineStart; - _lineIndent = state.lineIndent; - skipSeparationSpace(state, false, -1); - - if (state.lineIndent >= nodeIndent) { - hasPendingContent = true; - ch = state.input.charCodeAt(state.position); - continue; - } else { - state.position = captureEnd; - state.line = _line; - state.lineStart = _lineStart; - state.lineIndent = _lineIndent; - break; - } - } - - if (hasPendingContent) { - captureSegment(state, captureStart, captureEnd, false); - writeFoldedLines(state, state.line - _line); - captureStart = captureEnd = state.position; - hasPendingContent = false; - } - - if (!is_WHITE_SPACE(ch)) { - captureEnd = state.position + 1; - } - - ch = state.input.charCodeAt(++state.position); - } - - captureSegment(state, captureStart, captureEnd, false); - - if (state.result) { - return true; - } - - state.kind = _kind; - state.result = _result; - return false; -} - -function readSingleQuotedScalar(state, nodeIndent) { - var ch, - captureStart, captureEnd; - - ch = state.input.charCodeAt(state.position); - - if (ch !== 0x27/* ' */) { - return false; - } - - state.kind = 'scalar'; - state.result = ''; - state.position++; - captureStart = captureEnd = state.position; - - while ((ch = state.input.charCodeAt(state.position)) !== 0) { - if (ch === 0x27/* ' */) { - captureSegment(state, captureStart, state.position, true); - ch = state.input.charCodeAt(++state.position); - - if (ch === 0x27/* ' */) { - captureStart = state.position; - state.position++; - captureEnd = state.position; - } else { - return true; - } - - } else if (is_EOL(ch)) { - captureSegment(state, captureStart, captureEnd, true); - writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent)); - captureStart = captureEnd = state.position; - - } else if (state.position === state.lineStart && testDocumentSeparator(state)) { - throwError(state, 'unexpected end of the document within a single quoted scalar'); - - } else { - state.position++; - captureEnd = state.position; - } - } - - throwError(state, 'unexpected end of the stream within a single quoted scalar'); -} - -function readDoubleQuotedScalar(state, nodeIndent) { - var captureStart, - captureEnd, - hexLength, - hexResult, - tmp, - ch; - - ch = state.input.charCodeAt(state.position); - - if (ch !== 0x22/* " */) { - return false; - } - - state.kind = 'scalar'; - state.result = ''; - state.position++; - captureStart = captureEnd = state.position; - - while ((ch = state.input.charCodeAt(state.position)) !== 0) { - if (ch === 0x22/* " */) { - captureSegment(state, captureStart, state.position, true); - state.position++; - return true; - - } else if (ch === 0x5C/* \ */) { - captureSegment(state, captureStart, state.position, true); - ch = state.input.charCodeAt(++state.position); - - if (is_EOL(ch)) { - skipSeparationSpace(state, false, nodeIndent); - - // TODO: rework to inline fn with no type cast? - } else if (ch < 256 && simpleEscapeCheck[ch]) { - state.result += simpleEscapeMap[ch]; - state.position++; - - } else if ((tmp = escapedHexLen(ch)) > 0) { - hexLength = tmp; - hexResult = 0; - - for (; hexLength > 0; hexLength--) { - ch = state.input.charCodeAt(++state.position); - - if ((tmp = fromHexCode(ch)) >= 0) { - hexResult = (hexResult << 4) + tmp; - - } else { - throwError(state, 'expected hexadecimal character'); - } - } - - state.result += charFromCodepoint(hexResult); - - state.position++; - - } else { - throwError(state, 'unknown escape sequence'); - } - - captureStart = captureEnd = state.position; - - } else if (is_EOL(ch)) { - captureSegment(state, captureStart, captureEnd, true); - writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent)); - captureStart = captureEnd = state.position; - - } else if (state.position === state.lineStart && testDocumentSeparator(state)) { - throwError(state, 'unexpected end of the document within a double quoted scalar'); - - } else { - state.position++; - captureEnd = state.position; - } - } - - throwError(state, 'unexpected end of the stream within a double quoted scalar'); -} - -function readFlowCollection(state, nodeIndent) { - var readNext = true, - _line, - _lineStart, - _pos, - _tag = state.tag, - _result, - _anchor = state.anchor, - following, - terminator, - isPair, - isExplicitPair, - isMapping, - overridableKeys = Object.create(null), - keyNode, - keyTag, - valueNode, - ch; - - ch = state.input.charCodeAt(state.position); - - if (ch === 0x5B/* [ */) { - terminator = 0x5D;/* ] */ - isMapping = false; - _result = []; - } else if (ch === 0x7B/* { */) { - terminator = 0x7D;/* } */ - isMapping = true; - _result = {}; - } else { - return false; - } - - if (state.anchor !== null) { - state.anchorMap[state.anchor] = _result; - } - - ch = state.input.charCodeAt(++state.position); - - while (ch !== 0) { - skipSeparationSpace(state, true, nodeIndent); - - ch = state.input.charCodeAt(state.position); - - if (ch === terminator) { - state.position++; - state.tag = _tag; - state.anchor = _anchor; - state.kind = isMapping ? 'mapping' : 'sequence'; - state.result = _result; - return true; - } else if (!readNext) { - throwError(state, 'missed comma between flow collection entries'); - } else if (ch === 0x2C/* , */) { - // "flow collection entries can never be completely empty", as per YAML 1.2, section 7.4 - throwError(state, "expected the node content, but found ','"); - } - - keyTag = keyNode = valueNode = null; - isPair = isExplicitPair = false; - - if (ch === 0x3F/* ? */) { - following = state.input.charCodeAt(state.position + 1); - - if (is_WS_OR_EOL(following)) { - isPair = isExplicitPair = true; - state.position++; - skipSeparationSpace(state, true, nodeIndent); - } - } - - _line = state.line; // Save the current line. - _lineStart = state.lineStart; - _pos = state.position; - composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true); - keyTag = state.tag; - keyNode = state.result; - skipSeparationSpace(state, true, nodeIndent); - - ch = state.input.charCodeAt(state.position); - - if ((isExplicitPair || state.line === _line) && ch === 0x3A/* : */) { - isPair = true; - ch = state.input.charCodeAt(++state.position); - skipSeparationSpace(state, true, nodeIndent); - composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true); - valueNode = state.result; - } - - if (isMapping) { - storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos); - } else if (isPair) { - _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos)); - } else { - _result.push(keyNode); - } - - skipSeparationSpace(state, true, nodeIndent); - - ch = state.input.charCodeAt(state.position); - - if (ch === 0x2C/* , */) { - readNext = true; - ch = state.input.charCodeAt(++state.position); - } else { - readNext = false; - } - } - - throwError(state, 'unexpected end of the stream within a flow collection'); -} - -function readBlockScalar(state, nodeIndent) { - var captureStart, - folding, - chomping = CHOMPING_CLIP, - didReadContent = false, - detectedIndent = false, - textIndent = nodeIndent, - emptyLines = 0, - atMoreIndented = false, - tmp, - ch; - - ch = state.input.charCodeAt(state.position); - - if (ch === 0x7C/* | */) { - folding = false; - } else if (ch === 0x3E/* > */) { - folding = true; - } else { - return false; - } - - state.kind = 'scalar'; - state.result = ''; - - while (ch !== 0) { - ch = state.input.charCodeAt(++state.position); - - if (ch === 0x2B/* + */ || ch === 0x2D/* - */) { - if (CHOMPING_CLIP === chomping) { - chomping = (ch === 0x2B/* + */) ? CHOMPING_KEEP : CHOMPING_STRIP; - } else { - throwError(state, 'repeat of a chomping mode identifier'); - } - - } else if ((tmp = fromDecimalCode(ch)) >= 0) { - if (tmp === 0) { - throwError(state, 'bad explicit indentation width of a block scalar; it cannot be less than one'); - } else if (!detectedIndent) { - textIndent = nodeIndent + tmp - 1; - detectedIndent = true; - } else { - throwError(state, 'repeat of an indentation width identifier'); - } - - } else { - break; - } - } - - if (is_WHITE_SPACE(ch)) { - do { ch = state.input.charCodeAt(++state.position); } - while (is_WHITE_SPACE(ch)); - - if (ch === 0x23/* # */) { - do { ch = state.input.charCodeAt(++state.position); } - while (!is_EOL(ch) && (ch !== 0)); - } - } - - while (ch !== 0) { - readLineBreak(state); - state.lineIndent = 0; - - ch = state.input.charCodeAt(state.position); - - while ((!detectedIndent || state.lineIndent < textIndent) && - (ch === 0x20/* Space */)) { - state.lineIndent++; - ch = state.input.charCodeAt(++state.position); - } - - if (!detectedIndent && state.lineIndent > textIndent) { - textIndent = state.lineIndent; - } - - if (is_EOL(ch)) { - emptyLines++; - continue; - } - - // End of the scalar. - if (state.lineIndent < textIndent) { - - // Perform the chomping. - if (chomping === CHOMPING_KEEP) { - state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines); - } else if (chomping === CHOMPING_CLIP) { - if (didReadContent) { // i.e. only if the scalar is not empty. - state.result += '\n'; - } - } - - // Break this `while` cycle and go to the funciton's epilogue. - break; - } - - // Folded style: use fancy rules to handle line breaks. - if (folding) { - - // Lines starting with white space characters (more-indented lines) are not folded. - if (is_WHITE_SPACE(ch)) { - atMoreIndented = true; - // except for the first content line (cf. Example 8.1) - state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines); - - // End of more-indented block. - } else if (atMoreIndented) { - atMoreIndented = false; - state.result += common.repeat('\n', emptyLines + 1); - - // Just one line break - perceive as the same line. - } else if (emptyLines === 0) { - if (didReadContent) { // i.e. only if we have already read some scalar content. - state.result += ' '; - } - - // Several line breaks - perceive as different lines. - } else { - state.result += common.repeat('\n', emptyLines); - } - - // Literal style: just add exact number of line breaks between content lines. - } else { - // Keep all line breaks except the header line break. - state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines); - } - - didReadContent = true; - detectedIndent = true; - emptyLines = 0; - captureStart = state.position; - - while (!is_EOL(ch) && (ch !== 0)) { - ch = state.input.charCodeAt(++state.position); - } - - captureSegment(state, captureStart, state.position, false); - } - - return true; -} - -function readBlockSequence(state, nodeIndent) { - var _line, - _tag = state.tag, - _anchor = state.anchor, - _result = [], - following, - detected = false, - ch; - - // there is a leading tab before this token, so it can't be a block sequence/mapping; - // it can still be flow sequence/mapping or a scalar - if (state.firstTabInLine !== -1) return false; - - if (state.anchor !== null) { - state.anchorMap[state.anchor] = _result; - } - - ch = state.input.charCodeAt(state.position); - - while (ch !== 0) { - if (state.firstTabInLine !== -1) { - state.position = state.firstTabInLine; - throwError(state, 'tab characters must not be used in indentation'); - } - - if (ch !== 0x2D/* - */) { - break; - } - - following = state.input.charCodeAt(state.position + 1); - - if (!is_WS_OR_EOL(following)) { - break; - } - - detected = true; - state.position++; - - if (skipSeparationSpace(state, true, -1)) { - if (state.lineIndent <= nodeIndent) { - _result.push(null); - ch = state.input.charCodeAt(state.position); - continue; - } - } - - _line = state.line; - composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true); - _result.push(state.result); - skipSeparationSpace(state, true, -1); - - ch = state.input.charCodeAt(state.position); - - if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) { - throwError(state, 'bad indentation of a sequence entry'); - } else if (state.lineIndent < nodeIndent) { - break; - } - } - - if (detected) { - state.tag = _tag; - state.anchor = _anchor; - state.kind = 'sequence'; - state.result = _result; - return true; - } - return false; -} - -function readBlockMapping(state, nodeIndent, flowIndent) { - var following, - allowCompact, - _line, - _keyLine, - _keyLineStart, - _keyPos, - _tag = state.tag, - _anchor = state.anchor, - _result = {}, - overridableKeys = Object.create(null), - keyTag = null, - keyNode = null, - valueNode = null, - atExplicitKey = false, - detected = false, - ch; - - // there is a leading tab before this token, so it can't be a block sequence/mapping; - // it can still be flow sequence/mapping or a scalar - if (state.firstTabInLine !== -1) return false; - - if (state.anchor !== null) { - state.anchorMap[state.anchor] = _result; - } - - ch = state.input.charCodeAt(state.position); - - while (ch !== 0) { - if (!atExplicitKey && state.firstTabInLine !== -1) { - state.position = state.firstTabInLine; - throwError(state, 'tab characters must not be used in indentation'); - } - - following = state.input.charCodeAt(state.position + 1); - _line = state.line; // Save the current line. - - // - // Explicit notation case. There are two separate blocks: - // first for the key (denoted by "?") and second for the value (denoted by ":") - // - if ((ch === 0x3F/* ? */ || ch === 0x3A/* : */) && is_WS_OR_EOL(following)) { - - if (ch === 0x3F/* ? */) { - if (atExplicitKey) { - storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos); - keyTag = keyNode = valueNode = null; - } - - detected = true; - atExplicitKey = true; - allowCompact = true; - - } else if (atExplicitKey) { - // i.e. 0x3A/* : */ === character after the explicit key. - atExplicitKey = false; - allowCompact = true; - - } else { - throwError(state, 'incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line'); - } - - state.position += 1; - ch = following; - - // - // Implicit notation case. Flow-style node as the key first, then ":", and the value. - // - } else { - _keyLine = state.line; - _keyLineStart = state.lineStart; - _keyPos = state.position; - - if (!composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) { - // Neither implicit nor explicit notation. - // Reading is done. Go to the epilogue. - break; - } - - if (state.line === _line) { - ch = state.input.charCodeAt(state.position); - - while (is_WHITE_SPACE(ch)) { - ch = state.input.charCodeAt(++state.position); - } - - if (ch === 0x3A/* : */) { - ch = state.input.charCodeAt(++state.position); - - if (!is_WS_OR_EOL(ch)) { - throwError(state, 'a whitespace character is expected after the key-value separator within a block mapping'); - } - - if (atExplicitKey) { - storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos); - keyTag = keyNode = valueNode = null; - } - - detected = true; - atExplicitKey = false; - allowCompact = false; - keyTag = state.tag; - keyNode = state.result; - - } else if (detected) { - throwError(state, 'can not read an implicit mapping pair; a colon is missed'); - - } else { - state.tag = _tag; - state.anchor = _anchor; - return true; // Keep the result of `composeNode`. - } - - } else if (detected) { - throwError(state, 'can not read a block mapping entry; a multiline key may not be an implicit key'); - - } else { - state.tag = _tag; - state.anchor = _anchor; - return true; // Keep the result of `composeNode`. - } - } - - // - // Common reading code for both explicit and implicit notations. - // - if (state.line === _line || state.lineIndent > nodeIndent) { - if (atExplicitKey) { - _keyLine = state.line; - _keyLineStart = state.lineStart; - _keyPos = state.position; - } - - if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) { - if (atExplicitKey) { - keyNode = state.result; - } else { - valueNode = state.result; - } - } - - if (!atExplicitKey) { - storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _keyLine, _keyLineStart, _keyPos); - keyTag = keyNode = valueNode = null; - } - - skipSeparationSpace(state, true, -1); - ch = state.input.charCodeAt(state.position); - } - - if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) { - throwError(state, 'bad indentation of a mapping entry'); - } else if (state.lineIndent < nodeIndent) { - break; - } - } - - // - // Epilogue. - // - - // Special case: last mapping's node contains only the key in explicit notation. - if (atExplicitKey) { - storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos); - } - - // Expose the resulting mapping. - if (detected) { - state.tag = _tag; - state.anchor = _anchor; - state.kind = 'mapping'; - state.result = _result; - } - - return detected; -} - -function readTagProperty(state) { - var _position, - isVerbatim = false, - isNamed = false, - tagHandle, - tagName, - ch; - - ch = state.input.charCodeAt(state.position); - - if (ch !== 0x21/* ! */) return false; - - if (state.tag !== null) { - throwError(state, 'duplication of a tag property'); - } - - ch = state.input.charCodeAt(++state.position); - - if (ch === 0x3C/* < */) { - isVerbatim = true; - ch = state.input.charCodeAt(++state.position); - - } else if (ch === 0x21/* ! */) { - isNamed = true; - tagHandle = '!!'; - ch = state.input.charCodeAt(++state.position); - - } else { - tagHandle = '!'; - } - - _position = state.position; - - if (isVerbatim) { - do { ch = state.input.charCodeAt(++state.position); } - while (ch !== 0 && ch !== 0x3E/* > */); - - if (state.position < state.length) { - tagName = state.input.slice(_position, state.position); - ch = state.input.charCodeAt(++state.position); - } else { - throwError(state, 'unexpected end of the stream within a verbatim tag'); - } - } else { - while (ch !== 0 && !is_WS_OR_EOL(ch)) { - - if (ch === 0x21/* ! */) { - if (!isNamed) { - tagHandle = state.input.slice(_position - 1, state.position + 1); - - if (!PATTERN_TAG_HANDLE.test(tagHandle)) { - throwError(state, 'named tag handle cannot contain such characters'); - } - - isNamed = true; - _position = state.position + 1; - } else { - throwError(state, 'tag suffix cannot contain exclamation marks'); - } - } - - ch = state.input.charCodeAt(++state.position); - } - - tagName = state.input.slice(_position, state.position); - - if (PATTERN_FLOW_INDICATORS.test(tagName)) { - throwError(state, 'tag suffix cannot contain flow indicator characters'); - } - } - - if (tagName && !PATTERN_TAG_URI.test(tagName)) { - throwError(state, 'tag name cannot contain such characters: ' + tagName); - } - - try { - tagName = decodeURIComponent(tagName); - } catch (err) { - throwError(state, 'tag name is malformed: ' + tagName); - } - - if (isVerbatim) { - state.tag = tagName; - - } else if (_hasOwnProperty$2.call(state.tagMap, tagHandle)) { - state.tag = state.tagMap[tagHandle] + tagName; - - } else if (tagHandle === '!') { - state.tag = '!' + tagName; - - } else if (tagHandle === '!!') { - state.tag = 'tag:yaml.org,2002:' + tagName; - - } else { - throwError(state, 'undeclared tag handle "' + tagHandle + '"'); - } - - return true; -} - -function readAnchorProperty(state) { - var _position, - ch; - - ch = state.input.charCodeAt(state.position); - - if (ch !== 0x26/* & */) return false; - - if (state.anchor !== null) { - throwError(state, 'duplication of an anchor property'); - } - - ch = state.input.charCodeAt(++state.position); - _position = state.position; - - while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) { - ch = state.input.charCodeAt(++state.position); - } - - if (state.position === _position) { - throwError(state, 'name of an anchor node must contain at least one character'); - } - - state.anchor = state.input.slice(_position, state.position); - return true; -} - -function readAlias(state) { - var _position, alias, - ch; - - ch = state.input.charCodeAt(state.position); - - if (ch !== 0x2A/* * */) return false; - - ch = state.input.charCodeAt(++state.position); - _position = state.position; - - while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) { - ch = state.input.charCodeAt(++state.position); - } - - if (state.position === _position) { - throwError(state, 'name of an alias node must contain at least one character'); - } - - alias = state.input.slice(_position, state.position); - - if (!_hasOwnProperty$2.call(state.anchorMap, alias)) { - throwError(state, 'unidentified alias "' + alias + '"'); - } - - state.result = state.anchorMap[alias]; - skipSeparationSpace(state, true, -1); - return true; -} - -function composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) { - var allowBlockStyles, - allowBlockScalars, - allowBlockCollections, - indentStatus = 1, // 1: this>parent, 0: this=parent, -1: this parentIndent) { - indentStatus = 1; - } else if (state.lineIndent === parentIndent) { - indentStatus = 0; - } else if (state.lineIndent < parentIndent) { - indentStatus = -1; - } - } - } - - if (indentStatus === 1) { - while (readTagProperty(state) || readAnchorProperty(state)) { - if (skipSeparationSpace(state, true, -1)) { - atNewLine = true; - allowBlockCollections = allowBlockStyles; - - if (state.lineIndent > parentIndent) { - indentStatus = 1; - } else if (state.lineIndent === parentIndent) { - indentStatus = 0; - } else if (state.lineIndent < parentIndent) { - indentStatus = -1; - } - } else { - allowBlockCollections = false; - } - } - } - - if (allowBlockCollections) { - allowBlockCollections = atNewLine || allowCompact; - } - - if (indentStatus === 1 || CONTEXT_BLOCK_OUT === nodeContext) { - if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) { - flowIndent = parentIndent; - } else { - flowIndent = parentIndent + 1; - } - - blockIndent = state.position - state.lineStart; - - if (indentStatus === 1) { - if (allowBlockCollections && - (readBlockSequence(state, blockIndent) || - readBlockMapping(state, blockIndent, flowIndent)) || - readFlowCollection(state, flowIndent)) { - hasContent = true; - } else { - if ((allowBlockScalars && readBlockScalar(state, flowIndent)) || - readSingleQuotedScalar(state, flowIndent) || - readDoubleQuotedScalar(state, flowIndent)) { - hasContent = true; - - } else if (readAlias(state)) { - hasContent = true; - - if (state.tag !== null || state.anchor !== null) { - throwError(state, 'alias node should not have any properties'); - } - - } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) { - hasContent = true; - - if (state.tag === null) { - state.tag = '?'; - } - } - - if (state.anchor !== null) { - state.anchorMap[state.anchor] = state.result; - } - } - } else if (indentStatus === 0) { - // Special case: block sequences are allowed to have same indentation level as the parent. - // http://www.yaml.org/spec/1.2/spec.html#id2799784 - hasContent = allowBlockCollections && readBlockSequence(state, blockIndent); - } - } - - if (state.tag === null) { - if (state.anchor !== null) { - state.anchorMap[state.anchor] = state.result; - } - - } else if (state.tag === '?') { - // Implicit resolving is not allowed for non-scalar types, and '?' - // non-specific tag is only automatically assigned to plain scalars. - // - // We only need to check kind conformity in case user explicitly assigns '?' - // tag, for example like this: "! [0]" - // - if (state.result !== null && state.kind !== 'scalar') { - throwError(state, 'unacceptable node kind for ! tag; it should be "scalar", not "' + state.kind + '"'); - } - - for (typeIndex = 0, typeQuantity = state.implicitTypes.length; typeIndex < typeQuantity; typeIndex += 1) { - type = state.implicitTypes[typeIndex]; - - if (type.resolve(state.result)) { // `state.result` updated in resolver if matched - state.result = type.construct(state.result); - state.tag = type.tag; - if (state.anchor !== null) { - state.anchorMap[state.anchor] = state.result; - } - break; - } - } - } else if (state.tag !== '!') { - if (_hasOwnProperty$2.call(state.typeMap[state.kind || 'fallback'], state.tag)) { - type = state.typeMap[state.kind || 'fallback'][state.tag]; - } else { - // looking for multi type - type = null; - typeList = state.typeMap.multi[state.kind || 'fallback']; - - for (typeIndex = 0, typeQuantity = typeList.length; typeIndex < typeQuantity; typeIndex += 1) { - if (state.tag.slice(0, typeList[typeIndex].tag.length) === typeList[typeIndex].tag) { - type = typeList[typeIndex]; - break; - } - } - } - - if (!type) { - throwError(state, 'unknown tag !<' + state.tag + '>'); - } - - if (state.result !== null && type.kind !== state.kind) { - throwError(state, 'unacceptable node kind for !<' + state.tag + '> tag; it should be "' + type.kind + '", not "' + state.kind + '"'); - } - - if (!type.resolve(state.result, state.tag)) { // `state.result` updated in resolver if matched - throwError(state, 'cannot resolve a node with !<' + state.tag + '> explicit tag'); - } else { - state.result = type.construct(state.result, state.tag); - if (state.anchor !== null) { - state.anchorMap[state.anchor] = state.result; - } - } - } - - if (state.listener !== null) { - state.listener('close', state); - } - return state.tag !== null || state.anchor !== null || hasContent; -} - -function readDocument(state) { - var documentStart = state.position, - _position, - directiveName, - directiveArgs, - hasDirectives = false, - ch; - - state.version = null; - state.checkLineBreaks = state.legacy; - state.tagMap = Object.create(null); - state.anchorMap = Object.create(null); - - while ((ch = state.input.charCodeAt(state.position)) !== 0) { - skipSeparationSpace(state, true, -1); - - ch = state.input.charCodeAt(state.position); - - if (state.lineIndent > 0 || ch !== 0x25/* % */) { - break; - } - - hasDirectives = true; - ch = state.input.charCodeAt(++state.position); - _position = state.position; - - while (ch !== 0 && !is_WS_OR_EOL(ch)) { - ch = state.input.charCodeAt(++state.position); - } - - directiveName = state.input.slice(_position, state.position); - directiveArgs = []; - - if (directiveName.length < 1) { - throwError(state, 'directive name must not be less than one character in length'); - } - - while (ch !== 0) { - while (is_WHITE_SPACE(ch)) { - ch = state.input.charCodeAt(++state.position); - } - - if (ch === 0x23/* # */) { - do { ch = state.input.charCodeAt(++state.position); } - while (ch !== 0 && !is_EOL(ch)); - break; - } - - if (is_EOL(ch)) break; - - _position = state.position; - - while (ch !== 0 && !is_WS_OR_EOL(ch)) { - ch = state.input.charCodeAt(++state.position); - } - - directiveArgs.push(state.input.slice(_position, state.position)); - } - - if (ch !== 0) readLineBreak(state); - - if (_hasOwnProperty$2.call(directiveHandlers, directiveName)) { - directiveHandlers[directiveName](state, directiveName, directiveArgs); - } else { - throwWarning(state, 'unknown document directive "' + directiveName + '"'); - } - } - - skipSeparationSpace(state, true, -1); - - if (state.lineIndent === 0 && - state.input.charCodeAt(state.position) === 0x2D/* - */ && - state.input.charCodeAt(state.position + 1) === 0x2D/* - */ && - state.input.charCodeAt(state.position + 2) === 0x2D/* - */) { - state.position += 3; - skipSeparationSpace(state, true, -1); - - } else if (hasDirectives) { - throwError(state, 'directives end mark is expected'); - } - - composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true); - skipSeparationSpace(state, true, -1); - - if (state.checkLineBreaks && - PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) { - throwWarning(state, 'non-ASCII line breaks are interpreted as content'); - } - - state.documents.push(state.result); - - if (state.position === state.lineStart && testDocumentSeparator(state)) { - - if (state.input.charCodeAt(state.position) === 0x2E/* . */) { - state.position += 3; - skipSeparationSpace(state, true, -1); - } - return; - } - - if (state.position < (state.length - 1)) { - throwError(state, 'end of the stream or a document separator is expected'); - } else { - return; - } -} - - -function loadDocuments(input, options) { - input = String(input); - options = options || {}; - - if (input.length !== 0) { - - // Add tailing `\n` if not exists - if (input.charCodeAt(input.length - 1) !== 0x0A/* LF */ && - input.charCodeAt(input.length - 1) !== 0x0D/* CR */) { - input += '\n'; - } - - // Strip BOM - if (input.charCodeAt(0) === 0xFEFF) { - input = input.slice(1); - } - } - - var state = new State(input, options); - - var nullpos = input.indexOf('\0'); - - if (nullpos !== -1) { - state.position = nullpos; - throwError(state, 'null byte is not allowed in input'); - } - - // Use 0 as string terminator. That significantly simplifies bounds check. - state.input += '\0'; - - while (state.input.charCodeAt(state.position) === 0x20/* Space */) { - state.lineIndent += 1; - state.position += 1; - } - - while (state.position < (state.length - 1)) { - readDocument(state); - } - - return state.documents; -} - - -function loadAll(input, iterator, options) { - if (iterator !== null && typeof iterator === 'object' && typeof options === 'undefined') { - options = iterator; - iterator = null; - } - - var documents = loadDocuments(input, options); - - if (typeof iterator !== 'function') { - return documents; - } - - for (var index = 0, length = documents.length; index < length; index += 1) { - iterator(documents[index]); - } -} - - -function load(input, options) { - var documents = loadDocuments(input, options); - - if (documents.length === 0) { - /*eslint-disable no-undefined*/ - return undefined; - } else if (documents.length === 1) { - return documents[0]; - } - throw new exception('expected a single document in the stream, but found more'); -} - - -var loadAll_1 = loadAll; -var load_1 = load; - -var loader = { - loadAll: loadAll_1, - load: load_1 -}; - -/*eslint-disable no-use-before-define*/ - - - - - -var _toString$2 = Object.prototype.toString; -var _hasOwnProperty$3 = Object.prototype.hasOwnProperty; - -var CHAR_BOM = 0xFEFF; -var CHAR_TAB = 0x09; /* Tab */ -var CHAR_LINE_FEED = 0x0A; /* LF */ -var CHAR_CARRIAGE_RETURN = 0x0D; /* CR */ -var CHAR_SPACE = 0x20; /* Space */ -var CHAR_EXCLAMATION = 0x21; /* ! */ -var CHAR_DOUBLE_QUOTE = 0x22; /* " */ -var CHAR_SHARP = 0x23; /* # */ -var CHAR_PERCENT = 0x25; /* % */ -var CHAR_AMPERSAND = 0x26; /* & */ -var CHAR_SINGLE_QUOTE = 0x27; /* ' */ -var CHAR_ASTERISK = 0x2A; /* * */ -var CHAR_COMMA = 0x2C; /* , */ -var CHAR_MINUS = 0x2D; /* - */ -var CHAR_COLON = 0x3A; /* : */ -var CHAR_EQUALS = 0x3D; /* = */ -var CHAR_GREATER_THAN = 0x3E; /* > */ -var CHAR_QUESTION = 0x3F; /* ? */ -var CHAR_COMMERCIAL_AT = 0x40; /* @ */ -var CHAR_LEFT_SQUARE_BRACKET = 0x5B; /* [ */ -var CHAR_RIGHT_SQUARE_BRACKET = 0x5D; /* ] */ -var CHAR_GRAVE_ACCENT = 0x60; /* ` */ -var CHAR_LEFT_CURLY_BRACKET = 0x7B; /* { */ -var CHAR_VERTICAL_LINE = 0x7C; /* | */ -var CHAR_RIGHT_CURLY_BRACKET = 0x7D; /* } */ - -var ESCAPE_SEQUENCES = {}; - -ESCAPE_SEQUENCES[0x00] = '\\0'; -ESCAPE_SEQUENCES[0x07] = '\\a'; -ESCAPE_SEQUENCES[0x08] = '\\b'; -ESCAPE_SEQUENCES[0x09] = '\\t'; -ESCAPE_SEQUENCES[0x0A] = '\\n'; -ESCAPE_SEQUENCES[0x0B] = '\\v'; -ESCAPE_SEQUENCES[0x0C] = '\\f'; -ESCAPE_SEQUENCES[0x0D] = '\\r'; -ESCAPE_SEQUENCES[0x1B] = '\\e'; -ESCAPE_SEQUENCES[0x22] = '\\"'; -ESCAPE_SEQUENCES[0x5C] = '\\\\'; -ESCAPE_SEQUENCES[0x85] = '\\N'; -ESCAPE_SEQUENCES[0xA0] = '\\_'; -ESCAPE_SEQUENCES[0x2028] = '\\L'; -ESCAPE_SEQUENCES[0x2029] = '\\P'; - -var DEPRECATED_BOOLEANS_SYNTAX = [ - 'y', 'Y', 'yes', 'Yes', 'YES', 'on', 'On', 'ON', - 'n', 'N', 'no', 'No', 'NO', 'off', 'Off', 'OFF' -]; - -var DEPRECATED_BASE60_SYNTAX = /^[-+]?[0-9_]+(?::[0-9_]+)+(?:\.[0-9_]*)?$/; - -function compileStyleMap(schema, map) { - var result, keys, index, length, tag, style, type; - - if (map === null) return {}; - - result = {}; - keys = Object.keys(map); - - for (index = 0, length = keys.length; index < length; index += 1) { - tag = keys[index]; - style = String(map[tag]); - - if (tag.slice(0, 2) === '!!') { - tag = 'tag:yaml.org,2002:' + tag.slice(2); - } - type = schema.compiledTypeMap['fallback'][tag]; - - if (type && _hasOwnProperty$3.call(type.styleAliases, style)) { - style = type.styleAliases[style]; - } - - result[tag] = style; - } - - return result; -} - -function encodeHex(character) { - var string, handle, length; - - string = character.toString(16).toUpperCase(); - - if (character <= 0xFF) { - handle = 'x'; - length = 2; - } else if (character <= 0xFFFF) { - handle = 'u'; - length = 4; - } else if (character <= 0xFFFFFFFF) { - handle = 'U'; - length = 8; - } else { - throw new exception('code point within a string may not be greater than 0xFFFFFFFF'); - } - - return '\\' + handle + common.repeat('0', length - string.length) + string; -} - - -var QUOTING_TYPE_SINGLE = 1, - QUOTING_TYPE_DOUBLE = 2; - -function State$1(options) { - this.schema = options['schema'] || _default; - this.indent = Math.max(1, (options['indent'] || 2)); - this.noArrayIndent = options['noArrayIndent'] || false; - this.skipInvalid = options['skipInvalid'] || false; - this.flowLevel = (common.isNothing(options['flowLevel']) ? -1 : options['flowLevel']); - this.styleMap = compileStyleMap(this.schema, options['styles'] || null); - this.sortKeys = options['sortKeys'] || false; - this.lineWidth = options['lineWidth'] || 80; - this.noRefs = options['noRefs'] || false; - this.noCompatMode = options['noCompatMode'] || false; - this.condenseFlow = options['condenseFlow'] || false; - this.quotingType = options['quotingType'] === '"' ? QUOTING_TYPE_DOUBLE : QUOTING_TYPE_SINGLE; - this.forceQuotes = options['forceQuotes'] || false; - this.replacer = typeof options['replacer'] === 'function' ? options['replacer'] : null; - - this.implicitTypes = this.schema.compiledImplicit; - this.explicitTypes = this.schema.compiledExplicit; - - this.tag = null; - this.result = ''; - - this.duplicates = []; - this.usedDuplicates = null; -} - -// Indents every line in a string. Empty lines (\n only) are not indented. -function indentString(string, spaces) { - var ind = common.repeat(' ', spaces), - position = 0, - next = -1, - result = '', - line, - length = string.length; - - while (position < length) { - next = string.indexOf('\n', position); - if (next === -1) { - line = string.slice(position); - position = length; - } else { - line = string.slice(position, next + 1); - position = next + 1; - } - - if (line.length && line !== '\n') result += ind; - - result += line; - } - - return result; -} - -function generateNextLine(state, level) { - return '\n' + common.repeat(' ', state.indent * level); -} - -function testImplicitResolving(state, str) { - var index, length, type; - - for (index = 0, length = state.implicitTypes.length; index < length; index += 1) { - type = state.implicitTypes[index]; - - if (type.resolve(str)) { - return true; - } - } - - return false; -} - -// [33] s-white ::= s-space | s-tab -function isWhitespace(c) { - return c === CHAR_SPACE || c === CHAR_TAB; -} - -// Returns true if the character can be printed without escaping. -// From YAML 1.2: "any allowed characters known to be non-printable -// should also be escaped. [However,] This isn’t mandatory" -// Derived from nb-char - \t - #x85 - #xA0 - #x2028 - #x2029. -function isPrintable(c) { - return (0x00020 <= c && c <= 0x00007E) - || ((0x000A1 <= c && c <= 0x00D7FF) && c !== 0x2028 && c !== 0x2029) - || ((0x0E000 <= c && c <= 0x00FFFD) && c !== CHAR_BOM) - || (0x10000 <= c && c <= 0x10FFFF); -} - -// [34] ns-char ::= nb-char - s-white -// [27] nb-char ::= c-printable - b-char - c-byte-order-mark -// [26] b-char ::= b-line-feed | b-carriage-return -// Including s-white (for some reason, examples doesn't match specs in this aspect) -// ns-char ::= c-printable - b-line-feed - b-carriage-return - c-byte-order-mark -function isNsCharOrWhitespace(c) { - return isPrintable(c) - && c !== CHAR_BOM - // - b-char - && c !== CHAR_CARRIAGE_RETURN - && c !== CHAR_LINE_FEED; -} - -// [127] ns-plain-safe(c) ::= c = flow-out ⇒ ns-plain-safe-out -// c = flow-in ⇒ ns-plain-safe-in -// c = block-key ⇒ ns-plain-safe-out -// c = flow-key ⇒ ns-plain-safe-in -// [128] ns-plain-safe-out ::= ns-char -// [129] ns-plain-safe-in ::= ns-char - c-flow-indicator -// [130] ns-plain-char(c) ::= ( ns-plain-safe(c) - “:” - “#” ) -// | ( /* An ns-char preceding */ “#” ) -// | ( “:” /* Followed by an ns-plain-safe(c) */ ) -function isPlainSafe(c, prev, inblock) { - var cIsNsCharOrWhitespace = isNsCharOrWhitespace(c); - var cIsNsChar = cIsNsCharOrWhitespace && !isWhitespace(c); - return ( - // ns-plain-safe - inblock ? // c = flow-in - cIsNsCharOrWhitespace - : cIsNsCharOrWhitespace - // - c-flow-indicator - && c !== CHAR_COMMA - && c !== CHAR_LEFT_SQUARE_BRACKET - && c !== CHAR_RIGHT_SQUARE_BRACKET - && c !== CHAR_LEFT_CURLY_BRACKET - && c !== CHAR_RIGHT_CURLY_BRACKET - ) - // ns-plain-char - && c !== CHAR_SHARP // false on '#' - && !(prev === CHAR_COLON && !cIsNsChar) // false on ': ' - || (isNsCharOrWhitespace(prev) && !isWhitespace(prev) && c === CHAR_SHARP) // change to true on '[^ ]#' - || (prev === CHAR_COLON && cIsNsChar); // change to true on ':[^ ]' -} - -// Simplified test for values allowed as the first character in plain style. -function isPlainSafeFirst(c) { - // Uses a subset of ns-char - c-indicator - // where ns-char = nb-char - s-white. - // No support of ( ( “?” | “:” | “-” ) /* Followed by an ns-plain-safe(c)) */ ) part - return isPrintable(c) && c !== CHAR_BOM - && !isWhitespace(c) // - s-white - // - (c-indicator ::= - // “-” | “?” | “:” | “,” | “[” | “]” | “{” | “}” - && c !== CHAR_MINUS - && c !== CHAR_QUESTION - && c !== CHAR_COLON - && c !== CHAR_COMMA - && c !== CHAR_LEFT_SQUARE_BRACKET - && c !== CHAR_RIGHT_SQUARE_BRACKET - && c !== CHAR_LEFT_CURLY_BRACKET - && c !== CHAR_RIGHT_CURLY_BRACKET - // | “#” | “&” | “*” | “!” | “|” | “=” | “>” | “'” | “"” - && c !== CHAR_SHARP - && c !== CHAR_AMPERSAND - && c !== CHAR_ASTERISK - && c !== CHAR_EXCLAMATION - && c !== CHAR_VERTICAL_LINE - && c !== CHAR_EQUALS - && c !== CHAR_GREATER_THAN - && c !== CHAR_SINGLE_QUOTE - && c !== CHAR_DOUBLE_QUOTE - // | “%” | “@” | “`”) - && c !== CHAR_PERCENT - && c !== CHAR_COMMERCIAL_AT - && c !== CHAR_GRAVE_ACCENT; -} - -// Simplified test for values allowed as the last character in plain style. -function isPlainSafeLast(c) { - // just not whitespace or colon, it will be checked to be plain character later - return !isWhitespace(c) && c !== CHAR_COLON; -} - -// Same as 'string'.codePointAt(pos), but works in older browsers. -function codePointAt(string, pos) { - var first = string.charCodeAt(pos), second; - if (first >= 0xD800 && first <= 0xDBFF && pos + 1 < string.length) { - second = string.charCodeAt(pos + 1); - if (second >= 0xDC00 && second <= 0xDFFF) { - // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae - return (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000; - } - } - return first; -} - -// Determines whether block indentation indicator is required. -function needIndentIndicator(string) { - var leadingSpaceRe = /^\n* /; - return leadingSpaceRe.test(string); -} - -var STYLE_PLAIN = 1, - STYLE_SINGLE = 2, - STYLE_LITERAL = 3, - STYLE_FOLDED = 4, - STYLE_DOUBLE = 5; - -// Determines which scalar styles are possible and returns the preferred style. -// lineWidth = -1 => no limit. -// Pre-conditions: str.length > 0. -// Post-conditions: -// STYLE_PLAIN or STYLE_SINGLE => no \n are in the string. -// STYLE_LITERAL => no lines are suitable for folding (or lineWidth is -1). -// STYLE_FOLDED => a line > lineWidth and can be folded (and lineWidth != -1). -function chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth, - testAmbiguousType, quotingType, forceQuotes, inblock) { - - var i; - var char = 0; - var prevChar = null; - var hasLineBreak = false; - var hasFoldableLine = false; // only checked if shouldTrackWidth - var shouldTrackWidth = lineWidth !== -1; - var previousLineBreak = -1; // count the first line correctly - var plain = isPlainSafeFirst(codePointAt(string, 0)) - && isPlainSafeLast(codePointAt(string, string.length - 1)); - - if (singleLineOnly || forceQuotes) { - // Case: no block styles. - // Check for disallowed characters to rule out plain and single. - for (i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) { - char = codePointAt(string, i); - if (!isPrintable(char)) { - return STYLE_DOUBLE; - } - plain = plain && isPlainSafe(char, prevChar, inblock); - prevChar = char; - } - } else { - // Case: block styles permitted. - for (i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) { - char = codePointAt(string, i); - if (char === CHAR_LINE_FEED) { - hasLineBreak = true; - // Check if any line can be folded. - if (shouldTrackWidth) { - hasFoldableLine = hasFoldableLine || - // Foldable line = too long, and not more-indented. - (i - previousLineBreak - 1 > lineWidth && - string[previousLineBreak + 1] !== ' '); - previousLineBreak = i; - } - } else if (!isPrintable(char)) { - return STYLE_DOUBLE; - } - plain = plain && isPlainSafe(char, prevChar, inblock); - prevChar = char; - } - // in case the end is missing a \n - hasFoldableLine = hasFoldableLine || (shouldTrackWidth && - (i - previousLineBreak - 1 > lineWidth && - string[previousLineBreak + 1] !== ' ')); - } - // Although every style can represent \n without escaping, prefer block styles - // for multiline, since they're more readable and they don't add empty lines. - // Also prefer folding a super-long line. - if (!hasLineBreak && !hasFoldableLine) { - // Strings interpretable as another type have to be quoted; - // e.g. the string 'true' vs. the boolean true. - if (plain && !forceQuotes && !testAmbiguousType(string)) { - return STYLE_PLAIN; - } - return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE; - } - // Edge case: block indentation indicator can only have one digit. - if (indentPerLevel > 9 && needIndentIndicator(string)) { - return STYLE_DOUBLE; - } - // At this point we know block styles are valid. - // Prefer literal style unless we want to fold. - if (!forceQuotes) { - return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL; - } - return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE; -} - -// Note: line breaking/folding is implemented for only the folded style. -// NB. We drop the last trailing newline (if any) of a returned block scalar -// since the dumper adds its own newline. This always works: -// • No ending newline => unaffected; already using strip "-" chomping. -// • Ending newline => removed then restored. -// Importantly, this keeps the "+" chomp indicator from gaining an extra line. -function writeScalar(state, string, level, iskey, inblock) { - state.dump = (function () { - if (string.length === 0) { - return state.quotingType === QUOTING_TYPE_DOUBLE ? '""' : "''"; - } - if (!state.noCompatMode) { - if (DEPRECATED_BOOLEANS_SYNTAX.indexOf(string) !== -1 || DEPRECATED_BASE60_SYNTAX.test(string)) { - return state.quotingType === QUOTING_TYPE_DOUBLE ? ('"' + string + '"') : ("'" + string + "'"); - } - } - - var indent = state.indent * Math.max(1, level); // no 0-indent scalars - // As indentation gets deeper, let the width decrease monotonically - // to the lower bound min(state.lineWidth, 40). - // Note that this implies - // state.lineWidth ≤ 40 + state.indent: width is fixed at the lower bound. - // state.lineWidth > 40 + state.indent: width decreases until the lower bound. - // This behaves better than a constant minimum width which disallows narrower options, - // or an indent threshold which causes the width to suddenly increase. - var lineWidth = state.lineWidth === -1 - ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent); - - // Without knowing if keys are implicit/explicit, assume implicit for safety. - var singleLineOnly = iskey - // No block styles in flow mode. - || (state.flowLevel > -1 && level >= state.flowLevel); - function testAmbiguity(string) { - return testImplicitResolving(state, string); - } - - switch (chooseScalarStyle(string, singleLineOnly, state.indent, lineWidth, - testAmbiguity, state.quotingType, state.forceQuotes && !iskey, inblock)) { - - case STYLE_PLAIN: - return string; - case STYLE_SINGLE: - return "'" + string.replace(/'/g, "''") + "'"; - case STYLE_LITERAL: - return '|' + blockHeader(string, state.indent) - + dropEndingNewline(indentString(string, indent)); - case STYLE_FOLDED: - return '>' + blockHeader(string, state.indent) - + dropEndingNewline(indentString(foldString(string, lineWidth), indent)); - case STYLE_DOUBLE: - return '"' + escapeString(string) + '"'; - default: - throw new exception('impossible error: invalid scalar style'); - } - }()); -} - -// Pre-conditions: string is valid for a block scalar, 1 <= indentPerLevel <= 9. -function blockHeader(string, indentPerLevel) { - var indentIndicator = needIndentIndicator(string) ? String(indentPerLevel) : ''; - - // note the special case: the string '\n' counts as a "trailing" empty line. - var clip = string[string.length - 1] === '\n'; - var keep = clip && (string[string.length - 2] === '\n' || string === '\n'); - var chomp = keep ? '+' : (clip ? '' : '-'); - - return indentIndicator + chomp + '\n'; -} - -// (See the note for writeScalar.) -function dropEndingNewline(string) { - return string[string.length - 1] === '\n' ? string.slice(0, -1) : string; -} - -// Note: a long line without a suitable break point will exceed the width limit. -// Pre-conditions: every char in str isPrintable, str.length > 0, width > 0. -function foldString(string, width) { - // In folded style, $k$ consecutive newlines output as $k+1$ newlines— - // unless they're before or after a more-indented line, or at the very - // beginning or end, in which case $k$ maps to $k$. - // Therefore, parse each chunk as newline(s) followed by a content line. - var lineRe = /(\n+)([^\n]*)/g; - - // first line (possibly an empty line) - var result = (function () { - var nextLF = string.indexOf('\n'); - nextLF = nextLF !== -1 ? nextLF : string.length; - lineRe.lastIndex = nextLF; - return foldLine(string.slice(0, nextLF), width); - }()); - // If we haven't reached the first content line yet, don't add an extra \n. - var prevMoreIndented = string[0] === '\n' || string[0] === ' '; - var moreIndented; - - // rest of the lines - var match; - while ((match = lineRe.exec(string))) { - var prefix = match[1], line = match[2]; - moreIndented = (line[0] === ' '); - result += prefix - + (!prevMoreIndented && !moreIndented && line !== '' - ? '\n' : '') - + foldLine(line, width); - prevMoreIndented = moreIndented; - } - - return result; -} - -// Greedy line breaking. -// Picks the longest line under the limit each time, -// otherwise settles for the shortest line over the limit. -// NB. More-indented lines *cannot* be folded, as that would add an extra \n. -function foldLine(line, width) { - if (line === '' || line[0] === ' ') return line; - - // Since a more-indented line adds a \n, breaks can't be followed by a space. - var breakRe = / [^ ]/g; // note: the match index will always be <= length-2. - var match; - // start is an inclusive index. end, curr, and next are exclusive. - var start = 0, end, curr = 0, next = 0; - var result = ''; - - // Invariants: 0 <= start <= length-1. - // 0 <= curr <= next <= max(0, length-2). curr - start <= width. - // Inside the loop: - // A match implies length >= 2, so curr and next are <= length-2. - while ((match = breakRe.exec(line))) { - next = match.index; - // maintain invariant: curr - start <= width - if (next - start > width) { - end = (curr > start) ? curr : next; // derive end <= length-2 - result += '\n' + line.slice(start, end); - // skip the space that was output as \n - start = end + 1; // derive start <= length-1 - } - curr = next; - } - - // By the invariants, start <= length-1, so there is something left over. - // It is either the whole string or a part starting from non-whitespace. - result += '\n'; - // Insert a break if the remainder is too long and there is a break available. - if (line.length - start > width && curr > start) { - result += line.slice(start, curr) + '\n' + line.slice(curr + 1); - } else { - result += line.slice(start); - } - - return result.slice(1); // drop extra \n joiner -} - -// Escapes a double-quoted string. -function escapeString(string) { - var result = ''; - var char = 0; - var escapeSeq; - - for (var i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) { - char = codePointAt(string, i); - escapeSeq = ESCAPE_SEQUENCES[char]; - - if (!escapeSeq && isPrintable(char)) { - result += string[i]; - if (char >= 0x10000) result += string[i + 1]; - } else { - result += escapeSeq || encodeHex(char); - } - } - - return result; -} - -function writeFlowSequence(state, level, object) { - var _result = '', - _tag = state.tag, - index, - length, - value; - - for (index = 0, length = object.length; index < length; index += 1) { - value = object[index]; - - if (state.replacer) { - value = state.replacer.call(object, String(index), value); - } - - // Write only valid elements, put null instead of invalid elements. - if (writeNode(state, level, value, false, false) || - (typeof value === 'undefined' && - writeNode(state, level, null, false, false))) { - - if (_result !== '') _result += ',' + (!state.condenseFlow ? ' ' : ''); - _result += state.dump; - } - } - - state.tag = _tag; - state.dump = '[' + _result + ']'; -} - -function writeBlockSequence(state, level, object, compact) { - var _result = '', - _tag = state.tag, - index, - length, - value; - - for (index = 0, length = object.length; index < length; index += 1) { - value = object[index]; - - if (state.replacer) { - value = state.replacer.call(object, String(index), value); - } - - // Write only valid elements, put null instead of invalid elements. - if (writeNode(state, level + 1, value, true, true, false, true) || - (typeof value === 'undefined' && - writeNode(state, level + 1, null, true, true, false, true))) { - - if (!compact || _result !== '') { - _result += generateNextLine(state, level); - } - - if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { - _result += '-'; - } else { - _result += '- '; - } - - _result += state.dump; - } - } - - state.tag = _tag; - state.dump = _result || '[]'; // Empty sequence if no valid values. -} - -function writeFlowMapping(state, level, object) { - var _result = '', - _tag = state.tag, - objectKeyList = Object.keys(object), - index, - length, - objectKey, - objectValue, - pairBuffer; - - for (index = 0, length = objectKeyList.length; index < length; index += 1) { - - pairBuffer = ''; - if (_result !== '') pairBuffer += ', '; - - if (state.condenseFlow) pairBuffer += '"'; - - objectKey = objectKeyList[index]; - objectValue = object[objectKey]; - - if (state.replacer) { - objectValue = state.replacer.call(object, objectKey, objectValue); - } - - if (!writeNode(state, level, objectKey, false, false)) { - continue; // Skip this pair because of invalid key; - } - - if (state.dump.length > 1024) pairBuffer += '? '; - - pairBuffer += state.dump + (state.condenseFlow ? '"' : '') + ':' + (state.condenseFlow ? '' : ' '); - - if (!writeNode(state, level, objectValue, false, false)) { - continue; // Skip this pair because of invalid value. - } - - pairBuffer += state.dump; - - // Both key and value are valid. - _result += pairBuffer; - } - - state.tag = _tag; - state.dump = '{' + _result + '}'; -} - -function writeBlockMapping(state, level, object, compact) { - var _result = '', - _tag = state.tag, - objectKeyList = Object.keys(object), - index, - length, - objectKey, - objectValue, - explicitPair, - pairBuffer; - - // Allow sorting keys so that the output file is deterministic - if (state.sortKeys === true) { - // Default sorting - objectKeyList.sort(); - } else if (typeof state.sortKeys === 'function') { - // Custom sort function - objectKeyList.sort(state.sortKeys); - } else if (state.sortKeys) { - // Something is wrong - throw new exception('sortKeys must be a boolean or a function'); - } - - for (index = 0, length = objectKeyList.length; index < length; index += 1) { - pairBuffer = ''; - - if (!compact || _result !== '') { - pairBuffer += generateNextLine(state, level); - } - - objectKey = objectKeyList[index]; - objectValue = object[objectKey]; - - if (state.replacer) { - objectValue = state.replacer.call(object, objectKey, objectValue); - } - - if (!writeNode(state, level + 1, objectKey, true, true, true)) { - continue; // Skip this pair because of invalid key. - } - - explicitPair = (state.tag !== null && state.tag !== '?') || - (state.dump && state.dump.length > 1024); - - if (explicitPair) { - if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { - pairBuffer += '?'; - } else { - pairBuffer += '? '; - } - } - - pairBuffer += state.dump; - - if (explicitPair) { - pairBuffer += generateNextLine(state, level); - } - - if (!writeNode(state, level + 1, objectValue, true, explicitPair)) { - continue; // Skip this pair because of invalid value. - } - - if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { - pairBuffer += ':'; - } else { - pairBuffer += ': '; - } - - pairBuffer += state.dump; - - // Both key and value are valid. - _result += pairBuffer; - } - - state.tag = _tag; - state.dump = _result || '{}'; // Empty mapping if no valid pairs. -} - -function detectType(state, object, explicit) { - var _result, typeList, index, length, type, style; - - typeList = explicit ? state.explicitTypes : state.implicitTypes; - - for (index = 0, length = typeList.length; index < length; index += 1) { - type = typeList[index]; - - if ((type.instanceOf || type.predicate) && - (!type.instanceOf || ((typeof object === 'object') && (object instanceof type.instanceOf))) && - (!type.predicate || type.predicate(object))) { - - if (explicit) { - if (type.multi && type.representName) { - state.tag = type.representName(object); - } else { - state.tag = type.tag; - } - } else { - state.tag = '?'; - } - - if (type.represent) { - style = state.styleMap[type.tag] || type.defaultStyle; - - if (_toString$2.call(type.represent) === '[object Function]') { - _result = type.represent(object, style); - } else if (_hasOwnProperty$3.call(type.represent, style)) { - _result = type.represent[style](object, style); - } else { - throw new exception('!<' + type.tag + '> tag resolver accepts not "' + style + '" style'); - } - - state.dump = _result; - } - - return true; - } - } - - return false; -} - -// Serializes `object` and writes it to global `result`. -// Returns true on success, or false on invalid object. -// -function writeNode(state, level, object, block, compact, iskey, isblockseq) { - state.tag = null; - state.dump = object; - - if (!detectType(state, object, false)) { - detectType(state, object, true); - } - - var type = _toString$2.call(state.dump); - var inblock = block; - var tagStr; - - if (block) { - block = (state.flowLevel < 0 || state.flowLevel > level); - } - - var objectOrArray = type === '[object Object]' || type === '[object Array]', - duplicateIndex, - duplicate; - - if (objectOrArray) { - duplicateIndex = state.duplicates.indexOf(object); - duplicate = duplicateIndex !== -1; - } - - if ((state.tag !== null && state.tag !== '?') || duplicate || (state.indent !== 2 && level > 0)) { - compact = false; - } - - if (duplicate && state.usedDuplicates[duplicateIndex]) { - state.dump = '*ref_' + duplicateIndex; - } else { - if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) { - state.usedDuplicates[duplicateIndex] = true; - } - if (type === '[object Object]') { - if (block && (Object.keys(state.dump).length !== 0)) { - writeBlockMapping(state, level, state.dump, compact); - if (duplicate) { - state.dump = '&ref_' + duplicateIndex + state.dump; - } - } else { - writeFlowMapping(state, level, state.dump); - if (duplicate) { - state.dump = '&ref_' + duplicateIndex + ' ' + state.dump; - } - } - } else if (type === '[object Array]') { - if (block && (state.dump.length !== 0)) { - if (state.noArrayIndent && !isblockseq && level > 0) { - writeBlockSequence(state, level - 1, state.dump, compact); - } else { - writeBlockSequence(state, level, state.dump, compact); - } - if (duplicate) { - state.dump = '&ref_' + duplicateIndex + state.dump; - } - } else { - writeFlowSequence(state, level, state.dump); - if (duplicate) { - state.dump = '&ref_' + duplicateIndex + ' ' + state.dump; - } - } - } else if (type === '[object String]') { - if (state.tag !== '?') { - writeScalar(state, state.dump, level, iskey, inblock); - } - } else if (type === '[object Undefined]') { - return false; - } else { - if (state.skipInvalid) return false; - throw new exception('unacceptable kind of an object to dump ' + type); - } - - if (state.tag !== null && state.tag !== '?') { - // Need to encode all characters except those allowed by the spec: - // - // [35] ns-dec-digit ::= [#x30-#x39] /* 0-9 */ - // [36] ns-hex-digit ::= ns-dec-digit - // | [#x41-#x46] /* A-F */ | [#x61-#x66] /* a-f */ - // [37] ns-ascii-letter ::= [#x41-#x5A] /* A-Z */ | [#x61-#x7A] /* a-z */ - // [38] ns-word-char ::= ns-dec-digit | ns-ascii-letter | “-” - // [39] ns-uri-char ::= “%” ns-hex-digit ns-hex-digit | ns-word-char | “#” - // | “;” | “/” | “?” | “:” | “@” | “&” | “=” | “+” | “$” | “,” - // | “_” | “.” | “!” | “~” | “*” | “'” | “(” | “)” | “[” | “]” - // - // Also need to encode '!' because it has special meaning (end of tag prefix). - // - tagStr = encodeURI( - state.tag[0] === '!' ? state.tag.slice(1) : state.tag - ).replace(/!/g, '%21'); - - if (state.tag[0] === '!') { - tagStr = '!' + tagStr; - } else if (tagStr.slice(0, 18) === 'tag:yaml.org,2002:') { - tagStr = '!!' + tagStr.slice(18); - } else { - tagStr = '!<' + tagStr + '>'; - } - - state.dump = tagStr + ' ' + state.dump; - } - } - - return true; -} - -function getDuplicateReferences(object, state) { - var objects = [], - duplicatesIndexes = [], - index, - length; - - inspectNode(object, objects, duplicatesIndexes); - - for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) { - state.duplicates.push(objects[duplicatesIndexes[index]]); - } - state.usedDuplicates = new Array(length); -} - -function inspectNode(object, objects, duplicatesIndexes) { - var objectKeyList, - index, - length; - - if (object !== null && typeof object === 'object') { - index = objects.indexOf(object); - if (index !== -1) { - if (duplicatesIndexes.indexOf(index) === -1) { - duplicatesIndexes.push(index); - } - } else { - objects.push(object); - - if (Array.isArray(object)) { - for (index = 0, length = object.length; index < length; index += 1) { - inspectNode(object[index], objects, duplicatesIndexes); - } - } else { - objectKeyList = Object.keys(object); - - for (index = 0, length = objectKeyList.length; index < length; index += 1) { - inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes); - } - } - } - } -} - -function dump(input, options) { - options = options || {}; - - var state = new State$1(options); - - if (!state.noRefs) getDuplicateReferences(input, state); - - var value = input; - - if (state.replacer) { - value = state.replacer.call({ '': value }, '', value); - } - - if (writeNode(state, 0, value, true, true)) return state.dump + '\n'; - - return ''; -} - -var dump_1 = dump; - -var dumper = { - dump: dump_1 -}; - -function renamed(from, to) { - return function () { - throw new Error('Function yaml.' + from + ' is removed in js-yaml 4. ' + - 'Use yaml.' + to + ' instead, which is now safe by default.'); - }; -} - - -var Type$1 = type; -var Schema$1 = schema; -var FAILSAFE_SCHEMA = failsafe; -var JSON_SCHEMA = json; -var CORE_SCHEMA = core; -var DEFAULT_SCHEMA = _default; -var load$1 = loader.load; -var loadAll$1 = loader.loadAll; -var dump$1 = dumper.dump; -var YAMLException$1 = exception; - -// Removed functions from JS-YAML 3.0.x -var safeLoad = renamed('safeLoad', 'load'); -var safeLoadAll = renamed('safeLoadAll', 'loadAll'); -var safeDump = renamed('safeDump', 'dump'); - -var jsYaml = { - Type: Type$1, - Schema: Schema$1, - FAILSAFE_SCHEMA: FAILSAFE_SCHEMA, - JSON_SCHEMA: JSON_SCHEMA, - CORE_SCHEMA: CORE_SCHEMA, - DEFAULT_SCHEMA: DEFAULT_SCHEMA, - load: load$1, - loadAll: loadAll$1, - dump: dump$1, - YAMLException: YAMLException$1, - safeLoad: safeLoad, - safeLoadAll: safeLoadAll, - safeDump: safeDump -}; - -const {DEFAULT_DATE_FORMAT: DEFAULT_DATE_FORMAT$1, DATE_REGEX: DATE_REGEX$1} = constants; - - -/** - * From note-refactor-obsidian - */ -const index = class Templates { - - - findHashtags(searchText) { - return searchText.split(/\s/gm).filter((s) => { - if (s === '#') { - return false; - } - if (s.startsWith('##')) { - return false; - } - return (s.startsWith('#')) - }) - } - - isValidYaml(input) { - try { - jsYaml.dump(jsYaml.load(String(input))); - return true - } catch (error) { - return false - } - } - - replace(input, moment) { - //A regex to capture multiple matches, each with a target group ({date:YYMMDD}) and date group (YYMMDD) - const dateRegex = DATE_REGEX$1; - const customFolderString = input; - //Iterate through the matches to collect them in a single array - const matches = []; - let match; - while (match = dateRegex.exec(customFolderString)) { - matches.push(match); - } - //Return the custom folder setting value if no dates are found - if (!matches || matches.length === 0) { - return input; - } - //Transform date matches into moment formatted dates - const formattedDates = matches.map(m => { - //Default to YYYYMMDDHHmm if {{date}} is used - const dateFormat = m.groups.date === '' ? DEFAULT_DATE_FORMAT$1 : m.groups.date; - return [m.groups.target, - moment.format(dateFormat)]; - }); - - //Check to see if any date formatting is needed. If not return the unformatted setting text. - let output = customFolderString; - formattedDates.forEach(fd => { - output = output.replace(fd[0], fd[1]); - }); - return output; - } -}; -var template = index; - -var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; - -function createCommonjsModule(fn, basedir, module) { - return module = { - path: basedir, - exports: {}, - require: function (path, base) { - return commonjsRequire(path, (base === undefined || base === null) ? module.path : base); - } - }, fn(module, module.exports), module.exports; -} - -function commonjsRequire () { - throw new Error('Dynamic requires are not currently supported by @rollup/plugin-commonjs'); -} - -var moment = createCommonjsModule(function (module, exports) { -(function (global, factory) { - module.exports = factory() ; -}(commonjsGlobal, (function () { - var hookCallback; - - function hooks() { - return hookCallback.apply(null, arguments); - } - - // This is done to register the method called with moment() - // without creating circular dependencies. - function setHookCallback(callback) { - hookCallback = callback; - } - - function isArray(input) { - return ( - input instanceof Array || - Object.prototype.toString.call(input) === '[object Array]' - ); - } - - function isObject(input) { - // IE8 will treat undefined and null as object if it wasn't for - // input != null - return ( - input != null && - Object.prototype.toString.call(input) === '[object Object]' - ); - } - - function hasOwnProp(a, b) { - return Object.prototype.hasOwnProperty.call(a, b); - } - - function isObjectEmpty(obj) { - if (Object.getOwnPropertyNames) { - return Object.getOwnPropertyNames(obj).length === 0; - } else { - var k; - for (k in obj) { - if (hasOwnProp(obj, k)) { - return false; - } - } - return true; - } - } - - function isUndefined(input) { - return input === void 0; - } - - function isNumber(input) { - return ( - typeof input === 'number' || - Object.prototype.toString.call(input) === '[object Number]' - ); - } - - function isDate(input) { - return ( - input instanceof Date || - Object.prototype.toString.call(input) === '[object Date]' - ); - } - - function map(arr, fn) { - var res = [], - i; - for (i = 0; i < arr.length; ++i) { - res.push(fn(arr[i], i)); - } - return res; - } - - function extend(a, b) { - for (var i in b) { - if (hasOwnProp(b, i)) { - a[i] = b[i]; - } - } - - if (hasOwnProp(b, 'toString')) { - a.toString = b.toString; - } - - if (hasOwnProp(b, 'valueOf')) { - a.valueOf = b.valueOf; - } - - return a; - } - - function createUTC(input, format, locale, strict) { - return createLocalOrUTC(input, format, locale, strict, true).utc(); - } - - function defaultParsingFlags() { - // We need to deep clone this object. - return { - empty: false, - unusedTokens: [], - unusedInput: [], - overflow: -2, - charsLeftOver: 0, - nullInput: false, - invalidEra: null, - invalidMonth: null, - invalidFormat: false, - userInvalidated: false, - iso: false, - parsedDateParts: [], - era: null, - meridiem: null, - rfc2822: false, - weekdayMismatch: false, - }; - } - - function getParsingFlags(m) { - if (m._pf == null) { - m._pf = defaultParsingFlags(); - } - return m._pf; - } - - var some; - if (Array.prototype.some) { - some = Array.prototype.some; - } else { - some = function (fun) { - var t = Object(this), - len = t.length >>> 0, - i; - - for (i = 0; i < len; i++) { - if (i in t && fun.call(this, t[i], i, t)) { - return true; - } - } - - return false; - }; - } - - function isValid(m) { - if (m._isValid == null) { - var flags = getParsingFlags(m), - parsedParts = some.call(flags.parsedDateParts, function (i) { - return i != null; - }), - isNowValid = - !isNaN(m._d.getTime()) && - flags.overflow < 0 && - !flags.empty && - !flags.invalidEra && - !flags.invalidMonth && - !flags.invalidWeekday && - !flags.weekdayMismatch && - !flags.nullInput && - !flags.invalidFormat && - !flags.userInvalidated && - (!flags.meridiem || (flags.meridiem && parsedParts)); - - if (m._strict) { - isNowValid = - isNowValid && - flags.charsLeftOver === 0 && - flags.unusedTokens.length === 0 && - flags.bigHour === undefined; - } - - if (Object.isFrozen == null || !Object.isFrozen(m)) { - m._isValid = isNowValid; - } else { - return isNowValid; - } - } - return m._isValid; - } - - function createInvalid(flags) { - var m = createUTC(NaN); - if (flags != null) { - extend(getParsingFlags(m), flags); - } else { - getParsingFlags(m).userInvalidated = true; - } - - return m; - } - - // Plugins that add properties should also add the key here (null value), - // so we can properly clone ourselves. - var momentProperties = (hooks.momentProperties = []), - updateInProgress = false; - - function copyConfig(to, from) { - var i, prop, val; - - if (!isUndefined(from._isAMomentObject)) { - to._isAMomentObject = from._isAMomentObject; - } - if (!isUndefined(from._i)) { - to._i = from._i; - } - if (!isUndefined(from._f)) { - to._f = from._f; - } - if (!isUndefined(from._l)) { - to._l = from._l; - } - if (!isUndefined(from._strict)) { - to._strict = from._strict; - } - if (!isUndefined(from._tzm)) { - to._tzm = from._tzm; - } - if (!isUndefined(from._isUTC)) { - to._isUTC = from._isUTC; - } - if (!isUndefined(from._offset)) { - to._offset = from._offset; - } - if (!isUndefined(from._pf)) { - to._pf = getParsingFlags(from); - } - if (!isUndefined(from._locale)) { - to._locale = from._locale; - } - - if (momentProperties.length > 0) { - for (i = 0; i < momentProperties.length; i++) { - prop = momentProperties[i]; - val = from[prop]; - if (!isUndefined(val)) { - to[prop] = val; - } - } - } - - return to; - } - - // Moment prototype object - function Moment(config) { - copyConfig(this, config); - this._d = new Date(config._d != null ? config._d.getTime() : NaN); - if (!this.isValid()) { - this._d = new Date(NaN); - } - // Prevent infinite loop in case updateOffset creates new moment - // objects. - if (updateInProgress === false) { - updateInProgress = true; - hooks.updateOffset(this); - updateInProgress = false; - } - } - - function isMoment(obj) { - return ( - obj instanceof Moment || (obj != null && obj._isAMomentObject != null) - ); - } - - function warn(msg) { - if ( - hooks.suppressDeprecationWarnings === false && - typeof console !== 'undefined' && - console.warn - ) { - console.warn('Deprecation warning: ' + msg); - } - } - - function deprecate(msg, fn) { - var firstTime = true; - - return extend(function () { - if (hooks.deprecationHandler != null) { - hooks.deprecationHandler(null, msg); - } - if (firstTime) { - var args = [], - arg, - i, - key; - for (i = 0; i < arguments.length; i++) { - arg = ''; - if (typeof arguments[i] === 'object') { - arg += '\n[' + i + '] '; - for (key in arguments[0]) { - if (hasOwnProp(arguments[0], key)) { - arg += key + ': ' + arguments[0][key] + ', '; - } - } - arg = arg.slice(0, -2); // Remove trailing comma and space - } else { - arg = arguments[i]; - } - args.push(arg); - } - warn( - msg + - '\nArguments: ' + - Array.prototype.slice.call(args).join('') + - '\n' + - new Error().stack - ); - firstTime = false; - } - return fn.apply(this, arguments); - }, fn); - } - - var deprecations = {}; - - function deprecateSimple(name, msg) { - if (hooks.deprecationHandler != null) { - hooks.deprecationHandler(name, msg); - } - if (!deprecations[name]) { - warn(msg); - deprecations[name] = true; - } - } - - hooks.suppressDeprecationWarnings = false; - hooks.deprecationHandler = null; - - function isFunction(input) { - return ( - (typeof Function !== 'undefined' && input instanceof Function) || - Object.prototype.toString.call(input) === '[object Function]' - ); - } - - function set(config) { - var prop, i; - for (i in config) { - if (hasOwnProp(config, i)) { - prop = config[i]; - if (isFunction(prop)) { - this[i] = prop; - } else { - this['_' + i] = prop; - } - } - } - this._config = config; - // Lenient ordinal parsing accepts just a number in addition to - // number + (possibly) stuff coming from _dayOfMonthOrdinalParse. - // TODO: Remove "ordinalParse" fallback in next major release. - this._dayOfMonthOrdinalParseLenient = new RegExp( - (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) + - '|' + - /\d{1,2}/.source - ); - } - - function mergeConfigs(parentConfig, childConfig) { - var res = extend({}, parentConfig), - prop; - for (prop in childConfig) { - if (hasOwnProp(childConfig, prop)) { - if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) { - res[prop] = {}; - extend(res[prop], parentConfig[prop]); - extend(res[prop], childConfig[prop]); - } else if (childConfig[prop] != null) { - res[prop] = childConfig[prop]; - } else { - delete res[prop]; - } - } - } - for (prop in parentConfig) { - if ( - hasOwnProp(parentConfig, prop) && - !hasOwnProp(childConfig, prop) && - isObject(parentConfig[prop]) - ) { - // make sure changes to properties don't modify parent config - res[prop] = extend({}, res[prop]); - } - } - return res; - } - - function Locale(config) { - if (config != null) { - this.set(config); - } - } - - var keys; - - if (Object.keys) { - keys = Object.keys; - } else { - keys = function (obj) { - var i, - res = []; - for (i in obj) { - if (hasOwnProp(obj, i)) { - res.push(i); - } - } - return res; - }; - } - - var defaultCalendar = { - sameDay: '[Today at] LT', - nextDay: '[Tomorrow at] LT', - nextWeek: 'dddd [at] LT', - lastDay: '[Yesterday at] LT', - lastWeek: '[Last] dddd [at] LT', - sameElse: 'L', - }; - - function calendar(key, mom, now) { - var output = this._calendar[key] || this._calendar['sameElse']; - return isFunction(output) ? output.call(mom, now) : output; - } - - function zeroFill(number, targetLength, forceSign) { - var absNumber = '' + Math.abs(number), - zerosToFill = targetLength - absNumber.length, - sign = number >= 0; - return ( - (sign ? (forceSign ? '+' : '') : '-') + - Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + - absNumber - ); - } - - var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g, - localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g, - formatFunctions = {}, - formatTokenFunctions = {}; - - // token: 'M' - // padded: ['MM', 2] - // ordinal: 'Mo' - // callback: function () { this.month() + 1 } - function addFormatToken(token, padded, ordinal, callback) { - var func = callback; - if (typeof callback === 'string') { - func = function () { - return this[callback](); - }; - } - if (token) { - formatTokenFunctions[token] = func; - } - if (padded) { - formatTokenFunctions[padded[0]] = function () { - return zeroFill(func.apply(this, arguments), padded[1], padded[2]); - }; - } - if (ordinal) { - formatTokenFunctions[ordinal] = function () { - return this.localeData().ordinal( - func.apply(this, arguments), - token - ); - }; - } - } - - function removeFormattingTokens(input) { - if (input.match(/\[[\s\S]/)) { - return input.replace(/^\[|\]$/g, ''); - } - return input.replace(/\\/g, ''); - } - - function makeFormatFunction(format) { - var array = format.match(formattingTokens), - i, - length; - - for (i = 0, length = array.length; i < length; i++) { - if (formatTokenFunctions[array[i]]) { - array[i] = formatTokenFunctions[array[i]]; - } else { - array[i] = removeFormattingTokens(array[i]); - } - } - - return function (mom) { - var output = '', - i; - for (i = 0; i < length; i++) { - output += isFunction(array[i]) - ? array[i].call(mom, format) - : array[i]; - } - return output; - }; - } - - // format date using native date object - function formatMoment(m, format) { - if (!m.isValid()) { - return m.localeData().invalidDate(); - } - - format = expandFormat(format, m.localeData()); - formatFunctions[format] = - formatFunctions[format] || makeFormatFunction(format); - - return formatFunctions[format](m); - } - - function expandFormat(format, locale) { - var i = 5; - - function replaceLongDateFormatTokens(input) { - return locale.longDateFormat(input) || input; - } - - localFormattingTokens.lastIndex = 0; - while (i >= 0 && localFormattingTokens.test(format)) { - format = format.replace( - localFormattingTokens, - replaceLongDateFormatTokens - ); - localFormattingTokens.lastIndex = 0; - i -= 1; - } - - return format; - } - - var defaultLongDateFormat = { - LTS: 'h:mm:ss A', - LT: 'h:mm A', - L: 'MM/DD/YYYY', - LL: 'MMMM D, YYYY', - LLL: 'MMMM D, YYYY h:mm A', - LLLL: 'dddd, MMMM D, YYYY h:mm A', - }; - - function longDateFormat(key) { - var format = this._longDateFormat[key], - formatUpper = this._longDateFormat[key.toUpperCase()]; - - if (format || !formatUpper) { - return format; - } - - this._longDateFormat[key] = formatUpper - .match(formattingTokens) - .map(function (tok) { - if ( - tok === 'MMMM' || - tok === 'MM' || - tok === 'DD' || - tok === 'dddd' - ) { - return tok.slice(1); - } - return tok; - }) - .join(''); - - return this._longDateFormat[key]; - } - - var defaultInvalidDate = 'Invalid date'; - - function invalidDate() { - return this._invalidDate; - } - - var defaultOrdinal = '%d', - defaultDayOfMonthOrdinalParse = /\d{1,2}/; - - function ordinal(number) { - return this._ordinal.replace('%d', number); - } - - var defaultRelativeTime = { - future: 'in %s', - past: '%s ago', - s: 'a few seconds', - ss: '%d seconds', - m: 'a minute', - mm: '%d minutes', - h: 'an hour', - hh: '%d hours', - d: 'a day', - dd: '%d days', - w: 'a week', - ww: '%d weeks', - M: 'a month', - MM: '%d months', - y: 'a year', - yy: '%d years', - }; - - function relativeTime(number, withoutSuffix, string, isFuture) { - var output = this._relativeTime[string]; - return isFunction(output) - ? output(number, withoutSuffix, string, isFuture) - : output.replace(/%d/i, number); - } - - function pastFuture(diff, output) { - var format = this._relativeTime[diff > 0 ? 'future' : 'past']; - return isFunction(format) ? format(output) : format.replace(/%s/i, output); - } - - var aliases = {}; - - function addUnitAlias(unit, shorthand) { - var lowerCase = unit.toLowerCase(); - aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit; - } - - function normalizeUnits(units) { - return typeof units === 'string' - ? aliases[units] || aliases[units.toLowerCase()] - : undefined; - } - - function normalizeObjectUnits(inputObject) { - var normalizedInput = {}, - normalizedProp, - prop; - - for (prop in inputObject) { - if (hasOwnProp(inputObject, prop)) { - normalizedProp = normalizeUnits(prop); - if (normalizedProp) { - normalizedInput[normalizedProp] = inputObject[prop]; - } - } - } - - return normalizedInput; - } - - var priorities = {}; - - function addUnitPriority(unit, priority) { - priorities[unit] = priority; - } - - function getPrioritizedUnits(unitsObj) { - var units = [], - u; - for (u in unitsObj) { - if (hasOwnProp(unitsObj, u)) { - units.push({ unit: u, priority: priorities[u] }); - } - } - units.sort(function (a, b) { - return a.priority - b.priority; - }); - return units; - } - - function isLeapYear(year) { - return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; - } - - function absFloor(number) { - if (number < 0) { - // -0 -> 0 - return Math.ceil(number) || 0; - } else { - return Math.floor(number); - } - } - - function toInt(argumentForCoercion) { - var coercedNumber = +argumentForCoercion, - value = 0; - - if (coercedNumber !== 0 && isFinite(coercedNumber)) { - value = absFloor(coercedNumber); - } - - return value; - } - - function makeGetSet(unit, keepTime) { - return function (value) { - if (value != null) { - set$1(this, unit, value); - hooks.updateOffset(this, keepTime); - return this; - } else { - return get(this, unit); - } - }; - } - - function get(mom, unit) { - return mom.isValid() - ? mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() - : NaN; - } - - function set$1(mom, unit, value) { - if (mom.isValid() && !isNaN(value)) { - if ( - unit === 'FullYear' && - isLeapYear(mom.year()) && - mom.month() === 1 && - mom.date() === 29 - ) { - value = toInt(value); - mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit]( - value, - mom.month(), - daysInMonth(value, mom.month()) - ); - } else { - mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); - } - } - } - - // MOMENTS - - function stringGet(units) { - units = normalizeUnits(units); - if (isFunction(this[units])) { - return this[units](); - } - return this; - } - - function stringSet(units, value) { - if (typeof units === 'object') { - units = normalizeObjectUnits(units); - var prioritized = getPrioritizedUnits(units), - i; - for (i = 0; i < prioritized.length; i++) { - this[prioritized[i].unit](units[prioritized[i].unit]); - } - } else { - units = normalizeUnits(units); - if (isFunction(this[units])) { - return this[units](value); - } - } - return this; - } - - var match1 = /\d/, // 0 - 9 - match2 = /\d\d/, // 00 - 99 - match3 = /\d{3}/, // 000 - 999 - match4 = /\d{4}/, // 0000 - 9999 - match6 = /[+-]?\d{6}/, // -999999 - 999999 - match1to2 = /\d\d?/, // 0 - 99 - match3to4 = /\d\d\d\d?/, // 999 - 9999 - match5to6 = /\d\d\d\d\d\d?/, // 99999 - 999999 - match1to3 = /\d{1,3}/, // 0 - 999 - match1to4 = /\d{1,4}/, // 0 - 9999 - match1to6 = /[+-]?\d{1,6}/, // -999999 - 999999 - matchUnsigned = /\d+/, // 0 - inf - matchSigned = /[+-]?\d+/, // -inf - inf - matchOffset = /Z|[+-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z - matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi, // +00 -00 +00:00 -00:00 +0000 -0000 or Z - matchTimestamp = /[+-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123 - // any word (or two) characters or numbers including two/three word month in arabic. - // includes scottish gaelic two word and hyphenated months - matchWord = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i, - regexes; - - regexes = {}; - - function addRegexToken(token, regex, strictRegex) { - regexes[token] = isFunction(regex) - ? regex - : function (isStrict, localeData) { - return isStrict && strictRegex ? strictRegex : regex; - }; - } - - function getParseRegexForToken(token, config) { - if (!hasOwnProp(regexes, token)) { - return new RegExp(unescapeFormat(token)); - } - - return regexes[token](config._strict, config._locale); - } - - // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript - function unescapeFormat(s) { - return regexEscape( - s - .replace('\\', '') - .replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function ( - matched, - p1, - p2, - p3, - p4 - ) { - return p1 || p2 || p3 || p4; - }) - ); - } - - function regexEscape(s) { - return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); - } - - var tokens = {}; - - function addParseToken(token, callback) { - var i, - func = callback; - if (typeof token === 'string') { - token = [token]; - } - if (isNumber(callback)) { - func = function (input, array) { - array[callback] = toInt(input); - }; - } - for (i = 0; i < token.length; i++) { - tokens[token[i]] = func; - } - } - - function addWeekParseToken(token, callback) { - addParseToken(token, function (input, array, config, token) { - config._w = config._w || {}; - callback(input, config._w, config, token); - }); - } - - function addTimeToArrayFromToken(token, input, config) { - if (input != null && hasOwnProp(tokens, token)) { - tokens[token](input, config._a, config, token); - } - } - - var YEAR = 0, - MONTH = 1, - DATE = 2, - HOUR = 3, - MINUTE = 4, - SECOND = 5, - MILLISECOND = 6, - WEEK = 7, - WEEKDAY = 8; - - function mod(n, x) { - return ((n % x) + x) % x; - } - - var indexOf; - - if (Array.prototype.indexOf) { - indexOf = Array.prototype.indexOf; - } else { - indexOf = function (o) { - // I know - var i; - for (i = 0; i < this.length; ++i) { - if (this[i] === o) { - return i; - } - } - return -1; - }; - } - - function daysInMonth(year, month) { - if (isNaN(year) || isNaN(month)) { - return NaN; - } - var modMonth = mod(month, 12); - year += (month - modMonth) / 12; - return modMonth === 1 - ? isLeapYear(year) - ? 29 - : 28 - : 31 - ((modMonth % 7) % 2); - } - - // FORMATTING - - addFormatToken('M', ['MM', 2], 'Mo', function () { - return this.month() + 1; - }); - - addFormatToken('MMM', 0, 0, function (format) { - return this.localeData().monthsShort(this, format); - }); - - addFormatToken('MMMM', 0, 0, function (format) { - return this.localeData().months(this, format); - }); - - // ALIASES - - addUnitAlias('month', 'M'); - - // PRIORITY - - addUnitPriority('month', 8); - - // PARSING - - addRegexToken('M', match1to2); - addRegexToken('MM', match1to2, match2); - addRegexToken('MMM', function (isStrict, locale) { - return locale.monthsShortRegex(isStrict); - }); - addRegexToken('MMMM', function (isStrict, locale) { - return locale.monthsRegex(isStrict); - }); - - addParseToken(['M', 'MM'], function (input, array) { - array[MONTH] = toInt(input) - 1; - }); - - addParseToken(['MMM', 'MMMM'], function (input, array, config, token) { - var month = config._locale.monthsParse(input, token, config._strict); - // if we didn't find a month name, mark the date as invalid. - if (month != null) { - array[MONTH] = month; - } else { - getParsingFlags(config).invalidMonth = input; - } - }); - - // LOCALES - - var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split( - '_' - ), - defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split( - '_' - ), - MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/, - defaultMonthsShortRegex = matchWord, - defaultMonthsRegex = matchWord; - - function localeMonths(m, format) { - if (!m) { - return isArray(this._months) - ? this._months - : this._months['standalone']; - } - return isArray(this._months) - ? this._months[m.month()] - : this._months[ - (this._months.isFormat || MONTHS_IN_FORMAT).test(format) - ? 'format' - : 'standalone' - ][m.month()]; - } - - function localeMonthsShort(m, format) { - if (!m) { - return isArray(this._monthsShort) - ? this._monthsShort - : this._monthsShort['standalone']; - } - return isArray(this._monthsShort) - ? this._monthsShort[m.month()] - : this._monthsShort[ - MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone' - ][m.month()]; - } - - function handleStrictParse(monthName, format, strict) { - var i, - ii, - mom, - llc = monthName.toLocaleLowerCase(); - if (!this._monthsParse) { - // this is not used - this._monthsParse = []; - this._longMonthsParse = []; - this._shortMonthsParse = []; - for (i = 0; i < 12; ++i) { - mom = createUTC([2000, i]); - this._shortMonthsParse[i] = this.monthsShort( - mom, - '' - ).toLocaleLowerCase(); - this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase(); - } - } - - if (strict) { - if (format === 'MMM') { - ii = indexOf.call(this._shortMonthsParse, llc); - return ii !== -1 ? ii : null; - } else { - ii = indexOf.call(this._longMonthsParse, llc); - return ii !== -1 ? ii : null; - } - } else { - if (format === 'MMM') { - ii = indexOf.call(this._shortMonthsParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._longMonthsParse, llc); - return ii !== -1 ? ii : null; - } else { - ii = indexOf.call(this._longMonthsParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._shortMonthsParse, llc); - return ii !== -1 ? ii : null; - } - } - } - - function localeMonthsParse(monthName, format, strict) { - var i, mom, regex; - - if (this._monthsParseExact) { - return handleStrictParse.call(this, monthName, format, strict); - } - - if (!this._monthsParse) { - this._monthsParse = []; - this._longMonthsParse = []; - this._shortMonthsParse = []; - } - - // TODO: add sorting - // Sorting makes sure if one month (or abbr) is a prefix of another - // see sorting in computeMonthsParse - for (i = 0; i < 12; i++) { - // make the regex if we don't have it already - mom = createUTC([2000, i]); - if (strict && !this._longMonthsParse[i]) { - this._longMonthsParse[i] = new RegExp( - '^' + this.months(mom, '').replace('.', '') + '$', - 'i' - ); - this._shortMonthsParse[i] = new RegExp( - '^' + this.monthsShort(mom, '').replace('.', '') + '$', - 'i' - ); - } - if (!strict && !this._monthsParse[i]) { - regex = - '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); - this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); - } - // test the regex - if ( - strict && - format === 'MMMM' && - this._longMonthsParse[i].test(monthName) - ) { - return i; - } else if ( - strict && - format === 'MMM' && - this._shortMonthsParse[i].test(monthName) - ) { - return i; - } else if (!strict && this._monthsParse[i].test(monthName)) { - return i; - } - } - } - - // MOMENTS - - function setMonth(mom, value) { - var dayOfMonth; - - if (!mom.isValid()) { - // No op - return mom; - } - - if (typeof value === 'string') { - if (/^\d+$/.test(value)) { - value = toInt(value); - } else { - value = mom.localeData().monthsParse(value); - // TODO: Another silent failure? - if (!isNumber(value)) { - return mom; - } - } - } - - dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value)); - mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); - return mom; - } - - function getSetMonth(value) { - if (value != null) { - setMonth(this, value); - hooks.updateOffset(this, true); - return this; - } else { - return get(this, 'Month'); - } - } - - function getDaysInMonth() { - return daysInMonth(this.year(), this.month()); - } - - function monthsShortRegex(isStrict) { - if (this._monthsParseExact) { - if (!hasOwnProp(this, '_monthsRegex')) { - computeMonthsParse.call(this); - } - if (isStrict) { - return this._monthsShortStrictRegex; - } else { - return this._monthsShortRegex; - } - } else { - if (!hasOwnProp(this, '_monthsShortRegex')) { - this._monthsShortRegex = defaultMonthsShortRegex; - } - return this._monthsShortStrictRegex && isStrict - ? this._monthsShortStrictRegex - : this._monthsShortRegex; - } - } - - function monthsRegex(isStrict) { - if (this._monthsParseExact) { - if (!hasOwnProp(this, '_monthsRegex')) { - computeMonthsParse.call(this); - } - if (isStrict) { - return this._monthsStrictRegex; - } else { - return this._monthsRegex; - } - } else { - if (!hasOwnProp(this, '_monthsRegex')) { - this._monthsRegex = defaultMonthsRegex; - } - return this._monthsStrictRegex && isStrict - ? this._monthsStrictRegex - : this._monthsRegex; - } - } - - function computeMonthsParse() { - function cmpLenRev(a, b) { - return b.length - a.length; - } - - var shortPieces = [], - longPieces = [], - mixedPieces = [], - i, - mom; - for (i = 0; i < 12; i++) { - // make the regex if we don't have it already - mom = createUTC([2000, i]); - shortPieces.push(this.monthsShort(mom, '')); - longPieces.push(this.months(mom, '')); - mixedPieces.push(this.months(mom, '')); - mixedPieces.push(this.monthsShort(mom, '')); - } - // Sorting makes sure if one month (or abbr) is a prefix of another it - // will match the longer piece. - shortPieces.sort(cmpLenRev); - longPieces.sort(cmpLenRev); - mixedPieces.sort(cmpLenRev); - for (i = 0; i < 12; i++) { - shortPieces[i] = regexEscape(shortPieces[i]); - longPieces[i] = regexEscape(longPieces[i]); - } - for (i = 0; i < 24; i++) { - mixedPieces[i] = regexEscape(mixedPieces[i]); - } - - this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); - this._monthsShortRegex = this._monthsRegex; - this._monthsStrictRegex = new RegExp( - '^(' + longPieces.join('|') + ')', - 'i' - ); - this._monthsShortStrictRegex = new RegExp( - '^(' + shortPieces.join('|') + ')', - 'i' - ); - } - - // FORMATTING - - addFormatToken('Y', 0, 0, function () { - var y = this.year(); - return y <= 9999 ? zeroFill(y, 4) : '+' + y; - }); - - addFormatToken(0, ['YY', 2], 0, function () { - return this.year() % 100; - }); - - addFormatToken(0, ['YYYY', 4], 0, 'year'); - addFormatToken(0, ['YYYYY', 5], 0, 'year'); - addFormatToken(0, ['YYYYYY', 6, true], 0, 'year'); - - // ALIASES - - addUnitAlias('year', 'y'); - - // PRIORITIES - - addUnitPriority('year', 1); - - // PARSING - - addRegexToken('Y', matchSigned); - addRegexToken('YY', match1to2, match2); - addRegexToken('YYYY', match1to4, match4); - addRegexToken('YYYYY', match1to6, match6); - addRegexToken('YYYYYY', match1to6, match6); - - addParseToken(['YYYYY', 'YYYYYY'], YEAR); - addParseToken('YYYY', function (input, array) { - array[YEAR] = - input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input); - }); - addParseToken('YY', function (input, array) { - array[YEAR] = hooks.parseTwoDigitYear(input); - }); - addParseToken('Y', function (input, array) { - array[YEAR] = parseInt(input, 10); - }); - - // HELPERS - - function daysInYear(year) { - return isLeapYear(year) ? 366 : 365; - } - - // HOOKS - - hooks.parseTwoDigitYear = function (input) { - return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); - }; - - // MOMENTS - - var getSetYear = makeGetSet('FullYear', true); - - function getIsLeapYear() { - return isLeapYear(this.year()); - } - - function createDate(y, m, d, h, M, s, ms) { - // can't just apply() to create a date: - // https://stackoverflow.com/q/181348 - var date; - // the date constructor remaps years 0-99 to 1900-1999 - if (y < 100 && y >= 0) { - // preserve leap years using a full 400 year cycle, then reset - date = new Date(y + 400, m, d, h, M, s, ms); - if (isFinite(date.getFullYear())) { - date.setFullYear(y); - } - } else { - date = new Date(y, m, d, h, M, s, ms); - } - - return date; - } - - function createUTCDate(y) { - var date, args; - // the Date.UTC function remaps years 0-99 to 1900-1999 - if (y < 100 && y >= 0) { - args = Array.prototype.slice.call(arguments); - // preserve leap years using a full 400 year cycle, then reset - args[0] = y + 400; - date = new Date(Date.UTC.apply(null, args)); - if (isFinite(date.getUTCFullYear())) { - date.setUTCFullYear(y); - } - } else { - date = new Date(Date.UTC.apply(null, arguments)); - } - - return date; - } - - // start-of-first-week - start-of-year - function firstWeekOffset(year, dow, doy) { - var // first-week day -- which january is always in the first week (4 for iso, 1 for other) - fwd = 7 + dow - doy, - // first-week day local weekday -- which local weekday is fwd - fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7; - - return -fwdlw + fwd - 1; - } - - // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday - function dayOfYearFromWeeks(year, week, weekday, dow, doy) { - var localWeekday = (7 + weekday - dow) % 7, - weekOffset = firstWeekOffset(year, dow, doy), - dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset, - resYear, - resDayOfYear; - - if (dayOfYear <= 0) { - resYear = year - 1; - resDayOfYear = daysInYear(resYear) + dayOfYear; - } else if (dayOfYear > daysInYear(year)) { - resYear = year + 1; - resDayOfYear = dayOfYear - daysInYear(year); - } else { - resYear = year; - resDayOfYear = dayOfYear; - } - - return { - year: resYear, - dayOfYear: resDayOfYear, - }; - } - - function weekOfYear(mom, dow, doy) { - var weekOffset = firstWeekOffset(mom.year(), dow, doy), - week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1, - resWeek, - resYear; - - if (week < 1) { - resYear = mom.year() - 1; - resWeek = week + weeksInYear(resYear, dow, doy); - } else if (week > weeksInYear(mom.year(), dow, doy)) { - resWeek = week - weeksInYear(mom.year(), dow, doy); - resYear = mom.year() + 1; - } else { - resYear = mom.year(); - resWeek = week; - } - - return { - week: resWeek, - year: resYear, - }; - } - - function weeksInYear(year, dow, doy) { - var weekOffset = firstWeekOffset(year, dow, doy), - weekOffsetNext = firstWeekOffset(year + 1, dow, doy); - return (daysInYear(year) - weekOffset + weekOffsetNext) / 7; - } - - // FORMATTING - - addFormatToken('w', ['ww', 2], 'wo', 'week'); - addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek'); - - // ALIASES - - addUnitAlias('week', 'w'); - addUnitAlias('isoWeek', 'W'); - - // PRIORITIES - - addUnitPriority('week', 5); - addUnitPriority('isoWeek', 5); - - // PARSING - - addRegexToken('w', match1to2); - addRegexToken('ww', match1to2, match2); - addRegexToken('W', match1to2); - addRegexToken('WW', match1to2, match2); - - addWeekParseToken(['w', 'ww', 'W', 'WW'], function ( - input, - week, - config, - token - ) { - week[token.substr(0, 1)] = toInt(input); - }); - - // HELPERS - - // LOCALES - - function localeWeek(mom) { - return weekOfYear(mom, this._week.dow, this._week.doy).week; - } - - var defaultLocaleWeek = { - dow: 0, // Sunday is the first day of the week. - doy: 6, // The week that contains Jan 6th is the first week of the year. - }; - - function localeFirstDayOfWeek() { - return this._week.dow; - } - - function localeFirstDayOfYear() { - return this._week.doy; - } - - // MOMENTS - - function getSetWeek(input) { - var week = this.localeData().week(this); - return input == null ? week : this.add((input - week) * 7, 'd'); - } - - function getSetISOWeek(input) { - var week = weekOfYear(this, 1, 4).week; - return input == null ? week : this.add((input - week) * 7, 'd'); - } - - // FORMATTING - - addFormatToken('d', 0, 'do', 'day'); - - addFormatToken('dd', 0, 0, function (format) { - return this.localeData().weekdaysMin(this, format); - }); - - addFormatToken('ddd', 0, 0, function (format) { - return this.localeData().weekdaysShort(this, format); - }); - - addFormatToken('dddd', 0, 0, function (format) { - return this.localeData().weekdays(this, format); - }); - - addFormatToken('e', 0, 0, 'weekday'); - addFormatToken('E', 0, 0, 'isoWeekday'); - - // ALIASES - - addUnitAlias('day', 'd'); - addUnitAlias('weekday', 'e'); - addUnitAlias('isoWeekday', 'E'); - - // PRIORITY - addUnitPriority('day', 11); - addUnitPriority('weekday', 11); - addUnitPriority('isoWeekday', 11); - - // PARSING - - addRegexToken('d', match1to2); - addRegexToken('e', match1to2); - addRegexToken('E', match1to2); - addRegexToken('dd', function (isStrict, locale) { - return locale.weekdaysMinRegex(isStrict); - }); - addRegexToken('ddd', function (isStrict, locale) { - return locale.weekdaysShortRegex(isStrict); - }); - addRegexToken('dddd', function (isStrict, locale) { - return locale.weekdaysRegex(isStrict); - }); - - addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) { - var weekday = config._locale.weekdaysParse(input, token, config._strict); - // if we didn't get a weekday name, mark the date as invalid - if (weekday != null) { - week.d = weekday; - } else { - getParsingFlags(config).invalidWeekday = input; - } - }); - - addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) { - week[token] = toInt(input); - }); - - // HELPERS - - function parseWeekday(input, locale) { - if (typeof input !== 'string') { - return input; - } - - if (!isNaN(input)) { - return parseInt(input, 10); - } - - input = locale.weekdaysParse(input); - if (typeof input === 'number') { - return input; - } - - return null; - } - - function parseIsoWeekday(input, locale) { - if (typeof input === 'string') { - return locale.weekdaysParse(input) % 7 || 7; - } - return isNaN(input) ? null : input; - } - - // LOCALES - function shiftWeekdays(ws, n) { - return ws.slice(n, 7).concat(ws.slice(0, n)); - } - - var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split( - '_' - ), - defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), - defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), - defaultWeekdaysRegex = matchWord, - defaultWeekdaysShortRegex = matchWord, - defaultWeekdaysMinRegex = matchWord; - - function localeWeekdays(m, format) { - var weekdays = isArray(this._weekdays) - ? this._weekdays - : this._weekdays[ - m && m !== true && this._weekdays.isFormat.test(format) - ? 'format' - : 'standalone' - ]; - return m === true - ? shiftWeekdays(weekdays, this._week.dow) - : m - ? weekdays[m.day()] - : weekdays; - } - - function localeWeekdaysShort(m) { - return m === true - ? shiftWeekdays(this._weekdaysShort, this._week.dow) - : m - ? this._weekdaysShort[m.day()] - : this._weekdaysShort; - } - - function localeWeekdaysMin(m) { - return m === true - ? shiftWeekdays(this._weekdaysMin, this._week.dow) - : m - ? this._weekdaysMin[m.day()] - : this._weekdaysMin; - } - - function handleStrictParse$1(weekdayName, format, strict) { - var i, - ii, - mom, - llc = weekdayName.toLocaleLowerCase(); - if (!this._weekdaysParse) { - this._weekdaysParse = []; - this._shortWeekdaysParse = []; - this._minWeekdaysParse = []; - - for (i = 0; i < 7; ++i) { - mom = createUTC([2000, 1]).day(i); - this._minWeekdaysParse[i] = this.weekdaysMin( - mom, - '' - ).toLocaleLowerCase(); - this._shortWeekdaysParse[i] = this.weekdaysShort( - mom, - '' - ).toLocaleLowerCase(); - this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase(); - } - } - - if (strict) { - if (format === 'dddd') { - ii = indexOf.call(this._weekdaysParse, llc); - return ii !== -1 ? ii : null; - } else if (format === 'ddd') { - ii = indexOf.call(this._shortWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } else { - ii = indexOf.call(this._minWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } - } else { - if (format === 'dddd') { - ii = indexOf.call(this._weekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._shortWeekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._minWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } else if (format === 'ddd') { - ii = indexOf.call(this._shortWeekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._weekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._minWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } else { - ii = indexOf.call(this._minWeekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._weekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._shortWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } - } - } - - function localeWeekdaysParse(weekdayName, format, strict) { - var i, mom, regex; - - if (this._weekdaysParseExact) { - return handleStrictParse$1.call(this, weekdayName, format, strict); - } - - if (!this._weekdaysParse) { - this._weekdaysParse = []; - this._minWeekdaysParse = []; - this._shortWeekdaysParse = []; - this._fullWeekdaysParse = []; - } - - for (i = 0; i < 7; i++) { - // make the regex if we don't have it already - - mom = createUTC([2000, 1]).day(i); - if (strict && !this._fullWeekdaysParse[i]) { - this._fullWeekdaysParse[i] = new RegExp( - '^' + this.weekdays(mom, '').replace('.', '\\.?') + '$', - 'i' - ); - this._shortWeekdaysParse[i] = new RegExp( - '^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$', - 'i' - ); - this._minWeekdaysParse[i] = new RegExp( - '^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$', - 'i' - ); - } - if (!this._weekdaysParse[i]) { - regex = - '^' + - this.weekdays(mom, '') + - '|^' + - this.weekdaysShort(mom, '') + - '|^' + - this.weekdaysMin(mom, ''); - this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); - } - // test the regex - if ( - strict && - format === 'dddd' && - this._fullWeekdaysParse[i].test(weekdayName) - ) { - return i; - } else if ( - strict && - format === 'ddd' && - this._shortWeekdaysParse[i].test(weekdayName) - ) { - return i; - } else if ( - strict && - format === 'dd' && - this._minWeekdaysParse[i].test(weekdayName) - ) { - return i; - } else if (!strict && this._weekdaysParse[i].test(weekdayName)) { - return i; - } - } - } - - // MOMENTS - - function getSetDayOfWeek(input) { - if (!this.isValid()) { - return input != null ? this : NaN; - } - var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); - if (input != null) { - input = parseWeekday(input, this.localeData()); - return this.add(input - day, 'd'); - } else { - return day; - } - } - - function getSetLocaleDayOfWeek(input) { - if (!this.isValid()) { - return input != null ? this : NaN; - } - var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; - return input == null ? weekday : this.add(input - weekday, 'd'); - } - - function getSetISODayOfWeek(input) { - if (!this.isValid()) { - return input != null ? this : NaN; - } - - // behaves the same as moment#day except - // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) - // as a setter, sunday should belong to the previous week. - - if (input != null) { - var weekday = parseIsoWeekday(input, this.localeData()); - return this.day(this.day() % 7 ? weekday : weekday - 7); - } else { - return this.day() || 7; - } - } - - function weekdaysRegex(isStrict) { - if (this._weekdaysParseExact) { - if (!hasOwnProp(this, '_weekdaysRegex')) { - computeWeekdaysParse.call(this); - } - if (isStrict) { - return this._weekdaysStrictRegex; - } else { - return this._weekdaysRegex; - } - } else { - if (!hasOwnProp(this, '_weekdaysRegex')) { - this._weekdaysRegex = defaultWeekdaysRegex; - } - return this._weekdaysStrictRegex && isStrict - ? this._weekdaysStrictRegex - : this._weekdaysRegex; - } - } - - function weekdaysShortRegex(isStrict) { - if (this._weekdaysParseExact) { - if (!hasOwnProp(this, '_weekdaysRegex')) { - computeWeekdaysParse.call(this); - } - if (isStrict) { - return this._weekdaysShortStrictRegex; - } else { - return this._weekdaysShortRegex; - } - } else { - if (!hasOwnProp(this, '_weekdaysShortRegex')) { - this._weekdaysShortRegex = defaultWeekdaysShortRegex; - } - return this._weekdaysShortStrictRegex && isStrict - ? this._weekdaysShortStrictRegex - : this._weekdaysShortRegex; - } - } - - function weekdaysMinRegex(isStrict) { - if (this._weekdaysParseExact) { - if (!hasOwnProp(this, '_weekdaysRegex')) { - computeWeekdaysParse.call(this); - } - if (isStrict) { - return this._weekdaysMinStrictRegex; - } else { - return this._weekdaysMinRegex; - } - } else { - if (!hasOwnProp(this, '_weekdaysMinRegex')) { - this._weekdaysMinRegex = defaultWeekdaysMinRegex; - } - return this._weekdaysMinStrictRegex && isStrict - ? this._weekdaysMinStrictRegex - : this._weekdaysMinRegex; - } - } - - function computeWeekdaysParse() { - function cmpLenRev(a, b) { - return b.length - a.length; - } - - var minPieces = [], - shortPieces = [], - longPieces = [], - mixedPieces = [], - i, - mom, - minp, - shortp, - longp; - for (i = 0; i < 7; i++) { - // make the regex if we don't have it already - mom = createUTC([2000, 1]).day(i); - minp = regexEscape(this.weekdaysMin(mom, '')); - shortp = regexEscape(this.weekdaysShort(mom, '')); - longp = regexEscape(this.weekdays(mom, '')); - minPieces.push(minp); - shortPieces.push(shortp); - longPieces.push(longp); - mixedPieces.push(minp); - mixedPieces.push(shortp); - mixedPieces.push(longp); - } - // Sorting makes sure if one weekday (or abbr) is a prefix of another it - // will match the longer piece. - minPieces.sort(cmpLenRev); - shortPieces.sort(cmpLenRev); - longPieces.sort(cmpLenRev); - mixedPieces.sort(cmpLenRev); - - this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); - this._weekdaysShortRegex = this._weekdaysRegex; - this._weekdaysMinRegex = this._weekdaysRegex; - - this._weekdaysStrictRegex = new RegExp( - '^(' + longPieces.join('|') + ')', - 'i' - ); - this._weekdaysShortStrictRegex = new RegExp( - '^(' + shortPieces.join('|') + ')', - 'i' - ); - this._weekdaysMinStrictRegex = new RegExp( - '^(' + minPieces.join('|') + ')', - 'i' - ); - } - - // FORMATTING - - function hFormat() { - return this.hours() % 12 || 12; - } - - function kFormat() { - return this.hours() || 24; - } - - addFormatToken('H', ['HH', 2], 0, 'hour'); - addFormatToken('h', ['hh', 2], 0, hFormat); - addFormatToken('k', ['kk', 2], 0, kFormat); - - addFormatToken('hmm', 0, 0, function () { - return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2); - }); - - addFormatToken('hmmss', 0, 0, function () { - return ( - '' + - hFormat.apply(this) + - zeroFill(this.minutes(), 2) + - zeroFill(this.seconds(), 2) - ); - }); - - addFormatToken('Hmm', 0, 0, function () { - return '' + this.hours() + zeroFill(this.minutes(), 2); - }); - - addFormatToken('Hmmss', 0, 0, function () { - return ( - '' + - this.hours() + - zeroFill(this.minutes(), 2) + - zeroFill(this.seconds(), 2) - ); - }); - - function meridiem(token, lowercase) { - addFormatToken(token, 0, 0, function () { - return this.localeData().meridiem( - this.hours(), - this.minutes(), - lowercase - ); - }); - } - - meridiem('a', true); - meridiem('A', false); - - // ALIASES - - addUnitAlias('hour', 'h'); - - // PRIORITY - addUnitPriority('hour', 13); - - // PARSING - - function matchMeridiem(isStrict, locale) { - return locale._meridiemParse; - } - - addRegexToken('a', matchMeridiem); - addRegexToken('A', matchMeridiem); - addRegexToken('H', match1to2); - addRegexToken('h', match1to2); - addRegexToken('k', match1to2); - addRegexToken('HH', match1to2, match2); - addRegexToken('hh', match1to2, match2); - addRegexToken('kk', match1to2, match2); - - addRegexToken('hmm', match3to4); - addRegexToken('hmmss', match5to6); - addRegexToken('Hmm', match3to4); - addRegexToken('Hmmss', match5to6); - - addParseToken(['H', 'HH'], HOUR); - addParseToken(['k', 'kk'], function (input, array, config) { - var kInput = toInt(input); - array[HOUR] = kInput === 24 ? 0 : kInput; - }); - addParseToken(['a', 'A'], function (input, array, config) { - config._isPm = config._locale.isPM(input); - config._meridiem = input; - }); - addParseToken(['h', 'hh'], function (input, array, config) { - array[HOUR] = toInt(input); - getParsingFlags(config).bigHour = true; - }); - addParseToken('hmm', function (input, array, config) { - var pos = input.length - 2; - array[HOUR] = toInt(input.substr(0, pos)); - array[MINUTE] = toInt(input.substr(pos)); - getParsingFlags(config).bigHour = true; - }); - addParseToken('hmmss', function (input, array, config) { - var pos1 = input.length - 4, - pos2 = input.length - 2; - array[HOUR] = toInt(input.substr(0, pos1)); - array[MINUTE] = toInt(input.substr(pos1, 2)); - array[SECOND] = toInt(input.substr(pos2)); - getParsingFlags(config).bigHour = true; - }); - addParseToken('Hmm', function (input, array, config) { - var pos = input.length - 2; - array[HOUR] = toInt(input.substr(0, pos)); - array[MINUTE] = toInt(input.substr(pos)); - }); - addParseToken('Hmmss', function (input, array, config) { - var pos1 = input.length - 4, - pos2 = input.length - 2; - array[HOUR] = toInt(input.substr(0, pos1)); - array[MINUTE] = toInt(input.substr(pos1, 2)); - array[SECOND] = toInt(input.substr(pos2)); - }); - - // LOCALES - - function localeIsPM(input) { - // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays - // Using charAt should be more compatible. - return (input + '').toLowerCase().charAt(0) === 'p'; - } - - var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i, - // Setting the hour should keep the time, because the user explicitly - // specified which hour they want. So trying to maintain the same hour (in - // a new timezone) makes sense. Adding/subtracting hours does not follow - // this rule. - getSetHour = makeGetSet('Hours', true); - - function localeMeridiem(hours, minutes, isLower) { - if (hours > 11) { - return isLower ? 'pm' : 'PM'; - } else { - return isLower ? 'am' : 'AM'; - } - } - - var baseConfig = { - calendar: defaultCalendar, - longDateFormat: defaultLongDateFormat, - invalidDate: defaultInvalidDate, - ordinal: defaultOrdinal, - dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse, - relativeTime: defaultRelativeTime, - - months: defaultLocaleMonths, - monthsShort: defaultLocaleMonthsShort, - - week: defaultLocaleWeek, - - weekdays: defaultLocaleWeekdays, - weekdaysMin: defaultLocaleWeekdaysMin, - weekdaysShort: defaultLocaleWeekdaysShort, - - meridiemParse: defaultLocaleMeridiemParse, - }; - - // internal storage for locale config files - var locales = {}, - localeFamilies = {}, - globalLocale; - - function commonPrefix(arr1, arr2) { - var i, - minl = Math.min(arr1.length, arr2.length); - for (i = 0; i < minl; i += 1) { - if (arr1[i] !== arr2[i]) { - return i; - } - } - return minl; - } - - function normalizeLocale(key) { - return key ? key.toLowerCase().replace('_', '-') : key; - } - - // pick the locale from the array - // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each - // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root - function chooseLocale(names) { - var i = 0, - j, - next, - locale, - split; - - while (i < names.length) { - split = normalizeLocale(names[i]).split('-'); - j = split.length; - next = normalizeLocale(names[i + 1]); - next = next ? next.split('-') : null; - while (j > 0) { - locale = loadLocale(split.slice(0, j).join('-')); - if (locale) { - return locale; - } - if ( - next && - next.length >= j && - commonPrefix(split, next) >= j - 1 - ) { - //the next array item is better than a shallower substring of this one - break; - } - j--; - } - i++; - } - return globalLocale; - } - - function loadLocale(name) { - var oldLocale = null, - aliasedRequire; - // TODO: Find a better way to register and load all the locales in Node - if ( - locales[name] === undefined && - 'object' !== 'undefined' && - module && - module.exports - ) { - try { - oldLocale = globalLocale._abbr; - aliasedRequire = commonjsRequire; - aliasedRequire('./locale/' + name); - getSetGlobalLocale(oldLocale); - } catch (e) { - // mark as not found to avoid repeating expensive file require call causing high CPU - // when trying to find en-US, en_US, en-us for every format call - locales[name] = null; // null means not found - } - } - return locales[name]; - } - - // This function will load locale and then set the global locale. If - // no arguments are passed in, it will simply return the current global - // locale key. - function getSetGlobalLocale(key, values) { - var data; - if (key) { - if (isUndefined(values)) { - data = getLocale(key); - } else { - data = defineLocale(key, values); - } - - if (data) { - // moment.duration._locale = moment._locale = data; - globalLocale = data; - } else { - if (typeof console !== 'undefined' && console.warn) { - //warn user if arguments are passed but the locale could not be set - console.warn( - 'Locale ' + key + ' not found. Did you forget to load it?' - ); - } - } - } - - return globalLocale._abbr; - } - - function defineLocale(name, config) { - if (config !== null) { - var locale, - parentConfig = baseConfig; - config.abbr = name; - if (locales[name] != null) { - deprecateSimple( - 'defineLocaleOverride', - 'use moment.updateLocale(localeName, config) to change ' + - 'an existing locale. moment.defineLocale(localeName, ' + - 'config) should only be used for creating a new locale ' + - 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.' - ); - parentConfig = locales[name]._config; - } else if (config.parentLocale != null) { - if (locales[config.parentLocale] != null) { - parentConfig = locales[config.parentLocale]._config; - } else { - locale = loadLocale(config.parentLocale); - if (locale != null) { - parentConfig = locale._config; - } else { - if (!localeFamilies[config.parentLocale]) { - localeFamilies[config.parentLocale] = []; - } - localeFamilies[config.parentLocale].push({ - name: name, - config: config, - }); - return null; - } - } - } - locales[name] = new Locale(mergeConfigs(parentConfig, config)); - - if (localeFamilies[name]) { - localeFamilies[name].forEach(function (x) { - defineLocale(x.name, x.config); - }); - } - - // backwards compat for now: also set the locale - // make sure we set the locale AFTER all child locales have been - // created, so we won't end up with the child locale set. - getSetGlobalLocale(name); - - return locales[name]; - } else { - // useful for testing - delete locales[name]; - return null; - } - } - - function updateLocale(name, config) { - if (config != null) { - var locale, - tmpLocale, - parentConfig = baseConfig; - - if (locales[name] != null && locales[name].parentLocale != null) { - // Update existing child locale in-place to avoid memory-leaks - locales[name].set(mergeConfigs(locales[name]._config, config)); - } else { - // MERGE - tmpLocale = loadLocale(name); - if (tmpLocale != null) { - parentConfig = tmpLocale._config; - } - config = mergeConfigs(parentConfig, config); - if (tmpLocale == null) { - // updateLocale is called for creating a new locale - // Set abbr so it will have a name (getters return - // undefined otherwise). - config.abbr = name; - } - locale = new Locale(config); - locale.parentLocale = locales[name]; - locales[name] = locale; - } - - // backwards compat for now: also set the locale - getSetGlobalLocale(name); - } else { - // pass null for config to unupdate, useful for tests - if (locales[name] != null) { - if (locales[name].parentLocale != null) { - locales[name] = locales[name].parentLocale; - if (name === getSetGlobalLocale()) { - getSetGlobalLocale(name); - } - } else if (locales[name] != null) { - delete locales[name]; - } - } - } - return locales[name]; - } - - // returns locale data - function getLocale(key) { - var locale; - - if (key && key._locale && key._locale._abbr) { - key = key._locale._abbr; - } - - if (!key) { - return globalLocale; - } - - if (!isArray(key)) { - //short-circuit everything else - locale = loadLocale(key); - if (locale) { - return locale; - } - key = [key]; - } - - return chooseLocale(key); - } - - function listLocales() { - return keys(locales); - } - - function checkOverflow(m) { - var overflow, - a = m._a; - - if (a && getParsingFlags(m).overflow === -2) { - overflow = - a[MONTH] < 0 || a[MONTH] > 11 - ? MONTH - : a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) - ? DATE - : a[HOUR] < 0 || - a[HOUR] > 24 || - (a[HOUR] === 24 && - (a[MINUTE] !== 0 || - a[SECOND] !== 0 || - a[MILLISECOND] !== 0)) - ? HOUR - : a[MINUTE] < 0 || a[MINUTE] > 59 - ? MINUTE - : a[SECOND] < 0 || a[SECOND] > 59 - ? SECOND - : a[MILLISECOND] < 0 || a[MILLISECOND] > 999 - ? MILLISECOND - : -1; - - if ( - getParsingFlags(m)._overflowDayOfYear && - (overflow < YEAR || overflow > DATE) - ) { - overflow = DATE; - } - if (getParsingFlags(m)._overflowWeeks && overflow === -1) { - overflow = WEEK; - } - if (getParsingFlags(m)._overflowWeekday && overflow === -1) { - overflow = WEEKDAY; - } - - getParsingFlags(m).overflow = overflow; - } - - return m; - } - - // iso 8601 regex - // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) - var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/, - basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/, - tzRegex = /Z|[+-]\d\d(?::?\d\d)?/, - isoDates = [ - ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/], - ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/], - ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/], - ['GGGG-[W]WW', /\d{4}-W\d\d/, false], - ['YYYY-DDD', /\d{4}-\d{3}/], - ['YYYY-MM', /\d{4}-\d\d/, false], - ['YYYYYYMMDD', /[+-]\d{10}/], - ['YYYYMMDD', /\d{8}/], - ['GGGG[W]WWE', /\d{4}W\d{3}/], - ['GGGG[W]WW', /\d{4}W\d{2}/, false], - ['YYYYDDD', /\d{7}/], - ['YYYYMM', /\d{6}/, false], - ['YYYY', /\d{4}/, false], - ], - // iso time formats and regexes - isoTimes = [ - ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/], - ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/], - ['HH:mm:ss', /\d\d:\d\d:\d\d/], - ['HH:mm', /\d\d:\d\d/], - ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/], - ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/], - ['HHmmss', /\d\d\d\d\d\d/], - ['HHmm', /\d\d\d\d/], - ['HH', /\d\d/], - ], - aspNetJsonRegex = /^\/?Date\((-?\d+)/i, - // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3 - rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/, - obsOffsets = { - UT: 0, - GMT: 0, - EDT: -4 * 60, - EST: -5 * 60, - CDT: -5 * 60, - CST: -6 * 60, - MDT: -6 * 60, - MST: -7 * 60, - PDT: -7 * 60, - PST: -8 * 60, - }; - - // date from iso format - function configFromISO(config) { - var i, - l, - string = config._i, - match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string), - allowTime, - dateFormat, - timeFormat, - tzFormat; - - if (match) { - getParsingFlags(config).iso = true; - - for (i = 0, l = isoDates.length; i < l; i++) { - if (isoDates[i][1].exec(match[1])) { - dateFormat = isoDates[i][0]; - allowTime = isoDates[i][2] !== false; - break; - } - } - if (dateFormat == null) { - config._isValid = false; - return; - } - if (match[3]) { - for (i = 0, l = isoTimes.length; i < l; i++) { - if (isoTimes[i][1].exec(match[3])) { - // match[2] should be 'T' or space - timeFormat = (match[2] || ' ') + isoTimes[i][0]; - break; - } - } - if (timeFormat == null) { - config._isValid = false; - return; - } - } - if (!allowTime && timeFormat != null) { - config._isValid = false; - return; - } - if (match[4]) { - if (tzRegex.exec(match[4])) { - tzFormat = 'Z'; - } else { - config._isValid = false; - return; - } - } - config._f = dateFormat + (timeFormat || '') + (tzFormat || ''); - configFromStringAndFormat(config); - } else { - config._isValid = false; - } - } - - function extractFromRFC2822Strings( - yearStr, - monthStr, - dayStr, - hourStr, - minuteStr, - secondStr - ) { - var result = [ - untruncateYear(yearStr), - defaultLocaleMonthsShort.indexOf(monthStr), - parseInt(dayStr, 10), - parseInt(hourStr, 10), - parseInt(minuteStr, 10), - ]; - - if (secondStr) { - result.push(parseInt(secondStr, 10)); - } - - return result; - } - - function untruncateYear(yearStr) { - var year = parseInt(yearStr, 10); - if (year <= 49) { - return 2000 + year; - } else if (year <= 999) { - return 1900 + year; - } - return year; - } - - function preprocessRFC2822(s) { - // Remove comments and folding whitespace and replace multiple-spaces with a single space - return s - .replace(/\([^)]*\)|[\n\t]/g, ' ') - .replace(/(\s\s+)/g, ' ') - .replace(/^\s\s*/, '') - .replace(/\s\s*$/, ''); - } - - function checkWeekday(weekdayStr, parsedInput, config) { - if (weekdayStr) { - // TODO: Replace the vanilla JS Date object with an independent day-of-week check. - var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr), - weekdayActual = new Date( - parsedInput[0], - parsedInput[1], - parsedInput[2] - ).getDay(); - if (weekdayProvided !== weekdayActual) { - getParsingFlags(config).weekdayMismatch = true; - config._isValid = false; - return false; - } - } - return true; - } - - function calculateOffset(obsOffset, militaryOffset, numOffset) { - if (obsOffset) { - return obsOffsets[obsOffset]; - } else if (militaryOffset) { - // the only allowed military tz is Z - return 0; - } else { - var hm = parseInt(numOffset, 10), - m = hm % 100, - h = (hm - m) / 100; - return h * 60 + m; - } - } - - // date and time from ref 2822 format - function configFromRFC2822(config) { - var match = rfc2822.exec(preprocessRFC2822(config._i)), - parsedArray; - if (match) { - parsedArray = extractFromRFC2822Strings( - match[4], - match[3], - match[2], - match[5], - match[6], - match[7] - ); - if (!checkWeekday(match[1], parsedArray, config)) { - return; - } - - config._a = parsedArray; - config._tzm = calculateOffset(match[8], match[9], match[10]); - - config._d = createUTCDate.apply(null, config._a); - config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); - - getParsingFlags(config).rfc2822 = true; - } else { - config._isValid = false; - } - } - - // date from 1) ASP.NET, 2) ISO, 3) RFC 2822 formats, or 4) optional fallback if parsing isn't strict - function configFromString(config) { - var matched = aspNetJsonRegex.exec(config._i); - if (matched !== null) { - config._d = new Date(+matched[1]); - return; - } - - configFromISO(config); - if (config._isValid === false) { - delete config._isValid; - } else { - return; - } - - configFromRFC2822(config); - if (config._isValid === false) { - delete config._isValid; - } else { - return; - } - - if (config._strict) { - config._isValid = false; - } else { - // Final attempt, use Input Fallback - hooks.createFromInputFallback(config); - } - } - - hooks.createFromInputFallback = deprecate( - 'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' + - 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' + - 'discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.', - function (config) { - config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); - } - ); - - // Pick the first defined of two or three arguments. - function defaults(a, b, c) { - if (a != null) { - return a; - } - if (b != null) { - return b; - } - return c; - } - - function currentDateArray(config) { - // hooks is actually the exported moment object - var nowValue = new Date(hooks.now()); - if (config._useUTC) { - return [ - nowValue.getUTCFullYear(), - nowValue.getUTCMonth(), - nowValue.getUTCDate(), - ]; - } - return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()]; - } - - // convert an array to a date. - // the array should mirror the parameters below - // note: all values past the year are optional and will default to the lowest possible value. - // [year, month, day , hour, minute, second, millisecond] - function configFromArray(config) { - var i, - date, - input = [], - currentDate, - expectedWeekday, - yearToUse; - - if (config._d) { - return; - } - - currentDate = currentDateArray(config); - - //compute day of the year from weeks and weekdays - if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { - dayOfYearFromWeekInfo(config); - } - - //if the day of the year is set, figure out what it is - if (config._dayOfYear != null) { - yearToUse = defaults(config._a[YEAR], currentDate[YEAR]); - - if ( - config._dayOfYear > daysInYear(yearToUse) || - config._dayOfYear === 0 - ) { - getParsingFlags(config)._overflowDayOfYear = true; - } - - date = createUTCDate(yearToUse, 0, config._dayOfYear); - config._a[MONTH] = date.getUTCMonth(); - config._a[DATE] = date.getUTCDate(); - } - - // Default to current date. - // * if no year, month, day of month are given, default to today - // * if day of month is given, default month and year - // * if month is given, default only year - // * if year is given, don't default anything - for (i = 0; i < 3 && config._a[i] == null; ++i) { - config._a[i] = input[i] = currentDate[i]; - } - - // Zero out whatever was not defaulted, including time - for (; i < 7; i++) { - config._a[i] = input[i] = - config._a[i] == null ? (i === 2 ? 1 : 0) : config._a[i]; - } - - // Check for 24:00:00.000 - if ( - config._a[HOUR] === 24 && - config._a[MINUTE] === 0 && - config._a[SECOND] === 0 && - config._a[MILLISECOND] === 0 - ) { - config._nextDay = true; - config._a[HOUR] = 0; - } - - config._d = (config._useUTC ? createUTCDate : createDate).apply( - null, - input - ); - expectedWeekday = config._useUTC - ? config._d.getUTCDay() - : config._d.getDay(); - - // Apply timezone offset from input. The actual utcOffset can be changed - // with parseZone. - if (config._tzm != null) { - config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); - } - - if (config._nextDay) { - config._a[HOUR] = 24; - } - - // check for mismatching day of week - if ( - config._w && - typeof config._w.d !== 'undefined' && - config._w.d !== expectedWeekday - ) { - getParsingFlags(config).weekdayMismatch = true; - } - } - - function dayOfYearFromWeekInfo(config) { - var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow, curWeek; - - w = config._w; - if (w.GG != null || w.W != null || w.E != null) { - dow = 1; - doy = 4; - - // TODO: We need to take the current isoWeekYear, but that depends on - // how we interpret now (local, utc, fixed offset). So create - // a now version of current config (take local/utc/offset flags, and - // create now). - weekYear = defaults( - w.GG, - config._a[YEAR], - weekOfYear(createLocal(), 1, 4).year - ); - week = defaults(w.W, 1); - weekday = defaults(w.E, 1); - if (weekday < 1 || weekday > 7) { - weekdayOverflow = true; - } - } else { - dow = config._locale._week.dow; - doy = config._locale._week.doy; - - curWeek = weekOfYear(createLocal(), dow, doy); - - weekYear = defaults(w.gg, config._a[YEAR], curWeek.year); - - // Default to current week. - week = defaults(w.w, curWeek.week); - - if (w.d != null) { - // weekday -- low day numbers are considered next week - weekday = w.d; - if (weekday < 0 || weekday > 6) { - weekdayOverflow = true; - } - } else if (w.e != null) { - // local weekday -- counting starts from beginning of week - weekday = w.e + dow; - if (w.e < 0 || w.e > 6) { - weekdayOverflow = true; - } - } else { - // default to beginning of week - weekday = dow; - } - } - if (week < 1 || week > weeksInYear(weekYear, dow, doy)) { - getParsingFlags(config)._overflowWeeks = true; - } else if (weekdayOverflow != null) { - getParsingFlags(config)._overflowWeekday = true; - } else { - temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy); - config._a[YEAR] = temp.year; - config._dayOfYear = temp.dayOfYear; - } - } - - // constant that refers to the ISO standard - hooks.ISO_8601 = function () {}; - - // constant that refers to the RFC 2822 form - hooks.RFC_2822 = function () {}; - - // date from string and format string - function configFromStringAndFormat(config) { - // TODO: Move this to another part of the creation flow to prevent circular deps - if (config._f === hooks.ISO_8601) { - configFromISO(config); - return; - } - if (config._f === hooks.RFC_2822) { - configFromRFC2822(config); - return; - } - config._a = []; - getParsingFlags(config).empty = true; - - // This array is used to make a Date, either with `new Date` or `Date.UTC` - var string = '' + config._i, - i, - parsedInput, - tokens, - token, - skipped, - stringLength = string.length, - totalParsedInputLength = 0, - era; - - tokens = - expandFormat(config._f, config._locale).match(formattingTokens) || []; - - for (i = 0; i < tokens.length; i++) { - token = tokens[i]; - parsedInput = (string.match(getParseRegexForToken(token, config)) || - [])[0]; - if (parsedInput) { - skipped = string.substr(0, string.indexOf(parsedInput)); - if (skipped.length > 0) { - getParsingFlags(config).unusedInput.push(skipped); - } - string = string.slice( - string.indexOf(parsedInput) + parsedInput.length - ); - totalParsedInputLength += parsedInput.length; - } - // don't parse if it's not a known token - if (formatTokenFunctions[token]) { - if (parsedInput) { - getParsingFlags(config).empty = false; - } else { - getParsingFlags(config).unusedTokens.push(token); - } - addTimeToArrayFromToken(token, parsedInput, config); - } else if (config._strict && !parsedInput) { - getParsingFlags(config).unusedTokens.push(token); - } - } - - // add remaining unparsed input length to the string - getParsingFlags(config).charsLeftOver = - stringLength - totalParsedInputLength; - if (string.length > 0) { - getParsingFlags(config).unusedInput.push(string); - } - - // clear _12h flag if hour is <= 12 - if ( - config._a[HOUR] <= 12 && - getParsingFlags(config).bigHour === true && - config._a[HOUR] > 0 - ) { - getParsingFlags(config).bigHour = undefined; - } - - getParsingFlags(config).parsedDateParts = config._a.slice(0); - getParsingFlags(config).meridiem = config._meridiem; - // handle meridiem - config._a[HOUR] = meridiemFixWrap( - config._locale, - config._a[HOUR], - config._meridiem - ); - - // handle era - era = getParsingFlags(config).era; - if (era !== null) { - config._a[YEAR] = config._locale.erasConvertYear(era, config._a[YEAR]); - } - - configFromArray(config); - checkOverflow(config); - } - - function meridiemFixWrap(locale, hour, meridiem) { - var isPm; - - if (meridiem == null) { - // nothing to do - return hour; - } - if (locale.meridiemHour != null) { - return locale.meridiemHour(hour, meridiem); - } else if (locale.isPM != null) { - // Fallback - isPm = locale.isPM(meridiem); - if (isPm && hour < 12) { - hour += 12; - } - if (!isPm && hour === 12) { - hour = 0; - } - return hour; - } else { - // this is not supposed to happen - return hour; - } - } - - // date from string and array of format strings - function configFromStringAndArray(config) { - var tempConfig, - bestMoment, - scoreToBeat, - i, - currentScore, - validFormatFound, - bestFormatIsValid = false; - - if (config._f.length === 0) { - getParsingFlags(config).invalidFormat = true; - config._d = new Date(NaN); - return; - } - - for (i = 0; i < config._f.length; i++) { - currentScore = 0; - validFormatFound = false; - tempConfig = copyConfig({}, config); - if (config._useUTC != null) { - tempConfig._useUTC = config._useUTC; - } - tempConfig._f = config._f[i]; - configFromStringAndFormat(tempConfig); - - if (isValid(tempConfig)) { - validFormatFound = true; - } - - // if there is any input that was not parsed add a penalty for that format - currentScore += getParsingFlags(tempConfig).charsLeftOver; - - //or tokens - currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10; - - getParsingFlags(tempConfig).score = currentScore; - - if (!bestFormatIsValid) { - if ( - scoreToBeat == null || - currentScore < scoreToBeat || - validFormatFound - ) { - scoreToBeat = currentScore; - bestMoment = tempConfig; - if (validFormatFound) { - bestFormatIsValid = true; - } - } - } else { - if (currentScore < scoreToBeat) { - scoreToBeat = currentScore; - bestMoment = tempConfig; - } - } - } - - extend(config, bestMoment || tempConfig); - } - - function configFromObject(config) { - if (config._d) { - return; - } - - var i = normalizeObjectUnits(config._i), - dayOrDate = i.day === undefined ? i.date : i.day; - config._a = map( - [i.year, i.month, dayOrDate, i.hour, i.minute, i.second, i.millisecond], - function (obj) { - return obj && parseInt(obj, 10); - } - ); - - configFromArray(config); - } - - function createFromConfig(config) { - var res = new Moment(checkOverflow(prepareConfig(config))); - if (res._nextDay) { - // Adding is smart enough around DST - res.add(1, 'd'); - res._nextDay = undefined; - } - - return res; - } - - function prepareConfig(config) { - var input = config._i, - format = config._f; - - config._locale = config._locale || getLocale(config._l); - - if (input === null || (format === undefined && input === '')) { - return createInvalid({ nullInput: true }); - } - - if (typeof input === 'string') { - config._i = input = config._locale.preparse(input); - } - - if (isMoment(input)) { - return new Moment(checkOverflow(input)); - } else if (isDate(input)) { - config._d = input; - } else if (isArray(format)) { - configFromStringAndArray(config); - } else if (format) { - configFromStringAndFormat(config); - } else { - configFromInput(config); - } - - if (!isValid(config)) { - config._d = null; - } - - return config; - } - - function configFromInput(config) { - var input = config._i; - if (isUndefined(input)) { - config._d = new Date(hooks.now()); - } else if (isDate(input)) { - config._d = new Date(input.valueOf()); - } else if (typeof input === 'string') { - configFromString(config); - } else if (isArray(input)) { - config._a = map(input.slice(0), function (obj) { - return parseInt(obj, 10); - }); - configFromArray(config); - } else if (isObject(input)) { - configFromObject(config); - } else if (isNumber(input)) { - // from milliseconds - config._d = new Date(input); - } else { - hooks.createFromInputFallback(config); - } - } - - function createLocalOrUTC(input, format, locale, strict, isUTC) { - var c = {}; - - if (format === true || format === false) { - strict = format; - format = undefined; - } - - if (locale === true || locale === false) { - strict = locale; - locale = undefined; - } - - if ( - (isObject(input) && isObjectEmpty(input)) || - (isArray(input) && input.length === 0) - ) { - input = undefined; - } - // object construction must be done this way. - // https://github.com/moment/moment/issues/1423 - c._isAMomentObject = true; - c._useUTC = c._isUTC = isUTC; - c._l = locale; - c._i = input; - c._f = format; - c._strict = strict; - - return createFromConfig(c); - } - - function createLocal(input, format, locale, strict) { - return createLocalOrUTC(input, format, locale, strict, false); - } - - var prototypeMin = deprecate( - 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/', - function () { - var other = createLocal.apply(null, arguments); - if (this.isValid() && other.isValid()) { - return other < this ? this : other; - } else { - return createInvalid(); - } - } - ), - prototypeMax = deprecate( - 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/', - function () { - var other = createLocal.apply(null, arguments); - if (this.isValid() && other.isValid()) { - return other > this ? this : other; - } else { - return createInvalid(); - } - } - ); - - // Pick a moment m from moments so that m[fn](other) is true for all - // other. This relies on the function fn to be transitive. - // - // moments should either be an array of moment objects or an array, whose - // first element is an array of moment objects. - function pickBy(fn, moments) { - var res, i; - if (moments.length === 1 && isArray(moments[0])) { - moments = moments[0]; - } - if (!moments.length) { - return createLocal(); - } - res = moments[0]; - for (i = 1; i < moments.length; ++i) { - if (!moments[i].isValid() || moments[i][fn](res)) { - res = moments[i]; - } - } - return res; - } - - // TODO: Use [].sort instead? - function min() { - var args = [].slice.call(arguments, 0); - - return pickBy('isBefore', args); - } - - function max() { - var args = [].slice.call(arguments, 0); - - return pickBy('isAfter', args); - } - - var now = function () { - return Date.now ? Date.now() : +new Date(); - }; - - var ordering = [ - 'year', - 'quarter', - 'month', - 'week', - 'day', - 'hour', - 'minute', - 'second', - 'millisecond', - ]; - - function isDurationValid(m) { - var key, - unitHasDecimal = false, - i; - for (key in m) { - if ( - hasOwnProp(m, key) && - !( - indexOf.call(ordering, key) !== -1 && - (m[key] == null || !isNaN(m[key])) - ) - ) { - return false; - } - } - - for (i = 0; i < ordering.length; ++i) { - if (m[ordering[i]]) { - if (unitHasDecimal) { - return false; // only allow non-integers for smallest unit - } - if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) { - unitHasDecimal = true; - } - } - } - - return true; - } - - function isValid$1() { - return this._isValid; - } - - function createInvalid$1() { - return createDuration(NaN); - } - - function Duration(duration) { - var normalizedInput = normalizeObjectUnits(duration), - years = normalizedInput.year || 0, - quarters = normalizedInput.quarter || 0, - months = normalizedInput.month || 0, - weeks = normalizedInput.week || normalizedInput.isoWeek || 0, - days = normalizedInput.day || 0, - hours = normalizedInput.hour || 0, - minutes = normalizedInput.minute || 0, - seconds = normalizedInput.second || 0, - milliseconds = normalizedInput.millisecond || 0; - - this._isValid = isDurationValid(normalizedInput); - - // representation for dateAddRemove - this._milliseconds = - +milliseconds + - seconds * 1e3 + // 1000 - minutes * 6e4 + // 1000 * 60 - hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978 - // Because of dateAddRemove treats 24 hours as different from a - // day when working around DST, we need to store them separately - this._days = +days + weeks * 7; - // It is impossible to translate months into days without knowing - // which months you are are talking about, so we have to store - // it separately. - this._months = +months + quarters * 3 + years * 12; - - this._data = {}; - - this._locale = getLocale(); - - this._bubble(); - } - - function isDuration(obj) { - return obj instanceof Duration; - } - - function absRound(number) { - if (number < 0) { - return Math.round(-1 * number) * -1; - } else { - return Math.round(number); - } - } - - // compare two arrays, return the number of differences - function compareArrays(array1, array2, dontConvert) { - var len = Math.min(array1.length, array2.length), - lengthDiff = Math.abs(array1.length - array2.length), - diffs = 0, - i; - for (i = 0; i < len; i++) { - if ( - (dontConvert && array1[i] !== array2[i]) || - (!dontConvert && toInt(array1[i]) !== toInt(array2[i])) - ) { - diffs++; - } - } - return diffs + lengthDiff; - } - - // FORMATTING - - function offset(token, separator) { - addFormatToken(token, 0, 0, function () { - var offset = this.utcOffset(), - sign = '+'; - if (offset < 0) { - offset = -offset; - sign = '-'; - } - return ( - sign + - zeroFill(~~(offset / 60), 2) + - separator + - zeroFill(~~offset % 60, 2) - ); - }); - } - - offset('Z', ':'); - offset('ZZ', ''); - - // PARSING - - addRegexToken('Z', matchShortOffset); - addRegexToken('ZZ', matchShortOffset); - addParseToken(['Z', 'ZZ'], function (input, array, config) { - config._useUTC = true; - config._tzm = offsetFromString(matchShortOffset, input); - }); - - // HELPERS - - // timezone chunker - // '+10:00' > ['10', '00'] - // '-1530' > ['-15', '30'] - var chunkOffset = /([\+\-]|\d\d)/gi; - - function offsetFromString(matcher, string) { - var matches = (string || '').match(matcher), - chunk, - parts, - minutes; - - if (matches === null) { - return null; - } - - chunk = matches[matches.length - 1] || []; - parts = (chunk + '').match(chunkOffset) || ['-', 0, 0]; - minutes = +(parts[1] * 60) + toInt(parts[2]); - - return minutes === 0 ? 0 : parts[0] === '+' ? minutes : -minutes; - } - - // Return a moment from input, that is local/utc/zone equivalent to model. - function cloneWithOffset(input, model) { - var res, diff; - if (model._isUTC) { - res = model.clone(); - diff = - (isMoment(input) || isDate(input) - ? input.valueOf() - : createLocal(input).valueOf()) - res.valueOf(); - // Use low-level api, because this fn is low-level api. - res._d.setTime(res._d.valueOf() + diff); - hooks.updateOffset(res, false); - return res; - } else { - return createLocal(input).local(); - } - } - - function getDateOffset(m) { - // On Firefox.24 Date#getTimezoneOffset returns a floating point. - // https://github.com/moment/moment/pull/1871 - return -Math.round(m._d.getTimezoneOffset()); - } - - // HOOKS - - // This function will be called whenever a moment is mutated. - // It is intended to keep the offset in sync with the timezone. - hooks.updateOffset = function () {}; - - // MOMENTS - - // keepLocalTime = true means only change the timezone, without - // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]--> - // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset - // +0200, so we adjust the time as needed, to be valid. - // - // Keeping the time actually adds/subtracts (one hour) - // from the actual represented time. That is why we call updateOffset - // a second time. In case it wants us to change the offset again - // _changeInProgress == true case, then we have to adjust, because - // there is no such time in the given timezone. - function getSetOffset(input, keepLocalTime, keepMinutes) { - var offset = this._offset || 0, - localAdjust; - if (!this.isValid()) { - return input != null ? this : NaN; - } - if (input != null) { - if (typeof input === 'string') { - input = offsetFromString(matchShortOffset, input); - if (input === null) { - return this; - } - } else if (Math.abs(input) < 16 && !keepMinutes) { - input = input * 60; - } - if (!this._isUTC && keepLocalTime) { - localAdjust = getDateOffset(this); - } - this._offset = input; - this._isUTC = true; - if (localAdjust != null) { - this.add(localAdjust, 'm'); - } - if (offset !== input) { - if (!keepLocalTime || this._changeInProgress) { - addSubtract( - this, - createDuration(input - offset, 'm'), - 1, - false - ); - } else if (!this._changeInProgress) { - this._changeInProgress = true; - hooks.updateOffset(this, true); - this._changeInProgress = null; - } - } - return this; - } else { - return this._isUTC ? offset : getDateOffset(this); - } - } - - function getSetZone(input, keepLocalTime) { - if (input != null) { - if (typeof input !== 'string') { - input = -input; - } - - this.utcOffset(input, keepLocalTime); - - return this; - } else { - return -this.utcOffset(); - } - } - - function setOffsetToUTC(keepLocalTime) { - return this.utcOffset(0, keepLocalTime); - } - - function setOffsetToLocal(keepLocalTime) { - if (this._isUTC) { - this.utcOffset(0, keepLocalTime); - this._isUTC = false; - - if (keepLocalTime) { - this.subtract(getDateOffset(this), 'm'); - } - } - return this; - } - - function setOffsetToParsedOffset() { - if (this._tzm != null) { - this.utcOffset(this._tzm, false, true); - } else if (typeof this._i === 'string') { - var tZone = offsetFromString(matchOffset, this._i); - if (tZone != null) { - this.utcOffset(tZone); - } else { - this.utcOffset(0, true); - } - } - return this; - } - - function hasAlignedHourOffset(input) { - if (!this.isValid()) { - return false; - } - input = input ? createLocal(input).utcOffset() : 0; - - return (this.utcOffset() - input) % 60 === 0; - } - - function isDaylightSavingTime() { - return ( - this.utcOffset() > this.clone().month(0).utcOffset() || - this.utcOffset() > this.clone().month(5).utcOffset() - ); - } - - function isDaylightSavingTimeShifted() { - if (!isUndefined(this._isDSTShifted)) { - return this._isDSTShifted; - } - - var c = {}, - other; - - copyConfig(c, this); - c = prepareConfig(c); - - if (c._a) { - other = c._isUTC ? createUTC(c._a) : createLocal(c._a); - this._isDSTShifted = - this.isValid() && compareArrays(c._a, other.toArray()) > 0; - } else { - this._isDSTShifted = false; - } - - return this._isDSTShifted; - } - - function isLocal() { - return this.isValid() ? !this._isUTC : false; - } - - function isUtcOffset() { - return this.isValid() ? this._isUTC : false; - } - - function isUtc() { - return this.isValid() ? this._isUTC && this._offset === 0 : false; - } - - // ASP.NET json date format regex - var aspNetRegex = /^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/, - // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html - // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere - // and further modified to allow for strings containing both week and day - isoRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/; - - function createDuration(input, key) { - var duration = input, - // matching against regexp is expensive, do it on demand - match = null, - sign, - ret, - diffRes; - - if (isDuration(input)) { - duration = { - ms: input._milliseconds, - d: input._days, - M: input._months, - }; - } else if (isNumber(input) || !isNaN(+input)) { - duration = {}; - if (key) { - duration[key] = +input; - } else { - duration.milliseconds = +input; - } - } else if ((match = aspNetRegex.exec(input))) { - sign = match[1] === '-' ? -1 : 1; - duration = { - y: 0, - d: toInt(match[DATE]) * sign, - h: toInt(match[HOUR]) * sign, - m: toInt(match[MINUTE]) * sign, - s: toInt(match[SECOND]) * sign, - ms: toInt(absRound(match[MILLISECOND] * 1000)) * sign, // the millisecond decimal point is included in the match - }; - } else if ((match = isoRegex.exec(input))) { - sign = match[1] === '-' ? -1 : 1; - duration = { - y: parseIso(match[2], sign), - M: parseIso(match[3], sign), - w: parseIso(match[4], sign), - d: parseIso(match[5], sign), - h: parseIso(match[6], sign), - m: parseIso(match[7], sign), - s: parseIso(match[8], sign), - }; - } else if (duration == null) { - // checks for null or undefined - duration = {}; - } else if ( - typeof duration === 'object' && - ('from' in duration || 'to' in duration) - ) { - diffRes = momentsDifference( - createLocal(duration.from), - createLocal(duration.to) - ); - - duration = {}; - duration.ms = diffRes.milliseconds; - duration.M = diffRes.months; - } - - ret = new Duration(duration); - - if (isDuration(input) && hasOwnProp(input, '_locale')) { - ret._locale = input._locale; - } - - if (isDuration(input) && hasOwnProp(input, '_isValid')) { - ret._isValid = input._isValid; - } - - return ret; - } - - createDuration.fn = Duration.prototype; - createDuration.invalid = createInvalid$1; - - function parseIso(inp, sign) { - // We'd normally use ~~inp for this, but unfortunately it also - // converts floats to ints. - // inp may be undefined, so careful calling replace on it. - var res = inp && parseFloat(inp.replace(',', '.')); - // apply sign while we're at it - return (isNaN(res) ? 0 : res) * sign; - } - - function positiveMomentsDifference(base, other) { - var res = {}; - - res.months = - other.month() - base.month() + (other.year() - base.year()) * 12; - if (base.clone().add(res.months, 'M').isAfter(other)) { - --res.months; - } - - res.milliseconds = +other - +base.clone().add(res.months, 'M'); - - return res; - } - - function momentsDifference(base, other) { - var res; - if (!(base.isValid() && other.isValid())) { - return { milliseconds: 0, months: 0 }; - } - - other = cloneWithOffset(other, base); - if (base.isBefore(other)) { - res = positiveMomentsDifference(base, other); - } else { - res = positiveMomentsDifference(other, base); - res.milliseconds = -res.milliseconds; - res.months = -res.months; - } - - return res; - } - - // TODO: remove 'name' arg after deprecation is removed - function createAdder(direction, name) { - return function (val, period) { - var dur, tmp; - //invert the arguments, but complain about it - if (period !== null && !isNaN(+period)) { - deprecateSimple( - name, - 'moment().' + - name + - '(period, number) is deprecated. Please use moment().' + - name + - '(number, period). ' + - 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.' - ); - tmp = val; - val = period; - period = tmp; - } - - dur = createDuration(val, period); - addSubtract(this, dur, direction); - return this; - }; - } - - function addSubtract(mom, duration, isAdding, updateOffset) { - var milliseconds = duration._milliseconds, - days = absRound(duration._days), - months = absRound(duration._months); - - if (!mom.isValid()) { - // No op - return; - } - - updateOffset = updateOffset == null ? true : updateOffset; - - if (months) { - setMonth(mom, get(mom, 'Month') + months * isAdding); - } - if (days) { - set$1(mom, 'Date', get(mom, 'Date') + days * isAdding); - } - if (milliseconds) { - mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding); - } - if (updateOffset) { - hooks.updateOffset(mom, days || months); - } - } - - var add = createAdder(1, 'add'), - subtract = createAdder(-1, 'subtract'); - - function isString(input) { - return typeof input === 'string' || input instanceof String; - } - - // type MomentInput = Moment | Date | string | number | (number | string)[] | MomentInputObject | void; // null | undefined - function isMomentInput(input) { - return ( - isMoment(input) || - isDate(input) || - isString(input) || - isNumber(input) || - isNumberOrStringArray(input) || - isMomentInputObject(input) || - input === null || - input === undefined - ); - } - - function isMomentInputObject(input) { - var objectTest = isObject(input) && !isObjectEmpty(input), - propertyTest = false, - properties = [ - 'years', - 'year', - 'y', - 'months', - 'month', - 'M', - 'days', - 'day', - 'd', - 'dates', - 'date', - 'D', - 'hours', - 'hour', - 'h', - 'minutes', - 'minute', - 'm', - 'seconds', - 'second', - 's', - 'milliseconds', - 'millisecond', - 'ms', - ], - i, - property; - - for (i = 0; i < properties.length; i += 1) { - property = properties[i]; - propertyTest = propertyTest || hasOwnProp(input, property); - } - - return objectTest && propertyTest; - } - - function isNumberOrStringArray(input) { - var arrayTest = isArray(input), - dataTypeTest = false; - if (arrayTest) { - dataTypeTest = - input.filter(function (item) { - return !isNumber(item) && isString(input); - }).length === 0; - } - return arrayTest && dataTypeTest; - } - - function isCalendarSpec(input) { - var objectTest = isObject(input) && !isObjectEmpty(input), - propertyTest = false, - properties = [ - 'sameDay', - 'nextDay', - 'lastDay', - 'nextWeek', - 'lastWeek', - 'sameElse', - ], - i, - property; - - for (i = 0; i < properties.length; i += 1) { - property = properties[i]; - propertyTest = propertyTest || hasOwnProp(input, property); - } - - return objectTest && propertyTest; - } - - function getCalendarFormat(myMoment, now) { - var diff = myMoment.diff(now, 'days', true); - return diff < -6 - ? 'sameElse' - : diff < -1 - ? 'lastWeek' - : diff < 0 - ? 'lastDay' - : diff < 1 - ? 'sameDay' - : diff < 2 - ? 'nextDay' - : diff < 7 - ? 'nextWeek' - : 'sameElse'; - } - - function calendar$1(time, formats) { - // Support for single parameter, formats only overload to the calendar function - if (arguments.length === 1) { - if (!arguments[0]) { - time = undefined; - formats = undefined; - } else if (isMomentInput(arguments[0])) { - time = arguments[0]; - formats = undefined; - } else if (isCalendarSpec(arguments[0])) { - formats = arguments[0]; - time = undefined; - } - } - // We want to compare the start of today, vs this. - // Getting start-of-today depends on whether we're local/utc/offset or not. - var now = time || createLocal(), - sod = cloneWithOffset(now, this).startOf('day'), - format = hooks.calendarFormat(this, sod) || 'sameElse', - output = - formats && - (isFunction(formats[format]) - ? formats[format].call(this, now) - : formats[format]); - - return this.format( - output || this.localeData().calendar(format, this, createLocal(now)) - ); - } - - function clone() { - return new Moment(this); - } - - function isAfter(input, units) { - var localInput = isMoment(input) ? input : createLocal(input); - if (!(this.isValid() && localInput.isValid())) { - return false; - } - units = normalizeUnits(units) || 'millisecond'; - if (units === 'millisecond') { - return this.valueOf() > localInput.valueOf(); - } else { - return localInput.valueOf() < this.clone().startOf(units).valueOf(); - } - } - - function isBefore(input, units) { - var localInput = isMoment(input) ? input : createLocal(input); - if (!(this.isValid() && localInput.isValid())) { - return false; - } - units = normalizeUnits(units) || 'millisecond'; - if (units === 'millisecond') { - return this.valueOf() < localInput.valueOf(); - } else { - return this.clone().endOf(units).valueOf() < localInput.valueOf(); - } - } - - function isBetween(from, to, units, inclusivity) { - var localFrom = isMoment(from) ? from : createLocal(from), - localTo = isMoment(to) ? to : createLocal(to); - if (!(this.isValid() && localFrom.isValid() && localTo.isValid())) { - return false; - } - inclusivity = inclusivity || '()'; - return ( - (inclusivity[0] === '(' - ? this.isAfter(localFrom, units) - : !this.isBefore(localFrom, units)) && - (inclusivity[1] === ')' - ? this.isBefore(localTo, units) - : !this.isAfter(localTo, units)) - ); - } - - function isSame(input, units) { - var localInput = isMoment(input) ? input : createLocal(input), - inputMs; - if (!(this.isValid() && localInput.isValid())) { - return false; - } - units = normalizeUnits(units) || 'millisecond'; - if (units === 'millisecond') { - return this.valueOf() === localInput.valueOf(); - } else { - inputMs = localInput.valueOf(); - return ( - this.clone().startOf(units).valueOf() <= inputMs && - inputMs <= this.clone().endOf(units).valueOf() - ); - } - } - - function isSameOrAfter(input, units) { - return this.isSame(input, units) || this.isAfter(input, units); - } - - function isSameOrBefore(input, units) { - return this.isSame(input, units) || this.isBefore(input, units); - } - - function diff(input, units, asFloat) { - var that, zoneDelta, output; - - if (!this.isValid()) { - return NaN; - } - - that = cloneWithOffset(input, this); - - if (!that.isValid()) { - return NaN; - } - - zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4; - - units = normalizeUnits(units); - - switch (units) { - case 'year': - output = monthDiff(this, that) / 12; - break; - case 'month': - output = monthDiff(this, that); - break; - case 'quarter': - output = monthDiff(this, that) / 3; - break; - case 'second': - output = (this - that) / 1e3; - break; // 1000 - case 'minute': - output = (this - that) / 6e4; - break; // 1000 * 60 - case 'hour': - output = (this - that) / 36e5; - break; // 1000 * 60 * 60 - case 'day': - output = (this - that - zoneDelta) / 864e5; - break; // 1000 * 60 * 60 * 24, negate dst - case 'week': - output = (this - that - zoneDelta) / 6048e5; - break; // 1000 * 60 * 60 * 24 * 7, negate dst - default: - output = this - that; - } - - return asFloat ? output : absFloor(output); - } - - function monthDiff(a, b) { - if (a.date() < b.date()) { - // end-of-month calculations work correct when the start month has more - // days than the end month. - return -monthDiff(b, a); - } - // difference in months - var wholeMonthDiff = (b.year() - a.year()) * 12 + (b.month() - a.month()), - // b is in (anchor - 1 month, anchor + 1 month) - anchor = a.clone().add(wholeMonthDiff, 'months'), - anchor2, - adjust; - - if (b - anchor < 0) { - anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); - // linear across the month - adjust = (b - anchor) / (anchor - anchor2); - } else { - anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); - // linear across the month - adjust = (b - anchor) / (anchor2 - anchor); - } - - //check for negative zero, return zero if negative zero - return -(wholeMonthDiff + adjust) || 0; - } - - hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ'; - hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]'; - - function toString() { - return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); - } - - function toISOString(keepOffset) { - if (!this.isValid()) { - return null; - } - var utc = keepOffset !== true, - m = utc ? this.clone().utc() : this; - if (m.year() < 0 || m.year() > 9999) { - return formatMoment( - m, - utc - ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' - : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ' - ); - } - if (isFunction(Date.prototype.toISOString)) { - // native implementation is ~50x faster, use it when we can - if (utc) { - return this.toDate().toISOString(); - } else { - return new Date(this.valueOf() + this.utcOffset() * 60 * 1000) - .toISOString() - .replace('Z', formatMoment(m, 'Z')); - } - } - return formatMoment( - m, - utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ' - ); - } - - /** - * Return a human readable representation of a moment that can - * also be evaluated to get a new moment which is the same - * - * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects - */ - function inspect() { - if (!this.isValid()) { - return 'moment.invalid(/* ' + this._i + ' */)'; - } - var func = 'moment', - zone = '', - prefix, - year, - datetime, - suffix; - if (!this.isLocal()) { - func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone'; - zone = 'Z'; - } - prefix = '[' + func + '("]'; - year = 0 <= this.year() && this.year() <= 9999 ? 'YYYY' : 'YYYYYY'; - datetime = '-MM-DD[T]HH:mm:ss.SSS'; - suffix = zone + '[")]'; - - return this.format(prefix + year + datetime + suffix); - } - - function format(inputString) { - if (!inputString) { - inputString = this.isUtc() - ? hooks.defaultFormatUtc - : hooks.defaultFormat; - } - var output = formatMoment(this, inputString); - return this.localeData().postformat(output); - } - - function from(time, withoutSuffix) { - if ( - this.isValid() && - ((isMoment(time) && time.isValid()) || createLocal(time).isValid()) - ) { - return createDuration({ to: this, from: time }) - .locale(this.locale()) - .humanize(!withoutSuffix); - } else { - return this.localeData().invalidDate(); - } - } - - function fromNow(withoutSuffix) { - return this.from(createLocal(), withoutSuffix); - } - - function to(time, withoutSuffix) { - if ( - this.isValid() && - ((isMoment(time) && time.isValid()) || createLocal(time).isValid()) - ) { - return createDuration({ from: this, to: time }) - .locale(this.locale()) - .humanize(!withoutSuffix); - } else { - return this.localeData().invalidDate(); - } - } - - function toNow(withoutSuffix) { - return this.to(createLocal(), withoutSuffix); - } - - // If passed a locale key, it will set the locale for this - // instance. Otherwise, it will return the locale configuration - // variables for this instance. - function locale(key) { - var newLocaleData; - - if (key === undefined) { - return this._locale._abbr; - } else { - newLocaleData = getLocale(key); - if (newLocaleData != null) { - this._locale = newLocaleData; - } - return this; - } - } - - var lang = deprecate( - 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', - function (key) { - if (key === undefined) { - return this.localeData(); - } else { - return this.locale(key); - } - } - ); - - function localeData() { - return this._locale; - } - - var MS_PER_SECOND = 1000, - MS_PER_MINUTE = 60 * MS_PER_SECOND, - MS_PER_HOUR = 60 * MS_PER_MINUTE, - MS_PER_400_YEARS = (365 * 400 + 97) * 24 * MS_PER_HOUR; - - // actual modulo - handles negative numbers (for dates before 1970): - function mod$1(dividend, divisor) { - return ((dividend % divisor) + divisor) % divisor; - } - - function localStartOfDate(y, m, d) { - // the date constructor remaps years 0-99 to 1900-1999 - if (y < 100 && y >= 0) { - // preserve leap years using a full 400 year cycle, then reset - return new Date(y + 400, m, d) - MS_PER_400_YEARS; - } else { - return new Date(y, m, d).valueOf(); - } - } - - function utcStartOfDate(y, m, d) { - // Date.UTC remaps years 0-99 to 1900-1999 - if (y < 100 && y >= 0) { - // preserve leap years using a full 400 year cycle, then reset - return Date.UTC(y + 400, m, d) - MS_PER_400_YEARS; - } else { - return Date.UTC(y, m, d); - } - } - - function startOf(units) { - var time, startOfDate; - units = normalizeUnits(units); - if (units === undefined || units === 'millisecond' || !this.isValid()) { - return this; - } - - startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate; - - switch (units) { - case 'year': - time = startOfDate(this.year(), 0, 1); - break; - case 'quarter': - time = startOfDate( - this.year(), - this.month() - (this.month() % 3), - 1 - ); - break; - case 'month': - time = startOfDate(this.year(), this.month(), 1); - break; - case 'week': - time = startOfDate( - this.year(), - this.month(), - this.date() - this.weekday() - ); - break; - case 'isoWeek': - time = startOfDate( - this.year(), - this.month(), - this.date() - (this.isoWeekday() - 1) - ); - break; - case 'day': - case 'date': - time = startOfDate(this.year(), this.month(), this.date()); - break; - case 'hour': - time = this._d.valueOf(); - time -= mod$1( - time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE), - MS_PER_HOUR - ); - break; - case 'minute': - time = this._d.valueOf(); - time -= mod$1(time, MS_PER_MINUTE); - break; - case 'second': - time = this._d.valueOf(); - time -= mod$1(time, MS_PER_SECOND); - break; - } - - this._d.setTime(time); - hooks.updateOffset(this, true); - return this; - } - - function endOf(units) { - var time, startOfDate; - units = normalizeUnits(units); - if (units === undefined || units === 'millisecond' || !this.isValid()) { - return this; - } - - startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate; - - switch (units) { - case 'year': - time = startOfDate(this.year() + 1, 0, 1) - 1; - break; - case 'quarter': - time = - startOfDate( - this.year(), - this.month() - (this.month() % 3) + 3, - 1 - ) - 1; - break; - case 'month': - time = startOfDate(this.year(), this.month() + 1, 1) - 1; - break; - case 'week': - time = - startOfDate( - this.year(), - this.month(), - this.date() - this.weekday() + 7 - ) - 1; - break; - case 'isoWeek': - time = - startOfDate( - this.year(), - this.month(), - this.date() - (this.isoWeekday() - 1) + 7 - ) - 1; - break; - case 'day': - case 'date': - time = startOfDate(this.year(), this.month(), this.date() + 1) - 1; - break; - case 'hour': - time = this._d.valueOf(); - time += - MS_PER_HOUR - - mod$1( - time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE), - MS_PER_HOUR - ) - - 1; - break; - case 'minute': - time = this._d.valueOf(); - time += MS_PER_MINUTE - mod$1(time, MS_PER_MINUTE) - 1; - break; - case 'second': - time = this._d.valueOf(); - time += MS_PER_SECOND - mod$1(time, MS_PER_SECOND) - 1; - break; - } - - this._d.setTime(time); - hooks.updateOffset(this, true); - return this; - } - - function valueOf() { - return this._d.valueOf() - (this._offset || 0) * 60000; - } - - function unix() { - return Math.floor(this.valueOf() / 1000); - } - - function toDate() { - return new Date(this.valueOf()); - } - - function toArray() { - var m = this; - return [ - m.year(), - m.month(), - m.date(), - m.hour(), - m.minute(), - m.second(), - m.millisecond(), - ]; - } - - function toObject() { - var m = this; - return { - years: m.year(), - months: m.month(), - date: m.date(), - hours: m.hours(), - minutes: m.minutes(), - seconds: m.seconds(), - milliseconds: m.milliseconds(), - }; - } - - function toJSON() { - // new Date(NaN).toJSON() === null - return this.isValid() ? this.toISOString() : null; - } - - function isValid$2() { - return isValid(this); - } - - function parsingFlags() { - return extend({}, getParsingFlags(this)); - } - - function invalidAt() { - return getParsingFlags(this).overflow; - } - - function creationData() { - return { - input: this._i, - format: this._f, - locale: this._locale, - isUTC: this._isUTC, - strict: this._strict, - }; - } - - addFormatToken('N', 0, 0, 'eraAbbr'); - addFormatToken('NN', 0, 0, 'eraAbbr'); - addFormatToken('NNN', 0, 0, 'eraAbbr'); - addFormatToken('NNNN', 0, 0, 'eraName'); - addFormatToken('NNNNN', 0, 0, 'eraNarrow'); - - addFormatToken('y', ['y', 1], 'yo', 'eraYear'); - addFormatToken('y', ['yy', 2], 0, 'eraYear'); - addFormatToken('y', ['yyy', 3], 0, 'eraYear'); - addFormatToken('y', ['yyyy', 4], 0, 'eraYear'); - - addRegexToken('N', matchEraAbbr); - addRegexToken('NN', matchEraAbbr); - addRegexToken('NNN', matchEraAbbr); - addRegexToken('NNNN', matchEraName); - addRegexToken('NNNNN', matchEraNarrow); - - addParseToken(['N', 'NN', 'NNN', 'NNNN', 'NNNNN'], function ( - input, - array, - config, - token - ) { - var era = config._locale.erasParse(input, token, config._strict); - if (era) { - getParsingFlags(config).era = era; - } else { - getParsingFlags(config).invalidEra = input; - } - }); - - addRegexToken('y', matchUnsigned); - addRegexToken('yy', matchUnsigned); - addRegexToken('yyy', matchUnsigned); - addRegexToken('yyyy', matchUnsigned); - addRegexToken('yo', matchEraYearOrdinal); - - addParseToken(['y', 'yy', 'yyy', 'yyyy'], YEAR); - addParseToken(['yo'], function (input, array, config, token) { - var match; - if (config._locale._eraYearOrdinalRegex) { - match = input.match(config._locale._eraYearOrdinalRegex); - } - - if (config._locale.eraYearOrdinalParse) { - array[YEAR] = config._locale.eraYearOrdinalParse(input, match); - } else { - array[YEAR] = parseInt(input, 10); - } - }); - - function localeEras(m, format) { - var i, - l, - date, - eras = this._eras || getLocale('en')._eras; - for (i = 0, l = eras.length; i < l; ++i) { - switch (typeof eras[i].since) { - case 'string': - // truncate time - date = hooks(eras[i].since).startOf('day'); - eras[i].since = date.valueOf(); - break; - } - - switch (typeof eras[i].until) { - case 'undefined': - eras[i].until = +Infinity; - break; - case 'string': - // truncate time - date = hooks(eras[i].until).startOf('day').valueOf(); - eras[i].until = date.valueOf(); - break; - } - } - return eras; - } - - function localeErasParse(eraName, format, strict) { - var i, - l, - eras = this.eras(), - name, - abbr, - narrow; - eraName = eraName.toUpperCase(); - - for (i = 0, l = eras.length; i < l; ++i) { - name = eras[i].name.toUpperCase(); - abbr = eras[i].abbr.toUpperCase(); - narrow = eras[i].narrow.toUpperCase(); - - if (strict) { - switch (format) { - case 'N': - case 'NN': - case 'NNN': - if (abbr === eraName) { - return eras[i]; - } - break; - - case 'NNNN': - if (name === eraName) { - return eras[i]; - } - break; - - case 'NNNNN': - if (narrow === eraName) { - return eras[i]; - } - break; - } - } else if ([name, abbr, narrow].indexOf(eraName) >= 0) { - return eras[i]; - } - } - } - - function localeErasConvertYear(era, year) { - var dir = era.since <= era.until ? +1 : -1; - if (year === undefined) { - return hooks(era.since).year(); - } else { - return hooks(era.since).year() + (year - era.offset) * dir; - } - } - - function getEraName() { - var i, - l, - val, - eras = this.localeData().eras(); - for (i = 0, l = eras.length; i < l; ++i) { - // truncate time - val = this.clone().startOf('day').valueOf(); - - if (eras[i].since <= val && val <= eras[i].until) { - return eras[i].name; - } - if (eras[i].until <= val && val <= eras[i].since) { - return eras[i].name; - } - } - - return ''; - } - - function getEraNarrow() { - var i, - l, - val, - eras = this.localeData().eras(); - for (i = 0, l = eras.length; i < l; ++i) { - // truncate time - val = this.clone().startOf('day').valueOf(); - - if (eras[i].since <= val && val <= eras[i].until) { - return eras[i].narrow; - } - if (eras[i].until <= val && val <= eras[i].since) { - return eras[i].narrow; - } - } - - return ''; - } - - function getEraAbbr() { - var i, - l, - val, - eras = this.localeData().eras(); - for (i = 0, l = eras.length; i < l; ++i) { - // truncate time - val = this.clone().startOf('day').valueOf(); - - if (eras[i].since <= val && val <= eras[i].until) { - return eras[i].abbr; - } - if (eras[i].until <= val && val <= eras[i].since) { - return eras[i].abbr; - } - } - - return ''; - } - - function getEraYear() { - var i, - l, - dir, - val, - eras = this.localeData().eras(); - for (i = 0, l = eras.length; i < l; ++i) { - dir = eras[i].since <= eras[i].until ? +1 : -1; - - // truncate time - val = this.clone().startOf('day').valueOf(); - - if ( - (eras[i].since <= val && val <= eras[i].until) || - (eras[i].until <= val && val <= eras[i].since) - ) { - return ( - (this.year() - hooks(eras[i].since).year()) * dir + - eras[i].offset - ); - } - } - - return this.year(); - } - - function erasNameRegex(isStrict) { - if (!hasOwnProp(this, '_erasNameRegex')) { - computeErasParse.call(this); - } - return isStrict ? this._erasNameRegex : this._erasRegex; - } - - function erasAbbrRegex(isStrict) { - if (!hasOwnProp(this, '_erasAbbrRegex')) { - computeErasParse.call(this); - } - return isStrict ? this._erasAbbrRegex : this._erasRegex; - } - - function erasNarrowRegex(isStrict) { - if (!hasOwnProp(this, '_erasNarrowRegex')) { - computeErasParse.call(this); - } - return isStrict ? this._erasNarrowRegex : this._erasRegex; - } - - function matchEraAbbr(isStrict, locale) { - return locale.erasAbbrRegex(isStrict); - } - - function matchEraName(isStrict, locale) { - return locale.erasNameRegex(isStrict); - } - - function matchEraNarrow(isStrict, locale) { - return locale.erasNarrowRegex(isStrict); - } - - function matchEraYearOrdinal(isStrict, locale) { - return locale._eraYearOrdinalRegex || matchUnsigned; - } - - function computeErasParse() { - var abbrPieces = [], - namePieces = [], - narrowPieces = [], - mixedPieces = [], - i, - l, - eras = this.eras(); - - for (i = 0, l = eras.length; i < l; ++i) { - namePieces.push(regexEscape(eras[i].name)); - abbrPieces.push(regexEscape(eras[i].abbr)); - narrowPieces.push(regexEscape(eras[i].narrow)); - - mixedPieces.push(regexEscape(eras[i].name)); - mixedPieces.push(regexEscape(eras[i].abbr)); - mixedPieces.push(regexEscape(eras[i].narrow)); - } - - this._erasRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); - this._erasNameRegex = new RegExp('^(' + namePieces.join('|') + ')', 'i'); - this._erasAbbrRegex = new RegExp('^(' + abbrPieces.join('|') + ')', 'i'); - this._erasNarrowRegex = new RegExp( - '^(' + narrowPieces.join('|') + ')', - 'i' - ); - } - - // FORMATTING - - addFormatToken(0, ['gg', 2], 0, function () { - return this.weekYear() % 100; - }); - - addFormatToken(0, ['GG', 2], 0, function () { - return this.isoWeekYear() % 100; - }); - - function addWeekYearFormatToken(token, getter) { - addFormatToken(0, [token, token.length], 0, getter); - } - - addWeekYearFormatToken('gggg', 'weekYear'); - addWeekYearFormatToken('ggggg', 'weekYear'); - addWeekYearFormatToken('GGGG', 'isoWeekYear'); - addWeekYearFormatToken('GGGGG', 'isoWeekYear'); - - // ALIASES - - addUnitAlias('weekYear', 'gg'); - addUnitAlias('isoWeekYear', 'GG'); - - // PRIORITY - - addUnitPriority('weekYear', 1); - addUnitPriority('isoWeekYear', 1); - - // PARSING - - addRegexToken('G', matchSigned); - addRegexToken('g', matchSigned); - addRegexToken('GG', match1to2, match2); - addRegexToken('gg', match1to2, match2); - addRegexToken('GGGG', match1to4, match4); - addRegexToken('gggg', match1to4, match4); - addRegexToken('GGGGG', match1to6, match6); - addRegexToken('ggggg', match1to6, match6); - - addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function ( - input, - week, - config, - token - ) { - week[token.substr(0, 2)] = toInt(input); - }); - - addWeekParseToken(['gg', 'GG'], function (input, week, config, token) { - week[token] = hooks.parseTwoDigitYear(input); - }); - - // MOMENTS - - function getSetWeekYear(input) { - return getSetWeekYearHelper.call( - this, - input, - this.week(), - this.weekday(), - this.localeData()._week.dow, - this.localeData()._week.doy - ); - } - - function getSetISOWeekYear(input) { - return getSetWeekYearHelper.call( - this, - input, - this.isoWeek(), - this.isoWeekday(), - 1, - 4 - ); - } - - function getISOWeeksInYear() { - return weeksInYear(this.year(), 1, 4); - } - - function getISOWeeksInISOWeekYear() { - return weeksInYear(this.isoWeekYear(), 1, 4); - } - - function getWeeksInYear() { - var weekInfo = this.localeData()._week; - return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); - } - - function getWeeksInWeekYear() { - var weekInfo = this.localeData()._week; - return weeksInYear(this.weekYear(), weekInfo.dow, weekInfo.doy); - } - - function getSetWeekYearHelper(input, week, weekday, dow, doy) { - var weeksTarget; - if (input == null) { - return weekOfYear(this, dow, doy).year; - } else { - weeksTarget = weeksInYear(input, dow, doy); - if (week > weeksTarget) { - week = weeksTarget; - } - return setWeekAll.call(this, input, week, weekday, dow, doy); - } - } - - function setWeekAll(weekYear, week, weekday, dow, doy) { - var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy), - date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear); - - this.year(date.getUTCFullYear()); - this.month(date.getUTCMonth()); - this.date(date.getUTCDate()); - return this; - } - - // FORMATTING - - addFormatToken('Q', 0, 'Qo', 'quarter'); - - // ALIASES - - addUnitAlias('quarter', 'Q'); - - // PRIORITY - - addUnitPriority('quarter', 7); - - // PARSING - - addRegexToken('Q', match1); - addParseToken('Q', function (input, array) { - array[MONTH] = (toInt(input) - 1) * 3; - }); - - // MOMENTS - - function getSetQuarter(input) { - return input == null - ? Math.ceil((this.month() + 1) / 3) - : this.month((input - 1) * 3 + (this.month() % 3)); - } - - // FORMATTING - - addFormatToken('D', ['DD', 2], 'Do', 'date'); - - // ALIASES - - addUnitAlias('date', 'D'); - - // PRIORITY - addUnitPriority('date', 9); - - // PARSING - - addRegexToken('D', match1to2); - addRegexToken('DD', match1to2, match2); - addRegexToken('Do', function (isStrict, locale) { - // TODO: Remove "ordinalParse" fallback in next major release. - return isStrict - ? locale._dayOfMonthOrdinalParse || locale._ordinalParse - : locale._dayOfMonthOrdinalParseLenient; - }); - - addParseToken(['D', 'DD'], DATE); - addParseToken('Do', function (input, array) { - array[DATE] = toInt(input.match(match1to2)[0]); - }); - - // MOMENTS - - var getSetDayOfMonth = makeGetSet('Date', true); - - // FORMATTING - - addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear'); - - // ALIASES - - addUnitAlias('dayOfYear', 'DDD'); - - // PRIORITY - addUnitPriority('dayOfYear', 4); - - // PARSING - - addRegexToken('DDD', match1to3); - addRegexToken('DDDD', match3); - addParseToken(['DDD', 'DDDD'], function (input, array, config) { - config._dayOfYear = toInt(input); - }); - - // HELPERS - - // MOMENTS - - function getSetDayOfYear(input) { - var dayOfYear = - Math.round( - (this.clone().startOf('day') - this.clone().startOf('year')) / 864e5 - ) + 1; - return input == null ? dayOfYear : this.add(input - dayOfYear, 'd'); - } - - // FORMATTING - - addFormatToken('m', ['mm', 2], 0, 'minute'); - - // ALIASES - - addUnitAlias('minute', 'm'); - - // PRIORITY - - addUnitPriority('minute', 14); - - // PARSING - - addRegexToken('m', match1to2); - addRegexToken('mm', match1to2, match2); - addParseToken(['m', 'mm'], MINUTE); - - // MOMENTS - - var getSetMinute = makeGetSet('Minutes', false); - - // FORMATTING - - addFormatToken('s', ['ss', 2], 0, 'second'); - - // ALIASES - - addUnitAlias('second', 's'); - - // PRIORITY - - addUnitPriority('second', 15); - - // PARSING - - addRegexToken('s', match1to2); - addRegexToken('ss', match1to2, match2); - addParseToken(['s', 'ss'], SECOND); - - // MOMENTS - - var getSetSecond = makeGetSet('Seconds', false); - - // FORMATTING - - addFormatToken('S', 0, 0, function () { - return ~~(this.millisecond() / 100); - }); - - addFormatToken(0, ['SS', 2], 0, function () { - return ~~(this.millisecond() / 10); - }); - - addFormatToken(0, ['SSS', 3], 0, 'millisecond'); - addFormatToken(0, ['SSSS', 4], 0, function () { - return this.millisecond() * 10; - }); - addFormatToken(0, ['SSSSS', 5], 0, function () { - return this.millisecond() * 100; - }); - addFormatToken(0, ['SSSSSS', 6], 0, function () { - return this.millisecond() * 1000; - }); - addFormatToken(0, ['SSSSSSS', 7], 0, function () { - return this.millisecond() * 10000; - }); - addFormatToken(0, ['SSSSSSSS', 8], 0, function () { - return this.millisecond() * 100000; - }); - addFormatToken(0, ['SSSSSSSSS', 9], 0, function () { - return this.millisecond() * 1000000; - }); - - // ALIASES - - addUnitAlias('millisecond', 'ms'); - - // PRIORITY - - addUnitPriority('millisecond', 16); - - // PARSING - - addRegexToken('S', match1to3, match1); - addRegexToken('SS', match1to3, match2); - addRegexToken('SSS', match1to3, match3); - - var token, getSetMillisecond; - for (token = 'SSSS'; token.length <= 9; token += 'S') { - addRegexToken(token, matchUnsigned); - } - - function parseMs(input, array) { - array[MILLISECOND] = toInt(('0.' + input) * 1000); - } - - for (token = 'S'; token.length <= 9; token += 'S') { - addParseToken(token, parseMs); - } - - getSetMillisecond = makeGetSet('Milliseconds', false); - - // FORMATTING - - addFormatToken('z', 0, 0, 'zoneAbbr'); - addFormatToken('zz', 0, 0, 'zoneName'); - - // MOMENTS - - function getZoneAbbr() { - return this._isUTC ? 'UTC' : ''; - } - - function getZoneName() { - return this._isUTC ? 'Coordinated Universal Time' : ''; - } - - var proto = Moment.prototype; - - proto.add = add; - proto.calendar = calendar$1; - proto.clone = clone; - proto.diff = diff; - proto.endOf = endOf; - proto.format = format; - proto.from = from; - proto.fromNow = fromNow; - proto.to = to; - proto.toNow = toNow; - proto.get = stringGet; - proto.invalidAt = invalidAt; - proto.isAfter = isAfter; - proto.isBefore = isBefore; - proto.isBetween = isBetween; - proto.isSame = isSame; - proto.isSameOrAfter = isSameOrAfter; - proto.isSameOrBefore = isSameOrBefore; - proto.isValid = isValid$2; - proto.lang = lang; - proto.locale = locale; - proto.localeData = localeData; - proto.max = prototypeMax; - proto.min = prototypeMin; - proto.parsingFlags = parsingFlags; - proto.set = stringSet; - proto.startOf = startOf; - proto.subtract = subtract; - proto.toArray = toArray; - proto.toObject = toObject; - proto.toDate = toDate; - proto.toISOString = toISOString; - proto.inspect = inspect; - if (typeof Symbol !== 'undefined' && Symbol.for != null) { - proto[Symbol.for('nodejs.util.inspect.custom')] = function () { - return 'Moment<' + this.format() + '>'; - }; - } - proto.toJSON = toJSON; - proto.toString = toString; - proto.unix = unix; - proto.valueOf = valueOf; - proto.creationData = creationData; - proto.eraName = getEraName; - proto.eraNarrow = getEraNarrow; - proto.eraAbbr = getEraAbbr; - proto.eraYear = getEraYear; - proto.year = getSetYear; - proto.isLeapYear = getIsLeapYear; - proto.weekYear = getSetWeekYear; - proto.isoWeekYear = getSetISOWeekYear; - proto.quarter = proto.quarters = getSetQuarter; - proto.month = getSetMonth; - proto.daysInMonth = getDaysInMonth; - proto.week = proto.weeks = getSetWeek; - proto.isoWeek = proto.isoWeeks = getSetISOWeek; - proto.weeksInYear = getWeeksInYear; - proto.weeksInWeekYear = getWeeksInWeekYear; - proto.isoWeeksInYear = getISOWeeksInYear; - proto.isoWeeksInISOWeekYear = getISOWeeksInISOWeekYear; - proto.date = getSetDayOfMonth; - proto.day = proto.days = getSetDayOfWeek; - proto.weekday = getSetLocaleDayOfWeek; - proto.isoWeekday = getSetISODayOfWeek; - proto.dayOfYear = getSetDayOfYear; - proto.hour = proto.hours = getSetHour; - proto.minute = proto.minutes = getSetMinute; - proto.second = proto.seconds = getSetSecond; - proto.millisecond = proto.milliseconds = getSetMillisecond; - proto.utcOffset = getSetOffset; - proto.utc = setOffsetToUTC; - proto.local = setOffsetToLocal; - proto.parseZone = setOffsetToParsedOffset; - proto.hasAlignedHourOffset = hasAlignedHourOffset; - proto.isDST = isDaylightSavingTime; - proto.isLocal = isLocal; - proto.isUtcOffset = isUtcOffset; - proto.isUtc = isUtc; - proto.isUTC = isUtc; - proto.zoneAbbr = getZoneAbbr; - proto.zoneName = getZoneName; - proto.dates = deprecate( - 'dates accessor is deprecated. Use date instead.', - getSetDayOfMonth - ); - proto.months = deprecate( - 'months accessor is deprecated. Use month instead', - getSetMonth - ); - proto.years = deprecate( - 'years accessor is deprecated. Use year instead', - getSetYear - ); - proto.zone = deprecate( - 'moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', - getSetZone - ); - proto.isDSTShifted = deprecate( - 'isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', - isDaylightSavingTimeShifted - ); - - function createUnix(input) { - return createLocal(input * 1000); - } - - function createInZone() { - return createLocal.apply(null, arguments).parseZone(); - } - - function preParsePostFormat(string) { - return string; - } - - var proto$1 = Locale.prototype; - - proto$1.calendar = calendar; - proto$1.longDateFormat = longDateFormat; - proto$1.invalidDate = invalidDate; - proto$1.ordinal = ordinal; - proto$1.preparse = preParsePostFormat; - proto$1.postformat = preParsePostFormat; - proto$1.relativeTime = relativeTime; - proto$1.pastFuture = pastFuture; - proto$1.set = set; - proto$1.eras = localeEras; - proto$1.erasParse = localeErasParse; - proto$1.erasConvertYear = localeErasConvertYear; - proto$1.erasAbbrRegex = erasAbbrRegex; - proto$1.erasNameRegex = erasNameRegex; - proto$1.erasNarrowRegex = erasNarrowRegex; - - proto$1.months = localeMonths; - proto$1.monthsShort = localeMonthsShort; - proto$1.monthsParse = localeMonthsParse; - proto$1.monthsRegex = monthsRegex; - proto$1.monthsShortRegex = monthsShortRegex; - proto$1.week = localeWeek; - proto$1.firstDayOfYear = localeFirstDayOfYear; - proto$1.firstDayOfWeek = localeFirstDayOfWeek; - - proto$1.weekdays = localeWeekdays; - proto$1.weekdaysMin = localeWeekdaysMin; - proto$1.weekdaysShort = localeWeekdaysShort; - proto$1.weekdaysParse = localeWeekdaysParse; - - proto$1.weekdaysRegex = weekdaysRegex; - proto$1.weekdaysShortRegex = weekdaysShortRegex; - proto$1.weekdaysMinRegex = weekdaysMinRegex; - - proto$1.isPM = localeIsPM; - proto$1.meridiem = localeMeridiem; - - function get$1(format, index, field, setter) { - var locale = getLocale(), - utc = createUTC().set(setter, index); - return locale[field](utc, format); - } - - function listMonthsImpl(format, index, field) { - if (isNumber(format)) { - index = format; - format = undefined; - } - - format = format || ''; - - if (index != null) { - return get$1(format, index, field, 'month'); - } - - var i, - out = []; - for (i = 0; i < 12; i++) { - out[i] = get$1(format, i, field, 'month'); - } - return out; - } - - // () - // (5) - // (fmt, 5) - // (fmt) - // (true) - // (true, 5) - // (true, fmt, 5) - // (true, fmt) - function listWeekdaysImpl(localeSorted, format, index, field) { - if (typeof localeSorted === 'boolean') { - if (isNumber(format)) { - index = format; - format = undefined; - } - - format = format || ''; - } else { - format = localeSorted; - index = format; - localeSorted = false; - - if (isNumber(format)) { - index = format; - format = undefined; - } - - format = format || ''; - } - - var locale = getLocale(), - shift = localeSorted ? locale._week.dow : 0, - i, - out = []; - - if (index != null) { - return get$1(format, (index + shift) % 7, field, 'day'); - } - - for (i = 0; i < 7; i++) { - out[i] = get$1(format, (i + shift) % 7, field, 'day'); - } - return out; - } - - function listMonths(format, index) { - return listMonthsImpl(format, index, 'months'); - } - - function listMonthsShort(format, index) { - return listMonthsImpl(format, index, 'monthsShort'); - } - - function listWeekdays(localeSorted, format, index) { - return listWeekdaysImpl(localeSorted, format, index, 'weekdays'); - } - - function listWeekdaysShort(localeSorted, format, index) { - return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort'); - } - - function listWeekdaysMin(localeSorted, format, index) { - return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin'); - } - - getSetGlobalLocale('en', { - eras: [ - { - since: '0001-01-01', - until: +Infinity, - offset: 1, - name: 'Anno Domini', - narrow: 'AD', - abbr: 'AD', - }, - { - since: '0000-12-31', - until: -Infinity, - offset: 1, - name: 'Before Christ', - narrow: 'BC', - abbr: 'BC', - }, - ], - dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, - ordinal: function (number) { - var b = number % 10, - output = - toInt((number % 100) / 10) === 1 - ? 'th' - : b === 1 - ? 'st' - : b === 2 - ? 'nd' - : b === 3 - ? 'rd' - : 'th'; - return number + output; - }, - }); - - // Side effect imports - - hooks.lang = deprecate( - 'moment.lang is deprecated. Use moment.locale instead.', - getSetGlobalLocale - ); - hooks.langData = deprecate( - 'moment.langData is deprecated. Use moment.localeData instead.', - getLocale - ); - - var mathAbs = Math.abs; - - function abs() { - var data = this._data; - - this._milliseconds = mathAbs(this._milliseconds); - this._days = mathAbs(this._days); - this._months = mathAbs(this._months); - - data.milliseconds = mathAbs(data.milliseconds); - data.seconds = mathAbs(data.seconds); - data.minutes = mathAbs(data.minutes); - data.hours = mathAbs(data.hours); - data.months = mathAbs(data.months); - data.years = mathAbs(data.years); - - return this; - } - - function addSubtract$1(duration, input, value, direction) { - var other = createDuration(input, value); - - duration._milliseconds += direction * other._milliseconds; - duration._days += direction * other._days; - duration._months += direction * other._months; - - return duration._bubble(); - } - - // supports only 2.0-style add(1, 's') or add(duration) - function add$1(input, value) { - return addSubtract$1(this, input, value, 1); - } - - // supports only 2.0-style subtract(1, 's') or subtract(duration) - function subtract$1(input, value) { - return addSubtract$1(this, input, value, -1); - } - - function absCeil(number) { - if (number < 0) { - return Math.floor(number); - } else { - return Math.ceil(number); - } - } - - function bubble() { - var milliseconds = this._milliseconds, - days = this._days, - months = this._months, - data = this._data, - seconds, - minutes, - hours, - years, - monthsFromDays; - - // if we have a mix of positive and negative values, bubble down first - // check: https://github.com/moment/moment/issues/2166 - if ( - !( - (milliseconds >= 0 && days >= 0 && months >= 0) || - (milliseconds <= 0 && days <= 0 && months <= 0) - ) - ) { - milliseconds += absCeil(monthsToDays(months) + days) * 864e5; - days = 0; - months = 0; - } - - // The following code bubbles up values, see the tests for - // examples of what that means. - data.milliseconds = milliseconds % 1000; - - seconds = absFloor(milliseconds / 1000); - data.seconds = seconds % 60; - - minutes = absFloor(seconds / 60); - data.minutes = minutes % 60; - - hours = absFloor(minutes / 60); - data.hours = hours % 24; - - days += absFloor(hours / 24); - - // convert days to months - monthsFromDays = absFloor(daysToMonths(days)); - months += monthsFromDays; - days -= absCeil(monthsToDays(monthsFromDays)); - - // 12 months -> 1 year - years = absFloor(months / 12); - months %= 12; - - data.days = days; - data.months = months; - data.years = years; - - return this; - } - - function daysToMonths(days) { - // 400 years have 146097 days (taking into account leap year rules) - // 400 years have 12 months === 4800 - return (days * 4800) / 146097; - } - - function monthsToDays(months) { - // the reverse of daysToMonths - return (months * 146097) / 4800; - } - - function as(units) { - if (!this.isValid()) { - return NaN; - } - var days, - months, - milliseconds = this._milliseconds; - - units = normalizeUnits(units); - - if (units === 'month' || units === 'quarter' || units === 'year') { - days = this._days + milliseconds / 864e5; - months = this._months + daysToMonths(days); - switch (units) { - case 'month': - return months; - case 'quarter': - return months / 3; - case 'year': - return months / 12; - } - } else { - // handle milliseconds separately because of floating point math errors (issue #1867) - days = this._days + Math.round(monthsToDays(this._months)); - switch (units) { - case 'week': - return days / 7 + milliseconds / 6048e5; - case 'day': - return days + milliseconds / 864e5; - case 'hour': - return days * 24 + milliseconds / 36e5; - case 'minute': - return days * 1440 + milliseconds / 6e4; - case 'second': - return days * 86400 + milliseconds / 1000; - // Math.floor prevents floating point math errors here - case 'millisecond': - return Math.floor(days * 864e5) + milliseconds; - default: - throw new Error('Unknown unit ' + units); - } - } - } - - // TODO: Use this.as('ms')? - function valueOf$1() { - if (!this.isValid()) { - return NaN; - } - return ( - this._milliseconds + - this._days * 864e5 + - (this._months % 12) * 2592e6 + - toInt(this._months / 12) * 31536e6 - ); - } - - function makeAs(alias) { - return function () { - return this.as(alias); - }; - } - - var asMilliseconds = makeAs('ms'), - asSeconds = makeAs('s'), - asMinutes = makeAs('m'), - asHours = makeAs('h'), - asDays = makeAs('d'), - asWeeks = makeAs('w'), - asMonths = makeAs('M'), - asQuarters = makeAs('Q'), - asYears = makeAs('y'); - - function clone$1() { - return createDuration(this); - } - - function get$2(units) { - units = normalizeUnits(units); - return this.isValid() ? this[units + 's']() : NaN; - } - - function makeGetter(name) { - return function () { - return this.isValid() ? this._data[name] : NaN; - }; - } - - var milliseconds = makeGetter('milliseconds'), - seconds = makeGetter('seconds'), - minutes = makeGetter('minutes'), - hours = makeGetter('hours'), - days = makeGetter('days'), - months = makeGetter('months'), - years = makeGetter('years'); - - function weeks() { - return absFloor(this.days() / 7); - } - - var round = Math.round, - thresholds = { - ss: 44, // a few seconds to seconds - s: 45, // seconds to minute - m: 45, // minutes to hour - h: 22, // hours to day - d: 26, // days to month/week - w: null, // weeks to month - M: 11, // months to year - }; - - // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize - function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { - return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); - } - - function relativeTime$1(posNegDuration, withoutSuffix, thresholds, locale) { - var duration = createDuration(posNegDuration).abs(), - seconds = round(duration.as('s')), - minutes = round(duration.as('m')), - hours = round(duration.as('h')), - days = round(duration.as('d')), - months = round(duration.as('M')), - weeks = round(duration.as('w')), - years = round(duration.as('y')), - a = - (seconds <= thresholds.ss && ['s', seconds]) || - (seconds < thresholds.s && ['ss', seconds]) || - (minutes <= 1 && ['m']) || - (minutes < thresholds.m && ['mm', minutes]) || - (hours <= 1 && ['h']) || - (hours < thresholds.h && ['hh', hours]) || - (days <= 1 && ['d']) || - (days < thresholds.d && ['dd', days]); - - if (thresholds.w != null) { - a = - a || - (weeks <= 1 && ['w']) || - (weeks < thresholds.w && ['ww', weeks]); - } - a = a || - (months <= 1 && ['M']) || - (months < thresholds.M && ['MM', months]) || - (years <= 1 && ['y']) || ['yy', years]; - - a[2] = withoutSuffix; - a[3] = +posNegDuration > 0; - a[4] = locale; - return substituteTimeAgo.apply(null, a); - } - - // This function allows you to set the rounding function for relative time strings - function getSetRelativeTimeRounding(roundingFunction) { - if (roundingFunction === undefined) { - return round; - } - if (typeof roundingFunction === 'function') { - round = roundingFunction; - return true; - } - return false; - } - - // This function allows you to set a threshold for relative time strings - function getSetRelativeTimeThreshold(threshold, limit) { - if (thresholds[threshold] === undefined) { - return false; - } - if (limit === undefined) { - return thresholds[threshold]; - } - thresholds[threshold] = limit; - if (threshold === 's') { - thresholds.ss = limit - 1; - } - return true; - } - - function humanize(argWithSuffix, argThresholds) { - if (!this.isValid()) { - return this.localeData().invalidDate(); - } - - var withSuffix = false, - th = thresholds, - locale, - output; - - if (typeof argWithSuffix === 'object') { - argThresholds = argWithSuffix; - argWithSuffix = false; - } - if (typeof argWithSuffix === 'boolean') { - withSuffix = argWithSuffix; - } - if (typeof argThresholds === 'object') { - th = Object.assign({}, thresholds, argThresholds); - if (argThresholds.s != null && argThresholds.ss == null) { - th.ss = argThresholds.s - 1; - } - } - - locale = this.localeData(); - output = relativeTime$1(this, !withSuffix, th, locale); - - if (withSuffix) { - output = locale.pastFuture(+this, output); - } - - return locale.postformat(output); - } - - var abs$1 = Math.abs; - - function sign(x) { - return (x > 0) - (x < 0) || +x; - } - - function toISOString$1() { - // for ISO strings we do not use the normal bubbling rules: - // * milliseconds bubble up until they become hours - // * days do not bubble at all - // * months bubble up until they become years - // This is because there is no context-free conversion between hours and days - // (think of clock changes) - // and also not between days and months (28-31 days per month) - if (!this.isValid()) { - return this.localeData().invalidDate(); - } - - var seconds = abs$1(this._milliseconds) / 1000, - days = abs$1(this._days), - months = abs$1(this._months), - minutes, - hours, - years, - s, - total = this.asSeconds(), - totalSign, - ymSign, - daysSign, - hmsSign; - - if (!total) { - // this is the same as C#'s (Noda) and python (isodate)... - // but not other JS (goog.date) - return 'P0D'; - } - - // 3600 seconds -> 60 minutes -> 1 hour - minutes = absFloor(seconds / 60); - hours = absFloor(minutes / 60); - seconds %= 60; - minutes %= 60; - - // 12 months -> 1 year - years = absFloor(months / 12); - months %= 12; - - // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js - s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : ''; - - totalSign = total < 0 ? '-' : ''; - ymSign = sign(this._months) !== sign(total) ? '-' : ''; - daysSign = sign(this._days) !== sign(total) ? '-' : ''; - hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : ''; - - return ( - totalSign + - 'P' + - (years ? ymSign + years + 'Y' : '') + - (months ? ymSign + months + 'M' : '') + - (days ? daysSign + days + 'D' : '') + - (hours || minutes || seconds ? 'T' : '') + - (hours ? hmsSign + hours + 'H' : '') + - (minutes ? hmsSign + minutes + 'M' : '') + - (seconds ? hmsSign + s + 'S' : '') - ); - } - - var proto$2 = Duration.prototype; - - proto$2.isValid = isValid$1; - proto$2.abs = abs; - proto$2.add = add$1; - proto$2.subtract = subtract$1; - proto$2.as = as; - proto$2.asMilliseconds = asMilliseconds; - proto$2.asSeconds = asSeconds; - proto$2.asMinutes = asMinutes; - proto$2.asHours = asHours; - proto$2.asDays = asDays; - proto$2.asWeeks = asWeeks; - proto$2.asMonths = asMonths; - proto$2.asQuarters = asQuarters; - proto$2.asYears = asYears; - proto$2.valueOf = valueOf$1; - proto$2._bubble = bubble; - proto$2.clone = clone$1; - proto$2.get = get$2; - proto$2.milliseconds = milliseconds; - proto$2.seconds = seconds; - proto$2.minutes = minutes; - proto$2.hours = hours; - proto$2.days = days; - proto$2.weeks = weeks; - proto$2.months = months; - proto$2.years = years; - proto$2.humanize = humanize; - proto$2.toISOString = toISOString$1; - proto$2.toString = toISOString$1; - proto$2.toJSON = toISOString$1; - proto$2.locale = locale; - proto$2.localeData = localeData; - - proto$2.toIsoString = deprecate( - 'toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', - toISOString$1 - ); - proto$2.lang = lang; - - // FORMATTING - - addFormatToken('X', 0, 0, 'unix'); - addFormatToken('x', 0, 0, 'valueOf'); - - // PARSING - - addRegexToken('x', matchSigned); - addRegexToken('X', matchTimestamp); - addParseToken('X', function (input, array, config) { - config._d = new Date(parseFloat(input) * 1000); - }); - addParseToken('x', function (input, array, config) { - config._d = new Date(toInt(input)); - }); - - //! moment.js - - hooks.version = '2.29.1'; - - setHookCallback(createLocal); - - hooks.fn = proto; - hooks.min = min; - hooks.max = max; - hooks.now = now; - hooks.utc = createUTC; - hooks.unix = createUnix; - hooks.months = listMonths; - hooks.isDate = isDate; - hooks.locale = getSetGlobalLocale; - hooks.invalid = createInvalid; - hooks.duration = createDuration; - hooks.isMoment = isMoment; - hooks.weekdays = listWeekdays; - hooks.parseZone = createInZone; - hooks.localeData = getLocale; - hooks.isDuration = isDuration; - hooks.monthsShort = listMonthsShort; - hooks.weekdaysMin = listWeekdaysMin; - hooks.defineLocale = defineLocale; - hooks.updateLocale = updateLocale; - hooks.locales = listLocales; - hooks.weekdaysShort = listWeekdaysShort; - hooks.normalizeUnits = normalizeUnits; - hooks.relativeTimeRounding = getSetRelativeTimeRounding; - hooks.relativeTimeThreshold = getSetRelativeTimeThreshold; - hooks.calendarFormat = getCalendarFormat; - hooks.prototype = proto; - - // currently HTML5 input type only supports 24-hour formats - hooks.HTML5_FMT = { - DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // - DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // - DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // - DATE: 'YYYY-MM-DD', // - TIME: 'HH:mm', // - TIME_SECONDS: 'HH:mm:ss', // - TIME_MS: 'HH:mm:ss.SSS', // - WEEK: 'GGGG-[W]WW', // - MONTH: 'YYYY-MM', // - }; - - return hooks; - -}))); -}); - -var own = {}.hasOwnProperty; - -var hasOwnProperty_1 = own; - -var splice = [].splice; - -var splice_1 = splice; - -// causes a stack overflow in V8 when trying to insert 100k items for instance. - -function chunkedSplice(list, start, remove, items) { - var end = list.length; - var chunkStart = 0; - var parameters; // Make start between zero and `end` (included). - - if (start < 0) { - start = -start > end ? 0 : end + start; - } else { - start = start > end ? end : start; - } - - remove = remove > 0 ? remove : 0; // No need to chunk the items if there’s only a couple (10k) items. - - if (items.length < 10000) { - parameters = Array.from(items); - parameters.unshift(start, remove); - splice_1.apply(list, parameters); - } else { - // Delete `remove` items starting from `start` - if (remove) splice_1.apply(list, [start, remove]); // Insert the items in chunks to not cause stack overflows. - - while (chunkStart < items.length) { - parameters = items.slice(chunkStart, chunkStart + 10000); - parameters.unshift(start, 0); - splice_1.apply(list, parameters); - chunkStart += 10000; - start += 10000; - } - } -} - -var chunkedSplice_1 = chunkedSplice; - -function miniflat(value) { - return value === null || value === undefined - ? [] - : 'length' in value - ? value - : [value] -} - -var miniflat_1 = miniflat; - -function combineExtensions(extensions) { - var all = {}; - var index = -1; - - while (++index < extensions.length) { - extension(all, extensions[index]); - } - - return all -} - -function extension(all, extension) { - var hook; - var left; - var right; - var code; - - for (hook in extension) { - left = hasOwnProperty_1.call(all, hook) ? all[hook] : (all[hook] = {}); - right = extension[hook]; - - for (code in right) { - left[code] = constructs( - miniflat_1(right[code]), - hasOwnProperty_1.call(left, code) ? left[code] : [] - ); - } - } -} - -function constructs(list, existing) { - var index = -1; - var before = []; - - while (++index < list.length) { -(list[index].add === 'after' ? existing : before).push(list[index]); - } - - chunkedSplice_1(existing, 0, 0, before); - return existing -} - -var combineExtensions_1 = combineExtensions; - -var fromCharCode = String.fromCharCode; - -var fromCharCode_1 = fromCharCode; - -function regexCheck(regex) { - return check - - function check(code) { - return regex.test(fromCharCode_1(code)) - } -} - -var regexCheck_1 = regexCheck; - -var asciiAlpha = regexCheck_1(/[A-Za-z]/); - -var asciiAlpha_1 = asciiAlpha; - -var asciiAlphanumeric = regexCheck_1(/[\dA-Za-z]/); - -var asciiAlphanumeric_1 = asciiAlphanumeric; - -// Note: EOF is seen as ASCII control here, because `null < 32 == true`. -function asciiControl(code) { - return ( - // Special whitespace codes (which have negative values), C0 and Control - // character DEL - code < 32 || code === 127 - ) -} - -var asciiControl_1 = asciiControl; - -function markdownLineEnding(code) { - return code < -2 -} - -var markdownLineEnding_1 = markdownLineEnding; - -// This module is generated by `script/`. -// -// CommonMark handles attention (emphasis, strong) markers based on what comes -// before or after them. -// One such difference is if those characters are Unicode punctuation. -// This script is generated from the Unicode data. -var unicodePunctuation = /[!-\/:-@\[-`\{-~\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\u0C77\u0C84\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\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-\u2E4F\u2E52\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]/; - -var unicodePunctuationRegex = unicodePunctuation; - -// In fact adds to the bundle size. - -var unicodePunctuation$1 = regexCheck_1(unicodePunctuationRegex); - -var unicodePunctuation_1 = unicodePunctuation$1; - -var unicodeWhitespace = regexCheck_1(/\s/); - -var unicodeWhitespace_1 = unicodeWhitespace; - -var www = {tokenize: tokenizeWww}; -var http = {tokenize: tokenizeHttp}; -var domain = {tokenize: tokenizeDomain}; -var path = {tokenize: tokenizePath}; -var punctuation = {tokenize: tokenizePunctuation}; -var domainPunctuation = {tokenize: tokenizeDomainPunctuation}; -var paren = {tokenize: tokenizeParen}; -var namedCharacterReference = {tokenize: tokenizeNamedCharacterReference}; - -var wwwAutolink = {tokenize: tokenizeWwwAutolink, previous: previous}; -var httpAutolink = {tokenize: tokenizeHttpAutolink, previous: previous}; -var emailAutolink = {tokenize: tokenizeEmailAutolink, previous: previous}; - -var text = {}; - -// Export hooked constructs. -var text_1 = text; - -// `0` -var code = 48; - -// While the code is smaller than `{`. -while (code < 123) { - text[code] = emailAutolink; - code++; - // Jump from `:` -> `A` - if (code === 58) code = 65; - // Jump from `[` -> `a` - else if (code === 91) code = 97; -} - -// `+` -text[43] = emailAutolink; -// `-` -text[45] = emailAutolink; -// `.` -text[46] = emailAutolink; -// `_` -text[95] = emailAutolink; -// `h`. -text[72] = [emailAutolink, httpAutolink]; -text[104] = [emailAutolink, httpAutolink]; -// `w`. -text[87] = [emailAutolink, wwwAutolink]; -text[119] = [emailAutolink, wwwAutolink]; - -function tokenizeEmailAutolink(effects, ok, nok) { - var self = this; - var hasDot; - - return start - - function start(code) { - /* istanbul ignore next - hooks. */ - if (!gfmAtext(code) || !previous(self.previous)) { - return nok(code) - } - - effects.enter('literalAutolink'); - effects.enter('literalAutolinkEmail'); - return atext(code) - } - - function atext(code) { - if (gfmAtext(code)) { - effects.consume(code); - return atext - } - - // `@` - if (code === 64) { - effects.consume(code); - return label - } - - return nok(code) - } - - function label(code) { - // `.` - if (code === 46) { - return effects.check(punctuation, done, dotContinuation)(code) - } - - if ( - // `-` - code === 45 || - // `_` - code === 95 - ) { - return effects.check(punctuation, nok, dashOrUnderscoreContinuation)(code) - } - - if (asciiAlphanumeric_1(code)) { - effects.consume(code); - return label - } - - return done(code) - } - - function dotContinuation(code) { - effects.consume(code); - hasDot = true; - return label - } - - function dashOrUnderscoreContinuation(code) { - effects.consume(code); - return afterDashOrUnderscore - } - - function afterDashOrUnderscore(code) { - // `.` - if (code === 46) { - return effects.check(punctuation, nok, dotContinuation)(code) - } - - return label(code) - } - - function done(code) { - if (hasDot) { - effects.exit('literalAutolinkEmail'); - effects.exit('literalAutolink'); - return ok(code) - } - - return nok(code) - } -} - -function tokenizeWwwAutolink(effects, ok, nok) { - var self = this; - - return start - - function start(code) { - /* istanbul ignore next - hooks. */ - if ((code !== 87 && code - 32 !== 87) || !previous(self.previous)) { - return nok(code) - } - - effects.enter('literalAutolink'); - effects.enter('literalAutolinkWww'); - return effects.check( - www, - effects.attempt(domain, effects.attempt(path, done), nok), - nok - )(code) - } - - function done(code) { - effects.exit('literalAutolinkWww'); - effects.exit('literalAutolink'); - return ok(code) - } -} - -function tokenizeHttpAutolink(effects, ok, nok) { - var self = this; - - return start - - function start(code) { - /* istanbul ignore next - hooks. */ - if ((code !== 72 && code - 32 !== 72) || !previous(self.previous)) { - return nok(code) - } - - effects.enter('literalAutolink'); - effects.enter('literalAutolinkHttp'); - return effects.check( - http, - effects.attempt(domain, effects.attempt(path, done), nok), - nok - )(code) - } - - function done(code) { - effects.exit('literalAutolinkHttp'); - effects.exit('literalAutolink'); - return ok(code) - } -} - -function tokenizeHttp(effects, ok, nok) { - return start - - function start(code) { - // Assume a `h`. - effects.consume(code); - return t1 - } - - function t1(code) { - // `t` - if (code === 84 || code - 32 === 84) { - effects.consume(code); - return t2 - } - - return nok(code) - } - - function t2(code) { - // `t` - if (code === 84 || code - 32 === 84) { - effects.consume(code); - return p - } - - return nok(code) - } - - function p(code) { - // `p` - if (code === 80 || code - 32 === 80) { - effects.consume(code); - return s - } - - return nok(code) - } - - function s(code) { - // `s` - if (code === 83 || code - 32 === 83) { - effects.consume(code); - return colon - } - - return colon(code) - } - - function colon(code) { - // `:` - if (code === 58) { - effects.consume(code); - return slash1 - } - - return nok(code) - } - - function slash1(code) { - // `/` - if (code === 47) { - effects.consume(code); - return slash2 - } - - return nok(code) - } - - function slash2(code) { - // `/` - if (code === 47) { - effects.consume(code); - return after - } - - return nok(code) - } - - function after(code) { - return asciiControl_1(code) || - unicodeWhitespace_1(code) || - unicodePunctuation_1(code) - ? nok(code) - : ok(code) - } -} - -function tokenizeWww(effects, ok, nok) { - return start - - function start(code) { - // Assume a `w`. - effects.consume(code); - return w2 - } - - function w2(code) { - // `w` - if (code === 87 || code - 32 === 87) { - effects.consume(code); - return w3 - } - - return nok(code) - } - - function w3(code) { - // `w` - if (code === 87 || code - 32 === 87) { - effects.consume(code); - return dot - } - - return nok(code) - } - - function dot(code) { - // `.` - if (code === 46) { - effects.consume(code); - return after - } - - return nok(code) - } - - function after(code) { - return code === null || markdownLineEnding_1(code) ? nok(code) : ok(code) - } -} - -function tokenizeDomain(effects, ok, nok) { - var opened; - var hasUnderscoreInLastSegment; - var hasUnderscoreInLastLastSegment; - - return domain - - function domain(code) { - if ( - // `/` - code === 47 || - asciiControl_1(code) || - unicodeWhitespace_1(code) - ) { - return done(code) - } - - // `&` - if (code === 38) { - return effects.check( - namedCharacterReference, - done, - punctuationContinuation - )(code) - } - - if ( - // `.` - code === 46 || - trailingPunctuation(code) - ) { - return effects.check( - domainPunctuation, - done, - punctuationContinuation - )(code) - } - - open(); - effects.consume(code); - return domain - } - - function punctuationContinuation(code) { - // `.` - if (code === 46) { - hasUnderscoreInLastLastSegment = hasUnderscoreInLastSegment; - hasUnderscoreInLastSegment = undefined; - open(); - effects.consume(code); - return domain - } - - // `_` - if (code === 95) hasUnderscoreInLastSegment = true; - - open(); - effects.consume(code); - return domain - } - - function open() { - if (!opened) { - effects.enter('literalAutolinkDomain'); - opened = true; - } - } - - function done(code) { - if ( - opened && - !hasUnderscoreInLastLastSegment && - !hasUnderscoreInLastSegment - ) { - effects.exit('literalAutolinkDomain'); - return ok(code) - } - - return nok(code) - } -} - -function tokenizePath(effects, ok) { - var balance = 0; - - return start - - function start(code) { - // `/` - return code === 47 ? atPathStart(code) : ok(code) - } - - function atPathStart(code) { - effects.enter('literalAutolinkPath'); - return inPath(code) - } - - function inPath(code) { - // `&` - if (code === 38) { - return effects.check( - namedCharacterReference, - atPathEnd, - continuedPunctuation - )(code) - } - - // `(` - if (code === 40) { - balance++; - } - - // `)` - if (code === 41) { - return effects.check(paren, parenAtPathEnd, continuedPunctuation)(code) - } - - if (pathEnd(code)) { - return atPathEnd(code) - } - - if (trailingPunctuation(code)) { - return effects.check(punctuation, atPathEnd, continuedPunctuation)(code) - } - - effects.consume(code); - return inPath - } - - function continuedPunctuation(code) { - effects.consume(code); - return inPath - } - - function parenAtPathEnd(code) { - balance--; - return balance < 0 ? atPathEnd(code) : continuedPunctuation(code) - } - - function atPathEnd(code) { - effects.exit('literalAutolinkPath'); - return ok(code) - } -} - -function tokenizeNamedCharacterReference(effects, ok, nok) { - return start - - function start(code) { - // Assume an ampersand. - effects.enter('literalAutolinkCharacterReferenceNamed'); - effects.consume(code); - return inside - } - - function inside(code) { - if (asciiAlpha_1(code)) { - effects.consume(code); - return inside - } - - // `;` - if (code === 59) { - effects.consume(code); - return after - } - - return nok(code) - } - - function after(code) { - // If the named character reference is followed by the end of the path, it’s - // not continued punctuation. - effects.exit('literalAutolinkCharacterReferenceNamed'); - return pathEnd(code) ? ok(code) : nok(code) - } -} - -function tokenizeParen(effects, ok, nok) { - return start - - function start(code) { - // Assume a right paren. - effects.enter('literalAutolinkParen'); - effects.consume(code); - return after - } - - function after(code) { - // If the punctuation marker is followed by the end of the path, it’s not - // continued punctuation. - effects.exit('literalAutolinkParen'); - return pathEnd(code) || - // `)` - code === 41 - ? ok(code) - : nok(code) - } -} - -function tokenizePunctuation(effects, ok, nok) { - return start - - function start(code) { - effects.enter('literalAutolinkPunctuation'); - // Always a valid trailing punctuation marker. - effects.consume(code); - return after - } - - function after(code) { - // If the punctuation marker is followed by the end of the path, it’s not - // continued punctuation. - effects.exit('literalAutolinkPunctuation'); - return pathEnd(code) ? ok(code) : nok(code) - } -} - -function tokenizeDomainPunctuation(effects, ok, nok) { - return start - - function start(code) { - effects.enter('literalAutolinkPunctuation'); - // Always a valid trailing punctuation marker. - effects.consume(code); - return after - } - - function after(code) { - // Check the next. - if (trailingPunctuation(code)) { - effects.consume(code); - return after - } - - // If the punctuation marker is followed by the end of the path, it’s not - // continued punctuation. - effects.exit('literalAutolinkPunctuation'); - return pathEnd(code) ? ok(code) : nok(code) - } -} - -function trailingPunctuation(code) { - return ( - // `!` - code === 33 || - // `"` - code === 34 || - // `'` - code === 39 || - // `)` - code === 41 || - // `*` - code === 42 || - // `,` - code === 44 || - // `.` - code === 46 || - // `:` - code === 58 || - // `;` - code === 59 || - // `<` - code === 60 || - // `?` - code === 63 || - // `_`. - code === 95 || - // `~` - code === 126 - ) -} - -function pathEnd(code) { - return ( - // EOF. - code === null || - // CR, LF, CRLF, HT, VS. - code < 0 || - // Space. - code === 32 || - // `<` - code === 60 - ) -} - -function gfmAtext(code) { - return ( - // `+` - code === 43 || - // `-` - code === 45 || - // `.` - code === 46 || - // `_` - code === 95 || - asciiAlphanumeric_1(code) - ) -} - -function previous(code) { - return ( - // EOF. - code === null || - // CR, LF, CRLF, HT, VS. - code < 0 || - // Space. - code === 32 || - // `(` - code === 40 || - // `*` - code === 42 || - // `_`. - code === 95 || - // `~` - code === 126 - ) -} - -var syntax = { - text: text_1 -}; - -var micromarkExtensionGfmAutolinkLiteral = syntax; - -function markdownLineEndingOrSpace(code) { - return code < 0 || code === 32 -} - -var markdownLineEndingOrSpace_1 = markdownLineEndingOrSpace; - -// Classify whether a character is unicode whitespace, unicode punctuation, or -// anything else. -// Used for attention (emphasis, strong), whose sequences can open or close -// based on the class of surrounding characters. -function classifyCharacter(code) { - if ( - code === null || - markdownLineEndingOrSpace_1(code) || - unicodeWhitespace_1(code) - ) { - return 1 - } - - if (unicodePunctuation_1(code)) { - return 2 - } -} - -var classifyCharacter_1 = classifyCharacter; - -function resolveAll(constructs, events, context) { - var called = []; - var index = -1; - var resolve; - - while (++index < constructs.length) { - resolve = constructs[index].resolveAll; - - if (resolve && called.indexOf(resolve) < 0) { - events = resolve(events, context); - called.push(resolve); - } - } - - return events -} - -var resolveAll_1 = resolveAll; - -var assign = Object.assign; - -var assign_1 = assign; - -function shallow(object) { - return assign_1({}, object) -} - -var shallow_1 = shallow; - -var micromarkExtensionGfmStrikethrough = create; - - - - - - -function create(options) { - var settings = options || {}; - var single = settings.singleTilde; - var tokenizer = { - tokenize: tokenizeStrikethrough, - resolveAll: resolveAllStrikethrough - }; - - if (single === null || single === undefined) { - single = true; - } - - return {text: {126: tokenizer}, insideSpan: {null: tokenizer}} - - // Take events and resolve strikethrough. - function resolveAllStrikethrough(events, context) { - var index = -1; - var strikethrough; - var text; - var open; - var nextEvents; - - // Walk through all events. - while (++index < events.length) { - // Find a token that can close. - if ( - events[index][0] === 'enter' && - events[index][1].type === 'strikethroughSequenceTemporary' && - events[index][1]._close - ) { - open = index; - - // Now walk back to find an opener. - while (open--) { - // Find a token that can open the closer. - if ( - events[open][0] === 'exit' && - events[open][1].type === 'strikethroughSequenceTemporary' && - events[open][1]._open && - // If the sizes are the same: - events[index][1].end.offset - events[index][1].start.offset === - events[open][1].end.offset - events[open][1].start.offset - ) { - events[index][1].type = 'strikethroughSequence'; - events[open][1].type = 'strikethroughSequence'; - - strikethrough = { - type: 'strikethrough', - start: shallow_1(events[open][1].start), - end: shallow_1(events[index][1].end) - }; - - text = { - type: 'strikethroughText', - start: shallow_1(events[open][1].end), - end: shallow_1(events[index][1].start) - }; - - // Opening. - nextEvents = [ - ['enter', strikethrough, context], - ['enter', events[open][1], context], - ['exit', events[open][1], context], - ['enter', text, context] - ]; - - // Between. - chunkedSplice_1( - nextEvents, - nextEvents.length, - 0, - resolveAll_1( - context.parser.constructs.insideSpan.null, - events.slice(open + 1, index), - context - ) - ); - - // Closing. - chunkedSplice_1(nextEvents, nextEvents.length, 0, [ - ['exit', text, context], - ['enter', events[index][1], context], - ['exit', events[index][1], context], - ['exit', strikethrough, context] - ]); - - chunkedSplice_1(events, open - 1, index - open + 3, nextEvents); - - index = open + nextEvents.length - 2; - break - } - } - } - } - - return removeRemainingSequences(events) - } - - function removeRemainingSequences(events) { - var index = -1; - var length = events.length; - - while (++index < length) { - if (events[index][1].type === 'strikethroughSequenceTemporary') { - events[index][1].type = 'data'; - } - } - - return events - } - - function tokenizeStrikethrough(effects, ok, nok) { - var previous = this.previous; - var events = this.events; - var size = 0; - - return start - - function start(code) { - if ( - code !== 126 || - (previous === 126 && - events[events.length - 1][1].type !== 'characterEscape') - ) { - return nok(code) - } - - effects.enter('strikethroughSequenceTemporary'); - return more(code) - } - - function more(code) { - var before = classifyCharacter_1(previous); - var token; - var after; - - if (code === 126) { - // If this is the third marker, exit. - if (size > 1) return nok(code) - effects.consume(code); - size++; - return more - } - - if (size < 2 && !single) return nok(code) - token = effects.exit('strikethroughSequenceTemporary'); - after = classifyCharacter_1(code); - token._open = !after || (after === 2 && before); - token._close = !before || (before === 2 && after); - return ok(code) - } - } -} - -function markdownSpace(code) { - return code === -2 || code === -1 || code === 32 -} - -var markdownSpace_1 = markdownSpace; - -function spaceFactory(effects, ok, type, max) { - var limit = max ? max - 1 : Infinity; - var size = 0; - return start - - function start(code) { - if (markdownSpace_1(code)) { - effects.enter(type); - return prefix(code) - } - - return ok(code) - } - - function prefix(code) { - if (markdownSpace_1(code) && size++ < limit) { - effects.consume(code); - return prefix - } - - effects.exit(type); - return ok(code) - } -} - -var factorySpace = spaceFactory; - -var flow = { - null: {tokenize: tokenizeTable, resolve: resolveTable, interruptible: true} -}; - - - -var setextUnderlineMini = {tokenize: tokenizeSetextUnderlineMini, partial: true}; -var nextPrefixedOrBlank = {tokenize: tokenizeNextPrefixedOrBlank, partial: true}; - -function resolveTable(events, context) { - var length = events.length; - var index = -1; - var token; - var inHead; - var inDelimiterRow; - var inRow; - var cell; - var content; - var text; - var contentStart; - var contentEnd; - var cellStart; - - while (++index < length) { - token = events[index][1]; - - if (inRow) { - if (token.type === 'temporaryTableCellContent') { - contentStart = contentStart || index; - contentEnd = index; - } - - if ( - // Combine separate content parts into one. - (token.type === 'tableCellDivider' || token.type === 'tableRow') && - contentEnd - ) { - content = { - type: 'tableContent', - start: events[contentStart][1].start, - end: events[contentEnd][1].end - }; - text = { - type: 'chunkText', - start: content.start, - end: content.end, - contentType: 'text' - }; - - events.splice( - contentStart, - contentEnd - contentStart + 1, - ['enter', content, context], - ['enter', text, context], - ['exit', text, context], - ['exit', content, context] - ); - index -= contentEnd - contentStart - 3; - length = events.length; - contentStart = undefined; - contentEnd = undefined; - } - } - - if ( - events[index][0] === 'exit' && - (token.type === 'tableCellDivider' || token.type === 'tableRow') && - cellStart && - cellStart + 1 < index - ) { - cell = { - type: inDelimiterRow - ? 'tableDelimiter' - : inHead - ? 'tableHeader' - : 'tableData', - start: events[cellStart][1].start, - end: events[index][1].end - }; - events.splice(index + (token.type === 'tableCellDivider' ? 1 : 0), 0, [ - 'exit', - cell, - context - ]); - events.splice(cellStart, 0, ['enter', cell, context]); - index += 2; - length = events.length; - cellStart = index + 1; - } - - if (token.type === 'tableRow') { - inRow = events[index][0] === 'enter'; - - if (inRow) { - cellStart = index + 1; - } - } - - if (token.type === 'tableDelimiterRow') { - inDelimiterRow = events[index][0] === 'enter'; - - if (inDelimiterRow) { - cellStart = index + 1; - } - } - - if (token.type === 'tableHead') { - inHead = events[index][0] === 'enter'; - } - } - - return events -} - -function tokenizeTable(effects, ok, nok) { - var align = []; - var tableHeaderCount = 0; - var seenDelimiter; - var hasDash; - - return start - - function start(code) { - /* istanbul ignore if - used to be passed in beta micromark versions. */ - if (code === null || code === -5 || code === -4 || code === -3) { - return nok(code) - } - - effects.enter('table')._align = align; - effects.enter('tableHead'); - effects.enter('tableRow'); - - // If we start with a pipe, we open a cell marker. - if (code === 124) { - return cellDividerHead(code) - } - - tableHeaderCount++; - effects.enter('temporaryTableCellContent'); - // Can’t be space or eols at the start of a construct, so we’re in a cell. - return inCellContentHead(code) - } - - function cellDividerHead(code) { - // Always a pipe. - effects.enter('tableCellDivider'); - effects.consume(code); - effects.exit('tableCellDivider'); - seenDelimiter = true; - return cellBreakHead - } - - function cellBreakHead(code) { - // EOF, CR, LF, CRLF. - if (code === null || code === -5 || code === -4 || code === -3) { - return atRowEndHead(code) - } - - // HT, VS, SP. - if (code === -2 || code === -1 || code === 32) { - effects.enter('whitespace'); - effects.consume(code); - return inWhitespaceHead - } - - if (seenDelimiter) { - seenDelimiter = undefined; - tableHeaderCount++; - } - - // `|` - if (code === 124) { - return cellDividerHead(code) - } - - // Anything else is cell content. - effects.enter('temporaryTableCellContent'); - return inCellContentHead(code) - } - - function inWhitespaceHead(code) { - // HT, VS, SP. - if (code === -2 || code === -1 || code === 32) { - effects.consume(code); - return inWhitespaceHead - } - - effects.exit('whitespace'); - return cellBreakHead(code) - } - - function inCellContentHead(code) { - // EOF, whitespace, pipe - if (code === null || code < 0 || code === 32 || code === 124) { - effects.exit('temporaryTableCellContent'); - return cellBreakHead(code) - } - - effects.consume(code); - // `\` - return code === 92 ? inCellContentEscapeHead : inCellContentHead - } - - function inCellContentEscapeHead(code) { - // `\` or `|` - if (code === 92 || code === 124) { - effects.consume(code); - return inCellContentHead - } - - // Anything else. - return inCellContentHead(code) - } - - function atRowEndHead(code) { - if (code === null) { - return nok(code) - } - - effects.exit('tableRow'); - effects.exit('tableHead'); - - // Always a line ending. - effects.enter('lineEnding'); - effects.consume(code); - effects.exit('lineEnding'); - - // If a setext heading, exit. - return effects.check( - setextUnderlineMini, - nok, - // Support an indent before the delimiter row. - factorySpace(effects, rowStartDelimiter, 'linePrefix', 4) - ) - } - - function rowStartDelimiter(code) { - // If there’s another space, or we’re at the EOL/EOF, exit. - if (code === null || code < 0 || code === 32) { - return nok(code) - } - - effects.enter('tableDelimiterRow'); - return atDelimiterRowBreak(code) - } - - function atDelimiterRowBreak(code) { - // EOF, CR, LF, CRLF. - if (code === null || code === -5 || code === -4 || code === -3) { - return rowEndDelimiter(code) - } - - // HT, VS, SP. - if (code === -2 || code === -1 || code === 32) { - effects.enter('whitespace'); - effects.consume(code); - return inWhitespaceDelimiter - } - - // `-` - if (code === 45) { - effects.enter('tableDelimiterFiller'); - effects.consume(code); - hasDash = true; - align.push(null); - return inFillerDelimiter - } - - // `:` - if (code === 58) { - effects.enter('tableDelimiterAlignment'); - effects.consume(code); - effects.exit('tableDelimiterAlignment'); - align.push('left'); - return afterLeftAlignment - } - - // If we start with a pipe, we open a cell marker. - if (code === 124) { - effects.enter('tableCellDivider'); - effects.consume(code); - effects.exit('tableCellDivider'); - return atDelimiterRowBreak - } - - return nok(code) - } - - function inWhitespaceDelimiter(code) { - // HT, VS, SP. - if (code === -2 || code === -1 || code === 32) { - effects.consume(code); - return inWhitespaceDelimiter - } - - effects.exit('whitespace'); - return atDelimiterRowBreak(code) - } - - function inFillerDelimiter(code) { - // `-` - if (code === 45) { - effects.consume(code); - return inFillerDelimiter - } - - effects.exit('tableDelimiterFiller'); - - // `:` - if (code === 58) { - effects.enter('tableDelimiterAlignment'); - effects.consume(code); - effects.exit('tableDelimiterAlignment'); - - align[align.length - 1] = - align[align.length - 1] === 'left' ? 'center' : 'right'; - - return afterRightAlignment - } - - return atDelimiterRowBreak(code) - } - - function afterLeftAlignment(code) { - // `-` - if (code === 45) { - effects.enter('tableDelimiterFiller'); - effects.consume(code); - hasDash = true; - return inFillerDelimiter - } - - // Anything else is not ok. - return nok(code) - } - - function afterRightAlignment(code) { - // EOF, CR, LF, CRLF. - if (code === null || code === -5 || code === -4 || code === -3) { - return rowEndDelimiter(code) - } - - // HT, VS, SP. - if (code === -2 || code === -1 || code === 32) { - effects.enter('whitespace'); - effects.consume(code); - return inWhitespaceDelimiter - } - - // `|` - if (code === 124) { - effects.enter('tableCellDivider'); - effects.consume(code); - effects.exit('tableCellDivider'); - return atDelimiterRowBreak - } - - return nok(code) - } - - function rowEndDelimiter(code) { - effects.exit('tableDelimiterRow'); - - // Exit if there was no dash at all, or if the header cell count is not the - // delimiter cell count. - if (!hasDash || tableHeaderCount !== align.length) { - return nok(code) - } - - if (code === null) { - return tableClose(code) - } - - return effects.check(nextPrefixedOrBlank, tableClose, tableContinue)(code) - } - - function tableClose(code) { - effects.exit('table'); - return ok(code) - } - - function tableContinue(code) { - // Always a line ending. - effects.enter('lineEnding'); - effects.consume(code); - effects.exit('lineEnding'); - // We checked that it’s not a prefixed or blank line, so we’re certain a - // body is coming, though it may be indented. - return factorySpace(effects, bodyStart, 'linePrefix', 4) - } - - function bodyStart(code) { - effects.enter('tableBody'); - return rowStartBody(code) - } - - function rowStartBody(code) { - effects.enter('tableRow'); - - // If we start with a pipe, we open a cell marker. - if (code === 124) { - return cellDividerBody(code) - } - - effects.enter('temporaryTableCellContent'); - // Can’t be space or eols at the start of a construct, so we’re in a cell. - return inCellContentBody(code) - } - - function cellDividerBody(code) { - // Always a pipe. - effects.enter('tableCellDivider'); - effects.consume(code); - effects.exit('tableCellDivider'); - return cellBreakBody - } - - function cellBreakBody(code) { - // EOF, CR, LF, CRLF. - if (code === null || code === -5 || code === -4 || code === -3) { - return atRowEndBody(code) - } - - // HT, VS, SP. - if (code === -2 || code === -1 || code === 32) { - effects.enter('whitespace'); - effects.consume(code); - return inWhitespaceBody - } - - // `|` - if (code === 124) { - return cellDividerBody(code) - } - - // Anything else is cell content. - effects.enter('temporaryTableCellContent'); - return inCellContentBody(code) - } - - function inWhitespaceBody(code) { - // HT, VS, SP. - if (code === -2 || code === -1 || code === 32) { - effects.consume(code); - return inWhitespaceBody - } - - effects.exit('whitespace'); - return cellBreakBody(code) - } - - function inCellContentBody(code) { - // EOF, whitespace, pipe - if (code === null || code < 0 || code === 32 || code === 124) { - effects.exit('temporaryTableCellContent'); - return cellBreakBody(code) - } - - effects.consume(code); - // `\` - return code === 92 ? inCellContentEscapeBody : inCellContentBody - } - - function inCellContentEscapeBody(code) { - // `\` or `|` - if (code === 92 || code === 124) { - effects.consume(code); - return inCellContentBody - } - - // Anything else. - return inCellContentBody(code) - } - - function atRowEndBody(code) { - effects.exit('tableRow'); - - if (code === null) { - return tableBodyClose(code) - } - - return effects.check( - nextPrefixedOrBlank, - tableBodyClose, - tableBodyContinue - )(code) - } - - function tableBodyClose(code) { - effects.exit('tableBody'); - return tableClose(code) - } - - function tableBodyContinue(code) { - // Always a line ending. - effects.enter('lineEnding'); - effects.consume(code); - effects.exit('lineEnding'); - // Support an optional prefix, then start a body row. - return factorySpace(effects, rowStartBody, 'linePrefix', 4) - } -} - -// Based on micromark, but that won’t work as we’re in a table, and that expects -// content. -// -function tokenizeSetextUnderlineMini(effects, ok, nok) { - return start - - function start(code) { - // `-` - if (code !== 45) { - return nok(code) - } - - effects.enter('setextUnderline'); - return sequence(code) - } - - function sequence(code) { - if (code === 45) { - effects.consume(code); - return sequence - } - - return whitespace(code) - } - - function whitespace(code) { - if (code === -2 || code === -1 || code === 32) { - effects.consume(code); - return whitespace - } - - if (code === null || code === -5 || code === -4 || code === -3) { - return ok(code) - } - - return nok(code) - } -} - -function tokenizeNextPrefixedOrBlank(effects, ok, nok) { - var size = 0; - - return start - - function start(code) { - // This is a check, so we don’t care about tokens, but we open a bogus one - // so we’re valid. - effects.enter('check'); - // EOL. - effects.consume(code); - return whitespace - } - - function whitespace(code) { - // VS or SP. - if (code === -1 || code === 32) { - effects.consume(code); - size++; - return size === 4 ? ok : whitespace - } - - // EOF or whitespace - if (code === null || code < 0) { - return ok(code) - } - - // Anything else. - return nok(code) - } -} - -var syntax$1 = { - flow: flow -}; - -var micromarkExtensionGfmTable = syntax$1; - -// Counts tabs based on their expanded size, and CR+LF as one character. - -function sizeChunks(chunks) { - var index = -1; - var size = 0; - - while (++index < chunks.length) { - size += typeof chunks[index] === 'string' ? chunks[index].length : 1; - } - - return size -} - -var sizeChunks_1 = sizeChunks; - -function prefixSize(events, type) { - var tail = events[events.length - 1]; - if (!tail || tail[1].type !== type) return 0 - return sizeChunks_1(tail[2].sliceStream(tail[1])) -} - -var prefixSize_1 = prefixSize; - -var tasklistCheck = {tokenize: tokenizeTasklistCheck}; - -var text$1 = {91: tasklistCheck}; - -function tokenizeTasklistCheck(effects, ok, nok) { - var self = this; - - return open - - function open(code) { - if ( - // Exit if not `[`. - code !== 91 || - // Exit if there’s stuff before. - self.previous !== null || - // Exit if not in the first content that is the first child of a list - // item. - !self._gfmTasklistFirstContentOfListItem - ) { - return nok(code) - } - - effects.enter('taskListCheck'); - effects.enter('taskListCheckMarker'); - effects.consume(code); - effects.exit('taskListCheckMarker'); - return inside - } - - function inside(code) { - // Tab or space. - if (code === -2 || code === 32) { - effects.enter('taskListCheckValueUnchecked'); - effects.consume(code); - effects.exit('taskListCheckValueUnchecked'); - return close - } - - // Upper- and lower `x`. - if (code === 88 || code === 120) { - effects.enter('taskListCheckValueChecked'); - effects.consume(code); - effects.exit('taskListCheckValueChecked'); - return close - } - - return nok(code) - } - - function close(code) { - // `]` - if (code === 93) { - effects.enter('taskListCheckMarker'); - effects.consume(code); - effects.exit('taskListCheckMarker'); - effects.exit('taskListCheck'); - return effects.check({tokenize: spaceThenNonSpace}, ok, nok) - } - - return nok(code) - } -} - -function spaceThenNonSpace(effects, ok, nok) { - var self = this; - - return factorySpace(effects, after, 'whitespace') - - function after(code) { - return prefixSize_1(self.events, 'whitespace') && - code !== null && - !markdownLineEndingOrSpace_1(code) - ? ok(code) - : nok(code) - } -} - -var syntax$2 = { - text: text$1 -}; - -var micromarkExtensionGfmTaskListItem = syntax$2; - -var syntax$3 = create$1; - -function create$1(options) { - return combineExtensions_1([micromarkExtensionGfmAutolinkLiteral, micromarkExtensionGfmStrikethrough(options), micromarkExtensionGfmTable, micromarkExtensionGfmTaskListItem]) -} - -var micromarkExtensionGfm = syntax$3; - -var enter = { - literalAutolink: enterLiteralAutolink, - literalAutolinkEmail: enterLiteralAutolinkValue, - literalAutolinkHttp: enterLiteralAutolinkValue, - literalAutolinkWww: enterLiteralAutolinkValue -}; -var exit = { - literalAutolink: exitLiteralAutolink, - literalAutolinkEmail: exitLiteralAutolinkEmail, - literalAutolinkHttp: exitLiteralAutolinkHttp, - literalAutolinkWww: exitLiteralAutolinkWww -}; - -function enterLiteralAutolink(token) { - this.enter({type: 'link', title: null, url: '', children: []}, token); -} - -function enterLiteralAutolinkValue(token) { - this.config.enter.autolinkProtocol.call(this, token); -} - -function exitLiteralAutolinkHttp(token) { - this.config.exit.autolinkProtocol.call(this, token); -} - -function exitLiteralAutolinkWww(token) { - this.config.exit.data.call(this, token); - this.stack[this.stack.length - 1].url = 'http://' + this.sliceSerialize(token); -} - -function exitLiteralAutolinkEmail(token) { - this.config.exit.autolinkEmail.call(this, token); -} - -function exitLiteralAutolink(token) { - this.exit(token); -} - -var fromMarkdown = { - enter: enter, - exit: exit -}; - -var canContainEols = ['delete']; -var enter$1 = {strikethrough: enterStrikethrough}; -var exit$1 = {strikethrough: exitStrikethrough}; - -function enterStrikethrough(token) { - this.enter({type: 'delete', children: []}, token); -} - -function exitStrikethrough(token) { - this.exit(token); -} - -var fromMarkdown$1 = { - canContainEols: canContainEols, - enter: enter$1, - exit: exit$1 -}; - -var enter$2 = { - table: enterTable, - tableData: enterCell, - tableHeader: enterCell, - tableRow: enterRow -}; -var exit_1 = { - codeText: exitCodeText, - table: exitTable, - tableData: exit$2, - tableHeader: exit$2, - tableRow: exit$2 -}; - -function enterTable(token) { - this.enter({type: 'table', align: token._align, children: []}, token); - this.setData('inTable', true); -} - -function exitTable(token) { - this.exit(token); - this.setData('inTable'); -} - -function enterRow(token) { - this.enter({type: 'tableRow', children: []}, token); -} - -function exit$2(token) { - this.exit(token); -} - -function enterCell(token) { - this.enter({type: 'tableCell', children: []}, token); -} - -// Overwrite the default code text data handler to unescape escaped pipes when -// they are in tables. -function exitCodeText(token) { - var value = this.resume(); - - if (this.getData('inTable')) { - value = value.replace(/\\([\\|])/g, replace); - } - - this.stack[this.stack.length - 1].value = value; - this.exit(token); -} - -function replace($0, $1) { - // Pipes work, backslashes don’t (but can’t escape pipes). - return $1 === '|' ? $1 : $0 -} - -var fromMarkdown$2 = { - enter: enter$2, - exit: exit_1 -}; - -var exit$3 = { - taskListCheckValueChecked: exitCheck, - taskListCheckValueUnchecked: exitCheck, - paragraph: exitParagraphWithTaskListItem -}; - -function exitCheck(token) { - // We’re always in a paragraph, in a list item. - this.stack[this.stack.length - 2].checked = - token.type === 'taskListCheckValueChecked'; -} - -function exitParagraphWithTaskListItem(token) { - var parent = this.stack[this.stack.length - 2]; - var node = this.stack[this.stack.length - 1]; - var siblings = parent.children; - var head = node.children[0]; - var index = -1; - var firstParaghraph; - - if ( - parent && - parent.type === 'listItem' && - typeof parent.checked === 'boolean' && - head && - head.type === 'text' - ) { - while (++index < siblings.length) { - if (siblings[index].type === 'paragraph') { - firstParaghraph = siblings[index]; - break - } - } - - if (firstParaghraph === node) { - // Must start with a space or a tab. - head.value = head.value.slice(1); - - if (head.value.length === 0) { - node.children.shift(); - } else { - head.position.start.column++; - head.position.start.offset++; - node.position.start = Object.assign({}, head.position.start); - } - } - } - - this.exit(token); -} - -var fromMarkdown$3 = { - exit: exit$3 -}; - -var own$1 = {}.hasOwnProperty; - -var fromMarkdown$4 = configure([ - fromMarkdown, - fromMarkdown$1, - fromMarkdown$2, - fromMarkdown$3 -]); - -function configure(extensions) { - var config = {canContainEols: []}; - var length = extensions.length; - var index = -1; - - while (++index < length) { - extension$1(config, extensions[index]); - } - - return config -} - -function extension$1(config, extension) { - var key; - var left; - var right; - - for (key in extension) { - left = own$1.call(config, key) ? config[key] : (config[key] = {}); - right = extension[key]; - - if (key === 'canContainEols') { - config[key] = [].concat(left, right); - } else { - Object.assign(left, right); - } - } -} - -var inConstruct = 'phrasing'; -var notInConstruct = ['autolink', 'link', 'image']; - -var unsafe = [ - { - character: '@', - before: '[+\\-.\\w]', - after: '[\\-.\\w]', - inConstruct: inConstruct, - notInConstruct: notInConstruct - }, - { - character: '.', - before: '[Ww]', - after: '[\\-.\\w]', - inConstruct: inConstruct, - notInConstruct: notInConstruct - }, - { - character: ':', - before: '[ps]', - after: '\\/', - inConstruct: inConstruct, - notInConstruct: notInConstruct - } -]; - -var toMarkdown = { - unsafe: unsafe -}; - -var containerPhrasing = phrasing; - -function phrasing(parent, context, safeOptions) { - var children = parent.children || []; - var results = []; - var index = -1; - var before = safeOptions.before; - var after; - var handle; - var child; - - while (++index < children.length) { - child = children[index]; - - if (index + 1 < children.length) { - handle = context.handle.handlers[children[index + 1].type]; - if (handle && handle.peek) handle = handle.peek; - after = handle - ? handle(children[index + 1], parent, context, { - before: '', - after: '' - }).charAt(0) - : ''; - } else { - after = safeOptions.after; - } - - results.push( - context.handle(child, parent, context, { - before: before, - after: after - }) - ); - before = results[results.length - 1].slice(-1); - } - - return results.join('') -} - -var unsafe$1 = [{character: '~', inConstruct: 'phrasing'}]; -var handlers = {delete: handleDelete}; - -handleDelete.peek = peekDelete; - -function handleDelete(node, _, context) { - var exit = context.enter('emphasis'); - var value = containerPhrasing(node, context, {before: '~', after: '~'}); - exit(); - return '~~' + value + '~~' -} - -function peekDelete() { - return '~' -} - -var toMarkdown$1 = { - unsafe: unsafe$1, - handlers: handlers -}; - -var inlineCode_1 = inlineCode; -inlineCode.peek = inlineCodePeek; - -function inlineCode(node) { - var value = node.value || ''; - var sequence = '`'; - var pad = ''; - - // If there is a single grave accent on its own in the code, use a fence of - // two. - // If there are two in a row, use one. - while (new RegExp('(^|[^`])' + sequence + '([^`]|$)').test(value)) { - sequence += '`'; - } - - // If this is not just spaces or eols (tabs don’t count), and either the - // first or last character are a space, eol, or tick, then pad with spaces. - if ( - /[^ \r\n]/.test(value) && - (/[ \r\n`]/.test(value.charAt(0)) || - /[ \r\n`]/.test(value.charAt(value.length - 1))) - ) { - pad = ' '; - } - - return sequence + pad + value + pad + sequence -} - -function inlineCodePeek() { - return '`' -} - -/*! - * repeat-string - * - * Copyright (c) 2014-2015, Jon Schlinkert. - * Licensed under the MIT License. - */ - -/** - * Results cache - */ - -var res = ''; -var cache; - -/** - * Expose `repeat` - */ - -var repeatString = repeat$1; - -/** - * Repeat the given `string` the specified `number` - * of times. - * - * **Example:** - * - * ```js - * var repeat = require('repeat-string'); - * repeat('A', 5); - * //=> AAAAA - * ``` - * - * @param {String} `string` The string to repeat - * @param {Number} `number` The number of times to repeat the string - * @return {String} Repeated string - * @api public - */ - -function repeat$1(str, num) { - if (typeof str !== 'string') { - throw new TypeError('expected a string'); - } - - // cover common, quick use cases - if (num === 1) return str; - if (num === 2) return str + str; - - var max = str.length * num; - if (cache !== str || typeof cache === 'undefined') { - cache = str; - res = ''; - } else if (res.length >= max) { - return res.substr(0, max); - } - - while (max > res.length && num > 1) { - if (num & 1) { - res += str; - } - - num >>= 1; - str += str; - } - - res += str; - res = res.substr(0, max); - return res; -} - -var markdownTable_1 = markdownTable; - -var trailingWhitespace = / +$/; - -// Characters. -var space = ' '; -var lineFeed = '\n'; -var dash = '-'; -var colon = ':'; -var verticalBar = '|'; - -var x = 0; -var C = 67; -var L = 76; -var R = 82; -var c = 99; -var l = 108; -var r = 114; - -// Create a table from a matrix of strings. -function markdownTable(table, options) { - var settings = options || {}; - var padding = settings.padding !== false; - var start = settings.delimiterStart !== false; - var end = settings.delimiterEnd !== false; - var align = (settings.align || []).concat(); - var alignDelimiters = settings.alignDelimiters !== false; - var alignments = []; - var stringLength = settings.stringLength || defaultStringLength; - var rowIndex = -1; - var rowLength = table.length; - var cellMatrix = []; - var sizeMatrix = []; - var row = []; - var sizes = []; - var longestCellByColumn = []; - var mostCellsPerRow = 0; - var cells; - var columnIndex; - var columnLength; - var largest; - var size; - var cell; - var lines; - var line; - var before; - var after; - var code; - - // This is a superfluous loop if we don’t align delimiters, but otherwise we’d - // do superfluous work when aligning, so optimize for aligning. - while (++rowIndex < rowLength) { - cells = table[rowIndex]; - columnIndex = -1; - columnLength = cells.length; - row = []; - sizes = []; - - if (columnLength > mostCellsPerRow) { - mostCellsPerRow = columnLength; - } - - while (++columnIndex < columnLength) { - cell = serialize(cells[columnIndex]); - - if (alignDelimiters === true) { - size = stringLength(cell); - sizes[columnIndex] = size; - - largest = longestCellByColumn[columnIndex]; - - if (largest === undefined || size > largest) { - longestCellByColumn[columnIndex] = size; - } - } - - row.push(cell); - } - - cellMatrix[rowIndex] = row; - sizeMatrix[rowIndex] = sizes; - } - - // Figure out which alignments to use. - columnIndex = -1; - columnLength = mostCellsPerRow; - - if (typeof align === 'object' && 'length' in align) { - while (++columnIndex < columnLength) { - alignments[columnIndex] = toAlignment(align[columnIndex]); - } - } else { - code = toAlignment(align); - - while (++columnIndex < columnLength) { - alignments[columnIndex] = code; - } - } - - // Inject the alignment row. - columnIndex = -1; - columnLength = mostCellsPerRow; - row = []; - sizes = []; - - while (++columnIndex < columnLength) { - code = alignments[columnIndex]; - before = ''; - after = ''; - - if (code === l) { - before = colon; - } else if (code === r) { - after = colon; - } else if (code === c) { - before = colon; - after = colon; - } - - // There *must* be at least one hyphen-minus in each alignment cell. - size = alignDelimiters - ? Math.max( - 1, - longestCellByColumn[columnIndex] - before.length - after.length - ) - : 1; - - cell = before + repeatString(dash, size) + after; - - if (alignDelimiters === true) { - size = before.length + size + after.length; - - if (size > longestCellByColumn[columnIndex]) { - longestCellByColumn[columnIndex] = size; - } - - sizes[columnIndex] = size; - } - - row[columnIndex] = cell; - } - - // Inject the alignment row. - cellMatrix.splice(1, 0, row); - sizeMatrix.splice(1, 0, sizes); - - rowIndex = -1; - rowLength = cellMatrix.length; - lines = []; - - while (++rowIndex < rowLength) { - row = cellMatrix[rowIndex]; - sizes = sizeMatrix[rowIndex]; - columnIndex = -1; - columnLength = mostCellsPerRow; - line = []; - - while (++columnIndex < columnLength) { - cell = row[columnIndex] || ''; - before = ''; - after = ''; - - if (alignDelimiters === true) { - size = longestCellByColumn[columnIndex] - (sizes[columnIndex] || 0); - code = alignments[columnIndex]; - - if (code === r) { - before = repeatString(space, size); - } else if (code === c) { - if (size % 2 === 0) { - before = repeatString(space, size / 2); - after = before; - } else { - before = repeatString(space, size / 2 + 0.5); - after = repeatString(space, size / 2 - 0.5); - } - } else { - after = repeatString(space, size); - } - } - - if (start === true && columnIndex === 0) { - line.push(verticalBar); - } - - if ( - padding === true && - // Don’t add the opening space if we’re not aligning and the cell is - // empty: there will be a closing space. - !(alignDelimiters === false && cell === '') && - (start === true || columnIndex !== 0) - ) { - line.push(space); - } - - if (alignDelimiters === true) { - line.push(before); - } - - line.push(cell); - - if (alignDelimiters === true) { - line.push(after); - } - - if (padding === true) { - line.push(space); - } - - if (end === true || columnIndex !== columnLength - 1) { - line.push(verticalBar); - } - } - - line = line.join(''); - - if (end === false) { - line = line.replace(trailingWhitespace, ''); - } - - lines.push(line); - } - - return lines.join(lineFeed) -} - -function serialize(value) { - return value === null || value === undefined ? '' : String(value) -} - -function defaultStringLength(value) { - return value.length -} - -function toAlignment(value) { - var code = typeof value === 'string' ? value.charCodeAt(0) : x; - - return code === L || code === l - ? l - : code === R || code === r - ? r - : code === C || code === c - ? c - : x -} - -var toMarkdown_1 = toMarkdown$2; - -function toMarkdown$2(options) { - var settings = options || {}; - var padding = settings.tableCellPadding; - var alignDelimiters = settings.tablePipeAlign; - var stringLength = settings.stringLength; - var around = padding ? ' ' : '|'; - - return { - unsafe: [ - {character: '\r', inConstruct: 'tableCell'}, - {character: '\n', inConstruct: 'tableCell'}, - // A pipe, when followed by a tab or space (padding), or a dash or colon - // (unpadded delimiter row), could result in a table. - {atBreak: true, character: '|', after: '[\t :-]'}, - // A pipe in a cell must be encoded. - {character: '|', inConstruct: 'tableCell'}, - // A colon must be followed by a dash, in which case it could start a - // delimiter row. - {atBreak: true, character: ':', after: '-'}, - // A delimiter row can also start with a dash, when followed by more - // dashes, a colon, or a pipe. - // This is a stricter version than the built in check for lists, thematic - // breaks, and setex heading underlines though: - // - {atBreak: true, character: '-', after: '[:|-]'} - ], - handlers: { - table: handleTable, - tableRow: handleTableRow, - tableCell: handleTableCell, - inlineCode: inlineCodeWithTable - } - } - - function handleTable(node, _, context) { - return serializeData(handleTableAsData(node, context), node.align) - } - - // This function isn’t really used normally, because we handle rows at the - // table level. - // But, if someone passes in a table row, this ensures we make somewhat sense. - function handleTableRow(node, _, context) { - var row = handleTableRowAsData(node, context); - // `markdown-table` will always add an align row - var value = serializeData([row]); - return value.slice(0, value.indexOf('\n')) - } - - function handleTableCell(node, _, context) { - var exit = context.enter('tableCell'); - var value = containerPhrasing(node, context, {before: around, after: around}); - exit(); - return value - } - - function serializeData(matrix, align) { - return markdownTable_1(matrix, { - align: align, - alignDelimiters: alignDelimiters, - padding: padding, - stringLength: stringLength - }) - } - - function handleTableAsData(node, context) { - var children = node.children; - var index = -1; - var length = children.length; - var result = []; - var subexit = context.enter('table'); - - while (++index < length) { - result[index] = handleTableRowAsData(children[index], context); - } - - subexit(); - - return result - } - - function handleTableRowAsData(node, context) { - var children = node.children; - var index = -1; - var length = children.length; - var result = []; - var subexit = context.enter('tableRow'); - - while (++index < length) { - result[index] = handleTableCell(children[index], node, context); - } - - subexit(); - - return result - } - - function inlineCodeWithTable(node, parent, context) { - var value = inlineCode_1(node); - - if (context.stack.indexOf('tableCell') !== -1) { - value = value.replace(/\|/, '\\$&'); - } - - return value - } -} - -var checkBullet_1 = checkBullet; - -function checkBullet(context) { - var marker = context.options.bullet || '*'; - - if (marker !== '*' && marker !== '+' && marker !== '-') { - throw new Error( - 'Cannot serialize items with `' + - marker + - '` for `options.bullet`, expected `*`, `+`, or `-`' - ) - } - - return marker -} - -var checkListItemIndent_1 = checkListItemIndent; - -function checkListItemIndent(context) { - var style = context.options.listItemIndent || 'tab'; - - if (style === 1 || style === '1') { - return 'one' - } - - if (style !== 'tab' && style !== 'one' && style !== 'mixed') { - throw new Error( - 'Cannot serialize items with `' + - style + - '` for `options.listItemIndent`, expected `tab`, `one`, or `mixed`' - ) - } - - return style -} - -var containerFlow = flow$1; - - - -function flow$1(parent, context) { - var children = parent.children || []; - var results = []; - var index = -1; - var child; - - while (++index < children.length) { - child = children[index]; - - results.push( - context.handle(child, parent, context, {before: '\n', after: '\n'}) - ); - - if (index + 1 < children.length) { - results.push(between(child, children[index + 1])); - } - } - - return results.join('') - - function between(left, right) { - var index = -1; - var result; - - while (++index < context.join.length) { - result = context.join[index](left, right, parent, context); - - if (result === true || result === 1) { - break - } - - if (typeof result === 'number') { - return repeatString('\n', 1 + Number(result)) - } - - if (result === false) { - return '\n\n\n\n' - } - } - - return '\n\n' - } -} - -var indentLines_1 = indentLines; - -var eol = /\r?\n|\r/g; - -function indentLines(value, map) { - var result = []; - var start = 0; - var line = 0; - var match; - - while ((match = eol.exec(value))) { - one(value.slice(start, match.index)); - result.push(match[0]); - start = match.index + match[0].length; - line++; - } - - one(value.slice(start)); - - return result.join('') - - function one(value) { - result.push(map(value, line, !value)); - } -} - -var listItem_1 = listItem; - - - - - - - -function listItem(node, parent, context) { - var bullet = checkBullet_1(context); - var listItemIndent = checkListItemIndent_1(context); - var size; - var value; - var exit; - - if (parent && parent.ordered) { - bullet = - (parent.start > -1 ? parent.start : 1) + - (context.options.incrementListMarker === false - ? 0 - : parent.children.indexOf(node)) + - '.'; - } - - size = bullet.length + 1; - - if ( - listItemIndent === 'tab' || - (listItemIndent === 'mixed' && ((parent && parent.spread) || node.spread)) - ) { - size = Math.ceil(size / 4) * 4; - } - - exit = context.enter('listItem'); - value = indentLines_1(containerFlow(node, context), map); - exit(); - - return value - - function map(line, index, blank) { - if (index) { - return (blank ? '' : repeatString(' ', size)) + line - } - - return (blank ? bullet : bullet + repeatString(' ', size - bullet.length)) + line - } -} - -var unsafe$2 = [{atBreak: true, character: '-', after: '[:|-]'}]; - -var handlers$1 = { - listItem: listItemWithTaskListItem -}; - -function listItemWithTaskListItem(node, parent, context) { - var value = listItem_1(node, parent, context); - var head = node.children[0]; - - if (typeof node.checked === 'boolean' && head && head.type === 'paragraph') { - value = value.replace(/^(?:[*+-]|\d+\.)([\r\n]| {1,3})/, check); - } - - return value - - function check($0) { - return $0 + '[' + (node.checked ? 'x' : ' ') + '] ' - } -} - -var toMarkdown$3 = { - unsafe: unsafe$2, - handlers: handlers$1 -}; - -var configure_1 = configure$1; - -function configure$1(base, extension) { - var index = -1; - var key; - - // First do subextensions. - if (extension.extensions) { - while (++index < extension.extensions.length) { - configure$1(base, extension.extensions[index]); - } - } - - for (key in extension) { - if (key === 'extensions') ; else if (key === 'unsafe' || key === 'join') { - base[key] = base[key].concat(extension[key] || []); - } else if (key === 'handlers') { - base[key] = Object.assign(base[key], extension[key] || {}); - } else { - base.options[key] = extension[key]; - } - } - - return base -} - -var toMarkdown_1$1 = toMarkdown$4; - -function toMarkdown$4(options) { - var config = configure_1( - {handlers: {}, join: [], unsafe: [], options: {}}, - { - extensions: [toMarkdown, toMarkdown$1, toMarkdown_1(options), toMarkdown$3] - } - ); - - return Object.assign(config.options, { - handlers: config.handlers, - join: config.join, - unsafe: config.unsafe - }) -} - -var warningIssued; - -var remarkGfm = gfm; - -function gfm(options) { - var data = this.data(); - - /* istanbul ignore next - old remark. */ - if ( - !warningIssued && - ((this.Parser && - this.Parser.prototype && - this.Parser.prototype.blockTokenizers) || - (this.Compiler && - this.Compiler.prototype && - this.Compiler.prototype.visitors)) - ) { - warningIssued = true; - console.warn( - '[remark-gfm] Warning: please upgrade to remark 13 to use this plugin' - ); - } - - add('micromarkExtensions', micromarkExtensionGfm(options)); - add('fromMarkdownExtensions', fromMarkdown$4); - add('toMarkdownExtensions', toMarkdown_1$1(options)); - - function add(field, value) { - /* istanbul ignore if - other extensions. */ - if (data[field]) data[field].push(value); - else data[field] = [value]; - } -} - -var bail_1 = bail; - -function bail(err) { - if (err) { - throw err - } -} - -/*! - * Determine if an object is a Buffer - * - * @author Feross Aboukhadijeh - * @license MIT - */ - -var isBuffer = function isBuffer (obj) { - return obj != null && obj.constructor != null && - typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj) -}; - -var hasOwn = Object.prototype.hasOwnProperty; -var toStr = Object.prototype.toString; -var defineProperty = Object.defineProperty; -var gOPD = Object.getOwnPropertyDescriptor; - -var isArray = function isArray(arr) { - if (typeof Array.isArray === 'function') { - return Array.isArray(arr); - } - - return toStr.call(arr) === '[object Array]'; -}; - -var isPlainObject = function isPlainObject(obj) { - if (!obj || toStr.call(obj) !== '[object Object]') { - return false; - } - - var hasOwnConstructor = hasOwn.call(obj, 'constructor'); - var hasIsPrototypeOf = obj.constructor && obj.constructor.prototype && hasOwn.call(obj.constructor.prototype, 'isPrototypeOf'); - // Not own constructor property must be Object - if (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) { - return false; - } - - // Own properties are enumerated firstly, so to speed up, - // if last one is own, then all properties are own. - var key; - for (key in obj) { /**/ } - - return typeof key === 'undefined' || hasOwn.call(obj, key); -}; - -// If name is '__proto__', and Object.defineProperty is available, define __proto__ as an own property on target -var setProperty = function setProperty(target, options) { - if (defineProperty && options.name === '__proto__') { - defineProperty(target, options.name, { - enumerable: true, - configurable: true, - value: options.newValue, - writable: true - }); - } else { - target[options.name] = options.newValue; - } -}; - -// Return undefined instead of __proto__ if '__proto__' is not an own property -var getProperty = function getProperty(obj, name) { - if (name === '__proto__') { - if (!hasOwn.call(obj, name)) { - return void 0; - } else if (gOPD) { - // In early versions of node, obj['__proto__'] is buggy when obj has - // __proto__ as an own property. Object.getOwnPropertyDescriptor() works. - return gOPD(obj, name).value; - } - } - - return obj[name]; -}; - -var extend$1 = function extend() { - var options, name, src, copy, copyIsArray, clone; - var target = arguments[0]; - var i = 1; - var length = arguments.length; - var deep = false; - - // Handle a deep copy situation - if (typeof target === 'boolean') { - deep = target; - target = arguments[1] || {}; - // skip the boolean and the target - i = 2; - } - if (target == null || (typeof target !== 'object' && typeof target !== 'function')) { - target = {}; - } - - for (; i < length; ++i) { - options = arguments[i]; - // Only deal with non-null/undefined values - if (options != null) { - // Extend the base object - for (name in options) { - src = getProperty(target, name); - copy = getProperty(options, name); - - // Prevent never-ending loop - if (target !== copy) { - // Recurse if we're merging plain objects or arrays - if (deep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) { - if (copyIsArray) { - copyIsArray = false; - clone = src && isArray(src) ? src : []; - } else { - clone = src && isPlainObject(src) ? src : {}; - } - - // Never move original objects, clone them - setProperty(target, { name: name, newValue: extend(deep, clone, copy) }); - - // Don't bring in undefined values - } else if (typeof copy !== 'undefined') { - setProperty(target, { name: name, newValue: copy }); - } - } - } - } - } - - // Return the modified object - return target; -}; - -var isPlainObj = value => { - if (Object.prototype.toString.call(value) !== '[object Object]') { - return false; - } - - const prototype = Object.getPrototypeOf(value); - return prototype === null || prototype === Object.prototype; -}; - -var slice = [].slice; - -var wrap_1 = wrap; - -// Wrap `fn`. -// Can be sync or async; return a promise, receive a completion handler, return -// new values and errors. -function wrap(fn, callback) { - var invoked; - - return wrapped - - function wrapped() { - var params = slice.call(arguments, 0); - var callback = fn.length > params.length; - var result; - - if (callback) { - params.push(done); - } - - try { - result = fn.apply(null, params); - } catch (error) { - // Well, this is quite the pickle. - // `fn` received a callback and invoked it (thus continuing the pipeline), - // but later also threw an error. - // We’re not about to restart the pipeline again, so the only thing left - // to do is to throw the thing instead. - if (callback && invoked) { - throw error - } - - return done(error) - } - - if (!callback) { - if (result && typeof result.then === 'function') { - result.then(then, done); - } else if (result instanceof Error) { - done(result); - } else { - then(result); - } - } - } - - // Invoke `next`, only once. - function done() { - if (!invoked) { - invoked = true; - - callback.apply(null, arguments); - } - } - - // Invoke `done` with one value. - // Tracks if an error is passed, too. - function then(value) { - done(null, value); - } -} - -var trough_1 = trough; - -trough.wrap = wrap_1; - -var slice$1 = [].slice; - -// Create new middleware. -function trough() { - var fns = []; - var middleware = {}; - - middleware.run = run; - middleware.use = use; - - return middleware - - // Run `fns`. Last argument must be a completion handler. - function run() { - var index = -1; - var input = slice$1.call(arguments, 0, -1); - var done = arguments[arguments.length - 1]; - - if (typeof done !== 'function') { - throw new Error('Expected function as last argument, not ' + done) - } - - next.apply(null, [null].concat(input)); - - // Run the next `fn`, if any. - function next(err) { - var fn = fns[++index]; - var params = slice$1.call(arguments, 0); - var values = params.slice(1); - var length = input.length; - var pos = -1; - - if (err) { - done(err); - return - } - - // Copy non-nully input into values. - while (++pos < length) { - if (values[pos] === null || values[pos] === undefined) { - values[pos] = input[pos]; - } - } - - input = values; - - // Next or done. - if (fn) { - wrap_1(fn, next).apply(null, input); - } else { - done.apply(null, [null].concat(input)); - } - } - } - - // Add `fn` to the list. - function use(fn) { - if (typeof fn !== 'function') { - throw new Error('Expected `fn` to be a function, not ' + fn) - } - - fns.push(fn); - - return middleware - } -} - -var own$2 = {}.hasOwnProperty; - -var unistUtilStringifyPosition = stringify; - -function stringify(value) { - // Nothing. - if (!value || typeof value !== 'object') { - return '' - } - - // Node. - if (own$2.call(value, 'position') || own$2.call(value, 'type')) { - return position(value.position) - } - - // Position. - if (own$2.call(value, 'start') || own$2.call(value, 'end')) { - return position(value) - } - - // Point. - if (own$2.call(value, 'line') || own$2.call(value, 'column')) { - return point(value) - } - - // ? - return '' -} - -function point(point) { - if (!point || typeof point !== 'object') { - point = {}; - } - - return index$1(point.line) + ':' + index$1(point.column) -} - -function position(pos) { - if (!pos || typeof pos !== 'object') { - pos = {}; - } - - return point(pos.start) + '-' + point(pos.end) -} - -function index$1(value) { - return value && typeof value === 'number' ? value : 1 -} - -var vfileMessage = VMessage; - -// Inherit from `Error#`. -function VMessagePrototype() {} -VMessagePrototype.prototype = Error.prototype; -VMessage.prototype = new VMessagePrototype(); - -// Message properties. -var proto = VMessage.prototype; - -proto.file = ''; -proto.name = ''; -proto.reason = ''; -proto.message = ''; -proto.stack = ''; -proto.fatal = null; -proto.column = null; -proto.line = null; - -// Construct a new VMessage. -// -// Note: We cannot invoke `Error` on the created context, as that adds readonly -// `line` and `column` attributes on Safari 9, thus throwing and failing the -// data. -function VMessage(reason, position, origin) { - var parts; - var range; - var location; - - if (typeof position === 'string') { - origin = position; - position = null; - } - - parts = parseOrigin(origin); - range = unistUtilStringifyPosition(position) || '1:1'; - - location = { - start: {line: null, column: null}, - end: {line: null, column: null} - }; - - // Node. - if (position && position.position) { - position = position.position; - } - - if (position) { - // Position. - if (position.start) { - location = position; - position = position.start; - } else { - // Point. - location.start = position; - } - } - - if (reason.stack) { - this.stack = reason.stack; - reason = reason.message; - } - - this.message = reason; - this.name = range; - this.reason = reason; - this.line = position ? position.line : null; - this.column = position ? position.column : null; - this.location = location; - this.source = parts[0]; - this.ruleId = parts[1]; -} - -function parseOrigin(origin) { - var result = [null, null]; - var index; - - if (typeof origin === 'string') { - index = origin.indexOf(':'); - - if (index === -1) { - result[1] = origin; - } else { - result[0] = origin.slice(0, index); - result[1] = origin.slice(index + 1); - } - } - - return result -} - -var minpath = require$$0__default['default']; - -var minproc = process; - -var core$1 = VFile; - -var own$3 = {}.hasOwnProperty; - -// Order of setting (least specific to most), we need this because otherwise -// `{stem: 'a', path: '~/b.js'}` would throw, as a path is needed before a -// stem can be set. -var order = ['history', 'path', 'basename', 'stem', 'extname', 'dirname']; - -VFile.prototype.toString = toString; - -// Access full path (`~/index.min.js`). -Object.defineProperty(VFile.prototype, 'path', {get: getPath, set: setPath}); - -// Access parent path (`~`). -Object.defineProperty(VFile.prototype, 'dirname', { - get: getDirname, - set: setDirname -}); - -// Access basename (`index.min.js`). -Object.defineProperty(VFile.prototype, 'basename', { - get: getBasename, - set: setBasename -}); - -// Access extname (`.js`). -Object.defineProperty(VFile.prototype, 'extname', { - get: getExtname, - set: setExtname -}); - -// Access stem (`index.min`). -Object.defineProperty(VFile.prototype, 'stem', {get: getStem, set: setStem}); - -// Construct a new file. -function VFile(options) { - var prop; - var index; - - if (!options) { - options = {}; - } else if (typeof options === 'string' || isBuffer(options)) { - options = {contents: options}; - } else if ('message' in options && 'messages' in options) { - return options - } - - if (!(this instanceof VFile)) { - return new VFile(options) - } - - this.data = {}; - this.messages = []; - this.history = []; - this.cwd = minproc.cwd(); - - // Set path related properties in the correct order. - index = -1; - - while (++index < order.length) { - prop = order[index]; - - if (own$3.call(options, prop)) { - this[prop] = options[prop]; - } - } - - // Set non-path related properties. - for (prop in options) { - if (order.indexOf(prop) < 0) { - this[prop] = options[prop]; - } - } -} - -function getPath() { - return this.history[this.history.length - 1] -} - -function setPath(path) { - assertNonEmpty(path, 'path'); - - if (this.path !== path) { - this.history.push(path); - } -} - -function getDirname() { - return typeof this.path === 'string' ? minpath.dirname(this.path) : undefined -} - -function setDirname(dirname) { - assertPath(this.path, 'dirname'); - this.path = minpath.join(dirname || '', this.basename); -} - -function getBasename() { - return typeof this.path === 'string' ? minpath.basename(this.path) : undefined -} - -function setBasename(basename) { - assertNonEmpty(basename, 'basename'); - assertPart(basename, 'basename'); - this.path = minpath.join(this.dirname || '', basename); -} - -function getExtname() { - return typeof this.path === 'string' ? minpath.extname(this.path) : undefined -} - -function setExtname(extname) { - assertPart(extname, 'extname'); - assertPath(this.path, 'extname'); - - if (extname) { - if (extname.charCodeAt(0) !== 46 /* `.` */) { - throw new Error('`extname` must start with `.`') - } - - if (extname.indexOf('.', 1) > -1) { - throw new Error('`extname` cannot contain multiple dots') - } - } - - this.path = minpath.join(this.dirname, this.stem + (extname || '')); -} - -function getStem() { - return typeof this.path === 'string' - ? minpath.basename(this.path, this.extname) - : undefined -} - -function setStem(stem) { - assertNonEmpty(stem, 'stem'); - assertPart(stem, 'stem'); - this.path = minpath.join(this.dirname || '', stem + (this.extname || '')); -} - -// Get the value of the file. -function toString(encoding) { - return (this.contents || '').toString(encoding) -} - -// Assert that `part` is not a path (i.e., does not contain `p.sep`). -function assertPart(part, name) { - if (part && part.indexOf(minpath.sep) > -1) { - throw new Error( - '`' + name + '` cannot be a path: did not expect `' + minpath.sep + '`' - ) - } -} - -// Assert that `part` is not empty. -function assertNonEmpty(part, name) { - if (!part) { - throw new Error('`' + name + '` cannot be empty') - } -} - -// Assert `path` exists. -function assertPath(path, name) { - if (!path) { - throw new Error('Setting `' + name + '` requires `path` to be set too') - } -} - -var lib = core$1; - -core$1.prototype.message = message; -core$1.prototype.info = info; -core$1.prototype.fail = fail; - -// Create a message with `reason` at `position`. -// When an error is passed in as `reason`, copies the stack. -function message(reason, position, origin) { - var message = new vfileMessage(reason, position, origin); - - if (this.path) { - message.name = this.path + ':' + message.name; - message.file = this.path; - } - - message.fatal = false; - - this.messages.push(message); - - return message -} - -// Fail: creates a vmessage, associates it with the file, and throws it. -function fail() { - var message = this.message.apply(this, arguments); - - message.fatal = true; - - throw message -} - -// Info: creates a vmessage, associates it with the file, and marks the fatality -// as null. -function info() { - var message = this.message.apply(this, arguments); - - message.fatal = null; - - return message -} - -var vfile = lib; - -// Expose a frozen processor. -var unified_1 = unified().freeze(); - -var slice$2 = [].slice; -var own$4 = {}.hasOwnProperty; - -// Process pipeline. -var pipeline = trough_1() - .use(pipelineParse) - .use(pipelineRun) - .use(pipelineStringify); - -function pipelineParse(p, ctx) { - ctx.tree = p.parse(ctx.file); -} - -function pipelineRun(p, ctx, next) { - p.run(ctx.tree, ctx.file, done); - - function done(err, tree, file) { - if (err) { - next(err); - } else { - ctx.tree = tree; - ctx.file = file; - next(); - } - } -} - -function pipelineStringify(p, ctx) { - var result = p.stringify(ctx.tree, ctx.file); - var file = ctx.file; - - if (result === undefined || result === null) ; else if (typeof result === 'string' || isBuffer(result)) { - file.contents = result; - } else { - file.result = result; - } -} - -// Function to create the first processor. -function unified() { - var attachers = []; - var transformers = trough_1(); - var namespace = {}; - var frozen = false; - var freezeIndex = -1; - - // Data management. - processor.data = data; - - // Lock. - processor.freeze = freeze; - - // Plugins. - processor.attachers = attachers; - processor.use = use; - - // API. - processor.parse = parse; - processor.stringify = stringify; - processor.run = run; - processor.runSync = runSync; - processor.process = process; - processor.processSync = processSync; - - // Expose. - return processor - - // Create a new processor based on the processor in the current scope. - function processor() { - var destination = unified(); - var length = attachers.length; - var index = -1; - - while (++index < length) { - destination.use.apply(null, attachers[index]); - } - - destination.data(extend$1(true, {}, namespace)); - - return destination - } - - // Freeze: used to signal a processor that has finished configuration. - // - // For example, take unified itself: it’s frozen. - // Plugins should not be added to it. - // Rather, it should be extended, by invoking it, before modifying it. - // - // In essence, always invoke this when exporting a processor. - function freeze() { - var values; - var plugin; - var options; - var transformer; - - if (frozen) { - return processor - } - - while (++freezeIndex < attachers.length) { - values = attachers[freezeIndex]; - plugin = values[0]; - options = values[1]; - transformer = null; - - if (options === false) { - continue - } - - if (options === true) { - values[1] = undefined; - } - - transformer = plugin.apply(processor, values.slice(1)); - - if (typeof transformer === 'function') { - transformers.use(transformer); - } - } - - frozen = true; - freezeIndex = Infinity; - - return processor - } - - // Data management. - // Getter / setter for processor-specific informtion. - function data(key, value) { - if (typeof key === 'string') { - // Set `key`. - if (arguments.length === 2) { - assertUnfrozen('data', frozen); - - namespace[key] = value; - - return processor - } - - // Get `key`. - return (own$4.call(namespace, key) && namespace[key]) || null - } - - // Set space. - if (key) { - assertUnfrozen('data', frozen); - namespace = key; - return processor - } - - // Get space. - return namespace - } - - // Plugin management. - // - // Pass it: - // * an attacher and options, - // * a preset, - // * a list of presets, attachers, and arguments (list of attachers and - // options). - function use(value) { - var settings; - - assertUnfrozen('use', frozen); - - if (value === null || value === undefined) ; else if (typeof value === 'function') { - addPlugin.apply(null, arguments); - } else if (typeof value === 'object') { - if ('length' in value) { - addList(value); - } else { - addPreset(value); - } - } else { - throw new Error('Expected usable value, not `' + value + '`') - } - - if (settings) { - namespace.settings = extend$1(namespace.settings || {}, settings); - } - - return processor - - function addPreset(result) { - addList(result.plugins); - - if (result.settings) { - settings = extend$1(settings || {}, result.settings); - } - } - - function add(value) { - if (typeof value === 'function') { - addPlugin(value); - } else if (typeof value === 'object') { - if ('length' in value) { - addPlugin.apply(null, value); - } else { - addPreset(value); - } - } else { - throw new Error('Expected usable value, not `' + value + '`') - } - } - - function addList(plugins) { - var length; - var index; - - if (plugins === null || plugins === undefined) ; else if (typeof plugins === 'object' && 'length' in plugins) { - length = plugins.length; - index = -1; - - while (++index < length) { - add(plugins[index]); - } - } else { - throw new Error('Expected a list of plugins, not `' + plugins + '`') - } - } - - function addPlugin(plugin, value) { - var entry = find(plugin); - - if (entry) { - if (isPlainObj(entry[1]) && isPlainObj(value)) { - value = extend$1(entry[1], value); - } - - entry[1] = value; - } else { - attachers.push(slice$2.call(arguments)); - } - } - } - - function find(plugin) { - var length = attachers.length; - var index = -1; - var entry; - - while (++index < length) { - entry = attachers[index]; - - if (entry[0] === plugin) { - return entry - } - } - } - - // Parse a file (in string or vfile representation) into a unist node using - // the `Parser` on the processor. - function parse(doc) { - var file = vfile(doc); - var Parser; - - freeze(); - Parser = processor.Parser; - assertParser('parse', Parser); - - if (newable(Parser, 'parse')) { - return new Parser(String(file), file).parse() - } - - return Parser(String(file), file) // eslint-disable-line new-cap - } - - // Run transforms on a unist node representation of a file (in string or - // vfile representation), async. - function run(node, file, cb) { - assertNode(node); - freeze(); - - if (!cb && typeof file === 'function') { - cb = file; - file = null; - } - - if (!cb) { - return new Promise(executor) - } - - executor(null, cb); - - function executor(resolve, reject) { - transformers.run(node, vfile(file), done); - - function done(err, tree, file) { - tree = tree || node; - if (err) { - reject(err); - } else if (resolve) { - resolve(tree); - } else { - cb(null, tree, file); - } - } - } - } - - // Run transforms on a unist node representation of a file (in string or - // vfile representation), sync. - function runSync(node, file) { - var complete = false; - var result; - - run(node, file, done); - - assertDone('runSync', 'run', complete); - - return result - - function done(err, tree) { - complete = true; - bail_1(err); - result = tree; - } - } - - // Stringify a unist node representation of a file (in string or vfile - // representation) into a string using the `Compiler` on the processor. - function stringify(node, doc) { - var file = vfile(doc); - var Compiler; - - freeze(); - Compiler = processor.Compiler; - assertCompiler('stringify', Compiler); - assertNode(node); - - if (newable(Compiler, 'compile')) { - return new Compiler(node, file).compile() - } - - return Compiler(node, file) // eslint-disable-line new-cap - } - - // Parse a file (in string or vfile representation) into a unist node using - // the `Parser` on the processor, then run transforms on that node, and - // compile the resulting node using the `Compiler` on the processor, and - // store that result on the vfile. - function process(doc, cb) { - freeze(); - assertParser('process', processor.Parser); - assertCompiler('process', processor.Compiler); - - if (!cb) { - return new Promise(executor) - } - - executor(null, cb); - - function executor(resolve, reject) { - var file = vfile(doc); - - pipeline.run(processor, {file: file}, done); - - function done(err) { - if (err) { - reject(err); - } else if (resolve) { - resolve(file); - } else { - cb(null, file); - } - } - } - } - - // Process the given document (in string or vfile representation), sync. - function processSync(doc) { - var complete = false; - var file; - - freeze(); - assertParser('processSync', processor.Parser); - assertCompiler('processSync', processor.Compiler); - file = vfile(doc); - - process(file, done); - - assertDone('processSync', 'process', complete); - - return file - - function done(err) { - complete = true; - bail_1(err); - } - } -} - -// Check if `value` is a constructor. -function newable(value, name) { - return ( - typeof value === 'function' && - value.prototype && - // A function with keys in its prototype is probably a constructor. - // Classes’ prototype methods are not enumerable, so we check if some value - // exists in the prototype. - (keys(value.prototype) || name in value.prototype) - ) -} - -// Check if `value` is an object with keys. -function keys(value) { - var key; - for (key in value) { - return true - } - - return false -} - -// Assert a parser is available. -function assertParser(name, Parser) { - if (typeof Parser !== 'function') { - throw new Error('Cannot `' + name + '` without `Parser`') - } -} - -// Assert a compiler is available. -function assertCompiler(name, Compiler) { - if (typeof Compiler !== 'function') { - throw new Error('Cannot `' + name + '` without `Compiler`') - } -} - -// Assert the processor is not frozen. -function assertUnfrozen(name, frozen) { - if (frozen) { - throw new Error( - 'Cannot invoke `' + - name + - '` on a frozen processor.\nCreate a new processor first, by invoking it: use `processor()` instead of `processor`.' - ) - } -} - -// Assert `node` is a unist node. -function assertNode(node) { - if (!node || typeof node.type !== 'string') { - throw new Error('Expected node, got `' + node + '`') - } -} - -// Assert that `complete` is `true`. -function assertDone(name, asyncName, complete) { - if (!complete) { - throw new Error( - '`' + name + '` finished async. Use `' + asyncName + '` instead' - ) - } -} - -/** - * Expose `isUrl`. - */ - -var isUrl_1 = isUrl; - -/** - * RegExps. - * A URL must match #1 and then at least one of #2/#3. - * Use two levels of REs to avoid REDOS. - */ - -var protocolAndDomainRE = /^(?:\w+:)?\/\/(\S+)$/; - -var localhostDomainRE = /^localhost[\:?\d]*(?:[^\:?\d]\S*)?$/; -var nonLocalhostDomainRE = /^[^\s\.]+\.\S{2,}$/; - -/** - * Loosely validate a URL `string`. - * - * @param {String} string - * @return {Boolean} - */ - -function isUrl(string){ - if (typeof string !== 'string') { - return false; - } - - var match = string.match(protocolAndDomainRE); - if (!match) { - return false; - } - - var everythingAfterProtocol = match[1]; - if (!everythingAfterProtocol) { - return false; - } - - if (localhostDomainRE.test(everythingAfterProtocol) || - nonLocalhostDomainRE.test(everythingAfterProtocol)) { - return true; - } - - return false; -} - -var convert_1 = convert; - -function convert(test) { - if (test == null) { - return ok - } - - if (typeof test === 'string') { - return typeFactory(test) - } - - if (typeof test === 'object') { - return 'length' in test ? anyFactory(test) : allFactory(test) - } - - if (typeof test === 'function') { - return test - } - - throw new Error('Expected function, string, or object as test') -} - -// Utility assert each property in `test` is represented in `node`, and each -// values are strictly equal. -function allFactory(test) { - return all - - function all(node) { - var key; - - for (key in test) { - if (node[key] !== test[key]) return false - } - - return true - } -} - -function anyFactory(tests) { - var checks = []; - var index = -1; - - while (++index < tests.length) { - checks[index] = convert(tests[index]); - } - - return any - - function any() { - var index = -1; - - while (++index < checks.length) { - if (checks[index].apply(this, arguments)) { - return true - } - } - - return false - } -} - -// Utility to convert a string into a function which checks a given node’s type -// for said string. -function typeFactory(test) { - return type - - function type(node) { - return Boolean(node && node.type === test) - } -} - -// Utility to return true. -function ok() { - return true -} - -var color_1 = color; -function color(d) { - return '\u001B[33m' + d + '\u001B[39m' -} - -var unistUtilVisitParents = visitParents; - - - - -var CONTINUE = true; -var SKIP = 'skip'; -var EXIT = false; - -visitParents.CONTINUE = CONTINUE; -visitParents.SKIP = SKIP; -visitParents.EXIT = EXIT; - -function visitParents(tree, test, visitor, reverse) { - var step; - var is; - - if (typeof test === 'function' && typeof visitor !== 'function') { - reverse = visitor; - visitor = test; - test = null; - } - - is = convert_1(test); - step = reverse ? -1 : 1; - - factory(tree, null, [])(); - - function factory(node, index, parents) { - var value = typeof node === 'object' && node !== null ? node : {}; - var name; - - if (typeof value.type === 'string') { - name = - typeof value.tagName === 'string' - ? value.tagName - : typeof value.name === 'string' - ? value.name - : undefined; - - visit.displayName = - 'node (' + color_1(value.type + (name ? '<' + name + '>' : '')) + ')'; - } - - return visit - - function visit() { - var grandparents = parents.concat(node); - var result = []; - var subresult; - var offset; - - if (!test || is(node, index, parents[parents.length - 1] || null)) { - result = toResult(visitor(node, parents)); - - if (result[0] === EXIT) { - return result - } - } - - if (node.children && result[0] !== SKIP) { - offset = (reverse ? node.children.length : -1) + step; - - while (offset > -1 && offset < node.children.length) { - subresult = factory(node.children[offset], offset, grandparents)(); - - if (subresult[0] === EXIT) { - return subresult - } - - offset = - typeof subresult[1] === 'number' ? subresult[1] : offset + step; - } - } - - return result - } - } -} - -function toResult(value) { - if (value !== null && typeof value === 'object' && 'length' in value) { - return value - } - - if (typeof value === 'number') { - return [CONTINUE, value] - } - - return [value] -} - -const isImgExt = (value) => /\.(svg|png|jpg|jpeg|gif)$/.test(value); -const isAbsolutePath = (value) => value.startsWith('/'); -const isRelativePath = (value) => - value.startsWith('./') || value.startsWith('../'); -const isImgPath = (value) => isAbsolutePath(value) || isRelativePath(value); -const isInteractive = convert_1(['link', 'linkReference']); - -var remarkImages = images; - -function images() { - return transform -} - -function transform(tree) { - unistUtilVisitParents(tree, 'text', ontext); -} - -function ontext(node, parents) { - const value = String(node.value).trim(); - - if ((isUrl_1(value) || isImgPath(value)) && isImgExt(value)) { - let interactive = false; - let length = parents.length; - const siblings = parents[length - 1].children; - - // Check if we’re in interactive content. - while (length--) { - if (isInteractive(parents[length])) { - interactive = true; - break - } - } - - let next = { - type: 'image', - url: value, - title: null, - alt: null, - position: node.position - }; - - // Add a link if we’re not already in one. - if (!interactive) { - next = { - type: 'link', - url: value, - title: null, - children: [next], - position: node.position - }; - } - - siblings[siblings.indexOf(node)] = next; - } -} - -var format = createCommonjsModule(function (module) { -(function() { - - //// Export the API - var namespace; - - // CommonJS / Node module - { - namespace = module.exports = format; - } - - namespace.format = format; - namespace.vsprintf = vsprintf; - - if (typeof console !== 'undefined' && typeof console.log === 'function') { - namespace.printf = printf; - } - - function printf(/* ... */) { - console.log(format.apply(null, arguments)); - } - - function vsprintf(fmt, replacements) { - return format.apply(null, [fmt].concat(replacements)); - } - - function format(fmt) { - var argIndex = 1 // skip initial format argument - , args = [].slice.call(arguments) - , i = 0 - , n = fmt.length - , result = '' - , c - , escaped = false - , arg - , tmp - , leadingZero = false - , precision - , nextArg = function() { return args[argIndex++]; } - , slurpNumber = function() { - var digits = ''; - while (/\d/.test(fmt[i])) { - digits += fmt[i++]; - c = fmt[i]; - } - return digits.length > 0 ? parseInt(digits) : null; - } - ; - for (; i < n; ++i) { - c = fmt[i]; - if (escaped) { - escaped = false; - if (c == '.') { - leadingZero = false; - c = fmt[++i]; - } - else if (c == '0' && fmt[i + 1] == '.') { - leadingZero = true; - i += 2; - c = fmt[i]; - } - else { - leadingZero = true; - } - precision = slurpNumber(); - switch (c) { - case 'b': // number in binary - result += parseInt(nextArg(), 10).toString(2); - break; - case 'c': // character - arg = nextArg(); - if (typeof arg === 'string' || arg instanceof String) - result += arg; - else - result += String.fromCharCode(parseInt(arg, 10)); - break; - case 'd': // number in decimal - result += parseInt(nextArg(), 10); - break; - case 'f': // floating point number - tmp = String(parseFloat(nextArg()).toFixed(precision || 6)); - result += leadingZero ? tmp : tmp.replace(/^0/, ''); - break; - case 'j': // JSON - result += JSON.stringify(nextArg()); - break; - case 'o': // number in octal - result += '0' + parseInt(nextArg(), 10).toString(8); - break; - case 's': // string - result += nextArg(); - break; - case 'x': // lowercase hexadecimal - result += '0x' + parseInt(nextArg(), 10).toString(16); - break; - case 'X': // uppercase hexadecimal - result += '0x' + parseInt(nextArg(), 10).toString(16).toUpperCase(); - break; - default: - result += c; - break; - } - } else if (c === '%') { - escaped = true; - } else { - result += c; - } - } - return result; - } - -}()); -}); - -var fault = create$2(Error); - -var fault_1 = fault; - -fault.eval = create$2(EvalError); -fault.range = create$2(RangeError); -fault.reference = create$2(ReferenceError); -fault.syntax = create$2(SyntaxError); -fault.type = create$2(TypeError); -fault.uri = create$2(URIError); - -fault.create = create$2; - -// Create a new `EConstructor`, with the formatted `format` as a first argument. -function create$2(EConstructor) { - FormattedError.displayName = EConstructor.displayName || EConstructor.name; - - return FormattedError - - function FormattedError(format$1) { - if (format$1) { - format$1 = format.apply(null, arguments); - } - - return new EConstructor(format$1) - } -} - -var matters_1 = matters; - - - -var own$5 = {}.hasOwnProperty; - -var markers = {yaml: '-', toml: '+'}; - -function matters(options) { - var settings = options || 'yaml'; - var results = []; - var index = -1; - var length; - - // One preset or matter. - if (typeof settings === 'string' || !('length' in settings)) { - settings = [settings]; - } - - length = settings.length; - - while (++index < length) { - results[index] = matter(settings[index]); - } - - return results -} - -function matter(option) { - var result = option; - - if (typeof result === 'string') { - if (!own$5.call(markers, result)) { - throw fault_1('Missing matter definition for `%s`', result) - } - - result = {type: result, marker: markers[result]}; - } else if (typeof result !== 'object') { - throw fault_1('Expected matter to be an object, not `%j`', result) - } - - if (!own$5.call(result, 'type')) { - throw fault_1('Missing `type` in matter `%j`', result) - } - - if (!own$5.call(result, 'fence') && !own$5.call(result, 'marker')) { - throw fault_1('Missing `marker` or `fence` in matter `%j`', result) - } - - return result -} - -var syntax$4 = create$3; - - - -function create$3(options) { - var settings = matters_1(options); - var length = settings.length; - var index = -1; - var flow = {}; - var matter; - var code; - - while (++index < length) { - matter = settings[index]; - code = fence(matter, 'open').charCodeAt(0); - if (code in flow) { - flow[code].push(parse(matter)); - } else { - flow[code] = [parse(matter)]; - } - } - - return {flow: flow} -} - -function parse(matter) { - var name = matter.type; - var anywhere = matter.anywhere; - var valueType = name + 'Value'; - var fenceType = name + 'Fence'; - var sequenceType = fenceType + 'Sequence'; - var fenceConstruct = {tokenize: tokenizeFence, partial: true}; - var buffer; - - return {tokenize: tokenizeFrontmatter, concrete: true} - - function tokenizeFrontmatter(effects, ok, nok) { - var self = this; - - return start - - function start(code) { - var position = self.now(); - - if (position.column !== 1 || (!anywhere && position.line !== 1)) { - return nok(code) - } - - effects.enter(name); - buffer = fence(matter, 'open'); - return effects.attempt(fenceConstruct, afterOpeningFence, nok)(code) - } - - function afterOpeningFence(code) { - buffer = fence(matter, 'close'); - return lineEnd(code) - } - - function lineStart(code) { - if (code === -5 || code === -4 || code === -3 || code === null) { - return lineEnd(code) - } - - effects.enter(valueType); - return lineData(code) - } - - function lineData(code) { - if (code === -5 || code === -4 || code === -3 || code === null) { - effects.exit(valueType); - return lineEnd(code) - } - - effects.consume(code); - return lineData - } - - function lineEnd(code) { - // Require a closing fence. - if (code === null) { - return nok(code) - } - - // Can only be an eol. - effects.enter('lineEnding'); - effects.consume(code); - effects.exit('lineEnding'); - return effects.attempt(fenceConstruct, after, lineStart) - } - - function after(code) { - effects.exit(name); - return ok(code) - } - } - - function tokenizeFence(effects, ok, nok) { - var bufferIndex = 0; - - return start - - function start(code) { - if (code === buffer.charCodeAt(bufferIndex)) { - effects.enter(fenceType); - effects.enter(sequenceType); - return insideSequence(code) - } - - return nok(code) - } - - function insideSequence(code) { - if (bufferIndex === buffer.length) { - effects.exit(sequenceType); - - if (code === -2 || code === -1 || code === 32) { - effects.enter('whitespace'); - return insideWhitespace(code) - } - - return fenceEnd(code) - } - - if (code === buffer.charCodeAt(bufferIndex)) { - effects.consume(code); - bufferIndex++; - return insideSequence - } - - return nok(code) - } - - function insideWhitespace(code) { - if (code === -2 || code === -1 || code === 32) { - effects.consume(code); - return insideWhitespace - } - - effects.exit('whitespace'); - return fenceEnd(code) - } - - function fenceEnd(code) { - if (code === -5 || code === -4 || code === -3 || code === null) { - effects.exit(fenceType); - return ok(code) - } - - return nok(code) - } - } -} - -function fence(matter, prop) { - var marker; - - if (matter.marker) { - marker = pick(matter.marker, prop); - return marker + marker + marker - } - - return pick(matter.fence, prop) -} - -function pick(schema, prop) { - return typeof schema === 'string' ? schema : schema[prop] -} - -var micromarkExtensionFrontmatter = syntax$4; - -var fromMarkdown$5 = createFromMarkdown; - - - -function createFromMarkdown(options) { - var settings = matters_1(options); - var length = settings.length; - var index = -1; - var enter = {}; - var exit = {}; - var matter; - - while (++index < length) { - matter = settings[index]; - enter[matter.type] = opener(matter); - exit[matter.type] = close; - exit[matter.type + 'Value'] = value; - } - - return {enter: enter, exit: exit} -} - -function opener(matter) { - return open - function open(token) { - this.enter({type: matter.type, value: ''}, token); - this.buffer(); - } -} - -function close(token) { - var data = this.resume(); - // Remove the initial and final eol. - this.exit(token).value = data.replace(/^(\r?\n|\r)|(\r?\n|\r)$/g, ''); -} - -function value(token) { - this.config.enter.data.call(this, token); - this.config.exit.data.call(this, token); -} - -var toMarkdown$5 = createToMarkdown; - - - -function createToMarkdown(options) { - var unsafe = []; - var handlers = {}; - var settings = matters_1(options); - var length = settings.length; - var index = -1; - var matter; - - while (++index < length) { - matter = settings[index]; - handlers[matter.type] = handler(matter); - unsafe.push({atBreak: true, character: fence$1(matter, 'open').charAt(0)}); - } - - return {unsafe: unsafe, handlers: handlers} -} - -function handler(matter) { - var open = fence$1(matter, 'open'); - var close = fence$1(matter, 'close'); - - return handle - - function handle(node) { - return open + (node.value ? '\n' + node.value : '') + '\n' + close - } -} - -function fence$1(matter, prop) { - var marker; - - if (matter.marker) { - marker = pick$1(matter.marker, prop); - return marker + marker + marker - } - - return pick$1(matter.fence, prop) -} - -function pick$1(schema, prop) { - return typeof schema === 'string' ? schema : schema[prop] -} - -var remarkFrontmatter = frontmatter; - -function frontmatter(options) { - var data = this.data(); - add('micromarkExtensions', micromarkExtensionFrontmatter(options)); - add('fromMarkdownExtensions', fromMarkdown$5(options)); - add('toMarkdownExtensions', toMarkdown$5(options)); - function add(field, value) { - /* istanbul ignore if - other extensions. */ - if (data[field]) data[field].push(value); - else data[field] = [value]; - } -} - -const {NEW_HEADER_TEMPLATE: NEW_HEADER_TEMPLATE$1} = constants; - -const template$1 = new template(); - -/** - * Returns the transformer which acts on the MDAST tree and given VFile. - * - * @link https://github.com/unifiedjs/unified#function-transformernode-file-next - * @link https://github.com/syntax-tree/mdast - * @link https://github.com/vfile/vfile - * @return {function} - */ -function metadataWriter({ - createHeaderIfNotPresent = false, - newHeaderTemplate = NEW_HEADER_TEMPLATE$1, - updateHeader = false, - frontMatterData = {today: moment(), tags: []}, - } = {}) { - - return function transformer(ast, vFile, next) { - - let metadataNode = getMetadataNode(ast); - let hasMetadata = !(metadataNode == null); - - // If we don't have a Matter node in the AST, put it in. - if (!hasMetadata && createHeaderIfNotPresent) { - metadataNode = { - type: 'yaml', - value: jsYaml.dump(newValues(newHeaderTemplate, frontMatterData)), - }; - ast.children.unshift(metadataNode); - hasMetadata = true; - } - - if (updateHeader && hasMetadata) { - // Write metadata (by reference) - metadataNode.value = mergeValues(metadataNode.value, newValues(newHeaderTemplate, frontMatterData)); - } - - if (typeof next === 'function') { - return next(null, ast, vFile); - } - - return ast; - }; -} - -function newValues(newHeaderTemplate, frontMatterData) { - - // Update dates and times - if (frontMatterData.today) { - newHeaderTemplate = String(template$1.replace(newHeaderTemplate, frontMatterData.today)); - } - - // Add things like new tags - let resultYaml = jsYaml.load(newHeaderTemplate); - if (frontMatterData.tags) { - resultYaml.tags = frontMatterData.tags; - } - // Return a map - return resultYaml; -} - -function getMetadataNode(ast, types = ['yaml', 'toml']) { - return ast.children.find(node => types.includes(node.type)); -} - - -function mergeValues(currentValues, newValues) { - - // put quotes around the - // - #value - // - // and tags: #value - // and tag: #value - currentValues = currentValues.replace(/(^|-\s|tags:\s|tag:\s)(#[a-z//\d-_]+)/ig, "$1'$2'"); - - let fm = jsYaml.load(currentValues); - - - // Calculate the union of tags - let currentTags = []; - if (fm.tags) { - currentTags = fm.tags; - } - let newTags = []; - if (newValues.tags) { - newTags = newValues.tags; - } - - if (typeof currentTags === 'string' || currentTags instanceof String) { - currentTags = [currentTags]; - } - - if (typeof newTags === 'string' || newTags instanceof String) { - newTags = [newTags]; - } - - - let tagUnion = [...new Set([...currentTags, ...newTags])]; - - // Assign all new values - if (fm) { - Object.assign(fm, newValues); - } else { - fm = newValues; - } - - fm.tags = tagUnion; - - if (fm.tags.length === 0) { - delete fm.tags; - } - - // stringify - return jsYaml.dump(fm); // eslint-disable-line no-param-reassign -} - - -var frontmatterWriter = metadataWriter; - -var containerFlow$1 = flow$2; - - - -function flow$2(parent, context) { - var children = parent.children || []; - var results = []; - var index = -1; - var child; - - while (++index < children.length) { - child = children[index]; - - results.push( - context.handle(child, parent, context, {before: '\n', after: '\n'}) - ); - - if (index + 1 < children.length) { - results.push(between(child, children[index + 1])); - } - } - - return results.join('') - - function between(left, right) { - var index = -1; - var result; - - while (++index < context.join.length) { - result = context.join[index](left, right, parent, context); - - if (result === true || result === 1) { - break - } - - if (typeof result === 'number') { - return repeatString('\n', 1 + Number(result)) - } - - /** - * The injection of the comment - */ - if (result === false) { - return '\n' - // return '\n\n\n\n' - } - } - - return '\n\n' - } -} - -var indentLines_1$1 = indentLines$1; - -var eol$1 = /\r?\n|\r/g; - -function indentLines$1(value, map) { - var result = []; - var start = 0; - var line = 0; - var match; - - while ((match = eol$1.exec(value))) { - one(value.slice(start, match.index)); - result.push(match[0]); - start = match.index + match[0].length; - line++; - } - - one(value.slice(start)); - - return result.join('') - - function one(value) { - result.push(map(value, line, !value)); - } -} - -var blockquote_1 = blockquote; - - - - -function blockquote(node, _, context) { - var exit = context.enter('blockquote'); - var value = indentLines_1$1(containerFlow$1(node, context), map$1); - exit(); - return value -} - -function map$1(line, index, blank) { - return '>' + (blank ? '' : ' ') + line -} - -var _break = hardBreak; - -function hardBreak() { - return '\\\n' -} - -var longestStreak_1 = longestStreak; - -// Get the count of the longest repeating streak of `character` in `value`. -function longestStreak(value, character) { - var count = 0; - var maximum = 0; - var expected; - var index; - - if (typeof character !== 'string' || character.length !== 1) { - throw new Error('Expected character') - } - - value = String(value); - index = value.indexOf(character); - expected = index; - - while (index !== -1) { - count++; - - if (index === expected) { - if (count > maximum) { - maximum = count; - } - } else { - count = 1; - } - - expected = index + 1; - index = value.indexOf(character, expected); - } - - return maximum -} - -var formatCodeAsIndented_1 = formatCodeAsIndented; - -function formatCodeAsIndented(node, context) { - return ( - node.value && - !context.options.fences && - // If there’s no info… - !node.lang && - // And there’s a non-whitespace character… - /[^ \r\n]/.test(node.value) && - // And the value doesn’t start or end in a blank… - !/^[\t ]*[\r\n]|[\r\n][\t ]*$/.test(node.value) - ) -} - -var checkFence_1 = checkFence; - -function checkFence(context) { - var marker = context.options.fence || '`'; - - if (marker !== '`' && marker !== '~') { - throw new Error( - 'Cannot serialize code with `' + - marker + - '` for `options.fence`, expected `` ` `` or `~`' - ) - } - - return marker -} - -var safe_1 = safe; - -function safe(context, input, config) { - var value = (config.before || '') + (input || '') + (config.after || ''); - var positions = []; - var result = []; - var infos = {}; - var index = -1; - var before; - var after; - var position; - var pattern; - var expression; - var match; - var start; - var end; - - while (++index < context.unsafePatterns.length) { - pattern = context.unsafePatterns[index]; - - if ( - !inScope(context.stack, pattern.inConstruct, true) || - inScope(context.stack, pattern.notInConstruct) - ) { - continue - } - - expression = - pattern._compiled || (pattern._compiled = toExpression(pattern)); - - while ((match = expression.exec(value))) { - before = 'before' in pattern || pattern.atBreak; - after = 'after' in pattern; - position = match.index + (before ? match[1].length : 0); - - if (positions.indexOf(position) === -1) { - positions.push(position); - infos[position] = {before: before, after: after}; - } else { - if (infos[position].before && !before) { - infos[position].before = false; - } - - if (infos[position].after && !after) { - infos[position].after = false; - } - } - } - } - - positions.sort(numerical); - - start = config.before ? config.before.length : 0; - end = value.length - (config.after ? config.after.length : 0); - index = -1; - - while (++index < positions.length) { - position = positions[index]; - - if ( - // Character before or after matched: - position < start || - position >= end - ) { - continue - } - - // If this character is supposed to be escaped because it has a condition on - // the next character, and the next character is definitly being escaped, - // then skip this escape. - if ( - position + 1 < end && - positions[index + 1] === position + 1 && - infos[position].after && - !infos[position + 1].before && - !infos[position + 1].after - ) { - continue - } - - if (start !== position) { - result.push(value.slice(start, position)); - } - - start = position; - - if ( - /[!-/:-@[-`{-~]/.test(value.charAt(position)) && - (!config.encode || config.encode.indexOf(value.charAt(position)) === -1) - ) { - // Character escape. - result.push('\\'); - } else { - // Character reference. - result.push( - '&#x' + value.charCodeAt(position).toString(16).toUpperCase() + ';' - ); - start++; - } - } - - result.push(value.slice(start, end)); - - return result.join('') -} - -function inScope(stack, list, none) { - var index; - - if (!list) { - return none - } - - if (typeof list === 'string') { - list = [list]; - } - - index = -1; - - while (++index < list.length) { - if (stack.indexOf(list[index]) !== -1) { - return true - } - } - - return false -} - -function toExpression(pattern) { - var before = pattern.before ? '(?:' + pattern.before + ')' : ''; - var after = pattern.after ? '(?:' + pattern.after + ')' : ''; - - if (pattern.atBreak) { - before = '[\\r\\n][\\t ]*' + before; - } - - return new RegExp( - (before ? '(' + before + ')' : '') + - (/[|\\{}()[\]^$+*?.-]/.test(pattern.character) ? '\\' : '') + - pattern.character + - (after || ''), - 'g' - ) -} - -function numerical(a, b) { - return a - b -} - -var code_1 = code$1; - - - - - - - - -function code$1(node, _, context) { - var marker = checkFence_1(context); - var raw = node.value || ''; - var suffix = marker === '`' ? 'GraveAccent' : 'Tilde'; - var value; - var sequence; - var exit; - var subexit; - - if (formatCodeAsIndented_1(node, context)) { - exit = context.enter('codeIndented'); - value = indentLines_1$1(raw, map$2); - } else { - sequence = repeatString(marker, Math.max(longestStreak_1(raw, marker) + 1, 3)); - exit = context.enter('codeFenced'); - value = sequence; - - if (node.lang) { - subexit = context.enter('codeFencedLang' + suffix); - value += safe_1(context, node.lang, { - before: '`', - after: ' ', - encode: ['`'] - }); - subexit(); - } - - if (node.lang && node.meta) { - subexit = context.enter('codeFencedMeta' + suffix); - value += - ' ' + - safe_1(context, node.meta, { - before: ' ', - after: '\n', - encode: ['`'] - }); - subexit(); - } - - value += '\n'; - - if (raw) { - value += raw + '\n'; - } - - value += sequence; - } - - exit(); - return value -} - -function map$2(line, _, blank) { - return (blank ? '' : ' ') + line -} - -var AEli = "Æ"; -var AElig = "Æ"; -var AM = "&"; -var AMP = "&"; -var Aacut = "Á"; -var Aacute = "Á"; -var Abreve = "Ă"; -var Acir = "Â"; -var Acirc = "Â"; -var Acy = "А"; -var Afr = "𝔄"; -var Agrav = "À"; -var Agrave = "À"; -var Alpha = "Α"; -var Amacr = "Ā"; -var And = "⩓"; -var Aogon = "Ą"; -var Aopf = "𝔸"; -var ApplyFunction = "⁡"; -var Arin = "Å"; -var Aring = "Å"; -var Ascr = "𝒜"; -var Assign = "≔"; -var Atild = "Ã"; -var Atilde = "Ã"; -var Aum = "Ä"; -var Auml = "Ä"; -var Backslash = "∖"; -var Barv = "⫧"; -var Barwed = "⌆"; -var Bcy = "Б"; -var Because = "∵"; -var Bernoullis = "ℬ"; -var Beta = "Β"; -var Bfr = "𝔅"; -var Bopf = "𝔹"; -var Breve = "˘"; -var Bscr = "ℬ"; -var Bumpeq = "≎"; -var CHcy = "Ч"; -var COP = "©"; -var COPY = "©"; -var Cacute = "Ć"; -var Cap = "⋒"; -var CapitalDifferentialD = "ⅅ"; -var Cayleys = "ℭ"; -var Ccaron = "Č"; -var Ccedi = "Ç"; -var Ccedil = "Ç"; -var Ccirc = "Ĉ"; -var Cconint = "∰"; -var Cdot = "Ċ"; -var Cedilla = "¸"; -var CenterDot = "·"; -var Cfr = "ℭ"; -var Chi = "Χ"; -var CircleDot = "⊙"; -var CircleMinus = "⊖"; -var CirclePlus = "⊕"; -var CircleTimes = "⊗"; -var ClockwiseContourIntegral = "∲"; -var CloseCurlyDoubleQuote = "”"; -var CloseCurlyQuote = "’"; -var Colon = "∷"; -var Colone = "⩴"; -var Congruent = "≡"; -var Conint = "∯"; -var ContourIntegral = "∮"; -var Copf = "ℂ"; -var Coproduct = "∐"; -var CounterClockwiseContourIntegral = "∳"; -var Cross = "⨯"; -var Cscr = "𝒞"; -var Cup = "⋓"; -var CupCap = "≍"; -var DD = "ⅅ"; -var DDotrahd = "⤑"; -var DJcy = "Ђ"; -var DScy = "Ѕ"; -var DZcy = "Џ"; -var Dagger = "‡"; -var Darr = "↡"; -var Dashv = "⫤"; -var Dcaron = "Ď"; -var Dcy = "Д"; -var Del = "∇"; -var Delta = "Δ"; -var Dfr = "𝔇"; -var DiacriticalAcute = "´"; -var DiacriticalDot = "˙"; -var DiacriticalDoubleAcute = "˝"; -var DiacriticalGrave = "`"; -var DiacriticalTilde = "˜"; -var Diamond = "⋄"; -var DifferentialD = "ⅆ"; -var Dopf = "𝔻"; -var Dot = "¨"; -var DotDot = "⃜"; -var DotEqual = "≐"; -var DoubleContourIntegral = "∯"; -var DoubleDot = "¨"; -var DoubleDownArrow = "⇓"; -var DoubleLeftArrow = "⇐"; -var DoubleLeftRightArrow = "⇔"; -var DoubleLeftTee = "⫤"; -var DoubleLongLeftArrow = "⟸"; -var DoubleLongLeftRightArrow = "⟺"; -var DoubleLongRightArrow = "⟹"; -var DoubleRightArrow = "⇒"; -var DoubleRightTee = "⊨"; -var DoubleUpArrow = "⇑"; -var DoubleUpDownArrow = "⇕"; -var DoubleVerticalBar = "∥"; -var DownArrow = "↓"; -var DownArrowBar = "⤓"; -var DownArrowUpArrow = "⇵"; -var DownBreve = "̑"; -var DownLeftRightVector = "⥐"; -var DownLeftTeeVector = "⥞"; -var DownLeftVector = "↽"; -var DownLeftVectorBar = "⥖"; -var DownRightTeeVector = "⥟"; -var DownRightVector = "⇁"; -var DownRightVectorBar = "⥗"; -var DownTee = "⊤"; -var DownTeeArrow = "↧"; -var Downarrow = "⇓"; -var Dscr = "𝒟"; -var Dstrok = "Đ"; -var ENG = "Ŋ"; -var ET = "Ð"; -var ETH = "Ð"; -var Eacut = "É"; -var Eacute = "É"; -var Ecaron = "Ě"; -var Ecir = "Ê"; -var Ecirc = "Ê"; -var Ecy = "Э"; -var Edot = "Ė"; -var Efr = "𝔈"; -var Egrav = "È"; -var Egrave = "È"; -var Element = "∈"; -var Emacr = "Ē"; -var EmptySmallSquare = "◻"; -var EmptyVerySmallSquare = "▫"; -var Eogon = "Ę"; -var Eopf = "𝔼"; -var Epsilon = "Ε"; -var Equal = "⩵"; -var EqualTilde = "≂"; -var Equilibrium = "⇌"; -var Escr = "ℰ"; -var Esim = "⩳"; -var Eta = "Η"; -var Eum = "Ë"; -var Euml = "Ë"; -var Exists = "∃"; -var ExponentialE = "ⅇ"; -var Fcy = "Ф"; -var Ffr = "𝔉"; -var FilledSmallSquare = "◼"; -var FilledVerySmallSquare = "▪"; -var Fopf = "𝔽"; -var ForAll = "∀"; -var Fouriertrf = "ℱ"; -var Fscr = "ℱ"; -var GJcy = "Ѓ"; -var G = ">"; -var GT = ">"; -var Gamma = "Γ"; -var Gammad = "Ϝ"; -var Gbreve = "Ğ"; -var Gcedil = "Ģ"; -var Gcirc = "Ĝ"; -var Gcy = "Г"; -var Gdot = "Ġ"; -var Gfr = "𝔊"; -var Gg = "⋙"; -var Gopf = "𝔾"; -var GreaterEqual = "≥"; -var GreaterEqualLess = "⋛"; -var GreaterFullEqual = "≧"; -var GreaterGreater = "⪢"; -var GreaterLess = "≷"; -var GreaterSlantEqual = "⩾"; -var GreaterTilde = "≳"; -var Gscr = "𝒢"; -var Gt = "≫"; -var HARDcy = "Ъ"; -var Hacek = "ˇ"; -var Hat = "^"; -var Hcirc = "Ĥ"; -var Hfr = "ℌ"; -var HilbertSpace = "ℋ"; -var Hopf = "ℍ"; -var HorizontalLine = "─"; -var Hscr = "ℋ"; -var Hstrok = "Ħ"; -var HumpDownHump = "≎"; -var HumpEqual = "≏"; -var IEcy = "Е"; -var IJlig = "IJ"; -var IOcy = "Ё"; -var Iacut = "Í"; -var Iacute = "Í"; -var Icir = "Î"; -var Icirc = "Î"; -var Icy = "И"; -var Idot = "İ"; -var Ifr = "ℑ"; -var Igrav = "Ì"; -var Igrave = "Ì"; -var Im = "ℑ"; -var Imacr = "Ī"; -var ImaginaryI = "ⅈ"; -var Implies = "⇒"; -var Int = "∬"; -var Integral = "∫"; -var Intersection = "⋂"; -var InvisibleComma = "⁣"; -var InvisibleTimes = "⁢"; -var Iogon = "Į"; -var Iopf = "𝕀"; -var Iota = "Ι"; -var Iscr = "ℐ"; -var Itilde = "Ĩ"; -var Iukcy = "І"; -var Ium = "Ï"; -var Iuml = "Ï"; -var Jcirc = "Ĵ"; -var Jcy = "Й"; -var Jfr = "𝔍"; -var Jopf = "𝕁"; -var Jscr = "𝒥"; -var Jsercy = "Ј"; -var Jukcy = "Є"; -var KHcy = "Х"; -var KJcy = "Ќ"; -var Kappa = "Κ"; -var Kcedil = "Ķ"; -var Kcy = "К"; -var Kfr = "𝔎"; -var Kopf = "𝕂"; -var Kscr = "𝒦"; -var LJcy = "Љ"; -var L$1 = "<"; -var LT = "<"; -var Lacute = "Ĺ"; -var Lambda = "Λ"; -var Lang = "⟪"; -var Laplacetrf = "ℒ"; -var Larr = "↞"; -var Lcaron = "Ľ"; -var Lcedil = "Ļ"; -var Lcy = "Л"; -var LeftAngleBracket = "⟨"; -var LeftArrow = "←"; -var LeftArrowBar = "⇤"; -var LeftArrowRightArrow = "⇆"; -var LeftCeiling = "⌈"; -var LeftDoubleBracket = "⟦"; -var LeftDownTeeVector = "⥡"; -var LeftDownVector = "⇃"; -var LeftDownVectorBar = "⥙"; -var LeftFloor = "⌊"; -var LeftRightArrow = "↔"; -var LeftRightVector = "⥎"; -var LeftTee = "⊣"; -var LeftTeeArrow = "↤"; -var LeftTeeVector = "⥚"; -var LeftTriangle = "⊲"; -var LeftTriangleBar = "⧏"; -var LeftTriangleEqual = "⊴"; -var LeftUpDownVector = "⥑"; -var LeftUpTeeVector = "⥠"; -var LeftUpVector = "↿"; -var LeftUpVectorBar = "⥘"; -var LeftVector = "↼"; -var LeftVectorBar = "⥒"; -var Leftarrow = "⇐"; -var Leftrightarrow = "⇔"; -var LessEqualGreater = "⋚"; -var LessFullEqual = "≦"; -var LessGreater = "≶"; -var LessLess = "⪡"; -var LessSlantEqual = "⩽"; -var LessTilde = "≲"; -var Lfr = "𝔏"; -var Ll = "⋘"; -var Lleftarrow = "⇚"; -var Lmidot = "Ŀ"; -var LongLeftArrow = "⟵"; -var LongLeftRightArrow = "⟷"; -var LongRightArrow = "⟶"; -var Longleftarrow = "⟸"; -var Longleftrightarrow = "⟺"; -var Longrightarrow = "⟹"; -var Lopf = "𝕃"; -var LowerLeftArrow = "↙"; -var LowerRightArrow = "↘"; -var Lscr = "ℒ"; -var Lsh = "↰"; -var Lstrok = "Ł"; -var Lt = "≪"; -var Mcy = "М"; -var MediumSpace = " "; -var Mellintrf = "ℳ"; -var Mfr = "𝔐"; -var MinusPlus = "∓"; -var Mopf = "𝕄"; -var Mscr = "ℳ"; -var Mu = "Μ"; -var NJcy = "Њ"; -var Nacute = "Ń"; -var Ncaron = "Ň"; -var Ncedil = "Ņ"; -var Ncy = "Н"; -var NegativeMediumSpace = "​"; -var NegativeThickSpace = "​"; -var NegativeThinSpace = "​"; -var NegativeVeryThinSpace = "​"; -var NestedGreaterGreater = "≫"; -var NestedLessLess = "≪"; -var NewLine = "\n"; -var Nfr = "𝔑"; -var NoBreak = "⁠"; -var NonBreakingSpace = " "; -var Nopf = "ℕ"; -var Not = "⫬"; -var NotCongruent = "≢"; -var NotCupCap = "≭"; -var NotDoubleVerticalBar = "∦"; -var NotElement = "∉"; -var NotEqual = "≠"; -var NotEqualTilde = "≂̸"; -var NotExists = "∄"; -var NotGreater = "≯"; -var NotGreaterEqual = "≱"; -var NotGreaterFullEqual = "≧̸"; -var NotGreaterGreater = "≫̸"; -var NotGreaterLess = "≹"; -var NotGreaterSlantEqual = "⩾̸"; -var NotGreaterTilde = "≵"; -var NotHumpDownHump = "≎̸"; -var NotHumpEqual = "≏̸"; -var NotLeftTriangle = "⋪"; -var NotLeftTriangleBar = "⧏̸"; -var NotLeftTriangleEqual = "⋬"; -var NotLess = "≮"; -var NotLessEqual = "≰"; -var NotLessGreater = "≸"; -var NotLessLess = "≪̸"; -var NotLessSlantEqual = "⩽̸"; -var NotLessTilde = "≴"; -var NotNestedGreaterGreater = "⪢̸"; -var NotNestedLessLess = "⪡̸"; -var NotPrecedes = "⊀"; -var NotPrecedesEqual = "⪯̸"; -var NotPrecedesSlantEqual = "⋠"; -var NotReverseElement = "∌"; -var NotRightTriangle = "⋫"; -var NotRightTriangleBar = "⧐̸"; -var NotRightTriangleEqual = "⋭"; -var NotSquareSubset = "⊏̸"; -var NotSquareSubsetEqual = "⋢"; -var NotSquareSuperset = "⊐̸"; -var NotSquareSupersetEqual = "⋣"; -var NotSubset = "⊂⃒"; -var NotSubsetEqual = "⊈"; -var NotSucceeds = "⊁"; -var NotSucceedsEqual = "⪰̸"; -var NotSucceedsSlantEqual = "⋡"; -var NotSucceedsTilde = "≿̸"; -var NotSuperset = "⊃⃒"; -var NotSupersetEqual = "⊉"; -var NotTilde = "≁"; -var NotTildeEqual = "≄"; -var NotTildeFullEqual = "≇"; -var NotTildeTilde = "≉"; -var NotVerticalBar = "∤"; -var Nscr = "𝒩"; -var Ntild = "Ñ"; -var Ntilde = "Ñ"; -var Nu = "Ν"; -var OElig = "Œ"; -var Oacut = "Ó"; -var Oacute = "Ó"; -var Ocir = "Ô"; -var Ocirc = "Ô"; -var Ocy = "О"; -var Odblac = "Ő"; -var Ofr = "𝔒"; -var Ograv = "Ò"; -var Ograve = "Ò"; -var Omacr = "Ō"; -var Omega = "Ω"; -var Omicron = "Ο"; -var Oopf = "𝕆"; -var OpenCurlyDoubleQuote = "“"; -var OpenCurlyQuote = "‘"; -var Or = "⩔"; -var Oscr = "𝒪"; -var Oslas = "Ø"; -var Oslash = "Ø"; -var Otild = "Õ"; -var Otilde = "Õ"; -var Otimes = "⨷"; -var Oum = "Ö"; -var Ouml = "Ö"; -var OverBar = "‾"; -var OverBrace = "⏞"; -var OverBracket = "⎴"; -var OverParenthesis = "⏜"; -var PartialD = "∂"; -var Pcy = "П"; -var Pfr = "𝔓"; -var Phi = "Φ"; -var Pi = "Π"; -var PlusMinus = "±"; -var Poincareplane = "ℌ"; -var Popf = "ℙ"; -var Pr = "⪻"; -var Precedes = "≺"; -var PrecedesEqual = "⪯"; -var PrecedesSlantEqual = "≼"; -var PrecedesTilde = "≾"; -var Prime = "″"; -var Product = "∏"; -var Proportion = "∷"; -var Proportional = "∝"; -var Pscr = "𝒫"; -var Psi = "Ψ"; -var QUO = "\""; -var QUOT = "\""; -var Qfr = "𝔔"; -var Qopf = "ℚ"; -var Qscr = "𝒬"; -var RBarr = "⤐"; -var RE = "®"; -var REG = "®"; -var Racute = "Ŕ"; -var Rang = "⟫"; -var Rarr = "↠"; -var Rarrtl = "⤖"; -var Rcaron = "Ř"; -var Rcedil = "Ŗ"; -var Rcy = "Р"; -var Re = "ℜ"; -var ReverseElement = "∋"; -var ReverseEquilibrium = "⇋"; -var ReverseUpEquilibrium = "⥯"; -var Rfr = "ℜ"; -var Rho = "Ρ"; -var RightAngleBracket = "⟩"; -var RightArrow = "→"; -var RightArrowBar = "⇥"; -var RightArrowLeftArrow = "⇄"; -var RightCeiling = "⌉"; -var RightDoubleBracket = "⟧"; -var RightDownTeeVector = "⥝"; -var RightDownVector = "⇂"; -var RightDownVectorBar = "⥕"; -var RightFloor = "⌋"; -var RightTee = "⊢"; -var RightTeeArrow = "↦"; -var RightTeeVector = "⥛"; -var RightTriangle = "⊳"; -var RightTriangleBar = "⧐"; -var RightTriangleEqual = "⊵"; -var RightUpDownVector = "⥏"; -var RightUpTeeVector = "⥜"; -var RightUpVector = "↾"; -var RightUpVectorBar = "⥔"; -var RightVector = "⇀"; -var RightVectorBar = "⥓"; -var Rightarrow = "⇒"; -var Ropf = "ℝ"; -var RoundImplies = "⥰"; -var Rrightarrow = "⇛"; -var Rscr = "ℛ"; -var Rsh = "↱"; -var RuleDelayed = "⧴"; -var SHCHcy = "Щ"; -var SHcy = "Ш"; -var SOFTcy = "Ь"; -var Sacute = "Ś"; -var Sc = "⪼"; -var Scaron = "Š"; -var Scedil = "Ş"; -var Scirc = "Ŝ"; -var Scy = "С"; -var Sfr = "𝔖"; -var ShortDownArrow = "↓"; -var ShortLeftArrow = "←"; -var ShortRightArrow = "→"; -var ShortUpArrow = "↑"; -var Sigma = "Σ"; -var SmallCircle = "∘"; -var Sopf = "𝕊"; -var Sqrt = "√"; -var Square = "□"; -var SquareIntersection = "⊓"; -var SquareSubset = "⊏"; -var SquareSubsetEqual = "⊑"; -var SquareSuperset = "⊐"; -var SquareSupersetEqual = "⊒"; -var SquareUnion = "⊔"; -var Sscr = "𝒮"; -var Star = "⋆"; -var Sub = "⋐"; -var Subset = "⋐"; -var SubsetEqual = "⊆"; -var Succeeds = "≻"; -var SucceedsEqual = "⪰"; -var SucceedsSlantEqual = "≽"; -var SucceedsTilde = "≿"; -var SuchThat = "∋"; -var Sum = "∑"; -var Sup = "⋑"; -var Superset = "⊃"; -var SupersetEqual = "⊇"; -var Supset = "⋑"; -var THOR = "Þ"; -var THORN = "Þ"; -var TRADE = "™"; -var TSHcy = "Ћ"; -var TScy = "Ц"; -var Tab = "\t"; -var Tau = "Τ"; -var Tcaron = "Ť"; -var Tcedil = "Ţ"; -var Tcy = "Т"; -var Tfr = "𝔗"; -var Therefore = "∴"; -var Theta = "Θ"; -var ThickSpace = "  "; -var ThinSpace = " "; -var Tilde = "∼"; -var TildeEqual = "≃"; -var TildeFullEqual = "≅"; -var TildeTilde = "≈"; -var Topf = "𝕋"; -var TripleDot = "⃛"; -var Tscr = "𝒯"; -var Tstrok = "Ŧ"; -var Uacut = "Ú"; -var Uacute = "Ú"; -var Uarr = "↟"; -var Uarrocir = "⥉"; -var Ubrcy = "Ў"; -var Ubreve = "Ŭ"; -var Ucir = "Û"; -var Ucirc = "Û"; -var Ucy = "У"; -var Udblac = "Ű"; -var Ufr = "𝔘"; -var Ugrav = "Ù"; -var Ugrave = "Ù"; -var Umacr = "Ū"; -var UnderBar = "_"; -var UnderBrace = "⏟"; -var UnderBracket = "⎵"; -var UnderParenthesis = "⏝"; -var Union = "⋃"; -var UnionPlus = "⊎"; -var Uogon = "Ų"; -var Uopf = "𝕌"; -var UpArrow = "↑"; -var UpArrowBar = "⤒"; -var UpArrowDownArrow = "⇅"; -var UpDownArrow = "↕"; -var UpEquilibrium = "⥮"; -var UpTee = "⊥"; -var UpTeeArrow = "↥"; -var Uparrow = "⇑"; -var Updownarrow = "⇕"; -var UpperLeftArrow = "↖"; -var UpperRightArrow = "↗"; -var Upsi = "ϒ"; -var Upsilon = "Υ"; -var Uring = "Ů"; -var Uscr = "𝒰"; -var Utilde = "Ũ"; -var Uum = "Ü"; -var Uuml = "Ü"; -var VDash = "⊫"; -var Vbar = "⫫"; -var Vcy = "В"; -var Vdash = "⊩"; -var Vdashl = "⫦"; -var Vee = "⋁"; -var Verbar = "‖"; -var Vert = "‖"; -var VerticalBar = "∣"; -var VerticalLine = "|"; -var VerticalSeparator = "❘"; -var VerticalTilde = "≀"; -var VeryThinSpace = " "; -var Vfr = "𝔙"; -var Vopf = "𝕍"; -var Vscr = "𝒱"; -var Vvdash = "⊪"; -var Wcirc = "Ŵ"; -var Wedge = "⋀"; -var Wfr = "𝔚"; -var Wopf = "𝕎"; -var Wscr = "𝒲"; -var Xfr = "𝔛"; -var Xi = "Ξ"; -var Xopf = "𝕏"; -var Xscr = "𝒳"; -var YAcy = "Я"; -var YIcy = "Ї"; -var YUcy = "Ю"; -var Yacut = "Ý"; -var Yacute = "Ý"; -var Ycirc = "Ŷ"; -var Ycy = "Ы"; -var Yfr = "𝔜"; -var Yopf = "𝕐"; -var Yscr = "𝒴"; -var Yuml = "Ÿ"; -var ZHcy = "Ж"; -var Zacute = "Ź"; -var Zcaron = "Ž"; -var Zcy = "З"; -var Zdot = "Ż"; -var ZeroWidthSpace = "​"; -var Zeta = "Ζ"; -var Zfr = "ℨ"; -var Zopf = "ℤ"; -var Zscr = "𝒵"; -var aacut = "á"; -var aacute = "á"; -var abreve = "ă"; -var ac = "∾"; -var acE = "∾̳"; -var acd = "∿"; -var acir = "â"; -var acirc = "â"; -var acut = "´"; -var acute = "´"; -var acy = "а"; -var aeli = "æ"; -var aelig = "æ"; -var af = "⁡"; -var afr = "𝔞"; -var agrav = "à"; -var agrave = "à"; -var alefsym = "ℵ"; -var aleph = "ℵ"; -var alpha = "α"; -var amacr = "ā"; -var amalg = "⨿"; -var am = "&"; -var amp = "&"; -var and = "∧"; -var andand = "⩕"; -var andd = "⩜"; -var andslope = "⩘"; -var andv = "⩚"; -var ang = "∠"; -var ange = "⦤"; -var angle = "∠"; -var angmsd = "∡"; -var angmsdaa = "⦨"; -var angmsdab = "⦩"; -var angmsdac = "⦪"; -var angmsdad = "⦫"; -var angmsdae = "⦬"; -var angmsdaf = "⦭"; -var angmsdag = "⦮"; -var angmsdah = "⦯"; -var angrt = "∟"; -var angrtvb = "⊾"; -var angrtvbd = "⦝"; -var angsph = "∢"; -var angst = "Å"; -var angzarr = "⍼"; -var aogon = "ą"; -var aopf = "𝕒"; -var ap = "≈"; -var apE = "⩰"; -var apacir = "⩯"; -var ape = "≊"; -var apid = "≋"; -var apos = "'"; -var approx = "≈"; -var approxeq = "≊"; -var arin = "å"; -var aring = "å"; -var ascr = "𝒶"; -var ast = "*"; -var asymp = "≈"; -var asympeq = "≍"; -var atild = "ã"; -var atilde = "ã"; -var aum = "ä"; -var auml = "ä"; -var awconint = "∳"; -var awint = "⨑"; -var bNot = "⫭"; -var backcong = "≌"; -var backepsilon = "϶"; -var backprime = "‵"; -var backsim = "∽"; -var backsimeq = "⋍"; -var barvee = "⊽"; -var barwed = "⌅"; -var barwedge = "⌅"; -var bbrk = "⎵"; -var bbrktbrk = "⎶"; -var bcong = "≌"; -var bcy = "б"; -var bdquo = "„"; -var becaus = "∵"; -var because = "∵"; -var bemptyv = "⦰"; -var bepsi = "϶"; -var bernou = "ℬ"; -var beta = "β"; -var beth = "ℶ"; -var between = "≬"; -var bfr = "𝔟"; -var bigcap = "⋂"; -var bigcirc = "◯"; -var bigcup = "⋃"; -var bigodot = "⨀"; -var bigoplus = "⨁"; -var bigotimes = "⨂"; -var bigsqcup = "⨆"; -var bigstar = "★"; -var bigtriangledown = "▽"; -var bigtriangleup = "△"; -var biguplus = "⨄"; -var bigvee = "⋁"; -var bigwedge = "⋀"; -var bkarow = "⤍"; -var blacklozenge = "⧫"; -var blacksquare = "▪"; -var blacktriangle = "▴"; -var blacktriangledown = "▾"; -var blacktriangleleft = "◂"; -var blacktriangleright = "▸"; -var blank = "␣"; -var blk12 = "▒"; -var blk14 = "░"; -var blk34 = "▓"; -var block = "█"; -var bne = "=⃥"; -var bnequiv = "≡⃥"; -var bnot = "⌐"; -var bopf = "𝕓"; -var bot = "⊥"; -var bottom = "⊥"; -var bowtie = "⋈"; -var boxDL = "╗"; -var boxDR = "╔"; -var boxDl = "╖"; -var boxDr = "╓"; -var boxH = "═"; -var boxHD = "╦"; -var boxHU = "╩"; -var boxHd = "╤"; -var boxHu = "╧"; -var boxUL = "╝"; -var boxUR = "╚"; -var boxUl = "╜"; -var boxUr = "╙"; -var boxV = "║"; -var boxVH = "╬"; -var boxVL = "╣"; -var boxVR = "╠"; -var boxVh = "╫"; -var boxVl = "╢"; -var boxVr = "╟"; -var boxbox = "⧉"; -var boxdL = "╕"; -var boxdR = "╒"; -var boxdl = "┐"; -var boxdr = "┌"; -var boxh = "─"; -var boxhD = "╥"; -var boxhU = "╨"; -var boxhd = "┬"; -var boxhu = "┴"; -var boxminus = "⊟"; -var boxplus = "⊞"; -var boxtimes = "⊠"; -var boxuL = "╛"; -var boxuR = "╘"; -var boxul = "┘"; -var boxur = "└"; -var boxv = "│"; -var boxvH = "╪"; -var boxvL = "╡"; -var boxvR = "╞"; -var boxvh = "┼"; -var boxvl = "┤"; -var boxvr = "├"; -var bprime = "‵"; -var breve = "˘"; -var brvba = "¦"; -var brvbar = "¦"; -var bscr = "𝒷"; -var bsemi = "⁏"; -var bsim = "∽"; -var bsime = "⋍"; -var bsol = "\\"; -var bsolb = "⧅"; -var bsolhsub = "⟈"; -var bull = "•"; -var bullet = "•"; -var bump = "≎"; -var bumpE = "⪮"; -var bumpe = "≏"; -var bumpeq = "≏"; -var cacute = "ć"; -var cap = "∩"; -var capand = "⩄"; -var capbrcup = "⩉"; -var capcap = "⩋"; -var capcup = "⩇"; -var capdot = "⩀"; -var caps = "∩︀"; -var caret = "⁁"; -var caron = "ˇ"; -var ccaps = "⩍"; -var ccaron = "č"; -var ccedi = "ç"; -var ccedil = "ç"; -var ccirc = "ĉ"; -var ccups = "⩌"; -var ccupssm = "⩐"; -var cdot = "ċ"; -var cedi = "¸"; -var cedil = "¸"; -var cemptyv = "⦲"; -var cen = "¢"; -var cent = "¢"; -var centerdot = "·"; -var cfr = "𝔠"; -var chcy = "ч"; -var check = "✓"; -var checkmark = "✓"; -var chi = "χ"; -var cir = "○"; -var cirE = "⧃"; -var circ = "ˆ"; -var circeq = "≗"; -var circlearrowleft = "↺"; -var circlearrowright = "↻"; -var circledR = "®"; -var circledS = "Ⓢ"; -var circledast = "⊛"; -var circledcirc = "⊚"; -var circleddash = "⊝"; -var cire = "≗"; -var cirfnint = "⨐"; -var cirmid = "⫯"; -var cirscir = "⧂"; -var clubs = "♣"; -var clubsuit = "♣"; -var colon$1 = ":"; -var colone = "≔"; -var coloneq = "≔"; -var comma = ","; -var commat = "@"; -var comp = "∁"; -var compfn = "∘"; -var complement = "∁"; -var complexes = "ℂ"; -var cong = "≅"; -var congdot = "⩭"; -var conint = "∮"; -var copf = "𝕔"; -var coprod = "∐"; -var cop = "©"; -var copy = "©"; -var copysr = "℗"; -var crarr = "↵"; -var cross = "✗"; -var cscr = "𝒸"; -var csub = "⫏"; -var csube = "⫑"; -var csup = "⫐"; -var csupe = "⫒"; -var ctdot = "⋯"; -var cudarrl = "⤸"; -var cudarrr = "⤵"; -var cuepr = "⋞"; -var cuesc = "⋟"; -var cularr = "↶"; -var cularrp = "⤽"; -var cup = "∪"; -var cupbrcap = "⩈"; -var cupcap = "⩆"; -var cupcup = "⩊"; -var cupdot = "⊍"; -var cupor = "⩅"; -var cups = "∪︀"; -var curarr = "↷"; -var curarrm = "⤼"; -var curlyeqprec = "⋞"; -var curlyeqsucc = "⋟"; -var curlyvee = "⋎"; -var curlywedge = "⋏"; -var curre = "¤"; -var curren = "¤"; -var curvearrowleft = "↶"; -var curvearrowright = "↷"; -var cuvee = "⋎"; -var cuwed = "⋏"; -var cwconint = "∲"; -var cwint = "∱"; -var cylcty = "⌭"; -var dArr = "⇓"; -var dHar = "⥥"; -var dagger = "†"; -var daleth = "ℸ"; -var darr = "↓"; -var dash$1 = "‐"; -var dashv = "⊣"; -var dbkarow = "⤏"; -var dblac = "˝"; -var dcaron = "ď"; -var dcy = "д"; -var dd = "ⅆ"; -var ddagger = "‡"; -var ddarr = "⇊"; -var ddotseq = "⩷"; -var de = "°"; -var deg = "°"; -var delta = "δ"; -var demptyv = "⦱"; -var dfisht = "⥿"; -var dfr = "𝔡"; -var dharl = "⇃"; -var dharr = "⇂"; -var diam = "⋄"; -var diamond = "⋄"; -var diamondsuit = "♦"; -var diams = "♦"; -var die = "¨"; -var digamma = "ϝ"; -var disin = "⋲"; -var div = "÷"; -var divid = "÷"; -var divide = "÷"; -var divideontimes = "⋇"; -var divonx = "⋇"; -var djcy = "ђ"; -var dlcorn = "⌞"; -var dlcrop = "⌍"; -var dollar = "$"; -var dopf = "𝕕"; -var dot = "˙"; -var doteq = "≐"; -var doteqdot = "≑"; -var dotminus = "∸"; -var dotplus = "∔"; -var dotsquare = "⊡"; -var doublebarwedge = "⌆"; -var downarrow = "↓"; -var downdownarrows = "⇊"; -var downharpoonleft = "⇃"; -var downharpoonright = "⇂"; -var drbkarow = "⤐"; -var drcorn = "⌟"; -var drcrop = "⌌"; -var dscr = "𝒹"; -var dscy = "ѕ"; -var dsol = "⧶"; -var dstrok = "đ"; -var dtdot = "⋱"; -var dtri = "▿"; -var dtrif = "▾"; -var duarr = "⇵"; -var duhar = "⥯"; -var dwangle = "⦦"; -var dzcy = "џ"; -var dzigrarr = "⟿"; -var eDDot = "⩷"; -var eDot = "≑"; -var eacut = "é"; -var eacute = "é"; -var easter = "⩮"; -var ecaron = "ě"; -var ecir = "ê"; -var ecirc = "ê"; -var ecolon = "≕"; -var ecy = "э"; -var edot = "ė"; -var ee = "ⅇ"; -var efDot = "≒"; -var efr = "𝔢"; -var eg = "⪚"; -var egrav = "è"; -var egrave = "è"; -var egs = "⪖"; -var egsdot = "⪘"; -var el = "⪙"; -var elinters = "⏧"; -var ell = "ℓ"; -var els = "⪕"; -var elsdot = "⪗"; -var emacr = "ē"; -var empty = "∅"; -var emptyset = "∅"; -var emptyv = "∅"; -var emsp13 = " "; -var emsp14 = " "; -var emsp = " "; -var eng = "ŋ"; -var ensp = " "; -var eogon = "ę"; -var eopf = "𝕖"; -var epar = "⋕"; -var eparsl = "⧣"; -var eplus = "⩱"; -var epsi = "ε"; -var epsilon = "ε"; -var epsiv = "ϵ"; -var eqcirc = "≖"; -var eqcolon = "≕"; -var eqsim = "≂"; -var eqslantgtr = "⪖"; -var eqslantless = "⪕"; -var equals = "="; -var equest = "≟"; -var equiv = "≡"; -var equivDD = "⩸"; -var eqvparsl = "⧥"; -var erDot = "≓"; -var erarr = "⥱"; -var escr = "ℯ"; -var esdot = "≐"; -var esim = "≂"; -var eta = "η"; -var et = "ð"; -var eth = "ð"; -var eum = "ë"; -var euml = "ë"; -var euro = "€"; -var excl = "!"; -var exist = "∃"; -var expectation = "ℰ"; -var exponentiale = "ⅇ"; -var fallingdotseq = "≒"; -var fcy = "ф"; -var female = "♀"; -var ffilig = "ffi"; -var fflig = "ff"; -var ffllig = "ffl"; -var ffr = "𝔣"; -var filig = "fi"; -var fjlig = "fj"; -var flat = "♭"; -var fllig = "fl"; -var fltns = "▱"; -var fnof = "ƒ"; -var fopf = "𝕗"; -var forall = "∀"; -var fork = "⋔"; -var forkv = "⫙"; -var fpartint = "⨍"; -var frac1 = "¼"; -var frac12 = "½"; -var frac13 = "⅓"; -var frac14 = "¼"; -var frac15 = "⅕"; -var frac16 = "⅙"; -var frac18 = "⅛"; -var frac23 = "⅔"; -var frac25 = "⅖"; -var frac3 = "¾"; -var frac34 = "¾"; -var frac35 = "⅗"; -var frac38 = "⅜"; -var frac45 = "⅘"; -var frac56 = "⅚"; -var frac58 = "⅝"; -var frac78 = "⅞"; -var frasl = "⁄"; -var frown = "⌢"; -var fscr = "𝒻"; -var gE = "≧"; -var gEl = "⪌"; -var gacute = "ǵ"; -var gamma = "γ"; -var gammad = "ϝ"; -var gap = "⪆"; -var gbreve = "ğ"; -var gcirc = "ĝ"; -var gcy = "г"; -var gdot = "ġ"; -var ge = "≥"; -var gel = "⋛"; -var geq = "≥"; -var geqq = "≧"; -var geqslant = "⩾"; -var ges = "⩾"; -var gescc = "⪩"; -var gesdot = "⪀"; -var gesdoto = "⪂"; -var gesdotol = "⪄"; -var gesl = "⋛︀"; -var gesles = "⪔"; -var gfr = "𝔤"; -var gg = "≫"; -var ggg = "⋙"; -var gimel = "ℷ"; -var gjcy = "ѓ"; -var gl = "≷"; -var glE = "⪒"; -var gla = "⪥"; -var glj = "⪤"; -var gnE = "≩"; -var gnap = "⪊"; -var gnapprox = "⪊"; -var gne = "⪈"; -var gneq = "⪈"; -var gneqq = "≩"; -var gnsim = "⋧"; -var gopf = "𝕘"; -var grave = "`"; -var gscr = "ℊ"; -var gsim = "≳"; -var gsime = "⪎"; -var gsiml = "⪐"; -var g = ">"; -var gt = ">"; -var gtcc = "⪧"; -var gtcir = "⩺"; -var gtdot = "⋗"; -var gtlPar = "⦕"; -var gtquest = "⩼"; -var gtrapprox = "⪆"; -var gtrarr = "⥸"; -var gtrdot = "⋗"; -var gtreqless = "⋛"; -var gtreqqless = "⪌"; -var gtrless = "≷"; -var gtrsim = "≳"; -var gvertneqq = "≩︀"; -var gvnE = "≩︀"; -var hArr = "⇔"; -var hairsp = " "; -var half = "½"; -var hamilt = "ℋ"; -var hardcy = "ъ"; -var harr = "↔"; -var harrcir = "⥈"; -var harrw = "↭"; -var hbar = "ℏ"; -var hcirc = "ĥ"; -var hearts = "♥"; -var heartsuit = "♥"; -var hellip = "…"; -var hercon = "⊹"; -var hfr = "𝔥"; -var hksearow = "⤥"; -var hkswarow = "⤦"; -var hoarr = "⇿"; -var homtht = "∻"; -var hookleftarrow = "↩"; -var hookrightarrow = "↪"; -var hopf = "𝕙"; -var horbar = "―"; -var hscr = "𝒽"; -var hslash = "ℏ"; -var hstrok = "ħ"; -var hybull = "⁃"; -var hyphen = "‐"; -var iacut = "í"; -var iacute = "í"; -var ic = "⁣"; -var icir = "î"; -var icirc = "î"; -var icy = "и"; -var iecy = "е"; -var iexc = "¡"; -var iexcl = "¡"; -var iff = "⇔"; -var ifr = "𝔦"; -var igrav = "ì"; -var igrave = "ì"; -var ii = "ⅈ"; -var iiiint = "⨌"; -var iiint = "∭"; -var iinfin = "⧜"; -var iiota = "℩"; -var ijlig = "ij"; -var imacr = "ī"; -var image = "ℑ"; -var imagline = "ℐ"; -var imagpart = "ℑ"; -var imath = "ı"; -var imof = "⊷"; -var imped = "Ƶ"; -var incare = "℅"; -var infin = "∞"; -var infintie = "⧝"; -var inodot = "ı"; -var int = "∫"; -var intcal = "⊺"; -var integers = "ℤ"; -var intercal = "⊺"; -var intlarhk = "⨗"; -var intprod = "⨼"; -var iocy = "ё"; -var iogon = "į"; -var iopf = "𝕚"; -var iota = "ι"; -var iprod = "⨼"; -var iques = "¿"; -var iquest = "¿"; -var iscr = "𝒾"; -var isin = "∈"; -var isinE = "⋹"; -var isindot = "⋵"; -var isins = "⋴"; -var isinsv = "⋳"; -var isinv = "∈"; -var it = "⁢"; -var itilde = "ĩ"; -var iukcy = "і"; -var ium = "ï"; -var iuml = "ï"; -var jcirc = "ĵ"; -var jcy = "й"; -var jfr = "𝔧"; -var jmath = "ȷ"; -var jopf = "𝕛"; -var jscr = "𝒿"; -var jsercy = "ј"; -var jukcy = "є"; -var kappa = "κ"; -var kappav = "ϰ"; -var kcedil = "ķ"; -var kcy = "к"; -var kfr = "𝔨"; -var kgreen = "ĸ"; -var khcy = "х"; -var kjcy = "ќ"; -var kopf = "𝕜"; -var kscr = "𝓀"; -var lAarr = "⇚"; -var lArr = "⇐"; -var lAtail = "⤛"; -var lBarr = "⤎"; -var lE = "≦"; -var lEg = "⪋"; -var lHar = "⥢"; -var lacute = "ĺ"; -var laemptyv = "⦴"; -var lagran = "ℒ"; -var lambda = "λ"; -var lang = "⟨"; -var langd = "⦑"; -var langle = "⟨"; -var lap = "⪅"; -var laqu = "«"; -var laquo = "«"; -var larr = "←"; -var larrb = "⇤"; -var larrbfs = "⤟"; -var larrfs = "⤝"; -var larrhk = "↩"; -var larrlp = "↫"; -var larrpl = "⤹"; -var larrsim = "⥳"; -var larrtl = "↢"; -var lat = "⪫"; -var latail = "⤙"; -var late = "⪭"; -var lates = "⪭︀"; -var lbarr = "⤌"; -var lbbrk = "❲"; -var lbrace = "{"; -var lbrack = "["; -var lbrke = "⦋"; -var lbrksld = "⦏"; -var lbrkslu = "⦍"; -var lcaron = "ľ"; -var lcedil = "ļ"; -var lceil = "⌈"; -var lcub = "{"; -var lcy = "л"; -var ldca = "⤶"; -var ldquo = "“"; -var ldquor = "„"; -var ldrdhar = "⥧"; -var ldrushar = "⥋"; -var ldsh = "↲"; -var le = "≤"; -var leftarrow = "←"; -var leftarrowtail = "↢"; -var leftharpoondown = "↽"; -var leftharpoonup = "↼"; -var leftleftarrows = "⇇"; -var leftrightarrow = "↔"; -var leftrightarrows = "⇆"; -var leftrightharpoons = "⇋"; -var leftrightsquigarrow = "↭"; -var leftthreetimes = "⋋"; -var leg = "⋚"; -var leq = "≤"; -var leqq = "≦"; -var leqslant = "⩽"; -var les = "⩽"; -var lescc = "⪨"; -var lesdot = "⩿"; -var lesdoto = "⪁"; -var lesdotor = "⪃"; -var lesg = "⋚︀"; -var lesges = "⪓"; -var lessapprox = "⪅"; -var lessdot = "⋖"; -var lesseqgtr = "⋚"; -var lesseqqgtr = "⪋"; -var lessgtr = "≶"; -var lesssim = "≲"; -var lfisht = "⥼"; -var lfloor = "⌊"; -var lfr = "𝔩"; -var lg = "≶"; -var lgE = "⪑"; -var lhard = "↽"; -var lharu = "↼"; -var lharul = "⥪"; -var lhblk = "▄"; -var ljcy = "љ"; -var ll = "≪"; -var llarr = "⇇"; -var llcorner = "⌞"; -var llhard = "⥫"; -var lltri = "◺"; -var lmidot = "ŀ"; -var lmoust = "⎰"; -var lmoustache = "⎰"; -var lnE = "≨"; -var lnap = "⪉"; -var lnapprox = "⪉"; -var lne = "⪇"; -var lneq = "⪇"; -var lneqq = "≨"; -var lnsim = "⋦"; -var loang = "⟬"; -var loarr = "⇽"; -var lobrk = "⟦"; -var longleftarrow = "⟵"; -var longleftrightarrow = "⟷"; -var longmapsto = "⟼"; -var longrightarrow = "⟶"; -var looparrowleft = "↫"; -var looparrowright = "↬"; -var lopar = "⦅"; -var lopf = "𝕝"; -var loplus = "⨭"; -var lotimes = "⨴"; -var lowast = "∗"; -var lowbar = "_"; -var loz = "◊"; -var lozenge = "◊"; -var lozf = "⧫"; -var lpar = "("; -var lparlt = "⦓"; -var lrarr = "⇆"; -var lrcorner = "⌟"; -var lrhar = "⇋"; -var lrhard = "⥭"; -var lrm = "‎"; -var lrtri = "⊿"; -var lsaquo = "‹"; -var lscr = "𝓁"; -var lsh = "↰"; -var lsim = "≲"; -var lsime = "⪍"; -var lsimg = "⪏"; -var lsqb = "["; -var lsquo = "‘"; -var lsquor = "‚"; -var lstrok = "ł"; -var l$1 = "<"; -var lt = "<"; -var ltcc = "⪦"; -var ltcir = "⩹"; -var ltdot = "⋖"; -var lthree = "⋋"; -var ltimes = "⋉"; -var ltlarr = "⥶"; -var ltquest = "⩻"; -var ltrPar = "⦖"; -var ltri = "◃"; -var ltrie = "⊴"; -var ltrif = "◂"; -var lurdshar = "⥊"; -var luruhar = "⥦"; -var lvertneqq = "≨︀"; -var lvnE = "≨︀"; -var mDDot = "∺"; -var mac = "¯"; -var macr = "¯"; -var male = "♂"; -var malt = "✠"; -var maltese = "✠"; -var map$3 = "↦"; -var mapsto = "↦"; -var mapstodown = "↧"; -var mapstoleft = "↤"; -var mapstoup = "↥"; -var marker = "▮"; -var mcomma = "⨩"; -var mcy = "м"; -var mdash = "—"; -var measuredangle = "∡"; -var mfr = "𝔪"; -var mho = "℧"; -var micr = "µ"; -var micro = "µ"; -var mid = "∣"; -var midast = "*"; -var midcir = "⫰"; -var middo = "·"; -var middot = "·"; -var minus = "−"; -var minusb = "⊟"; -var minusd = "∸"; -var minusdu = "⨪"; -var mlcp = "⫛"; -var mldr = "…"; -var mnplus = "∓"; -var models = "⊧"; -var mopf = "𝕞"; -var mp = "∓"; -var mscr = "𝓂"; -var mstpos = "∾"; -var mu = "μ"; -var multimap = "⊸"; -var mumap = "⊸"; -var nGg = "⋙̸"; -var nGt = "≫⃒"; -var nGtv = "≫̸"; -var nLeftarrow = "⇍"; -var nLeftrightarrow = "⇎"; -var nLl = "⋘̸"; -var nLt = "≪⃒"; -var nLtv = "≪̸"; -var nRightarrow = "⇏"; -var nVDash = "⊯"; -var nVdash = "⊮"; -var nabla = "∇"; -var nacute = "ń"; -var nang = "∠⃒"; -var nap = "≉"; -var napE = "⩰̸"; -var napid = "≋̸"; -var napos = "ʼn"; -var napprox = "≉"; -var natur = "♮"; -var natural = "♮"; -var naturals = "ℕ"; -var nbs = " "; -var nbsp = " "; -var nbump = "≎̸"; -var nbumpe = "≏̸"; -var ncap = "⩃"; -var ncaron = "ň"; -var ncedil = "ņ"; -var ncong = "≇"; -var ncongdot = "⩭̸"; -var ncup = "⩂"; -var ncy = "н"; -var ndash = "–"; -var ne = "≠"; -var neArr = "⇗"; -var nearhk = "⤤"; -var nearr = "↗"; -var nearrow = "↗"; -var nedot = "≐̸"; -var nequiv = "≢"; -var nesear = "⤨"; -var nesim = "≂̸"; -var nexist = "∄"; -var nexists = "∄"; -var nfr = "𝔫"; -var ngE = "≧̸"; -var nge = "≱"; -var ngeq = "≱"; -var ngeqq = "≧̸"; -var ngeqslant = "⩾̸"; -var nges = "⩾̸"; -var ngsim = "≵"; -var ngt = "≯"; -var ngtr = "≯"; -var nhArr = "⇎"; -var nharr = "↮"; -var nhpar = "⫲"; -var ni = "∋"; -var nis = "⋼"; -var nisd = "⋺"; -var niv = "∋"; -var njcy = "њ"; -var nlArr = "⇍"; -var nlE = "≦̸"; -var nlarr = "↚"; -var nldr = "‥"; -var nle = "≰"; -var nleftarrow = "↚"; -var nleftrightarrow = "↮"; -var nleq = "≰"; -var nleqq = "≦̸"; -var nleqslant = "⩽̸"; -var nles = "⩽̸"; -var nless = "≮"; -var nlsim = "≴"; -var nlt = "≮"; -var nltri = "⋪"; -var nltrie = "⋬"; -var nmid = "∤"; -var nopf = "𝕟"; -var no = "¬"; -var not = "¬"; -var notin = "∉"; -var notinE = "⋹̸"; -var notindot = "⋵̸"; -var notinva = "∉"; -var notinvb = "⋷"; -var notinvc = "⋶"; -var notni = "∌"; -var notniva = "∌"; -var notnivb = "⋾"; -var notnivc = "⋽"; -var npar = "∦"; -var nparallel = "∦"; -var nparsl = "⫽⃥"; -var npart = "∂̸"; -var npolint = "⨔"; -var npr = "⊀"; -var nprcue = "⋠"; -var npre = "⪯̸"; -var nprec = "⊀"; -var npreceq = "⪯̸"; -var nrArr = "⇏"; -var nrarr = "↛"; -var nrarrc = "⤳̸"; -var nrarrw = "↝̸"; -var nrightarrow = "↛"; -var nrtri = "⋫"; -var nrtrie = "⋭"; -var nsc = "⊁"; -var nsccue = "⋡"; -var nsce = "⪰̸"; -var nscr = "𝓃"; -var nshortmid = "∤"; -var nshortparallel = "∦"; -var nsim = "≁"; -var nsime = "≄"; -var nsimeq = "≄"; -var nsmid = "∤"; -var nspar = "∦"; -var nsqsube = "⋢"; -var nsqsupe = "⋣"; -var nsub = "⊄"; -var nsubE = "⫅̸"; -var nsube = "⊈"; -var nsubset = "⊂⃒"; -var nsubseteq = "⊈"; -var nsubseteqq = "⫅̸"; -var nsucc = "⊁"; -var nsucceq = "⪰̸"; -var nsup = "⊅"; -var nsupE = "⫆̸"; -var nsupe = "⊉"; -var nsupset = "⊃⃒"; -var nsupseteq = "⊉"; -var nsupseteqq = "⫆̸"; -var ntgl = "≹"; -var ntild = "ñ"; -var ntilde = "ñ"; -var ntlg = "≸"; -var ntriangleleft = "⋪"; -var ntrianglelefteq = "⋬"; -var ntriangleright = "⋫"; -var ntrianglerighteq = "⋭"; -var nu = "ν"; -var num = "#"; -var numero = "№"; -var numsp = " "; -var nvDash = "⊭"; -var nvHarr = "⤄"; -var nvap = "≍⃒"; -var nvdash = "⊬"; -var nvge = "≥⃒"; -var nvgt = ">⃒"; -var nvinfin = "⧞"; -var nvlArr = "⤂"; -var nvle = "≤⃒"; -var nvlt = "<⃒"; -var nvltrie = "⊴⃒"; -var nvrArr = "⤃"; -var nvrtrie = "⊵⃒"; -var nvsim = "∼⃒"; -var nwArr = "⇖"; -var nwarhk = "⤣"; -var nwarr = "↖"; -var nwarrow = "↖"; -var nwnear = "⤧"; -var oS = "Ⓢ"; -var oacut = "ó"; -var oacute = "ó"; -var oast = "⊛"; -var ocir = "ô"; -var ocirc = "ô"; -var ocy = "о"; -var odash = "⊝"; -var odblac = "ő"; -var odiv = "⨸"; -var odot = "⊙"; -var odsold = "⦼"; -var oelig = "œ"; -var ofcir = "⦿"; -var ofr = "𝔬"; -var ogon = "˛"; -var ograv = "ò"; -var ograve = "ò"; -var ogt = "⧁"; -var ohbar = "⦵"; -var ohm = "Ω"; -var oint = "∮"; -var olarr = "↺"; -var olcir = "⦾"; -var olcross = "⦻"; -var oline = "‾"; -var olt = "⧀"; -var omacr = "ō"; -var omega = "ω"; -var omicron = "ο"; -var omid = "⦶"; -var ominus = "⊖"; -var oopf = "𝕠"; -var opar = "⦷"; -var operp = "⦹"; -var oplus = "⊕"; -var or = "∨"; -var orarr = "↻"; -var ord = "º"; -var order$1 = "ℴ"; -var orderof = "ℴ"; -var ordf = "ª"; -var ordm = "º"; -var origof = "⊶"; -var oror = "⩖"; -var orslope = "⩗"; -var orv = "⩛"; -var oscr = "ℴ"; -var oslas = "ø"; -var oslash = "ø"; -var osol = "⊘"; -var otild = "õ"; -var otilde = "õ"; -var otimes = "⊗"; -var otimesas = "⨶"; -var oum = "ö"; -var ouml = "ö"; -var ovbar = "⌽"; -var par = "¶"; -var para = "¶"; -var parallel = "∥"; -var parsim = "⫳"; -var parsl = "⫽"; -var part = "∂"; -var pcy = "п"; -var percnt = "%"; -var period = "."; -var permil = "‰"; -var perp = "⊥"; -var pertenk = "‱"; -var pfr = "𝔭"; -var phi = "φ"; -var phiv = "ϕ"; -var phmmat = "ℳ"; -var phone = "☎"; -var pi = "π"; -var pitchfork = "⋔"; -var piv = "ϖ"; -var planck = "ℏ"; -var planckh = "ℎ"; -var plankv = "ℏ"; -var plus = "+"; -var plusacir = "⨣"; -var plusb = "⊞"; -var pluscir = "⨢"; -var plusdo = "∔"; -var plusdu = "⨥"; -var pluse = "⩲"; -var plusm = "±"; -var plusmn = "±"; -var plussim = "⨦"; -var plustwo = "⨧"; -var pm = "±"; -var pointint = "⨕"; -var popf = "𝕡"; -var poun = "£"; -var pound = "£"; -var pr = "≺"; -var prE = "⪳"; -var prap = "⪷"; -var prcue = "≼"; -var pre = "⪯"; -var prec = "≺"; -var precapprox = "⪷"; -var preccurlyeq = "≼"; -var preceq = "⪯"; -var precnapprox = "⪹"; -var precneqq = "⪵"; -var precnsim = "⋨"; -var precsim = "≾"; -var prime = "′"; -var primes = "ℙ"; -var prnE = "⪵"; -var prnap = "⪹"; -var prnsim = "⋨"; -var prod = "∏"; -var profalar = "⌮"; -var profline = "⌒"; -var profsurf = "⌓"; -var prop = "∝"; -var propto = "∝"; -var prsim = "≾"; -var prurel = "⊰"; -var pscr = "𝓅"; -var psi = "ψ"; -var puncsp = " "; -var qfr = "𝔮"; -var qint = "⨌"; -var qopf = "𝕢"; -var qprime = "⁗"; -var qscr = "𝓆"; -var quaternions = "ℍ"; -var quatint = "⨖"; -var quest = "?"; -var questeq = "≟"; -var quo = "\""; -var quot = "\""; -var rAarr = "⇛"; -var rArr = "⇒"; -var rAtail = "⤜"; -var rBarr = "⤏"; -var rHar = "⥤"; -var race = "∽̱"; -var racute = "ŕ"; -var radic = "√"; -var raemptyv = "⦳"; -var rang = "⟩"; -var rangd = "⦒"; -var range = "⦥"; -var rangle = "⟩"; -var raqu = "»"; -var raquo = "»"; -var rarr = "→"; -var rarrap = "⥵"; -var rarrb = "⇥"; -var rarrbfs = "⤠"; -var rarrc = "⤳"; -var rarrfs = "⤞"; -var rarrhk = "↪"; -var rarrlp = "↬"; -var rarrpl = "⥅"; -var rarrsim = "⥴"; -var rarrtl = "↣"; -var rarrw = "↝"; -var ratail = "⤚"; -var ratio = "∶"; -var rationals = "ℚ"; -var rbarr = "⤍"; -var rbbrk = "❳"; -var rbrace = "}"; -var rbrack = "]"; -var rbrke = "⦌"; -var rbrksld = "⦎"; -var rbrkslu = "⦐"; -var rcaron = "ř"; -var rcedil = "ŗ"; -var rceil = "⌉"; -var rcub = "}"; -var rcy = "р"; -var rdca = "⤷"; -var rdldhar = "⥩"; -var rdquo = "”"; -var rdquor = "”"; -var rdsh = "↳"; -var real = "ℜ"; -var realine = "ℛ"; -var realpart = "ℜ"; -var reals = "ℝ"; -var rect = "▭"; -var re = "®"; -var reg = "®"; -var rfisht = "⥽"; -var rfloor = "⌋"; -var rfr = "𝔯"; -var rhard = "⇁"; -var rharu = "⇀"; -var rharul = "⥬"; -var rho = "ρ"; -var rhov = "ϱ"; -var rightarrow = "→"; -var rightarrowtail = "↣"; -var rightharpoondown = "⇁"; -var rightharpoonup = "⇀"; -var rightleftarrows = "⇄"; -var rightleftharpoons = "⇌"; -var rightrightarrows = "⇉"; -var rightsquigarrow = "↝"; -var rightthreetimes = "⋌"; -var ring = "˚"; -var risingdotseq = "≓"; -var rlarr = "⇄"; -var rlhar = "⇌"; -var rlm = "‏"; -var rmoust = "⎱"; -var rmoustache = "⎱"; -var rnmid = "⫮"; -var roang = "⟭"; -var roarr = "⇾"; -var robrk = "⟧"; -var ropar = "⦆"; -var ropf = "𝕣"; -var roplus = "⨮"; -var rotimes = "⨵"; -var rpar = ")"; -var rpargt = "⦔"; -var rppolint = "⨒"; -var rrarr = "⇉"; -var rsaquo = "›"; -var rscr = "𝓇"; -var rsh = "↱"; -var rsqb = "]"; -var rsquo = "’"; -var rsquor = "’"; -var rthree = "⋌"; -var rtimes = "⋊"; -var rtri = "▹"; -var rtrie = "⊵"; -var rtrif = "▸"; -var rtriltri = "⧎"; -var ruluhar = "⥨"; -var rx = "℞"; -var sacute = "ś"; -var sbquo = "‚"; -var sc = "≻"; -var scE = "⪴"; -var scap = "⪸"; -var scaron = "š"; -var sccue = "≽"; -var sce = "⪰"; -var scedil = "ş"; -var scirc = "ŝ"; -var scnE = "⪶"; -var scnap = "⪺"; -var scnsim = "⋩"; -var scpolint = "⨓"; -var scsim = "≿"; -var scy = "с"; -var sdot = "⋅"; -var sdotb = "⊡"; -var sdote = "⩦"; -var seArr = "⇘"; -var searhk = "⤥"; -var searr = "↘"; -var searrow = "↘"; -var sec = "§"; -var sect = "§"; -var semi = ";"; -var seswar = "⤩"; -var setminus = "∖"; -var setmn = "∖"; -var sext = "✶"; -var sfr = "𝔰"; -var sfrown = "⌢"; -var sharp = "♯"; -var shchcy = "щ"; -var shcy = "ш"; -var shortmid = "∣"; -var shortparallel = "∥"; -var sh = "­"; -var shy = "­"; -var sigma = "σ"; -var sigmaf = "ς"; -var sigmav = "ς"; -var sim = "∼"; -var simdot = "⩪"; -var sime = "≃"; -var simeq = "≃"; -var simg = "⪞"; -var simgE = "⪠"; -var siml = "⪝"; -var simlE = "⪟"; -var simne = "≆"; -var simplus = "⨤"; -var simrarr = "⥲"; -var slarr = "←"; -var smallsetminus = "∖"; -var smashp = "⨳"; -var smeparsl = "⧤"; -var smid = "∣"; -var smile = "⌣"; -var smt = "⪪"; -var smte = "⪬"; -var smtes = "⪬︀"; -var softcy = "ь"; -var sol = "/"; -var solb = "⧄"; -var solbar = "⌿"; -var sopf = "𝕤"; -var spades = "♠"; -var spadesuit = "♠"; -var spar = "∥"; -var sqcap = "⊓"; -var sqcaps = "⊓︀"; -var sqcup = "⊔"; -var sqcups = "⊔︀"; -var sqsub = "⊏"; -var sqsube = "⊑"; -var sqsubset = "⊏"; -var sqsubseteq = "⊑"; -var sqsup = "⊐"; -var sqsupe = "⊒"; -var sqsupset = "⊐"; -var sqsupseteq = "⊒"; -var squ = "□"; -var square = "□"; -var squarf = "▪"; -var squf = "▪"; -var srarr = "→"; -var sscr = "𝓈"; -var ssetmn = "∖"; -var ssmile = "⌣"; -var sstarf = "⋆"; -var star = "☆"; -var starf = "★"; -var straightepsilon = "ϵ"; -var straightphi = "ϕ"; -var strns = "¯"; -var sub = "⊂"; -var subE = "⫅"; -var subdot = "⪽"; -var sube = "⊆"; -var subedot = "⫃"; -var submult = "⫁"; -var subnE = "⫋"; -var subne = "⊊"; -var subplus = "⪿"; -var subrarr = "⥹"; -var subset = "⊂"; -var subseteq = "⊆"; -var subseteqq = "⫅"; -var subsetneq = "⊊"; -var subsetneqq = "⫋"; -var subsim = "⫇"; -var subsub = "⫕"; -var subsup = "⫓"; -var succ = "≻"; -var succapprox = "⪸"; -var succcurlyeq = "≽"; -var succeq = "⪰"; -var succnapprox = "⪺"; -var succneqq = "⪶"; -var succnsim = "⋩"; -var succsim = "≿"; -var sum = "∑"; -var sung = "♪"; -var sup = "⊃"; -var sup1 = "¹"; -var sup2 = "²"; -var sup3 = "³"; -var supE = "⫆"; -var supdot = "⪾"; -var supdsub = "⫘"; -var supe = "⊇"; -var supedot = "⫄"; -var suphsol = "⟉"; -var suphsub = "⫗"; -var suplarr = "⥻"; -var supmult = "⫂"; -var supnE = "⫌"; -var supne = "⊋"; -var supplus = "⫀"; -var supset = "⊃"; -var supseteq = "⊇"; -var supseteqq = "⫆"; -var supsetneq = "⊋"; -var supsetneqq = "⫌"; -var supsim = "⫈"; -var supsub = "⫔"; -var supsup = "⫖"; -var swArr = "⇙"; -var swarhk = "⤦"; -var swarr = "↙"; -var swarrow = "↙"; -var swnwar = "⤪"; -var szli = "ß"; -var szlig = "ß"; -var target = "⌖"; -var tau = "τ"; -var tbrk = "⎴"; -var tcaron = "ť"; -var tcedil = "ţ"; -var tcy = "т"; -var tdot = "⃛"; -var telrec = "⌕"; -var tfr = "𝔱"; -var there4 = "∴"; -var therefore = "∴"; -var theta = "θ"; -var thetasym = "ϑ"; -var thetav = "ϑ"; -var thickapprox = "≈"; -var thicksim = "∼"; -var thinsp = " "; -var thkap = "≈"; -var thksim = "∼"; -var thor = "þ"; -var thorn = "þ"; -var tilde = "˜"; -var time = "×"; -var times = "×"; -var timesb = "⊠"; -var timesbar = "⨱"; -var timesd = "⨰"; -var tint = "∭"; -var toea = "⤨"; -var top = "⊤"; -var topbot = "⌶"; -var topcir = "⫱"; -var topf = "𝕥"; -var topfork = "⫚"; -var tosa = "⤩"; -var tprime = "‴"; -var trade = "™"; -var triangle = "▵"; -var triangledown = "▿"; -var triangleleft = "◃"; -var trianglelefteq = "⊴"; -var triangleq = "≜"; -var triangleright = "▹"; -var trianglerighteq = "⊵"; -var tridot = "◬"; -var trie = "≜"; -var triminus = "⨺"; -var triplus = "⨹"; -var trisb = "⧍"; -var tritime = "⨻"; -var trpezium = "⏢"; -var tscr = "𝓉"; -var tscy = "ц"; -var tshcy = "ћ"; -var tstrok = "ŧ"; -var twixt = "≬"; -var twoheadleftarrow = "↞"; -var twoheadrightarrow = "↠"; -var uArr = "⇑"; -var uHar = "⥣"; -var uacut = "ú"; -var uacute = "ú"; -var uarr = "↑"; -var ubrcy = "ў"; -var ubreve = "ŭ"; -var ucir = "û"; -var ucirc = "û"; -var ucy = "у"; -var udarr = "⇅"; -var udblac = "ű"; -var udhar = "⥮"; -var ufisht = "⥾"; -var ufr = "𝔲"; -var ugrav = "ù"; -var ugrave = "ù"; -var uharl = "↿"; -var uharr = "↾"; -var uhblk = "▀"; -var ulcorn = "⌜"; -var ulcorner = "⌜"; -var ulcrop = "⌏"; -var ultri = "◸"; -var umacr = "ū"; -var um = "¨"; -var uml = "¨"; -var uogon = "ų"; -var uopf = "𝕦"; -var uparrow = "↑"; -var updownarrow = "↕"; -var upharpoonleft = "↿"; -var upharpoonright = "↾"; -var uplus = "⊎"; -var upsi = "υ"; -var upsih = "ϒ"; -var upsilon = "υ"; -var upuparrows = "⇈"; -var urcorn = "⌝"; -var urcorner = "⌝"; -var urcrop = "⌎"; -var uring = "ů"; -var urtri = "◹"; -var uscr = "𝓊"; -var utdot = "⋰"; -var utilde = "ũ"; -var utri = "▵"; -var utrif = "▴"; -var uuarr = "⇈"; -var uum = "ü"; -var uuml = "ü"; -var uwangle = "⦧"; -var vArr = "⇕"; -var vBar = "⫨"; -var vBarv = "⫩"; -var vDash = "⊨"; -var vangrt = "⦜"; -var varepsilon = "ϵ"; -var varkappa = "ϰ"; -var varnothing = "∅"; -var varphi = "ϕ"; -var varpi = "ϖ"; -var varpropto = "∝"; -var varr = "↕"; -var varrho = "ϱ"; -var varsigma = "ς"; -var varsubsetneq = "⊊︀"; -var varsubsetneqq = "⫋︀"; -var varsupsetneq = "⊋︀"; -var varsupsetneqq = "⫌︀"; -var vartheta = "ϑ"; -var vartriangleleft = "⊲"; -var vartriangleright = "⊳"; -var vcy = "в"; -var vdash = "⊢"; -var vee = "∨"; -var veebar = "⊻"; -var veeeq = "≚"; -var vellip = "⋮"; -var verbar = "|"; -var vert = "|"; -var vfr = "𝔳"; -var vltri = "⊲"; -var vnsub = "⊂⃒"; -var vnsup = "⊃⃒"; -var vopf = "𝕧"; -var vprop = "∝"; -var vrtri = "⊳"; -var vscr = "𝓋"; -var vsubnE = "⫋︀"; -var vsubne = "⊊︀"; -var vsupnE = "⫌︀"; -var vsupne = "⊋︀"; -var vzigzag = "⦚"; -var wcirc = "ŵ"; -var wedbar = "⩟"; -var wedge = "∧"; -var wedgeq = "≙"; -var weierp = "℘"; -var wfr = "𝔴"; -var wopf = "𝕨"; -var wp = "℘"; -var wr = "≀"; -var wreath = "≀"; -var wscr = "𝓌"; -var xcap = "⋂"; -var xcirc = "◯"; -var xcup = "⋃"; -var xdtri = "▽"; -var xfr = "𝔵"; -var xhArr = "⟺"; -var xharr = "⟷"; -var xi = "ξ"; -var xlArr = "⟸"; -var xlarr = "⟵"; -var xmap = "⟼"; -var xnis = "⋻"; -var xodot = "⨀"; -var xopf = "𝕩"; -var xoplus = "⨁"; -var xotime = "⨂"; -var xrArr = "⟹"; -var xrarr = "⟶"; -var xscr = "𝓍"; -var xsqcup = "⨆"; -var xuplus = "⨄"; -var xutri = "△"; -var xvee = "⋁"; -var xwedge = "⋀"; -var yacut = "ý"; -var yacute = "ý"; -var yacy = "я"; -var ycirc = "ŷ"; -var ycy = "ы"; -var ye = "¥"; -var yen = "¥"; -var yfr = "𝔶"; -var yicy = "ї"; -var yopf = "𝕪"; -var yscr = "𝓎"; -var yucy = "ю"; -var yum = "ÿ"; -var yuml = "ÿ"; -var zacute = "ź"; -var zcaron = "ž"; -var zcy = "з"; -var zdot = "ż"; -var zeetrf = "ℨ"; -var zeta = "ζ"; -var zfr = "𝔷"; -var zhcy = "ж"; -var zigrarr = "⇝"; -var zopf = "𝕫"; -var zscr = "𝓏"; -var zwj = "‍"; -var zwnj = "‌"; -var characterEntities = { - AEli: AEli, - AElig: AElig, - AM: AM, - AMP: AMP, - Aacut: Aacut, - Aacute: Aacute, - Abreve: Abreve, - Acir: Acir, - Acirc: Acirc, - Acy: Acy, - Afr: Afr, - Agrav: Agrav, - Agrave: Agrave, - Alpha: Alpha, - Amacr: Amacr, - And: And, - Aogon: Aogon, - Aopf: Aopf, - ApplyFunction: ApplyFunction, - Arin: Arin, - Aring: Aring, - Ascr: Ascr, - Assign: Assign, - Atild: Atild, - Atilde: Atilde, - Aum: Aum, - Auml: Auml, - Backslash: Backslash, - Barv: Barv, - Barwed: Barwed, - Bcy: Bcy, - Because: Because, - Bernoullis: Bernoullis, - Beta: Beta, - Bfr: Bfr, - Bopf: Bopf, - Breve: Breve, - Bscr: Bscr, - Bumpeq: Bumpeq, - CHcy: CHcy, - COP: COP, - COPY: COPY, - Cacute: Cacute, - Cap: Cap, - CapitalDifferentialD: CapitalDifferentialD, - Cayleys: Cayleys, - Ccaron: Ccaron, - Ccedi: Ccedi, - Ccedil: Ccedil, - Ccirc: Ccirc, - Cconint: Cconint, - Cdot: Cdot, - Cedilla: Cedilla, - CenterDot: CenterDot, - Cfr: Cfr, - Chi: Chi, - CircleDot: CircleDot, - CircleMinus: CircleMinus, - CirclePlus: CirclePlus, - CircleTimes: CircleTimes, - ClockwiseContourIntegral: ClockwiseContourIntegral, - CloseCurlyDoubleQuote: CloseCurlyDoubleQuote, - CloseCurlyQuote: CloseCurlyQuote, - Colon: Colon, - Colone: Colone, - Congruent: Congruent, - Conint: Conint, - ContourIntegral: ContourIntegral, - Copf: Copf, - Coproduct: Coproduct, - CounterClockwiseContourIntegral: CounterClockwiseContourIntegral, - Cross: Cross, - Cscr: Cscr, - Cup: Cup, - CupCap: CupCap, - DD: DD, - DDotrahd: DDotrahd, - DJcy: DJcy, - DScy: DScy, - DZcy: DZcy, - Dagger: Dagger, - Darr: Darr, - Dashv: Dashv, - Dcaron: Dcaron, - Dcy: Dcy, - Del: Del, - Delta: Delta, - Dfr: Dfr, - DiacriticalAcute: DiacriticalAcute, - DiacriticalDot: DiacriticalDot, - DiacriticalDoubleAcute: DiacriticalDoubleAcute, - DiacriticalGrave: DiacriticalGrave, - DiacriticalTilde: DiacriticalTilde, - Diamond: Diamond, - DifferentialD: DifferentialD, - Dopf: Dopf, - Dot: Dot, - DotDot: DotDot, - DotEqual: DotEqual, - DoubleContourIntegral: DoubleContourIntegral, - DoubleDot: DoubleDot, - DoubleDownArrow: DoubleDownArrow, - DoubleLeftArrow: DoubleLeftArrow, - DoubleLeftRightArrow: DoubleLeftRightArrow, - DoubleLeftTee: DoubleLeftTee, - DoubleLongLeftArrow: DoubleLongLeftArrow, - DoubleLongLeftRightArrow: DoubleLongLeftRightArrow, - DoubleLongRightArrow: DoubleLongRightArrow, - DoubleRightArrow: DoubleRightArrow, - DoubleRightTee: DoubleRightTee, - DoubleUpArrow: DoubleUpArrow, - DoubleUpDownArrow: DoubleUpDownArrow, - DoubleVerticalBar: DoubleVerticalBar, - DownArrow: DownArrow, - DownArrowBar: DownArrowBar, - DownArrowUpArrow: DownArrowUpArrow, - DownBreve: DownBreve, - DownLeftRightVector: DownLeftRightVector, - DownLeftTeeVector: DownLeftTeeVector, - DownLeftVector: DownLeftVector, - DownLeftVectorBar: DownLeftVectorBar, - DownRightTeeVector: DownRightTeeVector, - DownRightVector: DownRightVector, - DownRightVectorBar: DownRightVectorBar, - DownTee: DownTee, - DownTeeArrow: DownTeeArrow, - Downarrow: Downarrow, - Dscr: Dscr, - Dstrok: Dstrok, - ENG: ENG, - ET: ET, - ETH: ETH, - Eacut: Eacut, - Eacute: Eacute, - Ecaron: Ecaron, - Ecir: Ecir, - Ecirc: Ecirc, - Ecy: Ecy, - Edot: Edot, - Efr: Efr, - Egrav: Egrav, - Egrave: Egrave, - Element: Element, - Emacr: Emacr, - EmptySmallSquare: EmptySmallSquare, - EmptyVerySmallSquare: EmptyVerySmallSquare, - Eogon: Eogon, - Eopf: Eopf, - Epsilon: Epsilon, - Equal: Equal, - EqualTilde: EqualTilde, - Equilibrium: Equilibrium, - Escr: Escr, - Esim: Esim, - Eta: Eta, - Eum: Eum, - Euml: Euml, - Exists: Exists, - ExponentialE: ExponentialE, - Fcy: Fcy, - Ffr: Ffr, - FilledSmallSquare: FilledSmallSquare, - FilledVerySmallSquare: FilledVerySmallSquare, - Fopf: Fopf, - ForAll: ForAll, - Fouriertrf: Fouriertrf, - Fscr: Fscr, - GJcy: GJcy, - G: G, - GT: GT, - Gamma: Gamma, - Gammad: Gammad, - Gbreve: Gbreve, - Gcedil: Gcedil, - Gcirc: Gcirc, - Gcy: Gcy, - Gdot: Gdot, - Gfr: Gfr, - Gg: Gg, - Gopf: Gopf, - GreaterEqual: GreaterEqual, - GreaterEqualLess: GreaterEqualLess, - GreaterFullEqual: GreaterFullEqual, - GreaterGreater: GreaterGreater, - GreaterLess: GreaterLess, - GreaterSlantEqual: GreaterSlantEqual, - GreaterTilde: GreaterTilde, - Gscr: Gscr, - Gt: Gt, - HARDcy: HARDcy, - Hacek: Hacek, - Hat: Hat, - Hcirc: Hcirc, - Hfr: Hfr, - HilbertSpace: HilbertSpace, - Hopf: Hopf, - HorizontalLine: HorizontalLine, - Hscr: Hscr, - Hstrok: Hstrok, - HumpDownHump: HumpDownHump, - HumpEqual: HumpEqual, - IEcy: IEcy, - IJlig: IJlig, - IOcy: IOcy, - Iacut: Iacut, - Iacute: Iacute, - Icir: Icir, - Icirc: Icirc, - Icy: Icy, - Idot: Idot, - Ifr: Ifr, - Igrav: Igrav, - Igrave: Igrave, - Im: Im, - Imacr: Imacr, - ImaginaryI: ImaginaryI, - Implies: Implies, - Int: Int, - Integral: Integral, - Intersection: Intersection, - InvisibleComma: InvisibleComma, - InvisibleTimes: InvisibleTimes, - Iogon: Iogon, - Iopf: Iopf, - Iota: Iota, - Iscr: Iscr, - Itilde: Itilde, - Iukcy: Iukcy, - Ium: Ium, - Iuml: Iuml, - Jcirc: Jcirc, - Jcy: Jcy, - Jfr: Jfr, - Jopf: Jopf, - Jscr: Jscr, - Jsercy: Jsercy, - Jukcy: Jukcy, - KHcy: KHcy, - KJcy: KJcy, - Kappa: Kappa, - Kcedil: Kcedil, - Kcy: Kcy, - Kfr: Kfr, - Kopf: Kopf, - Kscr: Kscr, - LJcy: LJcy, - L: L$1, - LT: LT, - Lacute: Lacute, - Lambda: Lambda, - Lang: Lang, - Laplacetrf: Laplacetrf, - Larr: Larr, - Lcaron: Lcaron, - Lcedil: Lcedil, - Lcy: Lcy, - LeftAngleBracket: LeftAngleBracket, - LeftArrow: LeftArrow, - LeftArrowBar: LeftArrowBar, - LeftArrowRightArrow: LeftArrowRightArrow, - LeftCeiling: LeftCeiling, - LeftDoubleBracket: LeftDoubleBracket, - LeftDownTeeVector: LeftDownTeeVector, - LeftDownVector: LeftDownVector, - LeftDownVectorBar: LeftDownVectorBar, - LeftFloor: LeftFloor, - LeftRightArrow: LeftRightArrow, - LeftRightVector: LeftRightVector, - LeftTee: LeftTee, - LeftTeeArrow: LeftTeeArrow, - LeftTeeVector: LeftTeeVector, - LeftTriangle: LeftTriangle, - LeftTriangleBar: LeftTriangleBar, - LeftTriangleEqual: LeftTriangleEqual, - LeftUpDownVector: LeftUpDownVector, - LeftUpTeeVector: LeftUpTeeVector, - LeftUpVector: LeftUpVector, - LeftUpVectorBar: LeftUpVectorBar, - LeftVector: LeftVector, - LeftVectorBar: LeftVectorBar, - Leftarrow: Leftarrow, - Leftrightarrow: Leftrightarrow, - LessEqualGreater: LessEqualGreater, - LessFullEqual: LessFullEqual, - LessGreater: LessGreater, - LessLess: LessLess, - LessSlantEqual: LessSlantEqual, - LessTilde: LessTilde, - Lfr: Lfr, - Ll: Ll, - Lleftarrow: Lleftarrow, - Lmidot: Lmidot, - LongLeftArrow: LongLeftArrow, - LongLeftRightArrow: LongLeftRightArrow, - LongRightArrow: LongRightArrow, - Longleftarrow: Longleftarrow, - Longleftrightarrow: Longleftrightarrow, - Longrightarrow: Longrightarrow, - Lopf: Lopf, - LowerLeftArrow: LowerLeftArrow, - LowerRightArrow: LowerRightArrow, - Lscr: Lscr, - Lsh: Lsh, - Lstrok: Lstrok, - Lt: Lt, - "Map": "⤅", - Mcy: Mcy, - MediumSpace: MediumSpace, - Mellintrf: Mellintrf, - Mfr: Mfr, - MinusPlus: MinusPlus, - Mopf: Mopf, - Mscr: Mscr, - Mu: Mu, - NJcy: NJcy, - Nacute: Nacute, - Ncaron: Ncaron, - Ncedil: Ncedil, - Ncy: Ncy, - NegativeMediumSpace: NegativeMediumSpace, - NegativeThickSpace: NegativeThickSpace, - NegativeThinSpace: NegativeThinSpace, - NegativeVeryThinSpace: NegativeVeryThinSpace, - NestedGreaterGreater: NestedGreaterGreater, - NestedLessLess: NestedLessLess, - NewLine: NewLine, - Nfr: Nfr, - NoBreak: NoBreak, - NonBreakingSpace: NonBreakingSpace, - Nopf: Nopf, - Not: Not, - NotCongruent: NotCongruent, - NotCupCap: NotCupCap, - NotDoubleVerticalBar: NotDoubleVerticalBar, - NotElement: NotElement, - NotEqual: NotEqual, - NotEqualTilde: NotEqualTilde, - NotExists: NotExists, - NotGreater: NotGreater, - NotGreaterEqual: NotGreaterEqual, - NotGreaterFullEqual: NotGreaterFullEqual, - NotGreaterGreater: NotGreaterGreater, - NotGreaterLess: NotGreaterLess, - NotGreaterSlantEqual: NotGreaterSlantEqual, - NotGreaterTilde: NotGreaterTilde, - NotHumpDownHump: NotHumpDownHump, - NotHumpEqual: NotHumpEqual, - NotLeftTriangle: NotLeftTriangle, - NotLeftTriangleBar: NotLeftTriangleBar, - NotLeftTriangleEqual: NotLeftTriangleEqual, - NotLess: NotLess, - NotLessEqual: NotLessEqual, - NotLessGreater: NotLessGreater, - NotLessLess: NotLessLess, - NotLessSlantEqual: NotLessSlantEqual, - NotLessTilde: NotLessTilde, - NotNestedGreaterGreater: NotNestedGreaterGreater, - NotNestedLessLess: NotNestedLessLess, - NotPrecedes: NotPrecedes, - NotPrecedesEqual: NotPrecedesEqual, - NotPrecedesSlantEqual: NotPrecedesSlantEqual, - NotReverseElement: NotReverseElement, - NotRightTriangle: NotRightTriangle, - NotRightTriangleBar: NotRightTriangleBar, - NotRightTriangleEqual: NotRightTriangleEqual, - NotSquareSubset: NotSquareSubset, - NotSquareSubsetEqual: NotSquareSubsetEqual, - NotSquareSuperset: NotSquareSuperset, - NotSquareSupersetEqual: NotSquareSupersetEqual, - NotSubset: NotSubset, - NotSubsetEqual: NotSubsetEqual, - NotSucceeds: NotSucceeds, - NotSucceedsEqual: NotSucceedsEqual, - NotSucceedsSlantEqual: NotSucceedsSlantEqual, - NotSucceedsTilde: NotSucceedsTilde, - NotSuperset: NotSuperset, - NotSupersetEqual: NotSupersetEqual, - NotTilde: NotTilde, - NotTildeEqual: NotTildeEqual, - NotTildeFullEqual: NotTildeFullEqual, - NotTildeTilde: NotTildeTilde, - NotVerticalBar: NotVerticalBar, - Nscr: Nscr, - Ntild: Ntild, - Ntilde: Ntilde, - Nu: Nu, - OElig: OElig, - Oacut: Oacut, - Oacute: Oacute, - Ocir: Ocir, - Ocirc: Ocirc, - Ocy: Ocy, - Odblac: Odblac, - Ofr: Ofr, - Ograv: Ograv, - Ograve: Ograve, - Omacr: Omacr, - Omega: Omega, - Omicron: Omicron, - Oopf: Oopf, - OpenCurlyDoubleQuote: OpenCurlyDoubleQuote, - OpenCurlyQuote: OpenCurlyQuote, - Or: Or, - Oscr: Oscr, - Oslas: Oslas, - Oslash: Oslash, - Otild: Otild, - Otilde: Otilde, - Otimes: Otimes, - Oum: Oum, - Ouml: Ouml, - OverBar: OverBar, - OverBrace: OverBrace, - OverBracket: OverBracket, - OverParenthesis: OverParenthesis, - PartialD: PartialD, - Pcy: Pcy, - Pfr: Pfr, - Phi: Phi, - Pi: Pi, - PlusMinus: PlusMinus, - Poincareplane: Poincareplane, - Popf: Popf, - Pr: Pr, - Precedes: Precedes, - PrecedesEqual: PrecedesEqual, - PrecedesSlantEqual: PrecedesSlantEqual, - PrecedesTilde: PrecedesTilde, - Prime: Prime, - Product: Product, - Proportion: Proportion, - Proportional: Proportional, - Pscr: Pscr, - Psi: Psi, - QUO: QUO, - QUOT: QUOT, - Qfr: Qfr, - Qopf: Qopf, - Qscr: Qscr, - RBarr: RBarr, - RE: RE, - REG: REG, - Racute: Racute, - Rang: Rang, - Rarr: Rarr, - Rarrtl: Rarrtl, - Rcaron: Rcaron, - Rcedil: Rcedil, - Rcy: Rcy, - Re: Re, - ReverseElement: ReverseElement, - ReverseEquilibrium: ReverseEquilibrium, - ReverseUpEquilibrium: ReverseUpEquilibrium, - Rfr: Rfr, - Rho: Rho, - RightAngleBracket: RightAngleBracket, - RightArrow: RightArrow, - RightArrowBar: RightArrowBar, - RightArrowLeftArrow: RightArrowLeftArrow, - RightCeiling: RightCeiling, - RightDoubleBracket: RightDoubleBracket, - RightDownTeeVector: RightDownTeeVector, - RightDownVector: RightDownVector, - RightDownVectorBar: RightDownVectorBar, - RightFloor: RightFloor, - RightTee: RightTee, - RightTeeArrow: RightTeeArrow, - RightTeeVector: RightTeeVector, - RightTriangle: RightTriangle, - RightTriangleBar: RightTriangleBar, - RightTriangleEqual: RightTriangleEqual, - RightUpDownVector: RightUpDownVector, - RightUpTeeVector: RightUpTeeVector, - RightUpVector: RightUpVector, - RightUpVectorBar: RightUpVectorBar, - RightVector: RightVector, - RightVectorBar: RightVectorBar, - Rightarrow: Rightarrow, - Ropf: Ropf, - RoundImplies: RoundImplies, - Rrightarrow: Rrightarrow, - Rscr: Rscr, - Rsh: Rsh, - RuleDelayed: RuleDelayed, - SHCHcy: SHCHcy, - SHcy: SHcy, - SOFTcy: SOFTcy, - Sacute: Sacute, - Sc: Sc, - Scaron: Scaron, - Scedil: Scedil, - Scirc: Scirc, - Scy: Scy, - Sfr: Sfr, - ShortDownArrow: ShortDownArrow, - ShortLeftArrow: ShortLeftArrow, - ShortRightArrow: ShortRightArrow, - ShortUpArrow: ShortUpArrow, - Sigma: Sigma, - SmallCircle: SmallCircle, - Sopf: Sopf, - Sqrt: Sqrt, - Square: Square, - SquareIntersection: SquareIntersection, - SquareSubset: SquareSubset, - SquareSubsetEqual: SquareSubsetEqual, - SquareSuperset: SquareSuperset, - SquareSupersetEqual: SquareSupersetEqual, - SquareUnion: SquareUnion, - Sscr: Sscr, - Star: Star, - Sub: Sub, - Subset: Subset, - SubsetEqual: SubsetEqual, - Succeeds: Succeeds, - SucceedsEqual: SucceedsEqual, - SucceedsSlantEqual: SucceedsSlantEqual, - SucceedsTilde: SucceedsTilde, - SuchThat: SuchThat, - Sum: Sum, - Sup: Sup, - Superset: Superset, - SupersetEqual: SupersetEqual, - Supset: Supset, - THOR: THOR, - THORN: THORN, - TRADE: TRADE, - TSHcy: TSHcy, - TScy: TScy, - Tab: Tab, - Tau: Tau, - Tcaron: Tcaron, - Tcedil: Tcedil, - Tcy: Tcy, - Tfr: Tfr, - Therefore: Therefore, - Theta: Theta, - ThickSpace: ThickSpace, - ThinSpace: ThinSpace, - Tilde: Tilde, - TildeEqual: TildeEqual, - TildeFullEqual: TildeFullEqual, - TildeTilde: TildeTilde, - Topf: Topf, - TripleDot: TripleDot, - Tscr: Tscr, - Tstrok: Tstrok, - Uacut: Uacut, - Uacute: Uacute, - Uarr: Uarr, - Uarrocir: Uarrocir, - Ubrcy: Ubrcy, - Ubreve: Ubreve, - Ucir: Ucir, - Ucirc: Ucirc, - Ucy: Ucy, - Udblac: Udblac, - Ufr: Ufr, - Ugrav: Ugrav, - Ugrave: Ugrave, - Umacr: Umacr, - UnderBar: UnderBar, - UnderBrace: UnderBrace, - UnderBracket: UnderBracket, - UnderParenthesis: UnderParenthesis, - Union: Union, - UnionPlus: UnionPlus, - Uogon: Uogon, - Uopf: Uopf, - UpArrow: UpArrow, - UpArrowBar: UpArrowBar, - UpArrowDownArrow: UpArrowDownArrow, - UpDownArrow: UpDownArrow, - UpEquilibrium: UpEquilibrium, - UpTee: UpTee, - UpTeeArrow: UpTeeArrow, - Uparrow: Uparrow, - Updownarrow: Updownarrow, - UpperLeftArrow: UpperLeftArrow, - UpperRightArrow: UpperRightArrow, - Upsi: Upsi, - Upsilon: Upsilon, - Uring: Uring, - Uscr: Uscr, - Utilde: Utilde, - Uum: Uum, - Uuml: Uuml, - VDash: VDash, - Vbar: Vbar, - Vcy: Vcy, - Vdash: Vdash, - Vdashl: Vdashl, - Vee: Vee, - Verbar: Verbar, - Vert: Vert, - VerticalBar: VerticalBar, - VerticalLine: VerticalLine, - VerticalSeparator: VerticalSeparator, - VerticalTilde: VerticalTilde, - VeryThinSpace: VeryThinSpace, - Vfr: Vfr, - Vopf: Vopf, - Vscr: Vscr, - Vvdash: Vvdash, - Wcirc: Wcirc, - Wedge: Wedge, - Wfr: Wfr, - Wopf: Wopf, - Wscr: Wscr, - Xfr: Xfr, - Xi: Xi, - Xopf: Xopf, - Xscr: Xscr, - YAcy: YAcy, - YIcy: YIcy, - YUcy: YUcy, - Yacut: Yacut, - Yacute: Yacute, - Ycirc: Ycirc, - Ycy: Ycy, - Yfr: Yfr, - Yopf: Yopf, - Yscr: Yscr, - Yuml: Yuml, - ZHcy: ZHcy, - Zacute: Zacute, - Zcaron: Zcaron, - Zcy: Zcy, - Zdot: Zdot, - ZeroWidthSpace: ZeroWidthSpace, - Zeta: Zeta, - Zfr: Zfr, - Zopf: Zopf, - Zscr: Zscr, - aacut: aacut, - aacute: aacute, - abreve: abreve, - ac: ac, - acE: acE, - acd: acd, - acir: acir, - acirc: acirc, - acut: acut, - acute: acute, - acy: acy, - aeli: aeli, - aelig: aelig, - af: af, - afr: afr, - agrav: agrav, - agrave: agrave, - alefsym: alefsym, - aleph: aleph, - alpha: alpha, - amacr: amacr, - amalg: amalg, - am: am, - amp: amp, - and: and, - andand: andand, - andd: andd, - andslope: andslope, - andv: andv, - ang: ang, - ange: ange, - angle: angle, - angmsd: angmsd, - angmsdaa: angmsdaa, - angmsdab: angmsdab, - angmsdac: angmsdac, - angmsdad: angmsdad, - angmsdae: angmsdae, - angmsdaf: angmsdaf, - angmsdag: angmsdag, - angmsdah: angmsdah, - angrt: angrt, - angrtvb: angrtvb, - angrtvbd: angrtvbd, - angsph: angsph, - angst: angst, - angzarr: angzarr, - aogon: aogon, - aopf: aopf, - ap: ap, - apE: apE, - apacir: apacir, - ape: ape, - apid: apid, - apos: apos, - approx: approx, - approxeq: approxeq, - arin: arin, - aring: aring, - ascr: ascr, - ast: ast, - asymp: asymp, - asympeq: asympeq, - atild: atild, - atilde: atilde, - aum: aum, - auml: auml, - awconint: awconint, - awint: awint, - bNot: bNot, - backcong: backcong, - backepsilon: backepsilon, - backprime: backprime, - backsim: backsim, - backsimeq: backsimeq, - barvee: barvee, - barwed: barwed, - barwedge: barwedge, - bbrk: bbrk, - bbrktbrk: bbrktbrk, - bcong: bcong, - bcy: bcy, - bdquo: bdquo, - becaus: becaus, - because: because, - bemptyv: bemptyv, - bepsi: bepsi, - bernou: bernou, - beta: beta, - beth: beth, - between: between, - bfr: bfr, - bigcap: bigcap, - bigcirc: bigcirc, - bigcup: bigcup, - bigodot: bigodot, - bigoplus: bigoplus, - bigotimes: bigotimes, - bigsqcup: bigsqcup, - bigstar: bigstar, - bigtriangledown: bigtriangledown, - bigtriangleup: bigtriangleup, - biguplus: biguplus, - bigvee: bigvee, - bigwedge: bigwedge, - bkarow: bkarow, - blacklozenge: blacklozenge, - blacksquare: blacksquare, - blacktriangle: blacktriangle, - blacktriangledown: blacktriangledown, - blacktriangleleft: blacktriangleleft, - blacktriangleright: blacktriangleright, - blank: blank, - blk12: blk12, - blk14: blk14, - blk34: blk34, - block: block, - bne: bne, - bnequiv: bnequiv, - bnot: bnot, - bopf: bopf, - bot: bot, - bottom: bottom, - bowtie: bowtie, - boxDL: boxDL, - boxDR: boxDR, - boxDl: boxDl, - boxDr: boxDr, - boxH: boxH, - boxHD: boxHD, - boxHU: boxHU, - boxHd: boxHd, - boxHu: boxHu, - boxUL: boxUL, - boxUR: boxUR, - boxUl: boxUl, - boxUr: boxUr, - boxV: boxV, - boxVH: boxVH, - boxVL: boxVL, - boxVR: boxVR, - boxVh: boxVh, - boxVl: boxVl, - boxVr: boxVr, - boxbox: boxbox, - boxdL: boxdL, - boxdR: boxdR, - boxdl: boxdl, - boxdr: boxdr, - boxh: boxh, - boxhD: boxhD, - boxhU: boxhU, - boxhd: boxhd, - boxhu: boxhu, - boxminus: boxminus, - boxplus: boxplus, - boxtimes: boxtimes, - boxuL: boxuL, - boxuR: boxuR, - boxul: boxul, - boxur: boxur, - boxv: boxv, - boxvH: boxvH, - boxvL: boxvL, - boxvR: boxvR, - boxvh: boxvh, - boxvl: boxvl, - boxvr: boxvr, - bprime: bprime, - breve: breve, - brvba: brvba, - brvbar: brvbar, - bscr: bscr, - bsemi: bsemi, - bsim: bsim, - bsime: bsime, - bsol: bsol, - bsolb: bsolb, - bsolhsub: bsolhsub, - bull: bull, - bullet: bullet, - bump: bump, - bumpE: bumpE, - bumpe: bumpe, - bumpeq: bumpeq, - cacute: cacute, - cap: cap, - capand: capand, - capbrcup: capbrcup, - capcap: capcap, - capcup: capcup, - capdot: capdot, - caps: caps, - caret: caret, - caron: caron, - ccaps: ccaps, - ccaron: ccaron, - ccedi: ccedi, - ccedil: ccedil, - ccirc: ccirc, - ccups: ccups, - ccupssm: ccupssm, - cdot: cdot, - cedi: cedi, - cedil: cedil, - cemptyv: cemptyv, - cen: cen, - cent: cent, - centerdot: centerdot, - cfr: cfr, - chcy: chcy, - check: check, - checkmark: checkmark, - chi: chi, - cir: cir, - cirE: cirE, - circ: circ, - circeq: circeq, - circlearrowleft: circlearrowleft, - circlearrowright: circlearrowright, - circledR: circledR, - circledS: circledS, - circledast: circledast, - circledcirc: circledcirc, - circleddash: circleddash, - cire: cire, - cirfnint: cirfnint, - cirmid: cirmid, - cirscir: cirscir, - clubs: clubs, - clubsuit: clubsuit, - colon: colon$1, - colone: colone, - coloneq: coloneq, - comma: comma, - commat: commat, - comp: comp, - compfn: compfn, - complement: complement, - complexes: complexes, - cong: cong, - congdot: congdot, - conint: conint, - copf: copf, - coprod: coprod, - cop: cop, - copy: copy, - copysr: copysr, - crarr: crarr, - cross: cross, - cscr: cscr, - csub: csub, - csube: csube, - csup: csup, - csupe: csupe, - ctdot: ctdot, - cudarrl: cudarrl, - cudarrr: cudarrr, - cuepr: cuepr, - cuesc: cuesc, - cularr: cularr, - cularrp: cularrp, - cup: cup, - cupbrcap: cupbrcap, - cupcap: cupcap, - cupcup: cupcup, - cupdot: cupdot, - cupor: cupor, - cups: cups, - curarr: curarr, - curarrm: curarrm, - curlyeqprec: curlyeqprec, - curlyeqsucc: curlyeqsucc, - curlyvee: curlyvee, - curlywedge: curlywedge, - curre: curre, - curren: curren, - curvearrowleft: curvearrowleft, - curvearrowright: curvearrowright, - cuvee: cuvee, - cuwed: cuwed, - cwconint: cwconint, - cwint: cwint, - cylcty: cylcty, - dArr: dArr, - dHar: dHar, - dagger: dagger, - daleth: daleth, - darr: darr, - dash: dash$1, - dashv: dashv, - dbkarow: dbkarow, - dblac: dblac, - dcaron: dcaron, - dcy: dcy, - dd: dd, - ddagger: ddagger, - ddarr: ddarr, - ddotseq: ddotseq, - de: de, - deg: deg, - delta: delta, - demptyv: demptyv, - dfisht: dfisht, - dfr: dfr, - dharl: dharl, - dharr: dharr, - diam: diam, - diamond: diamond, - diamondsuit: diamondsuit, - diams: diams, - die: die, - digamma: digamma, - disin: disin, - div: div, - divid: divid, - divide: divide, - divideontimes: divideontimes, - divonx: divonx, - djcy: djcy, - dlcorn: dlcorn, - dlcrop: dlcrop, - dollar: dollar, - dopf: dopf, - dot: dot, - doteq: doteq, - doteqdot: doteqdot, - dotminus: dotminus, - dotplus: dotplus, - dotsquare: dotsquare, - doublebarwedge: doublebarwedge, - downarrow: downarrow, - downdownarrows: downdownarrows, - downharpoonleft: downharpoonleft, - downharpoonright: downharpoonright, - drbkarow: drbkarow, - drcorn: drcorn, - drcrop: drcrop, - dscr: dscr, - dscy: dscy, - dsol: dsol, - dstrok: dstrok, - dtdot: dtdot, - dtri: dtri, - dtrif: dtrif, - duarr: duarr, - duhar: duhar, - dwangle: dwangle, - dzcy: dzcy, - dzigrarr: dzigrarr, - eDDot: eDDot, - eDot: eDot, - eacut: eacut, - eacute: eacute, - easter: easter, - ecaron: ecaron, - ecir: ecir, - ecirc: ecirc, - ecolon: ecolon, - ecy: ecy, - edot: edot, - ee: ee, - efDot: efDot, - efr: efr, - eg: eg, - egrav: egrav, - egrave: egrave, - egs: egs, - egsdot: egsdot, - el: el, - elinters: elinters, - ell: ell, - els: els, - elsdot: elsdot, - emacr: emacr, - empty: empty, - emptyset: emptyset, - emptyv: emptyv, - emsp13: emsp13, - emsp14: emsp14, - emsp: emsp, - eng: eng, - ensp: ensp, - eogon: eogon, - eopf: eopf, - epar: epar, - eparsl: eparsl, - eplus: eplus, - epsi: epsi, - epsilon: epsilon, - epsiv: epsiv, - eqcirc: eqcirc, - eqcolon: eqcolon, - eqsim: eqsim, - eqslantgtr: eqslantgtr, - eqslantless: eqslantless, - equals: equals, - equest: equest, - equiv: equiv, - equivDD: equivDD, - eqvparsl: eqvparsl, - erDot: erDot, - erarr: erarr, - escr: escr, - esdot: esdot, - esim: esim, - eta: eta, - et: et, - eth: eth, - eum: eum, - euml: euml, - euro: euro, - excl: excl, - exist: exist, - expectation: expectation, - exponentiale: exponentiale, - fallingdotseq: fallingdotseq, - fcy: fcy, - female: female, - ffilig: ffilig, - fflig: fflig, - ffllig: ffllig, - ffr: ffr, - filig: filig, - fjlig: fjlig, - flat: flat, - fllig: fllig, - fltns: fltns, - fnof: fnof, - fopf: fopf, - forall: forall, - fork: fork, - forkv: forkv, - fpartint: fpartint, - frac1: frac1, - frac12: frac12, - frac13: frac13, - frac14: frac14, - frac15: frac15, - frac16: frac16, - frac18: frac18, - frac23: frac23, - frac25: frac25, - frac3: frac3, - frac34: frac34, - frac35: frac35, - frac38: frac38, - frac45: frac45, - frac56: frac56, - frac58: frac58, - frac78: frac78, - frasl: frasl, - frown: frown, - fscr: fscr, - gE: gE, - gEl: gEl, - gacute: gacute, - gamma: gamma, - gammad: gammad, - gap: gap, - gbreve: gbreve, - gcirc: gcirc, - gcy: gcy, - gdot: gdot, - ge: ge, - gel: gel, - geq: geq, - geqq: geqq, - geqslant: geqslant, - ges: ges, - gescc: gescc, - gesdot: gesdot, - gesdoto: gesdoto, - gesdotol: gesdotol, - gesl: gesl, - gesles: gesles, - gfr: gfr, - gg: gg, - ggg: ggg, - gimel: gimel, - gjcy: gjcy, - gl: gl, - glE: glE, - gla: gla, - glj: glj, - gnE: gnE, - gnap: gnap, - gnapprox: gnapprox, - gne: gne, - gneq: gneq, - gneqq: gneqq, - gnsim: gnsim, - gopf: gopf, - grave: grave, - gscr: gscr, - gsim: gsim, - gsime: gsime, - gsiml: gsiml, - g: g, - gt: gt, - gtcc: gtcc, - gtcir: gtcir, - gtdot: gtdot, - gtlPar: gtlPar, - gtquest: gtquest, - gtrapprox: gtrapprox, - gtrarr: gtrarr, - gtrdot: gtrdot, - gtreqless: gtreqless, - gtreqqless: gtreqqless, - gtrless: gtrless, - gtrsim: gtrsim, - gvertneqq: gvertneqq, - gvnE: gvnE, - hArr: hArr, - hairsp: hairsp, - half: half, - hamilt: hamilt, - hardcy: hardcy, - harr: harr, - harrcir: harrcir, - harrw: harrw, - hbar: hbar, - hcirc: hcirc, - hearts: hearts, - heartsuit: heartsuit, - hellip: hellip, - hercon: hercon, - hfr: hfr, - hksearow: hksearow, - hkswarow: hkswarow, - hoarr: hoarr, - homtht: homtht, - hookleftarrow: hookleftarrow, - hookrightarrow: hookrightarrow, - hopf: hopf, - horbar: horbar, - hscr: hscr, - hslash: hslash, - hstrok: hstrok, - hybull: hybull, - hyphen: hyphen, - iacut: iacut, - iacute: iacute, - ic: ic, - icir: icir, - icirc: icirc, - icy: icy, - iecy: iecy, - iexc: iexc, - iexcl: iexcl, - iff: iff, - ifr: ifr, - igrav: igrav, - igrave: igrave, - ii: ii, - iiiint: iiiint, - iiint: iiint, - iinfin: iinfin, - iiota: iiota, - ijlig: ijlig, - imacr: imacr, - image: image, - imagline: imagline, - imagpart: imagpart, - imath: imath, - imof: imof, - imped: imped, - "in": "∈", - incare: incare, - infin: infin, - infintie: infintie, - inodot: inodot, - int: int, - intcal: intcal, - integers: integers, - intercal: intercal, - intlarhk: intlarhk, - intprod: intprod, - iocy: iocy, - iogon: iogon, - iopf: iopf, - iota: iota, - iprod: iprod, - iques: iques, - iquest: iquest, - iscr: iscr, - isin: isin, - isinE: isinE, - isindot: isindot, - isins: isins, - isinsv: isinsv, - isinv: isinv, - it: it, - itilde: itilde, - iukcy: iukcy, - ium: ium, - iuml: iuml, - jcirc: jcirc, - jcy: jcy, - jfr: jfr, - jmath: jmath, - jopf: jopf, - jscr: jscr, - jsercy: jsercy, - jukcy: jukcy, - kappa: kappa, - kappav: kappav, - kcedil: kcedil, - kcy: kcy, - kfr: kfr, - kgreen: kgreen, - khcy: khcy, - kjcy: kjcy, - kopf: kopf, - kscr: kscr, - lAarr: lAarr, - lArr: lArr, - lAtail: lAtail, - lBarr: lBarr, - lE: lE, - lEg: lEg, - lHar: lHar, - lacute: lacute, - laemptyv: laemptyv, - lagran: lagran, - lambda: lambda, - lang: lang, - langd: langd, - langle: langle, - lap: lap, - laqu: laqu, - laquo: laquo, - larr: larr, - larrb: larrb, - larrbfs: larrbfs, - larrfs: larrfs, - larrhk: larrhk, - larrlp: larrlp, - larrpl: larrpl, - larrsim: larrsim, - larrtl: larrtl, - lat: lat, - latail: latail, - late: late, - lates: lates, - lbarr: lbarr, - lbbrk: lbbrk, - lbrace: lbrace, - lbrack: lbrack, - lbrke: lbrke, - lbrksld: lbrksld, - lbrkslu: lbrkslu, - lcaron: lcaron, - lcedil: lcedil, - lceil: lceil, - lcub: lcub, - lcy: lcy, - ldca: ldca, - ldquo: ldquo, - ldquor: ldquor, - ldrdhar: ldrdhar, - ldrushar: ldrushar, - ldsh: ldsh, - le: le, - leftarrow: leftarrow, - leftarrowtail: leftarrowtail, - leftharpoondown: leftharpoondown, - leftharpoonup: leftharpoonup, - leftleftarrows: leftleftarrows, - leftrightarrow: leftrightarrow, - leftrightarrows: leftrightarrows, - leftrightharpoons: leftrightharpoons, - leftrightsquigarrow: leftrightsquigarrow, - leftthreetimes: leftthreetimes, - leg: leg, - leq: leq, - leqq: leqq, - leqslant: leqslant, - les: les, - lescc: lescc, - lesdot: lesdot, - lesdoto: lesdoto, - lesdotor: lesdotor, - lesg: lesg, - lesges: lesges, - lessapprox: lessapprox, - lessdot: lessdot, - lesseqgtr: lesseqgtr, - lesseqqgtr: lesseqqgtr, - lessgtr: lessgtr, - lesssim: lesssim, - lfisht: lfisht, - lfloor: lfloor, - lfr: lfr, - lg: lg, - lgE: lgE, - lhard: lhard, - lharu: lharu, - lharul: lharul, - lhblk: lhblk, - ljcy: ljcy, - ll: ll, - llarr: llarr, - llcorner: llcorner, - llhard: llhard, - lltri: lltri, - lmidot: lmidot, - lmoust: lmoust, - lmoustache: lmoustache, - lnE: lnE, - lnap: lnap, - lnapprox: lnapprox, - lne: lne, - lneq: lneq, - lneqq: lneqq, - lnsim: lnsim, - loang: loang, - loarr: loarr, - lobrk: lobrk, - longleftarrow: longleftarrow, - longleftrightarrow: longleftrightarrow, - longmapsto: longmapsto, - longrightarrow: longrightarrow, - looparrowleft: looparrowleft, - looparrowright: looparrowright, - lopar: lopar, - lopf: lopf, - loplus: loplus, - lotimes: lotimes, - lowast: lowast, - lowbar: lowbar, - loz: loz, - lozenge: lozenge, - lozf: lozf, - lpar: lpar, - lparlt: lparlt, - lrarr: lrarr, - lrcorner: lrcorner, - lrhar: lrhar, - lrhard: lrhard, - lrm: lrm, - lrtri: lrtri, - lsaquo: lsaquo, - lscr: lscr, - lsh: lsh, - lsim: lsim, - lsime: lsime, - lsimg: lsimg, - lsqb: lsqb, - lsquo: lsquo, - lsquor: lsquor, - lstrok: lstrok, - l: l$1, - lt: lt, - ltcc: ltcc, - ltcir: ltcir, - ltdot: ltdot, - lthree: lthree, - ltimes: ltimes, - ltlarr: ltlarr, - ltquest: ltquest, - ltrPar: ltrPar, - ltri: ltri, - ltrie: ltrie, - ltrif: ltrif, - lurdshar: lurdshar, - luruhar: luruhar, - lvertneqq: lvertneqq, - lvnE: lvnE, - mDDot: mDDot, - mac: mac, - macr: macr, - male: male, - malt: malt, - maltese: maltese, - map: map$3, - mapsto: mapsto, - mapstodown: mapstodown, - mapstoleft: mapstoleft, - mapstoup: mapstoup, - marker: marker, - mcomma: mcomma, - mcy: mcy, - mdash: mdash, - measuredangle: measuredangle, - mfr: mfr, - mho: mho, - micr: micr, - micro: micro, - mid: mid, - midast: midast, - midcir: midcir, - middo: middo, - middot: middot, - minus: minus, - minusb: minusb, - minusd: minusd, - minusdu: minusdu, - mlcp: mlcp, - mldr: mldr, - mnplus: mnplus, - models: models, - mopf: mopf, - mp: mp, - mscr: mscr, - mstpos: mstpos, - mu: mu, - multimap: multimap, - mumap: mumap, - nGg: nGg, - nGt: nGt, - nGtv: nGtv, - nLeftarrow: nLeftarrow, - nLeftrightarrow: nLeftrightarrow, - nLl: nLl, - nLt: nLt, - nLtv: nLtv, - nRightarrow: nRightarrow, - nVDash: nVDash, - nVdash: nVdash, - nabla: nabla, - nacute: nacute, - nang: nang, - nap: nap, - napE: napE, - napid: napid, - napos: napos, - napprox: napprox, - natur: natur, - natural: natural, - naturals: naturals, - nbs: nbs, - nbsp: nbsp, - nbump: nbump, - nbumpe: nbumpe, - ncap: ncap, - ncaron: ncaron, - ncedil: ncedil, - ncong: ncong, - ncongdot: ncongdot, - ncup: ncup, - ncy: ncy, - ndash: ndash, - ne: ne, - neArr: neArr, - nearhk: nearhk, - nearr: nearr, - nearrow: nearrow, - nedot: nedot, - nequiv: nequiv, - nesear: nesear, - nesim: nesim, - nexist: nexist, - nexists: nexists, - nfr: nfr, - ngE: ngE, - nge: nge, - ngeq: ngeq, - ngeqq: ngeqq, - ngeqslant: ngeqslant, - nges: nges, - ngsim: ngsim, - ngt: ngt, - ngtr: ngtr, - nhArr: nhArr, - nharr: nharr, - nhpar: nhpar, - ni: ni, - nis: nis, - nisd: nisd, - niv: niv, - njcy: njcy, - nlArr: nlArr, - nlE: nlE, - nlarr: nlarr, - nldr: nldr, - nle: nle, - nleftarrow: nleftarrow, - nleftrightarrow: nleftrightarrow, - nleq: nleq, - nleqq: nleqq, - nleqslant: nleqslant, - nles: nles, - nless: nless, - nlsim: nlsim, - nlt: nlt, - nltri: nltri, - nltrie: nltrie, - nmid: nmid, - nopf: nopf, - no: no, - not: not, - notin: notin, - notinE: notinE, - notindot: notindot, - notinva: notinva, - notinvb: notinvb, - notinvc: notinvc, - notni: notni, - notniva: notniva, - notnivb: notnivb, - notnivc: notnivc, - npar: npar, - nparallel: nparallel, - nparsl: nparsl, - npart: npart, - npolint: npolint, - npr: npr, - nprcue: nprcue, - npre: npre, - nprec: nprec, - npreceq: npreceq, - nrArr: nrArr, - nrarr: nrarr, - nrarrc: nrarrc, - nrarrw: nrarrw, - nrightarrow: nrightarrow, - nrtri: nrtri, - nrtrie: nrtrie, - nsc: nsc, - nsccue: nsccue, - nsce: nsce, - nscr: nscr, - nshortmid: nshortmid, - nshortparallel: nshortparallel, - nsim: nsim, - nsime: nsime, - nsimeq: nsimeq, - nsmid: nsmid, - nspar: nspar, - nsqsube: nsqsube, - nsqsupe: nsqsupe, - nsub: nsub, - nsubE: nsubE, - nsube: nsube, - nsubset: nsubset, - nsubseteq: nsubseteq, - nsubseteqq: nsubseteqq, - nsucc: nsucc, - nsucceq: nsucceq, - nsup: nsup, - nsupE: nsupE, - nsupe: nsupe, - nsupset: nsupset, - nsupseteq: nsupseteq, - nsupseteqq: nsupseteqq, - ntgl: ntgl, - ntild: ntild, - ntilde: ntilde, - ntlg: ntlg, - ntriangleleft: ntriangleleft, - ntrianglelefteq: ntrianglelefteq, - ntriangleright: ntriangleright, - ntrianglerighteq: ntrianglerighteq, - nu: nu, - num: num, - numero: numero, - numsp: numsp, - nvDash: nvDash, - nvHarr: nvHarr, - nvap: nvap, - nvdash: nvdash, - nvge: nvge, - nvgt: nvgt, - nvinfin: nvinfin, - nvlArr: nvlArr, - nvle: nvle, - nvlt: nvlt, - nvltrie: nvltrie, - nvrArr: nvrArr, - nvrtrie: nvrtrie, - nvsim: nvsim, - nwArr: nwArr, - nwarhk: nwarhk, - nwarr: nwarr, - nwarrow: nwarrow, - nwnear: nwnear, - oS: oS, - oacut: oacut, - oacute: oacute, - oast: oast, - ocir: ocir, - ocirc: ocirc, - ocy: ocy, - odash: odash, - odblac: odblac, - odiv: odiv, - odot: odot, - odsold: odsold, - oelig: oelig, - ofcir: ofcir, - ofr: ofr, - ogon: ogon, - ograv: ograv, - ograve: ograve, - ogt: ogt, - ohbar: ohbar, - ohm: ohm, - oint: oint, - olarr: olarr, - olcir: olcir, - olcross: olcross, - oline: oline, - olt: olt, - omacr: omacr, - omega: omega, - omicron: omicron, - omid: omid, - ominus: ominus, - oopf: oopf, - opar: opar, - operp: operp, - oplus: oplus, - or: or, - orarr: orarr, - ord: ord, - order: order$1, - orderof: orderof, - ordf: ordf, - ordm: ordm, - origof: origof, - oror: oror, - orslope: orslope, - orv: orv, - oscr: oscr, - oslas: oslas, - oslash: oslash, - osol: osol, - otild: otild, - otilde: otilde, - otimes: otimes, - otimesas: otimesas, - oum: oum, - ouml: ouml, - ovbar: ovbar, - par: par, - para: para, - parallel: parallel, - parsim: parsim, - parsl: parsl, - part: part, - pcy: pcy, - percnt: percnt, - period: period, - permil: permil, - perp: perp, - pertenk: pertenk, - pfr: pfr, - phi: phi, - phiv: phiv, - phmmat: phmmat, - phone: phone, - pi: pi, - pitchfork: pitchfork, - piv: piv, - planck: planck, - planckh: planckh, - plankv: plankv, - plus: plus, - plusacir: plusacir, - plusb: plusb, - pluscir: pluscir, - plusdo: plusdo, - plusdu: plusdu, - pluse: pluse, - plusm: plusm, - plusmn: plusmn, - plussim: plussim, - plustwo: plustwo, - pm: pm, - pointint: pointint, - popf: popf, - poun: poun, - pound: pound, - pr: pr, - prE: prE, - prap: prap, - prcue: prcue, - pre: pre, - prec: prec, - precapprox: precapprox, - preccurlyeq: preccurlyeq, - preceq: preceq, - precnapprox: precnapprox, - precneqq: precneqq, - precnsim: precnsim, - precsim: precsim, - prime: prime, - primes: primes, - prnE: prnE, - prnap: prnap, - prnsim: prnsim, - prod: prod, - profalar: profalar, - profline: profline, - profsurf: profsurf, - prop: prop, - propto: propto, - prsim: prsim, - prurel: prurel, - pscr: pscr, - psi: psi, - puncsp: puncsp, - qfr: qfr, - qint: qint, - qopf: qopf, - qprime: qprime, - qscr: qscr, - quaternions: quaternions, - quatint: quatint, - quest: quest, - questeq: questeq, - quo: quo, - quot: quot, - rAarr: rAarr, - rArr: rArr, - rAtail: rAtail, - rBarr: rBarr, - rHar: rHar, - race: race, - racute: racute, - radic: radic, - raemptyv: raemptyv, - rang: rang, - rangd: rangd, - range: range, - rangle: rangle, - raqu: raqu, - raquo: raquo, - rarr: rarr, - rarrap: rarrap, - rarrb: rarrb, - rarrbfs: rarrbfs, - rarrc: rarrc, - rarrfs: rarrfs, - rarrhk: rarrhk, - rarrlp: rarrlp, - rarrpl: rarrpl, - rarrsim: rarrsim, - rarrtl: rarrtl, - rarrw: rarrw, - ratail: ratail, - ratio: ratio, - rationals: rationals, - rbarr: rbarr, - rbbrk: rbbrk, - rbrace: rbrace, - rbrack: rbrack, - rbrke: rbrke, - rbrksld: rbrksld, - rbrkslu: rbrkslu, - rcaron: rcaron, - rcedil: rcedil, - rceil: rceil, - rcub: rcub, - rcy: rcy, - rdca: rdca, - rdldhar: rdldhar, - rdquo: rdquo, - rdquor: rdquor, - rdsh: rdsh, - real: real, - realine: realine, - realpart: realpart, - reals: reals, - rect: rect, - re: re, - reg: reg, - rfisht: rfisht, - rfloor: rfloor, - rfr: rfr, - rhard: rhard, - rharu: rharu, - rharul: rharul, - rho: rho, - rhov: rhov, - rightarrow: rightarrow, - rightarrowtail: rightarrowtail, - rightharpoondown: rightharpoondown, - rightharpoonup: rightharpoonup, - rightleftarrows: rightleftarrows, - rightleftharpoons: rightleftharpoons, - rightrightarrows: rightrightarrows, - rightsquigarrow: rightsquigarrow, - rightthreetimes: rightthreetimes, - ring: ring, - risingdotseq: risingdotseq, - rlarr: rlarr, - rlhar: rlhar, - rlm: rlm, - rmoust: rmoust, - rmoustache: rmoustache, - rnmid: rnmid, - roang: roang, - roarr: roarr, - robrk: robrk, - ropar: ropar, - ropf: ropf, - roplus: roplus, - rotimes: rotimes, - rpar: rpar, - rpargt: rpargt, - rppolint: rppolint, - rrarr: rrarr, - rsaquo: rsaquo, - rscr: rscr, - rsh: rsh, - rsqb: rsqb, - rsquo: rsquo, - rsquor: rsquor, - rthree: rthree, - rtimes: rtimes, - rtri: rtri, - rtrie: rtrie, - rtrif: rtrif, - rtriltri: rtriltri, - ruluhar: ruluhar, - rx: rx, - sacute: sacute, - sbquo: sbquo, - sc: sc, - scE: scE, - scap: scap, - scaron: scaron, - sccue: sccue, - sce: sce, - scedil: scedil, - scirc: scirc, - scnE: scnE, - scnap: scnap, - scnsim: scnsim, - scpolint: scpolint, - scsim: scsim, - scy: scy, - sdot: sdot, - sdotb: sdotb, - sdote: sdote, - seArr: seArr, - searhk: searhk, - searr: searr, - searrow: searrow, - sec: sec, - sect: sect, - semi: semi, - seswar: seswar, - setminus: setminus, - setmn: setmn, - sext: sext, - sfr: sfr, - sfrown: sfrown, - sharp: sharp, - shchcy: shchcy, - shcy: shcy, - shortmid: shortmid, - shortparallel: shortparallel, - sh: sh, - shy: shy, - sigma: sigma, - sigmaf: sigmaf, - sigmav: sigmav, - sim: sim, - simdot: simdot, - sime: sime, - simeq: simeq, - simg: simg, - simgE: simgE, - siml: siml, - simlE: simlE, - simne: simne, - simplus: simplus, - simrarr: simrarr, - slarr: slarr, - smallsetminus: smallsetminus, - smashp: smashp, - smeparsl: smeparsl, - smid: smid, - smile: smile, - smt: smt, - smte: smte, - smtes: smtes, - softcy: softcy, - sol: sol, - solb: solb, - solbar: solbar, - sopf: sopf, - spades: spades, - spadesuit: spadesuit, - spar: spar, - sqcap: sqcap, - sqcaps: sqcaps, - sqcup: sqcup, - sqcups: sqcups, - sqsub: sqsub, - sqsube: sqsube, - sqsubset: sqsubset, - sqsubseteq: sqsubseteq, - sqsup: sqsup, - sqsupe: sqsupe, - sqsupset: sqsupset, - sqsupseteq: sqsupseteq, - squ: squ, - square: square, - squarf: squarf, - squf: squf, - srarr: srarr, - sscr: sscr, - ssetmn: ssetmn, - ssmile: ssmile, - sstarf: sstarf, - star: star, - starf: starf, - straightepsilon: straightepsilon, - straightphi: straightphi, - strns: strns, - sub: sub, - subE: subE, - subdot: subdot, - sube: sube, - subedot: subedot, - submult: submult, - subnE: subnE, - subne: subne, - subplus: subplus, - subrarr: subrarr, - subset: subset, - subseteq: subseteq, - subseteqq: subseteqq, - subsetneq: subsetneq, - subsetneqq: subsetneqq, - subsim: subsim, - subsub: subsub, - subsup: subsup, - succ: succ, - succapprox: succapprox, - succcurlyeq: succcurlyeq, - succeq: succeq, - succnapprox: succnapprox, - succneqq: succneqq, - succnsim: succnsim, - succsim: succsim, - sum: sum, - sung: sung, - sup: sup, - sup1: sup1, - sup2: sup2, - sup3: sup3, - supE: supE, - supdot: supdot, - supdsub: supdsub, - supe: supe, - supedot: supedot, - suphsol: suphsol, - suphsub: suphsub, - suplarr: suplarr, - supmult: supmult, - supnE: supnE, - supne: supne, - supplus: supplus, - supset: supset, - supseteq: supseteq, - supseteqq: supseteqq, - supsetneq: supsetneq, - supsetneqq: supsetneqq, - supsim: supsim, - supsub: supsub, - supsup: supsup, - swArr: swArr, - swarhk: swarhk, - swarr: swarr, - swarrow: swarrow, - swnwar: swnwar, - szli: szli, - szlig: szlig, - target: target, - tau: tau, - tbrk: tbrk, - tcaron: tcaron, - tcedil: tcedil, - tcy: tcy, - tdot: tdot, - telrec: telrec, - tfr: tfr, - there4: there4, - therefore: therefore, - theta: theta, - thetasym: thetasym, - thetav: thetav, - thickapprox: thickapprox, - thicksim: thicksim, - thinsp: thinsp, - thkap: thkap, - thksim: thksim, - thor: thor, - thorn: thorn, - tilde: tilde, - time: time, - times: times, - timesb: timesb, - timesbar: timesbar, - timesd: timesd, - tint: tint, - toea: toea, - top: top, - topbot: topbot, - topcir: topcir, - topf: topf, - topfork: topfork, - tosa: tosa, - tprime: tprime, - trade: trade, - triangle: triangle, - triangledown: triangledown, - triangleleft: triangleleft, - trianglelefteq: trianglelefteq, - triangleq: triangleq, - triangleright: triangleright, - trianglerighteq: trianglerighteq, - tridot: tridot, - trie: trie, - triminus: triminus, - triplus: triplus, - trisb: trisb, - tritime: tritime, - trpezium: trpezium, - tscr: tscr, - tscy: tscy, - tshcy: tshcy, - tstrok: tstrok, - twixt: twixt, - twoheadleftarrow: twoheadleftarrow, - twoheadrightarrow: twoheadrightarrow, - uArr: uArr, - uHar: uHar, - uacut: uacut, - uacute: uacute, - uarr: uarr, - ubrcy: ubrcy, - ubreve: ubreve, - ucir: ucir, - ucirc: ucirc, - ucy: ucy, - udarr: udarr, - udblac: udblac, - udhar: udhar, - ufisht: ufisht, - ufr: ufr, - ugrav: ugrav, - ugrave: ugrave, - uharl: uharl, - uharr: uharr, - uhblk: uhblk, - ulcorn: ulcorn, - ulcorner: ulcorner, - ulcrop: ulcrop, - ultri: ultri, - umacr: umacr, - um: um, - uml: uml, - uogon: uogon, - uopf: uopf, - uparrow: uparrow, - updownarrow: updownarrow, - upharpoonleft: upharpoonleft, - upharpoonright: upharpoonright, - uplus: uplus, - upsi: upsi, - upsih: upsih, - upsilon: upsilon, - upuparrows: upuparrows, - urcorn: urcorn, - urcorner: urcorner, - urcrop: urcrop, - uring: uring, - urtri: urtri, - uscr: uscr, - utdot: utdot, - utilde: utilde, - utri: utri, - utrif: utrif, - uuarr: uuarr, - uum: uum, - uuml: uuml, - uwangle: uwangle, - vArr: vArr, - vBar: vBar, - vBarv: vBarv, - vDash: vDash, - vangrt: vangrt, - varepsilon: varepsilon, - varkappa: varkappa, - varnothing: varnothing, - varphi: varphi, - varpi: varpi, - varpropto: varpropto, - varr: varr, - varrho: varrho, - varsigma: varsigma, - varsubsetneq: varsubsetneq, - varsubsetneqq: varsubsetneqq, - varsupsetneq: varsupsetneq, - varsupsetneqq: varsupsetneqq, - vartheta: vartheta, - vartriangleleft: vartriangleleft, - vartriangleright: vartriangleright, - vcy: vcy, - vdash: vdash, - vee: vee, - veebar: veebar, - veeeq: veeeq, - vellip: vellip, - verbar: verbar, - vert: vert, - vfr: vfr, - vltri: vltri, - vnsub: vnsub, - vnsup: vnsup, - vopf: vopf, - vprop: vprop, - vrtri: vrtri, - vscr: vscr, - vsubnE: vsubnE, - vsubne: vsubne, - vsupnE: vsupnE, - vsupne: vsupne, - vzigzag: vzigzag, - wcirc: wcirc, - wedbar: wedbar, - wedge: wedge, - wedgeq: wedgeq, - weierp: weierp, - wfr: wfr, - wopf: wopf, - wp: wp, - wr: wr, - wreath: wreath, - wscr: wscr, - xcap: xcap, - xcirc: xcirc, - xcup: xcup, - xdtri: xdtri, - xfr: xfr, - xhArr: xhArr, - xharr: xharr, - xi: xi, - xlArr: xlArr, - xlarr: xlarr, - xmap: xmap, - xnis: xnis, - xodot: xodot, - xopf: xopf, - xoplus: xoplus, - xotime: xotime, - xrArr: xrArr, - xrarr: xrarr, - xscr: xscr, - xsqcup: xsqcup, - xuplus: xuplus, - xutri: xutri, - xvee: xvee, - xwedge: xwedge, - yacut: yacut, - yacute: yacute, - yacy: yacy, - ycirc: ycirc, - ycy: ycy, - ye: ye, - yen: yen, - yfr: yfr, - yicy: yicy, - yopf: yopf, - yscr: yscr, - yucy: yucy, - yum: yum, - yuml: yuml, - zacute: zacute, - zcaron: zcaron, - zcy: zcy, - zdot: zdot, - zeetrf: zeetrf, - zeta: zeta, - zfr: zfr, - zhcy: zhcy, - zigrarr: zigrarr, - zopf: zopf, - zscr: zscr, - zwj: zwj, - zwnj: zwnj -}; - -var decodeEntity_1 = decodeEntity; - -var own$6 = {}.hasOwnProperty; - -function decodeEntity(characters) { - return own$6.call(characterEntities, characters) - ? characterEntities[characters] - : false -} - -var association_1 = association; - - - -var characterEscape = /\\([!-/:-@[-`{-~])/g; -var characterReference = /&(#(\d{1,7}|x[\da-f]{1,6})|[\da-z]{1,31});/gi; - -// The `label` of an association is the string value: character escapes and -// references work, and casing is intact. -// The `identifier` is used to match one association to another: controversially, -// character escapes and references don’t work in this matching: `©` does -// not match `©`, and `\+` does not match `+`. -// But casing is ignored (and whitespace) is trimmed and collapsed: ` A\nb` -// matches `a b`. -// So, we do prefer the label when figuring out how we’re going to serialize: -// it has whitespace, casing, and we can ignore most useless character escapes -// and all character references. -function association(node) { - if (node.label || !node.identifier) { - return node.label || '' - } - - return node.identifier - .replace(characterEscape, '$1') - .replace(characterReference, decodeIfPossible) -} - -function decodeIfPossible($0, $1) { - return decodeEntity_1($1) || $0 -} - -var checkQuote_1 = checkQuote; - -function checkQuote(context) { - var marker = context.options.quote || '"'; - - if (marker !== '"' && marker !== "'") { - throw new Error( - 'Cannot serialize title with `' + - marker + - '` for `options.quote`, expected `"`, or `\'`' - ) - } - - return marker -} - -var definition_1 = definition; - - - - - -function definition(node, _, context) { - var marker = checkQuote_1(context); - var suffix = marker === '"' ? 'Quote' : 'Apostrophe'; - var exit = context.enter('definition'); - var subexit = context.enter('label'); - var value = - '[' + safe_1(context, association_1(node), {before: '[', after: ']'}) + ']: '; - - subexit(); - - if ( - // If there’s no url, or… - !node.url || - // If there’s whitespace, enclosed is prettier. - /[ \t\r\n]/.test(node.url) - ) { - subexit = context.enter('destinationLiteral'); - value += '<' + safe_1(context, node.url, {before: '<', after: '>'}) + '>'; - } else { - // No whitespace, raw is prettier. - subexit = context.enter('destinationRaw'); - value += safe_1(context, node.url, {before: ' ', after: ' '}); - } - - subexit(); - - if (node.title) { - subexit = context.enter('title' + suffix); - value += - ' ' + - marker + - safe_1(context, node.title, {before: marker, after: marker}) + - marker; - subexit(); - } - - exit(); - - return value -} - -var checkEmphasis_1 = checkEmphasis; - -function checkEmphasis(context) { - var marker = context.options.emphasis || '*'; - - if (marker !== '*' && marker !== '_') { - throw new Error( - 'Cannot serialize emphasis with `' + - marker + - '` for `options.emphasis`, expected `*`, or `_`' - ) - } - - return marker -} - -var containerPhrasing$1 = phrasing$1; - -function phrasing$1(parent, context, safeOptions) { - var children = parent.children || []; - var results = []; - var index = -1; - var before = safeOptions.before; - var after; - var handle; - var child; - - while (++index < children.length) { - child = children[index]; - - if (index + 1 < children.length) { - handle = context.handle.handlers[children[index + 1].type]; - if (handle && handle.peek) handle = handle.peek; - after = handle - ? handle(children[index + 1], parent, context, { - before: '', - after: '' - }).charAt(0) - : ''; - } else { - after = safeOptions.after; - } - - results.push( - context.handle(child, parent, context, { - before: before, - after: after - }) - ); - before = results[results.length - 1].slice(-1); - } - - return results.join('') -} - -var emphasis_1 = emphasis; -emphasis.peek = emphasisPeek; - - - - -// To do: there are cases where emphasis cannot “form” depending on the -// previous or next character of sequences. -// There’s no way around that though, except for injecting zero-width stuff. -// Do we need to safeguard against that? -function emphasis(node, _, context) { - var marker = checkEmphasis_1(context); - var exit = context.enter('emphasis'); - var value = containerPhrasing$1(node, context, {before: marker, after: marker}); - exit(); - return marker + value + marker -} - -function emphasisPeek(node, _, context) { - return context.options.emphasis || '*' -} - -var mdastUtilToString = toString$1; - -// Get the text content of a node. -// Prefer the node’s plain-text fields, otherwise serialize its children, -// and if the given value is an array, serialize the nodes in it. -function toString$1(node) { - return ( - (node && - (node.value || - node.alt || - node.title || - ('children' in node && all(node.children)) || - ('length' in node && all(node)))) || - '' - ) -} - -function all(values) { - var result = []; - var index = -1; - - while (++index < values.length) { - result[index] = toString$1(values[index]); - } - - return result.join('') -} - -var formatHeadingAsSetext_1 = formatHeadingAsSetext; - - - -function formatHeadingAsSetext(node, context) { - return ( - context.options.setext && (!node.depth || node.depth < 3) && mdastUtilToString(node) - ) -} - -var heading_1 = heading; - - - - - -function heading(node, _, context) { - var rank = Math.max(Math.min(6, node.depth || 1), 1); - var exit; - var subexit; - var value; - var sequence; - - if (formatHeadingAsSetext_1(node, context)) { - exit = context.enter('headingSetext'); - subexit = context.enter('phrasing'); - value = containerPhrasing$1(node, context, {before: '\n', after: '\n'}); - subexit(); - exit(); - - return ( - value + - '\n' + - repeatString( - rank === 1 ? '=' : '-', - // The whole size… - value.length - - // Minus the position of the character after the last EOL (or - // 0 if there is none)… - (Math.max(value.lastIndexOf('\r'), value.lastIndexOf('\n')) + 1) - ) - ) - } - - sequence = repeatString('#', rank); - exit = context.enter('headingAtx'); - subexit = context.enter('phrasing'); - value = containerPhrasing$1(node, context, {before: '# ', after: '\n'}); - value = value ? sequence + ' ' + value : sequence; - if (context.options.closeAtx) { - value += ' ' + sequence; - } - - subexit(); - exit(); - - return value -} - -var html_1 = html; - -function html(node) { - return node.value || '' -} - -var image_1 = image$1; -image$1.peek = imagePeek; - - - - -function image$1(node, _, context) { - var quote = checkQuote_1(context); - var suffix = quote === '"' ? 'Quote' : 'Apostrophe'; - var exit = context.enter('image'); - var subexit = context.enter('label'); - var value = '![' + safe_1(context, node.alt, {before: '[', after: ']'}) + ']('; - - subexit(); - - if ( - // If there’s no url but there is a title… - (!node.url && node.title) || - // Or if there’s markdown whitespace or an eol, enclose. - /[ \t\r\n]/.test(node.url) - ) { - subexit = context.enter('destinationLiteral'); - value += '<' + safe_1(context, node.url, {before: '<', after: '>'}) + '>'; - } else { - // No whitespace, raw is prettier. - subexit = context.enter('destinationRaw'); - value += safe_1(context, node.url, { - before: '(', - after: node.title ? ' ' : ')' - }); - } - - subexit(); - - if (node.title) { - subexit = context.enter('title' + suffix); - value += - ' ' + - quote + - safe_1(context, node.title, {before: quote, after: quote}) + - quote; - subexit(); - } - - value += ')'; - exit(); - - return value -} - -function imagePeek() { - return '!' -} - -var imageReference_1 = imageReference; -imageReference.peek = imageReferencePeek; - - - - -function imageReference(node, _, context) { - var type = node.referenceType; - var exit = context.enter('imageReference'); - var subexit = context.enter('label'); - var alt = safe_1(context, node.alt, {before: '[', after: ']'}); - var value = '![' + alt + ']'; - var reference; - var stack; - - subexit(); - // Hide the fact that we’re in phrasing, because escapes don’t work. - stack = context.stack; - context.stack = []; - subexit = context.enter('reference'); - reference = safe_1(context, association_1(node), {before: '[', after: ']'}); - subexit(); - context.stack = stack; - exit(); - - if (type === 'full' || !alt || alt !== reference) { - value += '[' + reference + ']'; - } else if (type !== 'shortcut') { - value += '[]'; - } - - return value -} - -function imageReferencePeek() { - return '!' -} - -var inlineCode_1$1 = inlineCode$1; -inlineCode$1.peek = inlineCodePeek$1; - -function inlineCode$1(node) { - var value = node.value || ''; - var sequence = '`'; - var pad = ''; - - // If there is a single grave accent on its own in the code, use a fence of - // two. - // If there are two in a row, use one. - while (new RegExp('(^|[^`])' + sequence + '([^`]|$)').test(value)) { - sequence += '`'; - } - - // If this is not just spaces or eols (tabs don’t count), and either the - // first or last character are a space, eol, or tick, then pad with spaces. - if ( - /[^ \r\n]/.test(value) && - (/[ \r\n`]/.test(value.charAt(0)) || - /[ \r\n`]/.test(value.charAt(value.length - 1))) - ) { - pad = ' '; - } - - return sequence + pad + value + pad + sequence -} - -function inlineCodePeek$1() { - return '`' -} - -var formatLinkAsAutolink_1 = formatLinkAsAutolink; - - - -function formatLinkAsAutolink(node) { - var raw = mdastUtilToString(node); - - return ( - // If there’s a url… - node.url && - // And there’s a no title… - !node.title && - // And if the url is the same as the content… - (raw === node.url || 'mailto:' + raw === node.url) && - // And that starts w/ a protocol… - /^[a-z][a-z+.-]+:/i.test(node.url) && - // And that doesn’t contain ASCII control codes (character escapes and - // references don’t work) or angle brackets… - !/[\0- <>\u007F]/.test(node.url) - ) -} - -var link_1 = link; -link.peek = linkPeek; - - - - - - -function link(node, _, context) { - var quote = checkQuote_1(context); - var suffix = quote === '"' ? 'Quote' : 'Apostrophe'; - var exit; - var subexit; - var value; - var stack; - - if (formatLinkAsAutolink_1(node)) { - // Hide the fact that we’re in phrasing, because escapes don’t work. - stack = context.stack; - context.stack = []; - exit = context.enter('autolink'); - value = '<' + containerPhrasing$1(node, context, {before: '<', after: '>'}) + '>'; - exit(); - context.stack = stack; - return value - } - - exit = context.enter('link'); - subexit = context.enter('label'); - value = '[' + containerPhrasing$1(node, context, {before: '[', after: ']'}) + ']('; - subexit(); - - if ( - // If there’s no url but there is a title… - (!node.url && node.title) || - // Or if there’s markdown whitespace or an eol, enclose. - /[ \t\r\n]/.test(node.url) - ) { - subexit = context.enter('destinationLiteral'); - value += '<' + safe_1(context, node.url, {before: '<', after: '>'}) + '>'; - } else { - // No whitespace, raw is prettier. - subexit = context.enter('destinationRaw'); - value += safe_1(context, node.url, { - before: '(', - after: node.title ? ' ' : ')' - }); - } - - subexit(); - - if (node.title) { - subexit = context.enter('title' + suffix); - value += - ' ' + - quote + - safe_1(context, node.title, {before: quote, after: quote}) + - quote; - subexit(); - } - - value += ')'; - - exit(); - return value -} - -function linkPeek(node) { - return formatLinkAsAutolink_1(node) ? '<' : '[' -} - -var linkReference_1 = linkReference; -linkReference.peek = linkReferencePeek; - - - - - -function linkReference(node, _, context) { - var type = node.referenceType; - var exit = context.enter('linkReference'); - var subexit = context.enter('label'); - var text = containerPhrasing$1(node, context, {before: '[', after: ']'}); - var value = '[' + text + ']'; - var reference; - var stack; - - subexit(); - // Hide the fact that we’re in phrasing, because escapes don’t work. - stack = context.stack; - context.stack = []; - subexit = context.enter('reference'); - reference = safe_1(context, association_1(node), {before: '[', after: ']'}); - subexit(); - context.stack = stack; - exit(); - - if (type === 'full' || !text || text !== reference) { - value += '[' + reference + ']'; - } else if (type !== 'shortcut') { - value += '[]'; - } - - return value -} - -function linkReferencePeek() { - return '[' -} - -var list_1 = list; - - - -function list(node, _, context) { - var exit = context.enter('list'); - var value = containerFlow$1(node, context); - exit(); - return value -} - -var checkBullet_1$1 = checkBullet$1; - -function checkBullet$1(context) { - var marker = context.options.bullet || '*'; - - if (marker !== '*' && marker !== '+' && marker !== '-') { - throw new Error( - 'Cannot serialize items with `' + - marker + - '` for `options.bullet`, expected `*`, `+`, or `-`' - ) - } - - return marker -} - -var checkListItemIndent_1$1 = checkListItemIndent$1; - -function checkListItemIndent$1(context) { - var style = context.options.listItemIndent || 'tab'; - - if (style === 1 || style === '1') { - return 'one' - } - - if (style !== 'tab' && style !== 'one' && style !== 'mixed') { - throw new Error( - 'Cannot serialize items with `' + - style + - '` for `options.listItemIndent`, expected `tab`, `one`, or `mixed`' - ) - } - - return style -} - -var listItem_1$1 = listItem$1; - - - - - - - -function listItem$1(node, parent, context) { - var bullet = checkBullet_1$1(context); - var listItemIndent = checkListItemIndent_1$1(context); - var size; - var value; - var exit; - - if (parent && parent.ordered) { - bullet = - (parent.start > -1 ? parent.start : 1) + - (context.options.incrementListMarker === false - ? 0 - : parent.children.indexOf(node)) + - '.'; - } - - size = bullet.length + 1; - - if ( - listItemIndent === 'tab' || - (listItemIndent === 'mixed' && ((parent && parent.spread) || node.spread)) - ) { - size = Math.ceil(size / 4) * 4; - } - - exit = context.enter('listItem'); - value = indentLines_1$1(containerFlow$1(node, context), map); - exit(); - - return value - - function map(line, index, blank) { - if (index) { - return (blank ? '' : repeatString(' ', size)) + line - } - - return (blank ? bullet : bullet + repeatString(' ', size - bullet.length)) + line - } -} - -var paragraph_1 = paragraph; - - - -function paragraph(node, _, context) { - var exit = context.enter('paragraph'); - var subexit = context.enter('phrasing'); - var value = containerPhrasing$1(node, context, {before: '\n', after: '\n'}); - subexit(); - exit(); - return value -} - -var root_1 = root; - - - -function root(node, _, context) { - return containerFlow$1(node, context) -} - -var checkStrong_1 = checkStrong; - -function checkStrong(context) { - var marker = context.options.strong || '*'; - - if (marker !== '*' && marker !== '_') { - throw new Error( - 'Cannot serialize strong with `' + - marker + - '` for `options.strong`, expected `*`, or `_`' - ) - } - - return marker -} - -var strong_1 = strong; -strong.peek = strongPeek; - - - - -// To do: there are cases where emphasis cannot “form” depending on the -// previous or next character of sequences. -// There’s no way around that though, except for injecting zero-width stuff. -// Do we need to safeguard against that? -function strong(node, _, context) { - var marker = checkStrong_1(context); - var exit = context.enter('strong'); - var value = containerPhrasing$1(node, context, {before: marker, after: marker}); - exit(); - return marker + marker + value + marker + marker -} - -function strongPeek(node, _, context) { - return context.options.strong || '*' -} - -var text_1$1 = text$2; - - - -function text$2(node, parent, context, safeOptions) { - return safe_1(context, node.value, safeOptions) -} - -var checkRuleRepeat = checkRule; - -function checkRule(context) { - var repetition = context.options.ruleRepetition || 3; - - if (repetition < 3) { - throw new Error( - 'Cannot serialize rules with repetition `' + - repetition + - '` for `options.ruleRepetition`, expected `3` or more' - ) - } - - return repetition -} - -var checkRule_1 = checkRule$1; - -function checkRule$1(context) { - var marker = context.options.rule || '*'; - - if (marker !== '*' && marker !== '-' && marker !== '_') { - throw new Error( - 'Cannot serialize rules with `' + - marker + - '` for `options.rule`, expected `*`, `-`, or `_`' - ) - } - - return marker -} - -var thematicBreak_1 = thematicBreak; - - - - - -function thematicBreak(node, parent, context) { - var value = repeatString( - checkRule_1(context) + (context.options.ruleSpaces ? ' ' : ''), - checkRuleRepeat(context) - ); - - return context.options.ruleSpaces ? value.slice(0, -1) : value -} - -var blockquote$1 = blockquote_1; -var _break$1 = _break; -var code$2 = code_1; -var definition$1 = definition_1; -var emphasis$1 = emphasis_1; -var hardBreak$1 = _break; -var heading$1 = heading_1; -var html$1 = html_1; -var image$2 = image_1; -var imageReference$1 = imageReference_1; -var inlineCode$2 = inlineCode_1$1; -var link$1 = link_1; -var linkReference$1 = linkReference_1; -var list$1 = list_1; -var listItem$2 = listItem_1$1; -var paragraph$1 = paragraph_1; -var root$1 = root_1; -var strong$1 = strong_1; -var text$3 = text_1$1; -var thematicBreak$1 = thematicBreak_1; - -var handle = { - blockquote: blockquote$1, - break: _break$1, - code: code$2, - definition: definition$1, - emphasis: emphasis$1, - hardBreak: hardBreak$1, - heading: heading$1, - html: html$1, - image: image$2, - imageReference: imageReference$1, - inlineCode: inlineCode$2, - link: link$1, - linkReference: linkReference$1, - list: list$1, - listItem: listItem$2, - paragraph: paragraph$1, - root: root$1, - strong: strong$1, - text: text$3, - thematicBreak: thematicBreak$1 -}; - -/** - * Code from mdast-util-to-markdown - */ -var join = [joinDefaults]; - - - - -function joinDefaults(left, right, parent, context) { - if ( - // Two lists with the same marker. - (right.type === 'list' && - right.type === left.type && - Boolean(left.ordered) === Boolean(right.ordered)) || - // Indented code after list or another indented code. - (right.type === 'code' && - formatCodeAsIndented_1(right, context) && - (left.type === 'list' || - (left.type === right.type && formatCodeAsIndented_1(left, context)))) - ) { - return false - } - - // Join children of a list or an item. - // In which case, `parent` has a `spread` field. - if (typeof parent.spread === 'boolean') { - if ( - left.type === 'paragraph' && - // Two paragraphs. - (left.type === right.type || - right.type === 'definition' || - // Paragraph followed by a setext heading. - (right.type === 'heading' && formatHeadingAsSetext_1(right, context))) - ) { - return - } - - return parent.spread ? 1 : 0 - } -} - -/** - * Code from mdast-util-to-markdown - */ -var lib$1 = toMarkdown$6; - - - - -function toMarkdown$6(tree, options) { - - let settings = options || {}; - let extensions = configure$2(settings); - let stack = []; - let handle = zwitch('type', { - invalid: invalid, - unknown: unknown, - handlers: extensions.handlers - }); - let context = { - handle: handle, - stack: stack, - enter: enter, - options: settings, - unsafePatterns: [],//extensions.unsafe, - join: extensions.join - }; - let result = handle(tree, null, context, {before: '\n', after: '\n'}); - - if ( - result && - result.charCodeAt(result.length - 1) !== 10 && - result.charCodeAt(result.length - 1) !== 13 - ) { - result += '\n'; - } - - return result - - function enter(name) { - stack.push(name); - return exit - - function exit() { - stack.pop(); - } - } -} - -function invalid(value) { - throw new Error('Cannot handle value `' + value + '`, expected node') -} - -function unknown(node) { - throw new Error('Cannot handle unknown node `' + node.type + '`') -} - -function configure$2(settings) { - var extensions = [ - {unsafe: settings.unsafe, handlers: settings.handlers, join: settings.join} - ].concat(settings.extensions || []); - - var join$1 = join; - var handlers = Object.assign({}, handle); - var index = -1; - - if (settings.tightDefinitions) { - join$1 = [joinDefinition].concat(join$1); - } - - while (++index < extensions.length) { - join$1 = join$1.concat(extensions[index].join || []); - Object.assign(handlers, extensions[index].handlers || {}); - } - - //return {unsafe: unsafe, join: join, handlers: handlers} - return {unsafe: [], join: join$1, handlers: handlers} - -} - -function joinDefinition(left, right) { - // No blank line between adjacent definitions. - if (left.type === 'definition' && left.type === right.type) { - return 0 - } -} - - -// Handle values based on a property. -function zwitch(key, options) { - var noop = Function.prototype; - var own = {}.hasOwnProperty; - var settings = options || {}; - - function one(value) { - var fn = one.invalid; - var handlers = one.handlers; - - if (value && own.call(value, key)) { - fn = own.call(handlers, value[key]) ? handlers[value[key]] : one.unknown; - } - - return (fn || noop).apply(this, arguments) - } - - one.handlers = settings.handlers || {}; - one.invalid = settings.invalid; - one.unknown = settings.unknown; - - return one -} - -/** - * Code from mdast-util-to-markdown - */ -var mdastUtilToMarkdown = lib$1; - -var stringify_1 = stringify$1; - - - -function stringify$1(options) { - const self = this; - - this.Compiler = compile; - - function compile(tree) { - return mdastUtilToMarkdown( - tree, - Object.assign({}, self.data('settings'), options, { - extensions: self.data('toMarkdownExtensions') || [] - }) - ) - } -} - -var tokenize = tokenizeMathFenced; -var concrete = true; - - - - -function tokenizeMathFenced(effects, ok, nok) { - var self = this; - var initialPrefix = prefixSize_1(this.events, 'linePrefix'); - var sizeOpen = 0; - - return start - - function start(code) { - /* istanbul ignore if - handled by mm */ - if (code !== 36) throw new Error('expected `$`') - - effects.enter('mathFlow'); - effects.enter('mathFlowFence'); - effects.enter('mathFlowFenceSequence'); - return sequenceOpen(code) - } - - function sequenceOpen(code) { - if (code === 36) { - effects.consume(code); - sizeOpen++; - return sequenceOpen - } - - effects.exit('mathFlowFenceSequence'); - return sizeOpen < 2 - ? nok(code) - : factorySpace(effects, metaOpen, 'whitespace')(code) - } - - function metaOpen(code) { - if (code === null || code === -5 || code === -4 || code === -3) { - return openAfter(code) - } - - effects.enter('mathFlowFenceMeta'); - effects.enter('chunkString', {contentType: 'string'}); - return meta(code) - } - - function meta(code) { - if (code === null || code === -5 || code === -4 || code === -3) { - effects.exit('chunkString'); - effects.exit('mathFlowFenceMeta'); - return openAfter(code) - } - - if (code === 36) return nok(code) - effects.consume(code); - return meta - } - - function openAfter(code) { - effects.exit('mathFlowFence'); - return self.interrupt ? ok(code) : content(code) - } - - function content(code) { - if (code === null) { - return after(code) - } - - if (code === -5 || code === -4 || code === -3) { - effects.enter('lineEnding'); - effects.consume(code); - effects.exit('lineEnding'); - return effects.attempt( - {tokenize: tokenizeClosingFence, partial: true}, - after, - initialPrefix - ? factorySpace(effects, content, 'linePrefix', initialPrefix + 1) - : content - ) - } - - effects.enter('mathFlowValue'); - return contentContinue(code) - } - - function contentContinue(code) { - if (code === null || code === -5 || code === -4 || code === -3) { - effects.exit('mathFlowValue'); - return content(code) - } - - effects.consume(code); - return contentContinue - } - - function after(code) { - effects.exit('mathFlow'); - return ok(code) - } - - function tokenizeClosingFence(effects, ok, nok) { - var size = 0; - - return factorySpace(effects, closingPrefixAfter, 'linePrefix', 4) - - function closingPrefixAfter(code) { - effects.enter('mathFlowFence'); - effects.enter('mathFlowFenceSequence'); - return closingSequence(code) - } - - function closingSequence(code) { - if (code === 36) { - effects.consume(code); - size++; - return closingSequence - } - - if (size < sizeOpen) return nok(code) - effects.exit('mathFlowFenceSequence'); - return factorySpace(effects, closingSequenceEnd, 'whitespace')(code) - } - - function closingSequenceEnd(code) { - if (code === null || code === -5 || code === -4 || code === -3) { - effects.exit('mathFlowFence'); - return ok(code) - } - - return nok(code) - } - } -} - -var tokenizeMathFlow = { - tokenize: tokenize, - concrete: concrete -}; - -var tokenize$1 = tokenizeMathText; -var resolve = resolveMathText; -var previous_1 = previous$1; - -function resolveMathText(events) { - var tailExitIndex = events.length - 4; - var headEnterIndex = 3; - var index; - var enter; - - // If we start and end with an EOL or a space. - if ( - (events[headEnterIndex][1].type === 'lineEnding' || - events[headEnterIndex][1].type === 'space') && - (events[tailExitIndex][1].type === 'lineEnding' || - events[tailExitIndex][1].type === 'space') - ) { - index = headEnterIndex; - - // And we have data. - while (++index < tailExitIndex) { - if (events[index][1].type === 'mathTextData') { - // Then we have padding. - events[tailExitIndex][1].type = 'mathTextPadding'; - events[headEnterIndex][1].type = 'mathTextPadding'; - headEnterIndex += 2; - tailExitIndex -= 2; - break - } - } - } - - // Merge adjacent spaces and data. - index = headEnterIndex - 1; - tailExitIndex++; - - while (++index <= tailExitIndex) { - if (enter === undefined) { - if (index !== tailExitIndex && events[index][1].type !== 'lineEnding') { - enter = index; - } - } else if ( - index === tailExitIndex || - events[index][1].type === 'lineEnding' - ) { - events[enter][1].type = 'mathTextData'; - - if (index !== enter + 2) { - events[enter][1].end = events[index - 1][1].end; - events.splice(enter + 2, index - enter - 2); - tailExitIndex -= index - enter - 2; - index = enter + 2; - } - - enter = undefined; - } - } - - return events -} - -function previous$1(code) { - // If there is a previous code, there will always be a tail. - return ( - code !== 36 || - this.events[this.events.length - 1][1].type === 'characterEscape' - ) -} - -function tokenizeMathText(effects, ok, nok) { - var self = this; - var sizeOpen = 0; - var size; - var token; - - return start - - function start(code) { - /* istanbul ignore if - handled by mm */ - if (code !== 36) throw new Error('expected `$`') - - /* istanbul ignore if - handled by mm */ - if (!previous$1.call(self, self.previous)) { - throw new Error('expected correct previous') - } - - effects.enter('mathText'); - effects.enter('mathTextSequence'); - return openingSequence(code) - } - - function openingSequence(code) { - if (code === 36) { - effects.consume(code); - sizeOpen++; - return openingSequence - } - - effects.exit('mathTextSequence'); - return gap(code) - } - - function gap(code) { - // EOF. - if (code === null) { - return nok(code) - } - - // Closing fence? - // Could also be data. - if (code === 36) { - token = effects.enter('mathTextSequence'); - size = 0; - return closingSequence(code) - } - - // Tabs don’t work, and virtual spaces don’t make sense. - if (code === 32) { - effects.enter('space'); - effects.consume(code); - effects.exit('space'); - return gap - } - - if (code === -5 || code === -4 || code === -3) { - effects.enter('lineEnding'); - effects.consume(code); - effects.exit('lineEnding'); - return gap - } - - // Data. - effects.enter('mathTextData'); - return data(code) - } - - // In code. - function data(code) { - if ( - code === null || - code === 32 || - code === 36 || - code === -5 || - code === -4 || - code === -3 - ) { - effects.exit('mathTextData'); - return gap(code) - } - - effects.consume(code); - return data - } - - // Closing fence. - function closingSequence(code) { - // More. - if (code === 36) { - effects.consume(code); - size++; - return closingSequence - } - - // Done! - if (size === sizeOpen) { - effects.exit('mathTextSequence'); - effects.exit('mathText'); - return ok(code) - } - - // More or less accents: mark as data. - token.type = 'mathTextData'; - return data(code) - } -} - -var tokenizeMathText_1 = { - tokenize: tokenize$1, - resolve: resolve, - previous: previous_1 -}; - -var flow$3 = {36: tokenizeMathFlow}; -var text$4 = {36: tokenizeMathText_1}; - -var syntax$5 = { - flow: flow$3, - text: text$4 -}; - -var micromarkExtensionMath = syntax$5; - -var enter$3 = { - mathFlow: enterMathFlow, - mathFlowFenceMeta: enterMathFlowMeta, - mathText: enterMathText -}; -var exit$4 = { - mathFlow: exitMathFlow, - mathFlowFence: exitMathFlowFence, - mathFlowFenceMeta: exitMathFlowMeta, - mathFlowValue: exitMathData, - mathText: exitMathText, - mathTextData: exitMathData -}; - -function enterMathFlow(token) { - this.enter( - { - type: 'math', - meta: null, - value: '', - data: { - hName: 'div', - hProperties: {className: ['math', 'math-display']}, - hChildren: [{type: 'text', value: ''}] - } - }, - token - ); -} - -function enterMathFlowMeta() { - this.buffer(); -} - -function exitMathFlowMeta() { - var data = this.resume(); - this.stack[this.stack.length - 1].meta = data; -} - -function exitMathFlowFence() { - // Exit if this is the closing fence. - if (this.getData('mathFlowInside')) return - this.buffer(); - this.setData('mathFlowInside', true); -} - -function exitMathFlow(token) { - var data = this.resume().replace(/^(\r?\n|\r)|(\r?\n|\r)$/g, ''); - var node = this.exit(token); - node.value = data; - node.data.hChildren[0].value = data; - this.setData('mathFlowInside'); -} - -function enterMathText(token) { - this.enter( - { - type: 'inlineMath', - value: '', - data: { - hName: 'span', - hProperties: {className: ['math', 'math-inline']}, - hChildren: [{type: 'text', value: ''}] - } - }, - token - ); - this.buffer(); -} - -function exitMathText(token) { - var data = this.resume(); - var node = this.exit(token); - node.value = data; - node.data.hChildren[0].value = data; -} - -function exitMathData(token) { - this.config.enter.data.call(this, token); - this.config.exit.data.call(this, token); -} - -var fromMarkdown$6 = { - enter: enter$3, - exit: exit$4 -}; - -var safe_1$1 = safe$1; - -function safe$1(context, input, config) { - var value = (config.before || '') + (input || '') + (config.after || ''); - var positions = []; - var result = []; - var infos = {}; - var index = -1; - var before; - var after; - var position; - var pattern; - var expression; - var match; - var start; - var end; - - while (++index < context.unsafe.length) { - pattern = context.unsafe[index]; - - if ( - !inScope$1(context.stack, pattern.inConstruct, true) || - inScope$1(context.stack, pattern.notInConstruct) - ) { - continue - } - - expression = - pattern._compiled || (pattern._compiled = toExpression$1(pattern)); - - while ((match = expression.exec(value))) { - before = 'before' in pattern || pattern.atBreak; - after = 'after' in pattern; - position = match.index + (before ? match[1].length : 0); - - if (positions.indexOf(position) === -1) { - positions.push(position); - infos[position] = {before: before, after: after}; - } else { - if (infos[position].before && !before) { - infos[position].before = false; - } - - if (infos[position].after && !after) { - infos[position].after = false; - } - } - } - } - - positions.sort(numerical$1); - - start = config.before ? config.before.length : 0; - end = value.length - (config.after ? config.after.length : 0); - index = -1; - - while (++index < positions.length) { - position = positions[index]; - - if ( - // Character before or after matched: - position < start || - position >= end - ) { - continue - } - - // If this character is supposed to be escaped because it has a condition on - // the next character, and the next character is definitly being escaped, - // then skip this escape. - if ( - position + 1 < end && - positions[index + 1] === position + 1 && - infos[position].after && - !infos[position + 1].before && - !infos[position + 1].after - ) { - continue - } - - if (start !== position) { - result.push(value.slice(start, position)); - } - - start = position; - - if ( - /[!-/:-@[-`{-~]/.test(value.charAt(position)) && - (!config.encode || config.encode.indexOf(value.charAt(position)) === -1) - ) { - // Character escape. - result.push('\\'); - } else { - // Character reference. - result.push( - '&#x' + value.charCodeAt(position).toString(16).toUpperCase() + ';' - ); - start++; - } - } - - result.push(value.slice(start, end)); - - return result.join('') -} - -function inScope$1(stack, list, none) { - var index; - - if (!list) { - return none - } - - if (typeof list === 'string') { - list = [list]; - } - - index = -1; - - while (++index < list.length) { - if (stack.indexOf(list[index]) !== -1) { - return true - } - } - - return false -} - -function toExpression$1(pattern) { - var before = pattern.before ? '(?:' + pattern.before + ')' : ''; - var after = pattern.after ? '(?:' + pattern.after + ')' : ''; - - if (pattern.atBreak) { - before = '[\\r\\n][\\t ]*' + before; - } - - return new RegExp( - (before ? '(' + before + ')' : '') + - (/[|\\{}()[\]^$+*?.-]/.test(pattern.character) ? '\\' : '') + - pattern.character + - (after || ''), - 'g' - ) -} - -function numerical$1(a, b) { - return a - b -} - -var unsafe$3 = [ - {character: '\r', inConstruct: ['mathFlowMeta']}, - {character: '\r', inConstruct: ['mathFlowMeta']}, - {character: '$', inConstruct: ['mathFlowMeta', 'phrasing']}, - {atBreak: true, character: '$', after: '\\$'} -]; - -var handlers$2 = {math: math, inlineMath: inlineMath}; - -inlineMath.peek = inlineMathPeek; - - - - - -function math(node, _, context) { - var raw = node.value || ''; - var fence = repeatString('$', Math.max(longestStreak_1(raw, '$') + 1, 2)); - var exit = context.enter('mathFlow'); - var value = fence; - var subexit; - - if (node.meta) { - subexit = context.enter('mathFlowMeta'); - value += safe_1$1(context, node.meta, {before: '$', after: ' ', encode: ['$']}); - subexit(); - } - - value += '\n'; - - if (raw) { - value += raw + '\n'; - } - - value += fence; - exit(); - return value -} - -function inlineMath(node) { - var value = node.value || ''; - var size = 1; - var pad = ''; - var sequence; - - // If there is a single dollar sign on its own in the math, use a fence of - // two. - // If there are two in a row, use one. - while ( - new RegExp('(^|[^$])' + repeatString('\\$', size) + '([^$]|$)').test(value) - ) { - size++; - } - - // If this is not just spaces or eols (tabs don’t count), and either the first - // or last character are a space, eol, or dollar sign, then pad with spaces. - if ( - /[^ \r\n]/.test(value) && - (/[ \r\n$]/.test(value.charAt(0)) || - /[ \r\n$]/.test(value.charAt(value.length - 1))) - ) { - pad = ' '; - } - - sequence = repeatString('$', size); - return sequence + pad + value + pad + sequence -} - -function inlineMathPeek() { - return '$' -} - -var toMarkdown$7 = { - unsafe: unsafe$3, - handlers: handlers$2 -}; - -var warningIssued$1; - -var remarkMath = math$1; - -function math$1() { - var data = this.data(); - - /* istanbul ignore next - old remark. */ - if ( - !warningIssued$1 && - ((this.Parser && - this.Parser.prototype && - this.Parser.prototype.blockTokenizers) || - (this.Compiler && - this.Compiler.prototype && - this.Compiler.prototype.visitors)) - ) { - warningIssued$1 = true; - console.warn( - '[remark-math] Warning: please upgrade to remark 13 to use this plugin' - ); - } - - add('micromarkExtensions', micromarkExtensionMath); - add('fromMarkdownExtensions', fromMarkdown$6); - add('toMarkdownExtensions', toMarkdown$7); - - function add(field, value) { - /* istanbul ignore if - other extensions. */ - if (data[field]) data[field].push(value); - else data[field] = [value]; - } -} - -var unistUtilVisit = visit; - - - -var CONTINUE$1 = unistUtilVisitParents.CONTINUE; -var SKIP$1 = unistUtilVisitParents.SKIP; -var EXIT$1 = unistUtilVisitParents.EXIT; - -visit.CONTINUE = CONTINUE$1; -visit.SKIP = SKIP$1; -visit.EXIT = EXIT$1; - -function visit(tree, test, visitor, reverse) { - if (typeof test === 'function' && typeof visitor !== 'function') { - reverse = visitor; - visitor = test; - test = null; - } - - unistUtilVisitParents(tree, test, overload, reverse); - - function overload(node, parents) { - var parent = parents[parents.length - 1]; - var index = parent ? parent.children.indexOf(node) : null; - return visitor(node, index, parent) - } -} - -var katex = createCommonjsModule(function (module, exports) { -(function webpackUniversalModuleDefinition(root, factory) { - module.exports = factory(); -})((typeof self !== 'undefined' ? self : commonjsGlobal), function() { -return /******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 1); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ (function(module, exports, __webpack_require__) { - -// extracted by mini-css-extract-plugin - -/***/ }), -/* 1 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -__webpack_require__.r(__webpack_exports__); - -// EXTERNAL MODULE: ./src/katex.less -var katex = __webpack_require__(0); - -// CONCATENATED MODULE: ./src/SourceLocation.js -/** - * Lexing or parsing positional information for error reporting. - * This object is immutable. - */ -var SourceLocation = -/*#__PURE__*/ -function () { - // The + prefix indicates that these fields aren't writeable - // Lexer holding the input string. - // Start offset, zero-based inclusive. - // End offset, zero-based exclusive. - function SourceLocation(lexer, start, end) { - this.lexer = void 0; - this.start = void 0; - this.end = void 0; - this.lexer = lexer; - this.start = start; - this.end = end; - } - /** - * Merges two `SourceLocation`s from location providers, given they are - * provided in order of appearance. - * - Returns the first one's location if only the first is provided. - * - Returns a merged range of the first and the last if both are provided - * and their lexers match. - * - Otherwise, returns null. - */ - - - SourceLocation.range = function range(first, second) { - if (!second) { - return first && first.loc; - } else if (!first || !first.loc || !second.loc || first.loc.lexer !== second.loc.lexer) { - return null; - } else { - return new SourceLocation(first.loc.lexer, first.loc.start, second.loc.end); - } - }; - - return SourceLocation; -}(); - - -// CONCATENATED MODULE: ./src/Token.js - -/** - * Interface required to break circular dependency between Token, Lexer, and - * ParseError. - */ - -/** - * The resulting token returned from `lex`. - * - * It consists of the token text plus some position information. - * The position information is essentially a range in an input string, - * but instead of referencing the bare input string, we refer to the lexer. - * That way it is possible to attach extra metadata to the input string, - * like for example a file name or similar. - * - * The position information is optional, so it is OK to construct synthetic - * tokens if appropriate. Not providing available position information may - * lead to degraded error reporting, though. - */ -var Token_Token = -/*#__PURE__*/ -function () { - // don't expand the token - // used in \noexpand - function Token(text, // the text of this token - loc) { - this.text = void 0; - this.loc = void 0; - this.noexpand = void 0; - this.treatAsRelax = void 0; - this.text = text; - this.loc = loc; - } - /** - * Given a pair of tokens (this and endToken), compute a `Token` encompassing - * the whole input range enclosed by these two. - */ - - - var _proto = Token.prototype; - - _proto.range = function range(endToken, // last token of the range, inclusive - text) // the text of the newly constructed token - { - return new Token(text, SourceLocation.range(this, endToken)); - }; - - return Token; -}(); -// CONCATENATED MODULE: ./src/ParseError.js - - -/** - * This is the ParseError class, which is the main error thrown by KaTeX - * functions when something has gone wrong. This is used to distinguish internal - * errors from errors in the expression that the user provided. - * - * If possible, a caller should provide a Token or ParseNode with information - * about where in the source string the problem occurred. - */ -var ParseError = // Error position based on passed-in Token or ParseNode. -function ParseError(message, // The error message -token) // An object providing position information -{ - this.position = void 0; - var error = "KaTeX parse error: " + message; - var start; - var loc = token && token.loc; - - if (loc && loc.start <= loc.end) { - // If we have the input and a position, make the error a bit fancier - // Get the input - var input = loc.lexer.input; // Prepend some information - - start = loc.start; - var end = loc.end; - - if (start === input.length) { - error += " at end of input: "; - } else { - error += " at position " + (start + 1) + ": "; - } // Underline token in question using combining underscores - - - var underlined = input.slice(start, end).replace(/[^]/g, "$&\u0332"); // Extract some context from the input and add it to the error - - var left; - - if (start > 15) { - left = "…" + input.slice(start - 15, start); - } else { - left = input.slice(0, start); - } - - var right; - - if (end + 15 < input.length) { - right = input.slice(end, end + 15) + "…"; - } else { - right = input.slice(end); - } - - error += left + underlined + right; - } // Some hackery to make ParseError a prototype of Error - // See http://stackoverflow.com/a/8460753 - - - var self = new Error(error); - self.name = "ParseError"; // $FlowFixMe - - self.__proto__ = ParseError.prototype; // $FlowFixMe - - self.position = start; - return self; -}; // $FlowFixMe More hackery - - -ParseError.prototype.__proto__ = Error.prototype; -/* harmony default export */ var src_ParseError = (ParseError); -// CONCATENATED MODULE: ./src/utils.js -/** - * This file contains a list of utility functions which are useful in other - * files. - */ - -/** - * Return whether an element is contained in a list - */ -var contains = function contains(list, elem) { - return list.indexOf(elem) !== -1; -}; -/** - * Provide a default value if a setting is undefined - * NOTE: Couldn't use `T` as the output type due to facebook/flow#5022. - */ - - -var deflt = function deflt(setting, defaultIfUndefined) { - return setting === undefined ? defaultIfUndefined : setting; -}; // hyphenate and escape adapted from Facebook's React under Apache 2 license - - -var uppercase = /([A-Z])/g; - -var hyphenate = function hyphenate(str) { - return str.replace(uppercase, "-$1").toLowerCase(); -}; - -var ESCAPE_LOOKUP = { - "&": "&", - ">": ">", - "<": "<", - "\"": """, - "'": "'" -}; -var ESCAPE_REGEX = /[&><"']/g; -/** - * Escapes text to prevent scripting attacks. - */ - -function utils_escape(text) { - return String(text).replace(ESCAPE_REGEX, function (match) { - return ESCAPE_LOOKUP[match]; - }); -} -/** - * Sometimes we want to pull out the innermost element of a group. In most - * cases, this will just be the group itself, but when ordgroups and colors have - * a single element, we want to pull that out. - */ - - -var getBaseElem = function getBaseElem(group) { - if (group.type === "ordgroup") { - if (group.body.length === 1) { - return getBaseElem(group.body[0]); - } else { - return group; - } - } else if (group.type === "color") { - if (group.body.length === 1) { - return getBaseElem(group.body[0]); - } else { - return group; - } - } else if (group.type === "font") { - return getBaseElem(group.body); - } else { - return group; - } -}; -/** - * TeXbook algorithms often reference "character boxes", which are simply groups - * with a single character in them. To decide if something is a character box, - * we find its innermost group, and see if it is a single character. - */ - - -var utils_isCharacterBox = function isCharacterBox(group) { - var baseElem = getBaseElem(group); // These are all they types of groups which hold single characters - - return baseElem.type === "mathord" || baseElem.type === "textord" || baseElem.type === "atom"; -}; - -var assert = function assert(value) { - if (!value) { - throw new Error('Expected non-null, but got ' + String(value)); - } - - return value; -}; -/** - * Return the protocol of a URL, or "_relative" if the URL does not specify a - * protocol (and thus is relative). - */ - -var protocolFromUrl = function protocolFromUrl(url) { - var protocol = /^\s*([^\\/#]*?)(?::|�*58|�*3a)/i.exec(url); - return protocol != null ? protocol[1] : "_relative"; -}; -/* harmony default export */ var utils = ({ - contains: contains, - deflt: deflt, - escape: utils_escape, - hyphenate: hyphenate, - getBaseElem: getBaseElem, - isCharacterBox: utils_isCharacterBox, - protocolFromUrl: protocolFromUrl -}); -// CONCATENATED MODULE: ./src/Settings.js -/* eslint no-console:0 */ - -/** - * This is a module for storing settings passed into KaTeX. It correctly handles - * default settings. - */ - - - - -/** - * The main Settings object - * - * The current options stored are: - * - displayMode: Whether the expression should be typeset as inline math - * (false, the default), meaning that the math starts in - * \textstyle and is placed in an inline-block); or as display - * math (true), meaning that the math starts in \displaystyle - * and is placed in a block with vertical margin. - */ -var Settings_Settings = -/*#__PURE__*/ -function () { - function Settings(options) { - this.displayMode = void 0; - this.output = void 0; - this.leqno = void 0; - this.fleqn = void 0; - this.throwOnError = void 0; - this.errorColor = void 0; - this.macros = void 0; - this.minRuleThickness = void 0; - this.colorIsTextColor = void 0; - this.strict = void 0; - this.trust = void 0; - this.maxSize = void 0; - this.maxExpand = void 0; - this.globalGroup = void 0; - // allow null options - options = options || {}; - this.displayMode = utils.deflt(options.displayMode, false); - this.output = utils.deflt(options.output, "htmlAndMathml"); - this.leqno = utils.deflt(options.leqno, false); - this.fleqn = utils.deflt(options.fleqn, false); - this.throwOnError = utils.deflt(options.throwOnError, true); - this.errorColor = utils.deflt(options.errorColor, "#cc0000"); - this.macros = options.macros || {}; - this.minRuleThickness = Math.max(0, utils.deflt(options.minRuleThickness, 0)); - this.colorIsTextColor = utils.deflt(options.colorIsTextColor, false); - this.strict = utils.deflt(options.strict, "warn"); - this.trust = utils.deflt(options.trust, false); - this.maxSize = Math.max(0, utils.deflt(options.maxSize, Infinity)); - this.maxExpand = Math.max(0, utils.deflt(options.maxExpand, 1000)); - this.globalGroup = utils.deflt(options.globalGroup, false); - } - /** - * Report nonstrict (non-LaTeX-compatible) input. - * Can safely not be called if `this.strict` is false in JavaScript. - */ - - - var _proto = Settings.prototype; - - _proto.reportNonstrict = function reportNonstrict(errorCode, errorMsg, token) { - var strict = this.strict; - - if (typeof strict === "function") { - // Allow return value of strict function to be boolean or string - // (or null/undefined, meaning no further processing). - strict = strict(errorCode, errorMsg, token); - } - - if (!strict || strict === "ignore") { - return; - } else if (strict === true || strict === "error") { - throw new src_ParseError("LaTeX-incompatible input and strict mode is set to 'error': " + (errorMsg + " [" + errorCode + "]"), token); - } else if (strict === "warn") { - typeof console !== "undefined" && console.warn("LaTeX-incompatible input and strict mode is set to 'warn': " + (errorMsg + " [" + errorCode + "]")); - } else { - // won't happen in type-safe code - typeof console !== "undefined" && console.warn("LaTeX-incompatible input and strict mode is set to " + ("unrecognized '" + strict + "': " + errorMsg + " [" + errorCode + "]")); - } - } - /** - * Check whether to apply strict (LaTeX-adhering) behavior for unusual - * input (like `\\`). Unlike `nonstrict`, will not throw an error; - * instead, "error" translates to a return value of `true`, while "ignore" - * translates to a return value of `false`. May still print a warning: - * "warn" prints a warning and returns `false`. - * This is for the second category of `errorCode`s listed in the README. - */ - ; - - _proto.useStrictBehavior = function useStrictBehavior(errorCode, errorMsg, token) { - var strict = this.strict; - - if (typeof strict === "function") { - // Allow return value of strict function to be boolean or string - // (or null/undefined, meaning no further processing). - // But catch any exceptions thrown by function, treating them - // like "error". - try { - strict = strict(errorCode, errorMsg, token); - } catch (error) { - strict = "error"; - } - } - - if (!strict || strict === "ignore") { - return false; - } else if (strict === true || strict === "error") { - return true; - } else if (strict === "warn") { - typeof console !== "undefined" && console.warn("LaTeX-incompatible input and strict mode is set to 'warn': " + (errorMsg + " [" + errorCode + "]")); - return false; - } else { - // won't happen in type-safe code - typeof console !== "undefined" && console.warn("LaTeX-incompatible input and strict mode is set to " + ("unrecognized '" + strict + "': " + errorMsg + " [" + errorCode + "]")); - return false; - } - } - /** - * Check whether to test potentially dangerous input, and return - * `true` (trusted) or `false` (untrusted). The sole argument `context` - * should be an object with `command` field specifying the relevant LaTeX - * command (as a string starting with `\`), and any other arguments, etc. - * If `context` has a `url` field, a `protocol` field will automatically - * get added by this function (changing the specified object). - */ - ; - - _proto.isTrusted = function isTrusted(context) { - if (context.url && !context.protocol) { - context.protocol = utils.protocolFromUrl(context.url); - } - - var trust = typeof this.trust === "function" ? this.trust(context) : this.trust; - return Boolean(trust); - }; - - return Settings; -}(); - - -// CONCATENATED MODULE: ./src/Style.js -/** - * This file contains information and classes for the various kinds of styles - * used in TeX. It provides a generic `Style` class, which holds information - * about a specific style. It then provides instances of all the different kinds - * of styles possible, and provides functions to move between them and get - * information about them. - */ - -/** - * The main style class. Contains a unique id for the style, a size (which is - * the same for cramped and uncramped version of a style), and a cramped flag. - */ -var Style = -/*#__PURE__*/ -function () { - function Style(id, size, cramped) { - this.id = void 0; - this.size = void 0; - this.cramped = void 0; - this.id = id; - this.size = size; - this.cramped = cramped; - } - /** - * Get the style of a superscript given a base in the current style. - */ - - - var _proto = Style.prototype; - - _proto.sup = function sup() { - return Style_styles[_sup[this.id]]; - } - /** - * Get the style of a subscript given a base in the current style. - */ - ; - - _proto.sub = function sub() { - return Style_styles[_sub[this.id]]; - } - /** - * Get the style of a fraction numerator given the fraction in the current - * style. - */ - ; - - _proto.fracNum = function fracNum() { - return Style_styles[_fracNum[this.id]]; - } - /** - * Get the style of a fraction denominator given the fraction in the current - * style. - */ - ; - - _proto.fracDen = function fracDen() { - return Style_styles[_fracDen[this.id]]; - } - /** - * Get the cramped version of a style (in particular, cramping a cramped style - * doesn't change the style). - */ - ; - - _proto.cramp = function cramp() { - return Style_styles[_cramp[this.id]]; - } - /** - * Get a text or display version of this style. - */ - ; - - _proto.text = function text() { - return Style_styles[_text[this.id]]; - } - /** - * Return true if this style is tightly spaced (scriptstyle/scriptscriptstyle) - */ - ; - - _proto.isTight = function isTight() { - return this.size >= 2; - }; - - return Style; -}(); // Export an interface for type checking, but don't expose the implementation. -// This way, no more styles can be generated. - - -// IDs of the different styles -var D = 0; -var Dc = 1; -var T = 2; -var Tc = 3; -var S = 4; -var Sc = 5; -var SS = 6; -var SSc = 7; // Instances of the different styles - -var Style_styles = [new Style(D, 0, false), new Style(Dc, 0, true), new Style(T, 1, false), new Style(Tc, 1, true), new Style(S, 2, false), new Style(Sc, 2, true), new Style(SS, 3, false), new Style(SSc, 3, true)]; // Lookup tables for switching from one style to another - -var _sup = [S, Sc, S, Sc, SS, SSc, SS, SSc]; -var _sub = [Sc, Sc, Sc, Sc, SSc, SSc, SSc, SSc]; -var _fracNum = [T, Tc, S, Sc, SS, SSc, SS, SSc]; -var _fracDen = [Tc, Tc, Sc, Sc, SSc, SSc, SSc, SSc]; -var _cramp = [Dc, Dc, Tc, Tc, Sc, Sc, SSc, SSc]; -var _text = [D, Dc, T, Tc, T, Tc, T, Tc]; // We only export some of the styles. - -/* harmony default export */ var src_Style = ({ - DISPLAY: Style_styles[D], - TEXT: Style_styles[T], - SCRIPT: Style_styles[S], - SCRIPTSCRIPT: Style_styles[SS] -}); -// CONCATENATED MODULE: ./src/unicodeScripts.js -/* - * This file defines the Unicode scripts and script families that we - * support. To add new scripts or families, just add a new entry to the - * scriptData array below. Adding scripts to the scriptData array allows - * characters from that script to appear in \text{} environments. - */ - -/** - * Each script or script family has a name and an array of blocks. - * Each block is an array of two numbers which specify the start and - * end points (inclusive) of a block of Unicode codepoints. - */ - -/** - * Unicode block data for the families of scripts we support in \text{}. - * Scripts only need to appear here if they do not have font metrics. - */ -var scriptData = [{ - // Latin characters beyond the Latin-1 characters we have metrics for. - // Needed for Czech, Hungarian and Turkish text, for example. - name: 'latin', - blocks: [[0x0100, 0x024f], // Latin Extended-A and Latin Extended-B - [0x0300, 0x036f]] -}, { - // The Cyrillic script used by Russian and related languages. - // A Cyrillic subset used to be supported as explicitly defined - // symbols in symbols.js - name: 'cyrillic', - blocks: [[0x0400, 0x04ff]] -}, { - // The Brahmic scripts of South and Southeast Asia - // Devanagari (0900–097F) - // Bengali (0980–09FF) - // Gurmukhi (0A00–0A7F) - // Gujarati (0A80–0AFF) - // Oriya (0B00–0B7F) - // Tamil (0B80–0BFF) - // Telugu (0C00–0C7F) - // Kannada (0C80–0CFF) - // Malayalam (0D00–0D7F) - // Sinhala (0D80–0DFF) - // Thai (0E00–0E7F) - // Lao (0E80–0EFF) - // Tibetan (0F00–0FFF) - // Myanmar (1000–109F) - name: 'brahmic', - blocks: [[0x0900, 0x109F]] -}, { - name: 'georgian', - blocks: [[0x10A0, 0x10ff]] -}, { - // Chinese and Japanese. - // The "k" in cjk is for Korean, but we've separated Korean out - name: "cjk", - blocks: [[0x3000, 0x30FF], // CJK symbols and punctuation, Hiragana, Katakana - [0x4E00, 0x9FAF], // CJK ideograms - [0xFF00, 0xFF60]] -}, { - // Korean - name: 'hangul', - blocks: [[0xAC00, 0xD7AF]] -}]; -/** - * Given a codepoint, return the name of the script or script family - * it is from, or null if it is not part of a known block - */ - -function scriptFromCodepoint(codepoint) { - for (var i = 0; i < scriptData.length; i++) { - var script = scriptData[i]; - - for (var _i = 0; _i < script.blocks.length; _i++) { - var block = script.blocks[_i]; - - if (codepoint >= block[0] && codepoint <= block[1]) { - return script.name; - } - } - } - - return null; -} -/** - * A flattened version of all the supported blocks in a single array. - * This is an optimization to make supportedCodepoint() fast. - */ - -var allBlocks = []; -scriptData.forEach(function (s) { - return s.blocks.forEach(function (b) { - return allBlocks.push.apply(allBlocks, b); - }); -}); -/** - * Given a codepoint, return true if it falls within one of the - * scripts or script families defined above and false otherwise. - * - * Micro benchmarks shows that this is faster than - * /[\u3000-\u30FF\u4E00-\u9FAF\uFF00-\uFF60\uAC00-\uD7AF\u0900-\u109F]/.test() - * in Firefox, Chrome and Node. - */ - -function supportedCodepoint(codepoint) { - for (var i = 0; i < allBlocks.length; i += 2) { - if (codepoint >= allBlocks[i] && codepoint <= allBlocks[i + 1]) { - return true; - } - } - - return false; -} -// CONCATENATED MODULE: ./src/svgGeometry.js -/** - * This file provides support to domTree.js and delimiter.js. - * It's a storehouse of path geometry for SVG images. - */ -// In all paths below, the viewBox-to-em scale is 1000:1. -var hLinePad = 80; // padding above a sqrt viniculum. Prevents image cropping. -// The viniculum of a \sqrt can be made thicker by a KaTeX rendering option. -// Think of variable extraViniculum as two detours in the SVG path. -// The detour begins at the lower left of the area labeled extraViniculum below. -// The detour proceeds one extraViniculum distance up and slightly to the right, -// displacing the radiused corner between surd and viniculum. The radius is -// traversed as usual, then the detour resumes. It goes right, to the end of -// the very long viniculumn, then down one extraViniculum distance, -// after which it resumes regular path geometry for the radical. - -/* viniculum - / - /▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒←extraViniculum - / █████████████████████←0.04em (40 unit) std viniculum thickness - / / - / / - / /\ - / / surd -*/ - -var sqrtMain = function sqrtMain(extraViniculum, hLinePad) { - // sqrtMain path geometry is from glyph U221A in the font KaTeX Main - return "M95," + (622 + extraViniculum + hLinePad) + "\nc-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14\nc0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54\nc44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10\ns173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429\nc69,-144,104.5,-217.7,106.5,-221\nl" + extraViniculum / 2.075 + " -" + extraViniculum + "\nc5.3,-9.3,12,-14,20,-14\nH400000v" + (40 + extraViniculum) + "H845.2724\ns-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7\nc-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z\nM" + (834 + extraViniculum) + " " + hLinePad + "h400000v" + (40 + extraViniculum) + "h-400000z"; -}; - -var sqrtSize1 = function sqrtSize1(extraViniculum, hLinePad) { - // size1 is from glyph U221A in the font KaTeX_Size1-Regular - return "M263," + (601 + extraViniculum + hLinePad) + "c0.7,0,18,39.7,52,119\nc34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120\nc340,-704.7,510.7,-1060.3,512,-1067\nl" + extraViniculum / 2.084 + " -" + extraViniculum + "\nc4.7,-7.3,11,-11,19,-11\nH40000v" + (40 + extraViniculum) + "H1012.3\ns-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232\nc-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1\ns-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26\nc-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z\nM" + (1001 + extraViniculum) + " " + hLinePad + "h400000v" + (40 + extraViniculum) + "h-400000z"; -}; - -var sqrtSize2 = function sqrtSize2(extraViniculum, hLinePad) { - // size2 is from glyph U221A in the font KaTeX_Size2-Regular - return "M983 " + (10 + extraViniculum + hLinePad) + "\nl" + extraViniculum / 3.13 + " -" + extraViniculum + "\nc4,-6.7,10,-10,18,-10 H400000v" + (40 + extraViniculum) + "\nH1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7\ns-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744\nc-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30\nc26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722\nc56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5\nc53.7,-170.3,84.5,-266.8,92.5,-289.5z\nM" + (1001 + extraViniculum) + " " + hLinePad + "h400000v" + (40 + extraViniculum) + "h-400000z"; -}; - -var sqrtSize3 = function sqrtSize3(extraViniculum, hLinePad) { - // size3 is from glyph U221A in the font KaTeX_Size3-Regular - return "M424," + (2398 + extraViniculum + hLinePad) + "\nc-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514\nc0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20\ns-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121\ns209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081\nl" + extraViniculum / 4.223 + " -" + extraViniculum + "c4,-6.7,10,-10,18,-10 H400000\nv" + (40 + extraViniculum) + "H1014.6\ns-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185\nc-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2z M" + (1001 + extraViniculum) + " " + hLinePad + "\nh400000v" + (40 + extraViniculum) + "h-400000z"; -}; - -var sqrtSize4 = function sqrtSize4(extraViniculum, hLinePad) { - // size4 is from glyph U221A in the font KaTeX_Size4-Regular - return "M473," + (2713 + extraViniculum + hLinePad) + "\nc339.3,-1799.3,509.3,-2700,510,-2702 l" + extraViniculum / 5.298 + " -" + extraViniculum + "\nc3.3,-7.3,9.3,-11,18,-11 H400000v" + (40 + extraViniculum) + "H1017.7\ns-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200\nc0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26\ns76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104,\n606zM" + (1001 + extraViniculum) + " " + hLinePad + "h400000v" + (40 + extraViniculum) + "H1017.7z"; -}; - -var sqrtTall = function sqrtTall(extraViniculum, hLinePad, viewBoxHeight) { - // sqrtTall is from glyph U23B7 in the font KaTeX_Size4-Regular - // One path edge has a variable length. It runs vertically from the viniculumn - // to a point near (14 units) the bottom of the surd. The viniculum - // is normally 40 units thick. So the length of the line in question is: - var vertSegment = viewBoxHeight - 54 - hLinePad - extraViniculum; - return "M702 " + (extraViniculum + hLinePad) + "H400000" + (40 + extraViniculum) + "\nH742v" + vertSegment + "l-4 4-4 4c-.667.7 -2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1\nh-12l-28-84c-16.667-52-96.667 -294.333-240-727l-212 -643 -85 170\nc-4-3.333-8.333-7.667-13 -13l-13-13l77-155 77-156c66 199.333 139 419.667\n219 661 l218 661zM702 " + hLinePad + "H400000v" + (40 + extraViniculum) + "H742z"; -}; - -var sqrtPath = function sqrtPath(size, extraViniculum, viewBoxHeight) { - extraViniculum = 1000 * extraViniculum; // Convert from document ems to viewBox. - - var path = ""; - - switch (size) { - case "sqrtMain": - path = sqrtMain(extraViniculum, hLinePad); - break; - - case "sqrtSize1": - path = sqrtSize1(extraViniculum, hLinePad); - break; - - case "sqrtSize2": - path = sqrtSize2(extraViniculum, hLinePad); - break; - - case "sqrtSize3": - path = sqrtSize3(extraViniculum, hLinePad); - break; - - case "sqrtSize4": - path = sqrtSize4(extraViniculum, hLinePad); - break; - - case "sqrtTall": - path = sqrtTall(extraViniculum, hLinePad, viewBoxHeight); - } - - return path; -}; -var svgGeometry_path = { - // Two paths that cover gaps in built-up parentheses. - leftParenInner: "M291 0 H417 V300 H291 z", - rightParenInner: "M457 0 H583 V300 H457 z", - // The doubleleftarrow geometry is from glyph U+21D0 in the font KaTeX Main - doubleleftarrow: "M262 157\nl10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3\n 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28\n 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5\nc2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5\n 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87\n-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7\n-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z\nm8 0v40h399730v-40zm0 194v40h399730v-40z", - // doublerightarrow is from glyph U+21D2 in font KaTeX Main - doublerightarrow: "M399738 392l\n-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5\n 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88\n-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68\n-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18\n-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782\nc-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3\n-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z", - // leftarrow is from glyph U+2190 in font KaTeX Main - leftarrow: "M400000 241H110l3-3c68.7-52.7 113.7-120\n 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8\n-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247\nc-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208\n 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3\n 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202\n l-3-3h399890zM100 241v40h399900v-40z", - // overbrace is from glyphs U+23A9/23A8/23A7 in font KaTeX_Size4-Regular - leftbrace: "M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117\n-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7\n 5-6 9-10 13-.7 1-7.3 1-20 1H6z", - leftbraceunder: "M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13\n 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688\n 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7\n-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z", - // overgroup is from the MnSymbol package (public domain) - leftgroup: "M400000 80\nH435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0\n 435 0h399565z", - leftgroupunder: "M400000 262\nH435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219\n 435 219h399565z", - // Harpoons are from glyph U+21BD in font KaTeX Main - leftharpoon: "M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3\n-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5\n-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7\n-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z", - leftharpoonplus: "M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5\n 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3\n-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7\n-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z\nm0 0v40h400000v-40z", - leftharpoondown: "M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333\n 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5\n 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667\n-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z", - leftharpoondownplus: "M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12\n 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7\n-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0\nv40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z", - // hook is from glyph U+21A9 in font KaTeX Main - lefthook: "M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5\n-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3\n-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21\n 71.5 23h399859zM103 281v-40h399897v40z", - leftlinesegment: "M40 281 V428 H0 V94 H40 V241 H400000 v40z\nM40 281 V428 H0 V94 H40 V241 H400000 v40z", - leftmapsto: "M40 281 V448H0V74H40V241H400000v40z\nM40 281 V448H0V74H40V241H400000v40z", - // tofrom is from glyph U+21C4 in font KaTeX AMS Regular - leftToFrom: "M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23\n-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8\nc28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3\n 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z", - longequal: "M0 50 h400000 v40H0z m0 194h40000v40H0z\nM0 50 h400000 v40H0z m0 194h40000v40H0z", - midbrace: "M200428 334\nc-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14\n-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7\n 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11\n 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z", - midbraceunder: "M199572 214\nc100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14\n 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3\n 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0\n-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z", - oiintSize1: "M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6\n-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z\nm368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8\n60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z", - oiintSize2: "M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8\n-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z\nm502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2\nc0 110 84 276 504 276s502.4-166 502.4-276z", - oiiintSize1: "M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6\n-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z\nm525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0\n85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z", - oiiintSize2: "M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8\n-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z\nm770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1\nc0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z", - rightarrow: "M0 241v40h399891c-47.3 35.3-84 78-110 128\n-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20\n 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7\n 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85\n-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n 151.7 139 205zm0 0v40h399900v-40z", - rightbrace: "M400000 542l\n-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5\ns-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1\nc124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z", - rightbraceunder: "M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3\n 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237\n-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z", - rightgroup: "M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0\n 3-1 3-3v-38c-76-158-257-219-435-219H0z", - rightgroupunder: "M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18\n 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z", - rightharpoon: "M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3\n-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2\n-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58\n 69.2 92 94.5zm0 0v40h399900v-40z", - rightharpoonplus: "M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11\n-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7\n 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z\nm0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z", - rightharpoondown: "M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8\n 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5\n-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95\n-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z", - rightharpoondownplus: "M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8\n 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3\n 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3\n-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z\nm0-194v40h400000v-40zm0 0v40h400000v-40z", - righthook: "M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3\n 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0\n-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21\n 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z", - rightlinesegment: "M399960 241 V94 h40 V428 h-40 V281 H0 v-40z\nM399960 241 V94 h40 V428 h-40 V281 H0 v-40z", - rightToFrom: "M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23\n 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32\n-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142\n-167z M100 147v40h399900v-40zM0 341v40h399900v-40z", - // twoheadleftarrow is from glyph U+219E in font KaTeX AMS Regular - twoheadleftarrow: "M0 167c68 40\n 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69\n-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3\n-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19\n-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101\n 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z", - twoheadrightarrow: "M400000 167\nc-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3\n 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42\n 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333\n-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70\n 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z", - // tilde1 is a modified version of a glyph from the MnSymbol package - tilde1: "M200 55.538c-77 0-168 73.953-177 73.953-3 0-7\n-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0\n 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0\n 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128\n-68.267.847-113-73.952-191-73.952z", - // ditto tilde2, tilde3, & tilde4 - tilde2: "M344 55.266c-142 0-300.638 81.316-311.5 86.418\n-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9\n 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114\nc1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751\n 181.476 676 181.476c-149 0-189-126.21-332-126.21z", - tilde3: "M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457\n-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0\n 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697\n 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696\n -338 0-409-156.573-744-156.573z", - tilde4: "M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345\n-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409\n 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9\n 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409\n -175.236-744-175.236z", - // vec is from glyph U+20D7 in font KaTeX Main - vec: "M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z", - // widehat1 is a modified version of a glyph from the MnSymbol package - widehat1: "M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22\nc-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z", - // ditto widehat2, widehat3, & widehat4 - widehat2: "M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z", - widehat3: "M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z", - widehat4: "M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z", - // widecheck paths are all inverted versions of widehat - widecheck1: "M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1,\n-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z", - widecheck2: "M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z", - widecheck3: "M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z", - widecheck4: "M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z", - // The next ten paths support reaction arrows from the mhchem package. - // Arrows for \ce{<-->} are offset from xAxis by 0.22ex, per mhchem in LaTeX - // baraboveleftarrow is mostly from from glyph U+2190 in font KaTeX Main - baraboveleftarrow: "M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202\nc4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5\nc-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130\ns-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47\n121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6\ns2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11\nc0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z\nM100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z", - // rightarrowabovebar is mostly from glyph U+2192, KaTeX Main - rightarrowabovebar: "M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32\n-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0\n13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39\n-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5\n-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z", - // The short left harpoon has 0.5em (i.e. 500 units) kern on the left end. - // Ref from mhchem.sty: \rlap{\raisebox{-.22ex}{$\kern0.5em - baraboveshortleftharpoon: "M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17\nc2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21\nc-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40\nc-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z\nM0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z", - rightharpoonaboveshortbar: "M0,241 l0,40c399126,0,399993,0,399993,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z", - shortbaraboveleftharpoon: "M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9,\n1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7,\n-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z\nM93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z", - shortrightharpoonabovebar: "M53,241l0,40c398570,0,399437,0,399437,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z" -}; -// CONCATENATED MODULE: ./src/tree.js - - -/** - * This node represents a document fragment, which contains elements, but when - * placed into the DOM doesn't have any representation itself. It only contains - * children and doesn't have any DOM node properties. - */ -var tree_DocumentFragment = -/*#__PURE__*/ -function () { - // HtmlDomNode - // Never used; needed for satisfying interface. - function DocumentFragment(children) { - this.children = void 0; - this.classes = void 0; - this.height = void 0; - this.depth = void 0; - this.maxFontSize = void 0; - this.style = void 0; - this.children = children; - this.classes = []; - this.height = 0; - this.depth = 0; - this.maxFontSize = 0; - this.style = {}; - } - - var _proto = DocumentFragment.prototype; - - _proto.hasClass = function hasClass(className) { - return utils.contains(this.classes, className); - } - /** Convert the fragment into a node. */ - ; - - _proto.toNode = function toNode() { - var frag = document.createDocumentFragment(); - - for (var i = 0; i < this.children.length; i++) { - frag.appendChild(this.children[i].toNode()); - } - - return frag; - } - /** Convert the fragment into HTML markup. */ - ; - - _proto.toMarkup = function toMarkup() { - var markup = ""; // Simply concatenate the markup for the children together. - - for (var i = 0; i < this.children.length; i++) { - markup += this.children[i].toMarkup(); - } - - return markup; - } - /** - * Converts the math node into a string, similar to innerText. Applies to - * MathDomNode's only. - */ - ; - - _proto.toText = function toText() { - // To avoid this, we would subclass documentFragment separately for - // MathML, but polyfills for subclassing is expensive per PR 1469. - // $FlowFixMe: Only works for ChildType = MathDomNode. - var toText = function toText(child) { - return child.toText(); - }; - - return this.children.map(toText).join(""); - }; - - return DocumentFragment; -}(); -// CONCATENATED MODULE: ./src/domTree.js -/** - * These objects store the data about the DOM nodes we create, as well as some - * extra data. They can then be transformed into real DOM nodes with the - * `toNode` function or HTML markup using `toMarkup`. They are useful for both - * storing extra properties on the nodes, as well as providing a way to easily - * work with the DOM. - * - * Similar functions for working with MathML nodes exist in mathMLTree.js. - * - * TODO: refactor `span` and `anchor` into common superclass when - * target environments support class inheritance - */ - - - - - -/** - * Create an HTML className based on a list of classes. In addition to joining - * with spaces, we also remove empty classes. - */ -var createClass = function createClass(classes) { - return classes.filter(function (cls) { - return cls; - }).join(" "); -}; - -var initNode = function initNode(classes, options, style) { - this.classes = classes || []; - this.attributes = {}; - this.height = 0; - this.depth = 0; - this.maxFontSize = 0; - this.style = style || {}; - - if (options) { - if (options.style.isTight()) { - this.classes.push("mtight"); - } - - var color = options.getColor(); - - if (color) { - this.style.color = color; - } - } -}; -/** - * Convert into an HTML node - */ - - -var _toNode = function toNode(tagName) { - var node = document.createElement(tagName); // Apply the class - - node.className = createClass(this.classes); // Apply inline styles - - for (var style in this.style) { - if (this.style.hasOwnProperty(style)) { - // $FlowFixMe Flow doesn't seem to understand span.style's type. - node.style[style] = this.style[style]; - } - } // Apply attributes - - - for (var attr in this.attributes) { - if (this.attributes.hasOwnProperty(attr)) { - node.setAttribute(attr, this.attributes[attr]); - } - } // Append the children, also as HTML nodes - - - for (var i = 0; i < this.children.length; i++) { - node.appendChild(this.children[i].toNode()); - } - - return node; -}; -/** - * Convert into an HTML markup string - */ - - -var _toMarkup = function toMarkup(tagName) { - var markup = "<" + tagName; // Add the class - - if (this.classes.length) { - markup += " class=\"" + utils.escape(createClass(this.classes)) + "\""; - } - - var styles = ""; // Add the styles, after hyphenation - - for (var style in this.style) { - if (this.style.hasOwnProperty(style)) { - styles += utils.hyphenate(style) + ":" + this.style[style] + ";"; - } - } - - if (styles) { - markup += " style=\"" + utils.escape(styles) + "\""; - } // Add the attributes - - - for (var attr in this.attributes) { - if (this.attributes.hasOwnProperty(attr)) { - markup += " " + attr + "=\"" + utils.escape(this.attributes[attr]) + "\""; - } - } - - markup += ">"; // Add the markup of the children, also as markup - - for (var i = 0; i < this.children.length; i++) { - markup += this.children[i].toMarkup(); - } - - markup += ""; - return markup; -}; // Making the type below exact with all optional fields doesn't work due to -// - https://github.com/facebook/flow/issues/4582 -// - https://github.com/facebook/flow/issues/5688 -// However, since *all* fields are optional, $Shape<> works as suggested in 5688 -// above. -// This type does not include all CSS properties. Additional properties should -// be added as needed. - - -/** - * This node represents a span node, with a className, a list of children, and - * an inline style. It also contains information about its height, depth, and - * maxFontSize. - * - * Represents two types with different uses: SvgSpan to wrap an SVG and DomSpan - * otherwise. This typesafety is important when HTML builders access a span's - * children. - */ -var domTree_Span = -/*#__PURE__*/ -function () { - function Span(classes, children, options, style) { - this.children = void 0; - this.attributes = void 0; - this.classes = void 0; - this.height = void 0; - this.depth = void 0; - this.width = void 0; - this.maxFontSize = void 0; - this.style = void 0; - initNode.call(this, classes, options, style); - this.children = children || []; - } - /** - * Sets an arbitrary attribute on the span. Warning: use this wisely. Not - * all browsers support attributes the same, and having too many custom - * attributes is probably bad. - */ - - - var _proto = Span.prototype; - - _proto.setAttribute = function setAttribute(attribute, value) { - this.attributes[attribute] = value; - }; - - _proto.hasClass = function hasClass(className) { - return utils.contains(this.classes, className); - }; - - _proto.toNode = function toNode() { - return _toNode.call(this, "span"); - }; - - _proto.toMarkup = function toMarkup() { - return _toMarkup.call(this, "span"); - }; - - return Span; -}(); -/** - * This node represents an anchor () element with a hyperlink. See `span` - * for further details. - */ - -var domTree_Anchor = -/*#__PURE__*/ -function () { - function Anchor(href, classes, children, options) { - this.children = void 0; - this.attributes = void 0; - this.classes = void 0; - this.height = void 0; - this.depth = void 0; - this.maxFontSize = void 0; - this.style = void 0; - initNode.call(this, classes, options); - this.children = children || []; - this.setAttribute('href', href); - } - - var _proto2 = Anchor.prototype; - - _proto2.setAttribute = function setAttribute(attribute, value) { - this.attributes[attribute] = value; - }; - - _proto2.hasClass = function hasClass(className) { - return utils.contains(this.classes, className); - }; - - _proto2.toNode = function toNode() { - return _toNode.call(this, "a"); - }; - - _proto2.toMarkup = function toMarkup() { - return _toMarkup.call(this, "a"); - }; - - return Anchor; -}(); -/** - * This node represents an image embed () element. - */ - -var domTree_Img = -/*#__PURE__*/ -function () { - function Img(src, alt, style) { - this.src = void 0; - this.alt = void 0; - this.classes = void 0; - this.height = void 0; - this.depth = void 0; - this.maxFontSize = void 0; - this.style = void 0; - this.alt = alt; - this.src = src; - this.classes = ["mord"]; - this.style = style; - } - - var _proto3 = Img.prototype; - - _proto3.hasClass = function hasClass(className) { - return utils.contains(this.classes, className); - }; - - _proto3.toNode = function toNode() { - var node = document.createElement("img"); - node.src = this.src; - node.alt = this.alt; - node.className = "mord"; // Apply inline styles - - for (var style in this.style) { - if (this.style.hasOwnProperty(style)) { - // $FlowFixMe - node.style[style] = this.style[style]; - } - } - - return node; - }; - - _proto3.toMarkup = function toMarkup() { - var markup = "" + this.alt + " 0) { - span = document.createElement("span"); - span.style.marginRight = this.italic + "em"; - } - - if (this.classes.length > 0) { - span = span || document.createElement("span"); - span.className = createClass(this.classes); - } - - for (var style in this.style) { - if (this.style.hasOwnProperty(style)) { - span = span || document.createElement("span"); // $FlowFixMe Flow doesn't seem to understand span.style's type. - - span.style[style] = this.style[style]; - } - } - - if (span) { - span.appendChild(node); - return span; - } else { - return node; - } - } - /** - * Creates markup for a symbol node. - */ - ; - - _proto4.toMarkup = function toMarkup() { - // TODO(alpert): More duplication than I'd like from - // span.prototype.toMarkup and symbolNode.prototype.toNode... - var needsSpan = false; - var markup = " 0) { - styles += "margin-right:" + this.italic + "em;"; - } - - for (var style in this.style) { - if (this.style.hasOwnProperty(style)) { - styles += utils.hyphenate(style) + ":" + this.style[style] + ";"; - } - } - - if (styles) { - needsSpan = true; - markup += " style=\"" + utils.escape(styles) + "\""; - } - - var escaped = utils.escape(this.text); - - if (needsSpan) { - markup += ">"; - markup += escaped; - markup += ""; - return markup; - } else { - return escaped; - } - }; - - return SymbolNode; -}(); -/** - * SVG nodes are used to render stretchy wide elements. - */ - -var SvgNode = -/*#__PURE__*/ -function () { - function SvgNode(children, attributes) { - this.children = void 0; - this.attributes = void 0; - this.children = children || []; - this.attributes = attributes || {}; - } - - var _proto5 = SvgNode.prototype; - - _proto5.toNode = function toNode() { - var svgNS = "http://www.w3.org/2000/svg"; - var node = document.createElementNS(svgNS, "svg"); // Apply attributes - - for (var attr in this.attributes) { - if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) { - node.setAttribute(attr, this.attributes[attr]); - } - } - - for (var i = 0; i < this.children.length; i++) { - node.appendChild(this.children[i].toNode()); - } - - return node; - }; - - _proto5.toMarkup = function toMarkup() { - var markup = ""; - } else { - return ""; - } - }; - - return PathNode; -}(); -var LineNode = -/*#__PURE__*/ -function () { - function LineNode(attributes) { - this.attributes = void 0; - this.attributes = attributes || {}; - } - - var _proto7 = LineNode.prototype; - - _proto7.toNode = function toNode() { - var svgNS = "http://www.w3.org/2000/svg"; - var node = document.createElementNS(svgNS, "line"); // Apply attributes - - for (var attr in this.attributes) { - if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) { - node.setAttribute(attr, this.attributes[attr]); - } - } - - return node; - }; - - _proto7.toMarkup = function toMarkup() { - var markup = " but got " + String(group) + "."); - } -} -// CONCATENATED MODULE: ./submodules/katex-fonts/fontMetricsData.js -// This file is GENERATED by buildMetrics.sh. DO NOT MODIFY. -/* harmony default export */ var fontMetricsData = ({ - "AMS-Regular": { - "32": [0, 0, 0, 0, 0.25], - "65": [0, 0.68889, 0, 0, 0.72222], - "66": [0, 0.68889, 0, 0, 0.66667], - "67": [0, 0.68889, 0, 0, 0.72222], - "68": [0, 0.68889, 0, 0, 0.72222], - "69": [0, 0.68889, 0, 0, 0.66667], - "70": [0, 0.68889, 0, 0, 0.61111], - "71": [0, 0.68889, 0, 0, 0.77778], - "72": [0, 0.68889, 0, 0, 0.77778], - "73": [0, 0.68889, 0, 0, 0.38889], - "74": [0.16667, 0.68889, 0, 0, 0.5], - "75": [0, 0.68889, 0, 0, 0.77778], - "76": [0, 0.68889, 0, 0, 0.66667], - "77": [0, 0.68889, 0, 0, 0.94445], - "78": [0, 0.68889, 0, 0, 0.72222], - "79": [0.16667, 0.68889, 0, 0, 0.77778], - "80": [0, 0.68889, 0, 0, 0.61111], - "81": [0.16667, 0.68889, 0, 0, 0.77778], - "82": [0, 0.68889, 0, 0, 0.72222], - "83": [0, 0.68889, 0, 0, 0.55556], - "84": [0, 0.68889, 0, 0, 0.66667], - "85": [0, 0.68889, 0, 0, 0.72222], - "86": [0, 0.68889, 0, 0, 0.72222], - "87": [0, 0.68889, 0, 0, 1.0], - "88": [0, 0.68889, 0, 0, 0.72222], - "89": [0, 0.68889, 0, 0, 0.72222], - "90": [0, 0.68889, 0, 0, 0.66667], - "107": [0, 0.68889, 0, 0, 0.55556], - "160": [0, 0, 0, 0, 0.25], - "165": [0, 0.675, 0.025, 0, 0.75], - "174": [0.15559, 0.69224, 0, 0, 0.94666], - "240": [0, 0.68889, 0, 0, 0.55556], - "295": [0, 0.68889, 0, 0, 0.54028], - "710": [0, 0.825, 0, 0, 2.33334], - "732": [0, 0.9, 0, 0, 2.33334], - "770": [0, 0.825, 0, 0, 2.33334], - "771": [0, 0.9, 0, 0, 2.33334], - "989": [0.08167, 0.58167, 0, 0, 0.77778], - "1008": [0, 0.43056, 0.04028, 0, 0.66667], - "8245": [0, 0.54986, 0, 0, 0.275], - "8463": [0, 0.68889, 0, 0, 0.54028], - "8487": [0, 0.68889, 0, 0, 0.72222], - "8498": [0, 0.68889, 0, 0, 0.55556], - "8502": [0, 0.68889, 0, 0, 0.66667], - "8503": [0, 0.68889, 0, 0, 0.44445], - "8504": [0, 0.68889, 0, 0, 0.66667], - "8513": [0, 0.68889, 0, 0, 0.63889], - "8592": [-0.03598, 0.46402, 0, 0, 0.5], - "8594": [-0.03598, 0.46402, 0, 0, 0.5], - "8602": [-0.13313, 0.36687, 0, 0, 1.0], - "8603": [-0.13313, 0.36687, 0, 0, 1.0], - "8606": [0.01354, 0.52239, 0, 0, 1.0], - "8608": [0.01354, 0.52239, 0, 0, 1.0], - "8610": [0.01354, 0.52239, 0, 0, 1.11111], - "8611": [0.01354, 0.52239, 0, 0, 1.11111], - "8619": [0, 0.54986, 0, 0, 1.0], - "8620": [0, 0.54986, 0, 0, 1.0], - "8621": [-0.13313, 0.37788, 0, 0, 1.38889], - "8622": [-0.13313, 0.36687, 0, 0, 1.0], - "8624": [0, 0.69224, 0, 0, 0.5], - "8625": [0, 0.69224, 0, 0, 0.5], - "8630": [0, 0.43056, 0, 0, 1.0], - "8631": [0, 0.43056, 0, 0, 1.0], - "8634": [0.08198, 0.58198, 0, 0, 0.77778], - "8635": [0.08198, 0.58198, 0, 0, 0.77778], - "8638": [0.19444, 0.69224, 0, 0, 0.41667], - "8639": [0.19444, 0.69224, 0, 0, 0.41667], - "8642": [0.19444, 0.69224, 0, 0, 0.41667], - "8643": [0.19444, 0.69224, 0, 0, 0.41667], - "8644": [0.1808, 0.675, 0, 0, 1.0], - "8646": [0.1808, 0.675, 0, 0, 1.0], - "8647": [0.1808, 0.675, 0, 0, 1.0], - "8648": [0.19444, 0.69224, 0, 0, 0.83334], - "8649": [0.1808, 0.675, 0, 0, 1.0], - "8650": [0.19444, 0.69224, 0, 0, 0.83334], - "8651": [0.01354, 0.52239, 0, 0, 1.0], - "8652": [0.01354, 0.52239, 0, 0, 1.0], - "8653": [-0.13313, 0.36687, 0, 0, 1.0], - "8654": [-0.13313, 0.36687, 0, 0, 1.0], - "8655": [-0.13313, 0.36687, 0, 0, 1.0], - "8666": [0.13667, 0.63667, 0, 0, 1.0], - "8667": [0.13667, 0.63667, 0, 0, 1.0], - "8669": [-0.13313, 0.37788, 0, 0, 1.0], - "8672": [-0.064, 0.437, 0, 0, 1.334], - "8674": [-0.064, 0.437, 0, 0, 1.334], - "8705": [0, 0.825, 0, 0, 0.5], - "8708": [0, 0.68889, 0, 0, 0.55556], - "8709": [0.08167, 0.58167, 0, 0, 0.77778], - "8717": [0, 0.43056, 0, 0, 0.42917], - "8722": [-0.03598, 0.46402, 0, 0, 0.5], - "8724": [0.08198, 0.69224, 0, 0, 0.77778], - "8726": [0.08167, 0.58167, 0, 0, 0.77778], - "8733": [0, 0.69224, 0, 0, 0.77778], - "8736": [0, 0.69224, 0, 0, 0.72222], - "8737": [0, 0.69224, 0, 0, 0.72222], - "8738": [0.03517, 0.52239, 0, 0, 0.72222], - "8739": [0.08167, 0.58167, 0, 0, 0.22222], - "8740": [0.25142, 0.74111, 0, 0, 0.27778], - "8741": [0.08167, 0.58167, 0, 0, 0.38889], - "8742": [0.25142, 0.74111, 0, 0, 0.5], - "8756": [0, 0.69224, 0, 0, 0.66667], - "8757": [0, 0.69224, 0, 0, 0.66667], - "8764": [-0.13313, 0.36687, 0, 0, 0.77778], - "8765": [-0.13313, 0.37788, 0, 0, 0.77778], - "8769": [-0.13313, 0.36687, 0, 0, 0.77778], - "8770": [-0.03625, 0.46375, 0, 0, 0.77778], - "8774": [0.30274, 0.79383, 0, 0, 0.77778], - "8776": [-0.01688, 0.48312, 0, 0, 0.77778], - "8778": [0.08167, 0.58167, 0, 0, 0.77778], - "8782": [0.06062, 0.54986, 0, 0, 0.77778], - "8783": [0.06062, 0.54986, 0, 0, 0.77778], - "8785": [0.08198, 0.58198, 0, 0, 0.77778], - "8786": [0.08198, 0.58198, 0, 0, 0.77778], - "8787": [0.08198, 0.58198, 0, 0, 0.77778], - "8790": [0, 0.69224, 0, 0, 0.77778], - "8791": [0.22958, 0.72958, 0, 0, 0.77778], - "8796": [0.08198, 0.91667, 0, 0, 0.77778], - "8806": [0.25583, 0.75583, 0, 0, 0.77778], - "8807": [0.25583, 0.75583, 0, 0, 0.77778], - "8808": [0.25142, 0.75726, 0, 0, 0.77778], - "8809": [0.25142, 0.75726, 0, 0, 0.77778], - "8812": [0.25583, 0.75583, 0, 0, 0.5], - "8814": [0.20576, 0.70576, 0, 0, 0.77778], - "8815": [0.20576, 0.70576, 0, 0, 0.77778], - "8816": [0.30274, 0.79383, 0, 0, 0.77778], - "8817": [0.30274, 0.79383, 0, 0, 0.77778], - "8818": [0.22958, 0.72958, 0, 0, 0.77778], - "8819": [0.22958, 0.72958, 0, 0, 0.77778], - "8822": [0.1808, 0.675, 0, 0, 0.77778], - "8823": [0.1808, 0.675, 0, 0, 0.77778], - "8828": [0.13667, 0.63667, 0, 0, 0.77778], - "8829": [0.13667, 0.63667, 0, 0, 0.77778], - "8830": [0.22958, 0.72958, 0, 0, 0.77778], - "8831": [0.22958, 0.72958, 0, 0, 0.77778], - "8832": [0.20576, 0.70576, 0, 0, 0.77778], - "8833": [0.20576, 0.70576, 0, 0, 0.77778], - "8840": [0.30274, 0.79383, 0, 0, 0.77778], - "8841": [0.30274, 0.79383, 0, 0, 0.77778], - "8842": [0.13597, 0.63597, 0, 0, 0.77778], - "8843": [0.13597, 0.63597, 0, 0, 0.77778], - "8847": [0.03517, 0.54986, 0, 0, 0.77778], - "8848": [0.03517, 0.54986, 0, 0, 0.77778], - "8858": [0.08198, 0.58198, 0, 0, 0.77778], - "8859": [0.08198, 0.58198, 0, 0, 0.77778], - "8861": [0.08198, 0.58198, 0, 0, 0.77778], - "8862": [0, 0.675, 0, 0, 0.77778], - "8863": [0, 0.675, 0, 0, 0.77778], - "8864": [0, 0.675, 0, 0, 0.77778], - "8865": [0, 0.675, 0, 0, 0.77778], - "8872": [0, 0.69224, 0, 0, 0.61111], - "8873": [0, 0.69224, 0, 0, 0.72222], - "8874": [0, 0.69224, 0, 0, 0.88889], - "8876": [0, 0.68889, 0, 0, 0.61111], - "8877": [0, 0.68889, 0, 0, 0.61111], - "8878": [0, 0.68889, 0, 0, 0.72222], - "8879": [0, 0.68889, 0, 0, 0.72222], - "8882": [0.03517, 0.54986, 0, 0, 0.77778], - "8883": [0.03517, 0.54986, 0, 0, 0.77778], - "8884": [0.13667, 0.63667, 0, 0, 0.77778], - "8885": [0.13667, 0.63667, 0, 0, 0.77778], - "8888": [0, 0.54986, 0, 0, 1.11111], - "8890": [0.19444, 0.43056, 0, 0, 0.55556], - "8891": [0.19444, 0.69224, 0, 0, 0.61111], - "8892": [0.19444, 0.69224, 0, 0, 0.61111], - "8901": [0, 0.54986, 0, 0, 0.27778], - "8903": [0.08167, 0.58167, 0, 0, 0.77778], - "8905": [0.08167, 0.58167, 0, 0, 0.77778], - "8906": [0.08167, 0.58167, 0, 0, 0.77778], - "8907": [0, 0.69224, 0, 0, 0.77778], - "8908": [0, 0.69224, 0, 0, 0.77778], - "8909": [-0.03598, 0.46402, 0, 0, 0.77778], - "8910": [0, 0.54986, 0, 0, 0.76042], - "8911": [0, 0.54986, 0, 0, 0.76042], - "8912": [0.03517, 0.54986, 0, 0, 0.77778], - "8913": [0.03517, 0.54986, 0, 0, 0.77778], - "8914": [0, 0.54986, 0, 0, 0.66667], - "8915": [0, 0.54986, 0, 0, 0.66667], - "8916": [0, 0.69224, 0, 0, 0.66667], - "8918": [0.0391, 0.5391, 0, 0, 0.77778], - "8919": [0.0391, 0.5391, 0, 0, 0.77778], - "8920": [0.03517, 0.54986, 0, 0, 1.33334], - "8921": [0.03517, 0.54986, 0, 0, 1.33334], - "8922": [0.38569, 0.88569, 0, 0, 0.77778], - "8923": [0.38569, 0.88569, 0, 0, 0.77778], - "8926": [0.13667, 0.63667, 0, 0, 0.77778], - "8927": [0.13667, 0.63667, 0, 0, 0.77778], - "8928": [0.30274, 0.79383, 0, 0, 0.77778], - "8929": [0.30274, 0.79383, 0, 0, 0.77778], - "8934": [0.23222, 0.74111, 0, 0, 0.77778], - "8935": [0.23222, 0.74111, 0, 0, 0.77778], - "8936": [0.23222, 0.74111, 0, 0, 0.77778], - "8937": [0.23222, 0.74111, 0, 0, 0.77778], - "8938": [0.20576, 0.70576, 0, 0, 0.77778], - "8939": [0.20576, 0.70576, 0, 0, 0.77778], - "8940": [0.30274, 0.79383, 0, 0, 0.77778], - "8941": [0.30274, 0.79383, 0, 0, 0.77778], - "8994": [0.19444, 0.69224, 0, 0, 0.77778], - "8995": [0.19444, 0.69224, 0, 0, 0.77778], - "9416": [0.15559, 0.69224, 0, 0, 0.90222], - "9484": [0, 0.69224, 0, 0, 0.5], - "9488": [0, 0.69224, 0, 0, 0.5], - "9492": [0, 0.37788, 0, 0, 0.5], - "9496": [0, 0.37788, 0, 0, 0.5], - "9585": [0.19444, 0.68889, 0, 0, 0.88889], - "9586": [0.19444, 0.74111, 0, 0, 0.88889], - "9632": [0, 0.675, 0, 0, 0.77778], - "9633": [0, 0.675, 0, 0, 0.77778], - "9650": [0, 0.54986, 0, 0, 0.72222], - "9651": [0, 0.54986, 0, 0, 0.72222], - "9654": [0.03517, 0.54986, 0, 0, 0.77778], - "9660": [0, 0.54986, 0, 0, 0.72222], - "9661": [0, 0.54986, 0, 0, 0.72222], - "9664": [0.03517, 0.54986, 0, 0, 0.77778], - "9674": [0.11111, 0.69224, 0, 0, 0.66667], - "9733": [0.19444, 0.69224, 0, 0, 0.94445], - "10003": [0, 0.69224, 0, 0, 0.83334], - "10016": [0, 0.69224, 0, 0, 0.83334], - "10731": [0.11111, 0.69224, 0, 0, 0.66667], - "10846": [0.19444, 0.75583, 0, 0, 0.61111], - "10877": [0.13667, 0.63667, 0, 0, 0.77778], - "10878": [0.13667, 0.63667, 0, 0, 0.77778], - "10885": [0.25583, 0.75583, 0, 0, 0.77778], - "10886": [0.25583, 0.75583, 0, 0, 0.77778], - "10887": [0.13597, 0.63597, 0, 0, 0.77778], - "10888": [0.13597, 0.63597, 0, 0, 0.77778], - "10889": [0.26167, 0.75726, 0, 0, 0.77778], - "10890": [0.26167, 0.75726, 0, 0, 0.77778], - "10891": [0.48256, 0.98256, 0, 0, 0.77778], - "10892": [0.48256, 0.98256, 0, 0, 0.77778], - "10901": [0.13667, 0.63667, 0, 0, 0.77778], - "10902": [0.13667, 0.63667, 0, 0, 0.77778], - "10933": [0.25142, 0.75726, 0, 0, 0.77778], - "10934": [0.25142, 0.75726, 0, 0, 0.77778], - "10935": [0.26167, 0.75726, 0, 0, 0.77778], - "10936": [0.26167, 0.75726, 0, 0, 0.77778], - "10937": [0.26167, 0.75726, 0, 0, 0.77778], - "10938": [0.26167, 0.75726, 0, 0, 0.77778], - "10949": [0.25583, 0.75583, 0, 0, 0.77778], - "10950": [0.25583, 0.75583, 0, 0, 0.77778], - "10955": [0.28481, 0.79383, 0, 0, 0.77778], - "10956": [0.28481, 0.79383, 0, 0, 0.77778], - "57350": [0.08167, 0.58167, 0, 0, 0.22222], - "57351": [0.08167, 0.58167, 0, 0, 0.38889], - "57352": [0.08167, 0.58167, 0, 0, 0.77778], - "57353": [0, 0.43056, 0.04028, 0, 0.66667], - "57356": [0.25142, 0.75726, 0, 0, 0.77778], - "57357": [0.25142, 0.75726, 0, 0, 0.77778], - "57358": [0.41951, 0.91951, 0, 0, 0.77778], - "57359": [0.30274, 0.79383, 0, 0, 0.77778], - "57360": [0.30274, 0.79383, 0, 0, 0.77778], - "57361": [0.41951, 0.91951, 0, 0, 0.77778], - "57366": [0.25142, 0.75726, 0, 0, 0.77778], - "57367": [0.25142, 0.75726, 0, 0, 0.77778], - "57368": [0.25142, 0.75726, 0, 0, 0.77778], - "57369": [0.25142, 0.75726, 0, 0, 0.77778], - "57370": [0.13597, 0.63597, 0, 0, 0.77778], - "57371": [0.13597, 0.63597, 0, 0, 0.77778] - }, - "Caligraphic-Regular": { - "32": [0, 0, 0, 0, 0.25], - "65": [0, 0.68333, 0, 0.19445, 0.79847], - "66": [0, 0.68333, 0.03041, 0.13889, 0.65681], - "67": [0, 0.68333, 0.05834, 0.13889, 0.52653], - "68": [0, 0.68333, 0.02778, 0.08334, 0.77139], - "69": [0, 0.68333, 0.08944, 0.11111, 0.52778], - "70": [0, 0.68333, 0.09931, 0.11111, 0.71875], - "71": [0.09722, 0.68333, 0.0593, 0.11111, 0.59487], - "72": [0, 0.68333, 0.00965, 0.11111, 0.84452], - "73": [0, 0.68333, 0.07382, 0, 0.54452], - "74": [0.09722, 0.68333, 0.18472, 0.16667, 0.67778], - "75": [0, 0.68333, 0.01445, 0.05556, 0.76195], - "76": [0, 0.68333, 0, 0.13889, 0.68972], - "77": [0, 0.68333, 0, 0.13889, 1.2009], - "78": [0, 0.68333, 0.14736, 0.08334, 0.82049], - "79": [0, 0.68333, 0.02778, 0.11111, 0.79611], - "80": [0, 0.68333, 0.08222, 0.08334, 0.69556], - "81": [0.09722, 0.68333, 0, 0.11111, 0.81667], - "82": [0, 0.68333, 0, 0.08334, 0.8475], - "83": [0, 0.68333, 0.075, 0.13889, 0.60556], - "84": [0, 0.68333, 0.25417, 0, 0.54464], - "85": [0, 0.68333, 0.09931, 0.08334, 0.62583], - "86": [0, 0.68333, 0.08222, 0, 0.61278], - "87": [0, 0.68333, 0.08222, 0.08334, 0.98778], - "88": [0, 0.68333, 0.14643, 0.13889, 0.7133], - "89": [0.09722, 0.68333, 0.08222, 0.08334, 0.66834], - "90": [0, 0.68333, 0.07944, 0.13889, 0.72473], - "160": [0, 0, 0, 0, 0.25] - }, - "Fraktur-Regular": { - "32": [0, 0, 0, 0, 0.25], - "33": [0, 0.69141, 0, 0, 0.29574], - "34": [0, 0.69141, 0, 0, 0.21471], - "38": [0, 0.69141, 0, 0, 0.73786], - "39": [0, 0.69141, 0, 0, 0.21201], - "40": [0.24982, 0.74947, 0, 0, 0.38865], - "41": [0.24982, 0.74947, 0, 0, 0.38865], - "42": [0, 0.62119, 0, 0, 0.27764], - "43": [0.08319, 0.58283, 0, 0, 0.75623], - "44": [0, 0.10803, 0, 0, 0.27764], - "45": [0.08319, 0.58283, 0, 0, 0.75623], - "46": [0, 0.10803, 0, 0, 0.27764], - "47": [0.24982, 0.74947, 0, 0, 0.50181], - "48": [0, 0.47534, 0, 0, 0.50181], - "49": [0, 0.47534, 0, 0, 0.50181], - "50": [0, 0.47534, 0, 0, 0.50181], - "51": [0.18906, 0.47534, 0, 0, 0.50181], - "52": [0.18906, 0.47534, 0, 0, 0.50181], - "53": [0.18906, 0.47534, 0, 0, 0.50181], - "54": [0, 0.69141, 0, 0, 0.50181], - "55": [0.18906, 0.47534, 0, 0, 0.50181], - "56": [0, 0.69141, 0, 0, 0.50181], - "57": [0.18906, 0.47534, 0, 0, 0.50181], - "58": [0, 0.47534, 0, 0, 0.21606], - "59": [0.12604, 0.47534, 0, 0, 0.21606], - "61": [-0.13099, 0.36866, 0, 0, 0.75623], - "63": [0, 0.69141, 0, 0, 0.36245], - "65": [0, 0.69141, 0, 0, 0.7176], - "66": [0, 0.69141, 0, 0, 0.88397], - "67": [0, 0.69141, 0, 0, 0.61254], - "68": [0, 0.69141, 0, 0, 0.83158], - "69": [0, 0.69141, 0, 0, 0.66278], - "70": [0.12604, 0.69141, 0, 0, 0.61119], - "71": [0, 0.69141, 0, 0, 0.78539], - "72": [0.06302, 0.69141, 0, 0, 0.7203], - "73": [0, 0.69141, 0, 0, 0.55448], - "74": [0.12604, 0.69141, 0, 0, 0.55231], - "75": [0, 0.69141, 0, 0, 0.66845], - "76": [0, 0.69141, 0, 0, 0.66602], - "77": [0, 0.69141, 0, 0, 1.04953], - "78": [0, 0.69141, 0, 0, 0.83212], - "79": [0, 0.69141, 0, 0, 0.82699], - "80": [0.18906, 0.69141, 0, 0, 0.82753], - "81": [0.03781, 0.69141, 0, 0, 0.82699], - "82": [0, 0.69141, 0, 0, 0.82807], - "83": [0, 0.69141, 0, 0, 0.82861], - "84": [0, 0.69141, 0, 0, 0.66899], - "85": [0, 0.69141, 0, 0, 0.64576], - "86": [0, 0.69141, 0, 0, 0.83131], - "87": [0, 0.69141, 0, 0, 1.04602], - "88": [0, 0.69141, 0, 0, 0.71922], - "89": [0.18906, 0.69141, 0, 0, 0.83293], - "90": [0.12604, 0.69141, 0, 0, 0.60201], - "91": [0.24982, 0.74947, 0, 0, 0.27764], - "93": [0.24982, 0.74947, 0, 0, 0.27764], - "94": [0, 0.69141, 0, 0, 0.49965], - "97": [0, 0.47534, 0, 0, 0.50046], - "98": [0, 0.69141, 0, 0, 0.51315], - "99": [0, 0.47534, 0, 0, 0.38946], - "100": [0, 0.62119, 0, 0, 0.49857], - "101": [0, 0.47534, 0, 0, 0.40053], - "102": [0.18906, 0.69141, 0, 0, 0.32626], - "103": [0.18906, 0.47534, 0, 0, 0.5037], - "104": [0.18906, 0.69141, 0, 0, 0.52126], - "105": [0, 0.69141, 0, 0, 0.27899], - "106": [0, 0.69141, 0, 0, 0.28088], - "107": [0, 0.69141, 0, 0, 0.38946], - "108": [0, 0.69141, 0, 0, 0.27953], - "109": [0, 0.47534, 0, 0, 0.76676], - "110": [0, 0.47534, 0, 0, 0.52666], - "111": [0, 0.47534, 0, 0, 0.48885], - "112": [0.18906, 0.52396, 0, 0, 0.50046], - "113": [0.18906, 0.47534, 0, 0, 0.48912], - "114": [0, 0.47534, 0, 0, 0.38919], - "115": [0, 0.47534, 0, 0, 0.44266], - "116": [0, 0.62119, 0, 0, 0.33301], - "117": [0, 0.47534, 0, 0, 0.5172], - "118": [0, 0.52396, 0, 0, 0.5118], - "119": [0, 0.52396, 0, 0, 0.77351], - "120": [0.18906, 0.47534, 0, 0, 0.38865], - "121": [0.18906, 0.47534, 0, 0, 0.49884], - "122": [0.18906, 0.47534, 0, 0, 0.39054], - "160": [0, 0, 0, 0, 0.25], - "8216": [0, 0.69141, 0, 0, 0.21471], - "8217": [0, 0.69141, 0, 0, 0.21471], - "58112": [0, 0.62119, 0, 0, 0.49749], - "58113": [0, 0.62119, 0, 0, 0.4983], - "58114": [0.18906, 0.69141, 0, 0, 0.33328], - "58115": [0.18906, 0.69141, 0, 0, 0.32923], - "58116": [0.18906, 0.47534, 0, 0, 0.50343], - "58117": [0, 0.69141, 0, 0, 0.33301], - "58118": [0, 0.62119, 0, 0, 0.33409], - "58119": [0, 0.47534, 0, 0, 0.50073] - }, - "Main-Bold": { - "32": [0, 0, 0, 0, 0.25], - "33": [0, 0.69444, 0, 0, 0.35], - "34": [0, 0.69444, 0, 0, 0.60278], - "35": [0.19444, 0.69444, 0, 0, 0.95833], - "36": [0.05556, 0.75, 0, 0, 0.575], - "37": [0.05556, 0.75, 0, 0, 0.95833], - "38": [0, 0.69444, 0, 0, 0.89444], - "39": [0, 0.69444, 0, 0, 0.31944], - "40": [0.25, 0.75, 0, 0, 0.44722], - "41": [0.25, 0.75, 0, 0, 0.44722], - "42": [0, 0.75, 0, 0, 0.575], - "43": [0.13333, 0.63333, 0, 0, 0.89444], - "44": [0.19444, 0.15556, 0, 0, 0.31944], - "45": [0, 0.44444, 0, 0, 0.38333], - "46": [0, 0.15556, 0, 0, 0.31944], - "47": [0.25, 0.75, 0, 0, 0.575], - "48": [0, 0.64444, 0, 0, 0.575], - "49": [0, 0.64444, 0, 0, 0.575], - "50": [0, 0.64444, 0, 0, 0.575], - "51": [0, 0.64444, 0, 0, 0.575], - "52": [0, 0.64444, 0, 0, 0.575], - "53": [0, 0.64444, 0, 0, 0.575], - "54": [0, 0.64444, 0, 0, 0.575], - "55": [0, 0.64444, 0, 0, 0.575], - "56": [0, 0.64444, 0, 0, 0.575], - "57": [0, 0.64444, 0, 0, 0.575], - "58": [0, 0.44444, 0, 0, 0.31944], - "59": [0.19444, 0.44444, 0, 0, 0.31944], - "60": [0.08556, 0.58556, 0, 0, 0.89444], - "61": [-0.10889, 0.39111, 0, 0, 0.89444], - "62": [0.08556, 0.58556, 0, 0, 0.89444], - "63": [0, 0.69444, 0, 0, 0.54305], - "64": [0, 0.69444, 0, 0, 0.89444], - "65": [0, 0.68611, 0, 0, 0.86944], - "66": [0, 0.68611, 0, 0, 0.81805], - "67": [0, 0.68611, 0, 0, 0.83055], - "68": [0, 0.68611, 0, 0, 0.88194], - "69": [0, 0.68611, 0, 0, 0.75555], - "70": [0, 0.68611, 0, 0, 0.72361], - "71": [0, 0.68611, 0, 0, 0.90416], - "72": [0, 0.68611, 0, 0, 0.9], - "73": [0, 0.68611, 0, 0, 0.43611], - "74": [0, 0.68611, 0, 0, 0.59444], - "75": [0, 0.68611, 0, 0, 0.90138], - "76": [0, 0.68611, 0, 0, 0.69166], - "77": [0, 0.68611, 0, 0, 1.09166], - "78": [0, 0.68611, 0, 0, 0.9], - "79": [0, 0.68611, 0, 0, 0.86388], - "80": [0, 0.68611, 0, 0, 0.78611], - "81": [0.19444, 0.68611, 0, 0, 0.86388], - "82": [0, 0.68611, 0, 0, 0.8625], - "83": [0, 0.68611, 0, 0, 0.63889], - "84": [0, 0.68611, 0, 0, 0.8], - "85": [0, 0.68611, 0, 0, 0.88472], - "86": [0, 0.68611, 0.01597, 0, 0.86944], - "87": [0, 0.68611, 0.01597, 0, 1.18888], - "88": [0, 0.68611, 0, 0, 0.86944], - "89": [0, 0.68611, 0.02875, 0, 0.86944], - "90": [0, 0.68611, 0, 0, 0.70277], - "91": [0.25, 0.75, 0, 0, 0.31944], - "92": [0.25, 0.75, 0, 0, 0.575], - "93": [0.25, 0.75, 0, 0, 0.31944], - "94": [0, 0.69444, 0, 0, 0.575], - "95": [0.31, 0.13444, 0.03194, 0, 0.575], - "97": [0, 0.44444, 0, 0, 0.55902], - "98": [0, 0.69444, 0, 0, 0.63889], - "99": [0, 0.44444, 0, 0, 0.51111], - "100": [0, 0.69444, 0, 0, 0.63889], - "101": [0, 0.44444, 0, 0, 0.52708], - "102": [0, 0.69444, 0.10903, 0, 0.35139], - "103": [0.19444, 0.44444, 0.01597, 0, 0.575], - "104": [0, 0.69444, 0, 0, 0.63889], - "105": [0, 0.69444, 0, 0, 0.31944], - "106": [0.19444, 0.69444, 0, 0, 0.35139], - "107": [0, 0.69444, 0, 0, 0.60694], - "108": [0, 0.69444, 0, 0, 0.31944], - "109": [0, 0.44444, 0, 0, 0.95833], - "110": [0, 0.44444, 0, 0, 0.63889], - "111": [0, 0.44444, 0, 0, 0.575], - "112": [0.19444, 0.44444, 0, 0, 0.63889], - "113": [0.19444, 0.44444, 0, 0, 0.60694], - "114": [0, 0.44444, 0, 0, 0.47361], - "115": [0, 0.44444, 0, 0, 0.45361], - "116": [0, 0.63492, 0, 0, 0.44722], - "117": [0, 0.44444, 0, 0, 0.63889], - "118": [0, 0.44444, 0.01597, 0, 0.60694], - "119": [0, 0.44444, 0.01597, 0, 0.83055], - "120": [0, 0.44444, 0, 0, 0.60694], - "121": [0.19444, 0.44444, 0.01597, 0, 0.60694], - "122": [0, 0.44444, 0, 0, 0.51111], - "123": [0.25, 0.75, 0, 0, 0.575], - "124": [0.25, 0.75, 0, 0, 0.31944], - "125": [0.25, 0.75, 0, 0, 0.575], - "126": [0.35, 0.34444, 0, 0, 0.575], - "160": [0, 0, 0, 0, 0.25], - "163": [0, 0.69444, 0, 0, 0.86853], - "168": [0, 0.69444, 0, 0, 0.575], - "172": [0, 0.44444, 0, 0, 0.76666], - "176": [0, 0.69444, 0, 0, 0.86944], - "177": [0.13333, 0.63333, 0, 0, 0.89444], - "184": [0.17014, 0, 0, 0, 0.51111], - "198": [0, 0.68611, 0, 0, 1.04166], - "215": [0.13333, 0.63333, 0, 0, 0.89444], - "216": [0.04861, 0.73472, 0, 0, 0.89444], - "223": [0, 0.69444, 0, 0, 0.59722], - "230": [0, 0.44444, 0, 0, 0.83055], - "247": [0.13333, 0.63333, 0, 0, 0.89444], - "248": [0.09722, 0.54167, 0, 0, 0.575], - "305": [0, 0.44444, 0, 0, 0.31944], - "338": [0, 0.68611, 0, 0, 1.16944], - "339": [0, 0.44444, 0, 0, 0.89444], - "567": [0.19444, 0.44444, 0, 0, 0.35139], - "710": [0, 0.69444, 0, 0, 0.575], - "711": [0, 0.63194, 0, 0, 0.575], - "713": [0, 0.59611, 0, 0, 0.575], - "714": [0, 0.69444, 0, 0, 0.575], - "715": [0, 0.69444, 0, 0, 0.575], - "728": [0, 0.69444, 0, 0, 0.575], - "729": [0, 0.69444, 0, 0, 0.31944], - "730": [0, 0.69444, 0, 0, 0.86944], - "732": [0, 0.69444, 0, 0, 0.575], - "733": [0, 0.69444, 0, 0, 0.575], - "915": [0, 0.68611, 0, 0, 0.69166], - "916": [0, 0.68611, 0, 0, 0.95833], - "920": [0, 0.68611, 0, 0, 0.89444], - "923": [0, 0.68611, 0, 0, 0.80555], - "926": [0, 0.68611, 0, 0, 0.76666], - "928": [0, 0.68611, 0, 0, 0.9], - "931": [0, 0.68611, 0, 0, 0.83055], - "933": [0, 0.68611, 0, 0, 0.89444], - "934": [0, 0.68611, 0, 0, 0.83055], - "936": [0, 0.68611, 0, 0, 0.89444], - "937": [0, 0.68611, 0, 0, 0.83055], - "8211": [0, 0.44444, 0.03194, 0, 0.575], - "8212": [0, 0.44444, 0.03194, 0, 1.14999], - "8216": [0, 0.69444, 0, 0, 0.31944], - "8217": [0, 0.69444, 0, 0, 0.31944], - "8220": [0, 0.69444, 0, 0, 0.60278], - "8221": [0, 0.69444, 0, 0, 0.60278], - "8224": [0.19444, 0.69444, 0, 0, 0.51111], - "8225": [0.19444, 0.69444, 0, 0, 0.51111], - "8242": [0, 0.55556, 0, 0, 0.34444], - "8407": [0, 0.72444, 0.15486, 0, 0.575], - "8463": [0, 0.69444, 0, 0, 0.66759], - "8465": [0, 0.69444, 0, 0, 0.83055], - "8467": [0, 0.69444, 0, 0, 0.47361], - "8472": [0.19444, 0.44444, 0, 0, 0.74027], - "8476": [0, 0.69444, 0, 0, 0.83055], - "8501": [0, 0.69444, 0, 0, 0.70277], - "8592": [-0.10889, 0.39111, 0, 0, 1.14999], - "8593": [0.19444, 0.69444, 0, 0, 0.575], - "8594": [-0.10889, 0.39111, 0, 0, 1.14999], - "8595": [0.19444, 0.69444, 0, 0, 0.575], - "8596": [-0.10889, 0.39111, 0, 0, 1.14999], - "8597": [0.25, 0.75, 0, 0, 0.575], - "8598": [0.19444, 0.69444, 0, 0, 1.14999], - "8599": [0.19444, 0.69444, 0, 0, 1.14999], - "8600": [0.19444, 0.69444, 0, 0, 1.14999], - "8601": [0.19444, 0.69444, 0, 0, 1.14999], - "8636": [-0.10889, 0.39111, 0, 0, 1.14999], - "8637": [-0.10889, 0.39111, 0, 0, 1.14999], - "8640": [-0.10889, 0.39111, 0, 0, 1.14999], - "8641": [-0.10889, 0.39111, 0, 0, 1.14999], - "8656": [-0.10889, 0.39111, 0, 0, 1.14999], - "8657": [0.19444, 0.69444, 0, 0, 0.70277], - "8658": [-0.10889, 0.39111, 0, 0, 1.14999], - "8659": [0.19444, 0.69444, 0, 0, 0.70277], - "8660": [-0.10889, 0.39111, 0, 0, 1.14999], - "8661": [0.25, 0.75, 0, 0, 0.70277], - "8704": [0, 0.69444, 0, 0, 0.63889], - "8706": [0, 0.69444, 0.06389, 0, 0.62847], - "8707": [0, 0.69444, 0, 0, 0.63889], - "8709": [0.05556, 0.75, 0, 0, 0.575], - "8711": [0, 0.68611, 0, 0, 0.95833], - "8712": [0.08556, 0.58556, 0, 0, 0.76666], - "8715": [0.08556, 0.58556, 0, 0, 0.76666], - "8722": [0.13333, 0.63333, 0, 0, 0.89444], - "8723": [0.13333, 0.63333, 0, 0, 0.89444], - "8725": [0.25, 0.75, 0, 0, 0.575], - "8726": [0.25, 0.75, 0, 0, 0.575], - "8727": [-0.02778, 0.47222, 0, 0, 0.575], - "8728": [-0.02639, 0.47361, 0, 0, 0.575], - "8729": [-0.02639, 0.47361, 0, 0, 0.575], - "8730": [0.18, 0.82, 0, 0, 0.95833], - "8733": [0, 0.44444, 0, 0, 0.89444], - "8734": [0, 0.44444, 0, 0, 1.14999], - "8736": [0, 0.69224, 0, 0, 0.72222], - "8739": [0.25, 0.75, 0, 0, 0.31944], - "8741": [0.25, 0.75, 0, 0, 0.575], - "8743": [0, 0.55556, 0, 0, 0.76666], - "8744": [0, 0.55556, 0, 0, 0.76666], - "8745": [0, 0.55556, 0, 0, 0.76666], - "8746": [0, 0.55556, 0, 0, 0.76666], - "8747": [0.19444, 0.69444, 0.12778, 0, 0.56875], - "8764": [-0.10889, 0.39111, 0, 0, 0.89444], - "8768": [0.19444, 0.69444, 0, 0, 0.31944], - "8771": [0.00222, 0.50222, 0, 0, 0.89444], - "8776": [0.02444, 0.52444, 0, 0, 0.89444], - "8781": [0.00222, 0.50222, 0, 0, 0.89444], - "8801": [0.00222, 0.50222, 0, 0, 0.89444], - "8804": [0.19667, 0.69667, 0, 0, 0.89444], - "8805": [0.19667, 0.69667, 0, 0, 0.89444], - "8810": [0.08556, 0.58556, 0, 0, 1.14999], - "8811": [0.08556, 0.58556, 0, 0, 1.14999], - "8826": [0.08556, 0.58556, 0, 0, 0.89444], - "8827": [0.08556, 0.58556, 0, 0, 0.89444], - "8834": [0.08556, 0.58556, 0, 0, 0.89444], - "8835": [0.08556, 0.58556, 0, 0, 0.89444], - "8838": [0.19667, 0.69667, 0, 0, 0.89444], - "8839": [0.19667, 0.69667, 0, 0, 0.89444], - "8846": [0, 0.55556, 0, 0, 0.76666], - "8849": [0.19667, 0.69667, 0, 0, 0.89444], - "8850": [0.19667, 0.69667, 0, 0, 0.89444], - "8851": [0, 0.55556, 0, 0, 0.76666], - "8852": [0, 0.55556, 0, 0, 0.76666], - "8853": [0.13333, 0.63333, 0, 0, 0.89444], - "8854": [0.13333, 0.63333, 0, 0, 0.89444], - "8855": [0.13333, 0.63333, 0, 0, 0.89444], - "8856": [0.13333, 0.63333, 0, 0, 0.89444], - "8857": [0.13333, 0.63333, 0, 0, 0.89444], - "8866": [0, 0.69444, 0, 0, 0.70277], - "8867": [0, 0.69444, 0, 0, 0.70277], - "8868": [0, 0.69444, 0, 0, 0.89444], - "8869": [0, 0.69444, 0, 0, 0.89444], - "8900": [-0.02639, 0.47361, 0, 0, 0.575], - "8901": [-0.02639, 0.47361, 0, 0, 0.31944], - "8902": [-0.02778, 0.47222, 0, 0, 0.575], - "8968": [0.25, 0.75, 0, 0, 0.51111], - "8969": [0.25, 0.75, 0, 0, 0.51111], - "8970": [0.25, 0.75, 0, 0, 0.51111], - "8971": [0.25, 0.75, 0, 0, 0.51111], - "8994": [-0.13889, 0.36111, 0, 0, 1.14999], - "8995": [-0.13889, 0.36111, 0, 0, 1.14999], - "9651": [0.19444, 0.69444, 0, 0, 1.02222], - "9657": [-0.02778, 0.47222, 0, 0, 0.575], - "9661": [0.19444, 0.69444, 0, 0, 1.02222], - "9667": [-0.02778, 0.47222, 0, 0, 0.575], - "9711": [0.19444, 0.69444, 0, 0, 1.14999], - "9824": [0.12963, 0.69444, 0, 0, 0.89444], - "9825": [0.12963, 0.69444, 0, 0, 0.89444], - "9826": [0.12963, 0.69444, 0, 0, 0.89444], - "9827": [0.12963, 0.69444, 0, 0, 0.89444], - "9837": [0, 0.75, 0, 0, 0.44722], - "9838": [0.19444, 0.69444, 0, 0, 0.44722], - "9839": [0.19444, 0.69444, 0, 0, 0.44722], - "10216": [0.25, 0.75, 0, 0, 0.44722], - "10217": [0.25, 0.75, 0, 0, 0.44722], - "10815": [0, 0.68611, 0, 0, 0.9], - "10927": [0.19667, 0.69667, 0, 0, 0.89444], - "10928": [0.19667, 0.69667, 0, 0, 0.89444], - "57376": [0.19444, 0.69444, 0, 0, 0] - }, - "Main-BoldItalic": { - "32": [0, 0, 0, 0, 0.25], - "33": [0, 0.69444, 0.11417, 0, 0.38611], - "34": [0, 0.69444, 0.07939, 0, 0.62055], - "35": [0.19444, 0.69444, 0.06833, 0, 0.94444], - "37": [0.05556, 0.75, 0.12861, 0, 0.94444], - "38": [0, 0.69444, 0.08528, 0, 0.88555], - "39": [0, 0.69444, 0.12945, 0, 0.35555], - "40": [0.25, 0.75, 0.15806, 0, 0.47333], - "41": [0.25, 0.75, 0.03306, 0, 0.47333], - "42": [0, 0.75, 0.14333, 0, 0.59111], - "43": [0.10333, 0.60333, 0.03306, 0, 0.88555], - "44": [0.19444, 0.14722, 0, 0, 0.35555], - "45": [0, 0.44444, 0.02611, 0, 0.41444], - "46": [0, 0.14722, 0, 0, 0.35555], - "47": [0.25, 0.75, 0.15806, 0, 0.59111], - "48": [0, 0.64444, 0.13167, 0, 0.59111], - "49": [0, 0.64444, 0.13167, 0, 0.59111], - "50": [0, 0.64444, 0.13167, 0, 0.59111], - "51": [0, 0.64444, 0.13167, 0, 0.59111], - "52": [0.19444, 0.64444, 0.13167, 0, 0.59111], - "53": [0, 0.64444, 0.13167, 0, 0.59111], - "54": [0, 0.64444, 0.13167, 0, 0.59111], - "55": [0.19444, 0.64444, 0.13167, 0, 0.59111], - "56": [0, 0.64444, 0.13167, 0, 0.59111], - "57": [0, 0.64444, 0.13167, 0, 0.59111], - "58": [0, 0.44444, 0.06695, 0, 0.35555], - "59": [0.19444, 0.44444, 0.06695, 0, 0.35555], - "61": [-0.10889, 0.39111, 0.06833, 0, 0.88555], - "63": [0, 0.69444, 0.11472, 0, 0.59111], - "64": [0, 0.69444, 0.09208, 0, 0.88555], - "65": [0, 0.68611, 0, 0, 0.86555], - "66": [0, 0.68611, 0.0992, 0, 0.81666], - "67": [0, 0.68611, 0.14208, 0, 0.82666], - "68": [0, 0.68611, 0.09062, 0, 0.87555], - "69": [0, 0.68611, 0.11431, 0, 0.75666], - "70": [0, 0.68611, 0.12903, 0, 0.72722], - "71": [0, 0.68611, 0.07347, 0, 0.89527], - "72": [0, 0.68611, 0.17208, 0, 0.8961], - "73": [0, 0.68611, 0.15681, 0, 0.47166], - "74": [0, 0.68611, 0.145, 0, 0.61055], - "75": [0, 0.68611, 0.14208, 0, 0.89499], - "76": [0, 0.68611, 0, 0, 0.69777], - "77": [0, 0.68611, 0.17208, 0, 1.07277], - "78": [0, 0.68611, 0.17208, 0, 0.8961], - "79": [0, 0.68611, 0.09062, 0, 0.85499], - "80": [0, 0.68611, 0.0992, 0, 0.78721], - "81": [0.19444, 0.68611, 0.09062, 0, 0.85499], - "82": [0, 0.68611, 0.02559, 0, 0.85944], - "83": [0, 0.68611, 0.11264, 0, 0.64999], - "84": [0, 0.68611, 0.12903, 0, 0.7961], - "85": [0, 0.68611, 0.17208, 0, 0.88083], - "86": [0, 0.68611, 0.18625, 0, 0.86555], - "87": [0, 0.68611, 0.18625, 0, 1.15999], - "88": [0, 0.68611, 0.15681, 0, 0.86555], - "89": [0, 0.68611, 0.19803, 0, 0.86555], - "90": [0, 0.68611, 0.14208, 0, 0.70888], - "91": [0.25, 0.75, 0.1875, 0, 0.35611], - "93": [0.25, 0.75, 0.09972, 0, 0.35611], - "94": [0, 0.69444, 0.06709, 0, 0.59111], - "95": [0.31, 0.13444, 0.09811, 0, 0.59111], - "97": [0, 0.44444, 0.09426, 0, 0.59111], - "98": [0, 0.69444, 0.07861, 0, 0.53222], - "99": [0, 0.44444, 0.05222, 0, 0.53222], - "100": [0, 0.69444, 0.10861, 0, 0.59111], - "101": [0, 0.44444, 0.085, 0, 0.53222], - "102": [0.19444, 0.69444, 0.21778, 0, 0.4], - "103": [0.19444, 0.44444, 0.105, 0, 0.53222], - "104": [0, 0.69444, 0.09426, 0, 0.59111], - "105": [0, 0.69326, 0.11387, 0, 0.35555], - "106": [0.19444, 0.69326, 0.1672, 0, 0.35555], - "107": [0, 0.69444, 0.11111, 0, 0.53222], - "108": [0, 0.69444, 0.10861, 0, 0.29666], - "109": [0, 0.44444, 0.09426, 0, 0.94444], - "110": [0, 0.44444, 0.09426, 0, 0.64999], - "111": [0, 0.44444, 0.07861, 0, 0.59111], - "112": [0.19444, 0.44444, 0.07861, 0, 0.59111], - "113": [0.19444, 0.44444, 0.105, 0, 0.53222], - "114": [0, 0.44444, 0.11111, 0, 0.50167], - "115": [0, 0.44444, 0.08167, 0, 0.48694], - "116": [0, 0.63492, 0.09639, 0, 0.385], - "117": [0, 0.44444, 0.09426, 0, 0.62055], - "118": [0, 0.44444, 0.11111, 0, 0.53222], - "119": [0, 0.44444, 0.11111, 0, 0.76777], - "120": [0, 0.44444, 0.12583, 0, 0.56055], - "121": [0.19444, 0.44444, 0.105, 0, 0.56166], - "122": [0, 0.44444, 0.13889, 0, 0.49055], - "126": [0.35, 0.34444, 0.11472, 0, 0.59111], - "160": [0, 0, 0, 0, 0.25], - "168": [0, 0.69444, 0.11473, 0, 0.59111], - "176": [0, 0.69444, 0, 0, 0.94888], - "184": [0.17014, 0, 0, 0, 0.53222], - "198": [0, 0.68611, 0.11431, 0, 1.02277], - "216": [0.04861, 0.73472, 0.09062, 0, 0.88555], - "223": [0.19444, 0.69444, 0.09736, 0, 0.665], - "230": [0, 0.44444, 0.085, 0, 0.82666], - "248": [0.09722, 0.54167, 0.09458, 0, 0.59111], - "305": [0, 0.44444, 0.09426, 0, 0.35555], - "338": [0, 0.68611, 0.11431, 0, 1.14054], - "339": [0, 0.44444, 0.085, 0, 0.82666], - "567": [0.19444, 0.44444, 0.04611, 0, 0.385], - "710": [0, 0.69444, 0.06709, 0, 0.59111], - "711": [0, 0.63194, 0.08271, 0, 0.59111], - "713": [0, 0.59444, 0.10444, 0, 0.59111], - "714": [0, 0.69444, 0.08528, 0, 0.59111], - "715": [0, 0.69444, 0, 0, 0.59111], - "728": [0, 0.69444, 0.10333, 0, 0.59111], - "729": [0, 0.69444, 0.12945, 0, 0.35555], - "730": [0, 0.69444, 0, 0, 0.94888], - "732": [0, 0.69444, 0.11472, 0, 0.59111], - "733": [0, 0.69444, 0.11472, 0, 0.59111], - "915": [0, 0.68611, 0.12903, 0, 0.69777], - "916": [0, 0.68611, 0, 0, 0.94444], - "920": [0, 0.68611, 0.09062, 0, 0.88555], - "923": [0, 0.68611, 0, 0, 0.80666], - "926": [0, 0.68611, 0.15092, 0, 0.76777], - "928": [0, 0.68611, 0.17208, 0, 0.8961], - "931": [0, 0.68611, 0.11431, 0, 0.82666], - "933": [0, 0.68611, 0.10778, 0, 0.88555], - "934": [0, 0.68611, 0.05632, 0, 0.82666], - "936": [0, 0.68611, 0.10778, 0, 0.88555], - "937": [0, 0.68611, 0.0992, 0, 0.82666], - "8211": [0, 0.44444, 0.09811, 0, 0.59111], - "8212": [0, 0.44444, 0.09811, 0, 1.18221], - "8216": [0, 0.69444, 0.12945, 0, 0.35555], - "8217": [0, 0.69444, 0.12945, 0, 0.35555], - "8220": [0, 0.69444, 0.16772, 0, 0.62055], - "8221": [0, 0.69444, 0.07939, 0, 0.62055] - }, - "Main-Italic": { - "32": [0, 0, 0, 0, 0.25], - "33": [0, 0.69444, 0.12417, 0, 0.30667], - "34": [0, 0.69444, 0.06961, 0, 0.51444], - "35": [0.19444, 0.69444, 0.06616, 0, 0.81777], - "37": [0.05556, 0.75, 0.13639, 0, 0.81777], - "38": [0, 0.69444, 0.09694, 0, 0.76666], - "39": [0, 0.69444, 0.12417, 0, 0.30667], - "40": [0.25, 0.75, 0.16194, 0, 0.40889], - "41": [0.25, 0.75, 0.03694, 0, 0.40889], - "42": [0, 0.75, 0.14917, 0, 0.51111], - "43": [0.05667, 0.56167, 0.03694, 0, 0.76666], - "44": [0.19444, 0.10556, 0, 0, 0.30667], - "45": [0, 0.43056, 0.02826, 0, 0.35778], - "46": [0, 0.10556, 0, 0, 0.30667], - "47": [0.25, 0.75, 0.16194, 0, 0.51111], - "48": [0, 0.64444, 0.13556, 0, 0.51111], - "49": [0, 0.64444, 0.13556, 0, 0.51111], - "50": [0, 0.64444, 0.13556, 0, 0.51111], - "51": [0, 0.64444, 0.13556, 0, 0.51111], - "52": [0.19444, 0.64444, 0.13556, 0, 0.51111], - "53": [0, 0.64444, 0.13556, 0, 0.51111], - "54": [0, 0.64444, 0.13556, 0, 0.51111], - "55": [0.19444, 0.64444, 0.13556, 0, 0.51111], - "56": [0, 0.64444, 0.13556, 0, 0.51111], - "57": [0, 0.64444, 0.13556, 0, 0.51111], - "58": [0, 0.43056, 0.0582, 0, 0.30667], - "59": [0.19444, 0.43056, 0.0582, 0, 0.30667], - "61": [-0.13313, 0.36687, 0.06616, 0, 0.76666], - "63": [0, 0.69444, 0.1225, 0, 0.51111], - "64": [0, 0.69444, 0.09597, 0, 0.76666], - "65": [0, 0.68333, 0, 0, 0.74333], - "66": [0, 0.68333, 0.10257, 0, 0.70389], - "67": [0, 0.68333, 0.14528, 0, 0.71555], - "68": [0, 0.68333, 0.09403, 0, 0.755], - "69": [0, 0.68333, 0.12028, 0, 0.67833], - "70": [0, 0.68333, 0.13305, 0, 0.65277], - "71": [0, 0.68333, 0.08722, 0, 0.77361], - "72": [0, 0.68333, 0.16389, 0, 0.74333], - "73": [0, 0.68333, 0.15806, 0, 0.38555], - "74": [0, 0.68333, 0.14028, 0, 0.525], - "75": [0, 0.68333, 0.14528, 0, 0.76888], - "76": [0, 0.68333, 0, 0, 0.62722], - "77": [0, 0.68333, 0.16389, 0, 0.89666], - "78": [0, 0.68333, 0.16389, 0, 0.74333], - "79": [0, 0.68333, 0.09403, 0, 0.76666], - "80": [0, 0.68333, 0.10257, 0, 0.67833], - "81": [0.19444, 0.68333, 0.09403, 0, 0.76666], - "82": [0, 0.68333, 0.03868, 0, 0.72944], - "83": [0, 0.68333, 0.11972, 0, 0.56222], - "84": [0, 0.68333, 0.13305, 0, 0.71555], - "85": [0, 0.68333, 0.16389, 0, 0.74333], - "86": [0, 0.68333, 0.18361, 0, 0.74333], - "87": [0, 0.68333, 0.18361, 0, 0.99888], - "88": [0, 0.68333, 0.15806, 0, 0.74333], - "89": [0, 0.68333, 0.19383, 0, 0.74333], - "90": [0, 0.68333, 0.14528, 0, 0.61333], - "91": [0.25, 0.75, 0.1875, 0, 0.30667], - "93": [0.25, 0.75, 0.10528, 0, 0.30667], - "94": [0, 0.69444, 0.06646, 0, 0.51111], - "95": [0.31, 0.12056, 0.09208, 0, 0.51111], - "97": [0, 0.43056, 0.07671, 0, 0.51111], - "98": [0, 0.69444, 0.06312, 0, 0.46], - "99": [0, 0.43056, 0.05653, 0, 0.46], - "100": [0, 0.69444, 0.10333, 0, 0.51111], - "101": [0, 0.43056, 0.07514, 0, 0.46], - "102": [0.19444, 0.69444, 0.21194, 0, 0.30667], - "103": [0.19444, 0.43056, 0.08847, 0, 0.46], - "104": [0, 0.69444, 0.07671, 0, 0.51111], - "105": [0, 0.65536, 0.1019, 0, 0.30667], - "106": [0.19444, 0.65536, 0.14467, 0, 0.30667], - "107": [0, 0.69444, 0.10764, 0, 0.46], - "108": [0, 0.69444, 0.10333, 0, 0.25555], - "109": [0, 0.43056, 0.07671, 0, 0.81777], - "110": [0, 0.43056, 0.07671, 0, 0.56222], - "111": [0, 0.43056, 0.06312, 0, 0.51111], - "112": [0.19444, 0.43056, 0.06312, 0, 0.51111], - "113": [0.19444, 0.43056, 0.08847, 0, 0.46], - "114": [0, 0.43056, 0.10764, 0, 0.42166], - "115": [0, 0.43056, 0.08208, 0, 0.40889], - "116": [0, 0.61508, 0.09486, 0, 0.33222], - "117": [0, 0.43056, 0.07671, 0, 0.53666], - "118": [0, 0.43056, 0.10764, 0, 0.46], - "119": [0, 0.43056, 0.10764, 0, 0.66444], - "120": [0, 0.43056, 0.12042, 0, 0.46389], - "121": [0.19444, 0.43056, 0.08847, 0, 0.48555], - "122": [0, 0.43056, 0.12292, 0, 0.40889], - "126": [0.35, 0.31786, 0.11585, 0, 0.51111], - "160": [0, 0, 0, 0, 0.25], - "168": [0, 0.66786, 0.10474, 0, 0.51111], - "176": [0, 0.69444, 0, 0, 0.83129], - "184": [0.17014, 0, 0, 0, 0.46], - "198": [0, 0.68333, 0.12028, 0, 0.88277], - "216": [0.04861, 0.73194, 0.09403, 0, 0.76666], - "223": [0.19444, 0.69444, 0.10514, 0, 0.53666], - "230": [0, 0.43056, 0.07514, 0, 0.71555], - "248": [0.09722, 0.52778, 0.09194, 0, 0.51111], - "338": [0, 0.68333, 0.12028, 0, 0.98499], - "339": [0, 0.43056, 0.07514, 0, 0.71555], - "710": [0, 0.69444, 0.06646, 0, 0.51111], - "711": [0, 0.62847, 0.08295, 0, 0.51111], - "713": [0, 0.56167, 0.10333, 0, 0.51111], - "714": [0, 0.69444, 0.09694, 0, 0.51111], - "715": [0, 0.69444, 0, 0, 0.51111], - "728": [0, 0.69444, 0.10806, 0, 0.51111], - "729": [0, 0.66786, 0.11752, 0, 0.30667], - "730": [0, 0.69444, 0, 0, 0.83129], - "732": [0, 0.66786, 0.11585, 0, 0.51111], - "733": [0, 0.69444, 0.1225, 0, 0.51111], - "915": [0, 0.68333, 0.13305, 0, 0.62722], - "916": [0, 0.68333, 0, 0, 0.81777], - "920": [0, 0.68333, 0.09403, 0, 0.76666], - "923": [0, 0.68333, 0, 0, 0.69222], - "926": [0, 0.68333, 0.15294, 0, 0.66444], - "928": [0, 0.68333, 0.16389, 0, 0.74333], - "931": [0, 0.68333, 0.12028, 0, 0.71555], - "933": [0, 0.68333, 0.11111, 0, 0.76666], - "934": [0, 0.68333, 0.05986, 0, 0.71555], - "936": [0, 0.68333, 0.11111, 0, 0.76666], - "937": [0, 0.68333, 0.10257, 0, 0.71555], - "8211": [0, 0.43056, 0.09208, 0, 0.51111], - "8212": [0, 0.43056, 0.09208, 0, 1.02222], - "8216": [0, 0.69444, 0.12417, 0, 0.30667], - "8217": [0, 0.69444, 0.12417, 0, 0.30667], - "8220": [0, 0.69444, 0.1685, 0, 0.51444], - "8221": [0, 0.69444, 0.06961, 0, 0.51444], - "8463": [0, 0.68889, 0, 0, 0.54028] - }, - "Main-Regular": { - "32": [0, 0, 0, 0, 0.25], - "33": [0, 0.69444, 0, 0, 0.27778], - "34": [0, 0.69444, 0, 0, 0.5], - "35": [0.19444, 0.69444, 0, 0, 0.83334], - "36": [0.05556, 0.75, 0, 0, 0.5], - "37": [0.05556, 0.75, 0, 0, 0.83334], - "38": [0, 0.69444, 0, 0, 0.77778], - "39": [0, 0.69444, 0, 0, 0.27778], - "40": [0.25, 0.75, 0, 0, 0.38889], - "41": [0.25, 0.75, 0, 0, 0.38889], - "42": [0, 0.75, 0, 0, 0.5], - "43": [0.08333, 0.58333, 0, 0, 0.77778], - "44": [0.19444, 0.10556, 0, 0, 0.27778], - "45": [0, 0.43056, 0, 0, 0.33333], - "46": [0, 0.10556, 0, 0, 0.27778], - "47": [0.25, 0.75, 0, 0, 0.5], - "48": [0, 0.64444, 0, 0, 0.5], - "49": [0, 0.64444, 0, 0, 0.5], - "50": [0, 0.64444, 0, 0, 0.5], - "51": [0, 0.64444, 0, 0, 0.5], - "52": [0, 0.64444, 0, 0, 0.5], - "53": [0, 0.64444, 0, 0, 0.5], - "54": [0, 0.64444, 0, 0, 0.5], - "55": [0, 0.64444, 0, 0, 0.5], - "56": [0, 0.64444, 0, 0, 0.5], - "57": [0, 0.64444, 0, 0, 0.5], - "58": [0, 0.43056, 0, 0, 0.27778], - "59": [0.19444, 0.43056, 0, 0, 0.27778], - "60": [0.0391, 0.5391, 0, 0, 0.77778], - "61": [-0.13313, 0.36687, 0, 0, 0.77778], - "62": [0.0391, 0.5391, 0, 0, 0.77778], - "63": [0, 0.69444, 0, 0, 0.47222], - "64": [0, 0.69444, 0, 0, 0.77778], - "65": [0, 0.68333, 0, 0, 0.75], - "66": [0, 0.68333, 0, 0, 0.70834], - "67": [0, 0.68333, 0, 0, 0.72222], - "68": [0, 0.68333, 0, 0, 0.76389], - "69": [0, 0.68333, 0, 0, 0.68056], - "70": [0, 0.68333, 0, 0, 0.65278], - "71": [0, 0.68333, 0, 0, 0.78472], - "72": [0, 0.68333, 0, 0, 0.75], - "73": [0, 0.68333, 0, 0, 0.36111], - "74": [0, 0.68333, 0, 0, 0.51389], - "75": [0, 0.68333, 0, 0, 0.77778], - "76": [0, 0.68333, 0, 0, 0.625], - "77": [0, 0.68333, 0, 0, 0.91667], - "78": [0, 0.68333, 0, 0, 0.75], - "79": [0, 0.68333, 0, 0, 0.77778], - "80": [0, 0.68333, 0, 0, 0.68056], - "81": [0.19444, 0.68333, 0, 0, 0.77778], - "82": [0, 0.68333, 0, 0, 0.73611], - "83": [0, 0.68333, 0, 0, 0.55556], - "84": [0, 0.68333, 0, 0, 0.72222], - "85": [0, 0.68333, 0, 0, 0.75], - "86": [0, 0.68333, 0.01389, 0, 0.75], - "87": [0, 0.68333, 0.01389, 0, 1.02778], - "88": [0, 0.68333, 0, 0, 0.75], - "89": [0, 0.68333, 0.025, 0, 0.75], - "90": [0, 0.68333, 0, 0, 0.61111], - "91": [0.25, 0.75, 0, 0, 0.27778], - "92": [0.25, 0.75, 0, 0, 0.5], - "93": [0.25, 0.75, 0, 0, 0.27778], - "94": [0, 0.69444, 0, 0, 0.5], - "95": [0.31, 0.12056, 0.02778, 0, 0.5], - "97": [0, 0.43056, 0, 0, 0.5], - "98": [0, 0.69444, 0, 0, 0.55556], - "99": [0, 0.43056, 0, 0, 0.44445], - "100": [0, 0.69444, 0, 0, 0.55556], - "101": [0, 0.43056, 0, 0, 0.44445], - "102": [0, 0.69444, 0.07778, 0, 0.30556], - "103": [0.19444, 0.43056, 0.01389, 0, 0.5], - "104": [0, 0.69444, 0, 0, 0.55556], - "105": [0, 0.66786, 0, 0, 0.27778], - "106": [0.19444, 0.66786, 0, 0, 0.30556], - "107": [0, 0.69444, 0, 0, 0.52778], - "108": [0, 0.69444, 0, 0, 0.27778], - "109": [0, 0.43056, 0, 0, 0.83334], - "110": [0, 0.43056, 0, 0, 0.55556], - "111": [0, 0.43056, 0, 0, 0.5], - "112": [0.19444, 0.43056, 0, 0, 0.55556], - "113": [0.19444, 0.43056, 0, 0, 0.52778], - "114": [0, 0.43056, 0, 0, 0.39167], - "115": [0, 0.43056, 0, 0, 0.39445], - "116": [0, 0.61508, 0, 0, 0.38889], - "117": [0, 0.43056, 0, 0, 0.55556], - "118": [0, 0.43056, 0.01389, 0, 0.52778], - "119": [0, 0.43056, 0.01389, 0, 0.72222], - "120": [0, 0.43056, 0, 0, 0.52778], - "121": [0.19444, 0.43056, 0.01389, 0, 0.52778], - "122": [0, 0.43056, 0, 0, 0.44445], - "123": [0.25, 0.75, 0, 0, 0.5], - "124": [0.25, 0.75, 0, 0, 0.27778], - "125": [0.25, 0.75, 0, 0, 0.5], - "126": [0.35, 0.31786, 0, 0, 0.5], - "160": [0, 0, 0, 0, 0.25], - "163": [0, 0.69444, 0, 0, 0.76909], - "167": [0.19444, 0.69444, 0, 0, 0.44445], - "168": [0, 0.66786, 0, 0, 0.5], - "172": [0, 0.43056, 0, 0, 0.66667], - "176": [0, 0.69444, 0, 0, 0.75], - "177": [0.08333, 0.58333, 0, 0, 0.77778], - "182": [0.19444, 0.69444, 0, 0, 0.61111], - "184": [0.17014, 0, 0, 0, 0.44445], - "198": [0, 0.68333, 0, 0, 0.90278], - "215": [0.08333, 0.58333, 0, 0, 0.77778], - "216": [0.04861, 0.73194, 0, 0, 0.77778], - "223": [0, 0.69444, 0, 0, 0.5], - "230": [0, 0.43056, 0, 0, 0.72222], - "247": [0.08333, 0.58333, 0, 0, 0.77778], - "248": [0.09722, 0.52778, 0, 0, 0.5], - "305": [0, 0.43056, 0, 0, 0.27778], - "338": [0, 0.68333, 0, 0, 1.01389], - "339": [0, 0.43056, 0, 0, 0.77778], - "567": [0.19444, 0.43056, 0, 0, 0.30556], - "710": [0, 0.69444, 0, 0, 0.5], - "711": [0, 0.62847, 0, 0, 0.5], - "713": [0, 0.56778, 0, 0, 0.5], - "714": [0, 0.69444, 0, 0, 0.5], - "715": [0, 0.69444, 0, 0, 0.5], - "728": [0, 0.69444, 0, 0, 0.5], - "729": [0, 0.66786, 0, 0, 0.27778], - "730": [0, 0.69444, 0, 0, 0.75], - "732": [0, 0.66786, 0, 0, 0.5], - "733": [0, 0.69444, 0, 0, 0.5], - "915": [0, 0.68333, 0, 0, 0.625], - "916": [0, 0.68333, 0, 0, 0.83334], - "920": [0, 0.68333, 0, 0, 0.77778], - "923": [0, 0.68333, 0, 0, 0.69445], - "926": [0, 0.68333, 0, 0, 0.66667], - "928": [0, 0.68333, 0, 0, 0.75], - "931": [0, 0.68333, 0, 0, 0.72222], - "933": [0, 0.68333, 0, 0, 0.77778], - "934": [0, 0.68333, 0, 0, 0.72222], - "936": [0, 0.68333, 0, 0, 0.77778], - "937": [0, 0.68333, 0, 0, 0.72222], - "8211": [0, 0.43056, 0.02778, 0, 0.5], - "8212": [0, 0.43056, 0.02778, 0, 1.0], - "8216": [0, 0.69444, 0, 0, 0.27778], - "8217": [0, 0.69444, 0, 0, 0.27778], - "8220": [0, 0.69444, 0, 0, 0.5], - "8221": [0, 0.69444, 0, 0, 0.5], - "8224": [0.19444, 0.69444, 0, 0, 0.44445], - "8225": [0.19444, 0.69444, 0, 0, 0.44445], - "8230": [0, 0.12, 0, 0, 1.172], - "8242": [0, 0.55556, 0, 0, 0.275], - "8407": [0, 0.71444, 0.15382, 0, 0.5], - "8463": [0, 0.68889, 0, 0, 0.54028], - "8465": [0, 0.69444, 0, 0, 0.72222], - "8467": [0, 0.69444, 0, 0.11111, 0.41667], - "8472": [0.19444, 0.43056, 0, 0.11111, 0.63646], - "8476": [0, 0.69444, 0, 0, 0.72222], - "8501": [0, 0.69444, 0, 0, 0.61111], - "8592": [-0.13313, 0.36687, 0, 0, 1.0], - "8593": [0.19444, 0.69444, 0, 0, 0.5], - "8594": [-0.13313, 0.36687, 0, 0, 1.0], - "8595": [0.19444, 0.69444, 0, 0, 0.5], - "8596": [-0.13313, 0.36687, 0, 0, 1.0], - "8597": [0.25, 0.75, 0, 0, 0.5], - "8598": [0.19444, 0.69444, 0, 0, 1.0], - "8599": [0.19444, 0.69444, 0, 0, 1.0], - "8600": [0.19444, 0.69444, 0, 0, 1.0], - "8601": [0.19444, 0.69444, 0, 0, 1.0], - "8614": [0.011, 0.511, 0, 0, 1.0], - "8617": [0.011, 0.511, 0, 0, 1.126], - "8618": [0.011, 0.511, 0, 0, 1.126], - "8636": [-0.13313, 0.36687, 0, 0, 1.0], - "8637": [-0.13313, 0.36687, 0, 0, 1.0], - "8640": [-0.13313, 0.36687, 0, 0, 1.0], - "8641": [-0.13313, 0.36687, 0, 0, 1.0], - "8652": [0.011, 0.671, 0, 0, 1.0], - "8656": [-0.13313, 0.36687, 0, 0, 1.0], - "8657": [0.19444, 0.69444, 0, 0, 0.61111], - "8658": [-0.13313, 0.36687, 0, 0, 1.0], - "8659": [0.19444, 0.69444, 0, 0, 0.61111], - "8660": [-0.13313, 0.36687, 0, 0, 1.0], - "8661": [0.25, 0.75, 0, 0, 0.61111], - "8704": [0, 0.69444, 0, 0, 0.55556], - "8706": [0, 0.69444, 0.05556, 0.08334, 0.5309], - "8707": [0, 0.69444, 0, 0, 0.55556], - "8709": [0.05556, 0.75, 0, 0, 0.5], - "8711": [0, 0.68333, 0, 0, 0.83334], - "8712": [0.0391, 0.5391, 0, 0, 0.66667], - "8715": [0.0391, 0.5391, 0, 0, 0.66667], - "8722": [0.08333, 0.58333, 0, 0, 0.77778], - "8723": [0.08333, 0.58333, 0, 0, 0.77778], - "8725": [0.25, 0.75, 0, 0, 0.5], - "8726": [0.25, 0.75, 0, 0, 0.5], - "8727": [-0.03472, 0.46528, 0, 0, 0.5], - "8728": [-0.05555, 0.44445, 0, 0, 0.5], - "8729": [-0.05555, 0.44445, 0, 0, 0.5], - "8730": [0.2, 0.8, 0, 0, 0.83334], - "8733": [0, 0.43056, 0, 0, 0.77778], - "8734": [0, 0.43056, 0, 0, 1.0], - "8736": [0, 0.69224, 0, 0, 0.72222], - "8739": [0.25, 0.75, 0, 0, 0.27778], - "8741": [0.25, 0.75, 0, 0, 0.5], - "8743": [0, 0.55556, 0, 0, 0.66667], - "8744": [0, 0.55556, 0, 0, 0.66667], - "8745": [0, 0.55556, 0, 0, 0.66667], - "8746": [0, 0.55556, 0, 0, 0.66667], - "8747": [0.19444, 0.69444, 0.11111, 0, 0.41667], - "8764": [-0.13313, 0.36687, 0, 0, 0.77778], - "8768": [0.19444, 0.69444, 0, 0, 0.27778], - "8771": [-0.03625, 0.46375, 0, 0, 0.77778], - "8773": [-0.022, 0.589, 0, 0, 1.0], - "8776": [-0.01688, 0.48312, 0, 0, 0.77778], - "8781": [-0.03625, 0.46375, 0, 0, 0.77778], - "8784": [-0.133, 0.67, 0, 0, 0.778], - "8801": [-0.03625, 0.46375, 0, 0, 0.77778], - "8804": [0.13597, 0.63597, 0, 0, 0.77778], - "8805": [0.13597, 0.63597, 0, 0, 0.77778], - "8810": [0.0391, 0.5391, 0, 0, 1.0], - "8811": [0.0391, 0.5391, 0, 0, 1.0], - "8826": [0.0391, 0.5391, 0, 0, 0.77778], - "8827": [0.0391, 0.5391, 0, 0, 0.77778], - "8834": [0.0391, 0.5391, 0, 0, 0.77778], - "8835": [0.0391, 0.5391, 0, 0, 0.77778], - "8838": [0.13597, 0.63597, 0, 0, 0.77778], - "8839": [0.13597, 0.63597, 0, 0, 0.77778], - "8846": [0, 0.55556, 0, 0, 0.66667], - "8849": [0.13597, 0.63597, 0, 0, 0.77778], - "8850": [0.13597, 0.63597, 0, 0, 0.77778], - "8851": [0, 0.55556, 0, 0, 0.66667], - "8852": [0, 0.55556, 0, 0, 0.66667], - "8853": [0.08333, 0.58333, 0, 0, 0.77778], - "8854": [0.08333, 0.58333, 0, 0, 0.77778], - "8855": [0.08333, 0.58333, 0, 0, 0.77778], - "8856": [0.08333, 0.58333, 0, 0, 0.77778], - "8857": [0.08333, 0.58333, 0, 0, 0.77778], - "8866": [0, 0.69444, 0, 0, 0.61111], - "8867": [0, 0.69444, 0, 0, 0.61111], - "8868": [0, 0.69444, 0, 0, 0.77778], - "8869": [0, 0.69444, 0, 0, 0.77778], - "8872": [0.249, 0.75, 0, 0, 0.867], - "8900": [-0.05555, 0.44445, 0, 0, 0.5], - "8901": [-0.05555, 0.44445, 0, 0, 0.27778], - "8902": [-0.03472, 0.46528, 0, 0, 0.5], - "8904": [0.005, 0.505, 0, 0, 0.9], - "8942": [0.03, 0.9, 0, 0, 0.278], - "8943": [-0.19, 0.31, 0, 0, 1.172], - "8945": [-0.1, 0.82, 0, 0, 1.282], - "8968": [0.25, 0.75, 0, 0, 0.44445], - "8969": [0.25, 0.75, 0, 0, 0.44445], - "8970": [0.25, 0.75, 0, 0, 0.44445], - "8971": [0.25, 0.75, 0, 0, 0.44445], - "8994": [-0.14236, 0.35764, 0, 0, 1.0], - "8995": [-0.14236, 0.35764, 0, 0, 1.0], - "9136": [0.244, 0.744, 0, 0, 0.412], - "9137": [0.244, 0.744, 0, 0, 0.412], - "9651": [0.19444, 0.69444, 0, 0, 0.88889], - "9657": [-0.03472, 0.46528, 0, 0, 0.5], - "9661": [0.19444, 0.69444, 0, 0, 0.88889], - "9667": [-0.03472, 0.46528, 0, 0, 0.5], - "9711": [0.19444, 0.69444, 0, 0, 1.0], - "9824": [0.12963, 0.69444, 0, 0, 0.77778], - "9825": [0.12963, 0.69444, 0, 0, 0.77778], - "9826": [0.12963, 0.69444, 0, 0, 0.77778], - "9827": [0.12963, 0.69444, 0, 0, 0.77778], - "9837": [0, 0.75, 0, 0, 0.38889], - "9838": [0.19444, 0.69444, 0, 0, 0.38889], - "9839": [0.19444, 0.69444, 0, 0, 0.38889], - "10216": [0.25, 0.75, 0, 0, 0.38889], - "10217": [0.25, 0.75, 0, 0, 0.38889], - "10222": [0.244, 0.744, 0, 0, 0.412], - "10223": [0.244, 0.744, 0, 0, 0.412], - "10229": [0.011, 0.511, 0, 0, 1.609], - "10230": [0.011, 0.511, 0, 0, 1.638], - "10231": [0.011, 0.511, 0, 0, 1.859], - "10232": [0.024, 0.525, 0, 0, 1.609], - "10233": [0.024, 0.525, 0, 0, 1.638], - "10234": [0.024, 0.525, 0, 0, 1.858], - "10236": [0.011, 0.511, 0, 0, 1.638], - "10815": [0, 0.68333, 0, 0, 0.75], - "10927": [0.13597, 0.63597, 0, 0, 0.77778], - "10928": [0.13597, 0.63597, 0, 0, 0.77778], - "57376": [0.19444, 0.69444, 0, 0, 0] - }, - "Math-BoldItalic": { - "32": [0, 0, 0, 0, 0.25], - "48": [0, 0.44444, 0, 0, 0.575], - "49": [0, 0.44444, 0, 0, 0.575], - "50": [0, 0.44444, 0, 0, 0.575], - "51": [0.19444, 0.44444, 0, 0, 0.575], - "52": [0.19444, 0.44444, 0, 0, 0.575], - "53": [0.19444, 0.44444, 0, 0, 0.575], - "54": [0, 0.64444, 0, 0, 0.575], - "55": [0.19444, 0.44444, 0, 0, 0.575], - "56": [0, 0.64444, 0, 0, 0.575], - "57": [0.19444, 0.44444, 0, 0, 0.575], - "65": [0, 0.68611, 0, 0, 0.86944], - "66": [0, 0.68611, 0.04835, 0, 0.8664], - "67": [0, 0.68611, 0.06979, 0, 0.81694], - "68": [0, 0.68611, 0.03194, 0, 0.93812], - "69": [0, 0.68611, 0.05451, 0, 0.81007], - "70": [0, 0.68611, 0.15972, 0, 0.68889], - "71": [0, 0.68611, 0, 0, 0.88673], - "72": [0, 0.68611, 0.08229, 0, 0.98229], - "73": [0, 0.68611, 0.07778, 0, 0.51111], - "74": [0, 0.68611, 0.10069, 0, 0.63125], - "75": [0, 0.68611, 0.06979, 0, 0.97118], - "76": [0, 0.68611, 0, 0, 0.75555], - "77": [0, 0.68611, 0.11424, 0, 1.14201], - "78": [0, 0.68611, 0.11424, 0, 0.95034], - "79": [0, 0.68611, 0.03194, 0, 0.83666], - "80": [0, 0.68611, 0.15972, 0, 0.72309], - "81": [0.19444, 0.68611, 0, 0, 0.86861], - "82": [0, 0.68611, 0.00421, 0, 0.87235], - "83": [0, 0.68611, 0.05382, 0, 0.69271], - "84": [0, 0.68611, 0.15972, 0, 0.63663], - "85": [0, 0.68611, 0.11424, 0, 0.80027], - "86": [0, 0.68611, 0.25555, 0, 0.67778], - "87": [0, 0.68611, 0.15972, 0, 1.09305], - "88": [0, 0.68611, 0.07778, 0, 0.94722], - "89": [0, 0.68611, 0.25555, 0, 0.67458], - "90": [0, 0.68611, 0.06979, 0, 0.77257], - "97": [0, 0.44444, 0, 0, 0.63287], - "98": [0, 0.69444, 0, 0, 0.52083], - "99": [0, 0.44444, 0, 0, 0.51342], - "100": [0, 0.69444, 0, 0, 0.60972], - "101": [0, 0.44444, 0, 0, 0.55361], - "102": [0.19444, 0.69444, 0.11042, 0, 0.56806], - "103": [0.19444, 0.44444, 0.03704, 0, 0.5449], - "104": [0, 0.69444, 0, 0, 0.66759], - "105": [0, 0.69326, 0, 0, 0.4048], - "106": [0.19444, 0.69326, 0.0622, 0, 0.47083], - "107": [0, 0.69444, 0.01852, 0, 0.6037], - "108": [0, 0.69444, 0.0088, 0, 0.34815], - "109": [0, 0.44444, 0, 0, 1.0324], - "110": [0, 0.44444, 0, 0, 0.71296], - "111": [0, 0.44444, 0, 0, 0.58472], - "112": [0.19444, 0.44444, 0, 0, 0.60092], - "113": [0.19444, 0.44444, 0.03704, 0, 0.54213], - "114": [0, 0.44444, 0.03194, 0, 0.5287], - "115": [0, 0.44444, 0, 0, 0.53125], - "116": [0, 0.63492, 0, 0, 0.41528], - "117": [0, 0.44444, 0, 0, 0.68102], - "118": [0, 0.44444, 0.03704, 0, 0.56666], - "119": [0, 0.44444, 0.02778, 0, 0.83148], - "120": [0, 0.44444, 0, 0, 0.65903], - "121": [0.19444, 0.44444, 0.03704, 0, 0.59028], - "122": [0, 0.44444, 0.04213, 0, 0.55509], - "160": [0, 0, 0, 0, 0.25], - "915": [0, 0.68611, 0.15972, 0, 0.65694], - "916": [0, 0.68611, 0, 0, 0.95833], - "920": [0, 0.68611, 0.03194, 0, 0.86722], - "923": [0, 0.68611, 0, 0, 0.80555], - "926": [0, 0.68611, 0.07458, 0, 0.84125], - "928": [0, 0.68611, 0.08229, 0, 0.98229], - "931": [0, 0.68611, 0.05451, 0, 0.88507], - "933": [0, 0.68611, 0.15972, 0, 0.67083], - "934": [0, 0.68611, 0, 0, 0.76666], - "936": [0, 0.68611, 0.11653, 0, 0.71402], - "937": [0, 0.68611, 0.04835, 0, 0.8789], - "945": [0, 0.44444, 0, 0, 0.76064], - "946": [0.19444, 0.69444, 0.03403, 0, 0.65972], - "947": [0.19444, 0.44444, 0.06389, 0, 0.59003], - "948": [0, 0.69444, 0.03819, 0, 0.52222], - "949": [0, 0.44444, 0, 0, 0.52882], - "950": [0.19444, 0.69444, 0.06215, 0, 0.50833], - "951": [0.19444, 0.44444, 0.03704, 0, 0.6], - "952": [0, 0.69444, 0.03194, 0, 0.5618], - "953": [0, 0.44444, 0, 0, 0.41204], - "954": [0, 0.44444, 0, 0, 0.66759], - "955": [0, 0.69444, 0, 0, 0.67083], - "956": [0.19444, 0.44444, 0, 0, 0.70787], - "957": [0, 0.44444, 0.06898, 0, 0.57685], - "958": [0.19444, 0.69444, 0.03021, 0, 0.50833], - "959": [0, 0.44444, 0, 0, 0.58472], - "960": [0, 0.44444, 0.03704, 0, 0.68241], - "961": [0.19444, 0.44444, 0, 0, 0.6118], - "962": [0.09722, 0.44444, 0.07917, 0, 0.42361], - "963": [0, 0.44444, 0.03704, 0, 0.68588], - "964": [0, 0.44444, 0.13472, 0, 0.52083], - "965": [0, 0.44444, 0.03704, 0, 0.63055], - "966": [0.19444, 0.44444, 0, 0, 0.74722], - "967": [0.19444, 0.44444, 0, 0, 0.71805], - "968": [0.19444, 0.69444, 0.03704, 0, 0.75833], - "969": [0, 0.44444, 0.03704, 0, 0.71782], - "977": [0, 0.69444, 0, 0, 0.69155], - "981": [0.19444, 0.69444, 0, 0, 0.7125], - "982": [0, 0.44444, 0.03194, 0, 0.975], - "1009": [0.19444, 0.44444, 0, 0, 0.6118], - "1013": [0, 0.44444, 0, 0, 0.48333], - "57649": [0, 0.44444, 0, 0, 0.39352], - "57911": [0.19444, 0.44444, 0, 0, 0.43889] - }, - "Math-Italic": { - "32": [0, 0, 0, 0, 0.25], - "48": [0, 0.43056, 0, 0, 0.5], - "49": [0, 0.43056, 0, 0, 0.5], - "50": [0, 0.43056, 0, 0, 0.5], - "51": [0.19444, 0.43056, 0, 0, 0.5], - "52": [0.19444, 0.43056, 0, 0, 0.5], - "53": [0.19444, 0.43056, 0, 0, 0.5], - "54": [0, 0.64444, 0, 0, 0.5], - "55": [0.19444, 0.43056, 0, 0, 0.5], - "56": [0, 0.64444, 0, 0, 0.5], - "57": [0.19444, 0.43056, 0, 0, 0.5], - "65": [0, 0.68333, 0, 0.13889, 0.75], - "66": [0, 0.68333, 0.05017, 0.08334, 0.75851], - "67": [0, 0.68333, 0.07153, 0.08334, 0.71472], - "68": [0, 0.68333, 0.02778, 0.05556, 0.82792], - "69": [0, 0.68333, 0.05764, 0.08334, 0.7382], - "70": [0, 0.68333, 0.13889, 0.08334, 0.64306], - "71": [0, 0.68333, 0, 0.08334, 0.78625], - "72": [0, 0.68333, 0.08125, 0.05556, 0.83125], - "73": [0, 0.68333, 0.07847, 0.11111, 0.43958], - "74": [0, 0.68333, 0.09618, 0.16667, 0.55451], - "75": [0, 0.68333, 0.07153, 0.05556, 0.84931], - "76": [0, 0.68333, 0, 0.02778, 0.68056], - "77": [0, 0.68333, 0.10903, 0.08334, 0.97014], - "78": [0, 0.68333, 0.10903, 0.08334, 0.80347], - "79": [0, 0.68333, 0.02778, 0.08334, 0.76278], - "80": [0, 0.68333, 0.13889, 0.08334, 0.64201], - "81": [0.19444, 0.68333, 0, 0.08334, 0.79056], - "82": [0, 0.68333, 0.00773, 0.08334, 0.75929], - "83": [0, 0.68333, 0.05764, 0.08334, 0.6132], - "84": [0, 0.68333, 0.13889, 0.08334, 0.58438], - "85": [0, 0.68333, 0.10903, 0.02778, 0.68278], - "86": [0, 0.68333, 0.22222, 0, 0.58333], - "87": [0, 0.68333, 0.13889, 0, 0.94445], - "88": [0, 0.68333, 0.07847, 0.08334, 0.82847], - "89": [0, 0.68333, 0.22222, 0, 0.58056], - "90": [0, 0.68333, 0.07153, 0.08334, 0.68264], - "97": [0, 0.43056, 0, 0, 0.52859], - "98": [0, 0.69444, 0, 0, 0.42917], - "99": [0, 0.43056, 0, 0.05556, 0.43276], - "100": [0, 0.69444, 0, 0.16667, 0.52049], - "101": [0, 0.43056, 0, 0.05556, 0.46563], - "102": [0.19444, 0.69444, 0.10764, 0.16667, 0.48959], - "103": [0.19444, 0.43056, 0.03588, 0.02778, 0.47697], - "104": [0, 0.69444, 0, 0, 0.57616], - "105": [0, 0.65952, 0, 0, 0.34451], - "106": [0.19444, 0.65952, 0.05724, 0, 0.41181], - "107": [0, 0.69444, 0.03148, 0, 0.5206], - "108": [0, 0.69444, 0.01968, 0.08334, 0.29838], - "109": [0, 0.43056, 0, 0, 0.87801], - "110": [0, 0.43056, 0, 0, 0.60023], - "111": [0, 0.43056, 0, 0.05556, 0.48472], - "112": [0.19444, 0.43056, 0, 0.08334, 0.50313], - "113": [0.19444, 0.43056, 0.03588, 0.08334, 0.44641], - "114": [0, 0.43056, 0.02778, 0.05556, 0.45116], - "115": [0, 0.43056, 0, 0.05556, 0.46875], - "116": [0, 0.61508, 0, 0.08334, 0.36111], - "117": [0, 0.43056, 0, 0.02778, 0.57246], - "118": [0, 0.43056, 0.03588, 0.02778, 0.48472], - "119": [0, 0.43056, 0.02691, 0.08334, 0.71592], - "120": [0, 0.43056, 0, 0.02778, 0.57153], - "121": [0.19444, 0.43056, 0.03588, 0.05556, 0.49028], - "122": [0, 0.43056, 0.04398, 0.05556, 0.46505], - "160": [0, 0, 0, 0, 0.25], - "915": [0, 0.68333, 0.13889, 0.08334, 0.61528], - "916": [0, 0.68333, 0, 0.16667, 0.83334], - "920": [0, 0.68333, 0.02778, 0.08334, 0.76278], - "923": [0, 0.68333, 0, 0.16667, 0.69445], - "926": [0, 0.68333, 0.07569, 0.08334, 0.74236], - "928": [0, 0.68333, 0.08125, 0.05556, 0.83125], - "931": [0, 0.68333, 0.05764, 0.08334, 0.77986], - "933": [0, 0.68333, 0.13889, 0.05556, 0.58333], - "934": [0, 0.68333, 0, 0.08334, 0.66667], - "936": [0, 0.68333, 0.11, 0.05556, 0.61222], - "937": [0, 0.68333, 0.05017, 0.08334, 0.7724], - "945": [0, 0.43056, 0.0037, 0.02778, 0.6397], - "946": [0.19444, 0.69444, 0.05278, 0.08334, 0.56563], - "947": [0.19444, 0.43056, 0.05556, 0, 0.51773], - "948": [0, 0.69444, 0.03785, 0.05556, 0.44444], - "949": [0, 0.43056, 0, 0.08334, 0.46632], - "950": [0.19444, 0.69444, 0.07378, 0.08334, 0.4375], - "951": [0.19444, 0.43056, 0.03588, 0.05556, 0.49653], - "952": [0, 0.69444, 0.02778, 0.08334, 0.46944], - "953": [0, 0.43056, 0, 0.05556, 0.35394], - "954": [0, 0.43056, 0, 0, 0.57616], - "955": [0, 0.69444, 0, 0, 0.58334], - "956": [0.19444, 0.43056, 0, 0.02778, 0.60255], - "957": [0, 0.43056, 0.06366, 0.02778, 0.49398], - "958": [0.19444, 0.69444, 0.04601, 0.11111, 0.4375], - "959": [0, 0.43056, 0, 0.05556, 0.48472], - "960": [0, 0.43056, 0.03588, 0, 0.57003], - "961": [0.19444, 0.43056, 0, 0.08334, 0.51702], - "962": [0.09722, 0.43056, 0.07986, 0.08334, 0.36285], - "963": [0, 0.43056, 0.03588, 0, 0.57141], - "964": [0, 0.43056, 0.1132, 0.02778, 0.43715], - "965": [0, 0.43056, 0.03588, 0.02778, 0.54028], - "966": [0.19444, 0.43056, 0, 0.08334, 0.65417], - "967": [0.19444, 0.43056, 0, 0.05556, 0.62569], - "968": [0.19444, 0.69444, 0.03588, 0.11111, 0.65139], - "969": [0, 0.43056, 0.03588, 0, 0.62245], - "977": [0, 0.69444, 0, 0.08334, 0.59144], - "981": [0.19444, 0.69444, 0, 0.08334, 0.59583], - "982": [0, 0.43056, 0.02778, 0, 0.82813], - "1009": [0.19444, 0.43056, 0, 0.08334, 0.51702], - "1013": [0, 0.43056, 0, 0.05556, 0.4059], - "57649": [0, 0.43056, 0, 0.02778, 0.32246], - "57911": [0.19444, 0.43056, 0, 0.08334, 0.38403] - }, - "SansSerif-Bold": { - "32": [0, 0, 0, 0, 0.25], - "33": [0, 0.69444, 0, 0, 0.36667], - "34": [0, 0.69444, 0, 0, 0.55834], - "35": [0.19444, 0.69444, 0, 0, 0.91667], - "36": [0.05556, 0.75, 0, 0, 0.55], - "37": [0.05556, 0.75, 0, 0, 1.02912], - "38": [0, 0.69444, 0, 0, 0.83056], - "39": [0, 0.69444, 0, 0, 0.30556], - "40": [0.25, 0.75, 0, 0, 0.42778], - "41": [0.25, 0.75, 0, 0, 0.42778], - "42": [0, 0.75, 0, 0, 0.55], - "43": [0.11667, 0.61667, 0, 0, 0.85556], - "44": [0.10556, 0.13056, 0, 0, 0.30556], - "45": [0, 0.45833, 0, 0, 0.36667], - "46": [0, 0.13056, 0, 0, 0.30556], - "47": [0.25, 0.75, 0, 0, 0.55], - "48": [0, 0.69444, 0, 0, 0.55], - "49": [0, 0.69444, 0, 0, 0.55], - "50": [0, 0.69444, 0, 0, 0.55], - "51": [0, 0.69444, 0, 0, 0.55], - "52": [0, 0.69444, 0, 0, 0.55], - "53": [0, 0.69444, 0, 0, 0.55], - "54": [0, 0.69444, 0, 0, 0.55], - "55": [0, 0.69444, 0, 0, 0.55], - "56": [0, 0.69444, 0, 0, 0.55], - "57": [0, 0.69444, 0, 0, 0.55], - "58": [0, 0.45833, 0, 0, 0.30556], - "59": [0.10556, 0.45833, 0, 0, 0.30556], - "61": [-0.09375, 0.40625, 0, 0, 0.85556], - "63": [0, 0.69444, 0, 0, 0.51945], - "64": [0, 0.69444, 0, 0, 0.73334], - "65": [0, 0.69444, 0, 0, 0.73334], - "66": [0, 0.69444, 0, 0, 0.73334], - "67": [0, 0.69444, 0, 0, 0.70278], - "68": [0, 0.69444, 0, 0, 0.79445], - "69": [0, 0.69444, 0, 0, 0.64167], - "70": [0, 0.69444, 0, 0, 0.61111], - "71": [0, 0.69444, 0, 0, 0.73334], - "72": [0, 0.69444, 0, 0, 0.79445], - "73": [0, 0.69444, 0, 0, 0.33056], - "74": [0, 0.69444, 0, 0, 0.51945], - "75": [0, 0.69444, 0, 0, 0.76389], - "76": [0, 0.69444, 0, 0, 0.58056], - "77": [0, 0.69444, 0, 0, 0.97778], - "78": [0, 0.69444, 0, 0, 0.79445], - "79": [0, 0.69444, 0, 0, 0.79445], - "80": [0, 0.69444, 0, 0, 0.70278], - "81": [0.10556, 0.69444, 0, 0, 0.79445], - "82": [0, 0.69444, 0, 0, 0.70278], - "83": [0, 0.69444, 0, 0, 0.61111], - "84": [0, 0.69444, 0, 0, 0.73334], - "85": [0, 0.69444, 0, 0, 0.76389], - "86": [0, 0.69444, 0.01528, 0, 0.73334], - "87": [0, 0.69444, 0.01528, 0, 1.03889], - "88": [0, 0.69444, 0, 0, 0.73334], - "89": [0, 0.69444, 0.0275, 0, 0.73334], - "90": [0, 0.69444, 0, 0, 0.67223], - "91": [0.25, 0.75, 0, 0, 0.34306], - "93": [0.25, 0.75, 0, 0, 0.34306], - "94": [0, 0.69444, 0, 0, 0.55], - "95": [0.35, 0.10833, 0.03056, 0, 0.55], - "97": [0, 0.45833, 0, 0, 0.525], - "98": [0, 0.69444, 0, 0, 0.56111], - "99": [0, 0.45833, 0, 0, 0.48889], - "100": [0, 0.69444, 0, 0, 0.56111], - "101": [0, 0.45833, 0, 0, 0.51111], - "102": [0, 0.69444, 0.07639, 0, 0.33611], - "103": [0.19444, 0.45833, 0.01528, 0, 0.55], - "104": [0, 0.69444, 0, 0, 0.56111], - "105": [0, 0.69444, 0, 0, 0.25556], - "106": [0.19444, 0.69444, 0, 0, 0.28611], - "107": [0, 0.69444, 0, 0, 0.53056], - "108": [0, 0.69444, 0, 0, 0.25556], - "109": [0, 0.45833, 0, 0, 0.86667], - "110": [0, 0.45833, 0, 0, 0.56111], - "111": [0, 0.45833, 0, 0, 0.55], - "112": [0.19444, 0.45833, 0, 0, 0.56111], - "113": [0.19444, 0.45833, 0, 0, 0.56111], - "114": [0, 0.45833, 0.01528, 0, 0.37222], - "115": [0, 0.45833, 0, 0, 0.42167], - "116": [0, 0.58929, 0, 0, 0.40417], - "117": [0, 0.45833, 0, 0, 0.56111], - "118": [0, 0.45833, 0.01528, 0, 0.5], - "119": [0, 0.45833, 0.01528, 0, 0.74445], - "120": [0, 0.45833, 0, 0, 0.5], - "121": [0.19444, 0.45833, 0.01528, 0, 0.5], - "122": [0, 0.45833, 0, 0, 0.47639], - "126": [0.35, 0.34444, 0, 0, 0.55], - "160": [0, 0, 0, 0, 0.25], - "168": [0, 0.69444, 0, 0, 0.55], - "176": [0, 0.69444, 0, 0, 0.73334], - "180": [0, 0.69444, 0, 0, 0.55], - "184": [0.17014, 0, 0, 0, 0.48889], - "305": [0, 0.45833, 0, 0, 0.25556], - "567": [0.19444, 0.45833, 0, 0, 0.28611], - "710": [0, 0.69444, 0, 0, 0.55], - "711": [0, 0.63542, 0, 0, 0.55], - "713": [0, 0.63778, 0, 0, 0.55], - "728": [0, 0.69444, 0, 0, 0.55], - "729": [0, 0.69444, 0, 0, 0.30556], - "730": [0, 0.69444, 0, 0, 0.73334], - "732": [0, 0.69444, 0, 0, 0.55], - "733": [0, 0.69444, 0, 0, 0.55], - "915": [0, 0.69444, 0, 0, 0.58056], - "916": [0, 0.69444, 0, 0, 0.91667], - "920": [0, 0.69444, 0, 0, 0.85556], - "923": [0, 0.69444, 0, 0, 0.67223], - "926": [0, 0.69444, 0, 0, 0.73334], - "928": [0, 0.69444, 0, 0, 0.79445], - "931": [0, 0.69444, 0, 0, 0.79445], - "933": [0, 0.69444, 0, 0, 0.85556], - "934": [0, 0.69444, 0, 0, 0.79445], - "936": [0, 0.69444, 0, 0, 0.85556], - "937": [0, 0.69444, 0, 0, 0.79445], - "8211": [0, 0.45833, 0.03056, 0, 0.55], - "8212": [0, 0.45833, 0.03056, 0, 1.10001], - "8216": [0, 0.69444, 0, 0, 0.30556], - "8217": [0, 0.69444, 0, 0, 0.30556], - "8220": [0, 0.69444, 0, 0, 0.55834], - "8221": [0, 0.69444, 0, 0, 0.55834] - }, - "SansSerif-Italic": { - "32": [0, 0, 0, 0, 0.25], - "33": [0, 0.69444, 0.05733, 0, 0.31945], - "34": [0, 0.69444, 0.00316, 0, 0.5], - "35": [0.19444, 0.69444, 0.05087, 0, 0.83334], - "36": [0.05556, 0.75, 0.11156, 0, 0.5], - "37": [0.05556, 0.75, 0.03126, 0, 0.83334], - "38": [0, 0.69444, 0.03058, 0, 0.75834], - "39": [0, 0.69444, 0.07816, 0, 0.27778], - "40": [0.25, 0.75, 0.13164, 0, 0.38889], - "41": [0.25, 0.75, 0.02536, 0, 0.38889], - "42": [0, 0.75, 0.11775, 0, 0.5], - "43": [0.08333, 0.58333, 0.02536, 0, 0.77778], - "44": [0.125, 0.08333, 0, 0, 0.27778], - "45": [0, 0.44444, 0.01946, 0, 0.33333], - "46": [0, 0.08333, 0, 0, 0.27778], - "47": [0.25, 0.75, 0.13164, 0, 0.5], - "48": [0, 0.65556, 0.11156, 0, 0.5], - "49": [0, 0.65556, 0.11156, 0, 0.5], - "50": [0, 0.65556, 0.11156, 0, 0.5], - "51": [0, 0.65556, 0.11156, 0, 0.5], - "52": [0, 0.65556, 0.11156, 0, 0.5], - "53": [0, 0.65556, 0.11156, 0, 0.5], - "54": [0, 0.65556, 0.11156, 0, 0.5], - "55": [0, 0.65556, 0.11156, 0, 0.5], - "56": [0, 0.65556, 0.11156, 0, 0.5], - "57": [0, 0.65556, 0.11156, 0, 0.5], - "58": [0, 0.44444, 0.02502, 0, 0.27778], - "59": [0.125, 0.44444, 0.02502, 0, 0.27778], - "61": [-0.13, 0.37, 0.05087, 0, 0.77778], - "63": [0, 0.69444, 0.11809, 0, 0.47222], - "64": [0, 0.69444, 0.07555, 0, 0.66667], - "65": [0, 0.69444, 0, 0, 0.66667], - "66": [0, 0.69444, 0.08293, 0, 0.66667], - "67": [0, 0.69444, 0.11983, 0, 0.63889], - "68": [0, 0.69444, 0.07555, 0, 0.72223], - "69": [0, 0.69444, 0.11983, 0, 0.59722], - "70": [0, 0.69444, 0.13372, 0, 0.56945], - "71": [0, 0.69444, 0.11983, 0, 0.66667], - "72": [0, 0.69444, 0.08094, 0, 0.70834], - "73": [0, 0.69444, 0.13372, 0, 0.27778], - "74": [0, 0.69444, 0.08094, 0, 0.47222], - "75": [0, 0.69444, 0.11983, 0, 0.69445], - "76": [0, 0.69444, 0, 0, 0.54167], - "77": [0, 0.69444, 0.08094, 0, 0.875], - "78": [0, 0.69444, 0.08094, 0, 0.70834], - "79": [0, 0.69444, 0.07555, 0, 0.73611], - "80": [0, 0.69444, 0.08293, 0, 0.63889], - "81": [0.125, 0.69444, 0.07555, 0, 0.73611], - "82": [0, 0.69444, 0.08293, 0, 0.64584], - "83": [0, 0.69444, 0.09205, 0, 0.55556], - "84": [0, 0.69444, 0.13372, 0, 0.68056], - "85": [0, 0.69444, 0.08094, 0, 0.6875], - "86": [0, 0.69444, 0.1615, 0, 0.66667], - "87": [0, 0.69444, 0.1615, 0, 0.94445], - "88": [0, 0.69444, 0.13372, 0, 0.66667], - "89": [0, 0.69444, 0.17261, 0, 0.66667], - "90": [0, 0.69444, 0.11983, 0, 0.61111], - "91": [0.25, 0.75, 0.15942, 0, 0.28889], - "93": [0.25, 0.75, 0.08719, 0, 0.28889], - "94": [0, 0.69444, 0.0799, 0, 0.5], - "95": [0.35, 0.09444, 0.08616, 0, 0.5], - "97": [0, 0.44444, 0.00981, 0, 0.48056], - "98": [0, 0.69444, 0.03057, 0, 0.51667], - "99": [0, 0.44444, 0.08336, 0, 0.44445], - "100": [0, 0.69444, 0.09483, 0, 0.51667], - "101": [0, 0.44444, 0.06778, 0, 0.44445], - "102": [0, 0.69444, 0.21705, 0, 0.30556], - "103": [0.19444, 0.44444, 0.10836, 0, 0.5], - "104": [0, 0.69444, 0.01778, 0, 0.51667], - "105": [0, 0.67937, 0.09718, 0, 0.23889], - "106": [0.19444, 0.67937, 0.09162, 0, 0.26667], - "107": [0, 0.69444, 0.08336, 0, 0.48889], - "108": [0, 0.69444, 0.09483, 0, 0.23889], - "109": [0, 0.44444, 0.01778, 0, 0.79445], - "110": [0, 0.44444, 0.01778, 0, 0.51667], - "111": [0, 0.44444, 0.06613, 0, 0.5], - "112": [0.19444, 0.44444, 0.0389, 0, 0.51667], - "113": [0.19444, 0.44444, 0.04169, 0, 0.51667], - "114": [0, 0.44444, 0.10836, 0, 0.34167], - "115": [0, 0.44444, 0.0778, 0, 0.38333], - "116": [0, 0.57143, 0.07225, 0, 0.36111], - "117": [0, 0.44444, 0.04169, 0, 0.51667], - "118": [0, 0.44444, 0.10836, 0, 0.46111], - "119": [0, 0.44444, 0.10836, 0, 0.68334], - "120": [0, 0.44444, 0.09169, 0, 0.46111], - "121": [0.19444, 0.44444, 0.10836, 0, 0.46111], - "122": [0, 0.44444, 0.08752, 0, 0.43472], - "126": [0.35, 0.32659, 0.08826, 0, 0.5], - "160": [0, 0, 0, 0, 0.25], - "168": [0, 0.67937, 0.06385, 0, 0.5], - "176": [0, 0.69444, 0, 0, 0.73752], - "184": [0.17014, 0, 0, 0, 0.44445], - "305": [0, 0.44444, 0.04169, 0, 0.23889], - "567": [0.19444, 0.44444, 0.04169, 0, 0.26667], - "710": [0, 0.69444, 0.0799, 0, 0.5], - "711": [0, 0.63194, 0.08432, 0, 0.5], - "713": [0, 0.60889, 0.08776, 0, 0.5], - "714": [0, 0.69444, 0.09205, 0, 0.5], - "715": [0, 0.69444, 0, 0, 0.5], - "728": [0, 0.69444, 0.09483, 0, 0.5], - "729": [0, 0.67937, 0.07774, 0, 0.27778], - "730": [0, 0.69444, 0, 0, 0.73752], - "732": [0, 0.67659, 0.08826, 0, 0.5], - "733": [0, 0.69444, 0.09205, 0, 0.5], - "915": [0, 0.69444, 0.13372, 0, 0.54167], - "916": [0, 0.69444, 0, 0, 0.83334], - "920": [0, 0.69444, 0.07555, 0, 0.77778], - "923": [0, 0.69444, 0, 0, 0.61111], - "926": [0, 0.69444, 0.12816, 0, 0.66667], - "928": [0, 0.69444, 0.08094, 0, 0.70834], - "931": [0, 0.69444, 0.11983, 0, 0.72222], - "933": [0, 0.69444, 0.09031, 0, 0.77778], - "934": [0, 0.69444, 0.04603, 0, 0.72222], - "936": [0, 0.69444, 0.09031, 0, 0.77778], - "937": [0, 0.69444, 0.08293, 0, 0.72222], - "8211": [0, 0.44444, 0.08616, 0, 0.5], - "8212": [0, 0.44444, 0.08616, 0, 1.0], - "8216": [0, 0.69444, 0.07816, 0, 0.27778], - "8217": [0, 0.69444, 0.07816, 0, 0.27778], - "8220": [0, 0.69444, 0.14205, 0, 0.5], - "8221": [0, 0.69444, 0.00316, 0, 0.5] - }, - "SansSerif-Regular": { - "32": [0, 0, 0, 0, 0.25], - "33": [0, 0.69444, 0, 0, 0.31945], - "34": [0, 0.69444, 0, 0, 0.5], - "35": [0.19444, 0.69444, 0, 0, 0.83334], - "36": [0.05556, 0.75, 0, 0, 0.5], - "37": [0.05556, 0.75, 0, 0, 0.83334], - "38": [0, 0.69444, 0, 0, 0.75834], - "39": [0, 0.69444, 0, 0, 0.27778], - "40": [0.25, 0.75, 0, 0, 0.38889], - "41": [0.25, 0.75, 0, 0, 0.38889], - "42": [0, 0.75, 0, 0, 0.5], - "43": [0.08333, 0.58333, 0, 0, 0.77778], - "44": [0.125, 0.08333, 0, 0, 0.27778], - "45": [0, 0.44444, 0, 0, 0.33333], - "46": [0, 0.08333, 0, 0, 0.27778], - "47": [0.25, 0.75, 0, 0, 0.5], - "48": [0, 0.65556, 0, 0, 0.5], - "49": [0, 0.65556, 0, 0, 0.5], - "50": [0, 0.65556, 0, 0, 0.5], - "51": [0, 0.65556, 0, 0, 0.5], - "52": [0, 0.65556, 0, 0, 0.5], - "53": [0, 0.65556, 0, 0, 0.5], - "54": [0, 0.65556, 0, 0, 0.5], - "55": [0, 0.65556, 0, 0, 0.5], - "56": [0, 0.65556, 0, 0, 0.5], - "57": [0, 0.65556, 0, 0, 0.5], - "58": [0, 0.44444, 0, 0, 0.27778], - "59": [0.125, 0.44444, 0, 0, 0.27778], - "61": [-0.13, 0.37, 0, 0, 0.77778], - "63": [0, 0.69444, 0, 0, 0.47222], - "64": [0, 0.69444, 0, 0, 0.66667], - "65": [0, 0.69444, 0, 0, 0.66667], - "66": [0, 0.69444, 0, 0, 0.66667], - "67": [0, 0.69444, 0, 0, 0.63889], - "68": [0, 0.69444, 0, 0, 0.72223], - "69": [0, 0.69444, 0, 0, 0.59722], - "70": [0, 0.69444, 0, 0, 0.56945], - "71": [0, 0.69444, 0, 0, 0.66667], - "72": [0, 0.69444, 0, 0, 0.70834], - "73": [0, 0.69444, 0, 0, 0.27778], - "74": [0, 0.69444, 0, 0, 0.47222], - "75": [0, 0.69444, 0, 0, 0.69445], - "76": [0, 0.69444, 0, 0, 0.54167], - "77": [0, 0.69444, 0, 0, 0.875], - "78": [0, 0.69444, 0, 0, 0.70834], - "79": [0, 0.69444, 0, 0, 0.73611], - "80": [0, 0.69444, 0, 0, 0.63889], - "81": [0.125, 0.69444, 0, 0, 0.73611], - "82": [0, 0.69444, 0, 0, 0.64584], - "83": [0, 0.69444, 0, 0, 0.55556], - "84": [0, 0.69444, 0, 0, 0.68056], - "85": [0, 0.69444, 0, 0, 0.6875], - "86": [0, 0.69444, 0.01389, 0, 0.66667], - "87": [0, 0.69444, 0.01389, 0, 0.94445], - "88": [0, 0.69444, 0, 0, 0.66667], - "89": [0, 0.69444, 0.025, 0, 0.66667], - "90": [0, 0.69444, 0, 0, 0.61111], - "91": [0.25, 0.75, 0, 0, 0.28889], - "93": [0.25, 0.75, 0, 0, 0.28889], - "94": [0, 0.69444, 0, 0, 0.5], - "95": [0.35, 0.09444, 0.02778, 0, 0.5], - "97": [0, 0.44444, 0, 0, 0.48056], - "98": [0, 0.69444, 0, 0, 0.51667], - "99": [0, 0.44444, 0, 0, 0.44445], - "100": [0, 0.69444, 0, 0, 0.51667], - "101": [0, 0.44444, 0, 0, 0.44445], - "102": [0, 0.69444, 0.06944, 0, 0.30556], - "103": [0.19444, 0.44444, 0.01389, 0, 0.5], - "104": [0, 0.69444, 0, 0, 0.51667], - "105": [0, 0.67937, 0, 0, 0.23889], - "106": [0.19444, 0.67937, 0, 0, 0.26667], - "107": [0, 0.69444, 0, 0, 0.48889], - "108": [0, 0.69444, 0, 0, 0.23889], - "109": [0, 0.44444, 0, 0, 0.79445], - "110": [0, 0.44444, 0, 0, 0.51667], - "111": [0, 0.44444, 0, 0, 0.5], - "112": [0.19444, 0.44444, 0, 0, 0.51667], - "113": [0.19444, 0.44444, 0, 0, 0.51667], - "114": [0, 0.44444, 0.01389, 0, 0.34167], - "115": [0, 0.44444, 0, 0, 0.38333], - "116": [0, 0.57143, 0, 0, 0.36111], - "117": [0, 0.44444, 0, 0, 0.51667], - "118": [0, 0.44444, 0.01389, 0, 0.46111], - "119": [0, 0.44444, 0.01389, 0, 0.68334], - "120": [0, 0.44444, 0, 0, 0.46111], - "121": [0.19444, 0.44444, 0.01389, 0, 0.46111], - "122": [0, 0.44444, 0, 0, 0.43472], - "126": [0.35, 0.32659, 0, 0, 0.5], - "160": [0, 0, 0, 0, 0.25], - "168": [0, 0.67937, 0, 0, 0.5], - "176": [0, 0.69444, 0, 0, 0.66667], - "184": [0.17014, 0, 0, 0, 0.44445], - "305": [0, 0.44444, 0, 0, 0.23889], - "567": [0.19444, 0.44444, 0, 0, 0.26667], - "710": [0, 0.69444, 0, 0, 0.5], - "711": [0, 0.63194, 0, 0, 0.5], - "713": [0, 0.60889, 0, 0, 0.5], - "714": [0, 0.69444, 0, 0, 0.5], - "715": [0, 0.69444, 0, 0, 0.5], - "728": [0, 0.69444, 0, 0, 0.5], - "729": [0, 0.67937, 0, 0, 0.27778], - "730": [0, 0.69444, 0, 0, 0.66667], - "732": [0, 0.67659, 0, 0, 0.5], - "733": [0, 0.69444, 0, 0, 0.5], - "915": [0, 0.69444, 0, 0, 0.54167], - "916": [0, 0.69444, 0, 0, 0.83334], - "920": [0, 0.69444, 0, 0, 0.77778], - "923": [0, 0.69444, 0, 0, 0.61111], - "926": [0, 0.69444, 0, 0, 0.66667], - "928": [0, 0.69444, 0, 0, 0.70834], - "931": [0, 0.69444, 0, 0, 0.72222], - "933": [0, 0.69444, 0, 0, 0.77778], - "934": [0, 0.69444, 0, 0, 0.72222], - "936": [0, 0.69444, 0, 0, 0.77778], - "937": [0, 0.69444, 0, 0, 0.72222], - "8211": [0, 0.44444, 0.02778, 0, 0.5], - "8212": [0, 0.44444, 0.02778, 0, 1.0], - "8216": [0, 0.69444, 0, 0, 0.27778], - "8217": [0, 0.69444, 0, 0, 0.27778], - "8220": [0, 0.69444, 0, 0, 0.5], - "8221": [0, 0.69444, 0, 0, 0.5] - }, - "Script-Regular": { - "32": [0, 0, 0, 0, 0.25], - "65": [0, 0.7, 0.22925, 0, 0.80253], - "66": [0, 0.7, 0.04087, 0, 0.90757], - "67": [0, 0.7, 0.1689, 0, 0.66619], - "68": [0, 0.7, 0.09371, 0, 0.77443], - "69": [0, 0.7, 0.18583, 0, 0.56162], - "70": [0, 0.7, 0.13634, 0, 0.89544], - "71": [0, 0.7, 0.17322, 0, 0.60961], - "72": [0, 0.7, 0.29694, 0, 0.96919], - "73": [0, 0.7, 0.19189, 0, 0.80907], - "74": [0.27778, 0.7, 0.19189, 0, 1.05159], - "75": [0, 0.7, 0.31259, 0, 0.91364], - "76": [0, 0.7, 0.19189, 0, 0.87373], - "77": [0, 0.7, 0.15981, 0, 1.08031], - "78": [0, 0.7, 0.3525, 0, 0.9015], - "79": [0, 0.7, 0.08078, 0, 0.73787], - "80": [0, 0.7, 0.08078, 0, 1.01262], - "81": [0, 0.7, 0.03305, 0, 0.88282], - "82": [0, 0.7, 0.06259, 0, 0.85], - "83": [0, 0.7, 0.19189, 0, 0.86767], - "84": [0, 0.7, 0.29087, 0, 0.74697], - "85": [0, 0.7, 0.25815, 0, 0.79996], - "86": [0, 0.7, 0.27523, 0, 0.62204], - "87": [0, 0.7, 0.27523, 0, 0.80532], - "88": [0, 0.7, 0.26006, 0, 0.94445], - "89": [0, 0.7, 0.2939, 0, 0.70961], - "90": [0, 0.7, 0.24037, 0, 0.8212], - "160": [0, 0, 0, 0, 0.25] - }, - "Size1-Regular": { - "32": [0, 0, 0, 0, 0.25], - "40": [0.35001, 0.85, 0, 0, 0.45834], - "41": [0.35001, 0.85, 0, 0, 0.45834], - "47": [0.35001, 0.85, 0, 0, 0.57778], - "91": [0.35001, 0.85, 0, 0, 0.41667], - "92": [0.35001, 0.85, 0, 0, 0.57778], - "93": [0.35001, 0.85, 0, 0, 0.41667], - "123": [0.35001, 0.85, 0, 0, 0.58334], - "125": [0.35001, 0.85, 0, 0, 0.58334], - "160": [0, 0, 0, 0, 0.25], - "710": [0, 0.72222, 0, 0, 0.55556], - "732": [0, 0.72222, 0, 0, 0.55556], - "770": [0, 0.72222, 0, 0, 0.55556], - "771": [0, 0.72222, 0, 0, 0.55556], - "8214": [-0.00099, 0.601, 0, 0, 0.77778], - "8593": [1e-05, 0.6, 0, 0, 0.66667], - "8595": [1e-05, 0.6, 0, 0, 0.66667], - "8657": [1e-05, 0.6, 0, 0, 0.77778], - "8659": [1e-05, 0.6, 0, 0, 0.77778], - "8719": [0.25001, 0.75, 0, 0, 0.94445], - "8720": [0.25001, 0.75, 0, 0, 0.94445], - "8721": [0.25001, 0.75, 0, 0, 1.05556], - "8730": [0.35001, 0.85, 0, 0, 1.0], - "8739": [-0.00599, 0.606, 0, 0, 0.33333], - "8741": [-0.00599, 0.606, 0, 0, 0.55556], - "8747": [0.30612, 0.805, 0.19445, 0, 0.47222], - "8748": [0.306, 0.805, 0.19445, 0, 0.47222], - "8749": [0.306, 0.805, 0.19445, 0, 0.47222], - "8750": [0.30612, 0.805, 0.19445, 0, 0.47222], - "8896": [0.25001, 0.75, 0, 0, 0.83334], - "8897": [0.25001, 0.75, 0, 0, 0.83334], - "8898": [0.25001, 0.75, 0, 0, 0.83334], - "8899": [0.25001, 0.75, 0, 0, 0.83334], - "8968": [0.35001, 0.85, 0, 0, 0.47222], - "8969": [0.35001, 0.85, 0, 0, 0.47222], - "8970": [0.35001, 0.85, 0, 0, 0.47222], - "8971": [0.35001, 0.85, 0, 0, 0.47222], - "9168": [-0.00099, 0.601, 0, 0, 0.66667], - "10216": [0.35001, 0.85, 0, 0, 0.47222], - "10217": [0.35001, 0.85, 0, 0, 0.47222], - "10752": [0.25001, 0.75, 0, 0, 1.11111], - "10753": [0.25001, 0.75, 0, 0, 1.11111], - "10754": [0.25001, 0.75, 0, 0, 1.11111], - "10756": [0.25001, 0.75, 0, 0, 0.83334], - "10758": [0.25001, 0.75, 0, 0, 0.83334] - }, - "Size2-Regular": { - "32": [0, 0, 0, 0, 0.25], - "40": [0.65002, 1.15, 0, 0, 0.59722], - "41": [0.65002, 1.15, 0, 0, 0.59722], - "47": [0.65002, 1.15, 0, 0, 0.81111], - "91": [0.65002, 1.15, 0, 0, 0.47222], - "92": [0.65002, 1.15, 0, 0, 0.81111], - "93": [0.65002, 1.15, 0, 0, 0.47222], - "123": [0.65002, 1.15, 0, 0, 0.66667], - "125": [0.65002, 1.15, 0, 0, 0.66667], - "160": [0, 0, 0, 0, 0.25], - "710": [0, 0.75, 0, 0, 1.0], - "732": [0, 0.75, 0, 0, 1.0], - "770": [0, 0.75, 0, 0, 1.0], - "771": [0, 0.75, 0, 0, 1.0], - "8719": [0.55001, 1.05, 0, 0, 1.27778], - "8720": [0.55001, 1.05, 0, 0, 1.27778], - "8721": [0.55001, 1.05, 0, 0, 1.44445], - "8730": [0.65002, 1.15, 0, 0, 1.0], - "8747": [0.86225, 1.36, 0.44445, 0, 0.55556], - "8748": [0.862, 1.36, 0.44445, 0, 0.55556], - "8749": [0.862, 1.36, 0.44445, 0, 0.55556], - "8750": [0.86225, 1.36, 0.44445, 0, 0.55556], - "8896": [0.55001, 1.05, 0, 0, 1.11111], - "8897": [0.55001, 1.05, 0, 0, 1.11111], - "8898": [0.55001, 1.05, 0, 0, 1.11111], - "8899": [0.55001, 1.05, 0, 0, 1.11111], - "8968": [0.65002, 1.15, 0, 0, 0.52778], - "8969": [0.65002, 1.15, 0, 0, 0.52778], - "8970": [0.65002, 1.15, 0, 0, 0.52778], - "8971": [0.65002, 1.15, 0, 0, 0.52778], - "10216": [0.65002, 1.15, 0, 0, 0.61111], - "10217": [0.65002, 1.15, 0, 0, 0.61111], - "10752": [0.55001, 1.05, 0, 0, 1.51112], - "10753": [0.55001, 1.05, 0, 0, 1.51112], - "10754": [0.55001, 1.05, 0, 0, 1.51112], - "10756": [0.55001, 1.05, 0, 0, 1.11111], - "10758": [0.55001, 1.05, 0, 0, 1.11111] - }, - "Size3-Regular": { - "32": [0, 0, 0, 0, 0.25], - "40": [0.95003, 1.45, 0, 0, 0.73611], - "41": [0.95003, 1.45, 0, 0, 0.73611], - "47": [0.95003, 1.45, 0, 0, 1.04445], - "91": [0.95003, 1.45, 0, 0, 0.52778], - "92": [0.95003, 1.45, 0, 0, 1.04445], - "93": [0.95003, 1.45, 0, 0, 0.52778], - "123": [0.95003, 1.45, 0, 0, 0.75], - "125": [0.95003, 1.45, 0, 0, 0.75], - "160": [0, 0, 0, 0, 0.25], - "710": [0, 0.75, 0, 0, 1.44445], - "732": [0, 0.75, 0, 0, 1.44445], - "770": [0, 0.75, 0, 0, 1.44445], - "771": [0, 0.75, 0, 0, 1.44445], - "8730": [0.95003, 1.45, 0, 0, 1.0], - "8968": [0.95003, 1.45, 0, 0, 0.58334], - "8969": [0.95003, 1.45, 0, 0, 0.58334], - "8970": [0.95003, 1.45, 0, 0, 0.58334], - "8971": [0.95003, 1.45, 0, 0, 0.58334], - "10216": [0.95003, 1.45, 0, 0, 0.75], - "10217": [0.95003, 1.45, 0, 0, 0.75] - }, - "Size4-Regular": { - "32": [0, 0, 0, 0, 0.25], - "40": [1.25003, 1.75, 0, 0, 0.79167], - "41": [1.25003, 1.75, 0, 0, 0.79167], - "47": [1.25003, 1.75, 0, 0, 1.27778], - "91": [1.25003, 1.75, 0, 0, 0.58334], - "92": [1.25003, 1.75, 0, 0, 1.27778], - "93": [1.25003, 1.75, 0, 0, 0.58334], - "123": [1.25003, 1.75, 0, 0, 0.80556], - "125": [1.25003, 1.75, 0, 0, 0.80556], - "160": [0, 0, 0, 0, 0.25], - "710": [0, 0.825, 0, 0, 1.8889], - "732": [0, 0.825, 0, 0, 1.8889], - "770": [0, 0.825, 0, 0, 1.8889], - "771": [0, 0.825, 0, 0, 1.8889], - "8730": [1.25003, 1.75, 0, 0, 1.0], - "8968": [1.25003, 1.75, 0, 0, 0.63889], - "8969": [1.25003, 1.75, 0, 0, 0.63889], - "8970": [1.25003, 1.75, 0, 0, 0.63889], - "8971": [1.25003, 1.75, 0, 0, 0.63889], - "9115": [0.64502, 1.155, 0, 0, 0.875], - "9116": [1e-05, 0.6, 0, 0, 0.875], - "9117": [0.64502, 1.155, 0, 0, 0.875], - "9118": [0.64502, 1.155, 0, 0, 0.875], - "9119": [1e-05, 0.6, 0, 0, 0.875], - "9120": [0.64502, 1.155, 0, 0, 0.875], - "9121": [0.64502, 1.155, 0, 0, 0.66667], - "9122": [-0.00099, 0.601, 0, 0, 0.66667], - "9123": [0.64502, 1.155, 0, 0, 0.66667], - "9124": [0.64502, 1.155, 0, 0, 0.66667], - "9125": [-0.00099, 0.601, 0, 0, 0.66667], - "9126": [0.64502, 1.155, 0, 0, 0.66667], - "9127": [1e-05, 0.9, 0, 0, 0.88889], - "9128": [0.65002, 1.15, 0, 0, 0.88889], - "9129": [0.90001, 0, 0, 0, 0.88889], - "9130": [0, 0.3, 0, 0, 0.88889], - "9131": [1e-05, 0.9, 0, 0, 0.88889], - "9132": [0.65002, 1.15, 0, 0, 0.88889], - "9133": [0.90001, 0, 0, 0, 0.88889], - "9143": [0.88502, 0.915, 0, 0, 1.05556], - "10216": [1.25003, 1.75, 0, 0, 0.80556], - "10217": [1.25003, 1.75, 0, 0, 0.80556], - "57344": [-0.00499, 0.605, 0, 0, 1.05556], - "57345": [-0.00499, 0.605, 0, 0, 1.05556], - "57680": [0, 0.12, 0, 0, 0.45], - "57681": [0, 0.12, 0, 0, 0.45], - "57682": [0, 0.12, 0, 0, 0.45], - "57683": [0, 0.12, 0, 0, 0.45] - }, - "Typewriter-Regular": { - "32": [0, 0, 0, 0, 0.525], - "33": [0, 0.61111, 0, 0, 0.525], - "34": [0, 0.61111, 0, 0, 0.525], - "35": [0, 0.61111, 0, 0, 0.525], - "36": [0.08333, 0.69444, 0, 0, 0.525], - "37": [0.08333, 0.69444, 0, 0, 0.525], - "38": [0, 0.61111, 0, 0, 0.525], - "39": [0, 0.61111, 0, 0, 0.525], - "40": [0.08333, 0.69444, 0, 0, 0.525], - "41": [0.08333, 0.69444, 0, 0, 0.525], - "42": [0, 0.52083, 0, 0, 0.525], - "43": [-0.08056, 0.53055, 0, 0, 0.525], - "44": [0.13889, 0.125, 0, 0, 0.525], - "45": [-0.08056, 0.53055, 0, 0, 0.525], - "46": [0, 0.125, 0, 0, 0.525], - "47": [0.08333, 0.69444, 0, 0, 0.525], - "48": [0, 0.61111, 0, 0, 0.525], - "49": [0, 0.61111, 0, 0, 0.525], - "50": [0, 0.61111, 0, 0, 0.525], - "51": [0, 0.61111, 0, 0, 0.525], - "52": [0, 0.61111, 0, 0, 0.525], - "53": [0, 0.61111, 0, 0, 0.525], - "54": [0, 0.61111, 0, 0, 0.525], - "55": [0, 0.61111, 0, 0, 0.525], - "56": [0, 0.61111, 0, 0, 0.525], - "57": [0, 0.61111, 0, 0, 0.525], - "58": [0, 0.43056, 0, 0, 0.525], - "59": [0.13889, 0.43056, 0, 0, 0.525], - "60": [-0.05556, 0.55556, 0, 0, 0.525], - "61": [-0.19549, 0.41562, 0, 0, 0.525], - "62": [-0.05556, 0.55556, 0, 0, 0.525], - "63": [0, 0.61111, 0, 0, 0.525], - "64": [0, 0.61111, 0, 0, 0.525], - "65": [0, 0.61111, 0, 0, 0.525], - "66": [0, 0.61111, 0, 0, 0.525], - "67": [0, 0.61111, 0, 0, 0.525], - "68": [0, 0.61111, 0, 0, 0.525], - "69": [0, 0.61111, 0, 0, 0.525], - "70": [0, 0.61111, 0, 0, 0.525], - "71": [0, 0.61111, 0, 0, 0.525], - "72": [0, 0.61111, 0, 0, 0.525], - "73": [0, 0.61111, 0, 0, 0.525], - "74": [0, 0.61111, 0, 0, 0.525], - "75": [0, 0.61111, 0, 0, 0.525], - "76": [0, 0.61111, 0, 0, 0.525], - "77": [0, 0.61111, 0, 0, 0.525], - "78": [0, 0.61111, 0, 0, 0.525], - "79": [0, 0.61111, 0, 0, 0.525], - "80": [0, 0.61111, 0, 0, 0.525], - "81": [0.13889, 0.61111, 0, 0, 0.525], - "82": [0, 0.61111, 0, 0, 0.525], - "83": [0, 0.61111, 0, 0, 0.525], - "84": [0, 0.61111, 0, 0, 0.525], - "85": [0, 0.61111, 0, 0, 0.525], - "86": [0, 0.61111, 0, 0, 0.525], - "87": [0, 0.61111, 0, 0, 0.525], - "88": [0, 0.61111, 0, 0, 0.525], - "89": [0, 0.61111, 0, 0, 0.525], - "90": [0, 0.61111, 0, 0, 0.525], - "91": [0.08333, 0.69444, 0, 0, 0.525], - "92": [0.08333, 0.69444, 0, 0, 0.525], - "93": [0.08333, 0.69444, 0, 0, 0.525], - "94": [0, 0.61111, 0, 0, 0.525], - "95": [0.09514, 0, 0, 0, 0.525], - "96": [0, 0.61111, 0, 0, 0.525], - "97": [0, 0.43056, 0, 0, 0.525], - "98": [0, 0.61111, 0, 0, 0.525], - "99": [0, 0.43056, 0, 0, 0.525], - "100": [0, 0.61111, 0, 0, 0.525], - "101": [0, 0.43056, 0, 0, 0.525], - "102": [0, 0.61111, 0, 0, 0.525], - "103": [0.22222, 0.43056, 0, 0, 0.525], - "104": [0, 0.61111, 0, 0, 0.525], - "105": [0, 0.61111, 0, 0, 0.525], - "106": [0.22222, 0.61111, 0, 0, 0.525], - "107": [0, 0.61111, 0, 0, 0.525], - "108": [0, 0.61111, 0, 0, 0.525], - "109": [0, 0.43056, 0, 0, 0.525], - "110": [0, 0.43056, 0, 0, 0.525], - "111": [0, 0.43056, 0, 0, 0.525], - "112": [0.22222, 0.43056, 0, 0, 0.525], - "113": [0.22222, 0.43056, 0, 0, 0.525], - "114": [0, 0.43056, 0, 0, 0.525], - "115": [0, 0.43056, 0, 0, 0.525], - "116": [0, 0.55358, 0, 0, 0.525], - "117": [0, 0.43056, 0, 0, 0.525], - "118": [0, 0.43056, 0, 0, 0.525], - "119": [0, 0.43056, 0, 0, 0.525], - "120": [0, 0.43056, 0, 0, 0.525], - "121": [0.22222, 0.43056, 0, 0, 0.525], - "122": [0, 0.43056, 0, 0, 0.525], - "123": [0.08333, 0.69444, 0, 0, 0.525], - "124": [0.08333, 0.69444, 0, 0, 0.525], - "125": [0.08333, 0.69444, 0, 0, 0.525], - "126": [0, 0.61111, 0, 0, 0.525], - "127": [0, 0.61111, 0, 0, 0.525], - "160": [0, 0, 0, 0, 0.525], - "176": [0, 0.61111, 0, 0, 0.525], - "184": [0.19445, 0, 0, 0, 0.525], - "305": [0, 0.43056, 0, 0, 0.525], - "567": [0.22222, 0.43056, 0, 0, 0.525], - "711": [0, 0.56597, 0, 0, 0.525], - "713": [0, 0.56555, 0, 0, 0.525], - "714": [0, 0.61111, 0, 0, 0.525], - "715": [0, 0.61111, 0, 0, 0.525], - "728": [0, 0.61111, 0, 0, 0.525], - "730": [0, 0.61111, 0, 0, 0.525], - "770": [0, 0.61111, 0, 0, 0.525], - "771": [0, 0.61111, 0, 0, 0.525], - "776": [0, 0.61111, 0, 0, 0.525], - "915": [0, 0.61111, 0, 0, 0.525], - "916": [0, 0.61111, 0, 0, 0.525], - "920": [0, 0.61111, 0, 0, 0.525], - "923": [0, 0.61111, 0, 0, 0.525], - "926": [0, 0.61111, 0, 0, 0.525], - "928": [0, 0.61111, 0, 0, 0.525], - "931": [0, 0.61111, 0, 0, 0.525], - "933": [0, 0.61111, 0, 0, 0.525], - "934": [0, 0.61111, 0, 0, 0.525], - "936": [0, 0.61111, 0, 0, 0.525], - "937": [0, 0.61111, 0, 0, 0.525], - "8216": [0, 0.61111, 0, 0, 0.525], - "8217": [0, 0.61111, 0, 0, 0.525], - "8242": [0, 0.61111, 0, 0, 0.525], - "9251": [0.11111, 0.21944, 0, 0, 0.525] - } -}); -// CONCATENATED MODULE: ./src/fontMetrics.js - - -/** - * This file contains metrics regarding fonts and individual symbols. The sigma - * and xi variables, as well as the metricMap map contain data extracted from - * TeX, TeX font metrics, and the TTF files. These data are then exposed via the - * `metrics` variable and the getCharacterMetrics function. - */ -// In TeX, there are actually three sets of dimensions, one for each of -// textstyle (size index 5 and higher: >=9pt), scriptstyle (size index 3 and 4: -// 7-8pt), and scriptscriptstyle (size index 1 and 2: 5-6pt). These are -// provided in the the arrays below, in that order. -// -// The font metrics are stored in fonts cmsy10, cmsy7, and cmsy5 respsectively. -// This was determined by running the following script: -// -// latex -interaction=nonstopmode \ -// '\documentclass{article}\usepackage{amsmath}\begin{document}' \ -// '$a$ \expandafter\show\the\textfont2' \ -// '\expandafter\show\the\scriptfont2' \ -// '\expandafter\show\the\scriptscriptfont2' \ -// '\stop' -// -// The metrics themselves were retreived using the following commands: -// -// tftopl cmsy10 -// tftopl cmsy7 -// tftopl cmsy5 -// -// The output of each of these commands is quite lengthy. The only part we -// care about is the FONTDIMEN section. Each value is measured in EMs. -var sigmasAndXis = { - slant: [0.250, 0.250, 0.250], - // sigma1 - space: [0.000, 0.000, 0.000], - // sigma2 - stretch: [0.000, 0.000, 0.000], - // sigma3 - shrink: [0.000, 0.000, 0.000], - // sigma4 - xHeight: [0.431, 0.431, 0.431], - // sigma5 - quad: [1.000, 1.171, 1.472], - // sigma6 - extraSpace: [0.000, 0.000, 0.000], - // sigma7 - num1: [0.677, 0.732, 0.925], - // sigma8 - num2: [0.394, 0.384, 0.387], - // sigma9 - num3: [0.444, 0.471, 0.504], - // sigma10 - denom1: [0.686, 0.752, 1.025], - // sigma11 - denom2: [0.345, 0.344, 0.532], - // sigma12 - sup1: [0.413, 0.503, 0.504], - // sigma13 - sup2: [0.363, 0.431, 0.404], - // sigma14 - sup3: [0.289, 0.286, 0.294], - // sigma15 - sub1: [0.150, 0.143, 0.200], - // sigma16 - sub2: [0.247, 0.286, 0.400], - // sigma17 - supDrop: [0.386, 0.353, 0.494], - // sigma18 - subDrop: [0.050, 0.071, 0.100], - // sigma19 - delim1: [2.390, 1.700, 1.980], - // sigma20 - delim2: [1.010, 1.157, 1.420], - // sigma21 - axisHeight: [0.250, 0.250, 0.250], - // sigma22 - // These font metrics are extracted from TeX by using tftopl on cmex10.tfm; - // they correspond to the font parameters of the extension fonts (family 3). - // See the TeXbook, page 441. In AMSTeX, the extension fonts scale; to - // match cmex7, we'd use cmex7.tfm values for script and scriptscript - // values. - defaultRuleThickness: [0.04, 0.049, 0.049], - // xi8; cmex7: 0.049 - bigOpSpacing1: [0.111, 0.111, 0.111], - // xi9 - bigOpSpacing2: [0.166, 0.166, 0.166], - // xi10 - bigOpSpacing3: [0.2, 0.2, 0.2], - // xi11 - bigOpSpacing4: [0.6, 0.611, 0.611], - // xi12; cmex7: 0.611 - bigOpSpacing5: [0.1, 0.143, 0.143], - // xi13; cmex7: 0.143 - // The \sqrt rule width is taken from the height of the surd character. - // Since we use the same font at all sizes, this thickness doesn't scale. - sqrtRuleThickness: [0.04, 0.04, 0.04], - // This value determines how large a pt is, for metrics which are defined - // in terms of pts. - // This value is also used in katex.less; if you change it make sure the - // values match. - ptPerEm: [10.0, 10.0, 10.0], - // The space between adjacent `|` columns in an array definition. From - // `\showthe\doublerulesep` in LaTeX. Equals 2.0 / ptPerEm. - doubleRuleSep: [0.2, 0.2, 0.2], - // The width of separator lines in {array} environments. From - // `\showthe\arrayrulewidth` in LaTeX. Equals 0.4 / ptPerEm. - arrayRuleWidth: [0.04, 0.04, 0.04], - // Two values from LaTeX source2e: - fboxsep: [0.3, 0.3, 0.3], - // 3 pt / ptPerEm - fboxrule: [0.04, 0.04, 0.04] // 0.4 pt / ptPerEm - -}; // This map contains a mapping from font name and character code to character -// metrics, including height, depth, italic correction, and skew (kern from the -// character to the corresponding \skewchar) -// This map is generated via `make metrics`. It should not be changed manually. - - // These are very rough approximations. We default to Times New Roman which -// should have Latin-1 and Cyrillic characters, but may not depending on the -// operating system. The metrics do not account for extra height from the -// accents. In the case of Cyrillic characters which have both ascenders and -// descenders we prefer approximations with ascenders, primarily to prevent -// the fraction bar or root line from intersecting the glyph. -// TODO(kevinb) allow union of multiple glyph metrics for better accuracy. - -var extraCharacterMap = { - // Latin-1 - 'Å': 'A', - 'Ç': 'C', - 'Ð': 'D', - 'Þ': 'o', - 'å': 'a', - 'ç': 'c', - 'ð': 'd', - 'þ': 'o', - // Cyrillic - 'А': 'A', - 'Б': 'B', - 'В': 'B', - 'Г': 'F', - 'Д': 'A', - 'Е': 'E', - 'Ж': 'K', - 'З': '3', - 'И': 'N', - 'Й': 'N', - 'К': 'K', - 'Л': 'N', - 'М': 'M', - 'Н': 'H', - 'О': 'O', - 'П': 'N', - 'Р': 'P', - 'С': 'C', - 'Т': 'T', - 'У': 'y', - 'Ф': 'O', - 'Х': 'X', - 'Ц': 'U', - 'Ч': 'h', - 'Ш': 'W', - 'Щ': 'W', - 'Ъ': 'B', - 'Ы': 'X', - 'Ь': 'B', - 'Э': '3', - 'Ю': 'X', - 'Я': 'R', - 'а': 'a', - 'б': 'b', - 'в': 'a', - 'г': 'r', - 'д': 'y', - 'е': 'e', - 'ж': 'm', - 'з': 'e', - 'и': 'n', - 'й': 'n', - 'к': 'n', - 'л': 'n', - 'м': 'm', - 'н': 'n', - 'о': 'o', - 'п': 'n', - 'р': 'p', - 'с': 'c', - 'т': 'o', - 'у': 'y', - 'ф': 'b', - 'х': 'x', - 'ц': 'n', - 'ч': 'n', - 'ш': 'w', - 'щ': 'w', - 'ъ': 'a', - 'ы': 'm', - 'ь': 'a', - 'э': 'e', - 'ю': 'm', - 'я': 'r' -}; - -/** - * This function adds new font metrics to default metricMap - * It can also override existing metrics - */ -function setFontMetrics(fontName, metrics) { - fontMetricsData[fontName] = metrics; -} -/** - * This function is a convenience function for looking up information in the - * metricMap table. It takes a character as a string, and a font. - * - * Note: the `width` property may be undefined if fontMetricsData.js wasn't - * built using `Make extended_metrics`. - */ - -function getCharacterMetrics(character, font, mode) { - if (!fontMetricsData[font]) { - throw new Error("Font metrics not found for font: " + font + "."); - } - - var ch = character.charCodeAt(0); - var metrics = fontMetricsData[font][ch]; - - if (!metrics && character[0] in extraCharacterMap) { - ch = extraCharacterMap[character[0]].charCodeAt(0); - metrics = fontMetricsData[font][ch]; - } - - if (!metrics && mode === 'text') { - // We don't typically have font metrics for Asian scripts. - // But since we support them in text mode, we need to return - // some sort of metrics. - // So if the character is in a script we support but we - // don't have metrics for it, just use the metrics for - // the Latin capital letter M. This is close enough because - // we (currently) only care about the height of the glpyh - // not its width. - if (supportedCodepoint(ch)) { - metrics = fontMetricsData[font][77]; // 77 is the charcode for 'M' - } - } - - if (metrics) { - return { - depth: metrics[0], - height: metrics[1], - italic: metrics[2], - skew: metrics[3], - width: metrics[4] - }; - } -} -var fontMetricsBySizeIndex = {}; -/** - * Get the font metrics for a given size. - */ - -function getGlobalMetrics(size) { - var sizeIndex; - - if (size >= 5) { - sizeIndex = 0; - } else if (size >= 3) { - sizeIndex = 1; - } else { - sizeIndex = 2; - } - - if (!fontMetricsBySizeIndex[sizeIndex]) { - var metrics = fontMetricsBySizeIndex[sizeIndex] = { - cssEmPerMu: sigmasAndXis.quad[sizeIndex] / 18 - }; - - for (var key in sigmasAndXis) { - if (sigmasAndXis.hasOwnProperty(key)) { - metrics[key] = sigmasAndXis[key][sizeIndex]; - } - } - } - - return fontMetricsBySizeIndex[sizeIndex]; -} -// CONCATENATED MODULE: ./src/symbols.js -/** - * This file holds a list of all no-argument functions and single-character - * symbols (like 'a' or ';'). - * - * For each of the symbols, there are three properties they can have: - * - font (required): the font to be used for this symbol. Either "main" (the - normal font), or "ams" (the ams fonts). - * - group (required): the ParseNode group type the symbol should have (i.e. - "textord", "mathord", etc). - See https://github.com/KaTeX/KaTeX/wiki/Examining-TeX#group-types - * - replace: the character that this symbol or function should be - * replaced with (i.e. "\phi" has a replace value of "\u03d5", the phi - * character in the main font). - * - * The outermost map in the table indicates what mode the symbols should be - * accepted in (e.g. "math" or "text"). - */ -// Some of these have a "-token" suffix since these are also used as `ParseNode` -// types for raw text tokens, and we want to avoid conflicts with higher-level -// `ParseNode` types. These `ParseNode`s are constructed within `Parser` by -// looking up the `symbols` map. -var ATOMS = { - "bin": 1, - "close": 1, - "inner": 1, - "open": 1, - "punct": 1, - "rel": 1 -}; -var NON_ATOMS = { - "accent-token": 1, - "mathord": 1, - "op-token": 1, - "spacing": 1, - "textord": 1 -}; -var symbols = { - "math": {}, - "text": {} -}; -/* harmony default export */ var src_symbols = (symbols); -/** `acceptUnicodeChar = true` is only applicable if `replace` is set. */ - -function defineSymbol(mode, font, group, replace, name, acceptUnicodeChar) { - symbols[mode][name] = { - font: font, - group: group, - replace: replace - }; - - if (acceptUnicodeChar && replace) { - symbols[mode][replace] = symbols[mode][name]; - } -} // Some abbreviations for commonly used strings. -// This helps minify the code, and also spotting typos using jshint. -// modes: - -var symbols_math = "math"; -var symbols_text = "text"; // fonts: - -var main = "main"; -var ams = "ams"; // groups: - -var symbols_accent = "accent-token"; -var bin = "bin"; -var symbols_close = "close"; -var symbols_inner = "inner"; -var mathord = "mathord"; -var op = "op-token"; -var symbols_open = "open"; -var punct = "punct"; -var rel = "rel"; -var symbols_spacing = "spacing"; -var symbols_textord = "textord"; // Now comes the symbol table -// Relation Symbols - -defineSymbol(symbols_math, main, rel, "\u2261", "\\equiv", true); -defineSymbol(symbols_math, main, rel, "\u227A", "\\prec", true); -defineSymbol(symbols_math, main, rel, "\u227B", "\\succ", true); -defineSymbol(symbols_math, main, rel, "\u223C", "\\sim", true); -defineSymbol(symbols_math, main, rel, "\u22A5", "\\perp"); -defineSymbol(symbols_math, main, rel, "\u2AAF", "\\preceq", true); -defineSymbol(symbols_math, main, rel, "\u2AB0", "\\succeq", true); -defineSymbol(symbols_math, main, rel, "\u2243", "\\simeq", true); -defineSymbol(symbols_math, main, rel, "\u2223", "\\mid", true); -defineSymbol(symbols_math, main, rel, "\u226A", "\\ll", true); -defineSymbol(symbols_math, main, rel, "\u226B", "\\gg", true); -defineSymbol(symbols_math, main, rel, "\u224D", "\\asymp", true); -defineSymbol(symbols_math, main, rel, "\u2225", "\\parallel"); -defineSymbol(symbols_math, main, rel, "\u22C8", "\\bowtie", true); -defineSymbol(symbols_math, main, rel, "\u2323", "\\smile", true); -defineSymbol(symbols_math, main, rel, "\u2291", "\\sqsubseteq", true); -defineSymbol(symbols_math, main, rel, "\u2292", "\\sqsupseteq", true); -defineSymbol(symbols_math, main, rel, "\u2250", "\\doteq", true); -defineSymbol(symbols_math, main, rel, "\u2322", "\\frown", true); -defineSymbol(symbols_math, main, rel, "\u220B", "\\ni", true); -defineSymbol(symbols_math, main, rel, "\u221D", "\\propto", true); -defineSymbol(symbols_math, main, rel, "\u22A2", "\\vdash", true); -defineSymbol(symbols_math, main, rel, "\u22A3", "\\dashv", true); -defineSymbol(symbols_math, main, rel, "\u220B", "\\owns"); // Punctuation - -defineSymbol(symbols_math, main, punct, ".", "\\ldotp"); -defineSymbol(symbols_math, main, punct, "\u22C5", "\\cdotp"); // Misc Symbols - -defineSymbol(symbols_math, main, symbols_textord, "#", "\\#"); -defineSymbol(symbols_text, main, symbols_textord, "#", "\\#"); -defineSymbol(symbols_math, main, symbols_textord, "&", "\\&"); -defineSymbol(symbols_text, main, symbols_textord, "&", "\\&"); -defineSymbol(symbols_math, main, symbols_textord, "\u2135", "\\aleph", true); -defineSymbol(symbols_math, main, symbols_textord, "\u2200", "\\forall", true); -defineSymbol(symbols_math, main, symbols_textord, "\u210F", "\\hbar", true); -defineSymbol(symbols_math, main, symbols_textord, "\u2203", "\\exists", true); -defineSymbol(symbols_math, main, symbols_textord, "\u2207", "\\nabla", true); -defineSymbol(symbols_math, main, symbols_textord, "\u266D", "\\flat", true); -defineSymbol(symbols_math, main, symbols_textord, "\u2113", "\\ell", true); -defineSymbol(symbols_math, main, symbols_textord, "\u266E", "\\natural", true); -defineSymbol(symbols_math, main, symbols_textord, "\u2663", "\\clubsuit", true); -defineSymbol(symbols_math, main, symbols_textord, "\u2118", "\\wp", true); -defineSymbol(symbols_math, main, symbols_textord, "\u266F", "\\sharp", true); -defineSymbol(symbols_math, main, symbols_textord, "\u2662", "\\diamondsuit", true); -defineSymbol(symbols_math, main, symbols_textord, "\u211C", "\\Re", true); -defineSymbol(symbols_math, main, symbols_textord, "\u2661", "\\heartsuit", true); -defineSymbol(symbols_math, main, symbols_textord, "\u2111", "\\Im", true); -defineSymbol(symbols_math, main, symbols_textord, "\u2660", "\\spadesuit", true); -defineSymbol(symbols_text, main, symbols_textord, "\xA7", "\\S", true); -defineSymbol(symbols_text, main, symbols_textord, "\xB6", "\\P", true); // Math and Text - -defineSymbol(symbols_math, main, symbols_textord, "\u2020", "\\dag"); -defineSymbol(symbols_text, main, symbols_textord, "\u2020", "\\dag"); -defineSymbol(symbols_text, main, symbols_textord, "\u2020", "\\textdagger"); -defineSymbol(symbols_math, main, symbols_textord, "\u2021", "\\ddag"); -defineSymbol(symbols_text, main, symbols_textord, "\u2021", "\\ddag"); -defineSymbol(symbols_text, main, symbols_textord, "\u2021", "\\textdaggerdbl"); // Large Delimiters - -defineSymbol(symbols_math, main, symbols_close, "\u23B1", "\\rmoustache", true); -defineSymbol(symbols_math, main, symbols_open, "\u23B0", "\\lmoustache", true); -defineSymbol(symbols_math, main, symbols_close, "\u27EF", "\\rgroup", true); -defineSymbol(symbols_math, main, symbols_open, "\u27EE", "\\lgroup", true); // Binary Operators - -defineSymbol(symbols_math, main, bin, "\u2213", "\\mp", true); -defineSymbol(symbols_math, main, bin, "\u2296", "\\ominus", true); -defineSymbol(symbols_math, main, bin, "\u228E", "\\uplus", true); -defineSymbol(symbols_math, main, bin, "\u2293", "\\sqcap", true); -defineSymbol(symbols_math, main, bin, "\u2217", "\\ast"); -defineSymbol(symbols_math, main, bin, "\u2294", "\\sqcup", true); -defineSymbol(symbols_math, main, bin, "\u25EF", "\\bigcirc"); -defineSymbol(symbols_math, main, bin, "\u2219", "\\bullet"); -defineSymbol(symbols_math, main, bin, "\u2021", "\\ddagger"); -defineSymbol(symbols_math, main, bin, "\u2240", "\\wr", true); -defineSymbol(symbols_math, main, bin, "\u2A3F", "\\amalg"); -defineSymbol(symbols_math, main, bin, "&", "\\And"); // from amsmath -// Arrow Symbols - -defineSymbol(symbols_math, main, rel, "\u27F5", "\\longleftarrow", true); -defineSymbol(symbols_math, main, rel, "\u21D0", "\\Leftarrow", true); -defineSymbol(symbols_math, main, rel, "\u27F8", "\\Longleftarrow", true); -defineSymbol(symbols_math, main, rel, "\u27F6", "\\longrightarrow", true); -defineSymbol(symbols_math, main, rel, "\u21D2", "\\Rightarrow", true); -defineSymbol(symbols_math, main, rel, "\u27F9", "\\Longrightarrow", true); -defineSymbol(symbols_math, main, rel, "\u2194", "\\leftrightarrow", true); -defineSymbol(symbols_math, main, rel, "\u27F7", "\\longleftrightarrow", true); -defineSymbol(symbols_math, main, rel, "\u21D4", "\\Leftrightarrow", true); -defineSymbol(symbols_math, main, rel, "\u27FA", "\\Longleftrightarrow", true); -defineSymbol(symbols_math, main, rel, "\u21A6", "\\mapsto", true); -defineSymbol(symbols_math, main, rel, "\u27FC", "\\longmapsto", true); -defineSymbol(symbols_math, main, rel, "\u2197", "\\nearrow", true); -defineSymbol(symbols_math, main, rel, "\u21A9", "\\hookleftarrow", true); -defineSymbol(symbols_math, main, rel, "\u21AA", "\\hookrightarrow", true); -defineSymbol(symbols_math, main, rel, "\u2198", "\\searrow", true); -defineSymbol(symbols_math, main, rel, "\u21BC", "\\leftharpoonup", true); -defineSymbol(symbols_math, main, rel, "\u21C0", "\\rightharpoonup", true); -defineSymbol(symbols_math, main, rel, "\u2199", "\\swarrow", true); -defineSymbol(symbols_math, main, rel, "\u21BD", "\\leftharpoondown", true); -defineSymbol(symbols_math, main, rel, "\u21C1", "\\rightharpoondown", true); -defineSymbol(symbols_math, main, rel, "\u2196", "\\nwarrow", true); -defineSymbol(symbols_math, main, rel, "\u21CC", "\\rightleftharpoons", true); // AMS Negated Binary Relations - -defineSymbol(symbols_math, ams, rel, "\u226E", "\\nless", true); // Symbol names preceeded by "@" each have a corresponding macro. - -defineSymbol(symbols_math, ams, rel, "\uE010", "\\@nleqslant"); -defineSymbol(symbols_math, ams, rel, "\uE011", "\\@nleqq"); -defineSymbol(symbols_math, ams, rel, "\u2A87", "\\lneq", true); -defineSymbol(symbols_math, ams, rel, "\u2268", "\\lneqq", true); -defineSymbol(symbols_math, ams, rel, "\uE00C", "\\@lvertneqq"); -defineSymbol(symbols_math, ams, rel, "\u22E6", "\\lnsim", true); -defineSymbol(symbols_math, ams, rel, "\u2A89", "\\lnapprox", true); -defineSymbol(symbols_math, ams, rel, "\u2280", "\\nprec", true); // unicode-math maps \u22e0 to \npreccurlyeq. We'll use the AMS synonym. - -defineSymbol(symbols_math, ams, rel, "\u22E0", "\\npreceq", true); -defineSymbol(symbols_math, ams, rel, "\u22E8", "\\precnsim", true); -defineSymbol(symbols_math, ams, rel, "\u2AB9", "\\precnapprox", true); -defineSymbol(symbols_math, ams, rel, "\u2241", "\\nsim", true); -defineSymbol(symbols_math, ams, rel, "\uE006", "\\@nshortmid"); -defineSymbol(symbols_math, ams, rel, "\u2224", "\\nmid", true); -defineSymbol(symbols_math, ams, rel, "\u22AC", "\\nvdash", true); -defineSymbol(symbols_math, ams, rel, "\u22AD", "\\nvDash", true); -defineSymbol(symbols_math, ams, rel, "\u22EA", "\\ntriangleleft"); -defineSymbol(symbols_math, ams, rel, "\u22EC", "\\ntrianglelefteq", true); -defineSymbol(symbols_math, ams, rel, "\u228A", "\\subsetneq", true); -defineSymbol(symbols_math, ams, rel, "\uE01A", "\\@varsubsetneq"); -defineSymbol(symbols_math, ams, rel, "\u2ACB", "\\subsetneqq", true); -defineSymbol(symbols_math, ams, rel, "\uE017", "\\@varsubsetneqq"); -defineSymbol(symbols_math, ams, rel, "\u226F", "\\ngtr", true); -defineSymbol(symbols_math, ams, rel, "\uE00F", "\\@ngeqslant"); -defineSymbol(symbols_math, ams, rel, "\uE00E", "\\@ngeqq"); -defineSymbol(symbols_math, ams, rel, "\u2A88", "\\gneq", true); -defineSymbol(symbols_math, ams, rel, "\u2269", "\\gneqq", true); -defineSymbol(symbols_math, ams, rel, "\uE00D", "\\@gvertneqq"); -defineSymbol(symbols_math, ams, rel, "\u22E7", "\\gnsim", true); -defineSymbol(symbols_math, ams, rel, "\u2A8A", "\\gnapprox", true); -defineSymbol(symbols_math, ams, rel, "\u2281", "\\nsucc", true); // unicode-math maps \u22e1 to \nsucccurlyeq. We'll use the AMS synonym. - -defineSymbol(symbols_math, ams, rel, "\u22E1", "\\nsucceq", true); -defineSymbol(symbols_math, ams, rel, "\u22E9", "\\succnsim", true); -defineSymbol(symbols_math, ams, rel, "\u2ABA", "\\succnapprox", true); // unicode-math maps \u2246 to \simneqq. We'll use the AMS synonym. - -defineSymbol(symbols_math, ams, rel, "\u2246", "\\ncong", true); -defineSymbol(symbols_math, ams, rel, "\uE007", "\\@nshortparallel"); -defineSymbol(symbols_math, ams, rel, "\u2226", "\\nparallel", true); -defineSymbol(symbols_math, ams, rel, "\u22AF", "\\nVDash", true); -defineSymbol(symbols_math, ams, rel, "\u22EB", "\\ntriangleright"); -defineSymbol(symbols_math, ams, rel, "\u22ED", "\\ntrianglerighteq", true); -defineSymbol(symbols_math, ams, rel, "\uE018", "\\@nsupseteqq"); -defineSymbol(symbols_math, ams, rel, "\u228B", "\\supsetneq", true); -defineSymbol(symbols_math, ams, rel, "\uE01B", "\\@varsupsetneq"); -defineSymbol(symbols_math, ams, rel, "\u2ACC", "\\supsetneqq", true); -defineSymbol(symbols_math, ams, rel, "\uE019", "\\@varsupsetneqq"); -defineSymbol(symbols_math, ams, rel, "\u22AE", "\\nVdash", true); -defineSymbol(symbols_math, ams, rel, "\u2AB5", "\\precneqq", true); -defineSymbol(symbols_math, ams, rel, "\u2AB6", "\\succneqq", true); -defineSymbol(symbols_math, ams, rel, "\uE016", "\\@nsubseteqq"); -defineSymbol(symbols_math, ams, bin, "\u22B4", "\\unlhd"); -defineSymbol(symbols_math, ams, bin, "\u22B5", "\\unrhd"); // AMS Negated Arrows - -defineSymbol(symbols_math, ams, rel, "\u219A", "\\nleftarrow", true); -defineSymbol(symbols_math, ams, rel, "\u219B", "\\nrightarrow", true); -defineSymbol(symbols_math, ams, rel, "\u21CD", "\\nLeftarrow", true); -defineSymbol(symbols_math, ams, rel, "\u21CF", "\\nRightarrow", true); -defineSymbol(symbols_math, ams, rel, "\u21AE", "\\nleftrightarrow", true); -defineSymbol(symbols_math, ams, rel, "\u21CE", "\\nLeftrightarrow", true); // AMS Misc - -defineSymbol(symbols_math, ams, rel, "\u25B3", "\\vartriangle"); -defineSymbol(symbols_math, ams, symbols_textord, "\u210F", "\\hslash"); -defineSymbol(symbols_math, ams, symbols_textord, "\u25BD", "\\triangledown"); -defineSymbol(symbols_math, ams, symbols_textord, "\u25CA", "\\lozenge"); -defineSymbol(symbols_math, ams, symbols_textord, "\u24C8", "\\circledS"); -defineSymbol(symbols_math, ams, symbols_textord, "\xAE", "\\circledR"); -defineSymbol(symbols_text, ams, symbols_textord, "\xAE", "\\circledR"); -defineSymbol(symbols_math, ams, symbols_textord, "\u2221", "\\measuredangle", true); -defineSymbol(symbols_math, ams, symbols_textord, "\u2204", "\\nexists"); -defineSymbol(symbols_math, ams, symbols_textord, "\u2127", "\\mho"); -defineSymbol(symbols_math, ams, symbols_textord, "\u2132", "\\Finv", true); -defineSymbol(symbols_math, ams, symbols_textord, "\u2141", "\\Game", true); -defineSymbol(symbols_math, ams, symbols_textord, "\u2035", "\\backprime"); -defineSymbol(symbols_math, ams, symbols_textord, "\u25B2", "\\blacktriangle"); -defineSymbol(symbols_math, ams, symbols_textord, "\u25BC", "\\blacktriangledown"); -defineSymbol(symbols_math, ams, symbols_textord, "\u25A0", "\\blacksquare"); -defineSymbol(symbols_math, ams, symbols_textord, "\u29EB", "\\blacklozenge"); -defineSymbol(symbols_math, ams, symbols_textord, "\u2605", "\\bigstar"); -defineSymbol(symbols_math, ams, symbols_textord, "\u2222", "\\sphericalangle", true); -defineSymbol(symbols_math, ams, symbols_textord, "\u2201", "\\complement", true); // unicode-math maps U+F0 to \matheth. We map to AMS function \eth - -defineSymbol(symbols_math, ams, symbols_textord, "\xF0", "\\eth", true); -defineSymbol(symbols_text, main, symbols_textord, "\xF0", "\xF0"); -defineSymbol(symbols_math, ams, symbols_textord, "\u2571", "\\diagup"); -defineSymbol(symbols_math, ams, symbols_textord, "\u2572", "\\diagdown"); -defineSymbol(symbols_math, ams, symbols_textord, "\u25A1", "\\square"); -defineSymbol(symbols_math, ams, symbols_textord, "\u25A1", "\\Box"); -defineSymbol(symbols_math, ams, symbols_textord, "\u25CA", "\\Diamond"); // unicode-math maps U+A5 to \mathyen. We map to AMS function \yen - -defineSymbol(symbols_math, ams, symbols_textord, "\xA5", "\\yen", true); -defineSymbol(symbols_text, ams, symbols_textord, "\xA5", "\\yen", true); -defineSymbol(symbols_math, ams, symbols_textord, "\u2713", "\\checkmark", true); -defineSymbol(symbols_text, ams, symbols_textord, "\u2713", "\\checkmark"); // AMS Hebrew - -defineSymbol(symbols_math, ams, symbols_textord, "\u2136", "\\beth", true); -defineSymbol(symbols_math, ams, symbols_textord, "\u2138", "\\daleth", true); -defineSymbol(symbols_math, ams, symbols_textord, "\u2137", "\\gimel", true); // AMS Greek - -defineSymbol(symbols_math, ams, symbols_textord, "\u03DD", "\\digamma", true); -defineSymbol(symbols_math, ams, symbols_textord, "\u03F0", "\\varkappa"); // AMS Delimiters - -defineSymbol(symbols_math, ams, symbols_open, "\u250C", "\\@ulcorner", true); -defineSymbol(symbols_math, ams, symbols_close, "\u2510", "\\@urcorner", true); -defineSymbol(symbols_math, ams, symbols_open, "\u2514", "\\@llcorner", true); -defineSymbol(symbols_math, ams, symbols_close, "\u2518", "\\@lrcorner", true); // AMS Binary Relations - -defineSymbol(symbols_math, ams, rel, "\u2266", "\\leqq", true); -defineSymbol(symbols_math, ams, rel, "\u2A7D", "\\leqslant", true); -defineSymbol(symbols_math, ams, rel, "\u2A95", "\\eqslantless", true); -defineSymbol(symbols_math, ams, rel, "\u2272", "\\lesssim", true); -defineSymbol(symbols_math, ams, rel, "\u2A85", "\\lessapprox", true); -defineSymbol(symbols_math, ams, rel, "\u224A", "\\approxeq", true); -defineSymbol(symbols_math, ams, bin, "\u22D6", "\\lessdot"); -defineSymbol(symbols_math, ams, rel, "\u22D8", "\\lll", true); -defineSymbol(symbols_math, ams, rel, "\u2276", "\\lessgtr", true); -defineSymbol(symbols_math, ams, rel, "\u22DA", "\\lesseqgtr", true); -defineSymbol(symbols_math, ams, rel, "\u2A8B", "\\lesseqqgtr", true); -defineSymbol(symbols_math, ams, rel, "\u2251", "\\doteqdot"); -defineSymbol(symbols_math, ams, rel, "\u2253", "\\risingdotseq", true); -defineSymbol(symbols_math, ams, rel, "\u2252", "\\fallingdotseq", true); -defineSymbol(symbols_math, ams, rel, "\u223D", "\\backsim", true); -defineSymbol(symbols_math, ams, rel, "\u22CD", "\\backsimeq", true); -defineSymbol(symbols_math, ams, rel, "\u2AC5", "\\subseteqq", true); -defineSymbol(symbols_math, ams, rel, "\u22D0", "\\Subset", true); -defineSymbol(symbols_math, ams, rel, "\u228F", "\\sqsubset", true); -defineSymbol(symbols_math, ams, rel, "\u227C", "\\preccurlyeq", true); -defineSymbol(symbols_math, ams, rel, "\u22DE", "\\curlyeqprec", true); -defineSymbol(symbols_math, ams, rel, "\u227E", "\\precsim", true); -defineSymbol(symbols_math, ams, rel, "\u2AB7", "\\precapprox", true); -defineSymbol(symbols_math, ams, rel, "\u22B2", "\\vartriangleleft"); -defineSymbol(symbols_math, ams, rel, "\u22B4", "\\trianglelefteq"); -defineSymbol(symbols_math, ams, rel, "\u22A8", "\\vDash", true); -defineSymbol(symbols_math, ams, rel, "\u22AA", "\\Vvdash", true); -defineSymbol(symbols_math, ams, rel, "\u2323", "\\smallsmile"); -defineSymbol(symbols_math, ams, rel, "\u2322", "\\smallfrown"); -defineSymbol(symbols_math, ams, rel, "\u224F", "\\bumpeq", true); -defineSymbol(symbols_math, ams, rel, "\u224E", "\\Bumpeq", true); -defineSymbol(symbols_math, ams, rel, "\u2267", "\\geqq", true); -defineSymbol(symbols_math, ams, rel, "\u2A7E", "\\geqslant", true); -defineSymbol(symbols_math, ams, rel, "\u2A96", "\\eqslantgtr", true); -defineSymbol(symbols_math, ams, rel, "\u2273", "\\gtrsim", true); -defineSymbol(symbols_math, ams, rel, "\u2A86", "\\gtrapprox", true); -defineSymbol(symbols_math, ams, bin, "\u22D7", "\\gtrdot"); -defineSymbol(symbols_math, ams, rel, "\u22D9", "\\ggg", true); -defineSymbol(symbols_math, ams, rel, "\u2277", "\\gtrless", true); -defineSymbol(symbols_math, ams, rel, "\u22DB", "\\gtreqless", true); -defineSymbol(symbols_math, ams, rel, "\u2A8C", "\\gtreqqless", true); -defineSymbol(symbols_math, ams, rel, "\u2256", "\\eqcirc", true); -defineSymbol(symbols_math, ams, rel, "\u2257", "\\circeq", true); -defineSymbol(symbols_math, ams, rel, "\u225C", "\\triangleq", true); -defineSymbol(symbols_math, ams, rel, "\u223C", "\\thicksim"); -defineSymbol(symbols_math, ams, rel, "\u2248", "\\thickapprox"); -defineSymbol(symbols_math, ams, rel, "\u2AC6", "\\supseteqq", true); -defineSymbol(symbols_math, ams, rel, "\u22D1", "\\Supset", true); -defineSymbol(symbols_math, ams, rel, "\u2290", "\\sqsupset", true); -defineSymbol(symbols_math, ams, rel, "\u227D", "\\succcurlyeq", true); -defineSymbol(symbols_math, ams, rel, "\u22DF", "\\curlyeqsucc", true); -defineSymbol(symbols_math, ams, rel, "\u227F", "\\succsim", true); -defineSymbol(symbols_math, ams, rel, "\u2AB8", "\\succapprox", true); -defineSymbol(symbols_math, ams, rel, "\u22B3", "\\vartriangleright"); -defineSymbol(symbols_math, ams, rel, "\u22B5", "\\trianglerighteq"); -defineSymbol(symbols_math, ams, rel, "\u22A9", "\\Vdash", true); -defineSymbol(symbols_math, ams, rel, "\u2223", "\\shortmid"); -defineSymbol(symbols_math, ams, rel, "\u2225", "\\shortparallel"); -defineSymbol(symbols_math, ams, rel, "\u226C", "\\between", true); -defineSymbol(symbols_math, ams, rel, "\u22D4", "\\pitchfork", true); -defineSymbol(symbols_math, ams, rel, "\u221D", "\\varpropto"); -defineSymbol(symbols_math, ams, rel, "\u25C0", "\\blacktriangleleft"); // unicode-math says that \therefore is a mathord atom. -// We kept the amssymb atom type, which is rel. - -defineSymbol(symbols_math, ams, rel, "\u2234", "\\therefore", true); -defineSymbol(symbols_math, ams, rel, "\u220D", "\\backepsilon"); -defineSymbol(symbols_math, ams, rel, "\u25B6", "\\blacktriangleright"); // unicode-math says that \because is a mathord atom. -// We kept the amssymb atom type, which is rel. - -defineSymbol(symbols_math, ams, rel, "\u2235", "\\because", true); -defineSymbol(symbols_math, ams, rel, "\u22D8", "\\llless"); -defineSymbol(symbols_math, ams, rel, "\u22D9", "\\gggtr"); -defineSymbol(symbols_math, ams, bin, "\u22B2", "\\lhd"); -defineSymbol(symbols_math, ams, bin, "\u22B3", "\\rhd"); -defineSymbol(symbols_math, ams, rel, "\u2242", "\\eqsim", true); -defineSymbol(symbols_math, main, rel, "\u22C8", "\\Join"); -defineSymbol(symbols_math, ams, rel, "\u2251", "\\Doteq", true); // AMS Binary Operators - -defineSymbol(symbols_math, ams, bin, "\u2214", "\\dotplus", true); -defineSymbol(symbols_math, ams, bin, "\u2216", "\\smallsetminus"); -defineSymbol(symbols_math, ams, bin, "\u22D2", "\\Cap", true); -defineSymbol(symbols_math, ams, bin, "\u22D3", "\\Cup", true); -defineSymbol(symbols_math, ams, bin, "\u2A5E", "\\doublebarwedge", true); -defineSymbol(symbols_math, ams, bin, "\u229F", "\\boxminus", true); -defineSymbol(symbols_math, ams, bin, "\u229E", "\\boxplus", true); -defineSymbol(symbols_math, ams, bin, "\u22C7", "\\divideontimes", true); -defineSymbol(symbols_math, ams, bin, "\u22C9", "\\ltimes", true); -defineSymbol(symbols_math, ams, bin, "\u22CA", "\\rtimes", true); -defineSymbol(symbols_math, ams, bin, "\u22CB", "\\leftthreetimes", true); -defineSymbol(symbols_math, ams, bin, "\u22CC", "\\rightthreetimes", true); -defineSymbol(symbols_math, ams, bin, "\u22CF", "\\curlywedge", true); -defineSymbol(symbols_math, ams, bin, "\u22CE", "\\curlyvee", true); -defineSymbol(symbols_math, ams, bin, "\u229D", "\\circleddash", true); -defineSymbol(symbols_math, ams, bin, "\u229B", "\\circledast", true); -defineSymbol(symbols_math, ams, bin, "\u22C5", "\\centerdot"); -defineSymbol(symbols_math, ams, bin, "\u22BA", "\\intercal", true); -defineSymbol(symbols_math, ams, bin, "\u22D2", "\\doublecap"); -defineSymbol(symbols_math, ams, bin, "\u22D3", "\\doublecup"); -defineSymbol(symbols_math, ams, bin, "\u22A0", "\\boxtimes", true); // AMS Arrows -// Note: unicode-math maps \u21e2 to their own function \rightdasharrow. -// We'll map it to AMS function \dashrightarrow. It produces the same atom. - -defineSymbol(symbols_math, ams, rel, "\u21E2", "\\dashrightarrow", true); // unicode-math maps \u21e0 to \leftdasharrow. We'll use the AMS synonym. - -defineSymbol(symbols_math, ams, rel, "\u21E0", "\\dashleftarrow", true); -defineSymbol(symbols_math, ams, rel, "\u21C7", "\\leftleftarrows", true); -defineSymbol(symbols_math, ams, rel, "\u21C6", "\\leftrightarrows", true); -defineSymbol(symbols_math, ams, rel, "\u21DA", "\\Lleftarrow", true); -defineSymbol(symbols_math, ams, rel, "\u219E", "\\twoheadleftarrow", true); -defineSymbol(symbols_math, ams, rel, "\u21A2", "\\leftarrowtail", true); -defineSymbol(symbols_math, ams, rel, "\u21AB", "\\looparrowleft", true); -defineSymbol(symbols_math, ams, rel, "\u21CB", "\\leftrightharpoons", true); -defineSymbol(symbols_math, ams, rel, "\u21B6", "\\curvearrowleft", true); // unicode-math maps \u21ba to \acwopencirclearrow. We'll use the AMS synonym. - -defineSymbol(symbols_math, ams, rel, "\u21BA", "\\circlearrowleft", true); -defineSymbol(symbols_math, ams, rel, "\u21B0", "\\Lsh", true); -defineSymbol(symbols_math, ams, rel, "\u21C8", "\\upuparrows", true); -defineSymbol(symbols_math, ams, rel, "\u21BF", "\\upharpoonleft", true); -defineSymbol(symbols_math, ams, rel, "\u21C3", "\\downharpoonleft", true); -defineSymbol(symbols_math, ams, rel, "\u22B8", "\\multimap", true); -defineSymbol(symbols_math, ams, rel, "\u21AD", "\\leftrightsquigarrow", true); -defineSymbol(symbols_math, ams, rel, "\u21C9", "\\rightrightarrows", true); -defineSymbol(symbols_math, ams, rel, "\u21C4", "\\rightleftarrows", true); -defineSymbol(symbols_math, ams, rel, "\u21A0", "\\twoheadrightarrow", true); -defineSymbol(symbols_math, ams, rel, "\u21A3", "\\rightarrowtail", true); -defineSymbol(symbols_math, ams, rel, "\u21AC", "\\looparrowright", true); -defineSymbol(symbols_math, ams, rel, "\u21B7", "\\curvearrowright", true); // unicode-math maps \u21bb to \cwopencirclearrow. We'll use the AMS synonym. - -defineSymbol(symbols_math, ams, rel, "\u21BB", "\\circlearrowright", true); -defineSymbol(symbols_math, ams, rel, "\u21B1", "\\Rsh", true); -defineSymbol(symbols_math, ams, rel, "\u21CA", "\\downdownarrows", true); -defineSymbol(symbols_math, ams, rel, "\u21BE", "\\upharpoonright", true); -defineSymbol(symbols_math, ams, rel, "\u21C2", "\\downharpoonright", true); -defineSymbol(symbols_math, ams, rel, "\u21DD", "\\rightsquigarrow", true); -defineSymbol(symbols_math, ams, rel, "\u21DD", "\\leadsto"); -defineSymbol(symbols_math, ams, rel, "\u21DB", "\\Rrightarrow", true); -defineSymbol(symbols_math, ams, rel, "\u21BE", "\\restriction"); -defineSymbol(symbols_math, main, symbols_textord, "\u2018", "`"); -defineSymbol(symbols_math, main, symbols_textord, "$", "\\$"); -defineSymbol(symbols_text, main, symbols_textord, "$", "\\$"); -defineSymbol(symbols_text, main, symbols_textord, "$", "\\textdollar"); -defineSymbol(symbols_math, main, symbols_textord, "%", "\\%"); -defineSymbol(symbols_text, main, symbols_textord, "%", "\\%"); -defineSymbol(symbols_math, main, symbols_textord, "_", "\\_"); -defineSymbol(symbols_text, main, symbols_textord, "_", "\\_"); -defineSymbol(symbols_text, main, symbols_textord, "_", "\\textunderscore"); -defineSymbol(symbols_math, main, symbols_textord, "\u2220", "\\angle", true); -defineSymbol(symbols_math, main, symbols_textord, "\u221E", "\\infty", true); -defineSymbol(symbols_math, main, symbols_textord, "\u2032", "\\prime"); -defineSymbol(symbols_math, main, symbols_textord, "\u25B3", "\\triangle"); -defineSymbol(symbols_math, main, symbols_textord, "\u0393", "\\Gamma", true); -defineSymbol(symbols_math, main, symbols_textord, "\u0394", "\\Delta", true); -defineSymbol(symbols_math, main, symbols_textord, "\u0398", "\\Theta", true); -defineSymbol(symbols_math, main, symbols_textord, "\u039B", "\\Lambda", true); -defineSymbol(symbols_math, main, symbols_textord, "\u039E", "\\Xi", true); -defineSymbol(symbols_math, main, symbols_textord, "\u03A0", "\\Pi", true); -defineSymbol(symbols_math, main, symbols_textord, "\u03A3", "\\Sigma", true); -defineSymbol(symbols_math, main, symbols_textord, "\u03A5", "\\Upsilon", true); -defineSymbol(symbols_math, main, symbols_textord, "\u03A6", "\\Phi", true); -defineSymbol(symbols_math, main, symbols_textord, "\u03A8", "\\Psi", true); -defineSymbol(symbols_math, main, symbols_textord, "\u03A9", "\\Omega", true); -defineSymbol(symbols_math, main, symbols_textord, "A", "\u0391"); -defineSymbol(symbols_math, main, symbols_textord, "B", "\u0392"); -defineSymbol(symbols_math, main, symbols_textord, "E", "\u0395"); -defineSymbol(symbols_math, main, symbols_textord, "Z", "\u0396"); -defineSymbol(symbols_math, main, symbols_textord, "H", "\u0397"); -defineSymbol(symbols_math, main, symbols_textord, "I", "\u0399"); -defineSymbol(symbols_math, main, symbols_textord, "K", "\u039A"); -defineSymbol(symbols_math, main, symbols_textord, "M", "\u039C"); -defineSymbol(symbols_math, main, symbols_textord, "N", "\u039D"); -defineSymbol(symbols_math, main, symbols_textord, "O", "\u039F"); -defineSymbol(symbols_math, main, symbols_textord, "P", "\u03A1"); -defineSymbol(symbols_math, main, symbols_textord, "T", "\u03A4"); -defineSymbol(symbols_math, main, symbols_textord, "X", "\u03A7"); -defineSymbol(symbols_math, main, symbols_textord, "\xAC", "\\neg", true); -defineSymbol(symbols_math, main, symbols_textord, "\xAC", "\\lnot"); -defineSymbol(symbols_math, main, symbols_textord, "\u22A4", "\\top"); -defineSymbol(symbols_math, main, symbols_textord, "\u22A5", "\\bot"); -defineSymbol(symbols_math, main, symbols_textord, "\u2205", "\\emptyset"); -defineSymbol(symbols_math, ams, symbols_textord, "\u2205", "\\varnothing"); -defineSymbol(symbols_math, main, mathord, "\u03B1", "\\alpha", true); -defineSymbol(symbols_math, main, mathord, "\u03B2", "\\beta", true); -defineSymbol(symbols_math, main, mathord, "\u03B3", "\\gamma", true); -defineSymbol(symbols_math, main, mathord, "\u03B4", "\\delta", true); -defineSymbol(symbols_math, main, mathord, "\u03F5", "\\epsilon", true); -defineSymbol(symbols_math, main, mathord, "\u03B6", "\\zeta", true); -defineSymbol(symbols_math, main, mathord, "\u03B7", "\\eta", true); -defineSymbol(symbols_math, main, mathord, "\u03B8", "\\theta", true); -defineSymbol(symbols_math, main, mathord, "\u03B9", "\\iota", true); -defineSymbol(symbols_math, main, mathord, "\u03BA", "\\kappa", true); -defineSymbol(symbols_math, main, mathord, "\u03BB", "\\lambda", true); -defineSymbol(symbols_math, main, mathord, "\u03BC", "\\mu", true); -defineSymbol(symbols_math, main, mathord, "\u03BD", "\\nu", true); -defineSymbol(symbols_math, main, mathord, "\u03BE", "\\xi", true); -defineSymbol(symbols_math, main, mathord, "\u03BF", "\\omicron", true); -defineSymbol(symbols_math, main, mathord, "\u03C0", "\\pi", true); -defineSymbol(symbols_math, main, mathord, "\u03C1", "\\rho", true); -defineSymbol(symbols_math, main, mathord, "\u03C3", "\\sigma", true); -defineSymbol(symbols_math, main, mathord, "\u03C4", "\\tau", true); -defineSymbol(symbols_math, main, mathord, "\u03C5", "\\upsilon", true); -defineSymbol(symbols_math, main, mathord, "\u03D5", "\\phi", true); -defineSymbol(symbols_math, main, mathord, "\u03C7", "\\chi", true); -defineSymbol(symbols_math, main, mathord, "\u03C8", "\\psi", true); -defineSymbol(symbols_math, main, mathord, "\u03C9", "\\omega", true); -defineSymbol(symbols_math, main, mathord, "\u03B5", "\\varepsilon", true); -defineSymbol(symbols_math, main, mathord, "\u03D1", "\\vartheta", true); -defineSymbol(symbols_math, main, mathord, "\u03D6", "\\varpi", true); -defineSymbol(symbols_math, main, mathord, "\u03F1", "\\varrho", true); -defineSymbol(symbols_math, main, mathord, "\u03C2", "\\varsigma", true); -defineSymbol(symbols_math, main, mathord, "\u03C6", "\\varphi", true); -defineSymbol(symbols_math, main, bin, "\u2217", "*"); -defineSymbol(symbols_math, main, bin, "+", "+"); -defineSymbol(symbols_math, main, bin, "\u2212", "-"); -defineSymbol(symbols_math, main, bin, "\u22C5", "\\cdot", true); -defineSymbol(symbols_math, main, bin, "\u2218", "\\circ"); -defineSymbol(symbols_math, main, bin, "\xF7", "\\div", true); -defineSymbol(symbols_math, main, bin, "\xB1", "\\pm", true); -defineSymbol(symbols_math, main, bin, "\xD7", "\\times", true); -defineSymbol(symbols_math, main, bin, "\u2229", "\\cap", true); -defineSymbol(symbols_math, main, bin, "\u222A", "\\cup", true); -defineSymbol(symbols_math, main, bin, "\u2216", "\\setminus"); -defineSymbol(symbols_math, main, bin, "\u2227", "\\land"); -defineSymbol(symbols_math, main, bin, "\u2228", "\\lor"); -defineSymbol(symbols_math, main, bin, "\u2227", "\\wedge", true); -defineSymbol(symbols_math, main, bin, "\u2228", "\\vee", true); -defineSymbol(symbols_math, main, symbols_textord, "\u221A", "\\surd"); -defineSymbol(symbols_math, main, symbols_open, "\u27E8", "\\langle", true); -defineSymbol(symbols_math, main, symbols_open, "\u2223", "\\lvert"); -defineSymbol(symbols_math, main, symbols_open, "\u2225", "\\lVert"); -defineSymbol(symbols_math, main, symbols_close, "?", "?"); -defineSymbol(symbols_math, main, symbols_close, "!", "!"); -defineSymbol(symbols_math, main, symbols_close, "\u27E9", "\\rangle", true); -defineSymbol(symbols_math, main, symbols_close, "\u2223", "\\rvert"); -defineSymbol(symbols_math, main, symbols_close, "\u2225", "\\rVert"); -defineSymbol(symbols_math, main, rel, "=", "="); -defineSymbol(symbols_math, main, rel, ":", ":"); -defineSymbol(symbols_math, main, rel, "\u2248", "\\approx", true); -defineSymbol(symbols_math, main, rel, "\u2245", "\\cong", true); -defineSymbol(symbols_math, main, rel, "\u2265", "\\ge"); -defineSymbol(symbols_math, main, rel, "\u2265", "\\geq", true); -defineSymbol(symbols_math, main, rel, "\u2190", "\\gets"); -defineSymbol(symbols_math, main, rel, ">", "\\gt", true); -defineSymbol(symbols_math, main, rel, "\u2208", "\\in", true); -defineSymbol(symbols_math, main, rel, "\uE020", "\\@not"); -defineSymbol(symbols_math, main, rel, "\u2282", "\\subset", true); -defineSymbol(symbols_math, main, rel, "\u2283", "\\supset", true); -defineSymbol(symbols_math, main, rel, "\u2286", "\\subseteq", true); -defineSymbol(symbols_math, main, rel, "\u2287", "\\supseteq", true); -defineSymbol(symbols_math, ams, rel, "\u2288", "\\nsubseteq", true); -defineSymbol(symbols_math, ams, rel, "\u2289", "\\nsupseteq", true); -defineSymbol(symbols_math, main, rel, "\u22A8", "\\models"); -defineSymbol(symbols_math, main, rel, "\u2190", "\\leftarrow", true); -defineSymbol(symbols_math, main, rel, "\u2264", "\\le"); -defineSymbol(symbols_math, main, rel, "\u2264", "\\leq", true); -defineSymbol(symbols_math, main, rel, "<", "\\lt", true); -defineSymbol(symbols_math, main, rel, "\u2192", "\\rightarrow", true); -defineSymbol(symbols_math, main, rel, "\u2192", "\\to"); -defineSymbol(symbols_math, ams, rel, "\u2271", "\\ngeq", true); -defineSymbol(symbols_math, ams, rel, "\u2270", "\\nleq", true); -defineSymbol(symbols_math, main, symbols_spacing, "\xA0", "\\ "); -defineSymbol(symbols_math, main, symbols_spacing, "\xA0", "~"); -defineSymbol(symbols_math, main, symbols_spacing, "\xA0", "\\space"); // Ref: LaTeX Source 2e: \DeclareRobustCommand{\nobreakspace}{% - -defineSymbol(symbols_math, main, symbols_spacing, "\xA0", "\\nobreakspace"); -defineSymbol(symbols_text, main, symbols_spacing, "\xA0", "\\ "); -defineSymbol(symbols_text, main, symbols_spacing, "\xA0", " "); -defineSymbol(symbols_text, main, symbols_spacing, "\xA0", "~"); -defineSymbol(symbols_text, main, symbols_spacing, "\xA0", "\\space"); -defineSymbol(symbols_text, main, symbols_spacing, "\xA0", "\\nobreakspace"); -defineSymbol(symbols_math, main, symbols_spacing, null, "\\nobreak"); -defineSymbol(symbols_math, main, symbols_spacing, null, "\\allowbreak"); -defineSymbol(symbols_math, main, punct, ",", ","); -defineSymbol(symbols_math, main, punct, ";", ";"); -defineSymbol(symbols_math, ams, bin, "\u22BC", "\\barwedge", true); -defineSymbol(symbols_math, ams, bin, "\u22BB", "\\veebar", true); -defineSymbol(symbols_math, main, bin, "\u2299", "\\odot", true); -defineSymbol(symbols_math, main, bin, "\u2295", "\\oplus", true); -defineSymbol(symbols_math, main, bin, "\u2297", "\\otimes", true); -defineSymbol(symbols_math, main, symbols_textord, "\u2202", "\\partial", true); -defineSymbol(symbols_math, main, bin, "\u2298", "\\oslash", true); -defineSymbol(symbols_math, ams, bin, "\u229A", "\\circledcirc", true); -defineSymbol(symbols_math, ams, bin, "\u22A1", "\\boxdot", true); -defineSymbol(symbols_math, main, bin, "\u25B3", "\\bigtriangleup"); -defineSymbol(symbols_math, main, bin, "\u25BD", "\\bigtriangledown"); -defineSymbol(symbols_math, main, bin, "\u2020", "\\dagger"); -defineSymbol(symbols_math, main, bin, "\u22C4", "\\diamond"); -defineSymbol(symbols_math, main, bin, "\u22C6", "\\star"); -defineSymbol(symbols_math, main, bin, "\u25C3", "\\triangleleft"); -defineSymbol(symbols_math, main, bin, "\u25B9", "\\triangleright"); -defineSymbol(symbols_math, main, symbols_open, "{", "\\{"); -defineSymbol(symbols_text, main, symbols_textord, "{", "\\{"); -defineSymbol(symbols_text, main, symbols_textord, "{", "\\textbraceleft"); -defineSymbol(symbols_math, main, symbols_close, "}", "\\}"); -defineSymbol(symbols_text, main, symbols_textord, "}", "\\}"); -defineSymbol(symbols_text, main, symbols_textord, "}", "\\textbraceright"); -defineSymbol(symbols_math, main, symbols_open, "{", "\\lbrace"); -defineSymbol(symbols_math, main, symbols_close, "}", "\\rbrace"); -defineSymbol(symbols_math, main, symbols_open, "[", "\\lbrack", true); -defineSymbol(symbols_text, main, symbols_textord, "[", "\\lbrack", true); -defineSymbol(symbols_math, main, symbols_close, "]", "\\rbrack", true); -defineSymbol(symbols_text, main, symbols_textord, "]", "\\rbrack", true); -defineSymbol(symbols_math, main, symbols_open, "(", "\\lparen", true); -defineSymbol(symbols_math, main, symbols_close, ")", "\\rparen", true); -defineSymbol(symbols_text, main, symbols_textord, "<", "\\textless", true); // in T1 fontenc - -defineSymbol(symbols_text, main, symbols_textord, ">", "\\textgreater", true); // in T1 fontenc - -defineSymbol(symbols_math, main, symbols_open, "\u230A", "\\lfloor", true); -defineSymbol(symbols_math, main, symbols_close, "\u230B", "\\rfloor", true); -defineSymbol(symbols_math, main, symbols_open, "\u2308", "\\lceil", true); -defineSymbol(symbols_math, main, symbols_close, "\u2309", "\\rceil", true); -defineSymbol(symbols_math, main, symbols_textord, "\\", "\\backslash"); -defineSymbol(symbols_math, main, symbols_textord, "\u2223", "|"); -defineSymbol(symbols_math, main, symbols_textord, "\u2223", "\\vert"); -defineSymbol(symbols_text, main, symbols_textord, "|", "\\textbar", true); // in T1 fontenc - -defineSymbol(symbols_math, main, symbols_textord, "\u2225", "\\|"); -defineSymbol(symbols_math, main, symbols_textord, "\u2225", "\\Vert"); -defineSymbol(symbols_text, main, symbols_textord, "\u2225", "\\textbardbl"); -defineSymbol(symbols_text, main, symbols_textord, "~", "\\textasciitilde"); -defineSymbol(symbols_text, main, symbols_textord, "\\", "\\textbackslash"); -defineSymbol(symbols_text, main, symbols_textord, "^", "\\textasciicircum"); -defineSymbol(symbols_math, main, rel, "\u2191", "\\uparrow", true); -defineSymbol(symbols_math, main, rel, "\u21D1", "\\Uparrow", true); -defineSymbol(symbols_math, main, rel, "\u2193", "\\downarrow", true); -defineSymbol(symbols_math, main, rel, "\u21D3", "\\Downarrow", true); -defineSymbol(symbols_math, main, rel, "\u2195", "\\updownarrow", true); -defineSymbol(symbols_math, main, rel, "\u21D5", "\\Updownarrow", true); -defineSymbol(symbols_math, main, op, "\u2210", "\\coprod"); -defineSymbol(symbols_math, main, op, "\u22C1", "\\bigvee"); -defineSymbol(symbols_math, main, op, "\u22C0", "\\bigwedge"); -defineSymbol(symbols_math, main, op, "\u2A04", "\\biguplus"); -defineSymbol(symbols_math, main, op, "\u22C2", "\\bigcap"); -defineSymbol(symbols_math, main, op, "\u22C3", "\\bigcup"); -defineSymbol(symbols_math, main, op, "\u222B", "\\int"); -defineSymbol(symbols_math, main, op, "\u222B", "\\intop"); -defineSymbol(symbols_math, main, op, "\u222C", "\\iint"); -defineSymbol(symbols_math, main, op, "\u222D", "\\iiint"); -defineSymbol(symbols_math, main, op, "\u220F", "\\prod"); -defineSymbol(symbols_math, main, op, "\u2211", "\\sum"); -defineSymbol(symbols_math, main, op, "\u2A02", "\\bigotimes"); -defineSymbol(symbols_math, main, op, "\u2A01", "\\bigoplus"); -defineSymbol(symbols_math, main, op, "\u2A00", "\\bigodot"); -defineSymbol(symbols_math, main, op, "\u222E", "\\oint"); -defineSymbol(symbols_math, main, op, "\u2A06", "\\bigsqcup"); -defineSymbol(symbols_math, main, op, "\u222B", "\\smallint"); -defineSymbol(symbols_text, main, symbols_inner, "\u2026", "\\textellipsis"); -defineSymbol(symbols_math, main, symbols_inner, "\u2026", "\\mathellipsis"); -defineSymbol(symbols_text, main, symbols_inner, "\u2026", "\\ldots", true); -defineSymbol(symbols_math, main, symbols_inner, "\u2026", "\\ldots", true); -defineSymbol(symbols_math, main, symbols_inner, "\u22EF", "\\@cdots", true); -defineSymbol(symbols_math, main, symbols_inner, "\u22F1", "\\ddots", true); -defineSymbol(symbols_math, main, symbols_textord, "\u22EE", "\\varvdots"); // \vdots is a macro - -defineSymbol(symbols_math, main, symbols_accent, "\u02CA", "\\acute"); -defineSymbol(symbols_math, main, symbols_accent, "\u02CB", "\\grave"); -defineSymbol(symbols_math, main, symbols_accent, "\xA8", "\\ddot"); -defineSymbol(symbols_math, main, symbols_accent, "~", "\\tilde"); -defineSymbol(symbols_math, main, symbols_accent, "\u02C9", "\\bar"); -defineSymbol(symbols_math, main, symbols_accent, "\u02D8", "\\breve"); -defineSymbol(symbols_math, main, symbols_accent, "\u02C7", "\\check"); -defineSymbol(symbols_math, main, symbols_accent, "^", "\\hat"); -defineSymbol(symbols_math, main, symbols_accent, "\u20D7", "\\vec"); -defineSymbol(symbols_math, main, symbols_accent, "\u02D9", "\\dot"); -defineSymbol(symbols_math, main, symbols_accent, "\u02DA", "\\mathring"); // \imath and \jmath should be invariant to \mathrm, \mathbf, etc., so use PUA - -defineSymbol(symbols_math, main, mathord, "\uE131", "\\@imath"); -defineSymbol(symbols_math, main, mathord, "\uE237", "\\@jmath"); -defineSymbol(symbols_math, main, symbols_textord, "\u0131", "\u0131"); -defineSymbol(symbols_math, main, symbols_textord, "\u0237", "\u0237"); -defineSymbol(symbols_text, main, symbols_textord, "\u0131", "\\i", true); -defineSymbol(symbols_text, main, symbols_textord, "\u0237", "\\j", true); -defineSymbol(symbols_text, main, symbols_textord, "\xDF", "\\ss", true); -defineSymbol(symbols_text, main, symbols_textord, "\xE6", "\\ae", true); -defineSymbol(symbols_text, main, symbols_textord, "\u0153", "\\oe", true); -defineSymbol(symbols_text, main, symbols_textord, "\xF8", "\\o", true); -defineSymbol(symbols_text, main, symbols_textord, "\xC6", "\\AE", true); -defineSymbol(symbols_text, main, symbols_textord, "\u0152", "\\OE", true); -defineSymbol(symbols_text, main, symbols_textord, "\xD8", "\\O", true); -defineSymbol(symbols_text, main, symbols_accent, "\u02CA", "\\'"); // acute - -defineSymbol(symbols_text, main, symbols_accent, "\u02CB", "\\`"); // grave - -defineSymbol(symbols_text, main, symbols_accent, "\u02C6", "\\^"); // circumflex - -defineSymbol(symbols_text, main, symbols_accent, "\u02DC", "\\~"); // tilde - -defineSymbol(symbols_text, main, symbols_accent, "\u02C9", "\\="); // macron - -defineSymbol(symbols_text, main, symbols_accent, "\u02D8", "\\u"); // breve - -defineSymbol(symbols_text, main, symbols_accent, "\u02D9", "\\."); // dot above - -defineSymbol(symbols_text, main, symbols_accent, "\u02DA", "\\r"); // ring above - -defineSymbol(symbols_text, main, symbols_accent, "\u02C7", "\\v"); // caron - -defineSymbol(symbols_text, main, symbols_accent, "\xA8", '\\"'); // diaresis - -defineSymbol(symbols_text, main, symbols_accent, "\u02DD", "\\H"); // double acute - -defineSymbol(symbols_text, main, symbols_accent, "\u25EF", "\\textcircled"); // \bigcirc glyph -// These ligatures are detected and created in Parser.js's `formLigatures`. - -var ligatures = { - "--": true, - "---": true, - "``": true, - "''": true -}; -defineSymbol(symbols_text, main, symbols_textord, "\u2013", "--", true); -defineSymbol(symbols_text, main, symbols_textord, "\u2013", "\\textendash"); -defineSymbol(symbols_text, main, symbols_textord, "\u2014", "---", true); -defineSymbol(symbols_text, main, symbols_textord, "\u2014", "\\textemdash"); -defineSymbol(symbols_text, main, symbols_textord, "\u2018", "`", true); -defineSymbol(symbols_text, main, symbols_textord, "\u2018", "\\textquoteleft"); -defineSymbol(symbols_text, main, symbols_textord, "\u2019", "'", true); -defineSymbol(symbols_text, main, symbols_textord, "\u2019", "\\textquoteright"); -defineSymbol(symbols_text, main, symbols_textord, "\u201C", "``", true); -defineSymbol(symbols_text, main, symbols_textord, "\u201C", "\\textquotedblleft"); -defineSymbol(symbols_text, main, symbols_textord, "\u201D", "''", true); -defineSymbol(symbols_text, main, symbols_textord, "\u201D", "\\textquotedblright"); // \degree from gensymb package - -defineSymbol(symbols_math, main, symbols_textord, "\xB0", "\\degree", true); -defineSymbol(symbols_text, main, symbols_textord, "\xB0", "\\degree"); // \textdegree from inputenc package - -defineSymbol(symbols_text, main, symbols_textord, "\xB0", "\\textdegree", true); // TODO: In LaTeX, \pounds can generate a different character in text and math -// mode, but among our fonts, only Main-Regular defines this character "163". - -defineSymbol(symbols_math, main, symbols_textord, "\xA3", "\\pounds"); -defineSymbol(symbols_math, main, symbols_textord, "\xA3", "\\mathsterling", true); -defineSymbol(symbols_text, main, symbols_textord, "\xA3", "\\pounds"); -defineSymbol(symbols_text, main, symbols_textord, "\xA3", "\\textsterling", true); -defineSymbol(symbols_math, ams, symbols_textord, "\u2720", "\\maltese"); -defineSymbol(symbols_text, ams, symbols_textord, "\u2720", "\\maltese"); // There are lots of symbols which are the same, so we add them in afterwards. -// All of these are textords in math mode - -var mathTextSymbols = "0123456789/@.\""; - -for (var symbols_i = 0; symbols_i < mathTextSymbols.length; symbols_i++) { - var symbols_ch = mathTextSymbols.charAt(symbols_i); - defineSymbol(symbols_math, main, symbols_textord, symbols_ch, symbols_ch); -} // All of these are textords in text mode - - -var textSymbols = "0123456789!@*()-=+\";:?/.,"; - -for (var src_symbols_i = 0; src_symbols_i < textSymbols.length; src_symbols_i++) { - var _ch = textSymbols.charAt(src_symbols_i); - - defineSymbol(symbols_text, main, symbols_textord, _ch, _ch); -} // All of these are textords in text mode, and mathords in math mode - - -var letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; - -for (var symbols_i2 = 0; symbols_i2 < letters.length; symbols_i2++) { - var _ch2 = letters.charAt(symbols_i2); - - defineSymbol(symbols_math, main, mathord, _ch2, _ch2); - defineSymbol(symbols_text, main, symbols_textord, _ch2, _ch2); -} // Blackboard bold and script letters in Unicode range - - -defineSymbol(symbols_math, ams, symbols_textord, "C", "\u2102"); // blackboard bold - -defineSymbol(symbols_text, ams, symbols_textord, "C", "\u2102"); -defineSymbol(symbols_math, ams, symbols_textord, "H", "\u210D"); -defineSymbol(symbols_text, ams, symbols_textord, "H", "\u210D"); -defineSymbol(symbols_math, ams, symbols_textord, "N", "\u2115"); -defineSymbol(symbols_text, ams, symbols_textord, "N", "\u2115"); -defineSymbol(symbols_math, ams, symbols_textord, "P", "\u2119"); -defineSymbol(symbols_text, ams, symbols_textord, "P", "\u2119"); -defineSymbol(symbols_math, ams, symbols_textord, "Q", "\u211A"); -defineSymbol(symbols_text, ams, symbols_textord, "Q", "\u211A"); -defineSymbol(symbols_math, ams, symbols_textord, "R", "\u211D"); -defineSymbol(symbols_text, ams, symbols_textord, "R", "\u211D"); -defineSymbol(symbols_math, ams, symbols_textord, "Z", "\u2124"); -defineSymbol(symbols_text, ams, symbols_textord, "Z", "\u2124"); -defineSymbol(symbols_math, main, mathord, "h", "\u210E"); // italic h, Planck constant - -defineSymbol(symbols_text, main, mathord, "h", "\u210E"); // The next loop loads wide (surrogate pair) characters. -// We support some letters in the Unicode range U+1D400 to U+1D7FF, -// Mathematical Alphanumeric Symbols. -// Some editors do not deal well with wide characters. So don't write the -// string into this file. Instead, create the string from the surrogate pair. - -var symbols_wideChar = ""; - -for (var symbols_i3 = 0; symbols_i3 < letters.length; symbols_i3++) { - var _ch3 = letters.charAt(symbols_i3); // The hex numbers in the next line are a surrogate pair. - // 0xD835 is the high surrogate for all letters in the range we support. - // 0xDC00 is the low surrogate for bold A. - - - symbols_wideChar = String.fromCharCode(0xD835, 0xDC00 + symbols_i3); // A-Z a-z bold - - defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar); - defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar); - symbols_wideChar = String.fromCharCode(0xD835, 0xDC34 + symbols_i3); // A-Z a-z italic - - defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar); - defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar); - symbols_wideChar = String.fromCharCode(0xD835, 0xDC68 + symbols_i3); // A-Z a-z bold italic - - defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar); - defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar); - symbols_wideChar = String.fromCharCode(0xD835, 0xDD04 + symbols_i3); // A-Z a-z Fractur - - defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar); - defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar); - symbols_wideChar = String.fromCharCode(0xD835, 0xDDA0 + symbols_i3); // A-Z a-z sans-serif - - defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar); - defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar); - symbols_wideChar = String.fromCharCode(0xD835, 0xDDD4 + symbols_i3); // A-Z a-z sans bold - - defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar); - defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar); - symbols_wideChar = String.fromCharCode(0xD835, 0xDE08 + symbols_i3); // A-Z a-z sans italic - - defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar); - defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar); - symbols_wideChar = String.fromCharCode(0xD835, 0xDE70 + symbols_i3); // A-Z a-z monospace - - defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar); - defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar); - - if (symbols_i3 < 26) { - // KaTeX fonts have only capital letters for blackboard bold and script. - // See exception for k below. - symbols_wideChar = String.fromCharCode(0xD835, 0xDD38 + symbols_i3); // A-Z double struck - - defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar); - defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar); - symbols_wideChar = String.fromCharCode(0xD835, 0xDC9C + symbols_i3); // A-Z script - - defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar); - defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar); - } // TODO: Add bold script when it is supported by a KaTeX font. - -} // "k" is the only double struck lower case letter in the KaTeX fonts. - - -symbols_wideChar = String.fromCharCode(0xD835, 0xDD5C); // k double struck - -defineSymbol(symbols_math, main, mathord, "k", symbols_wideChar); -defineSymbol(symbols_text, main, symbols_textord, "k", symbols_wideChar); // Next, some wide character numerals - -for (var symbols_i4 = 0; symbols_i4 < 10; symbols_i4++) { - var _ch4 = symbols_i4.toString(); - - symbols_wideChar = String.fromCharCode(0xD835, 0xDFCE + symbols_i4); // 0-9 bold - - defineSymbol(symbols_math, main, mathord, _ch4, symbols_wideChar); - defineSymbol(symbols_text, main, symbols_textord, _ch4, symbols_wideChar); - symbols_wideChar = String.fromCharCode(0xD835, 0xDFE2 + symbols_i4); // 0-9 sans serif - - defineSymbol(symbols_math, main, mathord, _ch4, symbols_wideChar); - defineSymbol(symbols_text, main, symbols_textord, _ch4, symbols_wideChar); - symbols_wideChar = String.fromCharCode(0xD835, 0xDFEC + symbols_i4); // 0-9 bold sans - - defineSymbol(symbols_math, main, mathord, _ch4, symbols_wideChar); - defineSymbol(symbols_text, main, symbols_textord, _ch4, symbols_wideChar); - symbols_wideChar = String.fromCharCode(0xD835, 0xDFF6 + symbols_i4); // 0-9 monospace - - defineSymbol(symbols_math, main, mathord, _ch4, symbols_wideChar); - defineSymbol(symbols_text, main, symbols_textord, _ch4, symbols_wideChar); -} // We add these Latin-1 letters as symbols for backwards-compatibility, -// but they are not actually in the font, nor are they supported by the -// Unicode accent mechanism, so they fall back to Times font and look ugly. -// TODO(edemaine): Fix this. - - -var extraLatin = "\xC7\xD0\xDE\xE7\xFE"; - -for (var _i5 = 0; _i5 < extraLatin.length; _i5++) { - var _ch5 = extraLatin.charAt(_i5); - - defineSymbol(symbols_math, main, mathord, _ch5, _ch5); - defineSymbol(symbols_text, main, symbols_textord, _ch5, _ch5); -} -// CONCATENATED MODULE: ./src/wide-character.js -/** - * This file provides support for Unicode range U+1D400 to U+1D7FF, - * Mathematical Alphanumeric Symbols. - * - * Function wideCharacterFont takes a wide character as input and returns - * the font information necessary to render it properly. - */ - -/** - * Data below is from https://www.unicode.org/charts/PDF/U1D400.pdf - * That document sorts characters into groups by font type, say bold or italic. - * - * In the arrays below, each subarray consists three elements: - * * The CSS class of that group when in math mode. - * * The CSS class of that group when in text mode. - * * The font name, so that KaTeX can get font metrics. - */ - -var wideLatinLetterData = [["mathbf", "textbf", "Main-Bold"], // A-Z bold upright -["mathbf", "textbf", "Main-Bold"], // a-z bold upright -["mathnormal", "textit", "Math-Italic"], // A-Z italic -["mathnormal", "textit", "Math-Italic"], // a-z italic -["boldsymbol", "boldsymbol", "Main-BoldItalic"], // A-Z bold italic -["boldsymbol", "boldsymbol", "Main-BoldItalic"], // a-z bold italic -// Map fancy A-Z letters to script, not calligraphic. -// This aligns with unicode-math and math fonts (except Cambria Math). -["mathscr", "textscr", "Script-Regular"], // A-Z script -["", "", ""], // a-z script. No font -["", "", ""], // A-Z bold script. No font -["", "", ""], // a-z bold script. No font -["mathfrak", "textfrak", "Fraktur-Regular"], // A-Z Fraktur -["mathfrak", "textfrak", "Fraktur-Regular"], // a-z Fraktur -["mathbb", "textbb", "AMS-Regular"], // A-Z double-struck -["mathbb", "textbb", "AMS-Regular"], // k double-struck -["", "", ""], // A-Z bold Fraktur No font metrics -["", "", ""], // a-z bold Fraktur. No font. -["mathsf", "textsf", "SansSerif-Regular"], // A-Z sans-serif -["mathsf", "textsf", "SansSerif-Regular"], // a-z sans-serif -["mathboldsf", "textboldsf", "SansSerif-Bold"], // A-Z bold sans-serif -["mathboldsf", "textboldsf", "SansSerif-Bold"], // a-z bold sans-serif -["mathitsf", "textitsf", "SansSerif-Italic"], // A-Z italic sans-serif -["mathitsf", "textitsf", "SansSerif-Italic"], // a-z italic sans-serif -["", "", ""], // A-Z bold italic sans. No font -["", "", ""], // a-z bold italic sans. No font -["mathtt", "texttt", "Typewriter-Regular"], // A-Z monospace -["mathtt", "texttt", "Typewriter-Regular"]]; -var wideNumeralData = [["mathbf", "textbf", "Main-Bold"], // 0-9 bold -["", "", ""], // 0-9 double-struck. No KaTeX font. -["mathsf", "textsf", "SansSerif-Regular"], // 0-9 sans-serif -["mathboldsf", "textboldsf", "SansSerif-Bold"], // 0-9 bold sans-serif -["mathtt", "texttt", "Typewriter-Regular"]]; -var wide_character_wideCharacterFont = function wideCharacterFont(wideChar, mode) { - // IE doesn't support codePointAt(). So work with the surrogate pair. - var H = wideChar.charCodeAt(0); // high surrogate - - var L = wideChar.charCodeAt(1); // low surrogate - - var codePoint = (H - 0xD800) * 0x400 + (L - 0xDC00) + 0x10000; - var j = mode === "math" ? 0 : 1; // column index for CSS class. - - if (0x1D400 <= codePoint && codePoint < 0x1D6A4) { - // wideLatinLetterData contains exactly 26 chars on each row. - // So we can calculate the relevant row. No traverse necessary. - var i = Math.floor((codePoint - 0x1D400) / 26); - return [wideLatinLetterData[i][2], wideLatinLetterData[i][j]]; - } else if (0x1D7CE <= codePoint && codePoint <= 0x1D7FF) { - // Numerals, ten per row. - var _i = Math.floor((codePoint - 0x1D7CE) / 10); - - return [wideNumeralData[_i][2], wideNumeralData[_i][j]]; - } else if (codePoint === 0x1D6A5 || codePoint === 0x1D6A6) { - // dotless i or j - return [wideLatinLetterData[0][2], wideLatinLetterData[0][j]]; - } else if (0x1D6A6 < codePoint && codePoint < 0x1D7CE) { - // Greek letters. Not supported, yet. - return ["", ""]; - } else { - // We don't support any wide characters outside 1D400–1D7FF. - throw new src_ParseError("Unsupported character: " + wideChar); - } -}; -// CONCATENATED MODULE: ./src/Options.js -/** - * This file contains information about the options that the Parser carries - * around with it while parsing. Data is held in an `Options` object, and when - * recursing, a new `Options` object can be created with the `.with*` and - * `.reset` functions. - */ - -var sizeStyleMap = [// Each element contains [textsize, scriptsize, scriptscriptsize]. -// The size mappings are taken from TeX with \normalsize=10pt. -[1, 1, 1], // size1: [5, 5, 5] \tiny -[2, 1, 1], // size2: [6, 5, 5] -[3, 1, 1], // size3: [7, 5, 5] \scriptsize -[4, 2, 1], // size4: [8, 6, 5] \footnotesize -[5, 2, 1], // size5: [9, 6, 5] \small -[6, 3, 1], // size6: [10, 7, 5] \normalsize -[7, 4, 2], // size7: [12, 8, 6] \large -[8, 6, 3], // size8: [14.4, 10, 7] \Large -[9, 7, 6], // size9: [17.28, 12, 10] \LARGE -[10, 8, 7], // size10: [20.74, 14.4, 12] \huge -[11, 10, 9]]; -var sizeMultipliers = [// fontMetrics.js:getGlobalMetrics also uses size indexes, so if -// you change size indexes, change that function. -0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.2, 1.44, 1.728, 2.074, 2.488]; - -var sizeAtStyle = function sizeAtStyle(size, style) { - return style.size < 2 ? size : sizeStyleMap[size - 1][style.size - 1]; -}; // In these types, "" (empty string) means "no change". - - -/** - * This is the main options class. It contains the current style, size, color, - * and font. - * - * Options objects should not be modified. To create a new Options with - * different properties, call a `.having*` method. - */ -var Options_Options = -/*#__PURE__*/ -function () { - // A font family applies to a group of fonts (i.e. SansSerif), while a font - // represents a specific font (i.e. SansSerif Bold). - // See: https://tex.stackexchange.com/questions/22350/difference-between-textrm-and-mathrm - - /** - * The base size index. - */ - function Options(data) { - this.style = void 0; - this.color = void 0; - this.size = void 0; - this.textSize = void 0; - this.phantom = void 0; - this.font = void 0; - this.fontFamily = void 0; - this.fontWeight = void 0; - this.fontShape = void 0; - this.sizeMultiplier = void 0; - this.maxSize = void 0; - this.minRuleThickness = void 0; - this._fontMetrics = void 0; - this.style = data.style; - this.color = data.color; - this.size = data.size || Options.BASESIZE; - this.textSize = data.textSize || this.size; - this.phantom = !!data.phantom; - this.font = data.font || ""; - this.fontFamily = data.fontFamily || ""; - this.fontWeight = data.fontWeight || ''; - this.fontShape = data.fontShape || ''; - this.sizeMultiplier = sizeMultipliers[this.size - 1]; - this.maxSize = data.maxSize; - this.minRuleThickness = data.minRuleThickness; - this._fontMetrics = undefined; - } - /** - * Returns a new options object with the same properties as "this". Properties - * from "extension" will be copied to the new options object. - */ - - - var _proto = Options.prototype; - - _proto.extend = function extend(extension) { - var data = { - style: this.style, - size: this.size, - textSize: this.textSize, - color: this.color, - phantom: this.phantom, - font: this.font, - fontFamily: this.fontFamily, - fontWeight: this.fontWeight, - fontShape: this.fontShape, - maxSize: this.maxSize, - minRuleThickness: this.minRuleThickness - }; - - for (var key in extension) { - if (extension.hasOwnProperty(key)) { - data[key] = extension[key]; - } - } - - return new Options(data); - } - /** - * Return an options object with the given style. If `this.style === style`, - * returns `this`. - */ - ; - - _proto.havingStyle = function havingStyle(style) { - if (this.style === style) { - return this; - } else { - return this.extend({ - style: style, - size: sizeAtStyle(this.textSize, style) - }); - } - } - /** - * Return an options object with a cramped version of the current style. If - * the current style is cramped, returns `this`. - */ - ; - - _proto.havingCrampedStyle = function havingCrampedStyle() { - return this.havingStyle(this.style.cramp()); - } - /** - * Return an options object with the given size and in at least `\textstyle`. - * Returns `this` if appropriate. - */ - ; - - _proto.havingSize = function havingSize(size) { - if (this.size === size && this.textSize === size) { - return this; - } else { - return this.extend({ - style: this.style.text(), - size: size, - textSize: size, - sizeMultiplier: sizeMultipliers[size - 1] - }); - } - } - /** - * Like `this.havingSize(BASESIZE).havingStyle(style)`. If `style` is omitted, - * changes to at least `\textstyle`. - */ - ; - - _proto.havingBaseStyle = function havingBaseStyle(style) { - style = style || this.style.text(); - var wantSize = sizeAtStyle(Options.BASESIZE, style); - - if (this.size === wantSize && this.textSize === Options.BASESIZE && this.style === style) { - return this; - } else { - return this.extend({ - style: style, - size: wantSize - }); - } - } - /** - * Remove the effect of sizing changes such as \Huge. - * Keep the effect of the current style, such as \scriptstyle. - */ - ; - - _proto.havingBaseSizing = function havingBaseSizing() { - var size; - - switch (this.style.id) { - case 4: - case 5: - size = 3; // normalsize in scriptstyle - - break; - - case 6: - case 7: - size = 1; // normalsize in scriptscriptstyle - - break; - - default: - size = 6; - // normalsize in textstyle or displaystyle - } - - return this.extend({ - style: this.style.text(), - size: size - }); - } - /** - * Create a new options object with the given color. - */ - ; - - _proto.withColor = function withColor(color) { - return this.extend({ - color: color - }); - } - /** - * Create a new options object with "phantom" set to true. - */ - ; - - _proto.withPhantom = function withPhantom() { - return this.extend({ - phantom: true - }); - } - /** - * Creates a new options object with the given math font or old text font. - * @type {[type]} - */ - ; - - _proto.withFont = function withFont(font) { - return this.extend({ - font: font - }); - } - /** - * Create a new options objects with the given fontFamily. - */ - ; - - _proto.withTextFontFamily = function withTextFontFamily(fontFamily) { - return this.extend({ - fontFamily: fontFamily, - font: "" - }); - } - /** - * Creates a new options object with the given font weight - */ - ; - - _proto.withTextFontWeight = function withTextFontWeight(fontWeight) { - return this.extend({ - fontWeight: fontWeight, - font: "" - }); - } - /** - * Creates a new options object with the given font weight - */ - ; - - _proto.withTextFontShape = function withTextFontShape(fontShape) { - return this.extend({ - fontShape: fontShape, - font: "" - }); - } - /** - * Return the CSS sizing classes required to switch from enclosing options - * `oldOptions` to `this`. Returns an array of classes. - */ - ; - - _proto.sizingClasses = function sizingClasses(oldOptions) { - if (oldOptions.size !== this.size) { - return ["sizing", "reset-size" + oldOptions.size, "size" + this.size]; - } else { - return []; - } - } - /** - * Return the CSS sizing classes required to switch to the base size. Like - * `this.havingSize(BASESIZE).sizingClasses(this)`. - */ - ; - - _proto.baseSizingClasses = function baseSizingClasses() { - if (this.size !== Options.BASESIZE) { - return ["sizing", "reset-size" + this.size, "size" + Options.BASESIZE]; - } else { - return []; - } - } - /** - * Return the font metrics for this size. - */ - ; - - _proto.fontMetrics = function fontMetrics() { - if (!this._fontMetrics) { - this._fontMetrics = getGlobalMetrics(this.size); - } - - return this._fontMetrics; - } - /** - * Gets the CSS color of the current options object - */ - ; - - _proto.getColor = function getColor() { - if (this.phantom) { - return "transparent"; - } else { - return this.color; - } - }; - - return Options; -}(); - -Options_Options.BASESIZE = 6; -/* harmony default export */ var src_Options = (Options_Options); -// CONCATENATED MODULE: ./src/units.js -/** - * This file does conversion between units. In particular, it provides - * calculateSize to convert other units into ems. - */ - - // This table gives the number of TeX pts in one of each *absolute* TeX unit. -// Thus, multiplying a length by this number converts the length from units -// into pts. Dividing the result by ptPerEm gives the number of ems -// *assuming* a font size of ptPerEm (normal size, normal style). - -var ptPerUnit = { - // https://en.wikibooks.org/wiki/LaTeX/Lengths and - // https://tex.stackexchange.com/a/8263 - "pt": 1, - // TeX point - "mm": 7227 / 2540, - // millimeter - "cm": 7227 / 254, - // centimeter - "in": 72.27, - // inch - "bp": 803 / 800, - // big (PostScript) points - "pc": 12, - // pica - "dd": 1238 / 1157, - // didot - "cc": 14856 / 1157, - // cicero (12 didot) - "nd": 685 / 642, - // new didot - "nc": 1370 / 107, - // new cicero (12 new didot) - "sp": 1 / 65536, - // scaled point (TeX's internal smallest unit) - // https://tex.stackexchange.com/a/41371 - "px": 803 / 800 // \pdfpxdimen defaults to 1 bp in pdfTeX and LuaTeX - -}; // Dictionary of relative units, for fast validity testing. - -var relativeUnit = { - "ex": true, - "em": true, - "mu": true -}; - -/** - * Determine whether the specified unit (either a string defining the unit - * or a "size" parse node containing a unit field) is valid. - */ -var validUnit = function validUnit(unit) { - if (typeof unit !== "string") { - unit = unit.unit; - } - - return unit in ptPerUnit || unit in relativeUnit || unit === "ex"; -}; -/* - * Convert a "size" parse node (with numeric "number" and string "unit" fields, - * as parsed by functions.js argType "size") into a CSS em value for the - * current style/scale. `options` gives the current options. - */ - -var units_calculateSize = function calculateSize(sizeValue, options) { - var scale; - - if (sizeValue.unit in ptPerUnit) { - // Absolute units - scale = ptPerUnit[sizeValue.unit] // Convert unit to pt - / options.fontMetrics().ptPerEm // Convert pt to CSS em - / options.sizeMultiplier; // Unscale to make absolute units - } else if (sizeValue.unit === "mu") { - // `mu` units scale with scriptstyle/scriptscriptstyle. - scale = options.fontMetrics().cssEmPerMu; - } else { - // Other relative units always refer to the *textstyle* font - // in the current size. - var unitOptions; - - if (options.style.isTight()) { - // isTight() means current style is script/scriptscript. - unitOptions = options.havingStyle(options.style.text()); - } else { - unitOptions = options; - } // TODO: In TeX these units are relative to the quad of the current - // *text* font, e.g. cmr10. KaTeX instead uses values from the - // comparably-sized *Computer Modern symbol* font. At 10pt, these - // match. At 7pt and 5pt, they differ: cmr7=1.138894, cmsy7=1.170641; - // cmr5=1.361133, cmsy5=1.472241. Consider $\scriptsize a\kern1emb$. - // TeX \showlists shows a kern of 1.13889 * fontsize; - // KaTeX shows a kern of 1.171 * fontsize. - - - if (sizeValue.unit === "ex") { - scale = unitOptions.fontMetrics().xHeight; - } else if (sizeValue.unit === "em") { - scale = unitOptions.fontMetrics().quad; - } else { - throw new src_ParseError("Invalid unit: '" + sizeValue.unit + "'"); - } - - if (unitOptions !== options) { - scale *= unitOptions.sizeMultiplier / options.sizeMultiplier; - } - } - - return Math.min(sizeValue.number * scale, options.maxSize); -}; -// CONCATENATED MODULE: ./src/buildCommon.js -/* eslint no-console:0 */ - -/** - * This module contains general functions that can be used for building - * different kinds of domTree nodes in a consistent manner. - */ - - - - - - - -/** - * Looks up the given symbol in fontMetrics, after applying any symbol - * replacements defined in symbol.js - */ -var buildCommon_lookupSymbol = function lookupSymbol(value, // TODO(#963): Use a union type for this. -fontName, mode) { - // Replace the value with its replaced value from symbol.js - if (src_symbols[mode][value] && src_symbols[mode][value].replace) { - value = src_symbols[mode][value].replace; - } - - return { - value: value, - metrics: getCharacterMetrics(value, fontName, mode) - }; -}; -/** - * Makes a symbolNode after translation via the list of symbols in symbols.js. - * Correctly pulls out metrics for the character, and optionally takes a list of - * classes to be attached to the node. - * - * TODO: make argument order closer to makeSpan - * TODO: add a separate argument for math class (e.g. `mop`, `mbin`), which - * should if present come first in `classes`. - * TODO(#953): Make `options` mandatory and always pass it in. - */ - - -var buildCommon_makeSymbol = function makeSymbol(value, fontName, mode, options, classes) { - var lookup = buildCommon_lookupSymbol(value, fontName, mode); - var metrics = lookup.metrics; - value = lookup.value; - var symbolNode; - - if (metrics) { - var italic = metrics.italic; - - if (mode === "text" || options && options.font === "mathit") { - italic = 0; - } - - symbolNode = new domTree_SymbolNode(value, metrics.height, metrics.depth, italic, metrics.skew, metrics.width, classes); - } else { - // TODO(emily): Figure out a good way to only print this in development - typeof console !== "undefined" && console.warn("No character metrics " + ("for '" + value + "' in style '" + fontName + "' and mode '" + mode + "'")); - symbolNode = new domTree_SymbolNode(value, 0, 0, 0, 0, 0, classes); - } - - if (options) { - symbolNode.maxFontSize = options.sizeMultiplier; - - if (options.style.isTight()) { - symbolNode.classes.push("mtight"); - } - - var color = options.getColor(); - - if (color) { - symbolNode.style.color = color; - } - } - - return symbolNode; -}; -/** - * Makes a symbol in Main-Regular or AMS-Regular. - * Used for rel, bin, open, close, inner, and punct. - */ - - -var buildCommon_mathsym = function mathsym(value, mode, options, classes) { - if (classes === void 0) { - classes = []; - } - - // Decide what font to render the symbol in by its entry in the symbols - // table. - // Have a special case for when the value = \ because the \ is used as a - // textord in unsupported command errors but cannot be parsed as a regular - // text ordinal and is therefore not present as a symbol in the symbols - // table for text, as well as a special case for boldsymbol because it - // can be used for bold + and - - if (options.font === "boldsymbol" && buildCommon_lookupSymbol(value, "Main-Bold", mode).metrics) { - return buildCommon_makeSymbol(value, "Main-Bold", mode, options, classes.concat(["mathbf"])); - } else if (value === "\\" || src_symbols[mode][value].font === "main") { - return buildCommon_makeSymbol(value, "Main-Regular", mode, options, classes); - } else { - return buildCommon_makeSymbol(value, "AMS-Regular", mode, options, classes.concat(["amsrm"])); - } -}; -/** - * Determines which of the two font names (Main-Bold and Math-BoldItalic) and - * corresponding style tags (mathbf or boldsymbol) to use for font "boldsymbol", - * depending on the symbol. Use this function instead of fontMap for font - * "boldsymbol". - */ - - -var boldsymbol = function boldsymbol(value, mode, options, classes, type) { - if (type !== "textord" && buildCommon_lookupSymbol(value, "Math-BoldItalic", mode).metrics) { - return { - fontName: "Math-BoldItalic", - fontClass: "boldsymbol" - }; - } else { - // Some glyphs do not exist in Math-BoldItalic so we need to use - // Main-Bold instead. - return { - fontName: "Main-Bold", - fontClass: "mathbf" - }; - } -}; -/** - * Makes either a mathord or textord in the correct font and color. - */ - - -var buildCommon_makeOrd = function makeOrd(group, options, type) { - var mode = group.mode; - var text = group.text; - var classes = ["mord"]; // Math mode or Old font (i.e. \rm) - - var isFont = mode === "math" || mode === "text" && options.font; - var fontOrFamily = isFont ? options.font : options.fontFamily; - - if (text.charCodeAt(0) === 0xD835) { - // surrogate pairs get special treatment - var _wideCharacterFont = wide_character_wideCharacterFont(text, mode), - wideFontName = _wideCharacterFont[0], - wideFontClass = _wideCharacterFont[1]; - - return buildCommon_makeSymbol(text, wideFontName, mode, options, classes.concat(wideFontClass)); - } else if (fontOrFamily) { - var fontName; - var fontClasses; - - if (fontOrFamily === "boldsymbol") { - var fontData = boldsymbol(text, mode, options, classes, type); - fontName = fontData.fontName; - fontClasses = [fontData.fontClass]; - } else if (isFont) { - fontName = fontMap[fontOrFamily].fontName; - fontClasses = [fontOrFamily]; - } else { - fontName = retrieveTextFontName(fontOrFamily, options.fontWeight, options.fontShape); - fontClasses = [fontOrFamily, options.fontWeight, options.fontShape]; - } - - if (buildCommon_lookupSymbol(text, fontName, mode).metrics) { - return buildCommon_makeSymbol(text, fontName, mode, options, classes.concat(fontClasses)); - } else if (ligatures.hasOwnProperty(text) && fontName.substr(0, 10) === "Typewriter") { - // Deconstruct ligatures in monospace fonts (\texttt, \tt). - var parts = []; - - for (var i = 0; i < text.length; i++) { - parts.push(buildCommon_makeSymbol(text[i], fontName, mode, options, classes.concat(fontClasses))); - } - - return buildCommon_makeFragment(parts); - } - } // Makes a symbol in the default font for mathords and textords. - - - if (type === "mathord") { - return buildCommon_makeSymbol(text, "Math-Italic", mode, options, classes.concat(["mathnormal"])); - } else if (type === "textord") { - var font = src_symbols[mode][text] && src_symbols[mode][text].font; - - if (font === "ams") { - var _fontName = retrieveTextFontName("amsrm", options.fontWeight, options.fontShape); - - return buildCommon_makeSymbol(text, _fontName, mode, options, classes.concat("amsrm", options.fontWeight, options.fontShape)); - } else if (font === "main" || !font) { - var _fontName2 = retrieveTextFontName("textrm", options.fontWeight, options.fontShape); - - return buildCommon_makeSymbol(text, _fontName2, mode, options, classes.concat(options.fontWeight, options.fontShape)); - } else { - // fonts added by plugins - var _fontName3 = retrieveTextFontName(font, options.fontWeight, options.fontShape); // We add font name as a css class - - - return buildCommon_makeSymbol(text, _fontName3, mode, options, classes.concat(_fontName3, options.fontWeight, options.fontShape)); - } - } else { - throw new Error("unexpected type: " + type + " in makeOrd"); - } -}; -/** - * Returns true if subsequent symbolNodes have the same classes, skew, maxFont, - * and styles. - */ - - -var buildCommon_canCombine = function canCombine(prev, next) { - if (createClass(prev.classes) !== createClass(next.classes) || prev.skew !== next.skew || prev.maxFontSize !== next.maxFontSize) { - return false; - } - - for (var style in prev.style) { - if (prev.style.hasOwnProperty(style) && prev.style[style] !== next.style[style]) { - return false; - } - } - - for (var _style in next.style) { - if (next.style.hasOwnProperty(_style) && prev.style[_style] !== next.style[_style]) { - return false; - } - } - - return true; -}; -/** - * Combine consequetive domTree.symbolNodes into a single symbolNode. - * Note: this function mutates the argument. - */ - - -var buildCommon_tryCombineChars = function tryCombineChars(chars) { - for (var i = 0; i < chars.length - 1; i++) { - var prev = chars[i]; - var next = chars[i + 1]; - - if (prev instanceof domTree_SymbolNode && next instanceof domTree_SymbolNode && buildCommon_canCombine(prev, next)) { - prev.text += next.text; - prev.height = Math.max(prev.height, next.height); - prev.depth = Math.max(prev.depth, next.depth); // Use the last character's italic correction since we use - // it to add padding to the right of the span created from - // the combined characters. - - prev.italic = next.italic; - chars.splice(i + 1, 1); - i--; - } - } - - return chars; -}; -/** - * Calculate the height, depth, and maxFontSize of an element based on its - * children. - */ - - -var sizeElementFromChildren = function sizeElementFromChildren(elem) { - var height = 0; - var depth = 0; - var maxFontSize = 0; - - for (var i = 0; i < elem.children.length; i++) { - var child = elem.children[i]; - - if (child.height > height) { - height = child.height; - } - - if (child.depth > depth) { - depth = child.depth; - } - - if (child.maxFontSize > maxFontSize) { - maxFontSize = child.maxFontSize; - } - } - - elem.height = height; - elem.depth = depth; - elem.maxFontSize = maxFontSize; -}; -/** - * Makes a span with the given list of classes, list of children, and options. - * - * TODO(#953): Ensure that `options` is always provided (currently some call - * sites don't pass it) and make the type below mandatory. - * TODO: add a separate argument for math class (e.g. `mop`, `mbin`), which - * should if present come first in `classes`. - */ - - -var buildCommon_makeSpan = function makeSpan(classes, children, options, style) { - var span = new domTree_Span(classes, children, options, style); - sizeElementFromChildren(span); - return span; -}; // SVG one is simpler -- doesn't require height, depth, max-font setting. -// This is also a separate method for typesafety. - - -var buildCommon_makeSvgSpan = function makeSvgSpan(classes, children, options, style) { - return new domTree_Span(classes, children, options, style); -}; - -var makeLineSpan = function makeLineSpan(className, options, thickness) { - var line = buildCommon_makeSpan([className], [], options); - line.height = Math.max(thickness || options.fontMetrics().defaultRuleThickness, options.minRuleThickness); - line.style.borderBottomWidth = line.height + "em"; - line.maxFontSize = 1.0; - return line; -}; -/** - * Makes an anchor with the given href, list of classes, list of children, - * and options. - */ - - -var buildCommon_makeAnchor = function makeAnchor(href, classes, children, options) { - var anchor = new domTree_Anchor(href, classes, children, options); - sizeElementFromChildren(anchor); - return anchor; -}; -/** - * Makes a document fragment with the given list of children. - */ - - -var buildCommon_makeFragment = function makeFragment(children) { - var fragment = new tree_DocumentFragment(children); - sizeElementFromChildren(fragment); - return fragment; -}; -/** - * Wraps group in a span if it's a document fragment, allowing to apply classes - * and styles - */ - - -var buildCommon_wrapFragment = function wrapFragment(group, options) { - if (group instanceof tree_DocumentFragment) { - return buildCommon_makeSpan([], [group], options); - } - - return group; -}; // These are exact object types to catch typos in the names of the optional fields. - - -// Computes the updated `children` list and the overall depth. -// -// This helper function for makeVList makes it easier to enforce type safety by -// allowing early exits (returns) in the logic. -var getVListChildrenAndDepth = function getVListChildrenAndDepth(params) { - if (params.positionType === "individualShift") { - var oldChildren = params.children; - var children = [oldChildren[0]]; // Add in kerns to the list of params.children to get each element to be - // shifted to the correct specified shift - - var _depth = -oldChildren[0].shift - oldChildren[0].elem.depth; - - var currPos = _depth; - - for (var i = 1; i < oldChildren.length; i++) { - var diff = -oldChildren[i].shift - currPos - oldChildren[i].elem.depth; - var size = diff - (oldChildren[i - 1].elem.height + oldChildren[i - 1].elem.depth); - currPos = currPos + diff; - children.push({ - type: "kern", - size: size - }); - children.push(oldChildren[i]); - } - - return { - children: children, - depth: _depth - }; - } - - var depth; - - if (params.positionType === "top") { - // We always start at the bottom, so calculate the bottom by adding up - // all the sizes - var bottom = params.positionData; - - for (var _i = 0; _i < params.children.length; _i++) { - var child = params.children[_i]; - bottom -= child.type === "kern" ? child.size : child.elem.height + child.elem.depth; - } - - depth = bottom; - } else if (params.positionType === "bottom") { - depth = -params.positionData; - } else { - var firstChild = params.children[0]; - - if (firstChild.type !== "elem") { - throw new Error('First child must have type "elem".'); - } - - if (params.positionType === "shift") { - depth = -firstChild.elem.depth - params.positionData; - } else if (params.positionType === "firstBaseline") { - depth = -firstChild.elem.depth; - } else { - throw new Error("Invalid positionType " + params.positionType + "."); - } - } - - return { - children: params.children, - depth: depth - }; -}; -/** - * Makes a vertical list by stacking elements and kerns on top of each other. - * Allows for many different ways of specifying the positioning method. - * - * See VListParam documentation above. - */ - - -var buildCommon_makeVList = function makeVList(params, options) { - var _getVListChildrenAndD = getVListChildrenAndDepth(params), - children = _getVListChildrenAndD.children, - depth = _getVListChildrenAndD.depth; // Create a strut that is taller than any list item. The strut is added to - // each item, where it will determine the item's baseline. Since it has - // `overflow:hidden`, the strut's top edge will sit on the item's line box's - // top edge and the strut's bottom edge will sit on the item's baseline, - // with no additional line-height spacing. This allows the item baseline to - // be positioned precisely without worrying about font ascent and - // line-height. - - - var pstrutSize = 0; - - for (var i = 0; i < children.length; i++) { - var child = children[i]; - - if (child.type === "elem") { - var elem = child.elem; - pstrutSize = Math.max(pstrutSize, elem.maxFontSize, elem.height); - } - } - - pstrutSize += 2; - var pstrut = buildCommon_makeSpan(["pstrut"], []); - pstrut.style.height = pstrutSize + "em"; // Create a new list of actual children at the correct offsets - - var realChildren = []; - var minPos = depth; - var maxPos = depth; - var currPos = depth; - - for (var _i2 = 0; _i2 < children.length; _i2++) { - var _child = children[_i2]; - - if (_child.type === "kern") { - currPos += _child.size; - } else { - var _elem = _child.elem; - var classes = _child.wrapperClasses || []; - var style = _child.wrapperStyle || {}; - var childWrap = buildCommon_makeSpan(classes, [pstrut, _elem], undefined, style); - childWrap.style.top = -pstrutSize - currPos - _elem.depth + "em"; - - if (_child.marginLeft) { - childWrap.style.marginLeft = _child.marginLeft; - } - - if (_child.marginRight) { - childWrap.style.marginRight = _child.marginRight; - } - - realChildren.push(childWrap); - currPos += _elem.height + _elem.depth; - } - - minPos = Math.min(minPos, currPos); - maxPos = Math.max(maxPos, currPos); - } // The vlist contents go in a table-cell with `vertical-align:bottom`. - // This cell's bottom edge will determine the containing table's baseline - // without overly expanding the containing line-box. - - - var vlist = buildCommon_makeSpan(["vlist"], realChildren); - vlist.style.height = maxPos + "em"; // A second row is used if necessary to represent the vlist's depth. - - var rows; - - if (minPos < 0) { - // We will define depth in an empty span with display: table-cell. - // It should render with the height that we define. But Chrome, in - // contenteditable mode only, treats that span as if it contains some - // text content. And that min-height over-rides our desired height. - // So we put another empty span inside the depth strut span. - var emptySpan = buildCommon_makeSpan([], []); - var depthStrut = buildCommon_makeSpan(["vlist"], [emptySpan]); - depthStrut.style.height = -minPos + "em"; // Safari wants the first row to have inline content; otherwise it - // puts the bottom of the *second* row on the baseline. - - var topStrut = buildCommon_makeSpan(["vlist-s"], [new domTree_SymbolNode("\u200B")]); - rows = [buildCommon_makeSpan(["vlist-r"], [vlist, topStrut]), buildCommon_makeSpan(["vlist-r"], [depthStrut])]; - } else { - rows = [buildCommon_makeSpan(["vlist-r"], [vlist])]; - } - - var vtable = buildCommon_makeSpan(["vlist-t"], rows); - - if (rows.length === 2) { - vtable.classes.push("vlist-t2"); - } - - vtable.height = maxPos; - vtable.depth = -minPos; - return vtable; -}; // Glue is a concept from TeX which is a flexible space between elements in -// either a vertical or horizontal list. In KaTeX, at least for now, it's -// static space between elements in a horizontal layout. - - -var buildCommon_makeGlue = function makeGlue(measurement, options) { - // Make an empty span for the space - var rule = buildCommon_makeSpan(["mspace"], [], options); - var size = units_calculateSize(measurement, options); - rule.style.marginRight = size + "em"; - return rule; -}; // Takes font options, and returns the appropriate fontLookup name - - -var retrieveTextFontName = function retrieveTextFontName(fontFamily, fontWeight, fontShape) { - var baseFontName = ""; - - switch (fontFamily) { - case "amsrm": - baseFontName = "AMS"; - break; - - case "textrm": - baseFontName = "Main"; - break; - - case "textsf": - baseFontName = "SansSerif"; - break; - - case "texttt": - baseFontName = "Typewriter"; - break; - - default: - baseFontName = fontFamily; - // use fonts added by a plugin - } - - var fontStylesName; - - if (fontWeight === "textbf" && fontShape === "textit") { - fontStylesName = "BoldItalic"; - } else if (fontWeight === "textbf") { - fontStylesName = "Bold"; - } else if (fontWeight === "textit") { - fontStylesName = "Italic"; - } else { - fontStylesName = "Regular"; - } - - return baseFontName + "-" + fontStylesName; -}; -/** - * Maps TeX font commands to objects containing: - * - variant: string used for "mathvariant" attribute in buildMathML.js - * - fontName: the "style" parameter to fontMetrics.getCharacterMetrics - */ -// A map between tex font commands an MathML mathvariant attribute values - - -var fontMap = { - // styles - "mathbf": { - variant: "bold", - fontName: "Main-Bold" - }, - "mathrm": { - variant: "normal", - fontName: "Main-Regular" - }, - "textit": { - variant: "italic", - fontName: "Main-Italic" - }, - "mathit": { - variant: "italic", - fontName: "Main-Italic" - }, - "mathnormal": { - variant: "italic", - fontName: "Math-Italic" - }, - // "boldsymbol" is missing because they require the use of multiple fonts: - // Math-BoldItalic and Main-Bold. This is handled by a special case in - // makeOrd which ends up calling boldsymbol. - // families - "mathbb": { - variant: "double-struck", - fontName: "AMS-Regular" - }, - "mathcal": { - variant: "script", - fontName: "Caligraphic-Regular" - }, - "mathfrak": { - variant: "fraktur", - fontName: "Fraktur-Regular" - }, - "mathscr": { - variant: "script", - fontName: "Script-Regular" - }, - "mathsf": { - variant: "sans-serif", - fontName: "SansSerif-Regular" - }, - "mathtt": { - variant: "monospace", - fontName: "Typewriter-Regular" - } -}; -var svgData = { - // path, width, height - vec: ["vec", 0.471, 0.714], - // values from the font glyph - oiintSize1: ["oiintSize1", 0.957, 0.499], - // oval to overlay the integrand - oiintSize2: ["oiintSize2", 1.472, 0.659], - oiiintSize1: ["oiiintSize1", 1.304, 0.499], - oiiintSize2: ["oiiintSize2", 1.98, 0.659], - leftParenInner: ["leftParenInner", 0.875, 0.3], - rightParenInner: ["rightParenInner", 0.875, 0.3] -}; - -var buildCommon_staticSvg = function staticSvg(value, options) { - // Create a span with inline SVG for the element. - var _svgData$value = svgData[value], - pathName = _svgData$value[0], - width = _svgData$value[1], - height = _svgData$value[2]; - var path = new domTree_PathNode(pathName); - var svgNode = new SvgNode([path], { - "width": width + "em", - "height": height + "em", - // Override CSS rule `.katex svg { width: 100% }` - "style": "width:" + width + "em", - "viewBox": "0 0 " + 1000 * width + " " + 1000 * height, - "preserveAspectRatio": "xMinYMin" - }); - var span = buildCommon_makeSvgSpan(["overlay"], [svgNode], options); - span.height = height; - span.style.height = height + "em"; - span.style.width = width + "em"; - return span; -}; - -/* harmony default export */ var buildCommon = ({ - fontMap: fontMap, - makeSymbol: buildCommon_makeSymbol, - mathsym: buildCommon_mathsym, - makeSpan: buildCommon_makeSpan, - makeSvgSpan: buildCommon_makeSvgSpan, - makeLineSpan: makeLineSpan, - makeAnchor: buildCommon_makeAnchor, - makeFragment: buildCommon_makeFragment, - wrapFragment: buildCommon_wrapFragment, - makeVList: buildCommon_makeVList, - makeOrd: buildCommon_makeOrd, - makeGlue: buildCommon_makeGlue, - staticSvg: buildCommon_staticSvg, - svgData: svgData, - tryCombineChars: buildCommon_tryCombineChars -}); -// CONCATENATED MODULE: ./src/spacingData.js -/** - * Describes spaces between different classes of atoms. - */ -var thinspace = { - number: 3, - unit: "mu" -}; -var mediumspace = { - number: 4, - unit: "mu" -}; -var thickspace = { - number: 5, - unit: "mu" -}; // Making the type below exact with all optional fields doesn't work due to -// - https://github.com/facebook/flow/issues/4582 -// - https://github.com/facebook/flow/issues/5688 -// However, since *all* fields are optional, $Shape<> works as suggested in 5688 -// above. - -// Spacing relationships for display and text styles -var spacings = { - mord: { - mop: thinspace, - mbin: mediumspace, - mrel: thickspace, - minner: thinspace - }, - mop: { - mord: thinspace, - mop: thinspace, - mrel: thickspace, - minner: thinspace - }, - mbin: { - mord: mediumspace, - mop: mediumspace, - mopen: mediumspace, - minner: mediumspace - }, - mrel: { - mord: thickspace, - mop: thickspace, - mopen: thickspace, - minner: thickspace - }, - mopen: {}, - mclose: { - mop: thinspace, - mbin: mediumspace, - mrel: thickspace, - minner: thinspace - }, - mpunct: { - mord: thinspace, - mop: thinspace, - mrel: thickspace, - mopen: thinspace, - mclose: thinspace, - mpunct: thinspace, - minner: thinspace - }, - minner: { - mord: thinspace, - mop: thinspace, - mbin: mediumspace, - mrel: thickspace, - mopen: thinspace, - mpunct: thinspace, - minner: thinspace - } -}; // Spacing relationships for script and scriptscript styles - -var tightSpacings = { - mord: { - mop: thinspace - }, - mop: { - mord: thinspace, - mop: thinspace - }, - mbin: {}, - mrel: {}, - mopen: {}, - mclose: { - mop: thinspace - }, - mpunct: {}, - minner: { - mop: thinspace - } -}; -// CONCATENATED MODULE: ./src/defineFunction.js -/** Context provided to function handlers for error messages. */ -// Note: reverse the order of the return type union will cause a flow error. -// See https://github.com/facebook/flow/issues/3663. -// More general version of `HtmlBuilder` for nodes (e.g. \sum, accent types) -// whose presence impacts super/subscripting. In this case, ParseNode<"supsub"> -// delegates its HTML building to the HtmlBuilder corresponding to these nodes. - -/** - * Final function spec for use at parse time. - * This is almost identical to `FunctionPropSpec`, except it - * 1. includes the function handler, and - * 2. requires all arguments except argTypes. - * It is generated by `defineFunction()` below. - */ - -/** - * All registered functions. - * `functions.js` just exports this same dictionary again and makes it public. - * `Parser.js` requires this dictionary. - */ -var _functions = {}; -/** - * All HTML builders. Should be only used in the `define*` and the `build*ML` - * functions. - */ - -var _htmlGroupBuilders = {}; -/** - * All MathML builders. Should be only used in the `define*` and the `build*ML` - * functions. - */ - -var _mathmlGroupBuilders = {}; -function defineFunction(_ref) { - var type = _ref.type, - names = _ref.names, - props = _ref.props, - handler = _ref.handler, - htmlBuilder = _ref.htmlBuilder, - mathmlBuilder = _ref.mathmlBuilder; - // Set default values of functions - var data = { - type: type, - numArgs: props.numArgs, - argTypes: props.argTypes, - greediness: props.greediness === undefined ? 1 : props.greediness, - allowedInText: !!props.allowedInText, - allowedInMath: props.allowedInMath === undefined ? true : props.allowedInMath, - numOptionalArgs: props.numOptionalArgs || 0, - infix: !!props.infix, - handler: handler - }; - - for (var i = 0; i < names.length; ++i) { - _functions[names[i]] = data; - } - - if (type) { - if (htmlBuilder) { - _htmlGroupBuilders[type] = htmlBuilder; - } - - if (mathmlBuilder) { - _mathmlGroupBuilders[type] = mathmlBuilder; - } - } -} -/** - * Use this to register only the HTML and MathML builders for a function (e.g. - * if the function's ParseNode is generated in Parser.js rather than via a - * stand-alone handler provided to `defineFunction`). - */ - -function defineFunctionBuilders(_ref2) { - var type = _ref2.type, - htmlBuilder = _ref2.htmlBuilder, - mathmlBuilder = _ref2.mathmlBuilder; - defineFunction({ - type: type, - names: [], - props: { - numArgs: 0 - }, - handler: function handler() { - throw new Error('Should never be called.'); - }, - htmlBuilder: htmlBuilder, - mathmlBuilder: mathmlBuilder - }); -} // Since the corresponding buildHTML/buildMathML function expects a -// list of elements, we normalize for different kinds of arguments - -var ordargument = function ordargument(arg) { - return arg.type === "ordgroup" ? arg.body : [arg]; -}; -// CONCATENATED MODULE: ./src/buildHTML.js -/** - * This file does the main work of building a domTree structure from a parse - * tree. The entry point is the `buildHTML` function, which takes a parse tree. - * Then, the buildExpression, buildGroup, and various groupBuilders functions - * are called, to produce a final HTML tree. - */ - - - - - - - - -var buildHTML_makeSpan = buildCommon.makeSpan; // Binary atoms (first class `mbin`) change into ordinary atoms (`mord`) -// depending on their surroundings. See TeXbook pg. 442-446, Rules 5 and 6, -// and the text before Rule 19. - -var binLeftCanceller = ["leftmost", "mbin", "mopen", "mrel", "mop", "mpunct"]; -var binRightCanceller = ["rightmost", "mrel", "mclose", "mpunct"]; -var styleMap = { - "display": src_Style.DISPLAY, - "text": src_Style.TEXT, - "script": src_Style.SCRIPT, - "scriptscript": src_Style.SCRIPTSCRIPT -}; -var DomEnum = { - mord: "mord", - mop: "mop", - mbin: "mbin", - mrel: "mrel", - mopen: "mopen", - mclose: "mclose", - mpunct: "mpunct", - minner: "minner" -}; - -/** - * Take a list of nodes, build them in order, and return a list of the built - * nodes. documentFragments are flattened into their contents, so the - * returned list contains no fragments. `isRealGroup` is true if `expression` - * is a real group (no atoms will be added on either side), as opposed to - * a partial group (e.g. one created by \color). `surrounding` is an array - * consisting type of nodes that will be added to the left and right. - */ -var buildHTML_buildExpression = function buildExpression(expression, options, isRealGroup, surrounding) { - if (surrounding === void 0) { - surrounding = [null, null]; - } - - // Parse expressions into `groups`. - var groups = []; - - for (var i = 0; i < expression.length; i++) { - var output = buildHTML_buildGroup(expression[i], options); - - if (output instanceof tree_DocumentFragment) { - var children = output.children; - groups.push.apply(groups, children); - } else { - groups.push(output); - } - } // If `expression` is a partial group, let the parent handle spacings - // to avoid processing groups multiple times. - - - if (!isRealGroup) { - return groups; - } - - var glueOptions = options; - - if (expression.length === 1) { - var node = expression[0]; - - if (node.type === "sizing") { - glueOptions = options.havingSize(node.size); - } else if (node.type === "styling") { - glueOptions = options.havingStyle(styleMap[node.style]); - } - } // Dummy spans for determining spacings between surrounding atoms. - // If `expression` has no atoms on the left or right, class "leftmost" - // or "rightmost", respectively, is used to indicate it. - - - var dummyPrev = buildHTML_makeSpan([surrounding[0] || "leftmost"], [], options); - var dummyNext = buildHTML_makeSpan([surrounding[1] || "rightmost"], [], options); // TODO: These code assumes that a node's math class is the first element - // of its `classes` array. A later cleanup should ensure this, for - // instance by changing the signature of `makeSpan`. - // Before determining what spaces to insert, perform bin cancellation. - // Binary operators change to ordinary symbols in some contexts. - - var isRoot = isRealGroup === "root"; - traverseNonSpaceNodes(groups, function (node, prev) { - var prevType = prev.classes[0]; - var type = node.classes[0]; - - if (prevType === "mbin" && utils.contains(binRightCanceller, type)) { - prev.classes[0] = "mord"; - } else if (type === "mbin" && utils.contains(binLeftCanceller, prevType)) { - node.classes[0] = "mord"; - } - }, { - node: dummyPrev - }, dummyNext, isRoot); - traverseNonSpaceNodes(groups, function (node, prev) { - var prevType = getTypeOfDomTree(prev); - var type = getTypeOfDomTree(node); // 'mtight' indicates that the node is script or scriptscript style. - - var space = prevType && type ? node.hasClass("mtight") ? tightSpacings[prevType][type] : spacings[prevType][type] : null; - - if (space) { - // Insert glue (spacing) after the `prev`. - return buildCommon.makeGlue(space, glueOptions); - } - }, { - node: dummyPrev - }, dummyNext, isRoot); - return groups; -}; // Depth-first traverse non-space `nodes`, calling `callback` with the current and -// previous node as arguments, optionally returning a node to insert after the -// previous node. `prev` is an object with the previous node and `insertAfter` -// function to insert after it. `next` is a node that will be added to the right. -// Used for bin cancellation and inserting spacings. - -var traverseNonSpaceNodes = function traverseNonSpaceNodes(nodes, callback, prev, next, isRoot) { - if (next) { - // temporarily append the right node, if exists - nodes.push(next); - } - - var i = 0; - - for (; i < nodes.length; i++) { - var node = nodes[i]; - var partialGroup = buildHTML_checkPartialGroup(node); - - if (partialGroup) { - // Recursive DFS - // $FlowFixMe: make nodes a $ReadOnlyArray by returning a new array - traverseNonSpaceNodes(partialGroup.children, callback, prev, null, isRoot); - continue; - } // Ignore explicit spaces (e.g., \;, \,) when determining what implicit - // spacing should go between atoms of different classes - - - var nonspace = !node.hasClass("mspace"); - - if (nonspace) { - var result = callback(node, prev.node); - - if (result) { - if (prev.insertAfter) { - prev.insertAfter(result); - } else { - // insert at front - nodes.unshift(result); - i++; - } - } - } - - if (nonspace) { - prev.node = node; - } else if (isRoot && node.hasClass("newline")) { - prev.node = buildHTML_makeSpan(["leftmost"]); // treat like beginning of line - } - - prev.insertAfter = function (index) { - return function (n) { - nodes.splice(index + 1, 0, n); - i++; - }; - }(i); - } - - if (next) { - nodes.pop(); - } -}; // Check if given node is a partial group, i.e., does not affect spacing around. - - -var buildHTML_checkPartialGroup = function checkPartialGroup(node) { - if (node instanceof tree_DocumentFragment || node instanceof domTree_Anchor || node instanceof domTree_Span && node.hasClass("enclosing")) { - return node; - } - - return null; -}; // Return the outermost node of a domTree. - - -var getOutermostNode = function getOutermostNode(node, side) { - var partialGroup = buildHTML_checkPartialGroup(node); - - if (partialGroup) { - var children = partialGroup.children; - - if (children.length) { - if (side === "right") { - return getOutermostNode(children[children.length - 1], "right"); - } else if (side === "left") { - return getOutermostNode(children[0], "left"); - } - } - } - - return node; -}; // Return math atom class (mclass) of a domTree. -// If `side` is given, it will get the type of the outermost node at given side. - - -var getTypeOfDomTree = function getTypeOfDomTree(node, side) { - if (!node) { - return null; - } - - if (side) { - node = getOutermostNode(node, side); - } // This makes a lot of assumptions as to where the type of atom - // appears. We should do a better job of enforcing this. - - - return DomEnum[node.classes[0]] || null; -}; -var makeNullDelimiter = function makeNullDelimiter(options, classes) { - var moreClasses = ["nulldelimiter"].concat(options.baseSizingClasses()); - return buildHTML_makeSpan(classes.concat(moreClasses)); -}; -/** - * buildGroup is the function that takes a group and calls the correct groupType - * function for it. It also handles the interaction of size and style changes - * between parents and children. - */ - -var buildHTML_buildGroup = function buildGroup(group, options, baseOptions) { - if (!group) { - return buildHTML_makeSpan(); - } - - if (_htmlGroupBuilders[group.type]) { - // Call the groupBuilders function - var groupNode = _htmlGroupBuilders[group.type](group, options); // If the size changed between the parent and the current group, account - // for that size difference. - - if (baseOptions && options.size !== baseOptions.size) { - groupNode = buildHTML_makeSpan(options.sizingClasses(baseOptions), [groupNode], options); - var multiplier = options.sizeMultiplier / baseOptions.sizeMultiplier; - groupNode.height *= multiplier; - groupNode.depth *= multiplier; - } - - return groupNode; - } else { - throw new src_ParseError("Got group of unknown type: '" + group.type + "'"); - } -}; -/** - * Combine an array of HTML DOM nodes (e.g., the output of `buildExpression`) - * into an unbreakable HTML node of class .base, with proper struts to - * guarantee correct vertical extent. `buildHTML` calls this repeatedly to - * make up the entire expression as a sequence of unbreakable units. - */ - -function buildHTMLUnbreakable(children, options) { - // Compute height and depth of this chunk. - var body = buildHTML_makeSpan(["base"], children, options); // Add strut, which ensures that the top of the HTML element falls at - // the height of the expression, and the bottom of the HTML element - // falls at the depth of the expression. - - var strut = buildHTML_makeSpan(["strut"]); - strut.style.height = body.height + body.depth + "em"; - strut.style.verticalAlign = -body.depth + "em"; - body.children.unshift(strut); - return body; -} -/** - * Take an entire parse tree, and build it into an appropriate set of HTML - * nodes. - */ - - -function buildHTML(tree, options) { - // Strip off outer tag wrapper for processing below. - var tag = null; - - if (tree.length === 1 && tree[0].type === "tag") { - tag = tree[0].tag; - tree = tree[0].body; - } // Build the expression contained in the tree - - - var expression = buildHTML_buildExpression(tree, options, "root"); - var children = []; // Create one base node for each chunk between potential line breaks. - // The TeXBook [p.173] says "A formula will be broken only after a - // relation symbol like $=$ or $<$ or $\rightarrow$, or after a binary - // operation symbol like $+$ or $-$ or $\times$, where the relation or - // binary operation is on the ``outer level'' of the formula (i.e., not - // enclosed in {...} and not part of an \over construction)." - - var parts = []; - - for (var i = 0; i < expression.length; i++) { - parts.push(expression[i]); - - if (expression[i].hasClass("mbin") || expression[i].hasClass("mrel") || expression[i].hasClass("allowbreak")) { - // Put any post-operator glue on same line as operator. - // Watch for \nobreak along the way, and stop at \newline. - var nobreak = false; - - while (i < expression.length - 1 && expression[i + 1].hasClass("mspace") && !expression[i + 1].hasClass("newline")) { - i++; - parts.push(expression[i]); - - if (expression[i].hasClass("nobreak")) { - nobreak = true; - } - } // Don't allow break if \nobreak among the post-operator glue. - - - if (!nobreak) { - children.push(buildHTMLUnbreakable(parts, options)); - parts = []; - } - } else if (expression[i].hasClass("newline")) { - // Write the line except the newline - parts.pop(); - - if (parts.length > 0) { - children.push(buildHTMLUnbreakable(parts, options)); - parts = []; - } // Put the newline at the top level - - - children.push(expression[i]); - } - } - - if (parts.length > 0) { - children.push(buildHTMLUnbreakable(parts, options)); - } // Now, if there was a tag, build it too and append it as a final child. - - - var tagChild; - - if (tag) { - tagChild = buildHTMLUnbreakable(buildHTML_buildExpression(tag, options, true)); - tagChild.classes = ["tag"]; - children.push(tagChild); - } - - var htmlNode = buildHTML_makeSpan(["katex-html"], children); - htmlNode.setAttribute("aria-hidden", "true"); // Adjust the strut of the tag to be the maximum height of all children - // (the height of the enclosing htmlNode) for proper vertical alignment. - - if (tagChild) { - var strut = tagChild.children[0]; - strut.style.height = htmlNode.height + htmlNode.depth + "em"; - strut.style.verticalAlign = -htmlNode.depth + "em"; - } - - return htmlNode; -} -// CONCATENATED MODULE: ./src/mathMLTree.js -/** - * These objects store data about MathML nodes. This is the MathML equivalent - * of the types in domTree.js. Since MathML handles its own rendering, and - * since we're mainly using MathML to improve accessibility, we don't manage - * any of the styling state that the plain DOM nodes do. - * - * The `toNode` and `toMarkup` functions work simlarly to how they do in - * domTree.js, creating namespaced DOM nodes and HTML text markup respectively. - */ - - -function newDocumentFragment(children) { - return new tree_DocumentFragment(children); -} -/** - * This node represents a general purpose MathML node of any type. The - * constructor requires the type of node to create (for example, `"mo"` or - * `"mspace"`, corresponding to `` and `` tags). - */ - -var mathMLTree_MathNode = -/*#__PURE__*/ -function () { - function MathNode(type, children) { - this.type = void 0; - this.attributes = void 0; - this.children = void 0; - this.type = type; - this.attributes = {}; - this.children = children || []; - } - /** - * Sets an attribute on a MathML node. MathML depends on attributes to convey a - * semantic content, so this is used heavily. - */ - - - var _proto = MathNode.prototype; - - _proto.setAttribute = function setAttribute(name, value) { - this.attributes[name] = value; - } - /** - * Gets an attribute on a MathML node. - */ - ; - - _proto.getAttribute = function getAttribute(name) { - return this.attributes[name]; - } - /** - * Converts the math node into a MathML-namespaced DOM element. - */ - ; - - _proto.toNode = function toNode() { - var node = document.createElementNS("http://www.w3.org/1998/Math/MathML", this.type); - - for (var attr in this.attributes) { - if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) { - node.setAttribute(attr, this.attributes[attr]); - } - } - - for (var i = 0; i < this.children.length; i++) { - node.appendChild(this.children[i].toNode()); - } - - return node; - } - /** - * Converts the math node into an HTML markup string. - */ - ; - - _proto.toMarkup = function toMarkup() { - var markup = "<" + this.type; // Add the attributes - - for (var attr in this.attributes) { - if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) { - markup += " " + attr + "=\""; - markup += utils.escape(this.attributes[attr]); - markup += "\""; - } - } - - markup += ">"; - - for (var i = 0; i < this.children.length; i++) { - markup += this.children[i].toMarkup(); - } - - markup += ""; - return markup; - } - /** - * Converts the math node into a string, similar to innerText, but escaped. - */ - ; - - _proto.toText = function toText() { - return this.children.map(function (child) { - return child.toText(); - }).join(""); - }; - - return MathNode; -}(); -/** - * This node represents a piece of text. - */ - -var mathMLTree_TextNode = -/*#__PURE__*/ -function () { - function TextNode(text) { - this.text = void 0; - this.text = text; - } - /** - * Converts the text node into a DOM text node. - */ - - - var _proto2 = TextNode.prototype; - - _proto2.toNode = function toNode() { - return document.createTextNode(this.text); - } - /** - * Converts the text node into escaped HTML markup - * (representing the text itself). - */ - ; - - _proto2.toMarkup = function toMarkup() { - return utils.escape(this.toText()); - } - /** - * Converts the text node into a string - * (representing the text iteself). - */ - ; - - _proto2.toText = function toText() { - return this.text; - }; - - return TextNode; -}(); -/** - * This node represents a space, but may render as or as text, - * depending on the width. - */ - -var SpaceNode = -/*#__PURE__*/ -function () { - /** - * Create a Space node with width given in CSS ems. - */ - function SpaceNode(width) { - this.width = void 0; - this.character = void 0; - this.width = width; // See https://www.w3.org/TR/2000/WD-MathML2-20000328/chapter6.html - // for a table of space-like characters. We use Unicode - // representations instead of &LongNames; as it's not clear how to - // make the latter via document.createTextNode. - - if (width >= 0.05555 && width <= 0.05556) { - this.character = "\u200A"; //   - } else if (width >= 0.1666 && width <= 0.1667) { - this.character = "\u2009"; //   - } else if (width >= 0.2222 && width <= 0.2223) { - this.character = "\u2005"; //   - } else if (width >= 0.2777 && width <= 0.2778) { - this.character = "\u2005\u200A"; //    - } else if (width >= -0.05556 && width <= -0.05555) { - this.character = "\u200A\u2063"; // ​ - } else if (width >= -0.1667 && width <= -0.1666) { - this.character = "\u2009\u2063"; // ​ - } else if (width >= -0.2223 && width <= -0.2222) { - this.character = "\u205F\u2063"; // ​ - } else if (width >= -0.2778 && width <= -0.2777) { - this.character = "\u2005\u2063"; // ​ - } else { - this.character = null; - } - } - /** - * Converts the math node into a MathML-namespaced DOM element. - */ - - - var _proto3 = SpaceNode.prototype; - - _proto3.toNode = function toNode() { - if (this.character) { - return document.createTextNode(this.character); - } else { - var node = document.createElementNS("http://www.w3.org/1998/Math/MathML", "mspace"); - node.setAttribute("width", this.width + "em"); - return node; - } - } - /** - * Converts the math node into an HTML markup string. - */ - ; - - _proto3.toMarkup = function toMarkup() { - if (this.character) { - return "" + this.character + ""; - } else { - return ""; - } - } - /** - * Converts the math node into a string, similar to innerText. - */ - ; - - _proto3.toText = function toText() { - if (this.character) { - return this.character; - } else { - return " "; - } - }; - - return SpaceNode; -}(); - -/* harmony default export */ var mathMLTree = ({ - MathNode: mathMLTree_MathNode, - TextNode: mathMLTree_TextNode, - SpaceNode: SpaceNode, - newDocumentFragment: newDocumentFragment -}); -// CONCATENATED MODULE: ./src/buildMathML.js -/** - * This file converts a parse tree into a cooresponding MathML tree. The main - * entry point is the `buildMathML` function, which takes a parse tree from the - * parser. - */ - - - - - - - - - -/** - * Takes a symbol and converts it into a MathML text node after performing - * optional replacement from symbols.js. - */ -var buildMathML_makeText = function makeText(text, mode, options) { - if (src_symbols[mode][text] && src_symbols[mode][text].replace && text.charCodeAt(0) !== 0xD835 && !(ligatures.hasOwnProperty(text) && options && (options.fontFamily && options.fontFamily.substr(4, 2) === "tt" || options.font && options.font.substr(4, 2) === "tt"))) { - text = src_symbols[mode][text].replace; - } - - return new mathMLTree.TextNode(text); -}; -/** - * Wrap the given array of nodes in an node if needed, i.e., - * unless the array has length 1. Always returns a single node. - */ - -var buildMathML_makeRow = function makeRow(body) { - if (body.length === 1) { - return body[0]; - } else { - return new mathMLTree.MathNode("mrow", body); - } -}; -/** - * Returns the math variant as a string or null if none is required. - */ - -var buildMathML_getVariant = function getVariant(group, options) { - // Handle \text... font specifiers as best we can. - // MathML has a limited list of allowable mathvariant specifiers; see - // https://www.w3.org/TR/MathML3/chapter3.html#presm.commatt - if (options.fontFamily === "texttt") { - return "monospace"; - } else if (options.fontFamily === "textsf") { - if (options.fontShape === "textit" && options.fontWeight === "textbf") { - return "sans-serif-bold-italic"; - } else if (options.fontShape === "textit") { - return "sans-serif-italic"; - } else if (options.fontWeight === "textbf") { - return "bold-sans-serif"; - } else { - return "sans-serif"; - } - } else if (options.fontShape === "textit" && options.fontWeight === "textbf") { - return "bold-italic"; - } else if (options.fontShape === "textit") { - return "italic"; - } else if (options.fontWeight === "textbf") { - return "bold"; - } - - var font = options.font; - - if (!font || font === "mathnormal") { - return null; - } - - var mode = group.mode; - - if (font === "mathit") { - return "italic"; - } else if (font === "boldsymbol") { - return group.type === "textord" ? "bold" : "bold-italic"; - } else if (font === "mathbf") { - return "bold"; - } else if (font === "mathbb") { - return "double-struck"; - } else if (font === "mathfrak") { - return "fraktur"; - } else if (font === "mathscr" || font === "mathcal") { - // MathML makes no distinction between script and caligrahpic - return "script"; - } else if (font === "mathsf") { - return "sans-serif"; - } else if (font === "mathtt") { - return "monospace"; - } - - var text = group.text; - - if (utils.contains(["\\imath", "\\jmath"], text)) { - return null; - } - - if (src_symbols[mode][text] && src_symbols[mode][text].replace) { - text = src_symbols[mode][text].replace; - } - - var fontName = buildCommon.fontMap[font].fontName; - - if (getCharacterMetrics(text, fontName, mode)) { - return buildCommon.fontMap[font].variant; - } - - return null; -}; -/** - * Takes a list of nodes, builds them, and returns a list of the generated - * MathML nodes. Also combine consecutive outputs into a single - * tag. - */ - -var buildMathML_buildExpression = function buildExpression(expression, options, isOrdgroup) { - if (expression.length === 1) { - var group = buildMathML_buildGroup(expression[0], options); - - if (isOrdgroup && group instanceof mathMLTree_MathNode && group.type === "mo") { - // When TeX writers want to suppress spacing on an operator, - // they often put the operator by itself inside braces. - group.setAttribute("lspace", "0em"); - group.setAttribute("rspace", "0em"); - } - - return [group]; - } - - var groups = []; - var lastGroup; - - for (var i = 0; i < expression.length; i++) { - var _group = buildMathML_buildGroup(expression[i], options); - - if (_group instanceof mathMLTree_MathNode && lastGroup instanceof mathMLTree_MathNode) { - // Concatenate adjacent s - if (_group.type === 'mtext' && lastGroup.type === 'mtext' && _group.getAttribute('mathvariant') === lastGroup.getAttribute('mathvariant')) { - var _lastGroup$children; - - (_lastGroup$children = lastGroup.children).push.apply(_lastGroup$children, _group.children); - - continue; // Concatenate adjacent s - } else if (_group.type === 'mn' && lastGroup.type === 'mn') { - var _lastGroup$children2; - - (_lastGroup$children2 = lastGroup.children).push.apply(_lastGroup$children2, _group.children); - - continue; // Concatenate ... followed by . - } else if (_group.type === 'mi' && _group.children.length === 1 && lastGroup.type === 'mn') { - var child = _group.children[0]; - - if (child instanceof mathMLTree_TextNode && child.text === '.') { - var _lastGroup$children3; - - (_lastGroup$children3 = lastGroup.children).push.apply(_lastGroup$children3, _group.children); - - continue; - } - } else if (lastGroup.type === 'mi' && lastGroup.children.length === 1) { - var lastChild = lastGroup.children[0]; - - if (lastChild instanceof mathMLTree_TextNode && lastChild.text === "\u0338" && (_group.type === 'mo' || _group.type === 'mi' || _group.type === 'mn')) { - var _child = _group.children[0]; - - if (_child instanceof mathMLTree_TextNode && _child.text.length > 0) { - // Overlay with combining character long solidus - _child.text = _child.text.slice(0, 1) + "\u0338" + _child.text.slice(1); - groups.pop(); - } - } - } - } - - groups.push(_group); - lastGroup = _group; - } - - return groups; -}; -/** - * Equivalent to buildExpression, but wraps the elements in an - * if there's more than one. Returns a single node instead of an array. - */ - -var buildExpressionRow = function buildExpressionRow(expression, options, isOrdgroup) { - return buildMathML_makeRow(buildMathML_buildExpression(expression, options, isOrdgroup)); -}; -/** - * Takes a group from the parser and calls the appropriate groupBuilders function - * on it to produce a MathML node. - */ - -var buildMathML_buildGroup = function buildGroup(group, options) { - if (!group) { - return new mathMLTree.MathNode("mrow"); - } - - if (_mathmlGroupBuilders[group.type]) { - // Call the groupBuilders function - var result = _mathmlGroupBuilders[group.type](group, options); - return result; - } else { - throw new src_ParseError("Got group of unknown type: '" + group.type + "'"); - } -}; -/** - * Takes a full parse tree and settings and builds a MathML representation of - * it. In particular, we put the elements from building the parse tree into a - * tag so we can also include that TeX source as an annotation. - * - * Note that we actually return a domTree element with a `` inside it so - * we can do appropriate styling. - */ - -function buildMathML(tree, texExpression, options, isDisplayMode, forMathmlOnly) { - var expression = buildMathML_buildExpression(tree, options); // Wrap up the expression in an mrow so it is presented in the semantics - // tag correctly, unless it's a single or . - - var wrapper; - - if (expression.length === 1 && expression[0] instanceof mathMLTree_MathNode && utils.contains(["mrow", "mtable"], expression[0].type)) { - wrapper = expression[0]; - } else { - wrapper = new mathMLTree.MathNode("mrow", expression); - } // Build a TeX annotation of the source - - - var annotation = new mathMLTree.MathNode("annotation", [new mathMLTree.TextNode(texExpression)]); - annotation.setAttribute("encoding", "application/x-tex"); - var semantics = new mathMLTree.MathNode("semantics", [wrapper, annotation]); - var math = new mathMLTree.MathNode("math", [semantics]); - math.setAttribute("xmlns", "http://www.w3.org/1998/Math/MathML"); - - if (isDisplayMode) { - math.setAttribute("display", "block"); - } // You can't style nodes, so we wrap the node in a span. - // NOTE: The span class is not typed to have nodes as children, and - // we don't want to make the children type more generic since the children - // of span are expected to have more fields in `buildHtml` contexts. - - - var wrapperClass = forMathmlOnly ? "katex" : "katex-mathml"; // $FlowFixMe - - return buildCommon.makeSpan([wrapperClass], [math]); -} -// CONCATENATED MODULE: ./src/buildTree.js - - - - - - - -var buildTree_optionsFromSettings = function optionsFromSettings(settings) { - return new src_Options({ - style: settings.displayMode ? src_Style.DISPLAY : src_Style.TEXT, - maxSize: settings.maxSize, - minRuleThickness: settings.minRuleThickness - }); -}; - -var buildTree_displayWrap = function displayWrap(node, settings) { - if (settings.displayMode) { - var classes = ["katex-display"]; - - if (settings.leqno) { - classes.push("leqno"); - } - - if (settings.fleqn) { - classes.push("fleqn"); - } - - node = buildCommon.makeSpan(classes, [node]); - } - - return node; -}; - -var buildTree_buildTree = function buildTree(tree, expression, settings) { - var options = buildTree_optionsFromSettings(settings); - var katexNode; - - if (settings.output === "mathml") { - return buildMathML(tree, expression, options, settings.displayMode, true); - } else if (settings.output === "html") { - var htmlNode = buildHTML(tree, options); - katexNode = buildCommon.makeSpan(["katex"], [htmlNode]); - } else { - var mathMLNode = buildMathML(tree, expression, options, settings.displayMode, false); - - var _htmlNode = buildHTML(tree, options); - - katexNode = buildCommon.makeSpan(["katex"], [mathMLNode, _htmlNode]); - } - - return buildTree_displayWrap(katexNode, settings); -}; -var buildTree_buildHTMLTree = function buildHTMLTree(tree, expression, settings) { - var options = buildTree_optionsFromSettings(settings); - var htmlNode = buildHTML(tree, options); - var katexNode = buildCommon.makeSpan(["katex"], [htmlNode]); - return buildTree_displayWrap(katexNode, settings); -}; -// CONCATENATED MODULE: ./src/stretchy.js -/** - * This file provides support to buildMathML.js and buildHTML.js - * for stretchy wide elements rendered from SVG files - * and other CSS trickery. - */ - - - - -var stretchyCodePoint = { - widehat: "^", - widecheck: "ˇ", - widetilde: "~", - utilde: "~", - overleftarrow: "\u2190", - underleftarrow: "\u2190", - xleftarrow: "\u2190", - overrightarrow: "\u2192", - underrightarrow: "\u2192", - xrightarrow: "\u2192", - underbrace: "\u23DF", - overbrace: "\u23DE", - overgroup: "\u23E0", - undergroup: "\u23E1", - overleftrightarrow: "\u2194", - underleftrightarrow: "\u2194", - xleftrightarrow: "\u2194", - Overrightarrow: "\u21D2", - xRightarrow: "\u21D2", - overleftharpoon: "\u21BC", - xleftharpoonup: "\u21BC", - overrightharpoon: "\u21C0", - xrightharpoonup: "\u21C0", - xLeftarrow: "\u21D0", - xLeftrightarrow: "\u21D4", - xhookleftarrow: "\u21A9", - xhookrightarrow: "\u21AA", - xmapsto: "\u21A6", - xrightharpoondown: "\u21C1", - xleftharpoondown: "\u21BD", - xrightleftharpoons: "\u21CC", - xleftrightharpoons: "\u21CB", - xtwoheadleftarrow: "\u219E", - xtwoheadrightarrow: "\u21A0", - xlongequal: "=", - xtofrom: "\u21C4", - xrightleftarrows: "\u21C4", - xrightequilibrium: "\u21CC", - // Not a perfect match. - xleftequilibrium: "\u21CB" // None better available. - -}; - -var stretchy_mathMLnode = function mathMLnode(label) { - var node = new mathMLTree.MathNode("mo", [new mathMLTree.TextNode(stretchyCodePoint[label.substr(1)])]); - node.setAttribute("stretchy", "true"); - return node; -}; // Many of the KaTeX SVG images have been adapted from glyphs in KaTeX fonts. -// Copyright (c) 2009-2010, Design Science, Inc. () -// Copyright (c) 2014-2017 Khan Academy () -// Licensed under the SIL Open Font License, Version 1.1. -// See \nhttp://scripts.sil.org/OFL -// Very Long SVGs -// Many of the KaTeX stretchy wide elements use a long SVG image and an -// overflow: hidden tactic to achieve a stretchy image while avoiding -// distortion of arrowheads or brace corners. -// The SVG typically contains a very long (400 em) arrow. -// The SVG is in a container span that has overflow: hidden, so the span -// acts like a window that exposes only part of the SVG. -// The SVG always has a longer, thinner aspect ratio than the container span. -// After the SVG fills 100% of the height of the container span, -// there is a long arrow shaft left over. That left-over shaft is not shown. -// Instead, it is sliced off because the span's CSS has overflow: hidden. -// Thus, the reader sees an arrow that matches the subject matter width -// without distortion. -// Some functions, such as \cancel, need to vary their aspect ratio. These -// functions do not get the overflow SVG treatment. -// Second Brush Stroke -// Low resolution monitors struggle to display images in fine detail. -// So browsers apply anti-aliasing. A long straight arrow shaft therefore -// will sometimes appear as if it has a blurred edge. -// To mitigate this, these SVG files contain a second "brush-stroke" on the -// arrow shafts. That is, a second long thin rectangular SVG path has been -// written directly on top of each arrow shaft. This reinforcement causes -// some of the screen pixels to display as black instead of the anti-aliased -// gray pixel that a single path would generate. So we get arrow shafts -// whose edges appear to be sharper. -// In the katexImagesData object just below, the dimensions all -// correspond to path geometry inside the relevant SVG. -// For example, \overrightarrow uses the same arrowhead as glyph U+2192 -// from the KaTeX Main font. The scaling factor is 1000. -// That is, inside the font, that arrowhead is 522 units tall, which -// corresponds to 0.522 em inside the document. - - -var katexImagesData = { - // path(s), minWidth, height, align - overrightarrow: [["rightarrow"], 0.888, 522, "xMaxYMin"], - overleftarrow: [["leftarrow"], 0.888, 522, "xMinYMin"], - underrightarrow: [["rightarrow"], 0.888, 522, "xMaxYMin"], - underleftarrow: [["leftarrow"], 0.888, 522, "xMinYMin"], - xrightarrow: [["rightarrow"], 1.469, 522, "xMaxYMin"], - xleftarrow: [["leftarrow"], 1.469, 522, "xMinYMin"], - Overrightarrow: [["doublerightarrow"], 0.888, 560, "xMaxYMin"], - xRightarrow: [["doublerightarrow"], 1.526, 560, "xMaxYMin"], - xLeftarrow: [["doubleleftarrow"], 1.526, 560, "xMinYMin"], - overleftharpoon: [["leftharpoon"], 0.888, 522, "xMinYMin"], - xleftharpoonup: [["leftharpoon"], 0.888, 522, "xMinYMin"], - xleftharpoondown: [["leftharpoondown"], 0.888, 522, "xMinYMin"], - overrightharpoon: [["rightharpoon"], 0.888, 522, "xMaxYMin"], - xrightharpoonup: [["rightharpoon"], 0.888, 522, "xMaxYMin"], - xrightharpoondown: [["rightharpoondown"], 0.888, 522, "xMaxYMin"], - xlongequal: [["longequal"], 0.888, 334, "xMinYMin"], - xtwoheadleftarrow: [["twoheadleftarrow"], 0.888, 334, "xMinYMin"], - xtwoheadrightarrow: [["twoheadrightarrow"], 0.888, 334, "xMaxYMin"], - overleftrightarrow: [["leftarrow", "rightarrow"], 0.888, 522], - overbrace: [["leftbrace", "midbrace", "rightbrace"], 1.6, 548], - underbrace: [["leftbraceunder", "midbraceunder", "rightbraceunder"], 1.6, 548], - underleftrightarrow: [["leftarrow", "rightarrow"], 0.888, 522], - xleftrightarrow: [["leftarrow", "rightarrow"], 1.75, 522], - xLeftrightarrow: [["doubleleftarrow", "doublerightarrow"], 1.75, 560], - xrightleftharpoons: [["leftharpoondownplus", "rightharpoonplus"], 1.75, 716], - xleftrightharpoons: [["leftharpoonplus", "rightharpoondownplus"], 1.75, 716], - xhookleftarrow: [["leftarrow", "righthook"], 1.08, 522], - xhookrightarrow: [["lefthook", "rightarrow"], 1.08, 522], - overlinesegment: [["leftlinesegment", "rightlinesegment"], 0.888, 522], - underlinesegment: [["leftlinesegment", "rightlinesegment"], 0.888, 522], - overgroup: [["leftgroup", "rightgroup"], 0.888, 342], - undergroup: [["leftgroupunder", "rightgroupunder"], 0.888, 342], - xmapsto: [["leftmapsto", "rightarrow"], 1.5, 522], - xtofrom: [["leftToFrom", "rightToFrom"], 1.75, 528], - // The next three arrows are from the mhchem package. - // In mhchem.sty, min-length is 2.0em. But these arrows might appear in the - // document as \xrightarrow or \xrightleftharpoons. Those have - // min-length = 1.75em, so we set min-length on these next three to match. - xrightleftarrows: [["baraboveleftarrow", "rightarrowabovebar"], 1.75, 901], - xrightequilibrium: [["baraboveshortleftharpoon", "rightharpoonaboveshortbar"], 1.75, 716], - xleftequilibrium: [["shortbaraboveleftharpoon", "shortrightharpoonabovebar"], 1.75, 716] -}; - -var groupLength = function groupLength(arg) { - if (arg.type === "ordgroup") { - return arg.body.length; - } else { - return 1; - } -}; - -var stretchy_svgSpan = function svgSpan(group, options) { - // Create a span with inline SVG for the element. - function buildSvgSpan_() { - var viewBoxWidth = 400000; // default - - var label = group.label.substr(1); - - if (utils.contains(["widehat", "widecheck", "widetilde", "utilde"], label)) { - // Each type in the `if` statement corresponds to one of the ParseNode - // types below. This narrowing is required to access `grp.base`. - var grp = group; // There are four SVG images available for each function. - // Choose a taller image when there are more characters. - - var numChars = groupLength(grp.base); - var viewBoxHeight; - var pathName; - - var _height; - - if (numChars > 5) { - if (label === "widehat" || label === "widecheck") { - viewBoxHeight = 420; - viewBoxWidth = 2364; - _height = 0.42; - pathName = label + "4"; - } else { - viewBoxHeight = 312; - viewBoxWidth = 2340; - _height = 0.34; - pathName = "tilde4"; - } - } else { - var imgIndex = [1, 1, 2, 2, 3, 3][numChars]; - - if (label === "widehat" || label === "widecheck") { - viewBoxWidth = [0, 1062, 2364, 2364, 2364][imgIndex]; - viewBoxHeight = [0, 239, 300, 360, 420][imgIndex]; - _height = [0, 0.24, 0.3, 0.3, 0.36, 0.42][imgIndex]; - pathName = label + imgIndex; - } else { - viewBoxWidth = [0, 600, 1033, 2339, 2340][imgIndex]; - viewBoxHeight = [0, 260, 286, 306, 312][imgIndex]; - _height = [0, 0.26, 0.286, 0.3, 0.306, 0.34][imgIndex]; - pathName = "tilde" + imgIndex; - } - } - - var path = new domTree_PathNode(pathName); - var svgNode = new SvgNode([path], { - "width": "100%", - "height": _height + "em", - "viewBox": "0 0 " + viewBoxWidth + " " + viewBoxHeight, - "preserveAspectRatio": "none" - }); - return { - span: buildCommon.makeSvgSpan([], [svgNode], options), - minWidth: 0, - height: _height - }; - } else { - var spans = []; - var data = katexImagesData[label]; - var paths = data[0], - _minWidth = data[1], - _viewBoxHeight = data[2]; - - var _height2 = _viewBoxHeight / 1000; - - var numSvgChildren = paths.length; - var widthClasses; - var aligns; - - if (numSvgChildren === 1) { - // $FlowFixMe: All these cases must be of the 4-tuple type. - var align1 = data[3]; - widthClasses = ["hide-tail"]; - aligns = [align1]; - } else if (numSvgChildren === 2) { - widthClasses = ["halfarrow-left", "halfarrow-right"]; - aligns = ["xMinYMin", "xMaxYMin"]; - } else if (numSvgChildren === 3) { - widthClasses = ["brace-left", "brace-center", "brace-right"]; - aligns = ["xMinYMin", "xMidYMin", "xMaxYMin"]; - } else { - throw new Error("Correct katexImagesData or update code here to support\n " + numSvgChildren + " children."); - } - - for (var i = 0; i < numSvgChildren; i++) { - var _path = new domTree_PathNode(paths[i]); - - var _svgNode = new SvgNode([_path], { - "width": "400em", - "height": _height2 + "em", - "viewBox": "0 0 " + viewBoxWidth + " " + _viewBoxHeight, - "preserveAspectRatio": aligns[i] + " slice" - }); - - var _span = buildCommon.makeSvgSpan([widthClasses[i]], [_svgNode], options); - - if (numSvgChildren === 1) { - return { - span: _span, - minWidth: _minWidth, - height: _height2 - }; - } else { - _span.style.height = _height2 + "em"; - spans.push(_span); - } - } - - return { - span: buildCommon.makeSpan(["stretchy"], spans, options), - minWidth: _minWidth, - height: _height2 - }; - } - } // buildSvgSpan_() - - - var _buildSvgSpan_ = buildSvgSpan_(), - span = _buildSvgSpan_.span, - minWidth = _buildSvgSpan_.minWidth, - height = _buildSvgSpan_.height; // Note that we are returning span.depth = 0. - // Any adjustments relative to the baseline must be done in buildHTML. - - - span.height = height; - span.style.height = height + "em"; - - if (minWidth > 0) { - span.style.minWidth = minWidth + "em"; - } - - return span; -}; - -var stretchy_encloseSpan = function encloseSpan(inner, label, pad, options) { - // Return an image span for \cancel, \bcancel, \xcancel, or \fbox - var img; - var totalHeight = inner.height + inner.depth + 2 * pad; - - if (/fbox|color/.test(label)) { - img = buildCommon.makeSpan(["stretchy", label], [], options); - - if (label === "fbox") { - var color = options.color && options.getColor(); - - if (color) { - img.style.borderColor = color; - } - } - } else { - // \cancel, \bcancel, or \xcancel - // Since \cancel's SVG is inline and it omits the viewBox attribute, - // its stroke-width will not vary with span area. - var lines = []; - - if (/^[bx]cancel$/.test(label)) { - lines.push(new LineNode({ - "x1": "0", - "y1": "0", - "x2": "100%", - "y2": "100%", - "stroke-width": "0.046em" - })); - } - - if (/^x?cancel$/.test(label)) { - lines.push(new LineNode({ - "x1": "0", - "y1": "100%", - "x2": "100%", - "y2": "0", - "stroke-width": "0.046em" - })); - } - - var svgNode = new SvgNode(lines, { - "width": "100%", - "height": totalHeight + "em" - }); - img = buildCommon.makeSvgSpan([], [svgNode], options); - } - - img.height = totalHeight; - img.style.height = totalHeight + "em"; - return img; -}; - -/* harmony default export */ var stretchy = ({ - encloseSpan: stretchy_encloseSpan, - mathMLnode: stretchy_mathMLnode, - svgSpan: stretchy_svgSpan -}); -// CONCATENATED MODULE: ./src/parseNode.js - - -/** - * Asserts that the node is of the given type and returns it with stricter - * typing. Throws if the node's type does not match. - */ -function assertNodeType(node, type) { - if (!node || node.type !== type) { - throw new Error("Expected node of type " + type + ", but got " + (node ? "node of type " + node.type : String(node))); - } - - return node; -} -/** - * Returns the node more strictly typed iff it is of the given type. Otherwise, - * returns null. - */ - -function assertSymbolNodeType(node) { - var typedNode = checkSymbolNodeType(node); - - if (!typedNode) { - throw new Error("Expected node of symbol group type, but got " + (node ? "node of type " + node.type : String(node))); - } - - return typedNode; -} -/** - * Returns the node more strictly typed iff it is of the given type. Otherwise, - * returns null. - */ - -function checkSymbolNodeType(node) { - if (node && (node.type === "atom" || NON_ATOMS.hasOwnProperty(node.type))) { - // $FlowFixMe - return node; - } - - return null; -} -// CONCATENATED MODULE: ./src/functions/accent.js - - - - - - - - - -// NOTE: Unlike most `htmlBuilder`s, this one handles not only "accent", but -var accent_htmlBuilder = function htmlBuilder(grp, options) { - // Accents are handled in the TeXbook pg. 443, rule 12. - var base; - var group; - var supSubGroup; - - if (grp && grp.type === "supsub") { - // If our base is a character box, and we have superscripts and - // subscripts, the supsub will defer to us. In particular, we want - // to attach the superscripts and subscripts to the inner body (so - // that the position of the superscripts and subscripts won't be - // affected by the height of the accent). We accomplish this by - // sticking the base of the accent into the base of the supsub, and - // rendering that, while keeping track of where the accent is. - // The real accent group is the base of the supsub group - group = assertNodeType(grp.base, "accent"); // The character box is the base of the accent group - - base = group.base; // Stick the character box into the base of the supsub group - - grp.base = base; // Rerender the supsub group with its new base, and store that - // result. - - supSubGroup = assertSpan(buildHTML_buildGroup(grp, options)); // reset original base - - grp.base = group; - } else { - group = assertNodeType(grp, "accent"); - base = group.base; - } // Build the base group - - - var body = buildHTML_buildGroup(base, options.havingCrampedStyle()); // Does the accent need to shift for the skew of a character? - - var mustShift = group.isShifty && utils.isCharacterBox(base); // Calculate the skew of the accent. This is based on the line "If the - // nucleus is not a single character, let s = 0; otherwise set s to the - // kern amount for the nucleus followed by the \skewchar of its font." - // Note that our skew metrics are just the kern between each character - // and the skewchar. - - var skew = 0; - - if (mustShift) { - // If the base is a character box, then we want the skew of the - // innermost character. To do that, we find the innermost character: - var baseChar = utils.getBaseElem(base); // Then, we render its group to get the symbol inside it - - var baseGroup = buildHTML_buildGroup(baseChar, options.havingCrampedStyle()); // Finally, we pull the skew off of the symbol. - - skew = assertSymbolDomNode(baseGroup).skew; // Note that we now throw away baseGroup, because the layers we - // removed with getBaseElem might contain things like \color which - // we can't get rid of. - // TODO(emily): Find a better way to get the skew - } // calculate the amount of space between the body and the accent - - - var clearance = Math.min(body.height, options.fontMetrics().xHeight); // Build the accent - - var accentBody; - - if (!group.isStretchy) { - var accent; - var width; - - if (group.label === "\\vec") { - // Before version 0.9, \vec used the combining font glyph U+20D7. - // But browsers, especially Safari, are not consistent in how they - // render combining characters when not preceded by a character. - // So now we use an SVG. - // If Safari reforms, we should consider reverting to the glyph. - accent = buildCommon.staticSvg("vec", options); - width = buildCommon.svgData.vec[1]; - } else { - accent = buildCommon.makeOrd({ - mode: group.mode, - text: group.label - }, options, "textord"); - accent = assertSymbolDomNode(accent); // Remove the italic correction of the accent, because it only serves to - // shift the accent over to a place we don't want. - - accent.italic = 0; - width = accent.width; - } - - accentBody = buildCommon.makeSpan(["accent-body"], [accent]); // "Full" accents expand the width of the resulting symbol to be - // at least the width of the accent, and overlap directly onto the - // character without any vertical offset. - - var accentFull = group.label === "\\textcircled"; - - if (accentFull) { - accentBody.classes.push('accent-full'); - clearance = body.height; - } // Shift the accent over by the skew. - - - var left = skew; // CSS defines `.katex .accent .accent-body:not(.accent-full) { width: 0 }` - // so that the accent doesn't contribute to the bounding box. - // We need to shift the character by its width (effectively half - // its width) to compensate. - - if (!accentFull) { - left -= width / 2; - } - - accentBody.style.left = left + "em"; // \textcircled uses the \bigcirc glyph, so it needs some - // vertical adjustment to match LaTeX. - - if (group.label === "\\textcircled") { - accentBody.style.top = ".2em"; - } - - accentBody = buildCommon.makeVList({ - positionType: "firstBaseline", - children: [{ - type: "elem", - elem: body - }, { - type: "kern", - size: -clearance - }, { - type: "elem", - elem: accentBody - }] - }, options); - } else { - accentBody = stretchy.svgSpan(group, options); - accentBody = buildCommon.makeVList({ - positionType: "firstBaseline", - children: [{ - type: "elem", - elem: body - }, { - type: "elem", - elem: accentBody, - wrapperClasses: ["svg-align"], - wrapperStyle: skew > 0 ? { - width: "calc(100% - " + 2 * skew + "em)", - marginLeft: 2 * skew + "em" - } : undefined - }] - }, options); - } - - var accentWrap = buildCommon.makeSpan(["mord", "accent"], [accentBody], options); - - if (supSubGroup) { - // Here, we replace the "base" child of the supsub with our newly - // generated accent. - supSubGroup.children[0] = accentWrap; // Since we don't rerun the height calculation after replacing the - // accent, we manually recalculate height. - - supSubGroup.height = Math.max(accentWrap.height, supSubGroup.height); // Accents should always be ords, even when their innards are not. - - supSubGroup.classes[0] = "mord"; - return supSubGroup; - } else { - return accentWrap; - } -}; - -var accent_mathmlBuilder = function mathmlBuilder(group, options) { - var accentNode = group.isStretchy ? stretchy.mathMLnode(group.label) : new mathMLTree.MathNode("mo", [buildMathML_makeText(group.label, group.mode)]); - var node = new mathMLTree.MathNode("mover", [buildMathML_buildGroup(group.base, options), accentNode]); - node.setAttribute("accent", "true"); - return node; -}; - -var NON_STRETCHY_ACCENT_REGEX = new RegExp(["\\acute", "\\grave", "\\ddot", "\\tilde", "\\bar", "\\breve", "\\check", "\\hat", "\\vec", "\\dot", "\\mathring"].map(function (accent) { - return "\\" + accent; -}).join("|")); // Accents - -defineFunction({ - type: "accent", - names: ["\\acute", "\\grave", "\\ddot", "\\tilde", "\\bar", "\\breve", "\\check", "\\hat", "\\vec", "\\dot", "\\mathring", "\\widecheck", "\\widehat", "\\widetilde", "\\overrightarrow", "\\overleftarrow", "\\Overrightarrow", "\\overleftrightarrow", "\\overgroup", "\\overlinesegment", "\\overleftharpoon", "\\overrightharpoon"], - props: { - numArgs: 1 - }, - handler: function handler(context, args) { - var base = args[0]; - var isStretchy = !NON_STRETCHY_ACCENT_REGEX.test(context.funcName); - var isShifty = !isStretchy || context.funcName === "\\widehat" || context.funcName === "\\widetilde" || context.funcName === "\\widecheck"; - return { - type: "accent", - mode: context.parser.mode, - label: context.funcName, - isStretchy: isStretchy, - isShifty: isShifty, - base: base - }; - }, - htmlBuilder: accent_htmlBuilder, - mathmlBuilder: accent_mathmlBuilder -}); // Text-mode accents - -defineFunction({ - type: "accent", - names: ["\\'", "\\`", "\\^", "\\~", "\\=", "\\u", "\\.", '\\"', "\\r", "\\H", "\\v", "\\textcircled"], - props: { - numArgs: 1, - allowedInText: true, - allowedInMath: false - }, - handler: function handler(context, args) { - var base = args[0]; - return { - type: "accent", - mode: context.parser.mode, - label: context.funcName, - isStretchy: false, - isShifty: true, - base: base - }; - }, - htmlBuilder: accent_htmlBuilder, - mathmlBuilder: accent_mathmlBuilder -}); -// CONCATENATED MODULE: ./src/functions/accentunder.js -// Horizontal overlap functions - - - - - - -defineFunction({ - type: "accentUnder", - names: ["\\underleftarrow", "\\underrightarrow", "\\underleftrightarrow", "\\undergroup", "\\underlinesegment", "\\utilde"], - props: { - numArgs: 1 - }, - handler: function handler(_ref, args) { - var parser = _ref.parser, - funcName = _ref.funcName; - var base = args[0]; - return { - type: "accentUnder", - mode: parser.mode, - label: funcName, - base: base - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - // Treat under accents much like underlines. - var innerGroup = buildHTML_buildGroup(group.base, options); - var accentBody = stretchy.svgSpan(group, options); - var kern = group.label === "\\utilde" ? 0.12 : 0; // Generate the vlist, with the appropriate kerns - - var vlist = buildCommon.makeVList({ - positionType: "top", - positionData: innerGroup.height, - children: [{ - type: "elem", - elem: accentBody, - wrapperClasses: ["svg-align"] - }, { - type: "kern", - size: kern - }, { - type: "elem", - elem: innerGroup - }] - }, options); - return buildCommon.makeSpan(["mord", "accentunder"], [vlist], options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var accentNode = stretchy.mathMLnode(group.label); - var node = new mathMLTree.MathNode("munder", [buildMathML_buildGroup(group.base, options), accentNode]); - node.setAttribute("accentunder", "true"); - return node; - } -}); -// CONCATENATED MODULE: ./src/functions/arrow.js - - - - - - - -// Helper function -var arrow_paddedNode = function paddedNode(group) { - var node = new mathMLTree.MathNode("mpadded", group ? [group] : []); - node.setAttribute("width", "+0.6em"); - node.setAttribute("lspace", "0.3em"); - return node; -}; // Stretchy arrows with an optional argument - - -defineFunction({ - type: "xArrow", - names: ["\\xleftarrow", "\\xrightarrow", "\\xLeftarrow", "\\xRightarrow", "\\xleftrightarrow", "\\xLeftrightarrow", "\\xhookleftarrow", "\\xhookrightarrow", "\\xmapsto", "\\xrightharpoondown", "\\xrightharpoonup", "\\xleftharpoondown", "\\xleftharpoonup", "\\xrightleftharpoons", "\\xleftrightharpoons", "\\xlongequal", "\\xtwoheadrightarrow", "\\xtwoheadleftarrow", "\\xtofrom", // The next 3 functions are here to support the mhchem extension. - // Direct use of these functions is discouraged and may break someday. - "\\xrightleftarrows", "\\xrightequilibrium", "\\xleftequilibrium"], - props: { - numArgs: 1, - numOptionalArgs: 1 - }, - handler: function handler(_ref, args, optArgs) { - var parser = _ref.parser, - funcName = _ref.funcName; - return { - type: "xArrow", - mode: parser.mode, - label: funcName, - body: args[0], - below: optArgs[0] - }; - }, - // Flow is unable to correctly infer the type of `group`, even though it's - // unamibiguously determined from the passed-in `type` above. - htmlBuilder: function htmlBuilder(group, options) { - var style = options.style; // Build the argument groups in the appropriate style. - // Ref: amsmath.dtx: \hbox{$\scriptstyle\mkern#3mu{#6}\mkern#4mu$}% - // Some groups can return document fragments. Handle those by wrapping - // them in a span. - - var newOptions = options.havingStyle(style.sup()); - var upperGroup = buildCommon.wrapFragment(buildHTML_buildGroup(group.body, newOptions, options), options); - upperGroup.classes.push("x-arrow-pad"); - var lowerGroup; - - if (group.below) { - // Build the lower group - newOptions = options.havingStyle(style.sub()); - lowerGroup = buildCommon.wrapFragment(buildHTML_buildGroup(group.below, newOptions, options), options); - lowerGroup.classes.push("x-arrow-pad"); - } - - var arrowBody = stretchy.svgSpan(group, options); // Re shift: Note that stretchy.svgSpan returned arrowBody.depth = 0. - // The point we want on the math axis is at 0.5 * arrowBody.height. - - var arrowShift = -options.fontMetrics().axisHeight + 0.5 * arrowBody.height; // 2 mu kern. Ref: amsmath.dtx: #7\if0#2\else\mkern#2mu\fi - - var upperShift = -options.fontMetrics().axisHeight - 0.5 * arrowBody.height - 0.111; // 0.111 em = 2 mu - - if (upperGroup.depth > 0.25 || group.label === "\\xleftequilibrium") { - upperShift -= upperGroup.depth; // shift up if depth encroaches - } // Generate the vlist - - - var vlist; - - if (lowerGroup) { - var lowerShift = -options.fontMetrics().axisHeight + lowerGroup.height + 0.5 * arrowBody.height + 0.111; - vlist = buildCommon.makeVList({ - positionType: "individualShift", - children: [{ - type: "elem", - elem: upperGroup, - shift: upperShift - }, { - type: "elem", - elem: arrowBody, - shift: arrowShift - }, { - type: "elem", - elem: lowerGroup, - shift: lowerShift - }] - }, options); - } else { - vlist = buildCommon.makeVList({ - positionType: "individualShift", - children: [{ - type: "elem", - elem: upperGroup, - shift: upperShift - }, { - type: "elem", - elem: arrowBody, - shift: arrowShift - }] - }, options); - } // $FlowFixMe: Replace this with passing "svg-align" into makeVList. - - - vlist.children[0].children[0].children[1].classes.push("svg-align"); - return buildCommon.makeSpan(["mrel", "x-arrow"], [vlist], options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var arrowNode = stretchy.mathMLnode(group.label); - var node; - - if (group.body) { - var upperNode = arrow_paddedNode(buildMathML_buildGroup(group.body, options)); - - if (group.below) { - var lowerNode = arrow_paddedNode(buildMathML_buildGroup(group.below, options)); - node = new mathMLTree.MathNode("munderover", [arrowNode, lowerNode, upperNode]); - } else { - node = new mathMLTree.MathNode("mover", [arrowNode, upperNode]); - } - } else if (group.below) { - var _lowerNode = arrow_paddedNode(buildMathML_buildGroup(group.below, options)); - - node = new mathMLTree.MathNode("munder", [arrowNode, _lowerNode]); - } else { - // This should never happen. - // Parser.js throws an error if there is no argument. - node = arrow_paddedNode(); - node = new mathMLTree.MathNode("mover", [arrowNode, node]); - } - - return node; - } -}); -// CONCATENATED MODULE: ./src/functions/char.js - - - // \@char is an internal function that takes a grouped decimal argument like -// {123} and converts into symbol with code 123. It is used by the *macro* -// \char defined in macros.js. - -defineFunction({ - type: "textord", - names: ["\\@char"], - props: { - numArgs: 1, - allowedInText: true - }, - handler: function handler(_ref, args) { - var parser = _ref.parser; - var arg = assertNodeType(args[0], "ordgroup"); - var group = arg.body; - var number = ""; - - for (var i = 0; i < group.length; i++) { - var node = assertNodeType(group[i], "textord"); - number += node.text; - } - - var code = parseInt(number); - - if (isNaN(code)) { - throw new src_ParseError("\\@char has non-numeric argument " + number); - } - - return { - type: "textord", - mode: parser.mode, - text: String.fromCharCode(code) - }; - } -}); -// CONCATENATED MODULE: ./src/functions/color.js - - - - - - - -var color_htmlBuilder = function htmlBuilder(group, options) { - var elements = buildHTML_buildExpression(group.body, options.withColor(group.color), false); // \color isn't supposed to affect the type of the elements it contains. - // To accomplish this, we wrap the results in a fragment, so the inner - // elements will be able to directly interact with their neighbors. For - // example, `\color{red}{2 +} 3` has the same spacing as `2 + 3` - - return buildCommon.makeFragment(elements); -}; - -var color_mathmlBuilder = function mathmlBuilder(group, options) { - var inner = buildMathML_buildExpression(group.body, options.withColor(group.color)); - var node = new mathMLTree.MathNode("mstyle", inner); - node.setAttribute("mathcolor", group.color); - return node; -}; - -defineFunction({ - type: "color", - names: ["\\textcolor"], - props: { - numArgs: 2, - allowedInText: true, - greediness: 3, - argTypes: ["color", "original"] - }, - handler: function handler(_ref, args) { - var parser = _ref.parser; - var color = assertNodeType(args[0], "color-token").color; - var body = args[1]; - return { - type: "color", - mode: parser.mode, - color: color, - body: ordargument(body) - }; - }, - htmlBuilder: color_htmlBuilder, - mathmlBuilder: color_mathmlBuilder -}); -defineFunction({ - type: "color", - names: ["\\color"], - props: { - numArgs: 1, - allowedInText: true, - greediness: 3, - argTypes: ["color"] - }, - handler: function handler(_ref2, args) { - var parser = _ref2.parser, - breakOnTokenText = _ref2.breakOnTokenText; - var color = assertNodeType(args[0], "color-token").color; // Set macro \current@color in current namespace to store the current - // color, mimicking the behavior of color.sty. - // This is currently used just to correctly color a \right - // that follows a \color command. - - parser.gullet.macros.set("\\current@color", color); // Parse out the implicit body that should be colored. - - var body = parser.parseExpression(true, breakOnTokenText); - return { - type: "color", - mode: parser.mode, - color: color, - body: body - }; - }, - htmlBuilder: color_htmlBuilder, - mathmlBuilder: color_mathmlBuilder -}); -// CONCATENATED MODULE: ./src/functions/cr.js -// Row breaks within tabular environments, and line breaks at top level - - - - - - // \\ is a macro mapping to either \cr or \newline. Because they have the -// same signature, we implement them as one megafunction, with newRow -// indicating whether we're in the \cr case, and newLine indicating whether -// to break the line in the \newline case. - -defineFunction({ - type: "cr", - names: ["\\cr", "\\newline"], - props: { - numArgs: 0, - numOptionalArgs: 1, - argTypes: ["size"], - allowedInText: true - }, - handler: function handler(_ref, args, optArgs) { - var parser = _ref.parser, - funcName = _ref.funcName; - var size = optArgs[0]; - var newRow = funcName === "\\cr"; - var newLine = false; - - if (!newRow) { - if (parser.settings.displayMode && parser.settings.useStrictBehavior("newLineInDisplayMode", "In LaTeX, \\\\ or \\newline " + "does nothing in display mode")) { - newLine = false; - } else { - newLine = true; - } - } - - return { - type: "cr", - mode: parser.mode, - newLine: newLine, - newRow: newRow, - size: size && assertNodeType(size, "size").value - }; - }, - // The following builders are called only at the top level, - // not within tabular/array environments. - htmlBuilder: function htmlBuilder(group, options) { - if (group.newRow) { - throw new src_ParseError("\\cr valid only within a tabular/array environment"); - } - - var span = buildCommon.makeSpan(["mspace"], [], options); - - if (group.newLine) { - span.classes.push("newline"); - - if (group.size) { - span.style.marginTop = units_calculateSize(group.size, options) + "em"; - } - } - - return span; - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var node = new mathMLTree.MathNode("mspace"); - - if (group.newLine) { - node.setAttribute("linebreak", "newline"); - - if (group.size) { - node.setAttribute("height", units_calculateSize(group.size, options) + "em"); - } - } - - return node; - } -}); -// CONCATENATED MODULE: ./src/functions/def.js - - - -var globalMap = { - "\\global": "\\global", - "\\long": "\\\\globallong", - "\\\\globallong": "\\\\globallong", - "\\def": "\\gdef", - "\\gdef": "\\gdef", - "\\edef": "\\xdef", - "\\xdef": "\\xdef", - "\\let": "\\\\globallet", - "\\futurelet": "\\\\globalfuture" -}; - -var def_checkControlSequence = function checkControlSequence(tok) { - var name = tok.text; - - if (/^(?:[\\{}$&#^_]|EOF)$/.test(name)) { - throw new src_ParseError("Expected a control sequence", tok); - } - - return name; -}; - -var getRHS = function getRHS(parser) { - var tok = parser.gullet.popToken(); - - if (tok.text === "=") { - // consume optional equals - tok = parser.gullet.popToken(); - - if (tok.text === " ") { - // consume one optional space - tok = parser.gullet.popToken(); - } - } - - return tok; -}; - -var letCommand = function letCommand(parser, name, tok, global) { - var macro = parser.gullet.macros.get(tok.text); - - if (macro == null) { - // don't expand it later even if a macro with the same name is defined - // e.g., \let\foo=\frac \def\frac{\relax} \frac12 - tok.noexpand = true; - macro = { - tokens: [tok], - numArgs: 0, - // reproduce the same behavior in expansion - unexpandable: !parser.gullet.isExpandable(tok.text) - }; - } - - parser.gullet.macros.set(name, macro, global); -}; // -> | -// -> |\global -// -> | -// -> \global|\long|\outer - - -defineFunction({ - type: "internal", - names: ["\\global", "\\long", "\\\\globallong"], - props: { - numArgs: 0, - allowedInText: true - }, - handler: function handler(_ref) { - var parser = _ref.parser, - funcName = _ref.funcName; - parser.consumeSpaces(); - var token = parser.fetch(); - - if (globalMap[token.text]) { - // KaTeX doesn't have \par, so ignore \long - if (funcName === "\\global" || funcName === "\\\\globallong") { - token.text = globalMap[token.text]; - } - - return assertNodeType(parser.parseFunction(), "internal"); - } - - throw new src_ParseError("Invalid token after macro prefix", token); - } -}); // Basic support for macro definitions: \def, \gdef, \edef, \xdef -// -> -// -> \def|\gdef|\edef|\xdef -// -> - -defineFunction({ - type: "internal", - names: ["\\def", "\\gdef", "\\edef", "\\xdef"], - props: { - numArgs: 0, - allowedInText: true - }, - handler: function handler(_ref2) { - var parser = _ref2.parser, - funcName = _ref2.funcName; - var arg = parser.gullet.consumeArgs(1)[0]; - - if (arg.length !== 1) { - throw new src_ParseError("\\gdef's first argument must be a macro name"); - } - - var name = arg[0].text; // Count argument specifiers, and check they are in the order #1 #2 ... - - var numArgs = 0; - arg = parser.gullet.consumeArgs(1)[0]; - - while (arg.length === 1 && arg[0].text === "#") { - arg = parser.gullet.consumeArgs(1)[0]; - - if (arg.length !== 1) { - throw new src_ParseError("Invalid argument number length \"" + arg.length + "\""); - } - - if (!/^[1-9]$/.test(arg[0].text)) { - throw new src_ParseError("Invalid argument number \"" + arg[0].text + "\""); - } - - numArgs++; - - if (parseInt(arg[0].text) !== numArgs) { - throw new src_ParseError("Argument number \"" + arg[0].text + "\" out of order"); - } - - arg = parser.gullet.consumeArgs(1)[0]; - } - - if (funcName === "\\edef" || funcName === "\\xdef") { - arg = parser.gullet.expandTokens(arg); - arg.reverse(); // to fit in with stack order - } // Final arg is the expansion of the macro - - - parser.gullet.macros.set(name, { - tokens: arg, - numArgs: numArgs - }, funcName === globalMap[funcName]); - return { - type: "internal", - mode: parser.mode - }; - } -}); // -> -// -> \futurelet -// | \let -// -> |= - -defineFunction({ - type: "internal", - names: ["\\let", "\\\\globallet"], - props: { - numArgs: 0, - allowedInText: true - }, - handler: function handler(_ref3) { - var parser = _ref3.parser, - funcName = _ref3.funcName; - var name = def_checkControlSequence(parser.gullet.popToken()); - parser.gullet.consumeSpaces(); - var tok = getRHS(parser); - letCommand(parser, name, tok, funcName === "\\\\globallet"); - return { - type: "internal", - mode: parser.mode - }; - } -}); // ref: https://www.tug.org/TUGboat/tb09-3/tb22bechtolsheim.pdf - -defineFunction({ - type: "internal", - names: ["\\futurelet", "\\\\globalfuture"], - props: { - numArgs: 0, - allowedInText: true - }, - handler: function handler(_ref4) { - var parser = _ref4.parser, - funcName = _ref4.funcName; - var name = def_checkControlSequence(parser.gullet.popToken()); - var middle = parser.gullet.popToken(); - var tok = parser.gullet.popToken(); - letCommand(parser, name, tok, funcName === "\\\\globalfuture"); - parser.gullet.pushToken(tok); - parser.gullet.pushToken(middle); - return { - type: "internal", - mode: parser.mode - }; - } -}); -// CONCATENATED MODULE: ./src/delimiter.js -/** - * This file deals with creating delimiters of various sizes. The TeXbook - * discusses these routines on page 441-442, in the "Another subroutine sets box - * x to a specified variable delimiter" paragraph. - * - * There are three main routines here. `makeSmallDelim` makes a delimiter in the - * normal font, but in either text, script, or scriptscript style. - * `makeLargeDelim` makes a delimiter in textstyle, but in one of the Size1, - * Size2, Size3, or Size4 fonts. `makeStackedDelim` makes a delimiter out of - * smaller pieces that are stacked on top of one another. - * - * The functions take a parameter `center`, which determines if the delimiter - * should be centered around the axis. - * - * Then, there are three exposed functions. `sizedDelim` makes a delimiter in - * one of the given sizes. This is used for things like `\bigl`. - * `customSizedDelim` makes a delimiter with a given total height+depth. It is - * called in places like `\sqrt`. `leftRightDelim` makes an appropriate - * delimiter which surrounds an expression of a given height an depth. It is - * used in `\left` and `\right`. - */ - - - - - - - - - -/** - * Get the metrics for a given symbol and font, after transformation (i.e. - * after following replacement from symbols.js) - */ -var delimiter_getMetrics = function getMetrics(symbol, font, mode) { - var replace = src_symbols.math[symbol] && src_symbols.math[symbol].replace; - var metrics = getCharacterMetrics(replace || symbol, font, mode); - - if (!metrics) { - throw new Error("Unsupported symbol " + symbol + " and font size " + font + "."); - } - - return metrics; -}; -/** - * Puts a delimiter span in a given style, and adds appropriate height, depth, - * and maxFontSizes. - */ - - -var delimiter_styleWrap = function styleWrap(delim, toStyle, options, classes) { - var newOptions = options.havingBaseStyle(toStyle); - var span = buildCommon.makeSpan(classes.concat(newOptions.sizingClasses(options)), [delim], options); - var delimSizeMultiplier = newOptions.sizeMultiplier / options.sizeMultiplier; - span.height *= delimSizeMultiplier; - span.depth *= delimSizeMultiplier; - span.maxFontSize = newOptions.sizeMultiplier; - return span; -}; - -var centerSpan = function centerSpan(span, options, style) { - var newOptions = options.havingBaseStyle(style); - var shift = (1 - options.sizeMultiplier / newOptions.sizeMultiplier) * options.fontMetrics().axisHeight; - span.classes.push("delimcenter"); - span.style.top = shift + "em"; - span.height -= shift; - span.depth += shift; -}; -/** - * Makes a small delimiter. This is a delimiter that comes in the Main-Regular - * font, but is restyled to either be in textstyle, scriptstyle, or - * scriptscriptstyle. - */ - - -var delimiter_makeSmallDelim = function makeSmallDelim(delim, style, center, options, mode, classes) { - var text = buildCommon.makeSymbol(delim, "Main-Regular", mode, options); - var span = delimiter_styleWrap(text, style, options, classes); - - if (center) { - centerSpan(span, options, style); - } - - return span; -}; -/** - * Builds a symbol in the given font size (note size is an integer) - */ - - -var delimiter_mathrmSize = function mathrmSize(value, size, mode, options) { - return buildCommon.makeSymbol(value, "Size" + size + "-Regular", mode, options); -}; -/** - * Makes a large delimiter. This is a delimiter that comes in the Size1, Size2, - * Size3, or Size4 fonts. It is always rendered in textstyle. - */ - - -var delimiter_makeLargeDelim = function makeLargeDelim(delim, size, center, options, mode, classes) { - var inner = delimiter_mathrmSize(delim, size, mode, options); - var span = delimiter_styleWrap(buildCommon.makeSpan(["delimsizing", "size" + size], [inner], options), src_Style.TEXT, options, classes); - - if (center) { - centerSpan(span, options, src_Style.TEXT); - } - - return span; -}; -/** - * Make an inner span with the given offset and in the given font. This is used - * in `makeStackedDelim` to make the stacking pieces for the delimiter. - */ - - -var delimiter_makeInner = function makeInner(symbol, font, mode) { - var sizeClass; // Apply the correct CSS class to choose the right font. - - if (font === "Size1-Regular") { - sizeClass = "delim-size1"; - } else - /* if (font === "Size4-Regular") */ - { - sizeClass = "delim-size4"; - } - - var inner = buildCommon.makeSpan(["delimsizinginner", sizeClass], [buildCommon.makeSpan([], [buildCommon.makeSymbol(symbol, font, mode)])]); // Since this will be passed into `makeVList` in the end, wrap the element - // in the appropriate tag that VList uses. - - return { - type: "elem", - elem: inner - }; -}; // Helper for makeStackedDelim - - -var lap = { - type: "kern", - size: -0.005 -}; -/** - * Make a stacked delimiter out of a given delimiter, with the total height at - * least `heightTotal`. This routine is mentioned on page 442 of the TeXbook. - */ - -var delimiter_makeStackedDelim = function makeStackedDelim(delim, heightTotal, center, options, mode, classes) { - // There are four parts, the top, an optional middle, a repeated part, and a - // bottom. - var top; - var middle; - var repeat; - var bottom; - top = repeat = bottom = delim; - middle = null; // Also keep track of what font the delimiters are in - - var font = "Size1-Regular"; // We set the parts and font based on the symbol. Note that we use - // '\u23d0' instead of '|' and '\u2016' instead of '\\|' for the - // repeats of the arrows - - if (delim === "\\uparrow") { - repeat = bottom = "\u23D0"; - } else if (delim === "\\Uparrow") { - repeat = bottom = "\u2016"; - } else if (delim === "\\downarrow") { - top = repeat = "\u23D0"; - } else if (delim === "\\Downarrow") { - top = repeat = "\u2016"; - } else if (delim === "\\updownarrow") { - top = "\\uparrow"; - repeat = "\u23D0"; - bottom = "\\downarrow"; - } else if (delim === "\\Updownarrow") { - top = "\\Uparrow"; - repeat = "\u2016"; - bottom = "\\Downarrow"; - } else if (delim === "[" || delim === "\\lbrack") { - top = "\u23A1"; - repeat = "\u23A2"; - bottom = "\u23A3"; - font = "Size4-Regular"; - } else if (delim === "]" || delim === "\\rbrack") { - top = "\u23A4"; - repeat = "\u23A5"; - bottom = "\u23A6"; - font = "Size4-Regular"; - } else if (delim === "\\lfloor" || delim === "\u230A") { - repeat = top = "\u23A2"; - bottom = "\u23A3"; - font = "Size4-Regular"; - } else if (delim === "\\lceil" || delim === "\u2308") { - top = "\u23A1"; - repeat = bottom = "\u23A2"; - font = "Size4-Regular"; - } else if (delim === "\\rfloor" || delim === "\u230B") { - repeat = top = "\u23A5"; - bottom = "\u23A6"; - font = "Size4-Regular"; - } else if (delim === "\\rceil" || delim === "\u2309") { - top = "\u23A4"; - repeat = bottom = "\u23A5"; - font = "Size4-Regular"; - } else if (delim === "(" || delim === "\\lparen") { - top = "\u239B"; - repeat = "\u239C"; - bottom = "\u239D"; - font = "Size4-Regular"; - } else if (delim === ")" || delim === "\\rparen") { - top = "\u239E"; - repeat = "\u239F"; - bottom = "\u23A0"; - font = "Size4-Regular"; - } else if (delim === "\\{" || delim === "\\lbrace") { - top = "\u23A7"; - middle = "\u23A8"; - bottom = "\u23A9"; - repeat = "\u23AA"; - font = "Size4-Regular"; - } else if (delim === "\\}" || delim === "\\rbrace") { - top = "\u23AB"; - middle = "\u23AC"; - bottom = "\u23AD"; - repeat = "\u23AA"; - font = "Size4-Regular"; - } else if (delim === "\\lgroup" || delim === "\u27EE") { - top = "\u23A7"; - bottom = "\u23A9"; - repeat = "\u23AA"; - font = "Size4-Regular"; - } else if (delim === "\\rgroup" || delim === "\u27EF") { - top = "\u23AB"; - bottom = "\u23AD"; - repeat = "\u23AA"; - font = "Size4-Regular"; - } else if (delim === "\\lmoustache" || delim === "\u23B0") { - top = "\u23A7"; - bottom = "\u23AD"; - repeat = "\u23AA"; - font = "Size4-Regular"; - } else if (delim === "\\rmoustache" || delim === "\u23B1") { - top = "\u23AB"; - bottom = "\u23A9"; - repeat = "\u23AA"; - font = "Size4-Regular"; - } // Get the metrics of the four sections - - - var topMetrics = delimiter_getMetrics(top, font, mode); - var topHeightTotal = topMetrics.height + topMetrics.depth; - var repeatMetrics = delimiter_getMetrics(repeat, font, mode); - var repeatHeightTotal = repeatMetrics.height + repeatMetrics.depth; - var bottomMetrics = delimiter_getMetrics(bottom, font, mode); - var bottomHeightTotal = bottomMetrics.height + bottomMetrics.depth; - var middleHeightTotal = 0; - var middleFactor = 1; - - if (middle !== null) { - var middleMetrics = delimiter_getMetrics(middle, font, mode); - middleHeightTotal = middleMetrics.height + middleMetrics.depth; - middleFactor = 2; // repeat symmetrically above and below middle - } // Calcuate the minimal height that the delimiter can have. - // It is at least the size of the top, bottom, and optional middle combined. - - - var minHeight = topHeightTotal + bottomHeightTotal + middleHeightTotal; // Compute the number of copies of the repeat symbol we will need - - var repeatCount = Math.max(0, Math.ceil((heightTotal - minHeight) / (middleFactor * repeatHeightTotal))); // Compute the total height of the delimiter including all the symbols - - var realHeightTotal = minHeight + repeatCount * middleFactor * repeatHeightTotal; // The center of the delimiter is placed at the center of the axis. Note - // that in this context, "center" means that the delimiter should be - // centered around the axis in the current style, while normally it is - // centered around the axis in textstyle. - - var axisHeight = options.fontMetrics().axisHeight; - - if (center) { - axisHeight *= options.sizeMultiplier; - } // Calculate the depth - - - var depth = realHeightTotal / 2 - axisHeight; // This function differs from the TeX procedure in one way. - // We shift each repeat element downwards by 0.005em, to prevent a gap - // due to browser floating point rounding error. - // Then, at the last element-to element joint, we add one extra repeat - // element to cover the gap created by the shifts. - // Find the shift needed to align the upper end of the extra element at a point - // 0.005em above the lower end of the top element. - - var shiftOfExtraElement = (repeatCount + 1) * 0.005 - repeatHeightTotal; // Now, we start building the pieces that will go into the vlist - // Keep a list of the inner pieces - - var inners = []; // Add the bottom symbol - - inners.push(delimiter_makeInner(bottom, font, mode)); - - if (middle === null) { - // Add that many symbols - for (var i = 0; i < repeatCount; i++) { - inners.push(lap); // overlap - - inners.push(delimiter_makeInner(repeat, font, mode)); - } - } else { - // When there is a middle bit, we need the middle part and two repeated - // sections - for (var _i = 0; _i < repeatCount; _i++) { - inners.push(lap); - inners.push(delimiter_makeInner(repeat, font, mode)); - } // Insert one extra repeat element. - - - inners.push({ - type: "kern", - size: shiftOfExtraElement - }); - inners.push(delimiter_makeInner(repeat, font, mode)); - inners.push(lap); // Now insert the middle of the brace. - - inners.push(delimiter_makeInner(middle, font, mode)); - - for (var _i2 = 0; _i2 < repeatCount; _i2++) { - inners.push(lap); - inners.push(delimiter_makeInner(repeat, font, mode)); - } - } // To cover the gap create by the overlaps, insert one more repeat element, - // at a position that juts 0.005 above the bottom of the top element. - - - if ((repeat === "\u239C" || repeat === "\u239F") && repeatCount === 0) { - // Parentheses need a short repeat element in order to avoid an overrun. - // We'll make a 0.3em tall element from a SVG. - var overlap = buildCommon.svgData.leftParenInner[2] / 2; - inners.push({ - type: "kern", - size: -overlap - }); - var pathName = repeat === "\u239C" ? "leftParenInner" : "rightParenInner"; - var innerSpan = buildCommon.staticSvg(pathName, options); - inners.push({ - type: "elem", - elem: innerSpan - }); - inners.push({ - type: "kern", - size: -overlap - }); - } else { - inners.push({ - type: "kern", - size: shiftOfExtraElement - }); - inners.push(delimiter_makeInner(repeat, font, mode)); - inners.push(lap); - } // Add the top symbol - - - inners.push(delimiter_makeInner(top, font, mode)); // Finally, build the vlist - - var newOptions = options.havingBaseStyle(src_Style.TEXT); - var inner = buildCommon.makeVList({ - positionType: "bottom", - positionData: depth, - children: inners - }, newOptions); - return delimiter_styleWrap(buildCommon.makeSpan(["delimsizing", "mult"], [inner], newOptions), src_Style.TEXT, options, classes); -}; // All surds have 0.08em padding above the viniculum inside the SVG. -// That keeps browser span height rounding error from pinching the line. - - -var vbPad = 80; // padding above the surd, measured inside the viewBox. - -var emPad = 0.08; // padding, in ems, measured in the document. - -var delimiter_sqrtSvg = function sqrtSvg(sqrtName, height, viewBoxHeight, extraViniculum, options) { - var path = sqrtPath(sqrtName, extraViniculum, viewBoxHeight); - var pathNode = new domTree_PathNode(sqrtName, path); - var svg = new SvgNode([pathNode], { - // Note: 1000:1 ratio of viewBox to document em width. - "width": "400em", - "height": height + "em", - "viewBox": "0 0 400000 " + viewBoxHeight, - "preserveAspectRatio": "xMinYMin slice" - }); - return buildCommon.makeSvgSpan(["hide-tail"], [svg], options); -}; -/** - * Make a sqrt image of the given height, - */ - - -var makeSqrtImage = function makeSqrtImage(height, options) { - // Define a newOptions that removes the effect of size changes such as \Huge. - // We don't pick different a height surd for \Huge. For it, we scale up. - var newOptions = options.havingBaseSizing(); // Pick the desired surd glyph from a sequence of surds. - - var delim = traverseSequence("\\surd", height * newOptions.sizeMultiplier, stackLargeDelimiterSequence, newOptions); - var sizeMultiplier = newOptions.sizeMultiplier; // default - // The standard sqrt SVGs each have a 0.04em thick viniculum. - // If Settings.minRuleThickness is larger than that, we add extraViniculum. - - var extraViniculum = Math.max(0, options.minRuleThickness - options.fontMetrics().sqrtRuleThickness); // Create a span containing an SVG image of a sqrt symbol. - - var span; - var spanHeight = 0; - var texHeight = 0; - var viewBoxHeight = 0; - var advanceWidth; // We create viewBoxes with 80 units of "padding" above each surd. - // Then browser rounding error on the parent span height will not - // encroach on the ink of the viniculum. But that padding is not - // included in the TeX-like `height` used for calculation of - // vertical alignment. So texHeight = span.height < span.style.height. - - if (delim.type === "small") { - // Get an SVG that is derived from glyph U+221A in font KaTeX-Main. - // 1000 unit normal glyph height. - viewBoxHeight = 1000 + 1000 * extraViniculum + vbPad; - - if (height < 1.0) { - sizeMultiplier = 1.0; // mimic a \textfont radical - } else if (height < 1.4) { - sizeMultiplier = 0.7; // mimic a \scriptfont radical - } - - spanHeight = (1.0 + extraViniculum + emPad) / sizeMultiplier; - texHeight = (1.00 + extraViniculum) / sizeMultiplier; - span = delimiter_sqrtSvg("sqrtMain", spanHeight, viewBoxHeight, extraViniculum, options); - span.style.minWidth = "0.853em"; - advanceWidth = 0.833 / sizeMultiplier; // from the font. - } else if (delim.type === "large") { - // These SVGs come from fonts: KaTeX_Size1, _Size2, etc. - viewBoxHeight = (1000 + vbPad) * sizeToMaxHeight[delim.size]; - texHeight = (sizeToMaxHeight[delim.size] + extraViniculum) / sizeMultiplier; - spanHeight = (sizeToMaxHeight[delim.size] + extraViniculum + emPad) / sizeMultiplier; - span = delimiter_sqrtSvg("sqrtSize" + delim.size, spanHeight, viewBoxHeight, extraViniculum, options); - span.style.minWidth = "1.02em"; - advanceWidth = 1.0 / sizeMultiplier; // 1.0 from the font. - } else { - // Tall sqrt. In TeX, this would be stacked using multiple glyphs. - // We'll use a single SVG to accomplish the same thing. - spanHeight = height + extraViniculum + emPad; - texHeight = height + extraViniculum; - viewBoxHeight = Math.floor(1000 * height + extraViniculum) + vbPad; - span = delimiter_sqrtSvg("sqrtTall", spanHeight, viewBoxHeight, extraViniculum, options); - span.style.minWidth = "0.742em"; - advanceWidth = 1.056; - } - - span.height = texHeight; - span.style.height = spanHeight + "em"; - return { - span: span, - advanceWidth: advanceWidth, - // Calculate the actual line width. - // This actually should depend on the chosen font -- e.g. \boldmath - // should use the thicker surd symbols from e.g. KaTeX_Main-Bold, and - // have thicker rules. - ruleWidth: (options.fontMetrics().sqrtRuleThickness + extraViniculum) * sizeMultiplier - }; -}; // There are three kinds of delimiters, delimiters that stack when they become -// too large - - -var stackLargeDelimiters = ["(", "\\lparen", ")", "\\rparen", "[", "\\lbrack", "]", "\\rbrack", "\\{", "\\lbrace", "\\}", "\\rbrace", "\\lfloor", "\\rfloor", "\u230A", "\u230B", "\\lceil", "\\rceil", "\u2308", "\u2309", "\\surd"]; // delimiters that always stack - -var stackAlwaysDelimiters = ["\\uparrow", "\\downarrow", "\\updownarrow", "\\Uparrow", "\\Downarrow", "\\Updownarrow", "|", "\\|", "\\vert", "\\Vert", "\\lvert", "\\rvert", "\\lVert", "\\rVert", "\\lgroup", "\\rgroup", "\u27EE", "\u27EF", "\\lmoustache", "\\rmoustache", "\u23B0", "\u23B1"]; // and delimiters that never stack - -var stackNeverDelimiters = ["<", ">", "\\langle", "\\rangle", "/", "\\backslash", "\\lt", "\\gt"]; // Metrics of the different sizes. Found by looking at TeX's output of -// $\bigl| // \Bigl| \biggl| \Biggl| \showlists$ -// Used to create stacked delimiters of appropriate sizes in makeSizedDelim. - -var sizeToMaxHeight = [0, 1.2, 1.8, 2.4, 3.0]; -/** - * Used to create a delimiter of a specific size, where `size` is 1, 2, 3, or 4. - */ - -var delimiter_makeSizedDelim = function makeSizedDelim(delim, size, options, mode, classes) { - // < and > turn into \langle and \rangle in delimiters - if (delim === "<" || delim === "\\lt" || delim === "\u27E8") { - delim = "\\langle"; - } else if (delim === ">" || delim === "\\gt" || delim === "\u27E9") { - delim = "\\rangle"; - } // Sized delimiters are never centered. - - - if (utils.contains(stackLargeDelimiters, delim) || utils.contains(stackNeverDelimiters, delim)) { - return delimiter_makeLargeDelim(delim, size, false, options, mode, classes); - } else if (utils.contains(stackAlwaysDelimiters, delim)) { - return delimiter_makeStackedDelim(delim, sizeToMaxHeight[size], false, options, mode, classes); - } else { - throw new src_ParseError("Illegal delimiter: '" + delim + "'"); - } -}; -/** - * There are three different sequences of delimiter sizes that the delimiters - * follow depending on the kind of delimiter. This is used when creating custom - * sized delimiters to decide whether to create a small, large, or stacked - * delimiter. - * - * In real TeX, these sequences aren't explicitly defined, but are instead - * defined inside the font metrics. Since there are only three sequences that - * are possible for the delimiters that TeX defines, it is easier to just encode - * them explicitly here. - */ - - -// Delimiters that never stack try small delimiters and large delimiters only -var stackNeverDelimiterSequence = [{ - type: "small", - style: src_Style.SCRIPTSCRIPT -}, { - type: "small", - style: src_Style.SCRIPT -}, { - type: "small", - style: src_Style.TEXT -}, { - type: "large", - size: 1 -}, { - type: "large", - size: 2 -}, { - type: "large", - size: 3 -}, { - type: "large", - size: 4 -}]; // Delimiters that always stack try the small delimiters first, then stack - -var stackAlwaysDelimiterSequence = [{ - type: "small", - style: src_Style.SCRIPTSCRIPT -}, { - type: "small", - style: src_Style.SCRIPT -}, { - type: "small", - style: src_Style.TEXT -}, { - type: "stack" -}]; // Delimiters that stack when large try the small and then large delimiters, and -// stack afterwards - -var stackLargeDelimiterSequence = [{ - type: "small", - style: src_Style.SCRIPTSCRIPT -}, { - type: "small", - style: src_Style.SCRIPT -}, { - type: "small", - style: src_Style.TEXT -}, { - type: "large", - size: 1 -}, { - type: "large", - size: 2 -}, { - type: "large", - size: 3 -}, { - type: "large", - size: 4 -}, { - type: "stack" -}]; -/** - * Get the font used in a delimiter based on what kind of delimiter it is. - * TODO(#963) Use more specific font family return type once that is introduced. - */ - -var delimTypeToFont = function delimTypeToFont(type) { - if (type.type === "small") { - return "Main-Regular"; - } else if (type.type === "large") { - return "Size" + type.size + "-Regular"; - } else if (type.type === "stack") { - return "Size4-Regular"; - } else { - throw new Error("Add support for delim type '" + type.type + "' here."); - } -}; -/** - * Traverse a sequence of types of delimiters to decide what kind of delimiter - * should be used to create a delimiter of the given height+depth. - */ - - -var traverseSequence = function traverseSequence(delim, height, sequence, options) { - // Here, we choose the index we should start at in the sequences. In smaller - // sizes (which correspond to larger numbers in style.size) we start earlier - // in the sequence. Thus, scriptscript starts at index 3-3=0, script starts - // at index 3-2=1, text starts at 3-1=2, and display starts at min(2,3-0)=2 - var start = Math.min(2, 3 - options.style.size); - - for (var i = start; i < sequence.length; i++) { - if (sequence[i].type === "stack") { - // This is always the last delimiter, so we just break the loop now. - break; - } - - var metrics = delimiter_getMetrics(delim, delimTypeToFont(sequence[i]), "math"); - var heightDepth = metrics.height + metrics.depth; // Small delimiters are scaled down versions of the same font, so we - // account for the style change size. - - if (sequence[i].type === "small") { - var newOptions = options.havingBaseStyle(sequence[i].style); - heightDepth *= newOptions.sizeMultiplier; - } // Check if the delimiter at this size works for the given height. - - - if (heightDepth > height) { - return sequence[i]; - } - } // If we reached the end of the sequence, return the last sequence element. - - - return sequence[sequence.length - 1]; -}; -/** - * Make a delimiter of a given height+depth, with optional centering. Here, we - * traverse the sequences, and create a delimiter that the sequence tells us to. - */ - - -var delimiter_makeCustomSizedDelim = function makeCustomSizedDelim(delim, height, center, options, mode, classes) { - if (delim === "<" || delim === "\\lt" || delim === "\u27E8") { - delim = "\\langle"; - } else if (delim === ">" || delim === "\\gt" || delim === "\u27E9") { - delim = "\\rangle"; - } // Decide what sequence to use - - - var sequence; - - if (utils.contains(stackNeverDelimiters, delim)) { - sequence = stackNeverDelimiterSequence; - } else if (utils.contains(stackLargeDelimiters, delim)) { - sequence = stackLargeDelimiterSequence; - } else { - sequence = stackAlwaysDelimiterSequence; - } // Look through the sequence - - - var delimType = traverseSequence(delim, height, sequence, options); // Get the delimiter from font glyphs. - // Depending on the sequence element we decided on, call the - // appropriate function. - - if (delimType.type === "small") { - return delimiter_makeSmallDelim(delim, delimType.style, center, options, mode, classes); - } else if (delimType.type === "large") { - return delimiter_makeLargeDelim(delim, delimType.size, center, options, mode, classes); - } else - /* if (delimType.type === "stack") */ - { - return delimiter_makeStackedDelim(delim, height, center, options, mode, classes); - } -}; -/** - * Make a delimiter for use with `\left` and `\right`, given a height and depth - * of an expression that the delimiters surround. - */ - - -var makeLeftRightDelim = function makeLeftRightDelim(delim, height, depth, options, mode, classes) { - // We always center \left/\right delimiters, so the axis is always shifted - var axisHeight = options.fontMetrics().axisHeight * options.sizeMultiplier; // Taken from TeX source, tex.web, function make_left_right - - var delimiterFactor = 901; - var delimiterExtend = 5.0 / options.fontMetrics().ptPerEm; - var maxDistFromAxis = Math.max(height - axisHeight, depth + axisHeight); - var totalHeight = Math.max( // In real TeX, calculations are done using integral values which are - // 65536 per pt, or 655360 per em. So, the division here truncates in - // TeX but doesn't here, producing different results. If we wanted to - // exactly match TeX's calculation, we could do - // Math.floor(655360 * maxDistFromAxis / 500) * - // delimiterFactor / 655360 - // (To see the difference, compare - // x^{x^{\left(\rule{0.1em}{0.68em}\right)}} - // in TeX and KaTeX) - maxDistFromAxis / 500 * delimiterFactor, 2 * maxDistFromAxis - delimiterExtend); // Finally, we defer to `makeCustomSizedDelim` with our calculated total - // height - - return delimiter_makeCustomSizedDelim(delim, totalHeight, true, options, mode, classes); -}; - -/* harmony default export */ var delimiter = ({ - sqrtImage: makeSqrtImage, - sizedDelim: delimiter_makeSizedDelim, - customSizedDelim: delimiter_makeCustomSizedDelim, - leftRightDelim: makeLeftRightDelim -}); -// CONCATENATED MODULE: ./src/functions/delimsizing.js - - - - - - - - - -// Extra data needed for the delimiter handler down below -var delimiterSizes = { - "\\bigl": { - mclass: "mopen", - size: 1 - }, - "\\Bigl": { - mclass: "mopen", - size: 2 - }, - "\\biggl": { - mclass: "mopen", - size: 3 - }, - "\\Biggl": { - mclass: "mopen", - size: 4 - }, - "\\bigr": { - mclass: "mclose", - size: 1 - }, - "\\Bigr": { - mclass: "mclose", - size: 2 - }, - "\\biggr": { - mclass: "mclose", - size: 3 - }, - "\\Biggr": { - mclass: "mclose", - size: 4 - }, - "\\bigm": { - mclass: "mrel", - size: 1 - }, - "\\Bigm": { - mclass: "mrel", - size: 2 - }, - "\\biggm": { - mclass: "mrel", - size: 3 - }, - "\\Biggm": { - mclass: "mrel", - size: 4 - }, - "\\big": { - mclass: "mord", - size: 1 - }, - "\\Big": { - mclass: "mord", - size: 2 - }, - "\\bigg": { - mclass: "mord", - size: 3 - }, - "\\Bigg": { - mclass: "mord", - size: 4 - } -}; -var delimiters = ["(", "\\lparen", ")", "\\rparen", "[", "\\lbrack", "]", "\\rbrack", "\\{", "\\lbrace", "\\}", "\\rbrace", "\\lfloor", "\\rfloor", "\u230A", "\u230B", "\\lceil", "\\rceil", "\u2308", "\u2309", "<", ">", "\\langle", "\u27E8", "\\rangle", "\u27E9", "\\lt", "\\gt", "\\lvert", "\\rvert", "\\lVert", "\\rVert", "\\lgroup", "\\rgroup", "\u27EE", "\u27EF", "\\lmoustache", "\\rmoustache", "\u23B0", "\u23B1", "/", "\\backslash", "|", "\\vert", "\\|", "\\Vert", "\\uparrow", "\\Uparrow", "\\downarrow", "\\Downarrow", "\\updownarrow", "\\Updownarrow", "."]; - -// Delimiter functions -function checkDelimiter(delim, context) { - var symDelim = checkSymbolNodeType(delim); - - if (symDelim && utils.contains(delimiters, symDelim.text)) { - return symDelim; - } else if (symDelim) { - throw new src_ParseError("Invalid delimiter '" + symDelim.text + "' after '" + context.funcName + "'", delim); - } else { - throw new src_ParseError("Invalid delimiter type '" + delim.type + "'", delim); - } -} - -defineFunction({ - type: "delimsizing", - names: ["\\bigl", "\\Bigl", "\\biggl", "\\Biggl", "\\bigr", "\\Bigr", "\\biggr", "\\Biggr", "\\bigm", "\\Bigm", "\\biggm", "\\Biggm", "\\big", "\\Big", "\\bigg", "\\Bigg"], - props: { - numArgs: 1 - }, - handler: function handler(context, args) { - var delim = checkDelimiter(args[0], context); - return { - type: "delimsizing", - mode: context.parser.mode, - size: delimiterSizes[context.funcName].size, - mclass: delimiterSizes[context.funcName].mclass, - delim: delim.text - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - if (group.delim === ".") { - // Empty delimiters still count as elements, even though they don't - // show anything. - return buildCommon.makeSpan([group.mclass]); - } // Use delimiter.sizedDelim to generate the delimiter. - - - return delimiter.sizedDelim(group.delim, group.size, options, group.mode, [group.mclass]); - }, - mathmlBuilder: function mathmlBuilder(group) { - var children = []; - - if (group.delim !== ".") { - children.push(buildMathML_makeText(group.delim, group.mode)); - } - - var node = new mathMLTree.MathNode("mo", children); - - if (group.mclass === "mopen" || group.mclass === "mclose") { - // Only some of the delimsizing functions act as fences, and they - // return "mopen" or "mclose" mclass. - node.setAttribute("fence", "true"); - } else { - // Explicitly disable fencing if it's not a fence, to override the - // defaults. - node.setAttribute("fence", "false"); - } - - return node; - } -}); - -function assertParsed(group) { - if (!group.body) { - throw new Error("Bug: The leftright ParseNode wasn't fully parsed."); - } -} - -defineFunction({ - type: "leftright-right", - names: ["\\right"], - props: { - numArgs: 1 - }, - handler: function handler(context, args) { - // \left case below triggers parsing of \right in - // `const right = parser.parseFunction();` - // uses this return value. - var color = context.parser.gullet.macros.get("\\current@color"); - - if (color && typeof color !== "string") { - throw new src_ParseError("\\current@color set to non-string in \\right"); - } - - return { - type: "leftright-right", - mode: context.parser.mode, - delim: checkDelimiter(args[0], context).text, - color: color // undefined if not set via \color - - }; - } -}); -defineFunction({ - type: "leftright", - names: ["\\left"], - props: { - numArgs: 1 - }, - handler: function handler(context, args) { - var delim = checkDelimiter(args[0], context); - var parser = context.parser; // Parse out the implicit body - - ++parser.leftrightDepth; // parseExpression stops before '\\right' - - var body = parser.parseExpression(false); - --parser.leftrightDepth; // Check the next token - - parser.expect("\\right", false); - var right = assertNodeType(parser.parseFunction(), "leftright-right"); - return { - type: "leftright", - mode: parser.mode, - body: body, - left: delim.text, - right: right.delim, - rightColor: right.color - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - assertParsed(group); // Build the inner expression - - var inner = buildHTML_buildExpression(group.body, options, true, ["mopen", "mclose"]); - var innerHeight = 0; - var innerDepth = 0; - var hadMiddle = false; // Calculate its height and depth - - for (var i = 0; i < inner.length; i++) { - // Property `isMiddle` not defined on `span`. See comment in - // "middle"'s htmlBuilder. - // $FlowFixMe - if (inner[i].isMiddle) { - hadMiddle = true; - } else { - innerHeight = Math.max(inner[i].height, innerHeight); - innerDepth = Math.max(inner[i].depth, innerDepth); - } - } // The size of delimiters is the same, regardless of what style we are - // in. Thus, to correctly calculate the size of delimiter we need around - // a group, we scale down the inner size based on the size. - - - innerHeight *= options.sizeMultiplier; - innerDepth *= options.sizeMultiplier; - var leftDelim; - - if (group.left === ".") { - // Empty delimiters in \left and \right make null delimiter spaces. - leftDelim = makeNullDelimiter(options, ["mopen"]); - } else { - // Otherwise, use leftRightDelim to generate the correct sized - // delimiter. - leftDelim = delimiter.leftRightDelim(group.left, innerHeight, innerDepth, options, group.mode, ["mopen"]); - } // Add it to the beginning of the expression - - - inner.unshift(leftDelim); // Handle middle delimiters - - if (hadMiddle) { - for (var _i = 1; _i < inner.length; _i++) { - var middleDelim = inner[_i]; // Property `isMiddle` not defined on `span`. See comment in - // "middle"'s htmlBuilder. - // $FlowFixMe - - var isMiddle = middleDelim.isMiddle; - - if (isMiddle) { - // Apply the options that were active when \middle was called - inner[_i] = delimiter.leftRightDelim(isMiddle.delim, innerHeight, innerDepth, isMiddle.options, group.mode, []); - } - } - } - - var rightDelim; // Same for the right delimiter, but using color specified by \color - - if (group.right === ".") { - rightDelim = makeNullDelimiter(options, ["mclose"]); - } else { - var colorOptions = group.rightColor ? options.withColor(group.rightColor) : options; - rightDelim = delimiter.leftRightDelim(group.right, innerHeight, innerDepth, colorOptions, group.mode, ["mclose"]); - } // Add it to the end of the expression. - - - inner.push(rightDelim); - return buildCommon.makeSpan(["minner"], inner, options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - assertParsed(group); - var inner = buildMathML_buildExpression(group.body, options); - - if (group.left !== ".") { - var leftNode = new mathMLTree.MathNode("mo", [buildMathML_makeText(group.left, group.mode)]); - leftNode.setAttribute("fence", "true"); - inner.unshift(leftNode); - } - - if (group.right !== ".") { - var rightNode = new mathMLTree.MathNode("mo", [buildMathML_makeText(group.right, group.mode)]); - rightNode.setAttribute("fence", "true"); - - if (group.rightColor) { - rightNode.setAttribute("mathcolor", group.rightColor); - } - - inner.push(rightNode); - } - - return buildMathML_makeRow(inner); - } -}); -defineFunction({ - type: "middle", - names: ["\\middle"], - props: { - numArgs: 1 - }, - handler: function handler(context, args) { - var delim = checkDelimiter(args[0], context); - - if (!context.parser.leftrightDepth) { - throw new src_ParseError("\\middle without preceding \\left", delim); - } - - return { - type: "middle", - mode: context.parser.mode, - delim: delim.text - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - var middleDelim; - - if (group.delim === ".") { - middleDelim = makeNullDelimiter(options, []); - } else { - middleDelim = delimiter.sizedDelim(group.delim, 1, options, group.mode, []); - var isMiddle = { - delim: group.delim, - options: options - }; // Property `isMiddle` not defined on `span`. It is only used in - // this file above. - // TODO: Fix this violation of the `span` type and possibly rename - // things since `isMiddle` sounds like a boolean, but is a struct. - // $FlowFixMe - - middleDelim.isMiddle = isMiddle; - } - - return middleDelim; - }, - mathmlBuilder: function mathmlBuilder(group, options) { - // A Firefox \middle will strech a character vertically only if it - // is in the fence part of the operator dictionary at: - // https://www.w3.org/TR/MathML3/appendixc.html. - // So we need to avoid U+2223 and use plain "|" instead. - var textNode = group.delim === "\\vert" || group.delim === "|" ? buildMathML_makeText("|", "text") : buildMathML_makeText(group.delim, group.mode); - var middleNode = new mathMLTree.MathNode("mo", [textNode]); - middleNode.setAttribute("fence", "true"); // MathML gives 5/18em spacing to each element. - // \middle should get delimiter spacing instead. - - middleNode.setAttribute("lspace", "0.05em"); - middleNode.setAttribute("rspace", "0.05em"); - return middleNode; - } -}); -// CONCATENATED MODULE: ./src/functions/enclose.js - - - - - - - - - -var enclose_htmlBuilder = function htmlBuilder(group, options) { - // \cancel, \bcancel, \xcancel, \sout, \fbox, \colorbox, \fcolorbox - // Some groups can return document fragments. Handle those by wrapping - // them in a span. - var inner = buildCommon.wrapFragment(buildHTML_buildGroup(group.body, options), options); - var label = group.label.substr(1); - var scale = options.sizeMultiplier; - var img; - var imgShift = 0; // In the LaTeX cancel package, line geometry is slightly different - // depending on whether the subject is wider than it is tall, or vice versa. - // We don't know the width of a group, so as a proxy, we test if - // the subject is a single character. This captures most of the - // subjects that should get the "tall" treatment. - - var isSingleChar = utils.isCharacterBox(group.body); - - if (label === "sout") { - img = buildCommon.makeSpan(["stretchy", "sout"]); - img.height = options.fontMetrics().defaultRuleThickness / scale; - imgShift = -0.5 * options.fontMetrics().xHeight; - } else { - // Add horizontal padding - if (/cancel/.test(label)) { - if (!isSingleChar) { - inner.classes.push("cancel-pad"); - } - } else { - inner.classes.push("boxpad"); - } // Add vertical padding - - - var vertPad = 0; - var ruleThickness = 0; // ref: cancel package: \advance\totalheight2\p@ % "+2" - - if (/box/.test(label)) { - ruleThickness = Math.max(options.fontMetrics().fboxrule, // default - options.minRuleThickness // User override. - ); - vertPad = options.fontMetrics().fboxsep + (label === "colorbox" ? 0 : ruleThickness); - } else { - vertPad = isSingleChar ? 0.2 : 0; - } - - img = stretchy.encloseSpan(inner, label, vertPad, options); - - if (/fbox|boxed|fcolorbox/.test(label)) { - img.style.borderStyle = "solid"; - img.style.borderWidth = ruleThickness + "em"; - } - - imgShift = inner.depth + vertPad; - - if (group.backgroundColor) { - img.style.backgroundColor = group.backgroundColor; - - if (group.borderColor) { - img.style.borderColor = group.borderColor; - } - } - } - - var vlist; - - if (group.backgroundColor) { - vlist = buildCommon.makeVList({ - positionType: "individualShift", - children: [// Put the color background behind inner; - { - type: "elem", - elem: img, - shift: imgShift - }, { - type: "elem", - elem: inner, - shift: 0 - }] - }, options); - } else { - vlist = buildCommon.makeVList({ - positionType: "individualShift", - children: [// Write the \cancel stroke on top of inner. - { - type: "elem", - elem: inner, - shift: 0 - }, { - type: "elem", - elem: img, - shift: imgShift, - wrapperClasses: /cancel/.test(label) ? ["svg-align"] : [] - }] - }, options); - } - - if (/cancel/.test(label)) { - // The cancel package documentation says that cancel lines add their height - // to the expression, but tests show that isn't how it actually works. - vlist.height = inner.height; - vlist.depth = inner.depth; - } - - if (/cancel/.test(label) && !isSingleChar) { - // cancel does not create horiz space for its line extension. - return buildCommon.makeSpan(["mord", "cancel-lap"], [vlist], options); - } else { - return buildCommon.makeSpan(["mord"], [vlist], options); - } -}; - -var enclose_mathmlBuilder = function mathmlBuilder(group, options) { - var fboxsep = 0; - var node = new mathMLTree.MathNode(group.label.indexOf("colorbox") > -1 ? "mpadded" : "menclose", [buildMathML_buildGroup(group.body, options)]); - - switch (group.label) { - case "\\cancel": - node.setAttribute("notation", "updiagonalstrike"); - break; - - case "\\bcancel": - node.setAttribute("notation", "downdiagonalstrike"); - break; - - case "\\sout": - node.setAttribute("notation", "horizontalstrike"); - break; - - case "\\fbox": - node.setAttribute("notation", "box"); - break; - - case "\\fcolorbox": - case "\\colorbox": - // doesn't have a good notation option. So use - // instead. Set some attributes that come included with . - fboxsep = options.fontMetrics().fboxsep * options.fontMetrics().ptPerEm; - node.setAttribute("width", "+" + 2 * fboxsep + "pt"); - node.setAttribute("height", "+" + 2 * fboxsep + "pt"); - node.setAttribute("lspace", fboxsep + "pt"); // - - node.setAttribute("voffset", fboxsep + "pt"); - - if (group.label === "\\fcolorbox") { - var thk = Math.max(options.fontMetrics().fboxrule, // default - options.minRuleThickness // user override - ); - node.setAttribute("style", "border: " + thk + "em solid " + String(group.borderColor)); - } - - break; - - case "\\xcancel": - node.setAttribute("notation", "updiagonalstrike downdiagonalstrike"); - break; - } - - if (group.backgroundColor) { - node.setAttribute("mathbackground", group.backgroundColor); - } - - return node; -}; - -defineFunction({ - type: "enclose", - names: ["\\colorbox"], - props: { - numArgs: 2, - allowedInText: true, - greediness: 3, - argTypes: ["color", "text"] - }, - handler: function handler(_ref, args, optArgs) { - var parser = _ref.parser, - funcName = _ref.funcName; - var color = assertNodeType(args[0], "color-token").color; - var body = args[1]; - return { - type: "enclose", - mode: parser.mode, - label: funcName, - backgroundColor: color, - body: body - }; - }, - htmlBuilder: enclose_htmlBuilder, - mathmlBuilder: enclose_mathmlBuilder -}); -defineFunction({ - type: "enclose", - names: ["\\fcolorbox"], - props: { - numArgs: 3, - allowedInText: true, - greediness: 3, - argTypes: ["color", "color", "text"] - }, - handler: function handler(_ref2, args, optArgs) { - var parser = _ref2.parser, - funcName = _ref2.funcName; - var borderColor = assertNodeType(args[0], "color-token").color; - var backgroundColor = assertNodeType(args[1], "color-token").color; - var body = args[2]; - return { - type: "enclose", - mode: parser.mode, - label: funcName, - backgroundColor: backgroundColor, - borderColor: borderColor, - body: body - }; - }, - htmlBuilder: enclose_htmlBuilder, - mathmlBuilder: enclose_mathmlBuilder -}); -defineFunction({ - type: "enclose", - names: ["\\fbox"], - props: { - numArgs: 1, - argTypes: ["hbox"], - allowedInText: true - }, - handler: function handler(_ref3, args) { - var parser = _ref3.parser; - return { - type: "enclose", - mode: parser.mode, - label: "\\fbox", - body: args[0] - }; - } -}); -defineFunction({ - type: "enclose", - names: ["\\cancel", "\\bcancel", "\\xcancel", "\\sout"], - props: { - numArgs: 1 - }, - handler: function handler(_ref4, args, optArgs) { - var parser = _ref4.parser, - funcName = _ref4.funcName; - var body = args[0]; - return { - type: "enclose", - mode: parser.mode, - label: funcName, - body: body - }; - }, - htmlBuilder: enclose_htmlBuilder, - mathmlBuilder: enclose_mathmlBuilder -}); -// CONCATENATED MODULE: ./src/defineEnvironment.js - - -/** - * All registered environments. - * `environments.js` exports this same dictionary again and makes it public. - * `Parser.js` requires this dictionary via `environments.js`. - */ -var _environments = {}; -function defineEnvironment(_ref) { - var type = _ref.type, - names = _ref.names, - props = _ref.props, - handler = _ref.handler, - htmlBuilder = _ref.htmlBuilder, - mathmlBuilder = _ref.mathmlBuilder; - // Set default values of environments. - var data = { - type: type, - numArgs: props.numArgs || 0, - greediness: 1, - allowedInText: false, - numOptionalArgs: 0, - handler: handler - }; - - for (var i = 0; i < names.length; ++i) { - // TODO: The value type of _environments should be a type union of all - // possible `EnvSpec<>` possibilities instead of `EnvSpec<*>`, which is - // an existential type. - // $FlowFixMe - _environments[names[i]] = data; - } - - if (htmlBuilder) { - _htmlGroupBuilders[type] = htmlBuilder; - } - - if (mathmlBuilder) { - _mathmlGroupBuilders[type] = mathmlBuilder; - } -} -// CONCATENATED MODULE: ./src/environments/array.js - - - - - - - - - - - - - -function getHLines(parser) { - // Return an array. The array length = number of hlines. - // Each element in the array tells if the line is dashed. - var hlineInfo = []; - parser.consumeSpaces(); - var nxt = parser.fetch().text; - - while (nxt === "\\hline" || nxt === "\\hdashline") { - parser.consume(); - hlineInfo.push(nxt === "\\hdashline"); - parser.consumeSpaces(); - nxt = parser.fetch().text; - } - - return hlineInfo; -} -/** - * Parse the body of the environment, with rows delimited by \\ and - * columns delimited by &, and create a nested list in row-major order - * with one group per cell. If given an optional argument style - * ("text", "display", etc.), then each cell is cast into that style. - */ - - -function parseArray(parser, _ref, style) { - var hskipBeforeAndAfter = _ref.hskipBeforeAndAfter, - addJot = _ref.addJot, - cols = _ref.cols, - arraystretch = _ref.arraystretch, - colSeparationType = _ref.colSeparationType; - // Parse body of array with \\ temporarily mapped to \cr - parser.gullet.beginGroup(); - parser.gullet.macros.set("\\\\", "\\cr"); // Get current arraystretch if it's not set by the environment - - if (!arraystretch) { - var stretch = parser.gullet.expandMacroAsText("\\arraystretch"); - - if (stretch == null) { - // Default \arraystretch from lttab.dtx - arraystretch = 1; - } else { - arraystretch = parseFloat(stretch); - - if (!arraystretch || arraystretch < 0) { - throw new src_ParseError("Invalid \\arraystretch: " + stretch); - } - } - } // Start group for first cell - - - parser.gullet.beginGroup(); - var row = []; - var body = [row]; - var rowGaps = []; - var hLinesBeforeRow = []; // Test for \hline at the top of the array. - - hLinesBeforeRow.push(getHLines(parser)); - - while (true) { - // eslint-disable-line no-constant-condition - // Parse each cell in its own group (namespace) - var cell = parser.parseExpression(false, "\\cr"); - parser.gullet.endGroup(); - parser.gullet.beginGroup(); - cell = { - type: "ordgroup", - mode: parser.mode, - body: cell - }; - - if (style) { - cell = { - type: "styling", - mode: parser.mode, - style: style, - body: [cell] - }; - } - - row.push(cell); - var next = parser.fetch().text; - - if (next === "&") { - parser.consume(); - } else if (next === "\\end") { - // Arrays terminate newlines with `\crcr` which consumes a `\cr` if - // the last line is empty. - // NOTE: Currently, `cell` is the last item added into `row`. - if (row.length === 1 && cell.type === "styling" && cell.body[0].body.length === 0) { - body.pop(); - } - - if (hLinesBeforeRow.length < body.length + 1) { - hLinesBeforeRow.push([]); - } - - break; - } else if (next === "\\cr") { - var cr = assertNodeType(parser.parseFunction(), "cr"); - rowGaps.push(cr.size); // check for \hline(s) following the row separator - - hLinesBeforeRow.push(getHLines(parser)); - row = []; - body.push(row); - } else { - throw new src_ParseError("Expected & or \\\\ or \\cr or \\end", parser.nextToken); - } - } // End cell group - - - parser.gullet.endGroup(); // End array group defining \\ - - parser.gullet.endGroup(); - return { - type: "array", - mode: parser.mode, - addJot: addJot, - arraystretch: arraystretch, - body: body, - cols: cols, - rowGaps: rowGaps, - hskipBeforeAndAfter: hskipBeforeAndAfter, - hLinesBeforeRow: hLinesBeforeRow, - colSeparationType: colSeparationType - }; -} // Decides on a style for cells in an array according to whether the given -// environment name starts with the letter 'd'. - - -function dCellStyle(envName) { - if (envName.substr(0, 1) === "d") { - return "display"; - } else { - return "text"; - } -} - -var array_htmlBuilder = function htmlBuilder(group, options) { - var r; - var c; - var nr = group.body.length; - var hLinesBeforeRow = group.hLinesBeforeRow; - var nc = 0; - var body = new Array(nr); - var hlines = []; - var ruleThickness = Math.max( // From LaTeX \showthe\arrayrulewidth. Equals 0.04 em. - options.fontMetrics().arrayRuleWidth, options.minRuleThickness // User override. - ); // Horizontal spacing - - var pt = 1 / options.fontMetrics().ptPerEm; - var arraycolsep = 5 * pt; // default value, i.e. \arraycolsep in article.cls - - if (group.colSeparationType && group.colSeparationType === "small") { - // We're in a {smallmatrix}. Default column space is \thickspace, - // i.e. 5/18em = 0.2778em, per amsmath.dtx for {smallmatrix}. - // But that needs adjustment because LaTeX applies \scriptstyle to the - // entire array, including the colspace, but this function applies - // \scriptstyle only inside each element. - var localMultiplier = options.havingStyle(src_Style.SCRIPT).sizeMultiplier; - arraycolsep = 0.2778 * (localMultiplier / options.sizeMultiplier); - } // Vertical spacing - - - var baselineskip = 12 * pt; // see size10.clo - // Default \jot from ltmath.dtx - // TODO(edemaine): allow overriding \jot via \setlength (#687) - - var jot = 3 * pt; - var arrayskip = group.arraystretch * baselineskip; - var arstrutHeight = 0.7 * arrayskip; // \strutbox in ltfsstrc.dtx and - - var arstrutDepth = 0.3 * arrayskip; // \@arstrutbox in lttab.dtx - - var totalHeight = 0; // Set a position for \hline(s) at the top of the array, if any. - - function setHLinePos(hlinesInGap) { - for (var i = 0; i < hlinesInGap.length; ++i) { - if (i > 0) { - totalHeight += 0.25; - } - - hlines.push({ - pos: totalHeight, - isDashed: hlinesInGap[i] - }); - } - } - - setHLinePos(hLinesBeforeRow[0]); - - for (r = 0; r < group.body.length; ++r) { - var inrow = group.body[r]; - var height = arstrutHeight; // \@array adds an \@arstrut - - var depth = arstrutDepth; // to each tow (via the template) - - if (nc < inrow.length) { - nc = inrow.length; - } - - var outrow = new Array(inrow.length); - - for (c = 0; c < inrow.length; ++c) { - var elt = buildHTML_buildGroup(inrow[c], options); - - if (depth < elt.depth) { - depth = elt.depth; - } - - if (height < elt.height) { - height = elt.height; - } - - outrow[c] = elt; - } - - var rowGap = group.rowGaps[r]; - var gap = 0; - - if (rowGap) { - gap = units_calculateSize(rowGap, options); - - if (gap > 0) { - // \@argarraycr - gap += arstrutDepth; - - if (depth < gap) { - depth = gap; // \@xargarraycr - } - - gap = 0; - } - } // In AMS multiline environments such as aligned and gathered, rows - // correspond to lines that have additional \jot added to the - // \baselineskip via \openup. - - - if (group.addJot) { - depth += jot; - } - - outrow.height = height; - outrow.depth = depth; - totalHeight += height; - outrow.pos = totalHeight; - totalHeight += depth + gap; // \@yargarraycr - - body[r] = outrow; // Set a position for \hline(s), if any. - - setHLinePos(hLinesBeforeRow[r + 1]); - } - - var offset = totalHeight / 2 + options.fontMetrics().axisHeight; - var colDescriptions = group.cols || []; - var cols = []; - var colSep; - var colDescrNum; - - for (c = 0, colDescrNum = 0; // Continue while either there are more columns or more column - // descriptions, so trailing separators don't get lost. - c < nc || colDescrNum < colDescriptions.length; ++c, ++colDescrNum) { - var colDescr = colDescriptions[colDescrNum] || {}; - var firstSeparator = true; - - while (colDescr.type === "separator") { - // If there is more than one separator in a row, add a space - // between them. - if (!firstSeparator) { - colSep = buildCommon.makeSpan(["arraycolsep"], []); - colSep.style.width = options.fontMetrics().doubleRuleSep + "em"; - cols.push(colSep); - } - - if (colDescr.separator === "|" || colDescr.separator === ":") { - var lineType = colDescr.separator === "|" ? "solid" : "dashed"; - var separator = buildCommon.makeSpan(["vertical-separator"], [], options); - separator.style.height = totalHeight + "em"; - separator.style.borderRightWidth = ruleThickness + "em"; - separator.style.borderRightStyle = lineType; - separator.style.margin = "0 -" + ruleThickness / 2 + "em"; - separator.style.verticalAlign = -(totalHeight - offset) + "em"; - cols.push(separator); - } else { - throw new src_ParseError("Invalid separator type: " + colDescr.separator); - } - - colDescrNum++; - colDescr = colDescriptions[colDescrNum] || {}; - firstSeparator = false; - } - - if (c >= nc) { - continue; - } - - var sepwidth = void 0; - - if (c > 0 || group.hskipBeforeAndAfter) { - sepwidth = utils.deflt(colDescr.pregap, arraycolsep); - - if (sepwidth !== 0) { - colSep = buildCommon.makeSpan(["arraycolsep"], []); - colSep.style.width = sepwidth + "em"; - cols.push(colSep); - } - } - - var col = []; - - for (r = 0; r < nr; ++r) { - var row = body[r]; - var elem = row[c]; - - if (!elem) { - continue; - } - - var shift = row.pos - offset; - elem.depth = row.depth; - elem.height = row.height; - col.push({ - type: "elem", - elem: elem, - shift: shift - }); - } - - col = buildCommon.makeVList({ - positionType: "individualShift", - children: col - }, options); - col = buildCommon.makeSpan(["col-align-" + (colDescr.align || "c")], [col]); - cols.push(col); - - if (c < nc - 1 || group.hskipBeforeAndAfter) { - sepwidth = utils.deflt(colDescr.postgap, arraycolsep); - - if (sepwidth !== 0) { - colSep = buildCommon.makeSpan(["arraycolsep"], []); - colSep.style.width = sepwidth + "em"; - cols.push(colSep); - } - } - } - - body = buildCommon.makeSpan(["mtable"], cols); // Add \hline(s), if any. - - if (hlines.length > 0) { - var line = buildCommon.makeLineSpan("hline", options, ruleThickness); - var dashes = buildCommon.makeLineSpan("hdashline", options, ruleThickness); - var vListElems = [{ - type: "elem", - elem: body, - shift: 0 - }]; - - while (hlines.length > 0) { - var hline = hlines.pop(); - var lineShift = hline.pos - offset; - - if (hline.isDashed) { - vListElems.push({ - type: "elem", - elem: dashes, - shift: lineShift - }); - } else { - vListElems.push({ - type: "elem", - elem: line, - shift: lineShift - }); - } - } - - body = buildCommon.makeVList({ - positionType: "individualShift", - children: vListElems - }, options); - } - - return buildCommon.makeSpan(["mord"], [body], options); -}; - -var alignMap = { - c: "center ", - l: "left ", - r: "right " -}; - -var array_mathmlBuilder = function mathmlBuilder(group, options) { - var table = new mathMLTree.MathNode("mtable", group.body.map(function (row) { - return new mathMLTree.MathNode("mtr", row.map(function (cell) { - return new mathMLTree.MathNode("mtd", [buildMathML_buildGroup(cell, options)]); - })); - })); // Set column alignment, row spacing, column spacing, and - // array lines by setting attributes on the table element. - // Set the row spacing. In MathML, we specify a gap distance. - // We do not use rowGap[] because MathML automatically increases - // cell height with the height/depth of the element content. - // LaTeX \arraystretch multiplies the row baseline-to-baseline distance. - // We simulate this by adding (arraystretch - 1)em to the gap. This - // does a reasonable job of adjusting arrays containing 1 em tall content. - // The 0.16 and 0.09 values are found emprically. They produce an array - // similar to LaTeX and in which content does not interfere with \hines. - - var gap = group.arraystretch === 0.5 ? 0.1 // {smallmatrix}, {subarray} - : 0.16 + group.arraystretch - 1 + (group.addJot ? 0.09 : 0); - table.setAttribute("rowspacing", gap + "em"); // MathML table lines go only between cells. - // To place a line on an edge we'll use , if necessary. - - var menclose = ""; - var align = ""; - - if (group.cols && group.cols.length > 0) { - // Find column alignment, column spacing, and vertical lines. - var cols = group.cols; - var columnLines = ""; - var prevTypeWasAlign = false; - var iStart = 0; - var iEnd = cols.length; - - if (cols[0].type === "separator") { - menclose += "top "; - iStart = 1; - } - - if (cols[cols.length - 1].type === "separator") { - menclose += "bottom "; - iEnd -= 1; - } - - for (var i = iStart; i < iEnd; i++) { - if (cols[i].type === "align") { - align += alignMap[cols[i].align]; - - if (prevTypeWasAlign) { - columnLines += "none "; - } - - prevTypeWasAlign = true; - } else if (cols[i].type === "separator") { - // MathML accepts only single lines between cells. - // So we read only the first of consecutive separators. - if (prevTypeWasAlign) { - columnLines += cols[i].separator === "|" ? "solid " : "dashed "; - prevTypeWasAlign = false; - } - } - } - - table.setAttribute("columnalign", align.trim()); - - if (/[sd]/.test(columnLines)) { - table.setAttribute("columnlines", columnLines.trim()); - } - } // Set column spacing. - - - if (group.colSeparationType === "align") { - var _cols = group.cols || []; - - var spacing = ""; - - for (var _i = 1; _i < _cols.length; _i++) { - spacing += _i % 2 ? "0em " : "1em "; - } - - table.setAttribute("columnspacing", spacing.trim()); - } else if (group.colSeparationType === "alignat") { - table.setAttribute("columnspacing", "0em"); - } else if (group.colSeparationType === "small") { - table.setAttribute("columnspacing", "0.2778em"); - } else { - table.setAttribute("columnspacing", "1em"); - } // Address \hline and \hdashline - - - var rowLines = ""; - var hlines = group.hLinesBeforeRow; - menclose += hlines[0].length > 0 ? "left " : ""; - menclose += hlines[hlines.length - 1].length > 0 ? "right " : ""; - - for (var _i2 = 1; _i2 < hlines.length - 1; _i2++) { - rowLines += hlines[_i2].length === 0 ? "none " // MathML accepts only a single line between rows. Read one element. - : hlines[_i2][0] ? "dashed " : "solid "; - } - - if (/[sd]/.test(rowLines)) { - table.setAttribute("rowlines", rowLines.trim()); - } - - if (menclose !== "") { - table = new mathMLTree.MathNode("menclose", [table]); - table.setAttribute("notation", menclose.trim()); - } - - if (group.arraystretch && group.arraystretch < 1) { - // A small array. Wrap in scriptstyle so row gap is not too large. - table = new mathMLTree.MathNode("mstyle", [table]); - table.setAttribute("scriptlevel", "1"); - } - - return table; -}; // Convenience function for aligned and alignedat environments. - - -var array_alignedHandler = function alignedHandler(context, args) { - var cols = []; - var res = parseArray(context.parser, { - cols: cols, - addJot: true - }, "display"); // Determining number of columns. - // 1. If the first argument is given, we use it as a number of columns, - // and makes sure that each row doesn't exceed that number. - // 2. Otherwise, just count number of columns = maximum number - // of cells in each row ("aligned" mode -- isAligned will be true). - // - // At the same time, prepend empty group {} at beginning of every second - // cell in each row (starting with second cell) so that operators become - // binary. This behavior is implemented in amsmath's \start@aligned. - - var numMaths; - var numCols = 0; - var emptyGroup = { - type: "ordgroup", - mode: context.mode, - body: [] - }; - - if (args[0] && args[0].type === "ordgroup") { - var arg0 = ""; - - for (var i = 0; i < args[0].body.length; i++) { - var textord = assertNodeType(args[0].body[i], "textord"); - arg0 += textord.text; - } - - numMaths = Number(arg0); - numCols = numMaths * 2; - } - - var isAligned = !numCols; - res.body.forEach(function (row) { - for (var _i3 = 1; _i3 < row.length; _i3 += 2) { - // Modify ordgroup node within styling node - var styling = assertNodeType(row[_i3], "styling"); - var ordgroup = assertNodeType(styling.body[0], "ordgroup"); - ordgroup.body.unshift(emptyGroup); - } - - if (!isAligned) { - // Case 1 - var curMaths = row.length / 2; - - if (numMaths < curMaths) { - throw new src_ParseError("Too many math in a row: " + ("expected " + numMaths + ", but got " + curMaths), row[0]); - } - } else if (numCols < row.length) { - // Case 2 - numCols = row.length; - } - }); // Adjusting alignment. - // In aligned mode, we add one \qquad between columns; - // otherwise we add nothing. - - for (var _i4 = 0; _i4 < numCols; ++_i4) { - var align = "r"; - var pregap = 0; - - if (_i4 % 2 === 1) { - align = "l"; - } else if (_i4 > 0 && isAligned) { - // "aligned" mode. - pregap = 1; // add one \quad - } - - cols[_i4] = { - type: "align", - align: align, - pregap: pregap, - postgap: 0 - }; - } - - res.colSeparationType = isAligned ? "align" : "alignat"; - return res; -}; // Arrays are part of LaTeX, defined in lttab.dtx so its documentation -// is part of the source2e.pdf file of LaTeX2e source documentation. -// {darray} is an {array} environment where cells are set in \displaystyle, -// as defined in nccmath.sty. - - -defineEnvironment({ - type: "array", - names: ["array", "darray"], - props: { - numArgs: 1 - }, - handler: function handler(context, args) { - // Since no types are specified above, the two possibilities are - // - The argument is wrapped in {} or [], in which case Parser's - // parseGroup() returns an "ordgroup" wrapping some symbol node. - // - The argument is a bare symbol node. - var symNode = checkSymbolNodeType(args[0]); - var colalign = symNode ? [args[0]] : assertNodeType(args[0], "ordgroup").body; - var cols = colalign.map(function (nde) { - var node = assertSymbolNodeType(nde); - var ca = node.text; - - if ("lcr".indexOf(ca) !== -1) { - return { - type: "align", - align: ca - }; - } else if (ca === "|") { - return { - type: "separator", - separator: "|" - }; - } else if (ca === ":") { - return { - type: "separator", - separator: ":" - }; - } - - throw new src_ParseError("Unknown column alignment: " + ca, nde); - }); - var res = { - cols: cols, - hskipBeforeAndAfter: true // \@preamble in lttab.dtx - - }; - return parseArray(context.parser, res, dCellStyle(context.envName)); - }, - htmlBuilder: array_htmlBuilder, - mathmlBuilder: array_mathmlBuilder -}); // The matrix environments of amsmath builds on the array environment -// of LaTeX, which is discussed above. - -defineEnvironment({ - type: "array", - names: ["matrix", "pmatrix", "bmatrix", "Bmatrix", "vmatrix", "Vmatrix"], - props: { - numArgs: 0 - }, - handler: function handler(context) { - var delimiters = { - "matrix": null, - "pmatrix": ["(", ")"], - "bmatrix": ["[", "]"], - "Bmatrix": ["\\{", "\\}"], - "vmatrix": ["|", "|"], - "Vmatrix": ["\\Vert", "\\Vert"] - }[context.envName]; // \hskip -\arraycolsep in amsmath - - var payload = { - hskipBeforeAndAfter: false - }; - var res = parseArray(context.parser, payload, dCellStyle(context.envName)); - return delimiters ? { - type: "leftright", - mode: context.mode, - body: [res], - left: delimiters[0], - right: delimiters[1], - rightColor: undefined // \right uninfluenced by \color in array - - } : res; - }, - htmlBuilder: array_htmlBuilder, - mathmlBuilder: array_mathmlBuilder -}); -defineEnvironment({ - type: "array", - names: ["smallmatrix"], - props: { - numArgs: 0 - }, - handler: function handler(context) { - var payload = { - arraystretch: 0.5 - }; - var res = parseArray(context.parser, payload, "script"); - res.colSeparationType = "small"; - return res; - }, - htmlBuilder: array_htmlBuilder, - mathmlBuilder: array_mathmlBuilder -}); -defineEnvironment({ - type: "array", - names: ["subarray"], - props: { - numArgs: 1 - }, - handler: function handler(context, args) { - // Parsing of {subarray} is similar to {array} - var symNode = checkSymbolNodeType(args[0]); - var colalign = symNode ? [args[0]] : assertNodeType(args[0], "ordgroup").body; - var cols = colalign.map(function (nde) { - var node = assertSymbolNodeType(nde); - var ca = node.text; // {subarray} only recognizes "l" & "c" - - if ("lc".indexOf(ca) !== -1) { - return { - type: "align", - align: ca - }; - } - - throw new src_ParseError("Unknown column alignment: " + ca, nde); - }); - - if (cols.length > 1) { - throw new src_ParseError("{subarray} can contain only one column"); - } - - var res = { - cols: cols, - hskipBeforeAndAfter: false, - arraystretch: 0.5 - }; - res = parseArray(context.parser, res, "script"); - - if (res.body.length > 0 && res.body[0].length > 1) { - throw new src_ParseError("{subarray} can contain only one column"); - } - - return res; - }, - htmlBuilder: array_htmlBuilder, - mathmlBuilder: array_mathmlBuilder -}); // A cases environment (in amsmath.sty) is almost equivalent to -// \def\arraystretch{1.2}% -// \left\{\begin{array}{@{}l@{\quad}l@{}} … \end{array}\right. -// {dcases} is a {cases} environment where cells are set in \displaystyle, -// as defined in mathtools.sty. -// {rcases} is another mathtools environment. It's brace is on the right side. - -defineEnvironment({ - type: "array", - names: ["cases", "dcases", "rcases", "drcases"], - props: { - numArgs: 0 - }, - handler: function handler(context) { - var payload = { - arraystretch: 1.2, - cols: [{ - type: "align", - align: "l", - pregap: 0, - // TODO(kevinb) get the current style. - // For now we use the metrics for TEXT style which is what we were - // doing before. Before attempting to get the current style we - // should look at TeX's behavior especially for \over and matrices. - postgap: 1.0 - /* 1em quad */ - - }, { - type: "align", - align: "l", - pregap: 0, - postgap: 0 - }] - }; - var res = parseArray(context.parser, payload, dCellStyle(context.envName)); - return { - type: "leftright", - mode: context.mode, - body: [res], - left: context.envName.indexOf("r") > -1 ? "." : "\\{", - right: context.envName.indexOf("r") > -1 ? "\\}" : ".", - rightColor: undefined - }; - }, - htmlBuilder: array_htmlBuilder, - mathmlBuilder: array_mathmlBuilder -}); // An aligned environment is like the align* environment -// except it operates within math mode. -// Note that we assume \nomallineskiplimit to be zero, -// so that \strut@ is the same as \strut. - -defineEnvironment({ - type: "array", - names: ["aligned"], - props: { - numArgs: 0 - }, - handler: array_alignedHandler, - htmlBuilder: array_htmlBuilder, - mathmlBuilder: array_mathmlBuilder -}); // A gathered environment is like an array environment with one centered -// column, but where rows are considered lines so get \jot line spacing -// and contents are set in \displaystyle. - -defineEnvironment({ - type: "array", - names: ["gathered"], - props: { - numArgs: 0 - }, - handler: function handler(context) { - var res = { - cols: [{ - type: "align", - align: "c" - }], - addJot: true - }; - return parseArray(context.parser, res, "display"); - }, - htmlBuilder: array_htmlBuilder, - mathmlBuilder: array_mathmlBuilder -}); // alignat environment is like an align environment, but one must explicitly -// specify maximum number of columns in each row, and can adjust spacing between -// each columns. - -defineEnvironment({ - type: "array", - names: ["alignedat"], - // One for numbered and for unnumbered; - // but, KaTeX doesn't supports math numbering yet, - // they make no difference for now. - props: { - numArgs: 1 - }, - handler: array_alignedHandler, - htmlBuilder: array_htmlBuilder, - mathmlBuilder: array_mathmlBuilder -}); // Catch \hline outside array environment - -defineFunction({ - type: "text", - // Doesn't matter what this is. - names: ["\\hline", "\\hdashline"], - props: { - numArgs: 0, - allowedInText: true, - allowedInMath: true - }, - handler: function handler(context, args) { - throw new src_ParseError(context.funcName + " valid only within array environment"); - } -}); -// CONCATENATED MODULE: ./src/environments.js - -var environments = _environments; -/* harmony default export */ var src_environments = (environments); // All environment definitions should be imported below - - -// CONCATENATED MODULE: ./src/functions/environment.js - - - - // Environment delimiters. HTML/MathML rendering is defined in the corresponding -// defineEnvironment definitions. -// $FlowFixMe, "environment" handler returns an environment ParseNode - -defineFunction({ - type: "environment", - names: ["\\begin", "\\end"], - props: { - numArgs: 1, - argTypes: ["text"] - }, - handler: function handler(_ref, args) { - var parser = _ref.parser, - funcName = _ref.funcName; - var nameGroup = args[0]; - - if (nameGroup.type !== "ordgroup") { - throw new src_ParseError("Invalid environment name", nameGroup); - } - - var envName = ""; - - for (var i = 0; i < nameGroup.body.length; ++i) { - envName += assertNodeType(nameGroup.body[i], "textord").text; - } - - if (funcName === "\\begin") { - // begin...end is similar to left...right - if (!src_environments.hasOwnProperty(envName)) { - throw new src_ParseError("No such environment: " + envName, nameGroup); - } // Build the environment object. Arguments and other information will - // be made available to the begin and end methods using properties. - - - var env = src_environments[envName]; - - var _parser$parseArgument = parser.parseArguments("\\begin{" + envName + "}", env), - _args = _parser$parseArgument.args, - optArgs = _parser$parseArgument.optArgs; - - var context = { - mode: parser.mode, - envName: envName, - parser: parser - }; - var result = env.handler(context, _args, optArgs); - parser.expect("\\end", false); - var endNameToken = parser.nextToken; - var end = assertNodeType(parser.parseFunction(), "environment"); - - if (end.name !== envName) { - throw new src_ParseError("Mismatch: \\begin{" + envName + "} matched by \\end{" + end.name + "}", endNameToken); - } - - return result; - } - - return { - type: "environment", - mode: parser.mode, - name: envName, - nameGroup: nameGroup - }; - } -}); -// CONCATENATED MODULE: ./src/functions/mclass.js - - - - - - -var mclass_makeSpan = buildCommon.makeSpan; - -function mclass_htmlBuilder(group, options) { - var elements = buildHTML_buildExpression(group.body, options, true); - return mclass_makeSpan([group.mclass], elements, options); -} - -function mclass_mathmlBuilder(group, options) { - var node; - var inner = buildMathML_buildExpression(group.body, options); - - if (group.mclass === "minner") { - return mathMLTree.newDocumentFragment(inner); - } else if (group.mclass === "mord") { - if (group.isCharacterBox) { - node = inner[0]; - node.type = "mi"; - } else { - node = new mathMLTree.MathNode("mi", inner); - } - } else { - if (group.isCharacterBox) { - node = inner[0]; - node.type = "mo"; - } else { - node = new mathMLTree.MathNode("mo", inner); - } // Set spacing based on what is the most likely adjacent atom type. - // See TeXbook p170. - - - if (group.mclass === "mbin") { - node.attributes.lspace = "0.22em"; // medium space - - node.attributes.rspace = "0.22em"; - } else if (group.mclass === "mpunct") { - node.attributes.lspace = "0em"; - node.attributes.rspace = "0.17em"; // thinspace - } else if (group.mclass === "mopen" || group.mclass === "mclose") { - node.attributes.lspace = "0em"; - node.attributes.rspace = "0em"; - } // MathML default space is 5/18 em, so needs no action. - // Ref: https://developer.mozilla.org/en-US/docs/Web/MathML/Element/mo - - } - - return node; -} // Math class commands except \mathop - - -defineFunction({ - type: "mclass", - names: ["\\mathord", "\\mathbin", "\\mathrel", "\\mathopen", "\\mathclose", "\\mathpunct", "\\mathinner"], - props: { - numArgs: 1 - }, - handler: function handler(_ref, args) { - var parser = _ref.parser, - funcName = _ref.funcName; - var body = args[0]; - return { - type: "mclass", - mode: parser.mode, - mclass: "m" + funcName.substr(5), - // TODO(kevinb): don't prefix with 'm' - body: ordargument(body), - isCharacterBox: utils.isCharacterBox(body) - }; - }, - htmlBuilder: mclass_htmlBuilder, - mathmlBuilder: mclass_mathmlBuilder -}); -var binrelClass = function binrelClass(arg) { - // \binrel@ spacing varies with (bin|rel|ord) of the atom in the argument. - // (by rendering separately and with {}s before and after, and measuring - // the change in spacing). We'll do roughly the same by detecting the - // atom type directly. - var atom = arg.type === "ordgroup" && arg.body.length ? arg.body[0] : arg; - - if (atom.type === "atom" && (atom.family === "bin" || atom.family === "rel")) { - return "m" + atom.family; - } else { - return "mord"; - } -}; // \@binrel{x}{y} renders like y but as mbin/mrel/mord if x is mbin/mrel/mord. -// This is equivalent to \binrel@{x}\binrel@@{y} in AMSTeX. - -defineFunction({ - type: "mclass", - names: ["\\@binrel"], - props: { - numArgs: 2 - }, - handler: function handler(_ref2, args) { - var parser = _ref2.parser; - return { - type: "mclass", - mode: parser.mode, - mclass: binrelClass(args[0]), - body: [args[1]], - isCharacterBox: utils.isCharacterBox(args[1]) - }; - } -}); // Build a relation or stacked op by placing one symbol on top of another - -defineFunction({ - type: "mclass", - names: ["\\stackrel", "\\overset", "\\underset"], - props: { - numArgs: 2 - }, - handler: function handler(_ref3, args) { - var parser = _ref3.parser, - funcName = _ref3.funcName; - var baseArg = args[1]; - var shiftedArg = args[0]; - var mclass; - - if (funcName !== "\\stackrel") { - // LaTeX applies \binrel spacing to \overset and \underset. - mclass = binrelClass(baseArg); - } else { - mclass = "mrel"; // for \stackrel - } - - var baseOp = { - type: "op", - mode: baseArg.mode, - limits: true, - alwaysHandleSupSub: true, - parentIsSupSub: false, - symbol: false, - suppressBaseShift: funcName !== "\\stackrel", - body: ordargument(baseArg) - }; - var supsub = { - type: "supsub", - mode: shiftedArg.mode, - base: baseOp, - sup: funcName === "\\underset" ? null : shiftedArg, - sub: funcName === "\\underset" ? shiftedArg : null - }; - return { - type: "mclass", - mode: parser.mode, - mclass: mclass, - body: [supsub], - isCharacterBox: utils.isCharacterBox(supsub) - }; - }, - htmlBuilder: mclass_htmlBuilder, - mathmlBuilder: mclass_mathmlBuilder -}); -// CONCATENATED MODULE: ./src/functions/font.js -// TODO(kevinb): implement \\sl and \\sc - - - - - - -var font_htmlBuilder = function htmlBuilder(group, options) { - var font = group.font; - var newOptions = options.withFont(font); - return buildHTML_buildGroup(group.body, newOptions); -}; - -var font_mathmlBuilder = function mathmlBuilder(group, options) { - var font = group.font; - var newOptions = options.withFont(font); - return buildMathML_buildGroup(group.body, newOptions); -}; - -var fontAliases = { - "\\Bbb": "\\mathbb", - "\\bold": "\\mathbf", - "\\frak": "\\mathfrak", - "\\bm": "\\boldsymbol" -}; -defineFunction({ - type: "font", - names: [// styles, except \boldsymbol defined below - "\\mathrm", "\\mathit", "\\mathbf", "\\mathnormal", // families - "\\mathbb", "\\mathcal", "\\mathfrak", "\\mathscr", "\\mathsf", "\\mathtt", // aliases, except \bm defined below - "\\Bbb", "\\bold", "\\frak"], - props: { - numArgs: 1, - greediness: 2 - }, - handler: function handler(_ref, args) { - var parser = _ref.parser, - funcName = _ref.funcName; - var body = args[0]; - var func = funcName; - - if (func in fontAliases) { - func = fontAliases[func]; - } - - return { - type: "font", - mode: parser.mode, - font: func.slice(1), - body: body - }; - }, - htmlBuilder: font_htmlBuilder, - mathmlBuilder: font_mathmlBuilder -}); -defineFunction({ - type: "mclass", - names: ["\\boldsymbol", "\\bm"], - props: { - numArgs: 1, - greediness: 2 - }, - handler: function handler(_ref2, args) { - var parser = _ref2.parser; - var body = args[0]; - var isCharacterBox = utils.isCharacterBox(body); // amsbsy.sty's \boldsymbol uses \binrel spacing to inherit the - // argument's bin|rel|ord status - - return { - type: "mclass", - mode: parser.mode, - mclass: binrelClass(body), - body: [{ - type: "font", - mode: parser.mode, - font: "boldsymbol", - body: body - }], - isCharacterBox: isCharacterBox - }; - } -}); // Old font changing functions - -defineFunction({ - type: "font", - names: ["\\rm", "\\sf", "\\tt", "\\bf", "\\it", "\\cal"], - props: { - numArgs: 0, - allowedInText: true - }, - handler: function handler(_ref3, args) { - var parser = _ref3.parser, - funcName = _ref3.funcName, - breakOnTokenText = _ref3.breakOnTokenText; - var mode = parser.mode; - var body = parser.parseExpression(true, breakOnTokenText); - var style = "math" + funcName.slice(1); - return { - type: "font", - mode: mode, - font: style, - body: { - type: "ordgroup", - mode: parser.mode, - body: body - } - }; - }, - htmlBuilder: font_htmlBuilder, - mathmlBuilder: font_mathmlBuilder -}); -// CONCATENATED MODULE: ./src/functions/genfrac.js - - - - - - - - - - - -var genfrac_adjustStyle = function adjustStyle(size, originalStyle) { - // Figure out what style this fraction should be in based on the - // function used - var style = originalStyle; - - if (size === "display") { - // Get display style as a default. - // If incoming style is sub/sup, use style.text() to get correct size. - style = style.id >= src_Style.SCRIPT.id ? style.text() : src_Style.DISPLAY; - } else if (size === "text" && style.size === src_Style.DISPLAY.size) { - // We're in a \tfrac but incoming style is displaystyle, so: - style = src_Style.TEXT; - } else if (size === "script") { - style = src_Style.SCRIPT; - } else if (size === "scriptscript") { - style = src_Style.SCRIPTSCRIPT; - } - - return style; -}; - -var genfrac_htmlBuilder = function htmlBuilder(group, options) { - // Fractions are handled in the TeXbook on pages 444-445, rules 15(a-e). - var style = genfrac_adjustStyle(group.size, options.style); - var nstyle = style.fracNum(); - var dstyle = style.fracDen(); - var newOptions; - newOptions = options.havingStyle(nstyle); - var numerm = buildHTML_buildGroup(group.numer, newOptions, options); - - if (group.continued) { - // \cfrac inserts a \strut into the numerator. - // Get \strut dimensions from TeXbook page 353. - var hStrut = 8.5 / options.fontMetrics().ptPerEm; - var dStrut = 3.5 / options.fontMetrics().ptPerEm; - numerm.height = numerm.height < hStrut ? hStrut : numerm.height; - numerm.depth = numerm.depth < dStrut ? dStrut : numerm.depth; - } - - newOptions = options.havingStyle(dstyle); - var denomm = buildHTML_buildGroup(group.denom, newOptions, options); - var rule; - var ruleWidth; - var ruleSpacing; - - if (group.hasBarLine) { - if (group.barSize) { - ruleWidth = units_calculateSize(group.barSize, options); - rule = buildCommon.makeLineSpan("frac-line", options, ruleWidth); - } else { - rule = buildCommon.makeLineSpan("frac-line", options); - } - - ruleWidth = rule.height; - ruleSpacing = rule.height; - } else { - rule = null; - ruleWidth = 0; - ruleSpacing = options.fontMetrics().defaultRuleThickness; - } // Rule 15b - - - var numShift; - var clearance; - var denomShift; - - if (style.size === src_Style.DISPLAY.size || group.size === "display") { - numShift = options.fontMetrics().num1; - - if (ruleWidth > 0) { - clearance = 3 * ruleSpacing; - } else { - clearance = 7 * ruleSpacing; - } - - denomShift = options.fontMetrics().denom1; - } else { - if (ruleWidth > 0) { - numShift = options.fontMetrics().num2; - clearance = ruleSpacing; - } else { - numShift = options.fontMetrics().num3; - clearance = 3 * ruleSpacing; - } - - denomShift = options.fontMetrics().denom2; - } - - var frac; - - if (!rule) { - // Rule 15c - var candidateClearance = numShift - numerm.depth - (denomm.height - denomShift); - - if (candidateClearance < clearance) { - numShift += 0.5 * (clearance - candidateClearance); - denomShift += 0.5 * (clearance - candidateClearance); - } - - frac = buildCommon.makeVList({ - positionType: "individualShift", - children: [{ - type: "elem", - elem: denomm, - shift: denomShift - }, { - type: "elem", - elem: numerm, - shift: -numShift - }] - }, options); - } else { - // Rule 15d - var axisHeight = options.fontMetrics().axisHeight; - - if (numShift - numerm.depth - (axisHeight + 0.5 * ruleWidth) < clearance) { - numShift += clearance - (numShift - numerm.depth - (axisHeight + 0.5 * ruleWidth)); - } - - if (axisHeight - 0.5 * ruleWidth - (denomm.height - denomShift) < clearance) { - denomShift += clearance - (axisHeight - 0.5 * ruleWidth - (denomm.height - denomShift)); - } - - var midShift = -(axisHeight - 0.5 * ruleWidth); - frac = buildCommon.makeVList({ - positionType: "individualShift", - children: [{ - type: "elem", - elem: denomm, - shift: denomShift - }, { - type: "elem", - elem: rule, - shift: midShift - }, { - type: "elem", - elem: numerm, - shift: -numShift - }] - }, options); - } // Since we manually change the style sometimes (with \dfrac or \tfrac), - // account for the possible size change here. - - - newOptions = options.havingStyle(style); - frac.height *= newOptions.sizeMultiplier / options.sizeMultiplier; - frac.depth *= newOptions.sizeMultiplier / options.sizeMultiplier; // Rule 15e - - var delimSize; - - if (style.size === src_Style.DISPLAY.size) { - delimSize = options.fontMetrics().delim1; - } else { - delimSize = options.fontMetrics().delim2; - } - - var leftDelim; - var rightDelim; - - if (group.leftDelim == null) { - leftDelim = makeNullDelimiter(options, ["mopen"]); - } else { - leftDelim = delimiter.customSizedDelim(group.leftDelim, delimSize, true, options.havingStyle(style), group.mode, ["mopen"]); - } - - if (group.continued) { - rightDelim = buildCommon.makeSpan([]); // zero width for \cfrac - } else if (group.rightDelim == null) { - rightDelim = makeNullDelimiter(options, ["mclose"]); - } else { - rightDelim = delimiter.customSizedDelim(group.rightDelim, delimSize, true, options.havingStyle(style), group.mode, ["mclose"]); - } - - return buildCommon.makeSpan(["mord"].concat(newOptions.sizingClasses(options)), [leftDelim, buildCommon.makeSpan(["mfrac"], [frac]), rightDelim], options); -}; - -var genfrac_mathmlBuilder = function mathmlBuilder(group, options) { - var node = new mathMLTree.MathNode("mfrac", [buildMathML_buildGroup(group.numer, options), buildMathML_buildGroup(group.denom, options)]); - - if (!group.hasBarLine) { - node.setAttribute("linethickness", "0px"); - } else if (group.barSize) { - var ruleWidth = units_calculateSize(group.barSize, options); - node.setAttribute("linethickness", ruleWidth + "em"); - } - - var style = genfrac_adjustStyle(group.size, options.style); - - if (style.size !== options.style.size) { - node = new mathMLTree.MathNode("mstyle", [node]); - var isDisplay = style.size === src_Style.DISPLAY.size ? "true" : "false"; - node.setAttribute("displaystyle", isDisplay); - node.setAttribute("scriptlevel", "0"); - } - - if (group.leftDelim != null || group.rightDelim != null) { - var withDelims = []; - - if (group.leftDelim != null) { - var leftOp = new mathMLTree.MathNode("mo", [new mathMLTree.TextNode(group.leftDelim.replace("\\", ""))]); - leftOp.setAttribute("fence", "true"); - withDelims.push(leftOp); - } - - withDelims.push(node); - - if (group.rightDelim != null) { - var rightOp = new mathMLTree.MathNode("mo", [new mathMLTree.TextNode(group.rightDelim.replace("\\", ""))]); - rightOp.setAttribute("fence", "true"); - withDelims.push(rightOp); - } - - return buildMathML_makeRow(withDelims); - } - - return node; -}; - -defineFunction({ - type: "genfrac", - names: ["\\cfrac", "\\dfrac", "\\frac", "\\tfrac", "\\dbinom", "\\binom", "\\tbinom", "\\\\atopfrac", // can’t be entered directly - "\\\\bracefrac", "\\\\brackfrac"], - props: { - numArgs: 2, - greediness: 2 - }, - handler: function handler(_ref, args) { - var parser = _ref.parser, - funcName = _ref.funcName; - var numer = args[0]; - var denom = args[1]; - var hasBarLine; - var leftDelim = null; - var rightDelim = null; - var size = "auto"; - - switch (funcName) { - case "\\cfrac": - case "\\dfrac": - case "\\frac": - case "\\tfrac": - hasBarLine = true; - break; - - case "\\\\atopfrac": - hasBarLine = false; - break; - - case "\\dbinom": - case "\\binom": - case "\\tbinom": - hasBarLine = false; - leftDelim = "("; - rightDelim = ")"; - break; - - case "\\\\bracefrac": - hasBarLine = false; - leftDelim = "\\{"; - rightDelim = "\\}"; - break; - - case "\\\\brackfrac": - hasBarLine = false; - leftDelim = "["; - rightDelim = "]"; - break; - - default: - throw new Error("Unrecognized genfrac command"); - } - - switch (funcName) { - case "\\cfrac": - case "\\dfrac": - case "\\dbinom": - size = "display"; - break; - - case "\\tfrac": - case "\\tbinom": - size = "text"; - break; - } - - return { - type: "genfrac", - mode: parser.mode, - continued: funcName === "\\cfrac", - numer: numer, - denom: denom, - hasBarLine: hasBarLine, - leftDelim: leftDelim, - rightDelim: rightDelim, - size: size, - barSize: null - }; - }, - htmlBuilder: genfrac_htmlBuilder, - mathmlBuilder: genfrac_mathmlBuilder -}); // Infix generalized fractions -- these are not rendered directly, but replaced -// immediately by one of the variants above. - -defineFunction({ - type: "infix", - names: ["\\over", "\\choose", "\\atop", "\\brace", "\\brack"], - props: { - numArgs: 0, - infix: true - }, - handler: function handler(_ref2) { - var parser = _ref2.parser, - funcName = _ref2.funcName, - token = _ref2.token; - var replaceWith; - - switch (funcName) { - case "\\over": - replaceWith = "\\frac"; - break; - - case "\\choose": - replaceWith = "\\binom"; - break; - - case "\\atop": - replaceWith = "\\\\atopfrac"; - break; - - case "\\brace": - replaceWith = "\\\\bracefrac"; - break; - - case "\\brack": - replaceWith = "\\\\brackfrac"; - break; - - default: - throw new Error("Unrecognized infix genfrac command"); - } - - return { - type: "infix", - mode: parser.mode, - replaceWith: replaceWith, - token: token - }; - } -}); -var stylArray = ["display", "text", "script", "scriptscript"]; - -var delimFromValue = function delimFromValue(delimString) { - var delim = null; - - if (delimString.length > 0) { - delim = delimString; - delim = delim === "." ? null : delim; - } - - return delim; -}; - -defineFunction({ - type: "genfrac", - names: ["\\genfrac"], - props: { - numArgs: 6, - greediness: 6, - argTypes: ["math", "math", "size", "text", "math", "math"] - }, - handler: function handler(_ref3, args) { - var parser = _ref3.parser; - var numer = args[4]; - var denom = args[5]; // Look into the parse nodes to get the desired delimiters. - - var leftDelim = args[0].type === "atom" && args[0].family === "open" ? delimFromValue(args[0].text) : null; - var rightDelim = args[1].type === "atom" && args[1].family === "close" ? delimFromValue(args[1].text) : null; - var barNode = assertNodeType(args[2], "size"); - var hasBarLine; - var barSize = null; - - if (barNode.isBlank) { - // \genfrac acts differently than \above. - // \genfrac treats an empty size group as a signal to use a - // standard bar size. \above would see size = 0 and omit the bar. - hasBarLine = true; - } else { - barSize = barNode.value; - hasBarLine = barSize.number > 0; - } // Find out if we want displaystyle, textstyle, etc. - - - var size = "auto"; - var styl = args[3]; - - if (styl.type === "ordgroup") { - if (styl.body.length > 0) { - var textOrd = assertNodeType(styl.body[0], "textord"); - size = stylArray[Number(textOrd.text)]; - } - } else { - styl = assertNodeType(styl, "textord"); - size = stylArray[Number(styl.text)]; - } - - return { - type: "genfrac", - mode: parser.mode, - numer: numer, - denom: denom, - continued: false, - hasBarLine: hasBarLine, - barSize: barSize, - leftDelim: leftDelim, - rightDelim: rightDelim, - size: size - }; - }, - htmlBuilder: genfrac_htmlBuilder, - mathmlBuilder: genfrac_mathmlBuilder -}); // \above is an infix fraction that also defines a fraction bar size. - -defineFunction({ - type: "infix", - names: ["\\above"], - props: { - numArgs: 1, - argTypes: ["size"], - infix: true - }, - handler: function handler(_ref4, args) { - var parser = _ref4.parser, - funcName = _ref4.funcName, - token = _ref4.token; - return { - type: "infix", - mode: parser.mode, - replaceWith: "\\\\abovefrac", - size: assertNodeType(args[0], "size").value, - token: token - }; - } -}); -defineFunction({ - type: "genfrac", - names: ["\\\\abovefrac"], - props: { - numArgs: 3, - argTypes: ["math", "size", "math"] - }, - handler: function handler(_ref5, args) { - var parser = _ref5.parser, - funcName = _ref5.funcName; - var numer = args[0]; - var barSize = assert(assertNodeType(args[1], "infix").size); - var denom = args[2]; - var hasBarLine = barSize.number > 0; - return { - type: "genfrac", - mode: parser.mode, - numer: numer, - denom: denom, - continued: false, - hasBarLine: hasBarLine, - barSize: barSize, - leftDelim: null, - rightDelim: null, - size: "auto" - }; - }, - htmlBuilder: genfrac_htmlBuilder, - mathmlBuilder: genfrac_mathmlBuilder -}); -// CONCATENATED MODULE: ./src/functions/horizBrace.js - - - - - - - - -// NOTE: Unlike most `htmlBuilder`s, this one handles not only "horizBrace", but -var horizBrace_htmlBuilder = function htmlBuilder(grp, options) { - var style = options.style; // Pull out the `ParseNode<"horizBrace">` if `grp` is a "supsub" node. - - var supSubGroup; - var group; - - if (grp.type === "supsub") { - // Ref: LaTeX source2e: }}}}\limits} - // i.e. LaTeX treats the brace similar to an op and passes it - // with \limits, so we need to assign supsub style. - supSubGroup = grp.sup ? buildHTML_buildGroup(grp.sup, options.havingStyle(style.sup()), options) : buildHTML_buildGroup(grp.sub, options.havingStyle(style.sub()), options); - group = assertNodeType(grp.base, "horizBrace"); - } else { - group = assertNodeType(grp, "horizBrace"); - } // Build the base group - - - var body = buildHTML_buildGroup(group.base, options.havingBaseStyle(src_Style.DISPLAY)); // Create the stretchy element - - var braceBody = stretchy.svgSpan(group, options); // Generate the vlist, with the appropriate kerns ┏━━━━━━━━┓ - // This first vlist contains the content and the brace: equation - - var vlist; - - if (group.isOver) { - vlist = buildCommon.makeVList({ - positionType: "firstBaseline", - children: [{ - type: "elem", - elem: body - }, { - type: "kern", - size: 0.1 - }, { - type: "elem", - elem: braceBody - }] - }, options); // $FlowFixMe: Replace this with passing "svg-align" into makeVList. - - vlist.children[0].children[0].children[1].classes.push("svg-align"); - } else { - vlist = buildCommon.makeVList({ - positionType: "bottom", - positionData: body.depth + 0.1 + braceBody.height, - children: [{ - type: "elem", - elem: braceBody - }, { - type: "kern", - size: 0.1 - }, { - type: "elem", - elem: body - }] - }, options); // $FlowFixMe: Replace this with passing "svg-align" into makeVList. - - vlist.children[0].children[0].children[0].classes.push("svg-align"); - } - - if (supSubGroup) { - // To write the supsub, wrap the first vlist in another vlist: - // They can't all go in the same vlist, because the note might be - // wider than the equation. We want the equation to control the - // brace width. - // note long note long note - // ┏━━━━━━━━┓ or ┏━━━┓ not ┏━━━━━━━━━┓ - // equation eqn eqn - var vSpan = buildCommon.makeSpan(["mord", group.isOver ? "mover" : "munder"], [vlist], options); - - if (group.isOver) { - vlist = buildCommon.makeVList({ - positionType: "firstBaseline", - children: [{ - type: "elem", - elem: vSpan - }, { - type: "kern", - size: 0.2 - }, { - type: "elem", - elem: supSubGroup - }] - }, options); - } else { - vlist = buildCommon.makeVList({ - positionType: "bottom", - positionData: vSpan.depth + 0.2 + supSubGroup.height + supSubGroup.depth, - children: [{ - type: "elem", - elem: supSubGroup - }, { - type: "kern", - size: 0.2 - }, { - type: "elem", - elem: vSpan - }] - }, options); - } - } - - return buildCommon.makeSpan(["mord", group.isOver ? "mover" : "munder"], [vlist], options); -}; - -var horizBrace_mathmlBuilder = function mathmlBuilder(group, options) { - var accentNode = stretchy.mathMLnode(group.label); - return new mathMLTree.MathNode(group.isOver ? "mover" : "munder", [buildMathML_buildGroup(group.base, options), accentNode]); -}; // Horizontal stretchy braces - - -defineFunction({ - type: "horizBrace", - names: ["\\overbrace", "\\underbrace"], - props: { - numArgs: 1 - }, - handler: function handler(_ref, args) { - var parser = _ref.parser, - funcName = _ref.funcName; - return { - type: "horizBrace", - mode: parser.mode, - label: funcName, - isOver: /^\\over/.test(funcName), - base: args[0] - }; - }, - htmlBuilder: horizBrace_htmlBuilder, - mathmlBuilder: horizBrace_mathmlBuilder -}); -// CONCATENATED MODULE: ./src/functions/href.js - - - - - - -defineFunction({ - type: "href", - names: ["\\href"], - props: { - numArgs: 2, - argTypes: ["url", "original"], - allowedInText: true - }, - handler: function handler(_ref, args) { - var parser = _ref.parser; - var body = args[1]; - var href = assertNodeType(args[0], "url").url; - - if (!parser.settings.isTrusted({ - command: "\\href", - url: href - })) { - return parser.formatUnsupportedCmd("\\href"); - } - - return { - type: "href", - mode: parser.mode, - href: href, - body: ordargument(body) - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - var elements = buildHTML_buildExpression(group.body, options, false); - return buildCommon.makeAnchor(group.href, [], elements, options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var math = buildExpressionRow(group.body, options); - - if (!(math instanceof mathMLTree_MathNode)) { - math = new mathMLTree_MathNode("mrow", [math]); - } - - math.setAttribute("href", group.href); - return math; - } -}); -defineFunction({ - type: "href", - names: ["\\url"], - props: { - numArgs: 1, - argTypes: ["url"], - allowedInText: true - }, - handler: function handler(_ref2, args) { - var parser = _ref2.parser; - var href = assertNodeType(args[0], "url").url; - - if (!parser.settings.isTrusted({ - command: "\\url", - url: href - })) { - return parser.formatUnsupportedCmd("\\url"); - } - - var chars = []; - - for (var i = 0; i < href.length; i++) { - var c = href[i]; - - if (c === "~") { - c = "\\textasciitilde"; - } - - chars.push({ - type: "textord", - mode: "text", - text: c - }); - } - - var body = { - type: "text", - mode: parser.mode, - font: "\\texttt", - body: chars - }; - return { - type: "href", - mode: parser.mode, - href: href, - body: ordargument(body) - }; - } -}); -// CONCATENATED MODULE: ./src/functions/html.js - - - - - - -defineFunction({ - type: "html", - names: ["\\htmlClass", "\\htmlId", "\\htmlStyle", "\\htmlData"], - props: { - numArgs: 2, - argTypes: ["raw", "original"], - allowedInText: true - }, - handler: function handler(_ref, args) { - var parser = _ref.parser, - funcName = _ref.funcName, - token = _ref.token; - var value = assertNodeType(args[0], "raw").string; - var body = args[1]; - - if (parser.settings.strict) { - parser.settings.reportNonstrict("htmlExtension", "HTML extension is disabled on strict mode"); - } - - var trustContext; - var attributes = {}; - - switch (funcName) { - case "\\htmlClass": - attributes.class = value; - trustContext = { - command: "\\htmlClass", - class: value - }; - break; - - case "\\htmlId": - attributes.id = value; - trustContext = { - command: "\\htmlId", - id: value - }; - break; - - case "\\htmlStyle": - attributes.style = value; - trustContext = { - command: "\\htmlStyle", - style: value - }; - break; - - case "\\htmlData": - { - var data = value.split(","); - - for (var i = 0; i < data.length; i++) { - var keyVal = data[i].split("="); - - if (keyVal.length !== 2) { - throw new src_ParseError("Error parsing key-value for \\htmlData"); - } - - attributes["data-" + keyVal[0].trim()] = keyVal[1].trim(); - } - - trustContext = { - command: "\\htmlData", - attributes: attributes - }; - break; - } - - default: - throw new Error("Unrecognized html command"); - } - - if (!parser.settings.isTrusted(trustContext)) { - return parser.formatUnsupportedCmd(funcName); - } - - return { - type: "html", - mode: parser.mode, - attributes: attributes, - body: ordargument(body) - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - var elements = buildHTML_buildExpression(group.body, options, false); - var classes = ["enclosing"]; - - if (group.attributes.class) { - classes.push.apply(classes, group.attributes.class.trim().split(/\s+/)); - } - - var span = buildCommon.makeSpan(classes, elements, options); - - for (var attr in group.attributes) { - if (attr !== "class" && group.attributes.hasOwnProperty(attr)) { - span.setAttribute(attr, group.attributes[attr]); - } - } - - return span; - }, - mathmlBuilder: function mathmlBuilder(group, options) { - return buildExpressionRow(group.body, options); - } -}); -// CONCATENATED MODULE: ./src/functions/htmlmathml.js - - - - -defineFunction({ - type: "htmlmathml", - names: ["\\html@mathml"], - props: { - numArgs: 2, - allowedInText: true - }, - handler: function handler(_ref, args) { - var parser = _ref.parser; - return { - type: "htmlmathml", - mode: parser.mode, - html: ordargument(args[0]), - mathml: ordargument(args[1]) - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - var elements = buildHTML_buildExpression(group.html, options, false); - return buildCommon.makeFragment(elements); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - return buildExpressionRow(group.mathml, options); - } -}); -// CONCATENATED MODULE: ./src/functions/includegraphics.js - - - - - - - -var includegraphics_sizeData = function sizeData(str) { - if (/^[-+]? *(\d+(\.\d*)?|\.\d+)$/.test(str)) { - // str is a number with no unit specified. - // default unit is bp, per graphix package. - return { - number: +str, - unit: "bp" - }; - } else { - var match = /([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(str); - - if (!match) { - throw new src_ParseError("Invalid size: '" + str + "' in \\includegraphics"); - } - - var data = { - number: +(match[1] + match[2]), - // sign + magnitude, cast to number - unit: match[3] - }; - - if (!validUnit(data)) { - throw new src_ParseError("Invalid unit: '" + data.unit + "' in \\includegraphics."); - } - - return data; - } -}; - -defineFunction({ - type: "includegraphics", - names: ["\\includegraphics"], - props: { - numArgs: 1, - numOptionalArgs: 1, - argTypes: ["raw", "url"], - allowedInText: false - }, - handler: function handler(_ref, args, optArgs) { - var parser = _ref.parser; - var width = { - number: 0, - unit: "em" - }; - var height = { - number: 0.9, - unit: "em" - }; // sorta character sized. - - var totalheight = { - number: 0, - unit: "em" - }; - var alt = ""; - - if (optArgs[0]) { - var attributeStr = assertNodeType(optArgs[0], "raw").string; // Parser.js does not parse key/value pairs. We get a string. - - var attributes = attributeStr.split(","); - - for (var i = 0; i < attributes.length; i++) { - var keyVal = attributes[i].split("="); - - if (keyVal.length === 2) { - var str = keyVal[1].trim(); - - switch (keyVal[0].trim()) { - case "alt": - alt = str; - break; - - case "width": - width = includegraphics_sizeData(str); - break; - - case "height": - height = includegraphics_sizeData(str); - break; - - case "totalheight": - totalheight = includegraphics_sizeData(str); - break; - - default: - throw new src_ParseError("Invalid key: '" + keyVal[0] + "' in \\includegraphics."); - } - } - } - } - - var src = assertNodeType(args[0], "url").url; - - if (alt === "") { - // No alt given. Use the file name. Strip away the path. - alt = src; - alt = alt.replace(/^.*[\\/]/, ''); - alt = alt.substring(0, alt.lastIndexOf('.')); - } - - if (!parser.settings.isTrusted({ - command: "\\includegraphics", - url: src - })) { - return parser.formatUnsupportedCmd("\\includegraphics"); - } - - return { - type: "includegraphics", - mode: parser.mode, - alt: alt, - width: width, - height: height, - totalheight: totalheight, - src: src - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - var height = units_calculateSize(group.height, options); - var depth = 0; - - if (group.totalheight.number > 0) { - depth = units_calculateSize(group.totalheight, options) - height; - depth = Number(depth.toFixed(2)); - } - - var width = 0; - - if (group.width.number > 0) { - width = units_calculateSize(group.width, options); - } - - var style = { - height: height + depth + "em" - }; - - if (width > 0) { - style.width = width + "em"; - } - - if (depth > 0) { - style.verticalAlign = -depth + "em"; - } - - var node = new domTree_Img(group.src, group.alt, style); - node.height = height; - node.depth = depth; - return node; - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var node = new mathMLTree.MathNode("mglyph", []); - node.setAttribute("alt", group.alt); - var height = units_calculateSize(group.height, options); - var depth = 0; - - if (group.totalheight.number > 0) { - depth = units_calculateSize(group.totalheight, options) - height; - depth = depth.toFixed(2); - node.setAttribute("valign", "-" + depth + "em"); - } - - node.setAttribute("height", height + depth + "em"); - - if (group.width.number > 0) { - var width = units_calculateSize(group.width, options); - node.setAttribute("width", width + "em"); - } - - node.setAttribute("src", group.src); - return node; - } -}); -// CONCATENATED MODULE: ./src/functions/kern.js -// Horizontal spacing commands - - - - - // TODO: \hskip and \mskip should support plus and minus in lengths - -defineFunction({ - type: "kern", - names: ["\\kern", "\\mkern", "\\hskip", "\\mskip"], - props: { - numArgs: 1, - argTypes: ["size"], - allowedInText: true - }, - handler: function handler(_ref, args) { - var parser = _ref.parser, - funcName = _ref.funcName; - var size = assertNodeType(args[0], "size"); - - if (parser.settings.strict) { - var mathFunction = funcName[1] === 'm'; // \mkern, \mskip - - var muUnit = size.value.unit === 'mu'; - - if (mathFunction) { - if (!muUnit) { - parser.settings.reportNonstrict("mathVsTextUnits", "LaTeX's " + funcName + " supports only mu units, " + ("not " + size.value.unit + " units")); - } - - if (parser.mode !== "math") { - parser.settings.reportNonstrict("mathVsTextUnits", "LaTeX's " + funcName + " works only in math mode"); - } - } else { - // !mathFunction - if (muUnit) { - parser.settings.reportNonstrict("mathVsTextUnits", "LaTeX's " + funcName + " doesn't support mu units"); - } - } - } - - return { - type: "kern", - mode: parser.mode, - dimension: size.value - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - return buildCommon.makeGlue(group.dimension, options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var dimension = units_calculateSize(group.dimension, options); - return new mathMLTree.SpaceNode(dimension); - } -}); -// CONCATENATED MODULE: ./src/functions/lap.js -// Horizontal overlap functions - - - - - -defineFunction({ - type: "lap", - names: ["\\mathllap", "\\mathrlap", "\\mathclap"], - props: { - numArgs: 1, - allowedInText: true - }, - handler: function handler(_ref, args) { - var parser = _ref.parser, - funcName = _ref.funcName; - var body = args[0]; - return { - type: "lap", - mode: parser.mode, - alignment: funcName.slice(5), - body: body - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - // mathllap, mathrlap, mathclap - var inner; - - if (group.alignment === "clap") { - // ref: https://www.math.lsu.edu/~aperlis/publications/mathclap/ - inner = buildCommon.makeSpan([], [buildHTML_buildGroup(group.body, options)]); // wrap, since CSS will center a .clap > .inner > span - - inner = buildCommon.makeSpan(["inner"], [inner], options); - } else { - inner = buildCommon.makeSpan(["inner"], [buildHTML_buildGroup(group.body, options)]); - } - - var fix = buildCommon.makeSpan(["fix"], []); - var node = buildCommon.makeSpan([group.alignment], [inner, fix], options); // At this point, we have correctly set horizontal alignment of the - // two items involved in the lap. - // Next, use a strut to set the height of the HTML bounding box. - // Otherwise, a tall argument may be misplaced. - // This code resolved issue #1153 - - var strut = buildCommon.makeSpan(["strut"]); - strut.style.height = node.height + node.depth + "em"; - strut.style.verticalAlign = -node.depth + "em"; - node.children.unshift(strut); // Next, prevent vertical misplacement when next to something tall. - // This code resolves issue #1234 - - node = buildCommon.makeSpan(["thinbox"], [node], options); - return buildCommon.makeSpan(["mord", "vbox"], [node], options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - // mathllap, mathrlap, mathclap - var node = new mathMLTree.MathNode("mpadded", [buildMathML_buildGroup(group.body, options)]); - - if (group.alignment !== "rlap") { - var offset = group.alignment === "llap" ? "-1" : "-0.5"; - node.setAttribute("lspace", offset + "width"); - } - - node.setAttribute("width", "0px"); - return node; - } -}); -// CONCATENATED MODULE: ./src/functions/math.js - - // Switching from text mode back to math mode - -defineFunction({ - type: "styling", - names: ["\\(", "$"], - props: { - numArgs: 0, - allowedInText: true, - allowedInMath: false - }, - handler: function handler(_ref, args) { - var funcName = _ref.funcName, - parser = _ref.parser; - var outerMode = parser.mode; - parser.switchMode("math"); - var close = funcName === "\\(" ? "\\)" : "$"; - var body = parser.parseExpression(false, close); - parser.expect(close); - parser.switchMode(outerMode); - return { - type: "styling", - mode: parser.mode, - style: "text", - body: body - }; - } -}); // Check for extra closing math delimiters - -defineFunction({ - type: "text", - // Doesn't matter what this is. - names: ["\\)", "\\]"], - props: { - numArgs: 0, - allowedInText: true, - allowedInMath: false - }, - handler: function handler(context, args) { - throw new src_ParseError("Mismatched " + context.funcName); - } -}); -// CONCATENATED MODULE: ./src/functions/mathchoice.js - - - - - - -var mathchoice_chooseMathStyle = function chooseMathStyle(group, options) { - switch (options.style.size) { - case src_Style.DISPLAY.size: - return group.display; - - case src_Style.TEXT.size: - return group.text; - - case src_Style.SCRIPT.size: - return group.script; - - case src_Style.SCRIPTSCRIPT.size: - return group.scriptscript; - - default: - return group.text; - } -}; - -defineFunction({ - type: "mathchoice", - names: ["\\mathchoice"], - props: { - numArgs: 4 - }, - handler: function handler(_ref, args) { - var parser = _ref.parser; - return { - type: "mathchoice", - mode: parser.mode, - display: ordargument(args[0]), - text: ordargument(args[1]), - script: ordargument(args[2]), - scriptscript: ordargument(args[3]) - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - var body = mathchoice_chooseMathStyle(group, options); - var elements = buildHTML_buildExpression(body, options, false); - return buildCommon.makeFragment(elements); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var body = mathchoice_chooseMathStyle(group, options); - return buildExpressionRow(body, options); - } -}); -// CONCATENATED MODULE: ./src/functions/utils/assembleSupSub.js - - -// For an operator with limits, assemble the base, sup, and sub into a span. -var assembleSupSub_assembleSupSub = function assembleSupSub(base, supGroup, subGroup, options, style, slant, baseShift) { - base = buildCommon.makeSpan([], [base]); - var sub; - var sup; // We manually have to handle the superscripts and subscripts. This, - // aside from the kern calculations, is copied from supsub. - - if (supGroup) { - var elem = buildHTML_buildGroup(supGroup, options.havingStyle(style.sup()), options); - sup = { - elem: elem, - kern: Math.max(options.fontMetrics().bigOpSpacing1, options.fontMetrics().bigOpSpacing3 - elem.depth) - }; - } - - if (subGroup) { - var _elem = buildHTML_buildGroup(subGroup, options.havingStyle(style.sub()), options); - - sub = { - elem: _elem, - kern: Math.max(options.fontMetrics().bigOpSpacing2, options.fontMetrics().bigOpSpacing4 - _elem.height) - }; - } // Build the final group as a vlist of the possible subscript, base, - // and possible superscript. - - - var finalGroup; - - if (sup && sub) { - var bottom = options.fontMetrics().bigOpSpacing5 + sub.elem.height + sub.elem.depth + sub.kern + base.depth + baseShift; - finalGroup = buildCommon.makeVList({ - positionType: "bottom", - positionData: bottom, - children: [{ - type: "kern", - size: options.fontMetrics().bigOpSpacing5 - }, { - type: "elem", - elem: sub.elem, - marginLeft: -slant + "em" - }, { - type: "kern", - size: sub.kern - }, { - type: "elem", - elem: base - }, { - type: "kern", - size: sup.kern - }, { - type: "elem", - elem: sup.elem, - marginLeft: slant + "em" - }, { - type: "kern", - size: options.fontMetrics().bigOpSpacing5 - }] - }, options); - } else if (sub) { - var top = base.height - baseShift; // Shift the limits by the slant of the symbol. Note - // that we are supposed to shift the limits by 1/2 of the slant, - // but since we are centering the limits adding a full slant of - // margin will shift by 1/2 that. - - finalGroup = buildCommon.makeVList({ - positionType: "top", - positionData: top, - children: [{ - type: "kern", - size: options.fontMetrics().bigOpSpacing5 - }, { - type: "elem", - elem: sub.elem, - marginLeft: -slant + "em" - }, { - type: "kern", - size: sub.kern - }, { - type: "elem", - elem: base - }] - }, options); - } else if (sup) { - var _bottom = base.depth + baseShift; - - finalGroup = buildCommon.makeVList({ - positionType: "bottom", - positionData: _bottom, - children: [{ - type: "elem", - elem: base - }, { - type: "kern", - size: sup.kern - }, { - type: "elem", - elem: sup.elem, - marginLeft: slant + "em" - }, { - type: "kern", - size: options.fontMetrics().bigOpSpacing5 - }] - }, options); - } else { - // This case probably shouldn't occur (this would mean the - // supsub was sending us a group with no superscript or - // subscript) but be safe. - return base; - } - - return buildCommon.makeSpan(["mop", "op-limits"], [finalGroup], options); -}; -// CONCATENATED MODULE: ./src/functions/op.js -// Limits, symbols - - - - - - - - - - -// Most operators have a large successor symbol, but these don't. -var noSuccessor = ["\\smallint"]; // NOTE: Unlike most `htmlBuilder`s, this one handles not only "op", but also -// "supsub" since some of them (like \int) can affect super/subscripting. - -var op_htmlBuilder = function htmlBuilder(grp, options) { - // Operators are handled in the TeXbook pg. 443-444, rule 13(a). - var supGroup; - var subGroup; - var hasLimits = false; - var group; - - if (grp.type === "supsub") { - // If we have limits, supsub will pass us its group to handle. Pull - // out the superscript and subscript and set the group to the op in - // its base. - supGroup = grp.sup; - subGroup = grp.sub; - group = assertNodeType(grp.base, "op"); - hasLimits = true; - } else { - group = assertNodeType(grp, "op"); - } - - var style = options.style; - var large = false; - - if (style.size === src_Style.DISPLAY.size && group.symbol && !utils.contains(noSuccessor, group.name)) { - // Most symbol operators get larger in displaystyle (rule 13) - large = true; - } - - var base; - - if (group.symbol) { - // If this is a symbol, create the symbol. - var fontName = large ? "Size2-Regular" : "Size1-Regular"; - var stash = ""; - - if (group.name === "\\oiint" || group.name === "\\oiiint") { - // No font glyphs yet, so use a glyph w/o the oval. - // TODO: When font glyphs are available, delete this code. - stash = group.name.substr(1); // $FlowFixMe - - group.name = stash === "oiint" ? "\\iint" : "\\iiint"; - } - - base = buildCommon.makeSymbol(group.name, fontName, "math", options, ["mop", "op-symbol", large ? "large-op" : "small-op"]); - - if (stash.length > 0) { - // We're in \oiint or \oiiint. Overlay the oval. - // TODO: When font glyphs are available, delete this code. - var italic = base.italic; - var oval = buildCommon.staticSvg(stash + "Size" + (large ? "2" : "1"), options); - base = buildCommon.makeVList({ - positionType: "individualShift", - children: [{ - type: "elem", - elem: base, - shift: 0 - }, { - type: "elem", - elem: oval, - shift: large ? 0.08 : 0 - }] - }, options); // $FlowFixMe - - group.name = "\\" + stash; - base.classes.unshift("mop"); // $FlowFixMe - - base.italic = italic; - } - } else if (group.body) { - // If this is a list, compose that list. - var inner = buildHTML_buildExpression(group.body, options, true); - - if (inner.length === 1 && inner[0] instanceof domTree_SymbolNode) { - base = inner[0]; - base.classes[0] = "mop"; // replace old mclass - } else { - base = buildCommon.makeSpan(["mop"], buildCommon.tryCombineChars(inner), options); - } - } else { - // Otherwise, this is a text operator. Build the text from the - // operator's name. - // TODO(emily): Add a space in the middle of some of these - // operators, like \limsup - var output = []; - - for (var i = 1; i < group.name.length; i++) { - output.push(buildCommon.mathsym(group.name[i], group.mode, options)); - } - - base = buildCommon.makeSpan(["mop"], output, options); - } // If content of op is a single symbol, shift it vertically. - - - var baseShift = 0; - var slant = 0; - - if ((base instanceof domTree_SymbolNode || group.name === "\\oiint" || group.name === "\\oiiint") && !group.suppressBaseShift) { - // We suppress the shift of the base of \overset and \underset. Otherwise, - // shift the symbol so its center lies on the axis (rule 13). It - // appears that our fonts have the centers of the symbols already - // almost on the axis, so these numbers are very small. Note we - // don't actually apply this here, but instead it is used either in - // the vlist creation or separately when there are no limits. - baseShift = (base.height - base.depth) / 2 - options.fontMetrics().axisHeight; // The slant of the symbol is just its italic correction. - // $FlowFixMe - - slant = base.italic; - } - - if (hasLimits) { - return assembleSupSub_assembleSupSub(base, supGroup, subGroup, options, style, slant, baseShift); - } else { - if (baseShift) { - base.style.position = "relative"; - base.style.top = baseShift + "em"; - } - - return base; - } -}; - -var op_mathmlBuilder = function mathmlBuilder(group, options) { - var node; - - if (group.symbol) { - // This is a symbol. Just add the symbol. - node = new mathMLTree_MathNode("mo", [buildMathML_makeText(group.name, group.mode)]); - - if (utils.contains(noSuccessor, group.name)) { - node.setAttribute("largeop", "false"); - } - } else if (group.body) { - // This is an operator with children. Add them. - node = new mathMLTree_MathNode("mo", buildMathML_buildExpression(group.body, options)); - } else { - // This is a text operator. Add all of the characters from the - // operator's name. - node = new mathMLTree_MathNode("mi", [new mathMLTree_TextNode(group.name.slice(1))]); // Append an . - // ref: https://www.w3.org/TR/REC-MathML/chap3_2.html#sec3.2.4 - - var operator = new mathMLTree_MathNode("mo", [buildMathML_makeText("\u2061", "text")]); - - if (group.parentIsSupSub) { - node = new mathMLTree_MathNode("mo", [node, operator]); - } else { - node = newDocumentFragment([node, operator]); - } - } - - return node; -}; - -var singleCharBigOps = { - "\u220F": "\\prod", - "\u2210": "\\coprod", - "\u2211": "\\sum", - "\u22C0": "\\bigwedge", - "\u22C1": "\\bigvee", - "\u22C2": "\\bigcap", - "\u22C3": "\\bigcup", - "\u2A00": "\\bigodot", - "\u2A01": "\\bigoplus", - "\u2A02": "\\bigotimes", - "\u2A04": "\\biguplus", - "\u2A06": "\\bigsqcup" -}; -defineFunction({ - type: "op", - names: ["\\coprod", "\\bigvee", "\\bigwedge", "\\biguplus", "\\bigcap", "\\bigcup", "\\intop", "\\prod", "\\sum", "\\bigotimes", "\\bigoplus", "\\bigodot", "\\bigsqcup", "\\smallint", "\u220F", "\u2210", "\u2211", "\u22C0", "\u22C1", "\u22C2", "\u22C3", "\u2A00", "\u2A01", "\u2A02", "\u2A04", "\u2A06"], - props: { - numArgs: 0 - }, - handler: function handler(_ref, args) { - var parser = _ref.parser, - funcName = _ref.funcName; - var fName = funcName; - - if (fName.length === 1) { - fName = singleCharBigOps[fName]; - } - - return { - type: "op", - mode: parser.mode, - limits: true, - parentIsSupSub: false, - symbol: true, - name: fName - }; - }, - htmlBuilder: op_htmlBuilder, - mathmlBuilder: op_mathmlBuilder -}); // Note: calling defineFunction with a type that's already been defined only -// works because the same htmlBuilder and mathmlBuilder are being used. - -defineFunction({ - type: "op", - names: ["\\mathop"], - props: { - numArgs: 1 - }, - handler: function handler(_ref2, args) { - var parser = _ref2.parser; - var body = args[0]; - return { - type: "op", - mode: parser.mode, - limits: false, - parentIsSupSub: false, - symbol: false, - body: ordargument(body) - }; - }, - htmlBuilder: op_htmlBuilder, - mathmlBuilder: op_mathmlBuilder -}); // There are 2 flags for operators; whether they produce limits in -// displaystyle, and whether they are symbols and should grow in -// displaystyle. These four groups cover the four possible choices. - -var singleCharIntegrals = { - "\u222B": "\\int", - "\u222C": "\\iint", - "\u222D": "\\iiint", - "\u222E": "\\oint", - "\u222F": "\\oiint", - "\u2230": "\\oiiint" -}; // No limits, not symbols - -defineFunction({ - type: "op", - names: ["\\arcsin", "\\arccos", "\\arctan", "\\arctg", "\\arcctg", "\\arg", "\\ch", "\\cos", "\\cosec", "\\cosh", "\\cot", "\\cotg", "\\coth", "\\csc", "\\ctg", "\\cth", "\\deg", "\\dim", "\\exp", "\\hom", "\\ker", "\\lg", "\\ln", "\\log", "\\sec", "\\sin", "\\sinh", "\\sh", "\\tan", "\\tanh", "\\tg", "\\th"], - props: { - numArgs: 0 - }, - handler: function handler(_ref3) { - var parser = _ref3.parser, - funcName = _ref3.funcName; - return { - type: "op", - mode: parser.mode, - limits: false, - parentIsSupSub: false, - symbol: false, - name: funcName - }; - }, - htmlBuilder: op_htmlBuilder, - mathmlBuilder: op_mathmlBuilder -}); // Limits, not symbols - -defineFunction({ - type: "op", - names: ["\\det", "\\gcd", "\\inf", "\\lim", "\\max", "\\min", "\\Pr", "\\sup"], - props: { - numArgs: 0 - }, - handler: function handler(_ref4) { - var parser = _ref4.parser, - funcName = _ref4.funcName; - return { - type: "op", - mode: parser.mode, - limits: true, - parentIsSupSub: false, - symbol: false, - name: funcName - }; - }, - htmlBuilder: op_htmlBuilder, - mathmlBuilder: op_mathmlBuilder -}); // No limits, symbols - -defineFunction({ - type: "op", - names: ["\\int", "\\iint", "\\iiint", "\\oint", "\\oiint", "\\oiiint", "\u222B", "\u222C", "\u222D", "\u222E", "\u222F", "\u2230"], - props: { - numArgs: 0 - }, - handler: function handler(_ref5) { - var parser = _ref5.parser, - funcName = _ref5.funcName; - var fName = funcName; - - if (fName.length === 1) { - fName = singleCharIntegrals[fName]; - } - - return { - type: "op", - mode: parser.mode, - limits: false, - parentIsSupSub: false, - symbol: true, - name: fName - }; - }, - htmlBuilder: op_htmlBuilder, - mathmlBuilder: op_mathmlBuilder -}); -// CONCATENATED MODULE: ./src/functions/operatorname.js - - - - - - - - -// NOTE: Unlike most `htmlBuilder`s, this one handles not only -// "operatorname", but also "supsub" since \operatorname* can -var operatorname_htmlBuilder = function htmlBuilder(grp, options) { - // Operators are handled in the TeXbook pg. 443-444, rule 13(a). - var supGroup; - var subGroup; - var hasLimits = false; - var group; - - if (grp.type === "supsub") { - // If we have limits, supsub will pass us its group to handle. Pull - // out the superscript and subscript and set the group to the op in - // its base. - supGroup = grp.sup; - subGroup = grp.sub; - group = assertNodeType(grp.base, "operatorname"); - hasLimits = true; - } else { - group = assertNodeType(grp, "operatorname"); - } - - var base; - - if (group.body.length > 0) { - var body = group.body.map(function (child) { - // $FlowFixMe: Check if the node has a string `text` property. - var childText = child.text; - - if (typeof childText === "string") { - return { - type: "textord", - mode: child.mode, - text: childText - }; - } else { - return child; - } - }); // Consolidate function names into symbol characters. - - var expression = buildHTML_buildExpression(body, options.withFont("mathrm"), true); - - for (var i = 0; i < expression.length; i++) { - var child = expression[i]; - - if (child instanceof domTree_SymbolNode) { - // Per amsopn package, - // change minus to hyphen and \ast to asterisk - child.text = child.text.replace(/\u2212/, "-").replace(/\u2217/, "*"); - } - } - - base = buildCommon.makeSpan(["mop"], expression, options); - } else { - base = buildCommon.makeSpan(["mop"], [], options); - } - - if (hasLimits) { - return assembleSupSub_assembleSupSub(base, supGroup, subGroup, options, options.style, 0, 0); - } else { - return base; - } -}; - -var operatorname_mathmlBuilder = function mathmlBuilder(group, options) { - // The steps taken here are similar to the html version. - var expression = buildMathML_buildExpression(group.body, options.withFont("mathrm")); // Is expression a string or has it something like a fraction? - - var isAllString = true; // default - - for (var i = 0; i < expression.length; i++) { - var node = expression[i]; - - if (node instanceof mathMLTree.SpaceNode) ; else if (node instanceof mathMLTree.MathNode) { - switch (node.type) { - case "mi": - case "mn": - case "ms": - case "mspace": - case "mtext": - break; - // Do nothing yet. - - case "mo": - { - var child = node.children[0]; - - if (node.children.length === 1 && child instanceof mathMLTree.TextNode) { - child.text = child.text.replace(/\u2212/, "-").replace(/\u2217/, "*"); - } else { - isAllString = false; - } - - break; - } - - default: - isAllString = false; - } - } else { - isAllString = false; - } - } - - if (isAllString) { - // Write a single TextNode instead of multiple nested tags. - var word = expression.map(function (node) { - return node.toText(); - }).join(""); - expression = [new mathMLTree.TextNode(word)]; - } - - var identifier = new mathMLTree.MathNode("mi", expression); - identifier.setAttribute("mathvariant", "normal"); // \u2061 is the same as ⁡ - // ref: https://www.w3schools.com/charsets/ref_html_entities_a.asp - - var operator = new mathMLTree.MathNode("mo", [buildMathML_makeText("\u2061", "text")]); - - if (group.parentIsSupSub) { - return new mathMLTree.MathNode("mo", [identifier, operator]); - } else { - return mathMLTree.newDocumentFragment([identifier, operator]); - } -}; // \operatorname -// amsopn.dtx: \mathop{#1\kern\z@\operator@font#3}\newmcodes@ - - -defineFunction({ - type: "operatorname", - names: ["\\operatorname", "\\operatorname*"], - props: { - numArgs: 1 - }, - handler: function handler(_ref, args) { - var parser = _ref.parser, - funcName = _ref.funcName; - var body = args[0]; - return { - type: "operatorname", - mode: parser.mode, - body: ordargument(body), - alwaysHandleSupSub: funcName === "\\operatorname*", - limits: false, - parentIsSupSub: false - }; - }, - htmlBuilder: operatorname_htmlBuilder, - mathmlBuilder: operatorname_mathmlBuilder -}); -// CONCATENATED MODULE: ./src/functions/ordgroup.js - - - - -defineFunctionBuilders({ - type: "ordgroup", - htmlBuilder: function htmlBuilder(group, options) { - if (group.semisimple) { - return buildCommon.makeFragment(buildHTML_buildExpression(group.body, options, false)); - } - - return buildCommon.makeSpan(["mord"], buildHTML_buildExpression(group.body, options, true), options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - return buildExpressionRow(group.body, options, true); - } -}); -// CONCATENATED MODULE: ./src/functions/overline.js - - - - - -defineFunction({ - type: "overline", - names: ["\\overline"], - props: { - numArgs: 1 - }, - handler: function handler(_ref, args) { - var parser = _ref.parser; - var body = args[0]; - return { - type: "overline", - mode: parser.mode, - body: body - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - // Overlines are handled in the TeXbook pg 443, Rule 9. - // Build the inner group in the cramped style. - var innerGroup = buildHTML_buildGroup(group.body, options.havingCrampedStyle()); // Create the line above the body - - var line = buildCommon.makeLineSpan("overline-line", options); // Generate the vlist, with the appropriate kerns - - var defaultRuleThickness = options.fontMetrics().defaultRuleThickness; - var vlist = buildCommon.makeVList({ - positionType: "firstBaseline", - children: [{ - type: "elem", - elem: innerGroup - }, { - type: "kern", - size: 3 * defaultRuleThickness - }, { - type: "elem", - elem: line - }, { - type: "kern", - size: defaultRuleThickness - }] - }, options); - return buildCommon.makeSpan(["mord", "overline"], [vlist], options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var operator = new mathMLTree.MathNode("mo", [new mathMLTree.TextNode("\u203E")]); - operator.setAttribute("stretchy", "true"); - var node = new mathMLTree.MathNode("mover", [buildMathML_buildGroup(group.body, options), operator]); - node.setAttribute("accent", "true"); - return node; - } -}); -// CONCATENATED MODULE: ./src/functions/phantom.js - - - - - -defineFunction({ - type: "phantom", - names: ["\\phantom"], - props: { - numArgs: 1, - allowedInText: true - }, - handler: function handler(_ref, args) { - var parser = _ref.parser; - var body = args[0]; - return { - type: "phantom", - mode: parser.mode, - body: ordargument(body) - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - var elements = buildHTML_buildExpression(group.body, options.withPhantom(), false); // \phantom isn't supposed to affect the elements it contains. - // See "color" for more details. - - return buildCommon.makeFragment(elements); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var inner = buildMathML_buildExpression(group.body, options); - return new mathMLTree.MathNode("mphantom", inner); - } -}); -defineFunction({ - type: "hphantom", - names: ["\\hphantom"], - props: { - numArgs: 1, - allowedInText: true - }, - handler: function handler(_ref2, args) { - var parser = _ref2.parser; - var body = args[0]; - return { - type: "hphantom", - mode: parser.mode, - body: body - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - var node = buildCommon.makeSpan([], [buildHTML_buildGroup(group.body, options.withPhantom())]); - node.height = 0; - node.depth = 0; - - if (node.children) { - for (var i = 0; i < node.children.length; i++) { - node.children[i].height = 0; - node.children[i].depth = 0; - } - } // See smash for comment re: use of makeVList - - - node = buildCommon.makeVList({ - positionType: "firstBaseline", - children: [{ - type: "elem", - elem: node - }] - }, options); // For spacing, TeX treats \smash as a math group (same spacing as ord). - - return buildCommon.makeSpan(["mord"], [node], options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var inner = buildMathML_buildExpression(ordargument(group.body), options); - var phantom = new mathMLTree.MathNode("mphantom", inner); - var node = new mathMLTree.MathNode("mpadded", [phantom]); - node.setAttribute("height", "0px"); - node.setAttribute("depth", "0px"); - return node; - } -}); -defineFunction({ - type: "vphantom", - names: ["\\vphantom"], - props: { - numArgs: 1, - allowedInText: true - }, - handler: function handler(_ref3, args) { - var parser = _ref3.parser; - var body = args[0]; - return { - type: "vphantom", - mode: parser.mode, - body: body - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - var inner = buildCommon.makeSpan(["inner"], [buildHTML_buildGroup(group.body, options.withPhantom())]); - var fix = buildCommon.makeSpan(["fix"], []); - return buildCommon.makeSpan(["mord", "rlap"], [inner, fix], options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var inner = buildMathML_buildExpression(ordargument(group.body), options); - var phantom = new mathMLTree.MathNode("mphantom", inner); - var node = new mathMLTree.MathNode("mpadded", [phantom]); - node.setAttribute("width", "0px"); - return node; - } -}); -// CONCATENATED MODULE: ./src/functions/raisebox.js - - - - - - - // Box manipulation - -defineFunction({ - type: "raisebox", - names: ["\\raisebox"], - props: { - numArgs: 2, - argTypes: ["size", "hbox"], - allowedInText: true - }, - handler: function handler(_ref, args) { - var parser = _ref.parser; - var amount = assertNodeType(args[0], "size").value; - var body = args[1]; - return { - type: "raisebox", - mode: parser.mode, - dy: amount, - body: body - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - var body = buildHTML_buildGroup(group.body, options); - var dy = units_calculateSize(group.dy, options); - return buildCommon.makeVList({ - positionType: "shift", - positionData: -dy, - children: [{ - type: "elem", - elem: body - }] - }, options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var node = new mathMLTree.MathNode("mpadded", [buildMathML_buildGroup(group.body, options)]); - var dy = group.dy.number + group.dy.unit; - node.setAttribute("voffset", dy); - return node; - } -}); -// CONCATENATED MODULE: ./src/functions/rule.js - - - - - -defineFunction({ - type: "rule", - names: ["\\rule"], - props: { - numArgs: 2, - numOptionalArgs: 1, - argTypes: ["size", "size", "size"] - }, - handler: function handler(_ref, args, optArgs) { - var parser = _ref.parser; - var shift = optArgs[0]; - var width = assertNodeType(args[0], "size"); - var height = assertNodeType(args[1], "size"); - return { - type: "rule", - mode: parser.mode, - shift: shift && assertNodeType(shift, "size").value, - width: width.value, - height: height.value - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - // Make an empty span for the rule - var rule = buildCommon.makeSpan(["mord", "rule"], [], options); // Calculate the shift, width, and height of the rule, and account for units - - var width = units_calculateSize(group.width, options); - var height = units_calculateSize(group.height, options); - var shift = group.shift ? units_calculateSize(group.shift, options) : 0; // Style the rule to the right size - - rule.style.borderRightWidth = width + "em"; - rule.style.borderTopWidth = height + "em"; - rule.style.bottom = shift + "em"; // Record the height and width - - rule.width = width; - rule.height = height + shift; - rule.depth = -shift; // Font size is the number large enough that the browser will - // reserve at least `absHeight` space above the baseline. - // The 1.125 factor was empirically determined - - rule.maxFontSize = height * 1.125 * options.sizeMultiplier; - return rule; - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var width = units_calculateSize(group.width, options); - var height = units_calculateSize(group.height, options); - var shift = group.shift ? units_calculateSize(group.shift, options) : 0; - var color = options.color && options.getColor() || "black"; - var rule = new mathMLTree.MathNode("mspace"); - rule.setAttribute("mathbackground", color); - rule.setAttribute("width", width + "em"); - rule.setAttribute("height", height + "em"); - var wrapper = new mathMLTree.MathNode("mpadded", [rule]); - - if (shift >= 0) { - wrapper.setAttribute("height", "+" + shift + "em"); - } else { - wrapper.setAttribute("height", shift + "em"); - wrapper.setAttribute("depth", "+" + -shift + "em"); - } - - wrapper.setAttribute("voffset", shift + "em"); - return wrapper; - } -}); -// CONCATENATED MODULE: ./src/functions/sizing.js - - - - - -function sizingGroup(value, options, baseOptions) { - var inner = buildHTML_buildExpression(value, options, false); - var multiplier = options.sizeMultiplier / baseOptions.sizeMultiplier; // Add size-resetting classes to the inner list and set maxFontSize - // manually. Handle nested size changes. - - for (var i = 0; i < inner.length; i++) { - var pos = inner[i].classes.indexOf("sizing"); - - if (pos < 0) { - Array.prototype.push.apply(inner[i].classes, options.sizingClasses(baseOptions)); - } else if (inner[i].classes[pos + 1] === "reset-size" + options.size) { - // This is a nested size change: e.g., inner[i] is the "b" in - // `\Huge a \small b`. Override the old size (the `reset-` class) - // but not the new size. - inner[i].classes[pos + 1] = "reset-size" + baseOptions.size; - } - - inner[i].height *= multiplier; - inner[i].depth *= multiplier; - } - - return buildCommon.makeFragment(inner); -} -var sizeFuncs = ["\\tiny", "\\sixptsize", "\\scriptsize", "\\footnotesize", "\\small", "\\normalsize", "\\large", "\\Large", "\\LARGE", "\\huge", "\\Huge"]; -var sizing_htmlBuilder = function htmlBuilder(group, options) { - // Handle sizing operators like \Huge. Real TeX doesn't actually allow - // these functions inside of math expressions, so we do some special - // handling. - var newOptions = options.havingSize(group.size); - return sizingGroup(group.body, newOptions, options); -}; -defineFunction({ - type: "sizing", - names: sizeFuncs, - props: { - numArgs: 0, - allowedInText: true - }, - handler: function handler(_ref, args) { - var breakOnTokenText = _ref.breakOnTokenText, - funcName = _ref.funcName, - parser = _ref.parser; - var body = parser.parseExpression(false, breakOnTokenText); - return { - type: "sizing", - mode: parser.mode, - // Figure out what size to use based on the list of functions above - size: sizeFuncs.indexOf(funcName) + 1, - body: body - }; - }, - htmlBuilder: sizing_htmlBuilder, - mathmlBuilder: function mathmlBuilder(group, options) { - var newOptions = options.havingSize(group.size); - var inner = buildMathML_buildExpression(group.body, newOptions); - var node = new mathMLTree.MathNode("mstyle", inner); // TODO(emily): This doesn't produce the correct size for nested size - // changes, because we don't keep state of what style we're currently - // in, so we can't reset the size to normal before changing it. Now - // that we're passing an options parameter we should be able to fix - // this. - - node.setAttribute("mathsize", newOptions.sizeMultiplier + "em"); - return node; - } -}); -// CONCATENATED MODULE: ./src/functions/smash.js -// smash, with optional [tb], as in AMS - - - - - - -defineFunction({ - type: "smash", - names: ["\\smash"], - props: { - numArgs: 1, - numOptionalArgs: 1, - allowedInText: true - }, - handler: function handler(_ref, args, optArgs) { - var parser = _ref.parser; - var smashHeight = false; - var smashDepth = false; - var tbArg = optArgs[0] && assertNodeType(optArgs[0], "ordgroup"); - - if (tbArg) { - // Optional [tb] argument is engaged. - // ref: amsmath: \renewcommand{\smash}[1][tb]{% - // def\mb@t{\ht}\def\mb@b{\dp}\def\mb@tb{\ht\z@\z@\dp}% - var letter = ""; - - for (var i = 0; i < tbArg.body.length; ++i) { - var node = tbArg.body[i]; // $FlowFixMe: Not every node type has a `text` property. - - letter = node.text; - - if (letter === "t") { - smashHeight = true; - } else if (letter === "b") { - smashDepth = true; - } else { - smashHeight = false; - smashDepth = false; - break; - } - } - } else { - smashHeight = true; - smashDepth = true; - } - - var body = args[0]; - return { - type: "smash", - mode: parser.mode, - body: body, - smashHeight: smashHeight, - smashDepth: smashDepth - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - var node = buildCommon.makeSpan([], [buildHTML_buildGroup(group.body, options)]); - - if (!group.smashHeight && !group.smashDepth) { - return node; - } - - if (group.smashHeight) { - node.height = 0; // In order to influence makeVList, we have to reset the children. - - if (node.children) { - for (var i = 0; i < node.children.length; i++) { - node.children[i].height = 0; - } - } - } - - if (group.smashDepth) { - node.depth = 0; - - if (node.children) { - for (var _i = 0; _i < node.children.length; _i++) { - node.children[_i].depth = 0; - } - } - } // At this point, we've reset the TeX-like height and depth values. - // But the span still has an HTML line height. - // makeVList applies "display: table-cell", which prevents the browser - // from acting on that line height. So we'll call makeVList now. - - - var smashedNode = buildCommon.makeVList({ - positionType: "firstBaseline", - children: [{ - type: "elem", - elem: node - }] - }, options); // For spacing, TeX treats \hphantom as a math group (same spacing as ord). - - return buildCommon.makeSpan(["mord"], [smashedNode], options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var node = new mathMLTree.MathNode("mpadded", [buildMathML_buildGroup(group.body, options)]); - - if (group.smashHeight) { - node.setAttribute("height", "0px"); - } - - if (group.smashDepth) { - node.setAttribute("depth", "0px"); - } - - return node; - } -}); -// CONCATENATED MODULE: ./src/functions/sqrt.js - - - - - - - -defineFunction({ - type: "sqrt", - names: ["\\sqrt"], - props: { - numArgs: 1, - numOptionalArgs: 1 - }, - handler: function handler(_ref, args, optArgs) { - var parser = _ref.parser; - var index = optArgs[0]; - var body = args[0]; - return { - type: "sqrt", - mode: parser.mode, - body: body, - index: index - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - // Square roots are handled in the TeXbook pg. 443, Rule 11. - // First, we do the same steps as in overline to build the inner group - // and line - var inner = buildHTML_buildGroup(group.body, options.havingCrampedStyle()); - - if (inner.height === 0) { - // Render a small surd. - inner.height = options.fontMetrics().xHeight; - } // Some groups can return document fragments. Handle those by wrapping - // them in a span. - - - inner = buildCommon.wrapFragment(inner, options); // Calculate the minimum size for the \surd delimiter - - var metrics = options.fontMetrics(); - var theta = metrics.defaultRuleThickness; - var phi = theta; - - if (options.style.id < src_Style.TEXT.id) { - phi = options.fontMetrics().xHeight; - } // Calculate the clearance between the body and line - - - var lineClearance = theta + phi / 4; - var minDelimiterHeight = inner.height + inner.depth + lineClearance + theta; // Create a sqrt SVG of the required minimum size - - var _delimiter$sqrtImage = delimiter.sqrtImage(minDelimiterHeight, options), - img = _delimiter$sqrtImage.span, - ruleWidth = _delimiter$sqrtImage.ruleWidth, - advanceWidth = _delimiter$sqrtImage.advanceWidth; - - var delimDepth = img.height - ruleWidth; // Adjust the clearance based on the delimiter size - - if (delimDepth > inner.height + inner.depth + lineClearance) { - lineClearance = (lineClearance + delimDepth - inner.height - inner.depth) / 2; - } // Shift the sqrt image - - - var imgShift = img.height - inner.height - lineClearance - ruleWidth; - inner.style.paddingLeft = advanceWidth + "em"; // Overlay the image and the argument. - - var body = buildCommon.makeVList({ - positionType: "firstBaseline", - children: [{ - type: "elem", - elem: inner, - wrapperClasses: ["svg-align"] - }, { - type: "kern", - size: -(inner.height + imgShift) - }, { - type: "elem", - elem: img - }, { - type: "kern", - size: ruleWidth - }] - }, options); - - if (!group.index) { - return buildCommon.makeSpan(["mord", "sqrt"], [body], options); - } else { - // Handle the optional root index - // The index is always in scriptscript style - var newOptions = options.havingStyle(src_Style.SCRIPTSCRIPT); - var rootm = buildHTML_buildGroup(group.index, newOptions, options); // The amount the index is shifted by. This is taken from the TeX - // source, in the definition of `\r@@t`. - - var toShift = 0.6 * (body.height - body.depth); // Build a VList with the superscript shifted up correctly - - var rootVList = buildCommon.makeVList({ - positionType: "shift", - positionData: -toShift, - children: [{ - type: "elem", - elem: rootm - }] - }, options); // Add a class surrounding it so we can add on the appropriate - // kerning - - var rootVListWrap = buildCommon.makeSpan(["root"], [rootVList]); - return buildCommon.makeSpan(["mord", "sqrt"], [rootVListWrap, body], options); - } - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var body = group.body, - index = group.index; - return index ? new mathMLTree.MathNode("mroot", [buildMathML_buildGroup(body, options), buildMathML_buildGroup(index, options)]) : new mathMLTree.MathNode("msqrt", [buildMathML_buildGroup(body, options)]); - } -}); -// CONCATENATED MODULE: ./src/functions/styling.js - - - - - -var styling_styleMap = { - "display": src_Style.DISPLAY, - "text": src_Style.TEXT, - "script": src_Style.SCRIPT, - "scriptscript": src_Style.SCRIPTSCRIPT -}; -defineFunction({ - type: "styling", - names: ["\\displaystyle", "\\textstyle", "\\scriptstyle", "\\scriptscriptstyle"], - props: { - numArgs: 0, - allowedInText: true - }, - handler: function handler(_ref, args) { - var breakOnTokenText = _ref.breakOnTokenText, - funcName = _ref.funcName, - parser = _ref.parser; - // parse out the implicit body - var body = parser.parseExpression(true, breakOnTokenText); // TODO: Refactor to avoid duplicating styleMap in multiple places (e.g. - // here and in buildHTML and de-dupe the enumeration of all the styles). - // $FlowFixMe: The names above exactly match the styles. - - var style = funcName.slice(1, funcName.length - 5); - return { - type: "styling", - mode: parser.mode, - // Figure out what style to use by pulling out the style from - // the function name - style: style, - body: body - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - // Style changes are handled in the TeXbook on pg. 442, Rule 3. - var newStyle = styling_styleMap[group.style]; - var newOptions = options.havingStyle(newStyle).withFont(''); - return sizingGroup(group.body, newOptions, options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - // Figure out what style we're changing to. - var newStyle = styling_styleMap[group.style]; - var newOptions = options.havingStyle(newStyle); - var inner = buildMathML_buildExpression(group.body, newOptions); - var node = new mathMLTree.MathNode("mstyle", inner); - var styleAttributes = { - "display": ["0", "true"], - "text": ["0", "false"], - "script": ["1", "false"], - "scriptscript": ["2", "false"] - }; - var attr = styleAttributes[group.style]; - node.setAttribute("scriptlevel", attr[0]); - node.setAttribute("displaystyle", attr[1]); - return node; - } -}); -// CONCATENATED MODULE: ./src/functions/supsub.js - - - - - - - - - - - - - -/** - * Sometimes, groups perform special rules when they have superscripts or - * subscripts attached to them. This function lets the `supsub` group know that - * Sometimes, groups perform special rules when they have superscripts or - * its inner element should handle the superscripts and subscripts instead of - * handling them itself. - */ -var supsub_htmlBuilderDelegate = function htmlBuilderDelegate(group, options) { - var base = group.base; - - if (!base) { - return null; - } else if (base.type === "op") { - // Operators handle supsubs differently when they have limits - // (e.g. `\displaystyle\sum_2^3`) - var delegate = base.limits && (options.style.size === src_Style.DISPLAY.size || base.alwaysHandleSupSub); - return delegate ? op_htmlBuilder : null; - } else if (base.type === "operatorname") { - var _delegate = base.alwaysHandleSupSub && (options.style.size === src_Style.DISPLAY.size || base.limits); - - return _delegate ? operatorname_htmlBuilder : null; - } else if (base.type === "accent") { - return utils.isCharacterBox(base.base) ? accent_htmlBuilder : null; - } else if (base.type === "horizBrace") { - var isSup = !group.sub; - return isSup === base.isOver ? horizBrace_htmlBuilder : null; - } else { - return null; - } -}; // Super scripts and subscripts, whose precise placement can depend on other -// functions that precede them. - - -defineFunctionBuilders({ - type: "supsub", - htmlBuilder: function htmlBuilder(group, options) { - // Superscript and subscripts are handled in the TeXbook on page - // 445-446, rules 18(a-f). - // Here is where we defer to the inner group if it should handle - // superscripts and subscripts itself. - var builderDelegate = supsub_htmlBuilderDelegate(group, options); - - if (builderDelegate) { - return builderDelegate(group, options); - } - - var valueBase = group.base, - valueSup = group.sup, - valueSub = group.sub; - var base = buildHTML_buildGroup(valueBase, options); - var supm; - var subm; - var metrics = options.fontMetrics(); // Rule 18a - - var supShift = 0; - var subShift = 0; - var isCharacterBox = valueBase && utils.isCharacterBox(valueBase); - - if (valueSup) { - var newOptions = options.havingStyle(options.style.sup()); - supm = buildHTML_buildGroup(valueSup, newOptions, options); - - if (!isCharacterBox) { - supShift = base.height - newOptions.fontMetrics().supDrop * newOptions.sizeMultiplier / options.sizeMultiplier; - } - } - - if (valueSub) { - var _newOptions = options.havingStyle(options.style.sub()); - - subm = buildHTML_buildGroup(valueSub, _newOptions, options); - - if (!isCharacterBox) { - subShift = base.depth + _newOptions.fontMetrics().subDrop * _newOptions.sizeMultiplier / options.sizeMultiplier; - } - } // Rule 18c - - - var minSupShift; - - if (options.style === src_Style.DISPLAY) { - minSupShift = metrics.sup1; - } else if (options.style.cramped) { - minSupShift = metrics.sup3; - } else { - minSupShift = metrics.sup2; - } // scriptspace is a font-size-independent size, so scale it - // appropriately for use as the marginRight. - - - var multiplier = options.sizeMultiplier; - var marginRight = 0.5 / metrics.ptPerEm / multiplier + "em"; - var marginLeft = null; - - if (subm) { - // Subscripts shouldn't be shifted by the base's italic correction. - // Account for that by shifting the subscript back the appropriate - // amount. Note we only do this when the base is a single symbol. - var isOiint = group.base && group.base.type === "op" && group.base.name && (group.base.name === "\\oiint" || group.base.name === "\\oiiint"); - - if (base instanceof domTree_SymbolNode || isOiint) { - // $FlowFixMe - marginLeft = -base.italic + "em"; - } - } - - var supsub; - - if (supm && subm) { - supShift = Math.max(supShift, minSupShift, supm.depth + 0.25 * metrics.xHeight); - subShift = Math.max(subShift, metrics.sub2); - var ruleWidth = metrics.defaultRuleThickness; // Rule 18e - - var maxWidth = 4 * ruleWidth; - - if (supShift - supm.depth - (subm.height - subShift) < maxWidth) { - subShift = maxWidth - (supShift - supm.depth) + subm.height; - var psi = 0.8 * metrics.xHeight - (supShift - supm.depth); - - if (psi > 0) { - supShift += psi; - subShift -= psi; - } - } - - var vlistElem = [{ - type: "elem", - elem: subm, - shift: subShift, - marginRight: marginRight, - marginLeft: marginLeft - }, { - type: "elem", - elem: supm, - shift: -supShift, - marginRight: marginRight - }]; - supsub = buildCommon.makeVList({ - positionType: "individualShift", - children: vlistElem - }, options); - } else if (subm) { - // Rule 18b - subShift = Math.max(subShift, metrics.sub1, subm.height - 0.8 * metrics.xHeight); - var _vlistElem = [{ - type: "elem", - elem: subm, - marginLeft: marginLeft, - marginRight: marginRight - }]; - supsub = buildCommon.makeVList({ - positionType: "shift", - positionData: subShift, - children: _vlistElem - }, options); - } else if (supm) { - // Rule 18c, d - supShift = Math.max(supShift, minSupShift, supm.depth + 0.25 * metrics.xHeight); - supsub = buildCommon.makeVList({ - positionType: "shift", - positionData: -supShift, - children: [{ - type: "elem", - elem: supm, - marginRight: marginRight - }] - }, options); - } else { - throw new Error("supsub must have either sup or sub."); - } // Wrap the supsub vlist in a span.msupsub to reset text-align. - - - var mclass = getTypeOfDomTree(base, "right") || "mord"; - return buildCommon.makeSpan([mclass], [base, buildCommon.makeSpan(["msupsub"], [supsub])], options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - // Is the inner group a relevant horizonal brace? - var isBrace = false; - var isOver; - var isSup; - - if (group.base && group.base.type === "horizBrace") { - isSup = !!group.sup; - - if (isSup === group.base.isOver) { - isBrace = true; - isOver = group.base.isOver; - } - } - - if (group.base && (group.base.type === "op" || group.base.type === "operatorname")) { - group.base.parentIsSupSub = true; - } - - var children = [buildMathML_buildGroup(group.base, options)]; - - if (group.sub) { - children.push(buildMathML_buildGroup(group.sub, options)); - } - - if (group.sup) { - children.push(buildMathML_buildGroup(group.sup, options)); - } - - var nodeType; - - if (isBrace) { - nodeType = isOver ? "mover" : "munder"; - } else if (!group.sub) { - var base = group.base; - - if (base && base.type === "op" && base.limits && (options.style === src_Style.DISPLAY || base.alwaysHandleSupSub)) { - nodeType = "mover"; - } else if (base && base.type === "operatorname" && base.alwaysHandleSupSub && (base.limits || options.style === src_Style.DISPLAY)) { - nodeType = "mover"; - } else { - nodeType = "msup"; - } - } else if (!group.sup) { - var _base = group.base; - - if (_base && _base.type === "op" && _base.limits && (options.style === src_Style.DISPLAY || _base.alwaysHandleSupSub)) { - nodeType = "munder"; - } else if (_base && _base.type === "operatorname" && _base.alwaysHandleSupSub && (_base.limits || options.style === src_Style.DISPLAY)) { - nodeType = "munder"; - } else { - nodeType = "msub"; - } - } else { - var _base2 = group.base; - - if (_base2 && _base2.type === "op" && _base2.limits && options.style === src_Style.DISPLAY) { - nodeType = "munderover"; - } else if (_base2 && _base2.type === "operatorname" && _base2.alwaysHandleSupSub && (options.style === src_Style.DISPLAY || _base2.limits)) { - nodeType = "munderover"; - } else { - nodeType = "msubsup"; - } - } - - var node = new mathMLTree.MathNode(nodeType, children); - return node; - } -}); -// CONCATENATED MODULE: ./src/functions/symbolsOp.js - - - - // Operator ParseNodes created in Parser.js from symbol Groups in src/symbols.js. - -defineFunctionBuilders({ - type: "atom", - htmlBuilder: function htmlBuilder(group, options) { - return buildCommon.mathsym(group.text, group.mode, options, ["m" + group.family]); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var node = new mathMLTree.MathNode("mo", [buildMathML_makeText(group.text, group.mode)]); - - if (group.family === "bin") { - var variant = buildMathML_getVariant(group, options); - - if (variant === "bold-italic") { - node.setAttribute("mathvariant", variant); - } - } else if (group.family === "punct") { - node.setAttribute("separator", "true"); - } else if (group.family === "open" || group.family === "close") { - // Delims built here should not stretch vertically. - // See delimsizing.js for stretchy delims. - node.setAttribute("stretchy", "false"); - } - - return node; - } -}); -// CONCATENATED MODULE: ./src/functions/symbolsOrd.js - - - - -// "mathord" and "textord" ParseNodes created in Parser.js from symbol Groups in -var defaultVariant = { - "mi": "italic", - "mn": "normal", - "mtext": "normal" -}; -defineFunctionBuilders({ - type: "mathord", - htmlBuilder: function htmlBuilder(group, options) { - return buildCommon.makeOrd(group, options, "mathord"); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var node = new mathMLTree.MathNode("mi", [buildMathML_makeText(group.text, group.mode, options)]); - var variant = buildMathML_getVariant(group, options) || "italic"; - - if (variant !== defaultVariant[node.type]) { - node.setAttribute("mathvariant", variant); - } - - return node; - } -}); -defineFunctionBuilders({ - type: "textord", - htmlBuilder: function htmlBuilder(group, options) { - return buildCommon.makeOrd(group, options, "textord"); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var text = buildMathML_makeText(group.text, group.mode, options); - var variant = buildMathML_getVariant(group, options) || "normal"; - var node; - - if (group.mode === 'text') { - node = new mathMLTree.MathNode("mtext", [text]); - } else if (/[0-9]/.test(group.text)) { - // TODO(kevinb) merge adjacent nodes - // do it as a post processing step - node = new mathMLTree.MathNode("mn", [text]); - } else if (group.text === "\\prime") { - node = new mathMLTree.MathNode("mo", [text]); - } else { - node = new mathMLTree.MathNode("mi", [text]); - } - - if (variant !== defaultVariant[node.type]) { - node.setAttribute("mathvariant", variant); - } - - return node; - } -}); -// CONCATENATED MODULE: ./src/functions/symbolsSpacing.js - - - - // A map of CSS-based spacing functions to their CSS class. - -var cssSpace = { - "\\nobreak": "nobreak", - "\\allowbreak": "allowbreak" -}; // A lookup table to determine whether a spacing function/symbol should be -// treated like a regular space character. If a symbol or command is a key -// in this table, then it should be a regular space character. Furthermore, -// the associated value may have a `className` specifying an extra CSS class -// to add to the created `span`. - -var regularSpace = { - " ": {}, - "\\ ": {}, - "~": { - className: "nobreak" - }, - "\\space": {}, - "\\nobreakspace": { - className: "nobreak" - } -}; // ParseNode<"spacing"> created in Parser.js from the "spacing" symbol Groups in -// src/symbols.js. - -defineFunctionBuilders({ - type: "spacing", - htmlBuilder: function htmlBuilder(group, options) { - if (regularSpace.hasOwnProperty(group.text)) { - var className = regularSpace[group.text].className || ""; // Spaces are generated by adding an actual space. Each of these - // things has an entry in the symbols table, so these will be turned - // into appropriate outputs. - - if (group.mode === "text") { - var ord = buildCommon.makeOrd(group, options, "textord"); - ord.classes.push(className); - return ord; - } else { - return buildCommon.makeSpan(["mspace", className], [buildCommon.mathsym(group.text, group.mode, options)], options); - } - } else if (cssSpace.hasOwnProperty(group.text)) { - // Spaces based on just a CSS class. - return buildCommon.makeSpan(["mspace", cssSpace[group.text]], [], options); - } else { - throw new src_ParseError("Unknown type of space \"" + group.text + "\""); - } - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var node; - - if (regularSpace.hasOwnProperty(group.text)) { - node = new mathMLTree.MathNode("mtext", [new mathMLTree.TextNode("\xA0")]); - } else if (cssSpace.hasOwnProperty(group.text)) { - // CSS-based MathML spaces (\nobreak, \allowbreak) are ignored - return new mathMLTree.MathNode("mspace"); - } else { - throw new src_ParseError("Unknown type of space \"" + group.text + "\""); - } - - return node; - } -}); -// CONCATENATED MODULE: ./src/functions/tag.js - - - - -var tag_pad = function pad() { - var padNode = new mathMLTree.MathNode("mtd", []); - padNode.setAttribute("width", "50%"); - return padNode; -}; - -defineFunctionBuilders({ - type: "tag", - mathmlBuilder: function mathmlBuilder(group, options) { - var table = new mathMLTree.MathNode("mtable", [new mathMLTree.MathNode("mtr", [tag_pad(), new mathMLTree.MathNode("mtd", [buildExpressionRow(group.body, options)]), tag_pad(), new mathMLTree.MathNode("mtd", [buildExpressionRow(group.tag, options)])])]); - table.setAttribute("width", "100%"); - return table; // TODO: Left-aligned tags. - // Currently, the group and options passed here do not contain - // enough info to set tag alignment. `leqno` is in Settings but it is - // not passed to Options. On the HTML side, leqno is - // set by a CSS class applied in buildTree.js. That would have worked - // in MathML if browsers supported . Since they don't, we - // need to rewrite the way this function is called. - } -}); -// CONCATENATED MODULE: ./src/functions/text.js - - - - // Non-mathy text, possibly in a font - -var textFontFamilies = { - "\\text": undefined, - "\\textrm": "textrm", - "\\textsf": "textsf", - "\\texttt": "texttt", - "\\textnormal": "textrm" -}; -var textFontWeights = { - "\\textbf": "textbf", - "\\textmd": "textmd" -}; -var textFontShapes = { - "\\textit": "textit", - "\\textup": "textup" -}; - -var optionsWithFont = function optionsWithFont(group, options) { - var font = group.font; // Checks if the argument is a font family or a font style. - - if (!font) { - return options; - } else if (textFontFamilies[font]) { - return options.withTextFontFamily(textFontFamilies[font]); - } else if (textFontWeights[font]) { - return options.withTextFontWeight(textFontWeights[font]); - } else { - return options.withTextFontShape(textFontShapes[font]); - } -}; - -defineFunction({ - type: "text", - names: [// Font families - "\\text", "\\textrm", "\\textsf", "\\texttt", "\\textnormal", // Font weights - "\\textbf", "\\textmd", // Font Shapes - "\\textit", "\\textup"], - props: { - numArgs: 1, - argTypes: ["text"], - greediness: 2, - allowedInText: true - }, - handler: function handler(_ref, args) { - var parser = _ref.parser, - funcName = _ref.funcName; - var body = args[0]; - return { - type: "text", - mode: parser.mode, - body: ordargument(body), - font: funcName - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - var newOptions = optionsWithFont(group, options); - var inner = buildHTML_buildExpression(group.body, newOptions, true); - return buildCommon.makeSpan(["mord", "text"], buildCommon.tryCombineChars(inner), newOptions); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var newOptions = optionsWithFont(group, options); - return buildExpressionRow(group.body, newOptions); - } -}); -// CONCATENATED MODULE: ./src/functions/underline.js - - - - - -defineFunction({ - type: "underline", - names: ["\\underline"], - props: { - numArgs: 1, - allowedInText: true - }, - handler: function handler(_ref, args) { - var parser = _ref.parser; - return { - type: "underline", - mode: parser.mode, - body: args[0] - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - // Underlines are handled in the TeXbook pg 443, Rule 10. - // Build the inner group. - var innerGroup = buildHTML_buildGroup(group.body, options); // Create the line to go below the body - - var line = buildCommon.makeLineSpan("underline-line", options); // Generate the vlist, with the appropriate kerns - - var defaultRuleThickness = options.fontMetrics().defaultRuleThickness; - var vlist = buildCommon.makeVList({ - positionType: "top", - positionData: innerGroup.height, - children: [{ - type: "kern", - size: defaultRuleThickness - }, { - type: "elem", - elem: line - }, { - type: "kern", - size: 3 * defaultRuleThickness - }, { - type: "elem", - elem: innerGroup - }] - }, options); - return buildCommon.makeSpan(["mord", "underline"], [vlist], options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var operator = new mathMLTree.MathNode("mo", [new mathMLTree.TextNode("\u203E")]); - operator.setAttribute("stretchy", "true"); - var node = new mathMLTree.MathNode("munder", [buildMathML_buildGroup(group.body, options), operator]); - node.setAttribute("accentunder", "true"); - return node; - } -}); -// CONCATENATED MODULE: ./src/functions/verb.js - - - - -defineFunction({ - type: "verb", - names: ["\\verb"], - props: { - numArgs: 0, - allowedInText: true - }, - handler: function handler(context, args, optArgs) { - // \verb and \verb* are dealt with directly in Parser.js. - // If we end up here, it's because of a failure to match the two delimiters - // in the regex in Lexer.js. LaTeX raises the following error when \verb is - // terminated by end of line (or file). - throw new src_ParseError("\\verb ended by end of line instead of matching delimiter"); - }, - htmlBuilder: function htmlBuilder(group, options) { - var text = makeVerb(group); - var body = []; // \verb enters text mode and therefore is sized like \textstyle - - var newOptions = options.havingStyle(options.style.text()); - - for (var i = 0; i < text.length; i++) { - var c = text[i]; - - if (c === '~') { - c = '\\textasciitilde'; - } - - body.push(buildCommon.makeSymbol(c, "Typewriter-Regular", group.mode, newOptions, ["mord", "texttt"])); - } - - return buildCommon.makeSpan(["mord", "text"].concat(newOptions.sizingClasses(options)), buildCommon.tryCombineChars(body), newOptions); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var text = new mathMLTree.TextNode(makeVerb(group)); - var node = new mathMLTree.MathNode("mtext", [text]); - node.setAttribute("mathvariant", "monospace"); - return node; - } -}); -/** - * Converts verb group into body string. - * - * \verb* replaces each space with an open box \u2423 - * \verb replaces each space with a no-break space \xA0 - */ - -var makeVerb = function makeVerb(group) { - return group.body.replace(/ /g, group.star ? "\u2423" : '\xA0'); -}; -// CONCATENATED MODULE: ./src/functions.js -/** Include this to ensure that all functions are defined. */ - -var functions = _functions; -/* harmony default export */ var src_functions = (functions); // TODO(kevinb): have functions return an object and call defineFunction with -// that object in this file instead of relying on side-effects. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// CONCATENATED MODULE: ./src/Lexer.js -/** - * The Lexer class handles tokenizing the input in various ways. Since our - * parser expects us to be able to backtrack, the lexer allows lexing from any - * given starting point. - * - * Its main exposed function is the `lex` function, which takes a position to - * lex from and a type of token to lex. It defers to the appropriate `_innerLex` - * function. - * - * The various `_innerLex` functions perform the actual lexing of different - * kinds. - */ - - - - -/* The following tokenRegex - * - matches typical whitespace (but not NBSP etc.) using its first group - * - does not match any control character \x00-\x1f except whitespace - * - does not match a bare backslash - * - matches any ASCII character except those just mentioned - * - does not match the BMP private use area \uE000-\uF8FF - * - does not match bare surrogate code units - * - matches any BMP character except for those just described - * - matches any valid Unicode surrogate pair - * - matches a backslash followed by one or more letters - * - matches a backslash followed by any BMP character, including newline - * Just because the Lexer matches something doesn't mean it's valid input: - * If there is no matching function or symbol definition, the Parser will - * still reject the input. - */ -var spaceRegexString = "[ \r\n\t]"; -var controlWordRegexString = "\\\\[a-zA-Z@]+"; -var controlSymbolRegexString = "\\\\[^\uD800-\uDFFF]"; -var controlWordWhitespaceRegexString = "" + controlWordRegexString + spaceRegexString + "*"; -var controlWordWhitespaceRegex = new RegExp("^(" + controlWordRegexString + ")" + spaceRegexString + "*$"); -var combiningDiacriticalMarkString = "[\u0300-\u036F]"; -var combiningDiacriticalMarksEndRegex = new RegExp(combiningDiacriticalMarkString + "+$"); -var tokenRegexString = "(" + spaceRegexString + "+)|" + // whitespace -"([!-\\[\\]-\u2027\u202A-\uD7FF\uF900-\uFFFF]" + ( // single codepoint -combiningDiacriticalMarkString + "*") + // ...plus accents -"|[\uD800-\uDBFF][\uDC00-\uDFFF]" + ( // surrogate pair -combiningDiacriticalMarkString + "*") + // ...plus accents -"|\\\\verb\\*([^]).*?\\3" + // \verb* -"|\\\\verb([^*a-zA-Z]).*?\\4" + // \verb unstarred -"|\\\\operatorname\\*" + ( // \operatorname* -"|" + controlWordWhitespaceRegexString) + ( // \macroName + spaces -"|" + controlSymbolRegexString + ")"); // \\, \', etc. - -/** Main Lexer class */ - -var Lexer_Lexer = -/*#__PURE__*/ -function () { - // category codes, only supports comment characters (14) for now - function Lexer(input, settings) { - this.input = void 0; - this.settings = void 0; - this.tokenRegex = void 0; - this.catcodes = void 0; - // Separate accents from characters - this.input = input; - this.settings = settings; - this.tokenRegex = new RegExp(tokenRegexString, 'g'); - this.catcodes = { - "%": 14 // comment character - - }; - } - - var _proto = Lexer.prototype; - - _proto.setCatcode = function setCatcode(char, code) { - this.catcodes[char] = code; - } - /** - * This function lexes a single token. - */ - ; - - _proto.lex = function lex() { - var input = this.input; - var pos = this.tokenRegex.lastIndex; - - if (pos === input.length) { - return new Token_Token("EOF", new SourceLocation(this, pos, pos)); - } - - var match = this.tokenRegex.exec(input); - - if (match === null || match.index !== pos) { - throw new src_ParseError("Unexpected character: '" + input[pos] + "'", new Token_Token(input[pos], new SourceLocation(this, pos, pos + 1))); - } - - var text = match[2] || " "; - - if (this.catcodes[text] === 14) { - // comment character - var nlIndex = input.indexOf('\n', this.tokenRegex.lastIndex); - - if (nlIndex === -1) { - this.tokenRegex.lastIndex = input.length; // EOF - - this.settings.reportNonstrict("commentAtEnd", "% comment has no terminating newline; LaTeX would " + "fail because of commenting the end of math mode (e.g. $)"); - } else { - this.tokenRegex.lastIndex = nlIndex + 1; - } - - return this.lex(); - } // Trim any trailing whitespace from control word match - - - var controlMatch = text.match(controlWordWhitespaceRegex); - - if (controlMatch) { - text = controlMatch[1]; - } - - return new Token_Token(text, new SourceLocation(this, pos, this.tokenRegex.lastIndex)); - }; - - return Lexer; -}(); - - -// CONCATENATED MODULE: ./src/Namespace.js -/** - * A `Namespace` refers to a space of nameable things like macros or lengths, - * which can be `set` either globally or local to a nested group, using an - * undo stack similar to how TeX implements this functionality. - * Performance-wise, `get` and local `set` take constant time, while global - * `set` takes time proportional to the depth of group nesting. - */ - - -var Namespace_Namespace = -/*#__PURE__*/ -function () { - /** - * Both arguments are optional. The first argument is an object of - * built-in mappings which never change. The second argument is an object - * of initial (global-level) mappings, which will constantly change - * according to any global/top-level `set`s done. - */ - function Namespace(builtins, globalMacros) { - if (builtins === void 0) { - builtins = {}; - } - - if (globalMacros === void 0) { - globalMacros = {}; - } - - this.current = void 0; - this.builtins = void 0; - this.undefStack = void 0; - this.current = globalMacros; - this.builtins = builtins; - this.undefStack = []; - } - /** - * Start a new nested group, affecting future local `set`s. - */ - - - var _proto = Namespace.prototype; - - _proto.beginGroup = function beginGroup() { - this.undefStack.push({}); - } - /** - * End current nested group, restoring values before the group began. - */ - ; - - _proto.endGroup = function endGroup() { - if (this.undefStack.length === 0) { - throw new src_ParseError("Unbalanced namespace destruction: attempt " + "to pop global namespace; please report this as a bug"); - } - - var undefs = this.undefStack.pop(); - - for (var undef in undefs) { - if (undefs.hasOwnProperty(undef)) { - if (undefs[undef] === undefined) { - delete this.current[undef]; - } else { - this.current[undef] = undefs[undef]; - } - } - } - } - /** - * Detect whether `name` has a definition. Equivalent to - * `get(name) != null`. - */ - ; - - _proto.has = function has(name) { - return this.current.hasOwnProperty(name) || this.builtins.hasOwnProperty(name); - } - /** - * Get the current value of a name, or `undefined` if there is no value. - * - * Note: Do not use `if (namespace.get(...))` to detect whether a macro - * is defined, as the definition may be the empty string which evaluates - * to `false` in JavaScript. Use `if (namespace.get(...) != null)` or - * `if (namespace.has(...))`. - */ - ; - - _proto.get = function get(name) { - if (this.current.hasOwnProperty(name)) { - return this.current[name]; - } else { - return this.builtins[name]; - } - } - /** - * Set the current value of a name, and optionally set it globally too. - * Local set() sets the current value and (when appropriate) adds an undo - * operation to the undo stack. Global set() may change the undo - * operation at every level, so takes time linear in their number. - */ - ; - - _proto.set = function set(name, value, global) { - if (global === void 0) { - global = false; - } - - if (global) { - // Global set is equivalent to setting in all groups. Simulate this - // by destroying any undos currently scheduled for this name, - // and adding an undo with the *new* value (in case it later gets - // locally reset within this environment). - for (var i = 0; i < this.undefStack.length; i++) { - delete this.undefStack[i][name]; - } - - if (this.undefStack.length > 0) { - this.undefStack[this.undefStack.length - 1][name] = value; - } - } else { - // Undo this set at end of this group (possibly to `undefined`), - // unless an undo is already in place, in which case that older - // value is the correct one. - var top = this.undefStack[this.undefStack.length - 1]; - - if (top && !top.hasOwnProperty(name)) { - top[name] = this.current[name]; - } - } - - this.current[name] = value; - }; - - return Namespace; -}(); - - -// CONCATENATED MODULE: ./src/macros.js -/** - * Predefined macros for KaTeX. - * This can be used to define some commands in terms of others. - */ - - - - - - -var builtinMacros = {}; -/* harmony default export */ var macros = (builtinMacros); // This function might one day accept an additional argument and do more things. - -function defineMacro(name, body) { - builtinMacros[name] = body; -} ////////////////////////////////////////////////////////////////////// -// macro tools - -defineMacro("\\noexpand", function (context) { - // The expansion is the token itself; but that token is interpreted - // as if its meaning were ‘\relax’ if it is a control sequence that - // would ordinarily be expanded by TeX’s expansion rules. - var t = context.popToken(); - - if (context.isExpandable(t.text)) { - t.noexpand = true; - t.treatAsRelax = true; - } - - return { - tokens: [t], - numArgs: 0 - }; -}); -defineMacro("\\expandafter", function (context) { - // TeX first reads the token that comes immediately after \expandafter, - // without expanding it; let’s call this token t. Then TeX reads the - // token that comes after t (and possibly more tokens, if that token - // has an argument), replacing it by its expansion. Finally TeX puts - // t back in front of that expansion. - var t = context.popToken(); - context.expandOnce(true); // expand only an expandable token - - return { - tokens: [t], - numArgs: 0 - }; -}); // LaTeX's \@firstoftwo{#1}{#2} expands to #1, skipping #2 -// TeX source: \long\def\@firstoftwo#1#2{#1} - -defineMacro("\\@firstoftwo", function (context) { - var args = context.consumeArgs(2); - return { - tokens: args[0], - numArgs: 0 - }; -}); // LaTeX's \@secondoftwo{#1}{#2} expands to #2, skipping #1 -// TeX source: \long\def\@secondoftwo#1#2{#2} - -defineMacro("\\@secondoftwo", function (context) { - var args = context.consumeArgs(2); - return { - tokens: args[1], - numArgs: 0 - }; -}); // LaTeX's \@ifnextchar{#1}{#2}{#3} looks ahead to the next (unexpanded) -// symbol that isn't a space, consuming any spaces but not consuming the -// first nonspace character. If that nonspace character matches #1, then -// the macro expands to #2; otherwise, it expands to #3. - -defineMacro("\\@ifnextchar", function (context) { - var args = context.consumeArgs(3); // symbol, if, else - - context.consumeSpaces(); - var nextToken = context.future(); - - if (args[0].length === 1 && args[0][0].text === nextToken.text) { - return { - tokens: args[1], - numArgs: 0 - }; - } else { - return { - tokens: args[2], - numArgs: 0 - }; - } -}); // LaTeX's \@ifstar{#1}{#2} looks ahead to the next (unexpanded) symbol. -// If it is `*`, then it consumes the symbol, and the macro expands to #1; -// otherwise, the macro expands to #2 (without consuming the symbol). -// TeX source: \def\@ifstar#1{\@ifnextchar *{\@firstoftwo{#1}}} - -defineMacro("\\@ifstar", "\\@ifnextchar *{\\@firstoftwo{#1}}"); // LaTeX's \TextOrMath{#1}{#2} expands to #1 in text mode, #2 in math mode - -defineMacro("\\TextOrMath", function (context) { - var args = context.consumeArgs(2); - - if (context.mode === 'text') { - return { - tokens: args[0], - numArgs: 0 - }; - } else { - return { - tokens: args[1], - numArgs: 0 - }; - } -}); // Lookup table for parsing numbers in base 8 through 16 - -var digitToNumber = { - "0": 0, - "1": 1, - "2": 2, - "3": 3, - "4": 4, - "5": 5, - "6": 6, - "7": 7, - "8": 8, - "9": 9, - "a": 10, - "A": 10, - "b": 11, - "B": 11, - "c": 12, - "C": 12, - "d": 13, - "D": 13, - "e": 14, - "E": 14, - "f": 15, - "F": 15 -}; // TeX \char makes a literal character (catcode 12) using the following forms: -// (see The TeXBook, p. 43) -// \char123 -- decimal -// \char'123 -- octal -// \char"123 -- hex -// \char`x -- character that can be written (i.e. isn't active) -// \char`\x -- character that cannot be written (e.g. %) -// These all refer to characters from the font, so we turn them into special -// calls to a function \@char dealt with in the Parser. - -defineMacro("\\char", function (context) { - var token = context.popToken(); - var base; - var number = ''; - - if (token.text === "'") { - base = 8; - token = context.popToken(); - } else if (token.text === '"') { - base = 16; - token = context.popToken(); - } else if (token.text === "`") { - token = context.popToken(); - - if (token.text[0] === "\\") { - number = token.text.charCodeAt(1); - } else if (token.text === "EOF") { - throw new src_ParseError("\\char` missing argument"); - } else { - number = token.text.charCodeAt(0); - } - } else { - base = 10; - } - - if (base) { - // Parse a number in the given base, starting with first `token`. - number = digitToNumber[token.text]; - - if (number == null || number >= base) { - throw new src_ParseError("Invalid base-" + base + " digit " + token.text); - } - - var digit; - - while ((digit = digitToNumber[context.future().text]) != null && digit < base) { - number *= base; - number += digit; - context.popToken(); - } - } - - return "\\@char{" + number + "}"; -}); // \newcommand{\macro}[args]{definition} -// \renewcommand{\macro}[args]{definition} -// TODO: Optional arguments: \newcommand{\macro}[args][default]{definition} - -var macros_newcommand = function newcommand(context, existsOK, nonexistsOK) { - var arg = context.consumeArgs(1)[0]; - - if (arg.length !== 1) { - throw new src_ParseError("\\newcommand's first argument must be a macro name"); - } - - var name = arg[0].text; - var exists = context.isDefined(name); - - if (exists && !existsOK) { - throw new src_ParseError("\\newcommand{" + name + "} attempting to redefine " + (name + "; use \\renewcommand")); - } - - if (!exists && !nonexistsOK) { - throw new src_ParseError("\\renewcommand{" + name + "} when command " + name + " " + "does not yet exist; use \\newcommand"); - } - - var numArgs = 0; - arg = context.consumeArgs(1)[0]; - - if (arg.length === 1 && arg[0].text === "[") { - var argText = ''; - var token = context.expandNextToken(); - - while (token.text !== "]" && token.text !== "EOF") { - // TODO: Should properly expand arg, e.g., ignore {}s - argText += token.text; - token = context.expandNextToken(); - } - - if (!argText.match(/^\s*[0-9]+\s*$/)) { - throw new src_ParseError("Invalid number of arguments: " + argText); - } - - numArgs = parseInt(argText); - arg = context.consumeArgs(1)[0]; - } // Final arg is the expansion of the macro - - - context.macros.set(name, { - tokens: arg, - numArgs: numArgs - }); - return ''; -}; - -defineMacro("\\newcommand", function (context) { - return macros_newcommand(context, false, true); -}); -defineMacro("\\renewcommand", function (context) { - return macros_newcommand(context, true, false); -}); -defineMacro("\\providecommand", function (context) { - return macros_newcommand(context, true, true); -}); // terminal (console) tools - -defineMacro("\\message", function (context) { - var arg = context.consumeArgs(1)[0]; // eslint-disable-next-line no-console - - console.log(arg.reverse().map(function (token) { - return token.text; - }).join("")); - return ''; -}); -defineMacro("\\errmessage", function (context) { - var arg = context.consumeArgs(1)[0]; // eslint-disable-next-line no-console - - console.error(arg.reverse().map(function (token) { - return token.text; - }).join("")); - return ''; -}); -defineMacro("\\show", function (context) { - var tok = context.popToken(); - var name = tok.text; // eslint-disable-next-line no-console - - console.log(tok, context.macros.get(name), src_functions[name], src_symbols.math[name], src_symbols.text[name]); - return ''; -}); ////////////////////////////////////////////////////////////////////// -// Grouping -// \let\bgroup={ \let\egroup=} - -defineMacro("\\bgroup", "{"); -defineMacro("\\egroup", "}"); // Symbols from latex.ltx: -// \def\lq{`} -// \def\rq{'} -// \def \aa {\r a} -// \def \AA {\r A} - -defineMacro("\\lq", "`"); -defineMacro("\\rq", "'"); -defineMacro("\\aa", "\\r a"); -defineMacro("\\AA", "\\r A"); // Copyright (C) and registered (R) symbols. Use raw symbol in MathML. -// \DeclareTextCommandDefault{\textcopyright}{\textcircled{c}} -// \DeclareTextCommandDefault{\textregistered}{\textcircled{% -// \check@mathfonts\fontsize\sf@size\z@\math@fontsfalse\selectfont R}} -// \DeclareRobustCommand{\copyright}{% -// \ifmmode{\nfss@text{\textcopyright}}\else\textcopyright\fi} - -defineMacro("\\textcopyright", "\\html@mathml{\\textcircled{c}}{\\char`©}"); -defineMacro("\\copyright", "\\TextOrMath{\\textcopyright}{\\text{\\textcopyright}}"); -defineMacro("\\textregistered", "\\html@mathml{\\textcircled{\\scriptsize R}}{\\char`®}"); // Characters omitted from Unicode range 1D400–1D7FF - -defineMacro("\u212C", "\\mathscr{B}"); // script - -defineMacro("\u2130", "\\mathscr{E}"); -defineMacro("\u2131", "\\mathscr{F}"); -defineMacro("\u210B", "\\mathscr{H}"); -defineMacro("\u2110", "\\mathscr{I}"); -defineMacro("\u2112", "\\mathscr{L}"); -defineMacro("\u2133", "\\mathscr{M}"); -defineMacro("\u211B", "\\mathscr{R}"); -defineMacro("\u212D", "\\mathfrak{C}"); // Fraktur - -defineMacro("\u210C", "\\mathfrak{H}"); -defineMacro("\u2128", "\\mathfrak{Z}"); // Define \Bbbk with a macro that works in both HTML and MathML. - -defineMacro("\\Bbbk", "\\Bbb{k}"); // Unicode middle dot -// The KaTeX fonts do not contain U+00B7. Instead, \cdotp displays -// the dot at U+22C5 and gives it punct spacing. - -defineMacro("\xB7", "\\cdotp"); // \llap and \rlap render their contents in text mode - -defineMacro("\\llap", "\\mathllap{\\textrm{#1}}"); -defineMacro("\\rlap", "\\mathrlap{\\textrm{#1}}"); -defineMacro("\\clap", "\\mathclap{\\textrm{#1}}"); // \not is defined by base/fontmath.ltx via -// \DeclareMathSymbol{\not}{\mathrel}{symbols}{"36} -// It's thus treated like a \mathrel, but defined by a symbol that has zero -// width but extends to the right. We use \rlap to get that spacing. -// For MathML we write U+0338 here. buildMathML.js will then do the overlay. - -defineMacro("\\not", '\\html@mathml{\\mathrel{\\mathrlap\\@not}}{\\char"338}'); // Negated symbols from base/fontmath.ltx: -// \def\neq{\not=} \let\ne=\neq -// \DeclareRobustCommand -// \notin{\mathrel{\m@th\mathpalette\c@ncel\in}} -// \def\c@ncel#1#2{\m@th\ooalign{$\hfil#1\mkern1mu/\hfil$\crcr$#1#2$}} - -defineMacro("\\neq", "\\html@mathml{\\mathrel{\\not=}}{\\mathrel{\\char`≠}}"); -defineMacro("\\ne", "\\neq"); -defineMacro("\u2260", "\\neq"); -defineMacro("\\notin", "\\html@mathml{\\mathrel{{\\in}\\mathllap{/\\mskip1mu}}}" + "{\\mathrel{\\char`∉}}"); -defineMacro("\u2209", "\\notin"); // Unicode stacked relations - -defineMacro("\u2258", "\\html@mathml{" + "\\mathrel{=\\kern{-1em}\\raisebox{0.4em}{$\\scriptsize\\frown$}}" + "}{\\mathrel{\\char`\u2258}}"); -defineMacro("\u2259", "\\html@mathml{\\stackrel{\\tiny\\wedge}{=}}{\\mathrel{\\char`\u2258}}"); -defineMacro("\u225A", "\\html@mathml{\\stackrel{\\tiny\\vee}{=}}{\\mathrel{\\char`\u225A}}"); -defineMacro("\u225B", "\\html@mathml{\\stackrel{\\scriptsize\\star}{=}}" + "{\\mathrel{\\char`\u225B}}"); -defineMacro("\u225D", "\\html@mathml{\\stackrel{\\tiny\\mathrm{def}}{=}}" + "{\\mathrel{\\char`\u225D}}"); -defineMacro("\u225E", "\\html@mathml{\\stackrel{\\tiny\\mathrm{m}}{=}}" + "{\\mathrel{\\char`\u225E}}"); -defineMacro("\u225F", "\\html@mathml{\\stackrel{\\tiny?}{=}}{\\mathrel{\\char`\u225F}}"); // Misc Unicode - -defineMacro("\u27C2", "\\perp"); -defineMacro("\u203C", "\\mathclose{!\\mkern-0.8mu!}"); -defineMacro("\u220C", "\\notni"); -defineMacro("\u231C", "\\ulcorner"); -defineMacro("\u231D", "\\urcorner"); -defineMacro("\u231E", "\\llcorner"); -defineMacro("\u231F", "\\lrcorner"); -defineMacro("\xA9", "\\copyright"); -defineMacro("\xAE", "\\textregistered"); -defineMacro("\uFE0F", "\\textregistered"); // The KaTeX fonts have corners at codepoints that don't match Unicode. -// For MathML purposes, use the Unicode code point. - -defineMacro("\\ulcorner", "\\html@mathml{\\@ulcorner}{\\mathop{\\char\"231c}}"); -defineMacro("\\urcorner", "\\html@mathml{\\@urcorner}{\\mathop{\\char\"231d}}"); -defineMacro("\\llcorner", "\\html@mathml{\\@llcorner}{\\mathop{\\char\"231e}}"); -defineMacro("\\lrcorner", "\\html@mathml{\\@lrcorner}{\\mathop{\\char\"231f}}"); ////////////////////////////////////////////////////////////////////// -// LaTeX_2ε -// \vdots{\vbox{\baselineskip4\p@ \lineskiplimit\z@ -// \kern6\p@\hbox{.}\hbox{.}\hbox{.}}} -// We'll call \varvdots, which gets a glyph from symbols.js. -// The zero-width rule gets us an equivalent to the vertical 6pt kern. - -defineMacro("\\vdots", "\\mathord{\\varvdots\\rule{0pt}{15pt}}"); -defineMacro("\u22EE", "\\vdots"); ////////////////////////////////////////////////////////////////////// -// amsmath.sty -// http://mirrors.concertpass.com/tex-archive/macros/latex/required/amsmath/amsmath.pdf -// Italic Greek capital letters. AMS defines these with \DeclareMathSymbol, -// but they are equivalent to \mathit{\Letter}. - -defineMacro("\\varGamma", "\\mathit{\\Gamma}"); -defineMacro("\\varDelta", "\\mathit{\\Delta}"); -defineMacro("\\varTheta", "\\mathit{\\Theta}"); -defineMacro("\\varLambda", "\\mathit{\\Lambda}"); -defineMacro("\\varXi", "\\mathit{\\Xi}"); -defineMacro("\\varPi", "\\mathit{\\Pi}"); -defineMacro("\\varSigma", "\\mathit{\\Sigma}"); -defineMacro("\\varUpsilon", "\\mathit{\\Upsilon}"); -defineMacro("\\varPhi", "\\mathit{\\Phi}"); -defineMacro("\\varPsi", "\\mathit{\\Psi}"); -defineMacro("\\varOmega", "\\mathit{\\Omega}"); //\newcommand{\substack}[1]{\subarray{c}#1\endsubarray} - -defineMacro("\\substack", "\\begin{subarray}{c}#1\\end{subarray}"); // \renewcommand{\colon}{\nobreak\mskip2mu\mathpunct{}\nonscript -// \mkern-\thinmuskip{:}\mskip6muplus1mu\relax} - -defineMacro("\\colon", "\\nobreak\\mskip2mu\\mathpunct{}" + "\\mathchoice{\\mkern-3mu}{\\mkern-3mu}{}{}{:}\\mskip6mu"); // \newcommand{\boxed}[1]{\fbox{\m@th$\displaystyle#1$}} - -defineMacro("\\boxed", "\\fbox{$\\displaystyle{#1}$}"); // \def\iff{\DOTSB\;\Longleftrightarrow\;} -// \def\implies{\DOTSB\;\Longrightarrow\;} -// \def\impliedby{\DOTSB\;\Longleftarrow\;} - -defineMacro("\\iff", "\\DOTSB\\;\\Longleftrightarrow\\;"); -defineMacro("\\implies", "\\DOTSB\\;\\Longrightarrow\\;"); -defineMacro("\\impliedby", "\\DOTSB\\;\\Longleftarrow\\;"); // AMSMath's automatic \dots, based on \mdots@@ macro. - -var dotsByToken = { - ',': '\\dotsc', - '\\not': '\\dotsb', - // \keybin@ checks for the following: - '+': '\\dotsb', - '=': '\\dotsb', - '<': '\\dotsb', - '>': '\\dotsb', - '-': '\\dotsb', - '*': '\\dotsb', - ':': '\\dotsb', - // Symbols whose definition starts with \DOTSB: - '\\DOTSB': '\\dotsb', - '\\coprod': '\\dotsb', - '\\bigvee': '\\dotsb', - '\\bigwedge': '\\dotsb', - '\\biguplus': '\\dotsb', - '\\bigcap': '\\dotsb', - '\\bigcup': '\\dotsb', - '\\prod': '\\dotsb', - '\\sum': '\\dotsb', - '\\bigotimes': '\\dotsb', - '\\bigoplus': '\\dotsb', - '\\bigodot': '\\dotsb', - '\\bigsqcup': '\\dotsb', - '\\And': '\\dotsb', - '\\longrightarrow': '\\dotsb', - '\\Longrightarrow': '\\dotsb', - '\\longleftarrow': '\\dotsb', - '\\Longleftarrow': '\\dotsb', - '\\longleftrightarrow': '\\dotsb', - '\\Longleftrightarrow': '\\dotsb', - '\\mapsto': '\\dotsb', - '\\longmapsto': '\\dotsb', - '\\hookrightarrow': '\\dotsb', - '\\doteq': '\\dotsb', - // Symbols whose definition starts with \mathbin: - '\\mathbin': '\\dotsb', - // Symbols whose definition starts with \mathrel: - '\\mathrel': '\\dotsb', - '\\relbar': '\\dotsb', - '\\Relbar': '\\dotsb', - '\\xrightarrow': '\\dotsb', - '\\xleftarrow': '\\dotsb', - // Symbols whose definition starts with \DOTSI: - '\\DOTSI': '\\dotsi', - '\\int': '\\dotsi', - '\\oint': '\\dotsi', - '\\iint': '\\dotsi', - '\\iiint': '\\dotsi', - '\\iiiint': '\\dotsi', - '\\idotsint': '\\dotsi', - // Symbols whose definition starts with \DOTSX: - '\\DOTSX': '\\dotsx' -}; -defineMacro("\\dots", function (context) { - // TODO: If used in text mode, should expand to \textellipsis. - // However, in KaTeX, \textellipsis and \ldots behave the same - // (in text mode), and it's unlikely we'd see any of the math commands - // that affect the behavior of \dots when in text mode. So fine for now - // (until we support \ifmmode ... \else ... \fi). - var thedots = '\\dotso'; - var next = context.expandAfterFuture().text; - - if (next in dotsByToken) { - thedots = dotsByToken[next]; - } else if (next.substr(0, 4) === '\\not') { - thedots = '\\dotsb'; - } else if (next in src_symbols.math) { - if (utils.contains(['bin', 'rel'], src_symbols.math[next].group)) { - thedots = '\\dotsb'; - } - } - - return thedots; -}); -var spaceAfterDots = { - // \rightdelim@ checks for the following: - ')': true, - ']': true, - '\\rbrack': true, - '\\}': true, - '\\rbrace': true, - '\\rangle': true, - '\\rceil': true, - '\\rfloor': true, - '\\rgroup': true, - '\\rmoustache': true, - '\\right': true, - '\\bigr': true, - '\\biggr': true, - '\\Bigr': true, - '\\Biggr': true, - // \extra@ also tests for the following: - '$': true, - // \extrap@ checks for the following: - ';': true, - '.': true, - ',': true -}; -defineMacro("\\dotso", function (context) { - var next = context.future().text; - - if (next in spaceAfterDots) { - return "\\ldots\\,"; - } else { - return "\\ldots"; - } -}); -defineMacro("\\dotsc", function (context) { - var next = context.future().text; // \dotsc uses \extra@ but not \extrap@, instead specially checking for - // ';' and '.', but doesn't check for ','. - - if (next in spaceAfterDots && next !== ',') { - return "\\ldots\\,"; - } else { - return "\\ldots"; - } -}); -defineMacro("\\cdots", function (context) { - var next = context.future().text; - - if (next in spaceAfterDots) { - return "\\@cdots\\,"; - } else { - return "\\@cdots"; - } -}); -defineMacro("\\dotsb", "\\cdots"); -defineMacro("\\dotsm", "\\cdots"); -defineMacro("\\dotsi", "\\!\\cdots"); // amsmath doesn't actually define \dotsx, but \dots followed by a macro -// starting with \DOTSX implies \dotso, and then \extra@ detects this case -// and forces the added `\,`. - -defineMacro("\\dotsx", "\\ldots\\,"); // \let\DOTSI\relax -// \let\DOTSB\relax -// \let\DOTSX\relax - -defineMacro("\\DOTSI", "\\relax"); -defineMacro("\\DOTSB", "\\relax"); -defineMacro("\\DOTSX", "\\relax"); // Spacing, based on amsmath.sty's override of LaTeX defaults -// \DeclareRobustCommand{\tmspace}[3]{% -// \ifmmode\mskip#1#2\else\kern#1#3\fi\relax} - -defineMacro("\\tmspace", "\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax"); // \renewcommand{\,}{\tmspace+\thinmuskip{.1667em}} -// TODO: math mode should use \thinmuskip - -defineMacro("\\,", "\\tmspace+{3mu}{.1667em}"); // \let\thinspace\, - -defineMacro("\\thinspace", "\\,"); // \def\>{\mskip\medmuskip} -// \renewcommand{\:}{\tmspace+\medmuskip{.2222em}} -// TODO: \> and math mode of \: should use \medmuskip = 4mu plus 2mu minus 4mu - -defineMacro("\\>", "\\mskip{4mu}"); -defineMacro("\\:", "\\tmspace+{4mu}{.2222em}"); // \let\medspace\: - -defineMacro("\\medspace", "\\:"); // \renewcommand{\;}{\tmspace+\thickmuskip{.2777em}} -// TODO: math mode should use \thickmuskip = 5mu plus 5mu - -defineMacro("\\;", "\\tmspace+{5mu}{.2777em}"); // \let\thickspace\; - -defineMacro("\\thickspace", "\\;"); // \renewcommand{\!}{\tmspace-\thinmuskip{.1667em}} -// TODO: math mode should use \thinmuskip - -defineMacro("\\!", "\\tmspace-{3mu}{.1667em}"); // \let\negthinspace\! - -defineMacro("\\negthinspace", "\\!"); // \newcommand{\negmedspace}{\tmspace-\medmuskip{.2222em}} -// TODO: math mode should use \medmuskip - -defineMacro("\\negmedspace", "\\tmspace-{4mu}{.2222em}"); // \newcommand{\negthickspace}{\tmspace-\thickmuskip{.2777em}} -// TODO: math mode should use \thickmuskip - -defineMacro("\\negthickspace", "\\tmspace-{5mu}{.277em}"); // \def\enspace{\kern.5em } - -defineMacro("\\enspace", "\\kern.5em "); // \def\enskip{\hskip.5em\relax} - -defineMacro("\\enskip", "\\hskip.5em\\relax"); // \def\quad{\hskip1em\relax} - -defineMacro("\\quad", "\\hskip1em\\relax"); // \def\qquad{\hskip2em\relax} - -defineMacro("\\qquad", "\\hskip2em\\relax"); // \tag@in@display form of \tag - -defineMacro("\\tag", "\\@ifstar\\tag@literal\\tag@paren"); -defineMacro("\\tag@paren", "\\tag@literal{({#1})}"); -defineMacro("\\tag@literal", function (context) { - if (context.macros.get("\\df@tag")) { - throw new src_ParseError("Multiple \\tag"); - } - - return "\\gdef\\df@tag{\\text{#1}}"; -}); // \renewcommand{\bmod}{\nonscript\mskip-\medmuskip\mkern5mu\mathbin -// {\operator@font mod}\penalty900 -// \mkern5mu\nonscript\mskip-\medmuskip} -// \newcommand{\pod}[1]{\allowbreak -// \if@display\mkern18mu\else\mkern8mu\fi(#1)} -// \renewcommand{\pmod}[1]{\pod{{\operator@font mod}\mkern6mu#1}} -// \newcommand{\mod}[1]{\allowbreak\if@display\mkern18mu -// \else\mkern12mu\fi{\operator@font mod}\,\,#1} -// TODO: math mode should use \medmuskip = 4mu plus 2mu minus 4mu - -defineMacro("\\bmod", "\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}" + "\\mathbin{\\rm mod}" + "\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}"); -defineMacro("\\pod", "\\allowbreak" + "\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)"); -defineMacro("\\pmod", "\\pod{{\\rm mod}\\mkern6mu#1}"); -defineMacro("\\mod", "\\allowbreak" + "\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}" + "{\\rm mod}\\,\\,#1"); // \pmb -- A simulation of bold. -// The version in ambsy.sty works by typesetting three copies of the argument -// with small offsets. We use two copies. We omit the vertical offset because -// of rendering problems that makeVList encounters in Safari. - -defineMacro("\\pmb", "\\html@mathml{" + "\\@binrel{#1}{\\mathrlap{#1}\\kern0.5px#1}}" + "{\\mathbf{#1}}"); ////////////////////////////////////////////////////////////////////// -// LaTeX source2e -// \\ defaults to \newline, but changes to \cr within array environment - -defineMacro("\\\\", "\\newline"); // \def\TeX{T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX\@} -// TODO: Doesn't normally work in math mode because \@ fails. KaTeX doesn't -// support \@ yet, so that's omitted, and we add \text so that the result -// doesn't look funny in math mode. - -defineMacro("\\TeX", "\\textrm{\\html@mathml{" + "T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX" + "}{TeX}}"); // \DeclareRobustCommand{\LaTeX}{L\kern-.36em% -// {\sbox\z@ T% -// \vbox to\ht\z@{\hbox{\check@mathfonts -// \fontsize\sf@size\z@ -// \math@fontsfalse\selectfont -// A}% -// \vss}% -// }% -// \kern-.15em% -// \TeX} -// This code aligns the top of the A with the T (from the perspective of TeX's -// boxes, though visually the A appears to extend above slightly). -// We compute the corresponding \raisebox when A is rendered in \normalsize -// \scriptstyle, which has a scale factor of 0.7 (see Options.js). - -var latexRaiseA = fontMetricsData['Main-Regular']["T".charCodeAt(0)][1] - 0.7 * fontMetricsData['Main-Regular']["A".charCodeAt(0)][1] + "em"; -defineMacro("\\LaTeX", "\\textrm{\\html@mathml{" + ("L\\kern-.36em\\raisebox{" + latexRaiseA + "}{\\scriptstyle A}") + "\\kern-.15em\\TeX}{LaTeX}}"); // New KaTeX logo based on tweaking LaTeX logo - -defineMacro("\\KaTeX", "\\textrm{\\html@mathml{" + ("K\\kern-.17em\\raisebox{" + latexRaiseA + "}{\\scriptstyle A}") + "\\kern-.15em\\TeX}{KaTeX}}"); // \DeclareRobustCommand\hspace{\@ifstar\@hspacer\@hspace} -// \def\@hspace#1{\hskip #1\relax} -// \def\@hspacer#1{\vrule \@width\z@\nobreak -// \hskip #1\hskip \z@skip} - -defineMacro("\\hspace", "\\@ifstar\\@hspacer\\@hspace"); -defineMacro("\\@hspace", "\\hskip #1\\relax"); -defineMacro("\\@hspacer", "\\rule{0pt}{0pt}\\hskip #1\\relax"); ////////////////////////////////////////////////////////////////////// -// mathtools.sty -//\providecommand\ordinarycolon{:} - -defineMacro("\\ordinarycolon", ":"); //\def\vcentcolon{\mathrel{\mathop\ordinarycolon}} -//TODO(edemaine): Not yet centered. Fix via \raisebox or #726 - -defineMacro("\\vcentcolon", "\\mathrel{\\mathop\\ordinarycolon}"); // \providecommand*\dblcolon{\vcentcolon\mathrel{\mkern-.9mu}\vcentcolon} - -defineMacro("\\dblcolon", "\\html@mathml{" + "\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}" + "{\\mathop{\\char\"2237}}"); // \providecommand*\coloneqq{\vcentcolon\mathrel{\mkern-1.2mu}=} - -defineMacro("\\coloneqq", "\\html@mathml{" + "\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}" + "{\\mathop{\\char\"2254}}"); // ≔ -// \providecommand*\Coloneqq{\dblcolon\mathrel{\mkern-1.2mu}=} - -defineMacro("\\Coloneqq", "\\html@mathml{" + "\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}" + "{\\mathop{\\char\"2237\\char\"3d}}"); // \providecommand*\coloneq{\vcentcolon\mathrel{\mkern-1.2mu}\mathrel{-}} - -defineMacro("\\coloneq", "\\html@mathml{" + "\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}" + "{\\mathop{\\char\"3a\\char\"2212}}"); // \providecommand*\Coloneq{\dblcolon\mathrel{\mkern-1.2mu}\mathrel{-}} - -defineMacro("\\Coloneq", "\\html@mathml{" + "\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}" + "{\\mathop{\\char\"2237\\char\"2212}}"); // \providecommand*\eqqcolon{=\mathrel{\mkern-1.2mu}\vcentcolon} - -defineMacro("\\eqqcolon", "\\html@mathml{" + "\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}" + "{\\mathop{\\char\"2255}}"); // ≕ -// \providecommand*\Eqqcolon{=\mathrel{\mkern-1.2mu}\dblcolon} - -defineMacro("\\Eqqcolon", "\\html@mathml{" + "\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}" + "{\\mathop{\\char\"3d\\char\"2237}}"); // \providecommand*\eqcolon{\mathrel{-}\mathrel{\mkern-1.2mu}\vcentcolon} - -defineMacro("\\eqcolon", "\\html@mathml{" + "\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}" + "{\\mathop{\\char\"2239}}"); // \providecommand*\Eqcolon{\mathrel{-}\mathrel{\mkern-1.2mu}\dblcolon} - -defineMacro("\\Eqcolon", "\\html@mathml{" + "\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}" + "{\\mathop{\\char\"2212\\char\"2237}}"); // \providecommand*\colonapprox{\vcentcolon\mathrel{\mkern-1.2mu}\approx} - -defineMacro("\\colonapprox", "\\html@mathml{" + "\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}" + "{\\mathop{\\char\"3a\\char\"2248}}"); // \providecommand*\Colonapprox{\dblcolon\mathrel{\mkern-1.2mu}\approx} - -defineMacro("\\Colonapprox", "\\html@mathml{" + "\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}" + "{\\mathop{\\char\"2237\\char\"2248}}"); // \providecommand*\colonsim{\vcentcolon\mathrel{\mkern-1.2mu}\sim} - -defineMacro("\\colonsim", "\\html@mathml{" + "\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}" + "{\\mathop{\\char\"3a\\char\"223c}}"); // \providecommand*\Colonsim{\dblcolon\mathrel{\mkern-1.2mu}\sim} - -defineMacro("\\Colonsim", "\\html@mathml{" + "\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}" + "{\\mathop{\\char\"2237\\char\"223c}}"); // Some Unicode characters are implemented with macros to mathtools functions. - -defineMacro("\u2237", "\\dblcolon"); // :: - -defineMacro("\u2239", "\\eqcolon"); // -: - -defineMacro("\u2254", "\\coloneqq"); // := - -defineMacro("\u2255", "\\eqqcolon"); // =: - -defineMacro("\u2A74", "\\Coloneqq"); // ::= -////////////////////////////////////////////////////////////////////// -// colonequals.sty -// Alternate names for mathtools's macros: - -defineMacro("\\ratio", "\\vcentcolon"); -defineMacro("\\coloncolon", "\\dblcolon"); -defineMacro("\\colonequals", "\\coloneqq"); -defineMacro("\\coloncolonequals", "\\Coloneqq"); -defineMacro("\\equalscolon", "\\eqqcolon"); -defineMacro("\\equalscoloncolon", "\\Eqqcolon"); -defineMacro("\\colonminus", "\\coloneq"); -defineMacro("\\coloncolonminus", "\\Coloneq"); -defineMacro("\\minuscolon", "\\eqcolon"); -defineMacro("\\minuscoloncolon", "\\Eqcolon"); // \colonapprox name is same in mathtools and colonequals. - -defineMacro("\\coloncolonapprox", "\\Colonapprox"); // \colonsim name is same in mathtools and colonequals. - -defineMacro("\\coloncolonsim", "\\Colonsim"); // Additional macros, implemented by analogy with mathtools definitions: - -defineMacro("\\simcolon", "\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}"); -defineMacro("\\simcoloncolon", "\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}"); -defineMacro("\\approxcolon", "\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}"); -defineMacro("\\approxcoloncolon", "\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}"); // Present in newtxmath, pxfonts and txfonts - -defineMacro("\\notni", "\\html@mathml{\\not\\ni}{\\mathrel{\\char`\u220C}}"); -defineMacro("\\limsup", "\\DOTSB\\operatorname*{lim\\,sup}"); -defineMacro("\\liminf", "\\DOTSB\\operatorname*{lim\\,inf}"); ////////////////////////////////////////////////////////////////////// -// MathML alternates for KaTeX glyphs in the Unicode private area - -defineMacro("\\gvertneqq", "\\html@mathml{\\@gvertneqq}{\u2269}"); -defineMacro("\\lvertneqq", "\\html@mathml{\\@lvertneqq}{\u2268}"); -defineMacro("\\ngeqq", "\\html@mathml{\\@ngeqq}{\u2271}"); -defineMacro("\\ngeqslant", "\\html@mathml{\\@ngeqslant}{\u2271}"); -defineMacro("\\nleqq", "\\html@mathml{\\@nleqq}{\u2270}"); -defineMacro("\\nleqslant", "\\html@mathml{\\@nleqslant}{\u2270}"); -defineMacro("\\nshortmid", "\\html@mathml{\\@nshortmid}{∤}"); -defineMacro("\\nshortparallel", "\\html@mathml{\\@nshortparallel}{∦}"); -defineMacro("\\nsubseteqq", "\\html@mathml{\\@nsubseteqq}{\u2288}"); -defineMacro("\\nsupseteqq", "\\html@mathml{\\@nsupseteqq}{\u2289}"); -defineMacro("\\varsubsetneq", "\\html@mathml{\\@varsubsetneq}{⊊}"); -defineMacro("\\varsubsetneqq", "\\html@mathml{\\@varsubsetneqq}{⫋}"); -defineMacro("\\varsupsetneq", "\\html@mathml{\\@varsupsetneq}{⊋}"); -defineMacro("\\varsupsetneqq", "\\html@mathml{\\@varsupsetneqq}{⫌}"); -defineMacro("\\imath", "\\html@mathml{\\@imath}{\u0131}"); -defineMacro("\\jmath", "\\html@mathml{\\@jmath}{\u0237}"); ////////////////////////////////////////////////////////////////////// -// stmaryrd and semantic -// The stmaryrd and semantic packages render the next four items by calling a -// glyph. Those glyphs do not exist in the KaTeX fonts. Hence the macros. - -defineMacro("\\llbracket", "\\html@mathml{" + "\\mathopen{[\\mkern-3.2mu[}}" + "{\\mathopen{\\char`\u27E6}}"); -defineMacro("\\rrbracket", "\\html@mathml{" + "\\mathclose{]\\mkern-3.2mu]}}" + "{\\mathclose{\\char`\u27E7}}"); -defineMacro("\u27E6", "\\llbracket"); // blackboard bold [ - -defineMacro("\u27E7", "\\rrbracket"); // blackboard bold ] - -defineMacro("\\lBrace", "\\html@mathml{" + "\\mathopen{\\{\\mkern-3.2mu[}}" + "{\\mathopen{\\char`\u2983}}"); -defineMacro("\\rBrace", "\\html@mathml{" + "\\mathclose{]\\mkern-3.2mu\\}}}" + "{\\mathclose{\\char`\u2984}}"); -defineMacro("\u2983", "\\lBrace"); // blackboard bold { - -defineMacro("\u2984", "\\rBrace"); // blackboard bold } -// TODO: Create variable sized versions of the last two items. I believe that -// will require new font glyphs. -// The stmaryrd function `\minuso` provides a "Plimsoll" symbol that -// superimposes the characters \circ and \mathminus. Used in chemistry. - -defineMacro("\\minuso", "\\mathbin{\\html@mathml{" + "{\\mathrlap{\\mathchoice{\\kern{0.145em}}{\\kern{0.145em}}" + "{\\kern{0.1015em}}{\\kern{0.0725em}}\\circ}{-}}}" + "{\\char`⦵}}"); -defineMacro("⦵", "\\minuso"); ////////////////////////////////////////////////////////////////////// -// texvc.sty -// The texvc package contains macros available in mediawiki pages. -// We omit the functions deprecated at -// https://en.wikipedia.org/wiki/Help:Displaying_a_formula#Deprecated_syntax -// We also omit texvc's \O, which conflicts with \text{\O} - -defineMacro("\\darr", "\\downarrow"); -defineMacro("\\dArr", "\\Downarrow"); -defineMacro("\\Darr", "\\Downarrow"); -defineMacro("\\lang", "\\langle"); -defineMacro("\\rang", "\\rangle"); -defineMacro("\\uarr", "\\uparrow"); -defineMacro("\\uArr", "\\Uparrow"); -defineMacro("\\Uarr", "\\Uparrow"); -defineMacro("\\N", "\\mathbb{N}"); -defineMacro("\\R", "\\mathbb{R}"); -defineMacro("\\Z", "\\mathbb{Z}"); -defineMacro("\\alef", "\\aleph"); -defineMacro("\\alefsym", "\\aleph"); -defineMacro("\\Alpha", "\\mathrm{A}"); -defineMacro("\\Beta", "\\mathrm{B}"); -defineMacro("\\bull", "\\bullet"); -defineMacro("\\Chi", "\\mathrm{X}"); -defineMacro("\\clubs", "\\clubsuit"); -defineMacro("\\cnums", "\\mathbb{C}"); -defineMacro("\\Complex", "\\mathbb{C}"); -defineMacro("\\Dagger", "\\ddagger"); -defineMacro("\\diamonds", "\\diamondsuit"); -defineMacro("\\empty", "\\emptyset"); -defineMacro("\\Epsilon", "\\mathrm{E}"); -defineMacro("\\Eta", "\\mathrm{H}"); -defineMacro("\\exist", "\\exists"); -defineMacro("\\harr", "\\leftrightarrow"); -defineMacro("\\hArr", "\\Leftrightarrow"); -defineMacro("\\Harr", "\\Leftrightarrow"); -defineMacro("\\hearts", "\\heartsuit"); -defineMacro("\\image", "\\Im"); -defineMacro("\\infin", "\\infty"); -defineMacro("\\Iota", "\\mathrm{I}"); -defineMacro("\\isin", "\\in"); -defineMacro("\\Kappa", "\\mathrm{K}"); -defineMacro("\\larr", "\\leftarrow"); -defineMacro("\\lArr", "\\Leftarrow"); -defineMacro("\\Larr", "\\Leftarrow"); -defineMacro("\\lrarr", "\\leftrightarrow"); -defineMacro("\\lrArr", "\\Leftrightarrow"); -defineMacro("\\Lrarr", "\\Leftrightarrow"); -defineMacro("\\Mu", "\\mathrm{M}"); -defineMacro("\\natnums", "\\mathbb{N}"); -defineMacro("\\Nu", "\\mathrm{N}"); -defineMacro("\\Omicron", "\\mathrm{O}"); -defineMacro("\\plusmn", "\\pm"); -defineMacro("\\rarr", "\\rightarrow"); -defineMacro("\\rArr", "\\Rightarrow"); -defineMacro("\\Rarr", "\\Rightarrow"); -defineMacro("\\real", "\\Re"); -defineMacro("\\reals", "\\mathbb{R}"); -defineMacro("\\Reals", "\\mathbb{R}"); -defineMacro("\\Rho", "\\mathrm{P}"); -defineMacro("\\sdot", "\\cdot"); -defineMacro("\\sect", "\\S"); -defineMacro("\\spades", "\\spadesuit"); -defineMacro("\\sub", "\\subset"); -defineMacro("\\sube", "\\subseteq"); -defineMacro("\\supe", "\\supseteq"); -defineMacro("\\Tau", "\\mathrm{T}"); -defineMacro("\\thetasym", "\\vartheta"); // TODO: defineMacro("\\varcoppa", "\\\mbox{\\coppa}"); - -defineMacro("\\weierp", "\\wp"); -defineMacro("\\Zeta", "\\mathrm{Z}"); ////////////////////////////////////////////////////////////////////// -// statmath.sty -// https://ctan.math.illinois.edu/macros/latex/contrib/statmath/statmath.pdf - -defineMacro("\\argmin", "\\DOTSB\\operatorname*{arg\\,min}"); -defineMacro("\\argmax", "\\DOTSB\\operatorname*{arg\\,max}"); -defineMacro("\\plim", "\\DOTSB\\mathop{\\operatorname{plim}}\\limits"); ////////////////////////////////////////////////////////////////////// -// braket.sty -// http://ctan.math.washington.edu/tex-archive/macros/latex/contrib/braket/braket.pdf - -defineMacro("\\bra", "\\mathinner{\\langle{#1}|}"); -defineMacro("\\ket", "\\mathinner{|{#1}\\rangle}"); -defineMacro("\\braket", "\\mathinner{\\langle{#1}\\rangle}"); -defineMacro("\\Bra", "\\left\\langle#1\\right|"); -defineMacro("\\Ket", "\\left|#1\\right\\rangle"); // Custom Khan Academy colors, should be moved to an optional package - -defineMacro("\\blue", "\\textcolor{##6495ed}{#1}"); -defineMacro("\\orange", "\\textcolor{##ffa500}{#1}"); -defineMacro("\\pink", "\\textcolor{##ff00af}{#1}"); -defineMacro("\\red", "\\textcolor{##df0030}{#1}"); -defineMacro("\\green", "\\textcolor{##28ae7b}{#1}"); -defineMacro("\\gray", "\\textcolor{gray}{#1}"); -defineMacro("\\purple", "\\textcolor{##9d38bd}{#1}"); -defineMacro("\\blueA", "\\textcolor{##ccfaff}{#1}"); -defineMacro("\\blueB", "\\textcolor{##80f6ff}{#1}"); -defineMacro("\\blueC", "\\textcolor{##63d9ea}{#1}"); -defineMacro("\\blueD", "\\textcolor{##11accd}{#1}"); -defineMacro("\\blueE", "\\textcolor{##0c7f99}{#1}"); -defineMacro("\\tealA", "\\textcolor{##94fff5}{#1}"); -defineMacro("\\tealB", "\\textcolor{##26edd5}{#1}"); -defineMacro("\\tealC", "\\textcolor{##01d1c1}{#1}"); -defineMacro("\\tealD", "\\textcolor{##01a995}{#1}"); -defineMacro("\\tealE", "\\textcolor{##208170}{#1}"); -defineMacro("\\greenA", "\\textcolor{##b6ffb0}{#1}"); -defineMacro("\\greenB", "\\textcolor{##8af281}{#1}"); -defineMacro("\\greenC", "\\textcolor{##74cf70}{#1}"); -defineMacro("\\greenD", "\\textcolor{##1fab54}{#1}"); -defineMacro("\\greenE", "\\textcolor{##0d923f}{#1}"); -defineMacro("\\goldA", "\\textcolor{##ffd0a9}{#1}"); -defineMacro("\\goldB", "\\textcolor{##ffbb71}{#1}"); -defineMacro("\\goldC", "\\textcolor{##ff9c39}{#1}"); -defineMacro("\\goldD", "\\textcolor{##e07d10}{#1}"); -defineMacro("\\goldE", "\\textcolor{##a75a05}{#1}"); -defineMacro("\\redA", "\\textcolor{##fca9a9}{#1}"); -defineMacro("\\redB", "\\textcolor{##ff8482}{#1}"); -defineMacro("\\redC", "\\textcolor{##f9685d}{#1}"); -defineMacro("\\redD", "\\textcolor{##e84d39}{#1}"); -defineMacro("\\redE", "\\textcolor{##bc2612}{#1}"); -defineMacro("\\maroonA", "\\textcolor{##ffbde0}{#1}"); -defineMacro("\\maroonB", "\\textcolor{##ff92c6}{#1}"); -defineMacro("\\maroonC", "\\textcolor{##ed5fa6}{#1}"); -defineMacro("\\maroonD", "\\textcolor{##ca337c}{#1}"); -defineMacro("\\maroonE", "\\textcolor{##9e034e}{#1}"); -defineMacro("\\purpleA", "\\textcolor{##ddd7ff}{#1}"); -defineMacro("\\purpleB", "\\textcolor{##c6b9fc}{#1}"); -defineMacro("\\purpleC", "\\textcolor{##aa87ff}{#1}"); -defineMacro("\\purpleD", "\\textcolor{##7854ab}{#1}"); -defineMacro("\\purpleE", "\\textcolor{##543b78}{#1}"); -defineMacro("\\mintA", "\\textcolor{##f5f9e8}{#1}"); -defineMacro("\\mintB", "\\textcolor{##edf2df}{#1}"); -defineMacro("\\mintC", "\\textcolor{##e0e5cc}{#1}"); -defineMacro("\\grayA", "\\textcolor{##f6f7f7}{#1}"); -defineMacro("\\grayB", "\\textcolor{##f0f1f2}{#1}"); -defineMacro("\\grayC", "\\textcolor{##e3e5e6}{#1}"); -defineMacro("\\grayD", "\\textcolor{##d6d8da}{#1}"); -defineMacro("\\grayE", "\\textcolor{##babec2}{#1}"); -defineMacro("\\grayF", "\\textcolor{##888d93}{#1}"); -defineMacro("\\grayG", "\\textcolor{##626569}{#1}"); -defineMacro("\\grayH", "\\textcolor{##3b3e40}{#1}"); -defineMacro("\\grayI", "\\textcolor{##21242c}{#1}"); -defineMacro("\\kaBlue", "\\textcolor{##314453}{#1}"); -defineMacro("\\kaGreen", "\\textcolor{##71B307}{#1}"); -// CONCATENATED MODULE: ./src/MacroExpander.js -/** - * This file contains the “gullet” where macros are expanded - * until only non-macro tokens remain. - */ - - - - - - - -// List of commands that act like macros but aren't defined as a macro, -// function, or symbol. Used in `isDefined`. -var implicitCommands = { - "\\relax": true, - // MacroExpander.js - "^": true, - // Parser.js - "_": true, - // Parser.js - "\\limits": true, - // Parser.js - "\\nolimits": true // Parser.js - -}; - -var MacroExpander_MacroExpander = -/*#__PURE__*/ -function () { - function MacroExpander(input, settings, mode) { - this.settings = void 0; - this.expansionCount = void 0; - this.lexer = void 0; - this.macros = void 0; - this.stack = void 0; - this.mode = void 0; - this.settings = settings; - this.expansionCount = 0; - this.feed(input); // Make new global namespace - - this.macros = new Namespace_Namespace(macros, settings.macros); - this.mode = mode; - this.stack = []; // contains tokens in REVERSE order - } - /** - * Feed a new input string to the same MacroExpander - * (with existing macros etc.). - */ - - - var _proto = MacroExpander.prototype; - - _proto.feed = function feed(input) { - this.lexer = new Lexer_Lexer(input, this.settings); - } - /** - * Switches between "text" and "math" modes. - */ - ; - - _proto.switchMode = function switchMode(newMode) { - this.mode = newMode; - } - /** - * Start a new group nesting within all namespaces. - */ - ; - - _proto.beginGroup = function beginGroup() { - this.macros.beginGroup(); - } - /** - * End current group nesting within all namespaces. - */ - ; - - _proto.endGroup = function endGroup() { - this.macros.endGroup(); - } - /** - * Returns the topmost token on the stack, without expanding it. - * Similar in behavior to TeX's `\futurelet`. - */ - ; - - _proto.future = function future() { - if (this.stack.length === 0) { - this.pushToken(this.lexer.lex()); - } - - return this.stack[this.stack.length - 1]; - } - /** - * Remove and return the next unexpanded token. - */ - ; - - _proto.popToken = function popToken() { - this.future(); // ensure non-empty stack - - return this.stack.pop(); - } - /** - * Add a given token to the token stack. In particular, this get be used - * to put back a token returned from one of the other methods. - */ - ; - - _proto.pushToken = function pushToken(token) { - this.stack.push(token); - } - /** - * Append an array of tokens to the token stack. - */ - ; - - _proto.pushTokens = function pushTokens(tokens) { - var _this$stack; - - (_this$stack = this.stack).push.apply(_this$stack, tokens); - } - /** - * Consume all following space tokens, without expansion. - */ - ; - - _proto.consumeSpaces = function consumeSpaces() { - for (;;) { - var token = this.future(); - - if (token.text === " ") { - this.stack.pop(); - } else { - break; - } - } - } - /** - * Consume the specified number of arguments from the token stream, - * and return the resulting array of arguments. - */ - ; - - _proto.consumeArgs = function consumeArgs(numArgs) { - var args = []; // obtain arguments, either single token or balanced {…} group - - for (var i = 0; i < numArgs; ++i) { - this.consumeSpaces(); // ignore spaces before each argument - - var startOfArg = this.popToken(); - - if (startOfArg.text === "{") { - var arg = []; - var depth = 1; - - while (depth !== 0) { - var tok = this.popToken(); - arg.push(tok); - - if (tok.text === "{") { - ++depth; - } else if (tok.text === "}") { - --depth; - } else if (tok.text === "EOF") { - throw new src_ParseError("End of input in macro argument", startOfArg); - } - } - - arg.pop(); // remove last } - - arg.reverse(); // like above, to fit in with stack order - - args[i] = arg; - } else if (startOfArg.text === "EOF") { - throw new src_ParseError("End of input expecting macro argument"); - } else { - args[i] = [startOfArg]; - } - } - - return args; - } - /** - * Expand the next token only once if possible. - * - * If the token is expanded, the resulting tokens will be pushed onto - * the stack in reverse order and will be returned as an array, - * also in reverse order. - * - * If not, the next token will be returned without removing it - * from the stack. This case can be detected by a `Token` return value - * instead of an `Array` return value. - * - * In either case, the next token will be on the top of the stack, - * or the stack will be empty. - * - * Used to implement `expandAfterFuture` and `expandNextToken`. - * - * At the moment, macro expansion doesn't handle delimited macros, - * i.e. things like those defined by \def\foo#1\end{…}. - * See the TeX book page 202ff. for details on how those should behave. - * - * If expandableOnly, only expandable tokens are expanded and - * an undefined control sequence results in an error. - */ - ; - - _proto.expandOnce = function expandOnce(expandableOnly) { - var topToken = this.popToken(); - var name = topToken.text; - var expansion = !topToken.noexpand ? this._getExpansion(name) : null; - - if (expansion == null || expandableOnly && expansion.unexpandable) { - if (expandableOnly && expansion == null && name[0] === "\\" && !this.isDefined(name)) { - throw new src_ParseError("Undefined control sequence: " + name); - } - - this.pushToken(topToken); - return topToken; - } - - this.expansionCount++; - - if (this.expansionCount > this.settings.maxExpand) { - throw new src_ParseError("Too many expansions: infinite loop or " + "need to increase maxExpand setting"); - } - - var tokens = expansion.tokens; - - if (expansion.numArgs) { - var args = this.consumeArgs(expansion.numArgs); // paste arguments in place of the placeholders - - tokens = tokens.slice(); // make a shallow copy - - for (var i = tokens.length - 1; i >= 0; --i) { - var tok = tokens[i]; - - if (tok.text === "#") { - if (i === 0) { - throw new src_ParseError("Incomplete placeholder at end of macro body", tok); - } - - tok = tokens[--i]; // next token on stack - - if (tok.text === "#") { - // ## → # - tokens.splice(i + 1, 1); // drop first # - } else if (/^[1-9]$/.test(tok.text)) { - var _tokens; - - // replace the placeholder with the indicated argument - (_tokens = tokens).splice.apply(_tokens, [i, 2].concat(args[+tok.text - 1])); - } else { - throw new src_ParseError("Not a valid argument number", tok); - } - } - } - } // Concatenate expansion onto top of stack. - - - this.pushTokens(tokens); - return tokens; - } - /** - * Expand the next token only once (if possible), and return the resulting - * top token on the stack (without removing anything from the stack). - * Similar in behavior to TeX's `\expandafter\futurelet`. - * Equivalent to expandOnce() followed by future(). - */ - ; - - _proto.expandAfterFuture = function expandAfterFuture() { - this.expandOnce(); - return this.future(); - } - /** - * Recursively expand first token, then return first non-expandable token. - */ - ; - - _proto.expandNextToken = function expandNextToken() { - for (;;) { - var expanded = this.expandOnce(); // expandOnce returns Token if and only if it's fully expanded. - - if (expanded instanceof Token_Token) { - // \relax stops the expansion, but shouldn't get returned (a - // null return value couldn't get implemented as a function). - // the token after \noexpand is interpreted as if its meaning - // were ‘\relax’ - if (expanded.text === "\\relax" || expanded.treatAsRelax) { - this.stack.pop(); - } else { - return this.stack.pop(); // === expanded - } - } - } // Flow unable to figure out that this pathway is impossible. - // https://github.com/facebook/flow/issues/4808 - - - throw new Error(); // eslint-disable-line no-unreachable - } - /** - * Fully expand the given macro name and return the resulting list of - * tokens, or return `undefined` if no such macro is defined. - */ - ; - - _proto.expandMacro = function expandMacro(name) { - return this.macros.has(name) ? this.expandTokens([new Token_Token(name)]) : undefined; - } - /** - * Fully expand the given token stream and return the resulting list of tokens - */ - ; - - _proto.expandTokens = function expandTokens(tokens) { - var output = []; - var oldStackLength = this.stack.length; - this.pushTokens(tokens); - - while (this.stack.length > oldStackLength) { - var expanded = this.expandOnce(true); // expand only expandable tokens - // expandOnce returns Token if and only if it's fully expanded. - - if (expanded instanceof Token_Token) { - if (expanded.treatAsRelax) { - // the expansion of \noexpand is the token itself - expanded.noexpand = false; - expanded.treatAsRelax = false; - } - - output.push(this.stack.pop()); - } - } - - return output; - } - /** - * Fully expand the given macro name and return the result as a string, - * or return `undefined` if no such macro is defined. - */ - ; - - _proto.expandMacroAsText = function expandMacroAsText(name) { - var tokens = this.expandMacro(name); - - if (tokens) { - return tokens.map(function (token) { - return token.text; - }).join(""); - } else { - return tokens; - } - } - /** - * Returns the expanded macro as a reversed array of tokens and a macro - * argument count. Or returns `null` if no such macro. - */ - ; - - _proto._getExpansion = function _getExpansion(name) { - var definition = this.macros.get(name); - - if (definition == null) { - // mainly checking for undefined here - return definition; - } - - var expansion = typeof definition === "function" ? definition(this) : definition; - - if (typeof expansion === "string") { - var numArgs = 0; - - if (expansion.indexOf("#") !== -1) { - var stripped = expansion.replace(/##/g, ""); - - while (stripped.indexOf("#" + (numArgs + 1)) !== -1) { - ++numArgs; - } - } - - var bodyLexer = new Lexer_Lexer(expansion, this.settings); - var tokens = []; - var tok = bodyLexer.lex(); - - while (tok.text !== "EOF") { - tokens.push(tok); - tok = bodyLexer.lex(); - } - - tokens.reverse(); // to fit in with stack using push and pop - - var expanded = { - tokens: tokens, - numArgs: numArgs - }; - return expanded; - } - - return expansion; - } - /** - * Determine whether a command is currently "defined" (has some - * functionality), meaning that it's a macro (in the current group), - * a function, a symbol, or one of the special commands listed in - * `implicitCommands`. - */ - ; - - _proto.isDefined = function isDefined(name) { - return this.macros.has(name) || src_functions.hasOwnProperty(name) || src_symbols.math.hasOwnProperty(name) || src_symbols.text.hasOwnProperty(name) || implicitCommands.hasOwnProperty(name); - } - /** - * Determine whether a command is expandable. - */ - ; - - _proto.isExpandable = function isExpandable(name) { - var macro = this.macros.get(name); - return macro != null ? typeof macro === "string" || typeof macro === "function" || !macro.unexpandable // TODO(ylem): #2085 - : src_functions.hasOwnProperty(name) - /* && !functions[name].primitive*/ - ; - }; - - return MacroExpander; -}(); - - -// CONCATENATED MODULE: ./src/Parser.js -/* eslint no-constant-condition:0 */ - - - - - - - - - - // Pre-evaluate both modules as unicodeSymbols require String.normalize() - -var unicodeAccents = { - "́": { - "text": "\\'", - "math": "\\acute" - }, - "̀": { - "text": "\\`", - "math": "\\grave" - }, - "̈": { - "text": "\\\"", - "math": "\\ddot" - }, - "̃": { - "text": "\\~", - "math": "\\tilde" - }, - "̄": { - "text": "\\=", - "math": "\\bar" - }, - "̆": { - "text": "\\u", - "math": "\\breve" - }, - "̌": { - "text": "\\v", - "math": "\\check" - }, - "̂": { - "text": "\\^", - "math": "\\hat" - }, - "̇": { - "text": "\\.", - "math": "\\dot" - }, - "̊": { - "text": "\\r", - "math": "\\mathring" - }, - "̋": { - "text": "\\H" - } -}; -var unicodeSymbols = { - "á": "á", - "à": "à", - "ä": "ä", - "ǟ": "ǟ", - "ã": "ã", - "ā": "ā", - "ă": "ă", - "ắ": "ắ", - "ằ": "ằ", - "ẵ": "ẵ", - "ǎ": "ǎ", - "â": "â", - "ấ": "ấ", - "ầ": "ầ", - "ẫ": "ẫ", - "ȧ": "ȧ", - "ǡ": "ǡ", - "å": "å", - "ǻ": "ǻ", - "ḃ": "ḃ", - "ć": "ć", - "č": "č", - "ĉ": "ĉ", - "ċ": "ċ", - "ď": "ď", - "ḋ": "ḋ", - "é": "é", - "è": "è", - "ë": "ë", - "ẽ": "ẽ", - "ē": "ē", - "ḗ": "ḗ", - "ḕ": "ḕ", - "ĕ": "ĕ", - "ě": "ě", - "ê": "ê", - "ế": "ế", - "ề": "ề", - "ễ": "ễ", - "ė": "ė", - "ḟ": "ḟ", - "ǵ": "ǵ", - "ḡ": "ḡ", - "ğ": "ğ", - "ǧ": "ǧ", - "ĝ": "ĝ", - "ġ": "ġ", - "ḧ": "ḧ", - "ȟ": "ȟ", - "ĥ": "ĥ", - "ḣ": "ḣ", - "í": "í", - "ì": "ì", - "ï": "ï", - "ḯ": "ḯ", - "ĩ": "ĩ", - "ī": "ī", - "ĭ": "ĭ", - "ǐ": "ǐ", - "î": "î", - "ǰ": "ǰ", - "ĵ": "ĵ", - "ḱ": "ḱ", - "ǩ": "ǩ", - "ĺ": "ĺ", - "ľ": "ľ", - "ḿ": "ḿ", - "ṁ": "ṁ", - "ń": "ń", - "ǹ": "ǹ", - "ñ": "ñ", - "ň": "ň", - "ṅ": "ṅ", - "ó": "ó", - "ò": "ò", - "ö": "ö", - "ȫ": "ȫ", - "õ": "õ", - "ṍ": "ṍ", - "ṏ": "ṏ", - "ȭ": "ȭ", - "ō": "ō", - "ṓ": "ṓ", - "ṑ": "ṑ", - "ŏ": "ŏ", - "ǒ": "ǒ", - "ô": "ô", - "ố": "ố", - "ồ": "ồ", - "ỗ": "ỗ", - "ȯ": "ȯ", - "ȱ": "ȱ", - "ő": "ő", - "ṕ": "ṕ", - "ṗ": "ṗ", - "ŕ": "ŕ", - "ř": "ř", - "ṙ": "ṙ", - "ś": "ś", - "ṥ": "ṥ", - "š": "š", - "ṧ": "ṧ", - "ŝ": "ŝ", - "ṡ": "ṡ", - "ẗ": "ẗ", - "ť": "ť", - "ṫ": "ṫ", - "ú": "ú", - "ù": "ù", - "ü": "ü", - "ǘ": "ǘ", - "ǜ": "ǜ", - "ǖ": "ǖ", - "ǚ": "ǚ", - "ũ": "ũ", - "ṹ": "ṹ", - "ū": "ū", - "ṻ": "ṻ", - "ŭ": "ŭ", - "ǔ": "ǔ", - "û": "û", - "ů": "ů", - "ű": "ű", - "ṽ": "ṽ", - "ẃ": "ẃ", - "ẁ": "ẁ", - "ẅ": "ẅ", - "ŵ": "ŵ", - "ẇ": "ẇ", - "ẘ": "ẘ", - "ẍ": "ẍ", - "ẋ": "ẋ", - "ý": "ý", - "ỳ": "ỳ", - "ÿ": "ÿ", - "ỹ": "ỹ", - "ȳ": "ȳ", - "ŷ": "ŷ", - "ẏ": "ẏ", - "ẙ": "ẙ", - "ź": "ź", - "ž": "ž", - "ẑ": "ẑ", - "ż": "ż", - "Á": "Á", - "À": "À", - "Ä": "Ä", - "Ǟ": "Ǟ", - "Ã": "Ã", - "Ā": "Ā", - "Ă": "Ă", - "Ắ": "Ắ", - "Ằ": "Ằ", - "Ẵ": "Ẵ", - "Ǎ": "Ǎ", - "Â": "Â", - "Ấ": "Ấ", - "Ầ": "Ầ", - "Ẫ": "Ẫ", - "Ȧ": "Ȧ", - "Ǡ": "Ǡ", - "Å": "Å", - "Ǻ": "Ǻ", - "Ḃ": "Ḃ", - "Ć": "Ć", - "Č": "Č", - "Ĉ": "Ĉ", - "Ċ": "Ċ", - "Ď": "Ď", - "Ḋ": "Ḋ", - "É": "É", - "È": "È", - "Ë": "Ë", - "Ẽ": "Ẽ", - "Ē": "Ē", - "Ḗ": "Ḗ", - "Ḕ": "Ḕ", - "Ĕ": "Ĕ", - "Ě": "Ě", - "Ê": "Ê", - "Ế": "Ế", - "Ề": "Ề", - "Ễ": "Ễ", - "Ė": "Ė", - "Ḟ": "Ḟ", - "Ǵ": "Ǵ", - "Ḡ": "Ḡ", - "Ğ": "Ğ", - "Ǧ": "Ǧ", - "Ĝ": "Ĝ", - "Ġ": "Ġ", - "Ḧ": "Ḧ", - "Ȟ": "Ȟ", - "Ĥ": "Ĥ", - "Ḣ": "Ḣ", - "Í": "Í", - "Ì": "Ì", - "Ï": "Ï", - "Ḯ": "Ḯ", - "Ĩ": "Ĩ", - "Ī": "Ī", - "Ĭ": "Ĭ", - "Ǐ": "Ǐ", - "Î": "Î", - "İ": "İ", - "Ĵ": "Ĵ", - "Ḱ": "Ḱ", - "Ǩ": "Ǩ", - "Ĺ": "Ĺ", - "Ľ": "Ľ", - "Ḿ": "Ḿ", - "Ṁ": "Ṁ", - "Ń": "Ń", - "Ǹ": "Ǹ", - "Ñ": "Ñ", - "Ň": "Ň", - "Ṅ": "Ṅ", - "Ó": "Ó", - "Ò": "Ò", - "Ö": "Ö", - "Ȫ": "Ȫ", - "Õ": "Õ", - "Ṍ": "Ṍ", - "Ṏ": "Ṏ", - "Ȭ": "Ȭ", - "Ō": "Ō", - "Ṓ": "Ṓ", - "Ṑ": "Ṑ", - "Ŏ": "Ŏ", - "Ǒ": "Ǒ", - "Ô": "Ô", - "Ố": "Ố", - "Ồ": "Ồ", - "Ỗ": "Ỗ", - "Ȯ": "Ȯ", - "Ȱ": "Ȱ", - "Ő": "Ő", - "Ṕ": "Ṕ", - "Ṗ": "Ṗ", - "Ŕ": "Ŕ", - "Ř": "Ř", - "Ṙ": "Ṙ", - "Ś": "Ś", - "Ṥ": "Ṥ", - "Š": "Š", - "Ṧ": "Ṧ", - "Ŝ": "Ŝ", - "Ṡ": "Ṡ", - "Ť": "Ť", - "Ṫ": "Ṫ", - "Ú": "Ú", - "Ù": "Ù", - "Ü": "Ü", - "Ǘ": "Ǘ", - "Ǜ": "Ǜ", - "Ǖ": "Ǖ", - "Ǚ": "Ǚ", - "Ũ": "Ũ", - "Ṹ": "Ṹ", - "Ū": "Ū", - "Ṻ": "Ṻ", - "Ŭ": "Ŭ", - "Ǔ": "Ǔ", - "Û": "Û", - "Ů": "Ů", - "Ű": "Ű", - "Ṽ": "Ṽ", - "Ẃ": "Ẃ", - "Ẁ": "Ẁ", - "Ẅ": "Ẅ", - "Ŵ": "Ŵ", - "Ẇ": "Ẇ", - "Ẍ": "Ẍ", - "Ẋ": "Ẋ", - "Ý": "Ý", - "Ỳ": "Ỳ", - "Ÿ": "Ÿ", - "Ỹ": "Ỹ", - "Ȳ": "Ȳ", - "Ŷ": "Ŷ", - "Ẏ": "Ẏ", - "Ź": "Ź", - "Ž": "Ž", - "Ẑ": "Ẑ", - "Ż": "Ż", - "ά": "ά", - "ὰ": "ὰ", - "ᾱ": "ᾱ", - "ᾰ": "ᾰ", - "έ": "έ", - "ὲ": "ὲ", - "ή": "ή", - "ὴ": "ὴ", - "ί": "ί", - "ὶ": "ὶ", - "ϊ": "ϊ", - "ΐ": "ΐ", - "ῒ": "ῒ", - "ῑ": "ῑ", - "ῐ": "ῐ", - "ό": "ό", - "ὸ": "ὸ", - "ύ": "ύ", - "ὺ": "ὺ", - "ϋ": "ϋ", - "ΰ": "ΰ", - "ῢ": "ῢ", - "ῡ": "ῡ", - "ῠ": "ῠ", - "ώ": "ώ", - "ὼ": "ὼ", - "Ύ": "Ύ", - "Ὺ": "Ὺ", - "Ϋ": "Ϋ", - "Ῡ": "Ῡ", - "Ῠ": "Ῠ", - "Ώ": "Ώ", - "Ὼ": "Ὼ" -}; - -/** - * This file contains the parser used to parse out a TeX expression from the - * input. Since TeX isn't context-free, standard parsers don't work particularly - * well. - * - * The strategy of this parser is as such: - * - * The main functions (the `.parse...` ones) take a position in the current - * parse string to parse tokens from. The lexer (found in Lexer.js, stored at - * this.gullet.lexer) also supports pulling out tokens at arbitrary places. When - * individual tokens are needed at a position, the lexer is called to pull out a - * token, which is then used. - * - * The parser has a property called "mode" indicating the mode that - * the parser is currently in. Currently it has to be one of "math" or - * "text", which denotes whether the current environment is a math-y - * one or a text-y one (e.g. inside \text). Currently, this serves to - * limit the functions which can be used in text mode. - * - * The main functions then return an object which contains the useful data that - * was parsed at its given point, and a new position at the end of the parsed - * data. The main functions can call each other and continue the parsing by - * using the returned position as a new starting point. - * - * There are also extra `.handle...` functions, which pull out some reused - * functionality into self-contained functions. - * - * The functions return ParseNodes. - */ -var Parser_Parser = -/*#__PURE__*/ -function () { - function Parser(input, settings) { - this.mode = void 0; - this.gullet = void 0; - this.settings = void 0; - this.leftrightDepth = void 0; - this.nextToken = void 0; - // Start in math mode - this.mode = "math"; // Create a new macro expander (gullet) and (indirectly via that) also a - // new lexer (mouth) for this parser (stomach, in the language of TeX) - - this.gullet = new MacroExpander_MacroExpander(input, settings, this.mode); // Store the settings for use in parsing - - this.settings = settings; // Count leftright depth (for \middle errors) - - this.leftrightDepth = 0; - } - /** - * Checks a result to make sure it has the right type, and throws an - * appropriate error otherwise. - */ - - - var _proto = Parser.prototype; - - _proto.expect = function expect(text, consume) { - if (consume === void 0) { - consume = true; - } - - if (this.fetch().text !== text) { - throw new src_ParseError("Expected '" + text + "', got '" + this.fetch().text + "'", this.fetch()); - } - - if (consume) { - this.consume(); - } - } - /** - * Discards the current lookahead token, considering it consumed. - */ - ; - - _proto.consume = function consume() { - this.nextToken = null; - } - /** - * Return the current lookahead token, or if there isn't one (at the - * beginning, or if the previous lookahead token was consume()d), - * fetch the next token as the new lookahead token and return it. - */ - ; - - _proto.fetch = function fetch() { - if (this.nextToken == null) { - this.nextToken = this.gullet.expandNextToken(); - } - - return this.nextToken; - } - /** - * Switches between "text" and "math" modes. - */ - ; - - _proto.switchMode = function switchMode(newMode) { - this.mode = newMode; - this.gullet.switchMode(newMode); - } - /** - * Main parsing function, which parses an entire input. - */ - ; - - _proto.parse = function parse() { - if (!this.settings.globalGroup) { - // Create a group namespace for the math expression. - // (LaTeX creates a new group for every $...$, $$...$$, \[...\].) - this.gullet.beginGroup(); - } // Use old \color behavior (same as LaTeX's \textcolor) if requested. - // We do this within the group for the math expression, so it doesn't - // pollute settings.macros. - - - if (this.settings.colorIsTextColor) { - this.gullet.macros.set("\\color", "\\textcolor"); - } // Try to parse the input - - - var parse = this.parseExpression(false); // If we succeeded, make sure there's an EOF at the end - - this.expect("EOF"); // End the group namespace for the expression - - if (!this.settings.globalGroup) { - this.gullet.endGroup(); - } - - return parse; - }; - - _proto.parseExpression = function parseExpression(breakOnInfix, breakOnTokenText) { - var body = []; // Keep adding atoms to the body until we can't parse any more atoms (either - // we reached the end, a }, or a \right) - - while (true) { - // Ignore spaces in math mode - if (this.mode === "math") { - this.consumeSpaces(); - } - - var lex = this.fetch(); - - if (Parser.endOfExpression.indexOf(lex.text) !== -1) { - break; - } - - if (breakOnTokenText && lex.text === breakOnTokenText) { - break; - } - - if (breakOnInfix && src_functions[lex.text] && src_functions[lex.text].infix) { - break; - } - - var atom = this.parseAtom(breakOnTokenText); - - if (!atom) { - break; - } else if (atom.type === "internal") { - continue; - } - - body.push(atom); - } - - if (this.mode === "text") { - this.formLigatures(body); - } - - return this.handleInfixNodes(body); - } - /** - * Rewrites infix operators such as \over with corresponding commands such - * as \frac. - * - * There can only be one infix operator per group. If there's more than one - * then the expression is ambiguous. This can be resolved by adding {}. - */ - ; - - _proto.handleInfixNodes = function handleInfixNodes(body) { - var overIndex = -1; - var funcName; - - for (var i = 0; i < body.length; i++) { - if (body[i].type === "infix") { - if (overIndex !== -1) { - throw new src_ParseError("only one infix operator per group", body[i].token); - } - - overIndex = i; - funcName = body[i].replaceWith; - } - } - - if (overIndex !== -1 && funcName) { - var numerNode; - var denomNode; - var numerBody = body.slice(0, overIndex); - var denomBody = body.slice(overIndex + 1); - - if (numerBody.length === 1 && numerBody[0].type === "ordgroup") { - numerNode = numerBody[0]; - } else { - numerNode = { - type: "ordgroup", - mode: this.mode, - body: numerBody - }; - } - - if (denomBody.length === 1 && denomBody[0].type === "ordgroup") { - denomNode = denomBody[0]; - } else { - denomNode = { - type: "ordgroup", - mode: this.mode, - body: denomBody - }; - } - - var node; - - if (funcName === "\\\\abovefrac") { - node = this.callFunction(funcName, [numerNode, body[overIndex], denomNode], []); - } else { - node = this.callFunction(funcName, [numerNode, denomNode], []); - } - - return [node]; - } else { - return body; - } - } // The greediness of a superscript or subscript - ; - - /** - * Handle a subscript or superscript with nice errors. - */ - _proto.handleSupSubscript = function handleSupSubscript(name) { - var symbolToken = this.fetch(); - var symbol = symbolToken.text; - this.consume(); - var group = this.parseGroup(name, false, Parser.SUPSUB_GREEDINESS, undefined, undefined, true); // ignore spaces before sup/subscript argument - - if (!group) { - throw new src_ParseError("Expected group after '" + symbol + "'", symbolToken); - } - - return group; - } - /** - * Converts the textual input of an unsupported command into a text node - * contained within a color node whose color is determined by errorColor - */ - ; - - _proto.formatUnsupportedCmd = function formatUnsupportedCmd(text) { - var textordArray = []; - - for (var i = 0; i < text.length; i++) { - textordArray.push({ - type: "textord", - mode: "text", - text: text[i] - }); - } - - var textNode = { - type: "text", - mode: this.mode, - body: textordArray - }; - var colorNode = { - type: "color", - mode: this.mode, - color: this.settings.errorColor, - body: [textNode] - }; - return colorNode; - } - /** - * Parses a group with optional super/subscripts. - */ - ; - - _proto.parseAtom = function parseAtom(breakOnTokenText) { - // The body of an atom is an implicit group, so that things like - // \left(x\right)^2 work correctly. - var base = this.parseGroup("atom", false, null, breakOnTokenText); // In text mode, we don't have superscripts or subscripts - - if (this.mode === "text") { - return base; - } // Note that base may be empty (i.e. null) at this point. - - - var superscript; - var subscript; - - while (true) { - // Guaranteed in math mode, so eat any spaces first. - this.consumeSpaces(); // Lex the first token - - var lex = this.fetch(); - - if (lex.text === "\\limits" || lex.text === "\\nolimits") { - // We got a limit control - if (base && base.type === "op") { - var limits = lex.text === "\\limits"; - base.limits = limits; - base.alwaysHandleSupSub = true; - } else if (base && base.type === "operatorname" && base.alwaysHandleSupSub) { - var _limits = lex.text === "\\limits"; - - base.limits = _limits; - } else { - throw new src_ParseError("Limit controls must follow a math operator", lex); - } - - this.consume(); - } else if (lex.text === "^") { - // We got a superscript start - if (superscript) { - throw new src_ParseError("Double superscript", lex); - } - - superscript = this.handleSupSubscript("superscript"); - } else if (lex.text === "_") { - // We got a subscript start - if (subscript) { - throw new src_ParseError("Double subscript", lex); - } - - subscript = this.handleSupSubscript("subscript"); - } else if (lex.text === "'") { - // We got a prime - if (superscript) { - throw new src_ParseError("Double superscript", lex); - } - - var prime = { - type: "textord", - mode: this.mode, - text: "\\prime" - }; // Many primes can be grouped together, so we handle this here - - var primes = [prime]; - this.consume(); // Keep lexing tokens until we get something that's not a prime - - while (this.fetch().text === "'") { - // For each one, add another prime to the list - primes.push(prime); - this.consume(); - } // If there's a superscript following the primes, combine that - // superscript in with the primes. - - - if (this.fetch().text === "^") { - primes.push(this.handleSupSubscript("superscript")); - } // Put everything into an ordgroup as the superscript - - - superscript = { - type: "ordgroup", - mode: this.mode, - body: primes - }; - } else { - // If it wasn't ^, _, or ', stop parsing super/subscripts - break; - } - } // Base must be set if superscript or subscript are set per logic above, - // but need to check here for type check to pass. - - - if (superscript || subscript) { - // If we got either a superscript or subscript, create a supsub - return { - type: "supsub", - mode: this.mode, - base: base, - sup: superscript, - sub: subscript - }; - } else { - // Otherwise return the original body - return base; - } - } - /** - * Parses an entire function, including its base and all of its arguments. - */ - ; - - _proto.parseFunction = function parseFunction(breakOnTokenText, name, // For error reporting. - greediness) { - var token = this.fetch(); - var func = token.text; - var funcData = src_functions[func]; - - if (!funcData) { - return null; - } - - this.consume(); // consume command token - - if (greediness != null && funcData.greediness <= greediness) { - throw new src_ParseError("Got function '" + func + "' with no arguments" + (name ? " as " + name : ""), token); - } else if (this.mode === "text" && !funcData.allowedInText) { - throw new src_ParseError("Can't use function '" + func + "' in text mode", token); - } else if (this.mode === "math" && funcData.allowedInMath === false) { - throw new src_ParseError("Can't use function '" + func + "' in math mode", token); - } - - var _this$parseArguments = this.parseArguments(func, funcData), - args = _this$parseArguments.args, - optArgs = _this$parseArguments.optArgs; - - return this.callFunction(func, args, optArgs, token, breakOnTokenText); - } - /** - * Call a function handler with a suitable context and arguments. - */ - ; - - _proto.callFunction = function callFunction(name, args, optArgs, token, breakOnTokenText) { - var context = { - funcName: name, - parser: this, - token: token, - breakOnTokenText: breakOnTokenText - }; - var func = src_functions[name]; - - if (func && func.handler) { - return func.handler(context, args, optArgs); - } else { - throw new src_ParseError("No function handler for " + name); - } - } - /** - * Parses the arguments of a function or environment - */ - ; - - _proto.parseArguments = function parseArguments(func, // Should look like "\name" or "\begin{name}". - funcData) { - var totalArgs = funcData.numArgs + funcData.numOptionalArgs; - - if (totalArgs === 0) { - return { - args: [], - optArgs: [] - }; - } - - var baseGreediness = funcData.greediness; - var args = []; - var optArgs = []; - - for (var i = 0; i < totalArgs; i++) { - var argType = funcData.argTypes && funcData.argTypes[i]; - var isOptional = i < funcData.numOptionalArgs; // Ignore spaces between arguments. As the TeXbook says: - // "After you have said ‘\def\row#1#2{...}’, you are allowed to - // put spaces between the arguments (e.g., ‘\row x n’), because - // TeX doesn’t use single spaces as undelimited arguments." - - var consumeSpaces = i > 0 && !isOptional || // Also consume leading spaces in math mode, as parseSymbol - // won't know what to do with them. This can only happen with - // macros, e.g. \frac\foo\foo where \foo expands to a space symbol. - // In LaTeX, the \foo's get treated as (blank) arguments. - // In KaTeX, for now, both spaces will get consumed. - // TODO(edemaine) - i === 0 && !isOptional && this.mode === "math"; - var arg = this.parseGroupOfType("argument to '" + func + "'", argType, isOptional, baseGreediness, consumeSpaces); - - if (!arg) { - if (isOptional) { - optArgs.push(null); - continue; - } - - throw new src_ParseError("Expected group after '" + func + "'", this.fetch()); - } - - (isOptional ? optArgs : args).push(arg); - } - - return { - args: args, - optArgs: optArgs - }; - } - /** - * Parses a group when the mode is changing. - */ - ; - - _proto.parseGroupOfType = function parseGroupOfType(name, type, optional, greediness, consumeSpaces) { - switch (type) { - case "color": - if (consumeSpaces) { - this.consumeSpaces(); - } - - return this.parseColorGroup(optional); - - case "size": - if (consumeSpaces) { - this.consumeSpaces(); - } - - return this.parseSizeGroup(optional); - - case "url": - return this.parseUrlGroup(optional, consumeSpaces); - - case "math": - case "text": - return this.parseGroup(name, optional, greediness, undefined, type, consumeSpaces); - - case "hbox": - { - // hbox argument type wraps the argument in the equivalent of - // \hbox, which is like \text but switching to \textstyle size. - var group = this.parseGroup(name, optional, greediness, undefined, "text", consumeSpaces); - - if (!group) { - return group; - } - - var styledGroup = { - type: "styling", - mode: group.mode, - body: [group], - style: "text" // simulate \textstyle - - }; - return styledGroup; - } - - case "raw": - { - if (consumeSpaces) { - this.consumeSpaces(); - } - - if (optional && this.fetch().text === "{") { - return null; - } - - var token = this.parseStringGroup("raw", optional, true); - - if (token) { - return { - type: "raw", - mode: "text", - string: token.text - }; - } else { - throw new src_ParseError("Expected raw group", this.fetch()); - } - } - - case "original": - case null: - case undefined: - return this.parseGroup(name, optional, greediness, undefined, undefined, consumeSpaces); - - default: - throw new src_ParseError("Unknown group type as " + name, this.fetch()); - } - } - /** - * Discard any space tokens, fetching the next non-space token. - */ - ; - - _proto.consumeSpaces = function consumeSpaces() { - while (this.fetch().text === " ") { - this.consume(); - } - } - /** - * Parses a group, essentially returning the string formed by the - * brace-enclosed tokens plus some position information. - */ - ; - - _proto.parseStringGroup = function parseStringGroup(modeName, // Used to describe the mode in error messages. - optional, raw) { - var groupBegin = optional ? "[" : "{"; - var groupEnd = optional ? "]" : "}"; - var beginToken = this.fetch(); - - if (beginToken.text !== groupBegin) { - if (optional) { - return null; - } else if (raw && beginToken.text !== "EOF" && /[^{}[\]]/.test(beginToken.text)) { - this.consume(); - return beginToken; - } - } - - var outerMode = this.mode; - this.mode = "text"; - this.expect(groupBegin); - var str = ""; - var firstToken = this.fetch(); - var nested = 0; // allow nested braces in raw string group - - var lastToken = firstToken; - var nextToken; - - while ((nextToken = this.fetch()).text !== groupEnd || raw && nested > 0) { - switch (nextToken.text) { - case "EOF": - throw new src_ParseError("Unexpected end of input in " + modeName, firstToken.range(lastToken, str)); - - case groupBegin: - nested++; - break; - - case groupEnd: - nested--; - break; - } - - lastToken = nextToken; - str += lastToken.text; - this.consume(); - } - - this.expect(groupEnd); - this.mode = outerMode; - return firstToken.range(lastToken, str); - } - /** - * Parses a regex-delimited group: the largest sequence of tokens - * whose concatenated strings match `regex`. Returns the string - * formed by the tokens plus some position information. - */ - ; - - _proto.parseRegexGroup = function parseRegexGroup(regex, modeName) { - var outerMode = this.mode; - this.mode = "text"; - var firstToken = this.fetch(); - var lastToken = firstToken; - var str = ""; - var nextToken; - - while ((nextToken = this.fetch()).text !== "EOF" && regex.test(str + nextToken.text)) { - lastToken = nextToken; - str += lastToken.text; - this.consume(); - } - - if (str === "") { - throw new src_ParseError("Invalid " + modeName + ": '" + firstToken.text + "'", firstToken); - } - - this.mode = outerMode; - return firstToken.range(lastToken, str); - } - /** - * Parses a color description. - */ - ; - - _proto.parseColorGroup = function parseColorGroup(optional) { - var res = this.parseStringGroup("color", optional); - - if (!res) { - return null; - } - - var match = /^(#[a-f0-9]{3}|#?[a-f0-9]{6}|[a-z]+)$/i.exec(res.text); - - if (!match) { - throw new src_ParseError("Invalid color: '" + res.text + "'", res); - } - - var color = match[0]; - - if (/^[0-9a-f]{6}$/i.test(color)) { - // We allow a 6-digit HTML color spec without a leading "#". - // This follows the xcolor package's HTML color model. - // Predefined color names are all missed by this RegEx pattern. - color = "#" + color; - } - - return { - type: "color-token", - mode: this.mode, - color: color - }; - } - /** - * Parses a size specification, consisting of magnitude and unit. - */ - ; - - _proto.parseSizeGroup = function parseSizeGroup(optional) { - var res; - var isBlank = false; - - if (!optional && this.fetch().text !== "{") { - res = this.parseRegexGroup(/^[-+]? *(?:$|\d+|\d+\.\d*|\.\d*) *[a-z]{0,2} *$/, "size"); - } else { - res = this.parseStringGroup("size", optional); - } - - if (!res) { - return null; - } - - if (!optional && res.text.length === 0) { - // Because we've tested for what is !optional, this block won't - // affect \kern, \hspace, etc. It will capture the mandatory arguments - // to \genfrac and \above. - res.text = "0pt"; // Enable \above{} - - isBlank = true; // This is here specifically for \genfrac - } - - var match = /([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(res.text); - - if (!match) { - throw new src_ParseError("Invalid size: '" + res.text + "'", res); - } - - var data = { - number: +(match[1] + match[2]), - // sign + magnitude, cast to number - unit: match[3] - }; - - if (!validUnit(data)) { - throw new src_ParseError("Invalid unit: '" + data.unit + "'", res); - } - - return { - type: "size", - mode: this.mode, - value: data, - isBlank: isBlank - }; - } - /** - * Parses an URL, checking escaped letters and allowed protocols, - * and setting the catcode of % as an active character (as in \hyperref). - */ - ; - - _proto.parseUrlGroup = function parseUrlGroup(optional, consumeSpaces) { - this.gullet.lexer.setCatcode("%", 13); // active character - - var res = this.parseStringGroup("url", optional, true); // get raw string - - this.gullet.lexer.setCatcode("%", 14); // comment character - - if (!res) { - return null; - } // hyperref package allows backslashes alone in href, but doesn't - // generate valid links in such cases; we interpret this as - // "undefined" behaviour, and keep them as-is. Some browser will - // replace backslashes with forward slashes. - - - var url = res.text.replace(/\\([#$%&~_^{}])/g, '$1'); - return { - type: "url", - mode: this.mode, - url: url - }; - } - /** - * If `optional` is false or absent, this parses an ordinary group, - * which is either a single nucleus (like "x") or an expression - * in braces (like "{x+y}") or an implicit group, a group that starts - * at the current position, and ends right before a higher explicit - * group ends, or at EOF. - * If `optional` is true, it parses either a bracket-delimited expression - * (like "[x+y]") or returns null to indicate the absence of a - * bracket-enclosed group. - * If `mode` is present, switches to that mode while parsing the group, - * and switches back after. - */ - ; - - _proto.parseGroup = function parseGroup(name, // For error reporting. - optional, greediness, breakOnTokenText, mode, consumeSpaces) { - // Switch to specified mode - var outerMode = this.mode; - - if (mode) { - this.switchMode(mode); - } // Consume spaces if requested, crucially *after* we switch modes, - // so that the next non-space token is parsed in the correct mode. - - - if (consumeSpaces) { - this.consumeSpaces(); - } // Get first token - - - var firstToken = this.fetch(); - var text = firstToken.text; - var result; // Try to parse an open brace or \begingroup - - if (optional ? text === "[" : text === "{" || text === "\\begingroup") { - this.consume(); - var groupEnd = Parser.endOfGroup[text]; // Start a new group namespace - - this.gullet.beginGroup(); // If we get a brace, parse an expression - - var expression = this.parseExpression(false, groupEnd); - var lastToken = this.fetch(); // Check that we got a matching closing brace - - this.expect(groupEnd); // End group namespace - - this.gullet.endGroup(); - result = { - type: "ordgroup", - mode: this.mode, - loc: SourceLocation.range(firstToken, lastToken), - body: expression, - // A group formed by \begingroup...\endgroup is a semi-simple group - // which doesn't affect spacing in math mode, i.e., is transparent. - // https://tex.stackexchange.com/questions/1930/when-should-one- - // use-begingroup-instead-of-bgroup - semisimple: text === "\\begingroup" || undefined - }; - } else if (optional) { - // Return nothing for an optional group - result = null; - } else { - // If there exists a function with this name, parse the function. - // Otherwise, just return a nucleus - result = this.parseFunction(breakOnTokenText, name, greediness) || this.parseSymbol(); - - if (result == null && text[0] === "\\" && !implicitCommands.hasOwnProperty(text)) { - if (this.settings.throwOnError) { - throw new src_ParseError("Undefined control sequence: " + text, firstToken); - } - - result = this.formatUnsupportedCmd(text); - this.consume(); - } - } // Switch mode back - - - if (mode) { - this.switchMode(outerMode); - } - - return result; - } - /** - * Form ligature-like combinations of characters for text mode. - * This includes inputs like "--", "---", "``" and "''". - * The result will simply replace multiple textord nodes with a single - * character in each value by a single textord node having multiple - * characters in its value. The representation is still ASCII source. - * The group will be modified in place. - */ - ; - - _proto.formLigatures = function formLigatures(group) { - var n = group.length - 1; - - for (var i = 0; i < n; ++i) { - var a = group[i]; // $FlowFixMe: Not every node type has a `text` property. - - var v = a.text; - - if (v === "-" && group[i + 1].text === "-") { - if (i + 1 < n && group[i + 2].text === "-") { - group.splice(i, 3, { - type: "textord", - mode: "text", - loc: SourceLocation.range(a, group[i + 2]), - text: "---" - }); - n -= 2; - } else { - group.splice(i, 2, { - type: "textord", - mode: "text", - loc: SourceLocation.range(a, group[i + 1]), - text: "--" - }); - n -= 1; - } - } - - if ((v === "'" || v === "`") && group[i + 1].text === v) { - group.splice(i, 2, { - type: "textord", - mode: "text", - loc: SourceLocation.range(a, group[i + 1]), - text: v + v - }); - n -= 1; - } - } - } - /** - * Parse a single symbol out of the string. Here, we handle single character - * symbols and special functions like \verb. - */ - ; - - _proto.parseSymbol = function parseSymbol() { - var nucleus = this.fetch(); - var text = nucleus.text; - - if (/^\\verb[^a-zA-Z]/.test(text)) { - this.consume(); - var arg = text.slice(5); - var star = arg.charAt(0) === "*"; - - if (star) { - arg = arg.slice(1); - } // Lexer's tokenRegex is constructed to always have matching - // first/last characters. - - - if (arg.length < 2 || arg.charAt(0) !== arg.slice(-1)) { - throw new src_ParseError("\\verb assertion failed --\n please report what input caused this bug"); - } - - arg = arg.slice(1, -1); // remove first and last char - - return { - type: "verb", - mode: "text", - body: arg, - star: star - }; - } // At this point, we should have a symbol, possibly with accents. - // First expand any accented base symbol according to unicodeSymbols. - - - if (unicodeSymbols.hasOwnProperty(text[0]) && !src_symbols[this.mode][text[0]]) { - // This behavior is not strict (XeTeX-compatible) in math mode. - if (this.settings.strict && this.mode === "math") { - this.settings.reportNonstrict("unicodeTextInMathMode", "Accented Unicode text character \"" + text[0] + "\" used in " + "math mode", nucleus); - } - - text = unicodeSymbols[text[0]] + text.substr(1); - } // Strip off any combining characters - - - var match = combiningDiacriticalMarksEndRegex.exec(text); - - if (match) { - text = text.substring(0, match.index); - - if (text === 'i') { - text = "\u0131"; // dotless i, in math and text mode - } else if (text === 'j') { - text = "\u0237"; // dotless j, in math and text mode - } - } // Recognize base symbol - - - var symbol; - - if (src_symbols[this.mode][text]) { - if (this.settings.strict && this.mode === 'math' && extraLatin.indexOf(text) >= 0) { - this.settings.reportNonstrict("unicodeTextInMathMode", "Latin-1/Unicode text character \"" + text[0] + "\" used in " + "math mode", nucleus); - } - - var group = src_symbols[this.mode][text].group; - var loc = SourceLocation.range(nucleus); - var s; - - if (ATOMS.hasOwnProperty(group)) { - // $FlowFixMe - var family = group; - s = { - type: "atom", - mode: this.mode, - family: family, - loc: loc, - text: text - }; - } else { - // $FlowFixMe - s = { - type: group, - mode: this.mode, - loc: loc, - text: text - }; - } - - symbol = s; - } else if (text.charCodeAt(0) >= 0x80) { - // no symbol for e.g. ^ - if (this.settings.strict) { - if (!supportedCodepoint(text.charCodeAt(0))) { - this.settings.reportNonstrict("unknownSymbol", "Unrecognized Unicode character \"" + text[0] + "\"" + (" (" + text.charCodeAt(0) + ")"), nucleus); - } else if (this.mode === "math") { - this.settings.reportNonstrict("unicodeTextInMathMode", "Unicode text character \"" + text[0] + "\" used in math mode", nucleus); - } - } // All nonmathematical Unicode characters are rendered as if they - // are in text mode (wrapped in \text) because that's what it - // takes to render them in LaTeX. Setting `mode: this.mode` is - // another natural choice (the user requested math mode), but - // this makes it more difficult for getCharacterMetrics() to - // distinguish Unicode characters without metrics and those for - // which we want to simulate the letter M. - - - symbol = { - type: "textord", - mode: "text", - loc: SourceLocation.range(nucleus), - text: text - }; - } else { - return null; // EOF, ^, _, {, }, etc. - } - - this.consume(); // Transform combining characters into accents - - if (match) { - for (var i = 0; i < match[0].length; i++) { - var accent = match[0][i]; - - if (!unicodeAccents[accent]) { - throw new src_ParseError("Unknown accent ' " + accent + "'", nucleus); - } - - var command = unicodeAccents[accent][this.mode]; - - if (!command) { - throw new src_ParseError("Accent " + accent + " unsupported in " + this.mode + " mode", nucleus); - } - - symbol = { - type: "accent", - mode: this.mode, - loc: SourceLocation.range(nucleus), - label: command, - isStretchy: false, - isShifty: true, - base: symbol - }; - } - } - - return symbol; - }; - - return Parser; -}(); - -Parser_Parser.endOfExpression = ["}", "\\endgroup", "\\end", "\\right", "&"]; -Parser_Parser.endOfGroup = { - "[": "]", - "{": "}", - "\\begingroup": "\\endgroup" - /** - * Parses an "expression", which is a list of atoms. - * - * `breakOnInfix`: Should the parsing stop when we hit infix nodes? This - * happens when functions have higher precendence han infix - * nodes in implicit parses. - * - * `breakOnTokenText`: The text of the token that the expression should end - * with, or `null` if something else should end the - * expression. - */ - -}; -Parser_Parser.SUPSUB_GREEDINESS = 1; - -// CONCATENATED MODULE: ./src/parseTree.js -/** - * Provides a single function for parsing an expression using a Parser - * TODO(emily): Remove this - */ - - - -/** - * Parses an expression using a Parser, then returns the parsed result. - */ -var parseTree_parseTree = function parseTree(toParse, settings) { - if (!(typeof toParse === 'string' || toParse instanceof String)) { - throw new TypeError('KaTeX can only parse string typed expression'); - } - - var parser = new Parser_Parser(toParse, settings); // Blank out any \df@tag to avoid spurious "Duplicate \tag" errors - - delete parser.gullet.macros.current["\\df@tag"]; - var tree = parser.parse(); // If the input used \tag, it will set the \df@tag macro to the tag. - // In this case, we separately parse the tag and wrap the tree. - - if (parser.gullet.macros.get("\\df@tag")) { - if (!settings.displayMode) { - throw new src_ParseError("\\tag works only in display equations"); - } - - parser.gullet.feed("\\df@tag"); - tree = [{ - type: "tag", - mode: "text", - body: tree, - tag: parser.parse() - }]; - } - - return tree; -}; - -/* harmony default export */ var src_parseTree = (parseTree_parseTree); -// CONCATENATED MODULE: ./katex.js -/* eslint no-console:0 */ - -/** - * This is the main entry point for KaTeX. Here, we expose functions for - * rendering expressions either to DOM nodes or to markup strings. - * - * We also expose the ParseError class to check if errors thrown from KaTeX are - * errors in the expression, or errors in javascript handling. - */ - - - - - - - - - - -/** - * Parse and build an expression, and place that expression in the DOM node - * given. - */ -var katex_render = function render(expression, baseNode, options) { - baseNode.textContent = ""; - var node = katex_renderToDomTree(expression, options).toNode(); - baseNode.appendChild(node); -}; // KaTeX's styles don't work properly in quirks mode. Print out an error, and -// disable rendering. - - -if (typeof document !== "undefined") { - if (document.compatMode !== "CSS1Compat") { - typeof console !== "undefined" && console.warn("Warning: KaTeX doesn't work in quirks mode. Make sure your " + "website has a suitable doctype."); - - katex_render = function render() { - throw new src_ParseError("KaTeX doesn't work in quirks mode."); - }; - } -} -/** - * Parse and build an expression, and return the markup for that. - */ - - -var renderToString = function renderToString(expression, options) { - var markup = katex_renderToDomTree(expression, options).toMarkup(); - return markup; -}; -/** - * Parse an expression and return the parse tree. - */ - - -var katex_generateParseTree = function generateParseTree(expression, options) { - var settings = new Settings_Settings(options); - return src_parseTree(expression, settings); -}; -/** - * If the given error is a KaTeX ParseError and options.throwOnError is false, - * renders the invalid LaTeX as a span with hover title giving the KaTeX - * error message. Otherwise, simply throws the error. - */ - - -var katex_renderError = function renderError(error, expression, options) { - if (options.throwOnError || !(error instanceof src_ParseError)) { - throw error; - } - - var node = buildCommon.makeSpan(["katex-error"], [new domTree_SymbolNode(expression)]); - node.setAttribute("title", error.toString()); - node.setAttribute("style", "color:" + options.errorColor); - return node; -}; -/** - * Generates and returns the katex build tree. This is used for advanced - * use cases (like rendering to custom output). - */ - - -var katex_renderToDomTree = function renderToDomTree(expression, options) { - var settings = new Settings_Settings(options); - - try { - var tree = src_parseTree(expression, settings); - return buildTree_buildTree(tree, expression, settings); - } catch (error) { - return katex_renderError(error, expression, settings); - } -}; -/** - * Generates and returns the katex build tree, with just HTML (no MathML). - * This is used for advanced use cases (like rendering to custom output). - */ - - -var katex_renderToHTMLTree = function renderToHTMLTree(expression, options) { - var settings = new Settings_Settings(options); - - try { - var tree = src_parseTree(expression, settings); - return buildTree_buildHTMLTree(tree, expression, settings); - } catch (error) { - return katex_renderError(error, expression, settings); - } -}; - -/* harmony default export */ var katex_0 = ({ - /** - * Current KaTeX version - */ - version: "0.12.0", - - /** - * Renders the given LaTeX into an HTML+MathML combination, and adds - * it as a child to the specified DOM node. - */ - render: katex_render, - - /** - * Renders the given LaTeX into an HTML+MathML combination string, - * for sending to the client. - */ - renderToString: renderToString, - - /** - * KaTeX error, usually during parsing. - */ - ParseError: src_ParseError, - - /** - * Parses the given LaTeX into KaTeX's internal parse tree structure, - * without rendering to HTML or MathML. - * - * NOTE: This method is not currently recommended for public use. - * The internal tree representation is unstable and is very likely - * to change. Use at your own risk. - */ - __parse: katex_generateParseTree, - - /** - * Renders the given LaTeX into an HTML+MathML internal DOM tree - * representation, without flattening that representation to a string. - * - * NOTE: This method is not currently recommended for public use. - * The internal tree representation is unstable and is very likely - * to change. Use at your own risk. - */ - __renderToDomTree: katex_renderToDomTree, - - /** - * Renders the given LaTeX into an HTML internal DOM tree representation, - * without MathML and without flattening that representation to a string. - * - * NOTE: This method is not currently recommended for public use. - * The internal tree representation is unstable and is very likely - * to change. Use at your own risk. - */ - __renderToHTMLTree: katex_renderToHTMLTree, - - /** - * extends internal font metrics object with a new object - * each key in the new object represents a font name - */ - __setFontMetrics: setFontMetrics, - - /** - * adds a new symbol to builtin symbols table - */ - __defineSymbol: defineSymbol, - - /** - * adds a new macro to builtin macro list - */ - __defineMacro: defineMacro, - - /** - * Expose the dom tree node types, which can be useful for type checking nodes. - * - * NOTE: This method is not currently recommended for public use. - * The internal tree representation is unstable and is very likely - * to change. Use at your own risk. - */ - __domTree: { - Span: domTree_Span, - Anchor: domTree_Anchor, - SymbolNode: domTree_SymbolNode, - SvgNode: SvgNode, - PathNode: domTree_PathNode, - LineNode: LineNode - } -}); -// CONCATENATED MODULE: ./katex.webpack.js -/** - * This is the webpack entry point for KaTeX. As ECMAScript, flow[1] and jest[2] - * doesn't support CSS modules natively, a separate entry point is used and - * it is not flowtyped. - * - * [1] https://gist.github.com/lambdahands/d19e0da96285b749f0ef - * [2] https://facebook.github.io/jest/docs/en/webpack.html - */ - - -/* harmony default export */ var katex_webpack = __webpack_exports__["default"] = (katex_0); - -/***/ }) -/******/ ])["default"]; -}); -}); - -var immutable = extend$2; - -var hasOwnProperty = Object.prototype.hasOwnProperty; - -function extend$2() { - var target = {}; - - for (var i = 0; i < arguments.length; i++) { - var source = arguments[i]; - - for (var key in source) { - if (hasOwnProperty.call(source, key)) { - target[key] = source[key]; - } - } - } - - return target -} - -var schema$1 = Schema$2; - -var proto$1 = Schema$2.prototype; - -proto$1.space = null; -proto$1.normal = {}; -proto$1.property = {}; - -function Schema$2(property, normal, space) { - this.property = property; - this.normal = normal; - - if (space) { - this.space = space; - } -} - -var merge_1 = merge$1; - -function merge$1(definitions) { - var length = definitions.length; - var property = []; - var normal = []; - var index = -1; - var info; - var space; - - while (++index < length) { - info = definitions[index]; - property.push(info.property); - normal.push(info.normal); - space = info.space; - } - - return new schema$1( - immutable.apply(null, property), - immutable.apply(null, normal), - space - ) -} - -var normalize_1 = normalize; - -function normalize(value) { - return value.toLowerCase() -} - -var info$1 = Info; - -var proto$2 = Info.prototype; - -proto$2.space = null; -proto$2.attribute = null; -proto$2.property = null; -proto$2.boolean = false; -proto$2.booleanish = false; -proto$2.overloadedBoolean = false; -proto$2.number = false; -proto$2.commaSeparated = false; -proto$2.spaceSeparated = false; -proto$2.commaOrSpaceSeparated = false; -proto$2.mustUseProperty = false; -proto$2.defined = false; - -function Info(property, attribute) { - this.property = property; - this.attribute = attribute; -} - -var powers = 0; - -var boolean_1 = increment(); -var booleanish = increment(); -var overloadedBoolean = increment(); -var number = increment(); -var spaceSeparated = increment(); -var commaSeparated = increment(); -var commaOrSpaceSeparated = increment(); - -function increment() { - return Math.pow(2, ++powers) -} - -var types = { - boolean: boolean_1, - booleanish: booleanish, - overloadedBoolean: overloadedBoolean, - number: number, - spaceSeparated: spaceSeparated, - commaSeparated: commaSeparated, - commaOrSpaceSeparated: commaOrSpaceSeparated -}; - -var definedInfo = DefinedInfo; - -DefinedInfo.prototype = new info$1(); -DefinedInfo.prototype.defined = true; - -var checks = [ - 'boolean', - 'booleanish', - 'overloadedBoolean', - 'number', - 'commaSeparated', - 'spaceSeparated', - 'commaOrSpaceSeparated' -]; -var checksLength = checks.length; - -function DefinedInfo(property, attribute, mask, space) { - var index = -1; - var check; - - mark(this, 'space', space); - - info$1.call(this, property, attribute); - - while (++index < checksLength) { - check = checks[index]; - mark(this, check, (mask & types[check]) === types[check]); - } -} - -function mark(values, key, value) { - if (value) { - values[key] = value; - } -} - -var create_1 = create$4; - -function create$4(definition) { - var space = definition.space; - var mustUseProperty = definition.mustUseProperty || []; - var attributes = definition.attributes || {}; - var props = definition.properties; - var transform = definition.transform; - var property = {}; - var normal = {}; - var prop; - var info; - - for (prop in props) { - info = new definedInfo( - prop, - transform(attributes, prop), - props[prop], - space - ); - - if (mustUseProperty.indexOf(prop) !== -1) { - info.mustUseProperty = true; - } - - property[prop] = info; - - normal[normalize_1(prop)] = prop; - normal[normalize_1(info.attribute)] = prop; - } - - return new schema$1(property, normal, space) -} - -var xlink = create_1({ - space: 'xlink', - transform: xlinkTransform, - properties: { - xLinkActuate: null, - xLinkArcRole: null, - xLinkHref: null, - xLinkRole: null, - xLinkShow: null, - xLinkTitle: null, - xLinkType: null - } -}); - -function xlinkTransform(_, prop) { - return 'xlink:' + prop.slice(5).toLowerCase() -} - -var xml = create_1({ - space: 'xml', - transform: xmlTransform, - properties: { - xmlLang: null, - xmlBase: null, - xmlSpace: null - } -}); - -function xmlTransform(_, prop) { - return 'xml:' + prop.slice(3).toLowerCase() -} - -var caseSensitiveTransform_1 = caseSensitiveTransform; - -function caseSensitiveTransform(attributes, attribute) { - return attribute in attributes ? attributes[attribute] : attribute -} - -var caseInsensitiveTransform_1 = caseInsensitiveTransform; - -function caseInsensitiveTransform(attributes, property) { - return caseSensitiveTransform_1(attributes, property.toLowerCase()) -} - -var xmlns = create_1({ - space: 'xmlns', - attributes: { - xmlnsxlink: 'xmlns:xlink' - }, - transform: caseInsensitiveTransform_1, - properties: { - xmlns: null, - xmlnsXLink: null - } -}); - -var booleanish$1 = types.booleanish; -var number$1 = types.number; -var spaceSeparated$1 = types.spaceSeparated; - -var aria = create_1({ - transform: ariaTransform, - properties: { - ariaActiveDescendant: null, - ariaAtomic: booleanish$1, - ariaAutoComplete: null, - ariaBusy: booleanish$1, - ariaChecked: booleanish$1, - ariaColCount: number$1, - ariaColIndex: number$1, - ariaColSpan: number$1, - ariaControls: spaceSeparated$1, - ariaCurrent: null, - ariaDescribedBy: spaceSeparated$1, - ariaDetails: null, - ariaDisabled: booleanish$1, - ariaDropEffect: spaceSeparated$1, - ariaErrorMessage: null, - ariaExpanded: booleanish$1, - ariaFlowTo: spaceSeparated$1, - ariaGrabbed: booleanish$1, - ariaHasPopup: null, - ariaHidden: booleanish$1, - ariaInvalid: null, - ariaKeyShortcuts: null, - ariaLabel: null, - ariaLabelledBy: spaceSeparated$1, - ariaLevel: number$1, - ariaLive: null, - ariaModal: booleanish$1, - ariaMultiLine: booleanish$1, - ariaMultiSelectable: booleanish$1, - ariaOrientation: null, - ariaOwns: spaceSeparated$1, - ariaPlaceholder: null, - ariaPosInSet: number$1, - ariaPressed: booleanish$1, - ariaReadOnly: booleanish$1, - ariaRelevant: null, - ariaRequired: booleanish$1, - ariaRoleDescription: spaceSeparated$1, - ariaRowCount: number$1, - ariaRowIndex: number$1, - ariaRowSpan: number$1, - ariaSelected: booleanish$1, - ariaSetSize: number$1, - ariaSort: null, - ariaValueMax: number$1, - ariaValueMin: number$1, - ariaValueNow: number$1, - ariaValueText: null, - role: null - } -}); - -function ariaTransform(_, prop) { - return prop === 'role' ? prop : 'aria-' + prop.slice(4).toLowerCase() -} - -var boolean = types.boolean; -var number$2 = types.number; -var spaceSeparated$2 = types.spaceSeparated; -var commaSeparated$1 = types.commaSeparated; -var commaOrSpaceSeparated$1 = types.commaOrSpaceSeparated; - -var svg = create_1({ - space: 'svg', - attributes: { - accentHeight: 'accent-height', - alignmentBaseline: 'alignment-baseline', - arabicForm: 'arabic-form', - baselineShift: 'baseline-shift', - capHeight: 'cap-height', - className: 'class', - clipPath: 'clip-path', - clipRule: 'clip-rule', - colorInterpolation: 'color-interpolation', - colorInterpolationFilters: 'color-interpolation-filters', - colorProfile: 'color-profile', - colorRendering: 'color-rendering', - crossOrigin: 'crossorigin', - dataType: 'datatype', - dominantBaseline: 'dominant-baseline', - enableBackground: 'enable-background', - fillOpacity: 'fill-opacity', - fillRule: 'fill-rule', - floodColor: 'flood-color', - floodOpacity: 'flood-opacity', - fontFamily: 'font-family', - fontSize: 'font-size', - fontSizeAdjust: 'font-size-adjust', - fontStretch: 'font-stretch', - fontStyle: 'font-style', - fontVariant: 'font-variant', - fontWeight: 'font-weight', - glyphName: 'glyph-name', - glyphOrientationHorizontal: 'glyph-orientation-horizontal', - glyphOrientationVertical: 'glyph-orientation-vertical', - hrefLang: 'hreflang', - horizAdvX: 'horiz-adv-x', - horizOriginX: 'horiz-origin-x', - horizOriginY: 'horiz-origin-y', - imageRendering: 'image-rendering', - letterSpacing: 'letter-spacing', - lightingColor: 'lighting-color', - markerEnd: 'marker-end', - markerMid: 'marker-mid', - markerStart: 'marker-start', - navDown: 'nav-down', - navDownLeft: 'nav-down-left', - navDownRight: 'nav-down-right', - navLeft: 'nav-left', - navNext: 'nav-next', - navPrev: 'nav-prev', - navRight: 'nav-right', - navUp: 'nav-up', - navUpLeft: 'nav-up-left', - navUpRight: 'nav-up-right', - onAbort: 'onabort', - onActivate: 'onactivate', - onAfterPrint: 'onafterprint', - onBeforePrint: 'onbeforeprint', - onBegin: 'onbegin', - onCancel: 'oncancel', - onCanPlay: 'oncanplay', - onCanPlayThrough: 'oncanplaythrough', - onChange: 'onchange', - onClick: 'onclick', - onClose: 'onclose', - onCopy: 'oncopy', - onCueChange: 'oncuechange', - onCut: 'oncut', - onDblClick: 'ondblclick', - onDrag: 'ondrag', - onDragEnd: 'ondragend', - onDragEnter: 'ondragenter', - onDragExit: 'ondragexit', - onDragLeave: 'ondragleave', - onDragOver: 'ondragover', - onDragStart: 'ondragstart', - onDrop: 'ondrop', - onDurationChange: 'ondurationchange', - onEmptied: 'onemptied', - onEnd: 'onend', - onEnded: 'onended', - onError: 'onerror', - onFocus: 'onfocus', - onFocusIn: 'onfocusin', - onFocusOut: 'onfocusout', - onHashChange: 'onhashchange', - onInput: 'oninput', - onInvalid: 'oninvalid', - onKeyDown: 'onkeydown', - onKeyPress: 'onkeypress', - onKeyUp: 'onkeyup', - onLoad: 'onload', - onLoadedData: 'onloadeddata', - onLoadedMetadata: 'onloadedmetadata', - onLoadStart: 'onloadstart', - onMessage: 'onmessage', - onMouseDown: 'onmousedown', - onMouseEnter: 'onmouseenter', - onMouseLeave: 'onmouseleave', - onMouseMove: 'onmousemove', - onMouseOut: 'onmouseout', - onMouseOver: 'onmouseover', - onMouseUp: 'onmouseup', - onMouseWheel: 'onmousewheel', - onOffline: 'onoffline', - onOnline: 'ononline', - onPageHide: 'onpagehide', - onPageShow: 'onpageshow', - onPaste: 'onpaste', - onPause: 'onpause', - onPlay: 'onplay', - onPlaying: 'onplaying', - onPopState: 'onpopstate', - onProgress: 'onprogress', - onRateChange: 'onratechange', - onRepeat: 'onrepeat', - onReset: 'onreset', - onResize: 'onresize', - onScroll: 'onscroll', - onSeeked: 'onseeked', - onSeeking: 'onseeking', - onSelect: 'onselect', - onShow: 'onshow', - onStalled: 'onstalled', - onStorage: 'onstorage', - onSubmit: 'onsubmit', - onSuspend: 'onsuspend', - onTimeUpdate: 'ontimeupdate', - onToggle: 'ontoggle', - onUnload: 'onunload', - onVolumeChange: 'onvolumechange', - onWaiting: 'onwaiting', - onZoom: 'onzoom', - overlinePosition: 'overline-position', - overlineThickness: 'overline-thickness', - paintOrder: 'paint-order', - panose1: 'panose-1', - pointerEvents: 'pointer-events', - referrerPolicy: 'referrerpolicy', - renderingIntent: 'rendering-intent', - shapeRendering: 'shape-rendering', - stopColor: 'stop-color', - stopOpacity: 'stop-opacity', - strikethroughPosition: 'strikethrough-position', - strikethroughThickness: 'strikethrough-thickness', - strokeDashArray: 'stroke-dasharray', - strokeDashOffset: 'stroke-dashoffset', - strokeLineCap: 'stroke-linecap', - strokeLineJoin: 'stroke-linejoin', - strokeMiterLimit: 'stroke-miterlimit', - strokeOpacity: 'stroke-opacity', - strokeWidth: 'stroke-width', - tabIndex: 'tabindex', - textAnchor: 'text-anchor', - textDecoration: 'text-decoration', - textRendering: 'text-rendering', - typeOf: 'typeof', - underlinePosition: 'underline-position', - underlineThickness: 'underline-thickness', - unicodeBidi: 'unicode-bidi', - unicodeRange: 'unicode-range', - unitsPerEm: 'units-per-em', - vAlphabetic: 'v-alphabetic', - vHanging: 'v-hanging', - vIdeographic: 'v-ideographic', - vMathematical: 'v-mathematical', - vectorEffect: 'vector-effect', - vertAdvY: 'vert-adv-y', - vertOriginX: 'vert-origin-x', - vertOriginY: 'vert-origin-y', - wordSpacing: 'word-spacing', - writingMode: 'writing-mode', - xHeight: 'x-height', - // These were camelcased in Tiny. Now lowercased in SVG 2 - playbackOrder: 'playbackorder', - timelineBegin: 'timelinebegin' - }, - transform: caseSensitiveTransform_1, - properties: { - about: commaOrSpaceSeparated$1, - accentHeight: number$2, - accumulate: null, - additive: null, - alignmentBaseline: null, - alphabetic: number$2, - amplitude: number$2, - arabicForm: null, - ascent: number$2, - attributeName: null, - attributeType: null, - azimuth: number$2, - bandwidth: null, - baselineShift: null, - baseFrequency: null, - baseProfile: null, - bbox: null, - begin: null, - bias: number$2, - by: null, - calcMode: null, - capHeight: number$2, - className: spaceSeparated$2, - clip: null, - clipPath: null, - clipPathUnits: null, - clipRule: null, - color: null, - colorInterpolation: null, - colorInterpolationFilters: null, - colorProfile: null, - colorRendering: null, - content: null, - contentScriptType: null, - contentStyleType: null, - crossOrigin: null, - cursor: null, - cx: null, - cy: null, - d: null, - dataType: null, - defaultAction: null, - descent: number$2, - diffuseConstant: number$2, - direction: null, - display: null, - dur: null, - divisor: number$2, - dominantBaseline: null, - download: boolean, - dx: null, - dy: null, - edgeMode: null, - editable: null, - elevation: number$2, - enableBackground: null, - end: null, - event: null, - exponent: number$2, - externalResourcesRequired: null, - fill: null, - fillOpacity: number$2, - fillRule: null, - filter: null, - filterRes: null, - filterUnits: null, - floodColor: null, - floodOpacity: null, - focusable: null, - focusHighlight: null, - fontFamily: null, - fontSize: null, - fontSizeAdjust: null, - fontStretch: null, - fontStyle: null, - fontVariant: null, - fontWeight: null, - format: null, - fr: null, - from: null, - fx: null, - fy: null, - g1: commaSeparated$1, - g2: commaSeparated$1, - glyphName: commaSeparated$1, - glyphOrientationHorizontal: null, - glyphOrientationVertical: null, - glyphRef: null, - gradientTransform: null, - gradientUnits: null, - handler: null, - hanging: number$2, - hatchContentUnits: null, - hatchUnits: null, - height: null, - href: null, - hrefLang: null, - horizAdvX: number$2, - horizOriginX: number$2, - horizOriginY: number$2, - id: null, - ideographic: number$2, - imageRendering: null, - initialVisibility: null, - in: null, - in2: null, - intercept: number$2, - k: number$2, - k1: number$2, - k2: number$2, - k3: number$2, - k4: number$2, - kernelMatrix: commaOrSpaceSeparated$1, - kernelUnitLength: null, - keyPoints: null, // SEMI_COLON_SEPARATED - keySplines: null, // SEMI_COLON_SEPARATED - keyTimes: null, // SEMI_COLON_SEPARATED - kerning: null, - lang: null, - lengthAdjust: null, - letterSpacing: null, - lightingColor: null, - limitingConeAngle: number$2, - local: null, - markerEnd: null, - markerMid: null, - markerStart: null, - markerHeight: null, - markerUnits: null, - markerWidth: null, - mask: null, - maskContentUnits: null, - maskUnits: null, - mathematical: null, - max: null, - media: null, - mediaCharacterEncoding: null, - mediaContentEncodings: null, - mediaSize: number$2, - mediaTime: null, - method: null, - min: null, - mode: null, - name: null, - navDown: null, - navDownLeft: null, - navDownRight: null, - navLeft: null, - navNext: null, - navPrev: null, - navRight: null, - navUp: null, - navUpLeft: null, - navUpRight: null, - numOctaves: null, - observer: null, - offset: null, - onAbort: null, - onActivate: null, - onAfterPrint: null, - onBeforePrint: null, - onBegin: null, - onCancel: null, - onCanPlay: null, - onCanPlayThrough: null, - onChange: null, - onClick: null, - onClose: null, - onCopy: null, - onCueChange: null, - onCut: null, - onDblClick: null, - onDrag: null, - onDragEnd: null, - onDragEnter: null, - onDragExit: null, - onDragLeave: null, - onDragOver: null, - onDragStart: null, - onDrop: null, - onDurationChange: null, - onEmptied: null, - onEnd: null, - onEnded: null, - onError: null, - onFocus: null, - onFocusIn: null, - onFocusOut: null, - onHashChange: null, - onInput: null, - onInvalid: null, - onKeyDown: null, - onKeyPress: null, - onKeyUp: null, - onLoad: null, - onLoadedData: null, - onLoadedMetadata: null, - onLoadStart: null, - onMessage: null, - onMouseDown: null, - onMouseEnter: null, - onMouseLeave: null, - onMouseMove: null, - onMouseOut: null, - onMouseOver: null, - onMouseUp: null, - onMouseWheel: null, - onOffline: null, - onOnline: null, - onPageHide: null, - onPageShow: null, - onPaste: null, - onPause: null, - onPlay: null, - onPlaying: null, - onPopState: null, - onProgress: null, - onRateChange: null, - onRepeat: null, - onReset: null, - onResize: null, - onScroll: null, - onSeeked: null, - onSeeking: null, - onSelect: null, - onShow: null, - onStalled: null, - onStorage: null, - onSubmit: null, - onSuspend: null, - onTimeUpdate: null, - onToggle: null, - onUnload: null, - onVolumeChange: null, - onWaiting: null, - onZoom: null, - opacity: null, - operator: null, - order: null, - orient: null, - orientation: null, - origin: null, - overflow: null, - overlay: null, - overlinePosition: number$2, - overlineThickness: number$2, - paintOrder: null, - panose1: null, - path: null, - pathLength: number$2, - patternContentUnits: null, - patternTransform: null, - patternUnits: null, - phase: null, - ping: spaceSeparated$2, - pitch: null, - playbackOrder: null, - pointerEvents: null, - points: null, - pointsAtX: number$2, - pointsAtY: number$2, - pointsAtZ: number$2, - preserveAlpha: null, - preserveAspectRatio: null, - primitiveUnits: null, - propagate: null, - property: commaOrSpaceSeparated$1, - r: null, - radius: null, - referrerPolicy: null, - refX: null, - refY: null, - rel: commaOrSpaceSeparated$1, - rev: commaOrSpaceSeparated$1, - renderingIntent: null, - repeatCount: null, - repeatDur: null, - requiredExtensions: commaOrSpaceSeparated$1, - requiredFeatures: commaOrSpaceSeparated$1, - requiredFonts: commaOrSpaceSeparated$1, - requiredFormats: commaOrSpaceSeparated$1, - resource: null, - restart: null, - result: null, - rotate: null, - rx: null, - ry: null, - scale: null, - seed: null, - shapeRendering: null, - side: null, - slope: null, - snapshotTime: null, - specularConstant: number$2, - specularExponent: number$2, - spreadMethod: null, - spacing: null, - startOffset: null, - stdDeviation: null, - stemh: null, - stemv: null, - stitchTiles: null, - stopColor: null, - stopOpacity: null, - strikethroughPosition: number$2, - strikethroughThickness: number$2, - string: null, - stroke: null, - strokeDashArray: commaOrSpaceSeparated$1, - strokeDashOffset: null, - strokeLineCap: null, - strokeLineJoin: null, - strokeMiterLimit: number$2, - strokeOpacity: number$2, - strokeWidth: null, - style: null, - surfaceScale: number$2, - syncBehavior: null, - syncBehaviorDefault: null, - syncMaster: null, - syncTolerance: null, - syncToleranceDefault: null, - systemLanguage: commaOrSpaceSeparated$1, - tabIndex: number$2, - tableValues: null, - target: null, - targetX: number$2, - targetY: number$2, - textAnchor: null, - textDecoration: null, - textRendering: null, - textLength: null, - timelineBegin: null, - title: null, - transformBehavior: null, - type: null, - typeOf: commaOrSpaceSeparated$1, - to: null, - transform: null, - u1: null, - u2: null, - underlinePosition: number$2, - underlineThickness: number$2, - unicode: null, - unicodeBidi: null, - unicodeRange: null, - unitsPerEm: number$2, - values: null, - vAlphabetic: number$2, - vMathematical: number$2, - vectorEffect: null, - vHanging: number$2, - vIdeographic: number$2, - version: null, - vertAdvY: number$2, - vertOriginX: number$2, - vertOriginY: number$2, - viewBox: null, - viewTarget: null, - visibility: null, - width: null, - widths: null, - wordSpacing: null, - writingMode: null, - x: null, - x1: null, - x2: null, - xChannelSelector: null, - xHeight: number$2, - y: null, - y1: null, - y2: null, - yChannelSelector: null, - z: null, - zoomAndPan: null - } -}); - -var svg_1 = merge_1([xml, xlink, xmlns, aria, svg]); - -var caseSensitive = [ - "altGlyph", - "altGlyphDef", - "altGlyphItem", - "animateColor", - "animateMotion", - "animateTransform", - "clipPath", - "feBlend", - "feColorMatrix", - "feComponentTransfer", - "feComposite", - "feConvolveMatrix", - "feDiffuseLighting", - "feDisplacementMap", - "feDistantLight", - "feDropShadow", - "feFlood", - "feFuncA", - "feFuncB", - "feFuncG", - "feFuncR", - "feGaussianBlur", - "feImage", - "feMerge", - "feMergeNode", - "feMorphology", - "feOffset", - "fePointLight", - "feSpecularLighting", - "feSpotLight", - "feTile", - "feTurbulence", - "foreignObject", - "glyphRef", - "linearGradient", - "radialGradient", - "solidColor", - "textArea", - "textPath" -]; - -var data = 'data'; - -var find_1 = find; - -var valid = /^data[-\w.:]+$/i; -var dash$2 = /-[a-z]/g; -var cap$1 = /[A-Z]/g; - -function find(schema, value) { - var normal = normalize_1(value); - var prop = value; - var Type = info$1; - - if (normal in schema.normal) { - return schema.property[schema.normal[normal]] - } - - if (normal.length > 4 && normal.slice(0, 4) === data && valid.test(value)) { - // Attribute or property. - if (value.charAt(4) === '-') { - prop = datasetToProperty(value); - } else { - value = datasetToAttribute(value); - } - - Type = definedInfo; - } - - return new Type(prop, value) -} - -function datasetToProperty(attribute) { - var value = attribute.slice(5).replace(dash$2, camelcase); - return data + value.charAt(0).toUpperCase() + value.slice(1) -} - -function datasetToAttribute(property) { - var value = property.slice(4); - - if (dash$2.test(value)) { - return property - } - - value = value.replace(cap$1, kebab); - - if (value.charAt(0) !== '-') { - value = '-' + value; - } - - return data + value -} - -function kebab($0) { - return '-' + $0.toLowerCase() -} - -function camelcase($0) { - return $0.charAt(1).toUpperCase() -} - -var hastUtilParseSelector = parse$1; - -var search = /[#.]/g; - -// Create a hast element from a simple CSS selector. -function parse$1(selector, defaultTagName) { - var value = selector || ''; - var name = defaultTagName || 'div'; - var props = {}; - var start = 0; - var subvalue; - var previous; - var match; - - while (start < value.length) { - search.lastIndex = start; - match = search.exec(value); - subvalue = value.slice(start, match ? match.index : value.length); - - if (subvalue) { - if (!previous) { - name = subvalue; - } else if (previous === '#') { - props.id = subvalue; - } else if (props.className) { - props.className.push(subvalue); - } else { - props.className = [subvalue]; - } - - start += subvalue.length; - } - - if (match) { - previous = match[0]; - start++; - } - } - - return {type: 'element', tagName: name, properties: props, children: []} -} - -var parse_1 = parse$2; -var stringify_1$1 = stringify$2; - -var empty$1 = ''; -var space$1 = ' '; -var whiteSpace = /[ \t\n\r\f]+/g; - -function parse$2(value) { - var input = String(value || empty$1).trim(); - return input === empty$1 ? [] : input.split(whiteSpace) -} - -function stringify$2(values) { - return values.join(space$1).trim() -} - -var spaceSeparatedTokens = { - parse: parse_1, - stringify: stringify_1$1 -}; - -var parse_1$1 = parse$3; -var stringify_1$2 = stringify$3; - -var comma$1 = ','; -var space$2 = ' '; -var empty$2 = ''; - -// Parse comma-separated tokens to an array. -function parse$3(value) { - var values = []; - var input = String(value || empty$2); - var index = input.indexOf(comma$1); - var lastIndex = 0; - var end = false; - var val; - - while (!end) { - if (index === -1) { - index = input.length; - end = true; - } - - val = input.slice(lastIndex, index).trim(); - - if (val || !end) { - values.push(val); - } - - lastIndex = index + 1; - index = input.indexOf(comma$1, lastIndex); - } - - return values -} - -// Compile an array to comma-separated tokens. -// `options.padLeft` (default: `true`) pads a space left of each token, and -// `options.padRight` (default: `false`) pads a space to the right of each token. -function stringify$3(values, options) { - var settings = options || {}; - var left = settings.padLeft === false ? empty$2 : space$2; - var right = settings.padRight ? space$2 : empty$2; - - // Ensure the last empty entry is seen. - if (values[values.length - 1] === empty$2) { - values = values.concat(empty$2); - } - - return values.join(right + comma$1 + left).trim() -} - -var commaSeparatedTokens = { - parse: parse_1$1, - stringify: stringify_1$2 -}; - -var spaces = spaceSeparatedTokens.parse; -var commas = commaSeparatedTokens.parse; - -var factory_1 = factory; - -var own$7 = {}.hasOwnProperty; - -function factory(schema, defaultTagName, caseSensitive) { - var adjust = caseSensitive ? createAdjustMap(caseSensitive) : null; - - return h - - // Hyperscript compatible DSL for creating virtual hast trees. - function h(selector, properties) { - var node = hastUtilParseSelector(selector, defaultTagName); - var children = Array.prototype.slice.call(arguments, 2); - var name = node.tagName.toLowerCase(); - var property; - - node.tagName = adjust && own$7.call(adjust, name) ? adjust[name] : name; - - if (properties && isChildren(properties, node)) { - children.unshift(properties); - properties = null; - } - - if (properties) { - for (property in properties) { - addProperty(node.properties, property, properties[property]); - } - } - - addChild(node.children, children); - - if (node.tagName === 'template') { - node.content = {type: 'root', children: node.children}; - node.children = []; - } - - return node - } - - function addProperty(properties, key, value) { - var info; - var property; - var result; - - // Ignore nullish and NaN values. - if (value === null || value === undefined || value !== value) { - return - } - - info = find_1(schema, key); - property = info.property; - result = value; - - // Handle list values. - if (typeof result === 'string') { - if (info.spaceSeparated) { - result = spaces(result); - } else if (info.commaSeparated) { - result = commas(result); - } else if (info.commaOrSpaceSeparated) { - result = spaces(commas(result).join(' ')); - } - } - - // Accept `object` on style. - if (property === 'style' && typeof value !== 'string') { - result = style(result); - } - - // Class-names (which can be added both on the `selector` and here). - if (property === 'className' && properties.className) { - result = properties.className.concat(result); - } - - properties[property] = parsePrimitives(info, property, result); - } -} - -function isChildren(value, node) { - return ( - typeof value === 'string' || - 'length' in value || - isNode(node.tagName, value) - ) -} - -function isNode(tagName, value) { - var type = value.type; - - if (tagName === 'input' || !type || typeof type !== 'string') { - return false - } - - if (typeof value.children === 'object' && 'length' in value.children) { - return true - } - - type = type.toLowerCase(); - - if (tagName === 'button') { - return ( - type !== 'menu' && - type !== 'submit' && - type !== 'reset' && - type !== 'button' - ) - } - - return 'value' in value -} - -function addChild(nodes, value) { - var index; - var length; - - if (typeof value === 'string' || typeof value === 'number') { - nodes.push({type: 'text', value: String(value)}); - return - } - - if (typeof value === 'object' && 'length' in value) { - index = -1; - length = value.length; - - while (++index < length) { - addChild(nodes, value[index]); - } - - return - } - - if (typeof value !== 'object' || !('type' in value)) { - throw new Error('Expected node, nodes, or string, got `' + value + '`') - } - - nodes.push(value); -} - -// Parse a (list of) primitives. -function parsePrimitives(info, name, value) { - var index; - var length; - var result; - - if (typeof value !== 'object' || !('length' in value)) { - return parsePrimitive(info, name, value) - } - - length = value.length; - index = -1; - result = []; - - while (++index < length) { - result[index] = parsePrimitive(info, name, value[index]); - } - - return result -} - -// Parse a single primitives. -function parsePrimitive(info, name, value) { - var result = value; - - if (info.number || info.positiveNumber) { - if (!isNaN(result) && result !== '') { - result = Number(result); - } - } else if (info.boolean || info.overloadedBoolean) { - // Accept `boolean` and `string`. - if ( - typeof result === 'string' && - (result === '' || normalize_1(value) === normalize_1(name)) - ) { - result = true; - } - } - - return result -} - -function style(value) { - var result = []; - var key; - - for (key in value) { - result.push([key, value[key]].join(': ')); - } - - return result.join('; ') -} - -function createAdjustMap(values) { - var length = values.length; - var index = -1; - var result = {}; - var value; - - while (++index < length) { - value = values[index]; - result[value.toLowerCase()] = value; - } - - return result -} - -var svg$1 = factory_1(svg_1, 'g', caseSensitive); -svg$1.displayName = 'svg'; - -var svg_1$1 = svg$1; - -var boolean$1 = types.boolean; -var overloadedBoolean$1 = types.overloadedBoolean; -var booleanish$2 = types.booleanish; -var number$3 = types.number; -var spaceSeparated$3 = types.spaceSeparated; -var commaSeparated$2 = types.commaSeparated; - -var html$2 = create_1({ - space: 'html', - attributes: { - acceptcharset: 'accept-charset', - classname: 'class', - htmlfor: 'for', - httpequiv: 'http-equiv' - }, - transform: caseInsensitiveTransform_1, - mustUseProperty: ['checked', 'multiple', 'muted', 'selected'], - properties: { - // Standard Properties. - abbr: null, - accept: commaSeparated$2, - acceptCharset: spaceSeparated$3, - accessKey: spaceSeparated$3, - action: null, - allow: null, - allowFullScreen: boolean$1, - allowPaymentRequest: boolean$1, - allowUserMedia: boolean$1, - alt: null, - as: null, - async: boolean$1, - autoCapitalize: null, - autoComplete: spaceSeparated$3, - autoFocus: boolean$1, - autoPlay: boolean$1, - capture: boolean$1, - charSet: null, - checked: boolean$1, - cite: null, - className: spaceSeparated$3, - cols: number$3, - colSpan: null, - content: null, - contentEditable: booleanish$2, - controls: boolean$1, - controlsList: spaceSeparated$3, - coords: number$3 | commaSeparated$2, - crossOrigin: null, - data: null, - dateTime: null, - decoding: null, - default: boolean$1, - defer: boolean$1, - dir: null, - dirName: null, - disabled: boolean$1, - download: overloadedBoolean$1, - draggable: booleanish$2, - encType: null, - enterKeyHint: null, - form: null, - formAction: null, - formEncType: null, - formMethod: null, - formNoValidate: boolean$1, - formTarget: null, - headers: spaceSeparated$3, - height: number$3, - hidden: boolean$1, - high: number$3, - href: null, - hrefLang: null, - htmlFor: spaceSeparated$3, - httpEquiv: spaceSeparated$3, - id: null, - imageSizes: null, - imageSrcSet: commaSeparated$2, - inputMode: null, - integrity: null, - is: null, - isMap: boolean$1, - itemId: null, - itemProp: spaceSeparated$3, - itemRef: spaceSeparated$3, - itemScope: boolean$1, - itemType: spaceSeparated$3, - kind: null, - label: null, - lang: null, - language: null, - list: null, - loading: null, - loop: boolean$1, - low: number$3, - manifest: null, - max: null, - maxLength: number$3, - media: null, - method: null, - min: null, - minLength: number$3, - multiple: boolean$1, - muted: boolean$1, - name: null, - nonce: null, - noModule: boolean$1, - noValidate: boolean$1, - onAbort: null, - onAfterPrint: null, - onAuxClick: null, - onBeforePrint: null, - onBeforeUnload: null, - onBlur: null, - onCancel: null, - onCanPlay: null, - onCanPlayThrough: null, - onChange: null, - onClick: null, - onClose: null, - onContextMenu: null, - onCopy: null, - onCueChange: null, - onCut: null, - onDblClick: null, - onDrag: null, - onDragEnd: null, - onDragEnter: null, - onDragExit: null, - onDragLeave: null, - onDragOver: null, - onDragStart: null, - onDrop: null, - onDurationChange: null, - onEmptied: null, - onEnded: null, - onError: null, - onFocus: null, - onFormData: null, - onHashChange: null, - onInput: null, - onInvalid: null, - onKeyDown: null, - onKeyPress: null, - onKeyUp: null, - onLanguageChange: null, - onLoad: null, - onLoadedData: null, - onLoadedMetadata: null, - onLoadEnd: null, - onLoadStart: null, - onMessage: null, - onMessageError: null, - onMouseDown: null, - onMouseEnter: null, - onMouseLeave: null, - onMouseMove: null, - onMouseOut: null, - onMouseOver: null, - onMouseUp: null, - onOffline: null, - onOnline: null, - onPageHide: null, - onPageShow: null, - onPaste: null, - onPause: null, - onPlay: null, - onPlaying: null, - onPopState: null, - onProgress: null, - onRateChange: null, - onRejectionHandled: null, - onReset: null, - onResize: null, - onScroll: null, - onSecurityPolicyViolation: null, - onSeeked: null, - onSeeking: null, - onSelect: null, - onSlotChange: null, - onStalled: null, - onStorage: null, - onSubmit: null, - onSuspend: null, - onTimeUpdate: null, - onToggle: null, - onUnhandledRejection: null, - onUnload: null, - onVolumeChange: null, - onWaiting: null, - onWheel: null, - open: boolean$1, - optimum: number$3, - pattern: null, - ping: spaceSeparated$3, - placeholder: null, - playsInline: boolean$1, - poster: null, - preload: null, - readOnly: boolean$1, - referrerPolicy: null, - rel: spaceSeparated$3, - required: boolean$1, - reversed: boolean$1, - rows: number$3, - rowSpan: number$3, - sandbox: spaceSeparated$3, - scope: null, - scoped: boolean$1, - seamless: boolean$1, - selected: boolean$1, - shape: null, - size: number$3, - sizes: null, - slot: null, - span: number$3, - spellCheck: booleanish$2, - src: null, - srcDoc: null, - srcLang: null, - srcSet: commaSeparated$2, - start: number$3, - step: null, - style: null, - tabIndex: number$3, - target: null, - title: null, - translate: null, - type: null, - typeMustMatch: boolean$1, - useMap: null, - value: booleanish$2, - width: number$3, - wrap: null, - - // Legacy. - // See: https://html.spec.whatwg.org/#other-elements,-attributes-and-apis - align: null, // Several. Use CSS `text-align` instead, - aLink: null, // ``. Use CSS `a:active {color}` instead - archive: spaceSeparated$3, // ``. List of URIs to archives - axis: null, // `` and ``. Use `scope` on `` - background: null, // ``. Use CSS `background-image` instead - bgColor: null, // `` and table elements. Use CSS `background-color` instead - border: number$3, // ``. Use CSS `border-width` instead, - borderColor: null, // `
`. Use CSS `border-color` instead, - bottomMargin: number$3, // `` - cellPadding: null, // `
` - cellSpacing: null, // `
` - char: null, // Several table elements. When `align=char`, sets the character to align on - charOff: null, // Several table elements. When `char`, offsets the alignment - classId: null, // `` - clear: null, // `
`. Use CSS `clear` instead - code: null, // `` - codeBase: null, // `` - codeType: null, // `` - color: null, // `` and `
`. Use CSS instead - compact: boolean$1, // Lists. Use CSS to reduce space between items instead - declare: boolean$1, // `` - event: null, // `",o=o.removeChild(o.firstChild)):typeof d.is=="string"?o=S.createElement(l,{is:d.is}):(o=S.createElement(l),l==="select"&&(S=o,d.multiple?S.multiple=!0:d.size&&(S.size=d.size))):o=S.createElementNS(o,l),o[Kr]=i,o[ac]=d,Kv(o,i,!1,!1),i.stateNode=o,S=zd(l,d),l){case"dialog":vt("cancel",o),vt("close",o),h=d;break;case"iframe":case"object":case"embed":vt("load",o),h=d;break;case"video":case"audio":for(h=0;hKp&&(i.flags|=64,v=!0,xl(d,!1),i.lanes=33554432)}else{if(!v)if(o=bc(S),o!==null){if(i.flags|=64,v=!0,l=o.updateQueue,l!==null&&(i.updateQueue=l,i.flags|=4),xl(d,!0),d.tail===null&&d.tailMode==="hidden"&&!S.alternate&&!or)return i=i.lastEffect=d.lastEffect,i!==null&&(i.nextEffect=null),null}else 2*Xt()-d.renderingStartTime>Kp&&l!==1073741824&&(i.flags|=64,v=!0,xl(d,!1),i.lanes=33554432);d.isBackwards?(S.sibling=i.child,i.child=S):(l=d.last,l!==null?l.sibling=S:i.child=S,d.last=S)}return d.tail!==null?(l=d.tail,d.rendering=l,d.tail=l.sibling,d.lastEffect=i.lastEffect,d.renderingStartTime=Xt(),l.sibling=null,i=Ct.current,St(Ct,v?i&1|2:i&1),l):null;case 23:case 24:return Yp(),o!==null&&o.memoizedState!==null!=(i.memoizedState!==null)&&d.mode!=="unstable-defer-without-hiding"&&(i.flags|=4),null}throw Error(re(156,i.tag))}function Dx(o){switch(o.tag){case 1:fn(o.type)&&lc();var i=o.flags;return i&4096?(o.flags=i&-4097|64,o):null;case 3:if(Hi(),yt(pn),yt(Yt),Lp(),i=o.flags,(i&64)!=0)throw Error(re(285));return o.flags=i&-4097|64,o;case 5:return Tp(o),null;case 13:return yt(Ct),i=o.flags,i&4096?(o.flags=i&-4097|64,o):null;case 19:return yt(Ct),null;case 4:return Hi(),null;case 10:return kp(o),null;case 23:case 24:return Yp(),null;default:return null}}function Xp(o,i){try{var l="",d=i;do l+=f3(d),d=d.return;while(d);var h=l}catch(v){h=` -Error generating stack: `+v.message+` -`+v.stack}return{value:o,source:i,stack:h}}function Jp(o,i){try{console.error(i.value)}catch(l){setTimeout(function(){throw l})}}var zx=typeof WeakMap=="function"?WeakMap:Map;function Jv(o,i,l){l=qr(-1,l),l.tag=3,l.payload={element:null};var d=i.value;return l.callback=function(){Tc||(Tc=!0,qp=d),Jp(o,i)},l}function qv(o,i,l){l=qr(-1,l),l.tag=3;var d=o.type.getDerivedStateFromError;if(typeof d=="function"){var h=i.value;l.payload=function(){return Jp(o,i),d(h)}}var v=o.stateNode;return v!==null&&typeof v.componentDidCatch=="function"&&(l.callback=function(){typeof d!="function"&&(ar===null?ar=new Set([this]):ar.add(this),Jp(o,i));var S=i.stack;this.componentDidCatch(i.value,{componentStack:S!==null?S:""})}),l}var Nx=typeof WeakSet=="function"?WeakSet:Set;function Qv(o){var i=o.ref;if(i!==null)if(typeof i=="function")try{i(null)}catch(l){no(o,l)}else i.current=null}function jx(o,i){switch(i.tag){case 0:case 11:case 15:case 22:return;case 1:if(i.flags&256&&o!==null){var l=o.memoizedProps,d=o.memoizedState;o=i.stateNode,i=o.getSnapshotBeforeUpdate(i.elementType===i.type?l:Yn(i.type,l),d),o.__reactInternalSnapshotBeforeUpdate=i}return;case 3:i.flags&256&&fp(i.stateNode.containerInfo);return;case 5:case 6:case 4:case 17:return}throw Error(re(163))}function Fx(o,i,l){switch(l.tag){case 0:case 11:case 15:case 22:if(i=l.updateQueue,i=i!==null?i.lastEffect:null,i!==null){o=i=i.next;do{if((o.tag&3)==3){var d=o.create;o.destroy=d()}o=o.next}while(o!==i)}if(i=l.updateQueue,i=i!==null?i.lastEffect:null,i!==null){o=i=i.next;do{var h=o;d=h.next,h=h.tag,(h&4)!=0&&(h&1)!=0&&(_v(l,o),Rx(l,o)),o=d}while(o!==i)}return;case 1:o=l.stateNode,l.flags&4&&(i===null?o.componentDidMount():(d=l.elementType===l.type?i.memoizedProps:Yn(l.type,i.memoizedProps),o.componentDidUpdate(d,i.memoizedState,o.__reactInternalSnapshotBeforeUpdate))),i=l.updateQueue,i!==null&&fv(l,i,o);return;case 3:if(i=l.updateQueue,i!==null){if(o=null,l.child!==null)switch(l.child.tag){case 5:o=l.child.stateNode;break;case 1:o=l.child.stateNode}fv(l,i,o)}return;case 5:o=l.stateNode,i===null&&l.flags&4&&Jg(l.type,l.memoizedProps)&&o.focus();return;case 6:return;case 4:return;case 12:return;case 13:l.memoizedState===null&&(l=l.alternate,l!==null&&(l=l.memoizedState,l!==null&&(l=l.dehydrated,l!==null&&ug(l))));return;case 19:case 17:case 20:case 21:case 23:case 24:return}throw Error(re(163))}function $v(o,i){for(var l=o;;){if(l.tag===5){var d=l.stateNode;if(i)d=d.style,typeof d.setProperty=="function"?d.setProperty("display","none","important"):d.display="none";else{d=l.stateNode;var h=l.memoizedProps.style;h=h!=null&&h.hasOwnProperty("display")?h.display:null,d.style.display=Y1("display",h)}}else if(l.tag===6)l.stateNode.nodeValue=i?"":l.memoizedProps;else if((l.tag!==23&&l.tag!==24||l.memoizedState===null||l===o)&&l.child!==null){l.child.return=l,l=l.child;continue}if(l===o)break;for(;l.sibling===null;){if(l.return===null||l.return===o)return;l=l.return}l.sibling.return=l.return,l=l.sibling}}function ty(o,i){if(Vo&&typeof Vo.onCommitFiberUnmount=="function")try{Vo.onCommitFiberUnmount(gp,i)}catch(v){}switch(i.tag){case 0:case 11:case 14:case 15:case 22:if(o=i.updateQueue,o!==null&&(o=o.lastEffect,o!==null)){var l=o=o.next;do{var d=l,h=d.destroy;if(d=d.tag,h!==void 0)if((d&4)!=0)_v(i,l);else{d=i;try{h()}catch(v){no(d,v)}}l=l.next}while(l!==o)}break;case 1:if(Qv(i),o=i.stateNode,typeof o.componentWillUnmount=="function")try{o.props=i.memoizedProps,o.state=i.memoizedState,o.componentWillUnmount()}catch(v){no(i,v)}break;case 5:Qv(i);break;case 4:ey(o,i)}}function ny(o){o.alternate=null,o.child=null,o.dependencies=null,o.firstEffect=null,o.lastEffect=null,o.memoizedProps=null,o.memoizedState=null,o.pendingProps=null,o.return=null,o.updateQueue=null}function ry(o){return o.tag===5||o.tag===3||o.tag===4}function oy(o){e:{for(var i=o.return;i!==null;){if(ry(i))break e;i=i.return}throw Error(re(160))}var l=i;switch(i=l.stateNode,l.tag){case 5:var d=!1;break;case 3:i=i.containerInfo,d=!0;break;case 4:i=i.containerInfo,d=!0;break;default:throw Error(re(161))}l.flags&16&&(Wa(i,""),l.flags&=-17);e:t:for(l=o;;){for(;l.sibling===null;){if(l.return===null||ry(l.return)){l=null;break e}l=l.return}for(l.sibling.return=l.return,l=l.sibling;l.tag!==5&&l.tag!==6&&l.tag!==18;){if(l.flags&2||l.child===null||l.tag===4)continue t;l.child.return=l,l=l.child}if(!(l.flags&2)){l=l.stateNode;break e}}d?Qp(o,l,i):_p(o,l,i)}function Qp(o,i,l){var d=o.tag,h=d===5||d===6;if(h)o=h?o.stateNode:o.stateNode.instance,i?l.nodeType===8?l.parentNode.insertBefore(o,i):l.insertBefore(o,i):(l.nodeType===8?(i=l.parentNode,i.insertBefore(o,l)):(i=l,i.appendChild(o)),l=l._reactRootContainer,l!=null||i.onclick!==null||(i.onclick=oc));else if(d!==4&&(o=o.child,o!==null))for(Qp(o,i,l),o=o.sibling;o!==null;)Qp(o,i,l),o=o.sibling}function _p(o,i,l){var d=o.tag,h=d===5||d===6;if(h)o=h?o.stateNode:o.stateNode.instance,i?l.insertBefore(o,i):l.appendChild(o);else if(d!==4&&(o=o.child,o!==null))for(_p(o,i,l),o=o.sibling;o!==null;)_p(o,i,l),o=o.sibling}function ey(o,i){for(var l=i,d=!1,h,v;;){if(!d){d=l.return;e:for(;;){if(d===null)throw Error(re(160));switch(h=d.stateNode,d.tag){case 5:v=!1;break e;case 3:h=h.containerInfo,v=!0;break e;case 4:h=h.containerInfo,v=!0;break e}d=d.return}d=!0}if(l.tag===5||l.tag===6){e:for(var S=o,P=l,z=P;;)if(ty(S,z),z.child!==null&&z.tag!==4)z.child.return=z,z=z.child;else{if(z===P)break e;for(;z.sibling===null;){if(z.return===null||z.return===P)break e;z=z.return}z.sibling.return=z.return,z=z.sibling}v?(S=h,P=l.stateNode,S.nodeType===8?S.parentNode.removeChild(P):S.removeChild(P)):h.removeChild(l.stateNode)}else if(l.tag===4){if(l.child!==null){h=l.stateNode.containerInfo,v=!0,l.child.return=l,l=l.child;continue}}else if(ty(o,l),l.child!==null){l.child.return=l,l=l.child;continue}if(l===i)break;for(;l.sibling===null;){if(l.return===null||l.return===i)return;l=l.return,l.tag===4&&(d=!1)}l.sibling.return=l.return,l=l.sibling}}function ef(o,i){switch(i.tag){case 0:case 11:case 14:case 15:case 22:var l=i.updateQueue;if(l=l!==null?l.lastEffect:null,l!==null){var d=l=l.next;do(d.tag&3)==3&&(o=d.destroy,d.destroy=void 0,o!==void 0&&o()),d=d.next;while(d!==l)}return;case 1:return;case 5:if(l=i.stateNode,l!=null){d=i.memoizedProps;var h=o!==null?o.memoizedProps:d;o=i.type;var v=i.updateQueue;if(i.updateQueue=null,v!==null){for(l[ac]=d,o==="input"&&d.type==="radio"&&d.name!=null&&V1(l,d),zd(o,h),i=zd(o,d),h=0;hh&&(h=S),l&=~v}if(l=h,l=Xt()-l,l=(120>l?120:480>l?480:1080>l?1080:1920>l?1920:3e3>l?3e3:4320>l?4320:1960*Bx(l/1960))-l,10 component higher in the tree to provide a loading indicator or placeholder to display.`)}Zt!==5&&(Zt=2),z=Xp(z,P),D=S;do{switch(D.tag){case 3:v=z,D.flags|=4096,i&=-i,D.lanes|=i;var m=Jv(D,v,i);pv(D,m);break e;case 1:v=z;var j=D.type,ne=D.stateNode;if((D.flags&64)==0&&(typeof j.getDerivedStateFromError=="function"||ne!==null&&typeof ne.componentDidCatch=="function"&&(ar===null||!ar.has(ne)))){D.flags|=4096,i&=-i,D.lanes|=i;var Q=qv(D,v,i);pv(D,Q);break e}}D=D.return}while(D!==null)}dy(l)}catch(se){i=se,Rt===l&&l!==null&&(Rt=l=l.return);continue}break}while(1)}function sy(){var o=Ic.current;return Ic.current=kc,o===null?kc:o}function Pl(o,i){var l=Fe;Fe|=16;var d=sy();rn===o&&qt===i||Zi(o,i);do try{Zx();break}catch(h){ly(o,h)}while(1);if(Ep(),Fe=l,Ic.current=d,Rt!==null)throw Error(re(261));return rn=null,qt=0,Zt}function Zx(){for(;Rt!==null;)py(Rt)}function Wx(){for(;Rt!==null&&!kx();)py(Rt)}function py(o){var i=fy(o.alternate,o,Zo);o.memoizedProps=o.pendingProps,i===null?dy(o):Rt=i,tf.current=null}function dy(o){var i=o;do{var l=i.alternate;if(o=i.return,(i.flags&2048)==0){if(l=Lx(l,i,Zo),l!==null){Rt=l;return}if(l=i,l.tag!==24&&l.tag!==23||l.memoizedState===null||(Zo&1073741824)!=0||(l.mode&4)==0){for(var d=0,h=l.child;h!==null;)d|=h.lanes|h.childLanes,h=h.sibling;l.childLanes=d}o!==null&&(o.flags&2048)==0&&(o.firstEffect===null&&(o.firstEffect=i.firstEffect),i.lastEffect!==null&&(o.lastEffect!==null&&(o.lastEffect.nextEffect=i.firstEffect),o.lastEffect=i.lastEffect),1S&&(P=S,S=m,m=P),P=jg(F,m),v=jg(F,S),P&&v&&(V.rangeCount!==1||V.anchorNode!==P.node||V.anchorOffset!==P.offset||V.focusNode!==v.node||V.focusOffset!==v.offset)&&(G=G.createRange(),G.setStart(P.node,P.offset),V.removeAllRanges(),m>S?(V.addRange(G),V.extend(v.node,v.offset)):(G.setEnd(v.node,v.offset),V.addRange(G)))))),G=[],V=F;V=V.parentNode;)V.nodeType===1&&G.push({element:V,left:V.scrollLeft,top:V.scrollTop});for(typeof F.focus=="function"&&F.focus(),F=0;FXt()-$p?Zi(o,0):rf|=l),Vn(o,i)}function Hx(o,i){var l=o.stateNode;l!==null&&l.delete(i),i=0,i===0&&(i=o.mode,(i&2)==0?i=1:(i&4)==0?i=Ni()===99?1:2:(Er===0&&(Er=Gi),i=Ci(62914560&~Er),i===0&&(i=4194304))),l=On(),o=Nc(o,i),o!==null&&(Xs(o,i,l),Vn(o,l))}var fy;fy=function(o,i,l){var d=i.lanes;if(o!==null)if(o.memoizedProps!==i.pendingProps||pn.current)Xn=!0;else if((l&d)!=0)Xn=(o.flags&16384)!=0;else{switch(Xn=!1,i.tag){case 3:Hv(i),Ap();break;case 5:bv(i);break;case 1:fn(i.type)&&sc(i);break;case 4:Op(i,i.stateNode.containerInfo);break;case 10:d=i.memoizedProps.value;var h=i.type._context;St(dc,h._currentValue),h._currentValue=d;break;case 13:if(i.memoizedState!==null)return(l&i.child.childLanes)!=0?Gv(o,i,l):(St(Ct,Ct.current&1),i=br(o,i,l),i!==null?i.sibling:null);St(Ct,Ct.current&1);break;case 19:if(d=(l&i.childLanes)!=0,(o.flags&64)!=0){if(d)return Zv(o,i,l);i.flags|=64}if(h=i.memoizedState,h!==null&&(h.rendering=null,h.tail=null,h.lastEffect=null),St(Ct,Ct.current),d)break;return null;case 23:case 24:return i.lanes=0,Bp(o,i,l)}return br(o,i,l)}else Xn=!1;switch(i.lanes=0,i.tag){case 2:if(d=i.type,o!==null&&(o.alternate=null,i.alternate=null,i.flags|=2),o=i.pendingProps,h=zi(i,Yt.current),Ri(i,l),h=zp(null,i,d,o,h,l),i.flags|=1,typeof h=="object"&&h!==null&&typeof h.render=="function"&&h.$$typeof===void 0){if(i.tag=1,i.memoizedState=null,i.updateQueue=null,fn(d)){var v=!0;sc(i)}else v=!1;i.memoizedState=h.state!==null&&h.state!==void 0?h.state:null,Sp(i);var S=d.getDerivedStateFromProps;typeof S=="function"&&hc(i,d,S,o),h.updater=mc,i.stateNode=h,h._reactInternals=i,Cp(i,d,o,l),i=Wp(null,i,d,!0,v,l)}else i.tag=0,mn(null,i,h,l),i=i.child;return i;case 16:h=i.elementType;e:{switch(o!==null&&(o.alternate=null,i.alternate=null,i.flags|=2),o=i.pendingProps,v=h._init,h=v(h._payload),i.type=h,v=i.tag=Jx(h),o=Yn(h,o),v){case 0:i=Vp(null,i,h,o,l);break e;case 1:i=Fv(null,i,h,o,l);break e;case 11:i=zv(null,i,h,o,l);break e;case 14:i=jv(null,i,h,Yn(h.type,o),d,l);break e}throw Error(re(306,h,""))}return i;case 0:return d=i.type,h=i.pendingProps,h=i.elementType===d?h:Yn(d,h),Vp(o,i,d,h,l);case 1:return d=i.type,h=i.pendingProps,h=i.elementType===d?h:Yn(d,h),Fv(o,i,d,h,l);case 3:if(Hv(i),d=i.updateQueue,o===null||d===null)throw Error(re(282));if(d=i.pendingProps,h=i.memoizedState,h=h!==null?h.element:null,dv(o,i),ul(i,d,null,l),d=i.memoizedState.element,d===h)Ap(),i=br(o,i,l);else{if(h=i.stateNode,(v=h.hydrate)&&(to=Li(i.stateNode.containerInfo.firstChild),wr=i,v=or=!0),v){if(o=h.mutableSourceEagerHydrationData,o!=null)for(h=0;h{var h,v,S,P,z={6086:(I,D,E)=>{function R(C,T,F,G,V,m,j){try{var ne=C[m](j),Q=ne.value}catch(se){return void F(se)}ne.done?T(Q):Promise.resolve(Q).then(G,V)}function x(C){return function(){var T=this,F=arguments;return new Promise(function(G,V){var m=C.apply(T,F);function j(Q){R(m,G,V,j,ne,"next",Q)}function ne(Q){R(m,G,V,j,ne,"throw",Q)}j(void 0)})}}E.d(D,{Z:()=>x})},8336:(I,D,E)=>{var R=E(487),x=E(4295);typeof(x=x.__esModule?x.default:x)=="string"&&(x=[[I.id,x,""]]);var C={insert:"head",singleton:!1};R(x,C),I.exports=x.locals||{}},2789:(I,D,E)=>{var R=E(487),x=E(3729);typeof(x=x.__esModule?x.default:x)=="string"&&(x=[[I.id,x,""]]);var C={insert:"head",singleton:!1};R(x,C),I.exports=x.locals||{}},778:(I,D,E)=>{var R=E(487),x=E(9609);typeof(x=x.__esModule?x.default:x)=="string"&&(x=[[I.id,x,""]]);var C={insert:"head",singleton:!1};R(x,C),I.exports=x.locals||{}},4220:(I,D,E)=>{var R=E(487),x=E(2345);typeof(x=x.__esModule?x.default:x)=="string"&&(x=[[I.id,x,""]]);var C={insert:"head",singleton:!1};R(x,C),I.exports=x.locals||{}},1292:(I,D,E)=>{var R=E(487),x=E(6578);typeof(x=x.__esModule?x.default:x)=="string"&&(x=[[I.id,x,""]]);var C={insert:"head",singleton:!1};R(x,C),I.exports=x.locals||{}},196:(I,D,E)=>{var R=E(487),x=E(9482);typeof(x=x.__esModule?x.default:x)=="string"&&(x=[[I.id,x,""]]);var C={insert:"head",singleton:!1};R(x,C),I.exports=x.locals||{}},2205:(I,D,E)=>{var R=E(487),x=E(7955);typeof(x=x.__esModule?x.default:x)=="string"&&(x=[[I.id,x,""]]);var C={insert:"head",singleton:!1};R(x,C),I.exports=x.locals||{}},1310:(I,D,E)=>{var R=E(487),x=E(3195);typeof(x=x.__esModule?x.default:x)=="string"&&(x=[[I.id,x,""]]);var C={insert:"head",singleton:!1};R(x,C),I.exports=x.locals||{}},3922:(I,D,E)=>{var R=E(487),x=E(2978);typeof(x=x.__esModule?x.default:x)=="string"&&(x=[[I.id,x,""]]);var C={insert:"head",singleton:!1};R(x,C),I.exports=x.locals||{}},7096:(I,D,E)=>{var R=E(487),x=E(1587);typeof(x=x.__esModule?x.default:x)=="string"&&(x=[[I.id,x,""]]);var C={insert:"head",singleton:!1};R(x,C),I.exports=x.locals||{}},7117:(I,D,E)=>{var R=E(487),x=E(9478);typeof(x=x.__esModule?x.default:x)=="string"&&(x=[[I.id,x,""]]);var C={insert:"head",singleton:!1};R(x,C),I.exports=x.locals||{}},1106:(I,D,E)=>{var R=E(487),x=E(7369);typeof(x=x.__esModule?x.default:x)=="string"&&(x=[[I.id,x,""]]);var C={insert:"head",singleton:!1};R(x,C),I.exports=x.locals||{}},3336:(I,D,E)=>{var R=E(487),x=E(1434);typeof(x=x.__esModule?x.default:x)=="string"&&(x=[[I.id,x,""]]);var C={insert:"head",singleton:!1};R(x,C),I.exports=x.locals||{}},694:(I,D,E)=>{var R=E(487),x=E(5644);typeof(x=x.__esModule?x.default:x)=="string"&&(x=[[I.id,x,""]]);var C={insert:"head",singleton:!1};R(x,C),I.exports=x.locals||{}},8328:(I,D,E)=>{var R=E(487),x=E(6843);typeof(x=x.__esModule?x.default:x)=="string"&&(x=[[I.id,x,""]]);var C={insert:"head",singleton:!1};R(x,C),I.exports=x.locals||{}},8051:(I,D,E)=>{var R=E(487),x=E(8461);typeof(x=x.__esModule?x.default:x)=="string"&&(x=[[I.id,x,""]]);var C={insert:"head",singleton:!1};R(x,C),I.exports=x.locals||{}},4301:(I,D,E)=>{var R=E(487),x=E(9935);typeof(x=x.__esModule?x.default:x)=="string"&&(x=[[I.id,x,""]]);var C={insert:"head",singleton:!1};R(x,C),I.exports=x.locals||{}},4623:(I,D,E)=>{var R=E(487),x=E(3874);typeof(x=x.__esModule?x.default:x)=="string"&&(x=[[I.id,x,""]]);var C={insert:"head",singleton:!1};R(x,C),I.exports=x.locals||{}},1528:(I,D,E)=>{var R=E(487),x=E(2681);typeof(x=x.__esModule?x.default:x)=="string"&&(x=[[I.id,x,""]]);var C={insert:"head",singleton:!1};R(x,C),I.exports=x.locals||{}},518:(I,D,E)=>{var R=E(487),x=E(6759);typeof(x=x.__esModule?x.default:x)=="string"&&(x=[[I.id,x,""]]);var C={insert:"head",singleton:!1};R(x,C),I.exports=x.locals||{}},9757:(I,D,E)=>{var R=E(487),x=E(9650);typeof(x=x.__esModule?x.default:x)=="string"&&(x=[[I.id,x,""]]);var C={insert:"head",singleton:!1};R(x,C),I.exports=x.locals||{}},5422:(I,D,E)=>{var R=E(487),x=E(2044);typeof(x=x.__esModule?x.default:x)=="string"&&(x=[[I.id,x,""]]);var C={insert:"head",singleton:!1};R(x,C),I.exports=x.locals||{}},6781:(I,D,E)=>{var R=E(487),x=E(6626);typeof(x=x.__esModule?x.default:x)=="string"&&(x=[[I.id,x,""]]);var C={insert:"head",singleton:!1};R(x,C),I.exports=x.locals||{}},580:(I,D,E)=>{var R=E(487),x=E(6359);typeof(x=x.__esModule?x.default:x)=="string"&&(x=[[I.id,x,""]]);var C={insert:"head",singleton:!1};R(x,C),I.exports=x.locals||{}},4285:(I,D,E)=>{var R=E(487),x=E(9915);typeof(x=x.__esModule?x.default:x)=="string"&&(x=[[I.id,x,""]]);var C={insert:"head",singleton:!1};R(x,C),I.exports=x.locals||{}},3313:(I,D,E)=>{var R=E(487),x=E(9310);typeof(x=x.__esModule?x.default:x)=="string"&&(x=[[I.id,x,""]]);var C={insert:"head",singleton:!1};R(x,C),I.exports=x.locals||{}},8635:(I,D,E)=>{var R=E(487),x=E(6464);typeof(x=x.__esModule?x.default:x)=="string"&&(x=[[I.id,x,""]]);var C={insert:"head",singleton:!1};R(x,C),I.exports=x.locals||{}},487:(I,D,E)=>{var R,x=function(){return R===void 0&&(R=Boolean(window&&document&&document.all&&!window.atob)),R},C=function(){var Ee={};return function(ve){if(Ee[ve]===void 0){var ge=document.querySelector(ve);if(window.HTMLIFrameElement&&ge instanceof window.HTMLIFrameElement)try{ge=ge.contentDocument.head}catch(Ge){ge=null}Ee[ve]=ge}return Ee[ve]}}(),T=[];function F(Ee){for(var ve=-1,ge=0;ge{I.exports=JSON.parse(`{"labels":{"paste":"Paste","pasteCharts":"Paste charts","selectAll":"Select all","multiSelect":"Add element to selection","moveCanvas":"Move canvas","cut":"Cut","copy":"Copy","copyAsPng":"Copy to clipboard as PNG","copyAsSvg":"Copy to clipboard as SVG","bringForward":"Bring forward","sendToBack":"Send to back","bringToFront":"Bring to front","sendBackward":"Send backward","delete":"Delete","copyStyles":"Copy styles","pasteStyles":"Paste styles","stroke":"Stroke","background":"Background","fill":"Fill","strokeWidth":"Stroke width","strokeShape":"Stroke shape","strokeShape_gel":"Gel pen","strokeShape_fountain":"Fountain pen","strokeShape_brush":"Brush pen","strokeStyle":"Stroke style","strokeStyle_solid":"Solid","strokeStyle_dashed":"Dashed","strokeStyle_dotted":"Dotted","sloppiness":"Sloppiness","opacity":"Opacity","textAlign":"Text align","edges":"Edges","sharp":"Sharp","round":"Round","arrowheads":"Arrowheads","arrowhead_none":"None","arrowhead_arrow":"Arrow","arrowhead_bar":"Bar","arrowhead_dot":"Dot","fontSize":"Font size","fontFamily":"Font family","onlySelected":"Only selected","withBackground":"With background","exportEmbedScene":"Embed scene into exported file","exportEmbedScene_details":"Scene data will be saved into the exported PNG/SVG file so that the scene can be restored from it.\\nWill increase exported file size.","addWatermark":"Add \\"Made with Excalidraw\\"","handDrawn":"Hand-drawn","normal":"Normal","code":"Code","small":"Small","medium":"Medium","large":"Large","veryLarge":"Very large","solid":"Solid","hachure":"Hachure","crossHatch":"Cross-hatch","thin":"Thin","bold":"Bold","left":"Left","center":"Center","right":"Right","extraBold":"Extra bold","architect":"Architect","artist":"Artist","cartoonist":"Cartoonist","fileTitle":"File name","colorPicker":"Color picker","canvasBackground":"Canvas background","drawingCanvas":"Drawing canvas","layers":"Layers","actions":"Actions","language":"Language","liveCollaboration":"Live collaboration","duplicateSelection":"Duplicate","untitled":"Untitled","name":"Name","yourName":"Your name","madeWithExcalidraw":"Made with Excalidraw","group":"Group selection","ungroup":"Ungroup selection","collaborators":"Collaborators","showGrid":"Show grid","addToLibrary":"Add to library","removeFromLibrary":"Remove from library","libraryLoadingMessage":"Loading library\u2026","libraries":"Browse libraries","loadingScene":"Loading scene\u2026","align":"Align","alignTop":"Align top","alignBottom":"Align bottom","alignLeft":"Align left","alignRight":"Align right","centerVertically":"Center vertically","centerHorizontally":"Center horizontally","distributeHorizontally":"Distribute horizontally","distributeVertically":"Distribute vertically","flipHorizontal":"Flip horizontal","flipVertical":"Flip vertical","viewMode":"View mode","toggleExportColorScheme":"Toggle export color scheme","share":"Share","toggleTheme":"Toggle theme"},"buttons":{"clearReset":"Reset the canvas","export":"Export","exportToPng":"Export to PNG","exportToSvg":"Export to SVG","copyToClipboard":"Copy to clipboard","copyPngToClipboard":"Copy PNG to clipboard","scale":"Scale","save":"Save","saveAs":"Save as","load":"Load","getShareableLink":"Get shareable link","close":"Close","selectLanguage":"Select language","scrollBackToContent":"Scroll back to content","zoomIn":"Zoom in","zoomOut":"Zoom out","resetZoom":"Reset zoom","menu":"Menu","done":"Done","edit":"Edit","undo":"Undo","redo":"Redo","resetLibrary":"Reset library","createNewRoom":"Create new room","fullScreen":"Full screen","darkMode":"Dark mode","lightMode":"Light mode","zenMode":"Zen mode","exitZenMode":"Exit zen mode"},"alerts":{"clearReset":"This will clear the whole canvas. Are you sure?","couldNotCreateShareableLink":"Couldn't create shareable link.","couldNotCreateShareableLinkTooBig":"Couldn't create shareable link: the scene is too big","couldNotLoadInvalidFile":"Couldn't load invalid file","importBackendFailed":"Importing from backend failed.","cannotExportEmptyCanvas":"Cannot export empty canvas.","couldNotCopyToClipboard":"Couldn't copy to clipboard. Try using Chrome browser.","decryptFailed":"Couldn't decrypt data.","uploadedSecurly":"The upload has been secured with end-to-end encryption, which means that Excalidraw server and third parties can't read the content.","loadSceneOverridePrompt":"Loading external drawing will replace your existing content. Do you wish to continue?","collabStopOverridePrompt":"Stopping the session will overwrite your previous, locally stored drawing. Are you sure?\\n\\n(If you want to keep your local drawing, simply close the browser tab instead.)","errorLoadingLibrary":"There was an error loading the third party library.","errorAddingToLibrary":"Couldn't add item to the library","errorRemovingFromLibrary":"Couldn't remove item from the library","confirmAddLibrary":"This will add {{numShapes}} shape(s) to your library. Are you sure?","imageDoesNotContainScene":"Importing images isn't supported at the moment.\\n\\nDid you want to import a scene? This image does not seem to contain any scene data. Have you enabled this during export?","cannotRestoreFromImage":"Scene couldn't be restored from this image file","invalidSceneUrl":"Couldn't import scene from the supplied URL. It's either malformed, or doesn't contain valid Excalidraw JSON data.","resetLibrary":"This will clear your library. Are you sure?"},"toolBar":{"selection":"Selection","rectangle":"Rectangle","diamond":"Diamond","ellipse":"Ellipse","arrow":"Arrow","line":"Line","freedraw":"Draw","text":"Text","library":"Library","lock":"Keep selected tool active after drawing"},"headings":{"canvasActions":"Canvas actions","selectedShapeActions":"Selected shape actions","shapes":"Shapes"},"hints":{"linearElement":"Click to start multiple points, drag for single line","freeDraw":"Click and drag, release when you're finished","text":"Tip: you can also add text by double-clicking anywhere with the selection tool","linearElementMulti":"Click on last point or press Escape or Enter to finish","lockAngle":"You can constrain angle by holding SHIFT","resize":"You can constrain proportions by holding SHIFT while resizing,\\nhold ALT to resize from the center","rotate":"You can constrain angles by holding SHIFT while rotating","lineEditor_info":"Double-click or press Enter to edit points","lineEditor_pointSelected":"Press Delete to remove point, CtrlOrCmd+D to duplicate, or drag to move","lineEditor_nothingSelected":"Select a point to move or remove, or hold Alt and click to add new points"},"canvasError":{"cannotShowPreview":"Cannot show preview","canvasTooBig":"The canvas may be too big.","canvasTooBigTip":"Tip: try moving the farthest elements a bit closer together."},"errorSplash":{"headingMain_pre":"Encountered an error. Try ","headingMain_button":"reloading the page.","clearCanvasMessage":"If reloading doesn't work, try ","clearCanvasMessage_button":"clearing the canvas.","clearCanvasCaveat":" This will result in loss of work ","trackedToSentry_pre":"The error with identifier ","trackedToSentry_post":" was tracked on our system.","openIssueMessage_pre":"We were very cautious not to include your scene information on the error. If your scene is not private, please consider following up on our ","openIssueMessage_button":"bug tracker.","openIssueMessage_post":" Please include information below by copying and pasting into the GitHub issue.","sceneContent":"Scene content:"},"roomDialog":{"desc_intro":"You can invite people to your current scene to collaborate with you.","desc_privacy":"Don't worry, the session uses end-to-end encryption, so whatever you draw will stay private. Not even our server will be able to see what you come up with.","button_startSession":"Start session","button_stopSession":"Stop session","desc_inProgressIntro":"Live-collaboration session is now in progress.","desc_shareLink":"Share this link with anyone you want to collaborate with:","desc_exitSession":"Stopping the session will disconnect you from the room, but you'll be able to continue working with the scene, locally. Note that this won't affect other people, and they'll still be able to collaborate on their version.","shareTitle":"Join a live collaboration session on Excalidraw"},"errorDialog":{"title":"Error"},"helpDialog":{"blog":"Read our blog","click":"click","curvedArrow":"Curved arrow","curvedLine":"Curved line","documentation":"Documentation","drag":"drag","editor":"Editor","github":"Found an issue? Submit","howto":"Follow our guides","or":"or","preventBinding":"Prevent arrow binding","shapes":"Shapes","shortcuts":"Keyboard shortcuts","textFinish":"Finish editing (text)","textNewLine":"Add new line (text)","title":"Help","view":"View","zoomToFit":"Zoom to fit all elements","zoomToSelection":"Zoom to selection"},"encrypted":{"tooltip":"Your drawings are end-to-end encrypted so Excalidraw's servers will never see them.","link":"Blog post on end-to-end encryption in Excalidraw"},"stats":{"angle":"Angle","element":"Element","elements":"Elements","height":"Height","scene":"Scene","selected":"Selected","storage":"Storage","title":"Stats for nerds","total":"Total","version":"Version","versionCopy":"Click to copy","versionNotAvailable":"Version not available","width":"Width"},"toast":{"copyStyles":"Copied styles.","copyToClipboard":"Copied to clipboard.","copyToClipboardAsPng":"Copied {{exportSelection}} to clipboard as PNG\\n({{exportColorScheme}})","fileSaved":"File saved.","fileSavedToFilename":"Saved to {filename}","canvas":"canvas","selection":"selection"}}`)},2051:I=>{I.exports=JSON.parse('{"ar-SA":84,"bg-BG":92,"ca-ES":99,"de-DE":100,"el-GR":97,"en":100,"es-ES":99,"fa-IR":87,"fi-FI":99,"fr-FR":100,"he-IL":88,"hi-IN":91,"hu-HU":80,"id-ID":100,"it-IT":100,"ja-JP":96,"kab-KAB":99,"ko-KR":91,"lv-LV":0,"my-MM":75,"nb-NO":100,"nl-NL":100,"nn-NO":100,"oc-FR":100,"pa-IN":93,"pl-PL":94,"pt-BR":100,"pt-PT":99,"ro-RO":100,"ru-RU":97,"sk-SK":100,"sv-SE":100,"tr-TR":100,"uk-UA":100,"zh-CN":100,"zh-TW":99}')},788:(I,D,E)=>{var R={"./ar-SA.json":[7294,558],"./bg-BG.json":[3860,384],"./ca-ES.json":[750,351],"./de-DE.json":[7439,43],"./el-GR.json":[9422,526],"./en.json":[2829],"./es-ES.json":[2863,317],"./fa-IR.json":[3853,710],"./fi-FI.json":[5472,472],"./fr-FR.json":[3280,364],"./he-IL.json":[3970,262],"./hi-IN.json":[5599,933],"./hu-HU.json":[1516,661],"./id-ID.json":[7992,491],"./it-IT.json":[5963,465],"./ja-JP.json":[1323,137],"./kab-KAB.json":[9230,164],"./ko-KR.json":[7552,60],"./lv-LV.json":[413,899],"./my-MM.json":[1778,242],"./nb-NO.json":[8751,246],"./nl-NL.json":[4675,196],"./nn-NO.json":[7558,920],"./oc-FR.json":[9945,565],"./pa-IN.json":[863,280],"./percentages.json":[2051],"./pl-PL.json":[122,852],"./pt-BR.json":[7443,381],"./pt-PT.json":[2560,149],"./ro-RO.json":[5654,752],"./ru-RU.json":[5609,869],"./sk-SK.json":[8684,401],"./sv-SE.json":[1570,698],"./tr-TR.json":[8146,213],"./uk-UA.json":[9746,583],"./zh-CN.json":[9044,304],"./zh-TW.json":[2939,62]};function x(C){if(!E.o(R,C))return Promise.resolve().then(()=>{var G=new Error("Cannot find module '"+C+"'");throw G.code="MODULE_NOT_FOUND",G});var T=R[C],F=T[0];return Promise.all(T.slice(1).map(E.e)).then(()=>E.t(F,3))}x.keys=()=>Object.keys(R),x.id=788,I.exports=x},9713:I=>{I.exports=function(D,E,R){return E in D?Object.defineProperty(D,E,{value:R,enumerable:!0,configurable:!0,writable:!0}):D[E]=R,D}},7154:I=>{function D(){return I.exports=D=Object.assign||function(E){for(var R=1;R{var R=E(7316);I.exports=function(x,C){if(x==null)return{};var T,F,G=R(x,C);if(Object.getOwnPropertySymbols){var V=Object.getOwnPropertySymbols(x);for(F=0;F=0||Object.prototype.propertyIsEnumerable.call(x,T)&&(G[T]=x[T])}return G}},7316:I=>{I.exports=function(D,E){if(D==null)return{};var R,x,C={},T=Object.keys(D);for(x=0;x=0||(C[R]=D[R]);return C}},4295:(I,D,E)=>{E.r(D),E.d(D,{default:()=>ne});var R=E(3645),x=E.n(R),C=E(1667),T=E.n(C),F=E(7464),G=E(9638),V=x()(function(Q){return Q[1]}),m=T()(F.Z),j=T()(G.Z);V.push([I.id,'@font-face{font-family:"Virgil";src:url('+m+');font-display:swap}@font-face{font-family:"Cascadia";src:url('+j+");font-display:swap}",""]);let ne=V},3729:(I,D,E)=>{E.r(D),E.d(D,{default:()=>C});var R=E(3645),x=E.n(R)()(function(T){return T[1]});x.push([I.id,":export{themeFilter:invert(93%) hue-rotate(180deg)}.excalidraw .Avatar{width:2.5rem;height:2.5rem;border-radius:1.25rem;display:flex;justify-content:center;align-items:center;color:#fff;cursor:pointer;font-size:.8rem;font-weight:500}",""]);let C=x},9609:(I,D,E)=>{E.r(D),E.d(D,{default:()=>C});var R=E(3645),x=E.n(R)()(function(T){return T[1]});x.push([I.id,":export{themeFilter:invert(93%) hue-rotate(180deg)}.excalidraw .CollabButton.is-collaborating{background-color:var(--button-special-active-bg-color)}.excalidraw .CollabButton.is-collaborating .ToolIcon__icon svg,.excalidraw .CollabButton.is-collaborating .ToolIcon__label{color:var(--icon-green-fill-color)}.excalidraw .CollabButton-collaborators{min-width:1em;position:absolute;bottom:-5px;padding:3px;border-radius:50%;background-color:#40c057;color:#fff;font-size:.7em;font-family:var(--ui-font)}:root[dir=ltr] .excalidraw .CollabButton-collaborators{right:-5px}:root[dir=rtl] .excalidraw .CollabButton-collaborators{left:-5px}",""]);let C=x},2345:(I,D,E)=>{E.r(D),E.d(D,{default:()=>C});var R=E(3645),x=E.n(R)()(function(T){return T[1]});x.push([I.id,':export{themeFilter:invert(93%) hue-rotate(180deg)}.excalidraw .color-picker{background:var(--popup-bg-color);border:0 solid rgba(255,255,255,.25);box-shadow:rgba(0,0,0,.25) 0 1px 4px;border-radius:4px;position:absolute}:root[dir=ltr] .excalidraw .color-picker{left:-5.5px}:root[dir=rtl] .excalidraw .color-picker{right:-5.5px}.excalidraw .color-picker-control-container{display:grid;grid-template-columns:auto 1fr;align-items:center}.excalidraw .color-picker-triangle{width:0;height:0;border-style:solid;border-width:0 9px 10px;border-color:transparent transparent var(--popup-bg-color);position:absolute;top:-10px}:root[dir=ltr] .excalidraw .color-picker-triangle{left:12px}:root[dir=rtl] .excalidraw .color-picker-triangle{right:12px}.excalidraw .color-picker-triangle-shadow{border-color:transparent transparent rgba(0,0,0,.1);top:-11px}.excalidraw .color-picker-content{padding:.5rem;display:grid;grid-template-columns:repeat(5, auto);grid-gap:.5rem;border-radius:4px}.excalidraw .color-picker-content:focus{outline:none;box-shadow:0 0 0 2px var(--focus-highlight-color)}.excalidraw .color-picker-content .color-input-container{grid-column:1/span 5}.excalidraw .color-picker-swatch{position:relative;height:1.875rem;width:1.875rem;cursor:pointer;border-radius:4px;margin:0;box-sizing:border-box;border:1px solid #ddd;background-color:currentColor !important;filter:var(--theme-filter)}.excalidraw .color-picker-swatch:focus{box-shadow:0 0 4px 1px currentColor;border-color:var(--select-highlight-color)}.excalidraw .color-picker-transparent{border-radius:4px;box-shadow:rgba(0,0,0,.1) 0 0 0 1px inset;position:absolute;top:0;right:0;bottom:0;left:0}.excalidraw .color-picker-transparent,.excalidraw .color-picker-label-swatch{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAMUlEQVQ4T2NkYGAQYcAP3uCTZhw1gGGYhAGBZIA/nYDCgBDAm9BGDWAAJyRCgLaBCAAgXwixzAS0pgAAAABJRU5ErkJggg==") left center}.excalidraw .color-picker-hash{background:var(--input-border-color);height:1.875rem;width:1.875rem;color:var(--input-label-color);display:flex;align-items:center;justify-content:center;position:relative}:root[dir=ltr] .excalidraw .color-picker-hash{border-radius:4px 0 0 4px}:root[dir=rtl] .excalidraw .color-picker-hash{border-radius:0 4px 4px 0}.excalidraw .color-input-container:focus-within .color-picker-hash{box-shadow:0 0 0 2px var(--focus-highlight-color)}.excalidraw .color-input-container:focus-within .color-picker-hash::before,.excalidraw .color-input-container:focus-within .color-picker-hash::after{content:"";width:1px;height:100%;position:absolute;top:0}.excalidraw .color-input-container:focus-within .color-picker-hash::before{background:var(--input-border-color)}:root[dir=ltr] .excalidraw .color-input-container:focus-within .color-picker-hash::before{right:-1px}:root[dir=rtl] .excalidraw .color-input-container:focus-within .color-picker-hash::before{left:-1px}.excalidraw .color-input-container:focus-within .color-picker-hash::after{background:var(--input-bg-color)}:root[dir=ltr] .excalidraw .color-input-container:focus-within .color-picker-hash::after{right:-2px}:root[dir=rtl] .excalidraw .color-input-container:focus-within .color-picker-hash::after{left:-2px}.excalidraw .color-input-container{display:flex}.excalidraw .color-picker-input{width:12ch;margin:0;font-size:1rem;background-color:var(--input-bg-color);color:var(--text-primary-color);border:0;outline:none;height:1.75em;box-shadow:var(--input-border-color) 0 0 0 1px inset;float:left;padding:1px;padding-inline-start:.5em;-webkit-appearance:none;appearance:none}:root[dir=ltr] .excalidraw .color-picker-input{border-radius:0 4px 4px 0}:root[dir=rtl] .excalidraw .color-picker-input{border-radius:4px 0 0 4px}.excalidraw .color-picker-label-swatch{height:1.875rem;width:1.875rem;margin-inline-end:.25rem;border:1px solid #dee2e6;position:relative;overflow:hidden;background-color:transparent !important;filter:var(--theme-filter)}.excalidraw .color-picker-label-swatch:after{content:"";position:absolute;top:0;left:0;width:100%;height:100%;background:var(--swatch-color)}.excalidraw .color-picker-keybinding{position:absolute;bottom:2px;font-size:.7em}:root[dir=ltr] .excalidraw .color-picker-keybinding{right:2px}:root[dir=rtl] .excalidraw .color-picker-keybinding{left:2px}.excalidraw--mobile.excalidraw .color-picker-keybinding{display:none}.excalidraw .color-picker-type-canvasBackground .color-picker-keybinding{color:#aaa}.excalidraw .color-picker-type-elementBackground .color-picker-keybinding{color:#fff}.excalidraw .color-picker-swatch[aria-label=transparent] .color-picker-keybinding{color:#aaa}.excalidraw .color-picker-type-elementStroke .color-picker-keybinding{color:#d4d4d4}.excalidraw.theme--dark .color-picker-type-elementBackground .color-picker-keybinding{color:#000}.excalidraw.theme--dark .color-picker-swatch[aria-label=transparent] .color-picker-keybinding{color:#000}',""]);let C=x},6578:(I,D,E)=>{E.r(D),E.d(D,{default:()=>C});var R=E(3645),x=E.n(R)()(function(T){return T[1]});x.push([I.id,':export{themeFilter:invert(93%) hue-rotate(180deg)}.excalidraw .context-menu{position:relative;border-radius:4px;box-shadow:0 3px 10px rgba(0,0,0,.2);padding:0;list-style:none;-webkit-user-select:none;user-select:none;margin:-0.25rem 0 0 .125rem;padding:.5rem 0;background-color:var(--popup-secondary-bg-color);border:1px solid var(--button-gray-3);cursor:default}.excalidraw .context-menu button{color:var(--popup-text-color)}.excalidraw .context-menu-option{position:relative;width:100%;min-width:9.5rem;margin:0;padding:.25rem 1rem .25rem 1.25rem;text-align:start;border-radius:0;background-color:transparent;border:none;white-space:nowrap;display:grid;grid-template-columns:1fr .2fr;align-items:center}.excalidraw .context-menu-option.checkmark::before{position:absolute;left:6px;margin-bottom:1px;content:"\u2713"}.excalidraw .context-menu-option.dangerous .context-menu-option__label{color:#f03e3e}.excalidraw .context-menu-option .context-menu-option__label{justify-self:start;margin-inline-end:20px}.excalidraw .context-menu-option .context-menu-option__shortcut{justify-self:end;opacity:.6;font-family:inherit;font-size:.7rem}.excalidraw .context-menu-option:hover{color:var(--popup-bg-color);background-color:var(--select-highlight-color)}.excalidraw .context-menu-option:hover.dangerous{background-color:#fa5252}.excalidraw .context-menu-option:hover.dangerous .context-menu-option__label{color:var(--popup-bg-color)}.excalidraw .context-menu-option:focus{z-index:1}.excalidraw--mobile.excalidraw .context-menu-option{display:block}.excalidraw--mobile.excalidraw .context-menu-option .context-menu-option__label{margin-inline-end:0}.excalidraw--mobile.excalidraw .context-menu-option .context-menu-option__shortcut{display:none}.excalidraw .context-menu-option-separator{border:none;border-top:1px solid #adb5bd}',""]);let C=x},9482:(I,D,E)=>{E.r(D),E.d(D,{default:()=>C});var R=E(3645),x=E.n(R)()(function(T){return T[1]});x.push([I.id,":export{themeFilter:invert(93%) hue-rotate(180deg)}.excalidraw .Dialog{-webkit-user-select:text;user-select:text;cursor:auto}.excalidraw .Dialog__title{display:grid;align-items:center;margin-top:0;grid-template-columns:1fr calc(var(--space-factor) * 7);grid-gap:var(--metric);padding:calc(var(--space-factor) * 2);text-align:center;font-variant:small-caps;font-size:1.2em}.excalidraw .Dialog__titleContent{flex:1}.excalidraw .Dialog .Modal__close{color:var(--icon-fill-color);margin:0}.excalidraw .Dialog__content{padding:0 16px 16px}.excalidraw--mobile.excalidraw .Dialog{--metric: calc(var(--space-factor) * 4);--inset-left: max(var(--metric), var(--sal));--inset-right: max(var(--metric), var(--sar))}.excalidraw--mobile.excalidraw .Dialog__title{grid-template-columns:calc(var(--space-factor) * 7) 1fr calc( var(--space-factor) * 7 );position:-webkit-sticky;position:sticky;top:0;padding:calc(var(--space-factor) * 2);background:var(--island-bg-color);font-size:1.25em;box-sizing:border-box;border-bottom:1px solid var(--button-gray-2);z-index:1}.excalidraw--mobile.excalidraw .Dialog__titleContent{text-align:center}.excalidraw--mobile.excalidraw .Dialog .Island{width:100vw;height:100%;box-sizing:border-box;overflow-y:auto;padding-left:max(calc(var(--padding) * var(--space-factor)), var(--sal));padding-right:max(calc(var(--padding) * var(--space-factor)), var(--sar));padding-bottom:max(calc(var(--padding) * var(--space-factor)), var(--sab))}.excalidraw--mobile.excalidraw .Dialog .Modal__close{order:-1}",""]);let C=x},7955:(I,D,E)=>{E.r(D),E.d(D,{default:()=>C});var R=E(3645),x=E.n(R)()(function(T){return T[1]});x.push([I.id,':export{themeFilter:invert(93%) hue-rotate(180deg)}.excalidraw .ExportDialog__preview{--preview-padding: calc(var(--space-factor) * 4);background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAMUlEQVQ4T2NkYGAQYcAP3uCTZhw1gGGYhAGBZIA/nYDCgBDAm9BGDWAAJyRCgLaBCAAgXwixzAS0pgAAAABJRU5ErkJggg==") left center;text-align:center;padding:var(--preview-padding);margin-bottom:calc(var(--space-factor) * 3)}.excalidraw .ExportDialog__preview canvas{max-width:calc(100% - var(--preview-padding) * 2);max-height:25rem}.excalidraw.theme--dark .ExportDialog__preview canvas{filter:none}.excalidraw .ExportDialog__actions{width:100%;display:flex;grid-gap:calc(var(--space-factor) * 2);align-items:top;justify-content:space-between}.excalidraw .ExportDialog__name{grid-column:project-name;margin:auto;display:flex;align-items:center}.excalidraw .ExportDialog__name .TextInput{height:calc(1rem - 3px);width:200px;overflow:hidden;text-align:center;margin-left:8px;text-overflow:ellipsis}.excalidraw .ExportDialog__name .TextInput--readonly{background:none;border:none;width:auto;max-width:200px;padding-left:2px}.excalidraw .ExportDialog__name .TextInput--readonly:hover{background:none}.excalidraw--mobile.excalidraw .ExportDialog{display:flex;flex-direction:column}.excalidraw--mobile.excalidraw .ExportDialog__actions{flex-direction:column;align-items:center}.excalidraw--mobile.excalidraw .ExportDialog__actions>*{margin-bottom:calc(var(--space-factor) * 3)}.excalidraw--mobile.excalidraw .ExportDialog__preview canvas{max-height:30vh}.excalidraw--mobile.excalidraw .ExportDialog__dialog,.excalidraw--mobile.excalidraw .ExportDialog__dialog .Island{height:100%;box-sizing:border-box}.excalidraw--mobile.excalidraw .ExportDialog__dialog .Island{overflow-y:auto}',""]);let C=x},3195:(I,D,E)=>{E.r(D),E.d(D,{default:()=>C});var R=E(3645),x=E.n(R)()(function(T){return T[1]});x.push([I.id,".excalidraw .FixedSideContainer{position:absolute;pointer-events:none}.excalidraw .FixedSideContainer>*{pointer-events:all}.excalidraw .FixedSideContainer_side_top{left:var(--space-factor);top:var(--space-factor);right:var(--space-factor);z-index:2}.excalidraw .FixedSideContainer_side_top.zen-mode{right:42px}",""]);let C=x},2978:(I,D,E)=>{E.r(D),E.d(D,{default:()=>C});var R=E(3645),x=E.n(R)()(function(T){return T[1]});x.push([I.id,":export{themeFilter:invert(93%) hue-rotate(180deg)}.excalidraw .HelpDialog h3{border-bottom:1px solid var(--button-gray-2);padding-bottom:4px}.excalidraw .HelpDialog--island{border:1px solid var(--button-gray-2);margin-bottom:16px}.excalidraw .HelpDialog--island-title{margin:0;padding:4px;background-color:var(--button-gray-1);text-align:center}.excalidraw .HelpDialog--shortcut{border-top:1px solid var(--button-gray-2)}.excalidraw .HelpDialog--key{word-break:keep-all;border:1px solid var(--button-gray-2);padding:2px 8px;margin:auto 4px;background-color:var(--button-gray-1);border-radius:2px;font-size:.8em;min-height:26px;box-sizing:border-box;display:flex;align-items:center;font-family:inherit}.excalidraw .HelpDialog--header{display:flex;flex-direction:row;justify-content:space-evenly;margin-bottom:32px;padding-bottom:16px}.excalidraw .HelpDialog--btn{border:1px solid var(--link-color);padding:8px 32px;border-radius:4px}.excalidraw .HelpDialog--btn:hover{text-decoration:none}",""]);let C=x},1587:(I,D,E)=>{E.r(D),E.d(D,{default:()=>C});var R=E(3645),x=E.n(R)()(function(T){return T[1]});x.push([I.id,":export{themeFilter:invert(93%) hue-rotate(180deg)}.excalidraw .HintViewer{pointer-events:none;box-sizing:border-box;position:absolute;display:flex;justify-content:center;left:0;top:100%;max-width:100%;width:100%;margin-top:6px;text-align:center;color:#868e96;font-size:.8rem}.excalidraw--mobile.excalidraw .HintViewer{position:static;padding-right:2em}.excalidraw .HintViewer>span{padding:.2rem .4rem;background-color:var(--overlay-bg-color);border-radius:4px}",""]);let C=x},9478:(I,D,E)=>{E.r(D),E.d(D,{default:()=>C});var R=E(3645),x=E.n(R)()(function(T){return T[1]});x.push([I.id,':export{themeFilter:invert(93%) hue-rotate(180deg)}.excalidraw .picker-container{display:inline-block;box-sizing:border-box;margin-right:.25rem}.excalidraw .picker{background:var(--popup-bg-color);border:0 solid rgba(255,255,255,.25);box-shadow:rgba(0,0,0,.25) 0 1px 4px;border-radius:4px;position:absolute}.excalidraw .picker-container button,.excalidraw .picker button{position:relative;display:flex;align-items:center;justify-content:center}.excalidraw .picker-container button:focus,.excalidraw .picker button:focus{outline:transparent;background-color:var(--button-gray-2)}.excalidraw .picker-container button:focus svg,.excalidraw .picker button:focus svg{opacity:1}.excalidraw .picker-container button:hover,.excalidraw .picker button:hover{background-color:var(--button-gray-2)}.excalidraw .picker-container button:active,.excalidraw .picker button:active{background-color:var(--button-gray-3)}.excalidraw .picker-container button:disabled,.excalidraw .picker button:disabled{cursor:not-allowed}.excalidraw .picker-container button svg,.excalidraw .picker button svg{margin:0;width:36px;height:18px;opacity:.6;pointer-events:none}.excalidraw .picker button{padding:.25rem .28rem .35rem .25rem}.excalidraw .picker-triangle{width:0;height:0;position:relative;top:-10px;z-index:10}:root[dir=ltr] .excalidraw .picker-triangle{left:12px}:root[dir=rtl] .excalidraw .picker-triangle{right:12px}.excalidraw .picker-triangle:before{content:"";position:absolute;border-style:solid;border-width:0 9px 10px;border-color:transparent transparent rgba(0,0,0,.1);top:-1px}.excalidraw .picker-triangle:after{content:"";position:absolute;border-style:solid;border-width:0 9px 10px;border-color:transparent transparent var(--popup-bg-color)}.excalidraw .picker-content{padding:.5rem;display:grid;grid-auto-flow:column;grid-gap:.5rem;border-radius:4px}:root[dir=rtl] .excalidraw .picker-content{padding:.4rem}.excalidraw .picker-keybinding{position:absolute;bottom:2px;font-size:.7em;color:var(--keybinding-color)}:root[dir=ltr] .excalidraw .picker-keybinding{right:2px}:root[dir=rtl] .excalidraw .picker-keybinding{left:2px}.excalidraw--mobile.excalidraw .picker-keybinding{display:none}.excalidraw .picker-type-canvasBackground .picker-keybinding{color:#aaa}.excalidraw .picker-type-elementBackground .picker-keybinding{color:#fff}.excalidraw .picker-swatch[aria-label=transparent] .picker-keybinding{color:#aaa}.excalidraw .picker-type-elementStroke .picker-keybinding{color:#d4d4d4}.excalidraw.theme--dark .picker-type-elementBackground .picker-keybinding{color:#000}.excalidraw.theme--dark .picker-swatch[aria-label=transparent] .picker-keybinding{color:#000}',""]);let C=x},7369:(I,D,E)=>{E.r(D),E.d(D,{default:()=>C});var R=E(3645),x=E.n(R)()(function(T){return T[1]});x.push([I.id,".excalidraw .Island{--padding: 0;background-color:var(--island-bg-color);box-shadow:var(--shadow-island);border-radius:4px;padding:calc(var(--padding) * var(--space-factor));position:relative;transition:box-shadow .5s ease-in-out}.excalidraw .Island.zen-mode{box-shadow:none}",""]);let C=x},1434:(I,D,E)=>{E.r(D),E.d(D,{default:()=>C});var R=E(3645),x=E.n(R)()(function(T){return T[1]});x.push([I.id,".excalidraw .layer-ui__library{margin:auto;display:flex;align-items:center;justify-content:center}.excalidraw .layer-ui__library .layer-ui__library-header{display:flex;align-items:center;width:100%;margin:2px 0}.excalidraw .layer-ui__library .layer-ui__library-header button{margin:0 2px}.excalidraw .layer-ui__library .layer-ui__library-header a{margin-inline-start:auto;padding-inline-end:18px;white-space:nowrap}.excalidraw .layer-ui__library-message{padding:10px 20px;max-width:200px}.excalidraw .layer-ui__library-items{max-height:50vh;overflow:auto}.excalidraw .layer-ui__wrapper{z-index:var(--zIndex-layerUI)}.excalidraw .layer-ui__wrapper__top-right{display:flex}.excalidraw .layer-ui__wrapper__footer{width:100%}.excalidraw .layer-ui__wrapper__footer-right{z-index:100;display:flex}.excalidraw .layer-ui__wrapper .zen-mode-transition{transition:transform .5s ease-in-out}:root[dir=ltr] .excalidraw .layer-ui__wrapper .zen-mode-transition.transition-left{transform:translate(-999px, 0)}:root[dir=ltr] .excalidraw .layer-ui__wrapper .zen-mode-transition.transition-right{transform:translate(999px, 0)}:root[dir=rtl] .excalidraw .layer-ui__wrapper .zen-mode-transition.transition-left{transform:translate(999px, 0)}:root[dir=rtl] .excalidraw .layer-ui__wrapper .zen-mode-transition.transition-right{transform:translate(-999px, 0)}:root[dir=ltr] .excalidraw .layer-ui__wrapper .zen-mode-transition.layer-ui__wrapper__footer-left--transition-left{transform:translate(-92px, 0)}:root[dir=rtl] .excalidraw .layer-ui__wrapper .zen-mode-transition.layer-ui__wrapper__footer-left--transition-left{transform:translate(92px, 0)}.excalidraw .layer-ui__wrapper .zen-mode-transition.layer-ui__wrapper__footer-left--transition-bottom{transform:translate(0, 92px)}.excalidraw .layer-ui__wrapper .disable-zen-mode{height:30px;position:absolute;bottom:10px;font-size:10px;padding:10px;font-weight:500;opacity:0;visibility:hidden;transition:visibility 0s linear 0s,opacity .5s}[dir=ltr] .excalidraw .layer-ui__wrapper .disable-zen-mode{right:15px}[dir=rtl] .excalidraw .layer-ui__wrapper .disable-zen-mode{left:15px}.excalidraw .layer-ui__wrapper .disable-zen-mode--visible{opacity:1;visibility:visible;transition:visibility 0s linear 300ms,opacity .5s;transition-delay:.8s}",""]);let C=x},5644:(I,D,E)=>{E.r(D),E.d(D,{default:()=>C});var R=E(3645),x=E.n(R)()(function(T){return T[1]});x.push([I.id,".excalidraw .library-unit{align-items:center;border:1px solid var(--button-gray-2);display:flex;justify-content:center;position:relative;width:63px;height:63px}.excalidraw .library-unit__dragger{display:flex;height:100%;width:100%}.excalidraw .library-unit__dragger>svg{filter:var(--theme-filter);flex-grow:1;max-height:100%;max-width:100%}.excalidraw .library-unit__removeFromLibrary,.excalidraw .library-unit__removeFromLibrary:hover,.excalidraw .library-unit__removeFromLibrary:active{align-items:center;background:none;border:none;color:var(--icon-fill-color);display:flex;justify-content:center;margin:0;padding:0;position:absolute;right:5px;top:5px}.excalidraw .library-unit__removeFromLibrary>svg{height:16px;width:16px}.excalidraw .library-unit__pulse{transform:scale(1);animation:library-unit__pulse-animation 1s ease-in infinite}.excalidraw .library-unit__adder{position:absolute;left:50%;top:50%;width:20px;height:20px;margin-left:-10px;margin-top:-10px;pointer-events:none}.excalidraw .library-unit__active{cursor:pointer}@keyframes library-unit__pulse-animation{0%{transform:scale(0.95)}50%{transform:scale(1)}100%{transform:scale(0.95)}}",""]);let C=x},6843:(I,D,E)=>{E.r(D),E.d(D,{default:()=>C});var R=E(3645),x=E.n(R)()(function(T){return T[1]});x.push([I.id,":export{themeFilter:invert(93%) hue-rotate(180deg)}.excalidraw.excalidraw-modal-container{position:absolute;z-index:10}.excalidraw .Modal{position:absolute;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;overflow:auto;padding:calc(var(--space-factor) * 10)}.excalidraw .Modal__background{position:absolute;top:0;left:0;right:0;bottom:0;z-index:1;background-color:rgba(0,0,0,.7)}.excalidraw .Modal__content{position:relative;z-index:2;width:100%;max-width:var(--max-width);max-height:100%;opacity:0;transform:translateY(10px);animation:Modal__content_fade-in .1s ease-out .05s forwards;position:relative;overflow-y:auto;background:var(--island-bg-color);border:1px solid var(--dialog-border-color);box-shadow:0 2px 10px rgba(0,0,0,.25);border-radius:6px;box-sizing:border-box}.excalidraw .Modal__content:focus{outline:none}.excalidraw--mobile.excalidraw .Modal__content{max-width:100%;border:0;border-radius:0}@keyframes Modal__content_fade-in{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.excalidraw .Modal__close{width:calc(var(--space-factor) * 7);height:calc(var(--space-factor) * 7);display:flex;align-items:center;justify-content:center}.excalidraw .Modal__close svg{height:calc(var(--space-factor) * 5)}.excalidraw--mobile.excalidraw .Modal{padding:0}.excalidraw--mobile.excalidraw .Modal__content{position:absolute;top:0;left:0;right:0;bottom:0}",""]);let C=x},8461:(I,D,E)=>{E.r(D),E.d(D,{default:()=>C});var R=E(3645),x=E.n(R)()(function(T){return T[1]});x.push([I.id,":export{themeFilter:invert(93%) hue-rotate(180deg)}.excalidraw--mobile.excalidraw .PasteChartDialog .Island{display:flex;flex-direction:column}.excalidraw .PasteChartDialog .container{display:flex;align-items:center;justify-content:space-around;flex-wrap:wrap}.excalidraw--mobile.excalidraw .PasteChartDialog .container{flex-direction:column;justify-content:center}.excalidraw .PasteChartDialog .ChartPreview{margin:8px;text-align:center;width:192px;height:128px;border-radius:2px;padding:1px;border:1px solid #ced4da;display:flex;align-items:center;justify-content:center;background:transparent}.excalidraw .PasteChartDialog .ChartPreview div{display:inline-block}.excalidraw .PasteChartDialog .ChartPreview svg{max-height:120px;max-width:186px}.excalidraw .PasteChartDialog .ChartPreview:hover{padding:0;border:2px solid #339af0}",""]);let C=x},9935:(I,D,E)=>{E.r(D),E.d(D,{default:()=>C});var R=E(3645),x=E.n(R)()(function(T){return T[1]});x.push([I.id,".excalidraw .popover{position:absolute;z-index:10}",""]);let C=x},3874:(I,D,E)=>{E.r(D),E.d(D,{default:()=>C});var R=E(3645),x=E.n(R)()(function(T){return T[1]});x.push([I.id,".excalidraw .Stack{--gap: 0;display:grid;gap:calc(var(--space-factor) * var(--gap))}.excalidraw .Stack_vertical{grid-template-columns:auto;grid-auto-flow:row;grid-auto-rows:-webkit-min-content;grid-auto-rows:min-content}.excalidraw .Stack_horizontal{grid-template-rows:auto;grid-auto-flow:column;grid-auto-columns:-webkit-min-content;grid-auto-columns:min-content}",""]);let C=x},2681:(I,D,E)=>{E.r(D),E.d(D,{default:()=>C});var R=E(3645),x=E.n(R)()(function(T){return T[1]});x.push([I.id,":export{themeFilter:invert(93%) hue-rotate(180deg)}.excalidraw .Stats{position:absolute;top:64px;right:12px;font-size:12px;z-index:999}.excalidraw .Stats h3{margin:0 24px 8px 0;white-space:nowrap}.excalidraw .Stats .close{float:right;height:16px;width:16px;cursor:pointer}.excalidraw .Stats .close svg{width:100%;height:100%}.excalidraw .Stats table{width:100%}.excalidraw .Stats table th{border-bottom:1px solid var(--input-border-color);padding:4px}.excalidraw .Stats table tr td:nth-child(2){min-width:24px;text-align:right}:root[dir=rtl] .excalidraw .Stats{left:12px;right:initial}:root[dir=rtl] .excalidraw .Stats h3{margin:0 0 8px 24px}:root[dir=rtl] .excalidraw .Stats .close{float:left}",""]);let C=x},6759:(I,D,E)=>{E.r(D),E.d(D,{default:()=>C});var R=E(3645),x=E.n(R)()(function(T){return T[1]});x.push([I.id,":export{themeFilter:invert(93%) hue-rotate(180deg)}.excalidraw .TextInput{color:var(--text-primary-color);display:inline-block;border:1.5px solid var(--button-gray-1);line-height:1;padding:.75rem;white-space:nowrap;border-radius:var(--space-factor);background-color:var(--input-bg-color)}.excalidraw .TextInput:not(:focus):hover{background-color:var(--input-hover-bg-color)}.excalidraw .TextInput:focus{outline:none;box-shadow:0 0 0 2px var(--focus-highlight-color)}",""]);let C=x},9650:(I,D,E)=>{E.r(D),E.d(D,{default:()=>C});var R=E(3645),x=E.n(R)()(function(T){return T[1]});x.push([I.id,":export{themeFilter:invert(93%) hue-rotate(180deg)}.excalidraw .Toast{animation:fade-in .5s;background-color:var(--button-gray-1);border-radius:4px;bottom:10px;box-sizing:border-box;cursor:default;left:50%;margin-left:-150px;padding:4px 0;position:absolute;text-align:center;width:300px;z-index:999999}.excalidraw .Toast__message{color:var(--popup-text-color);white-space:pre-wrap}@keyframes fade-in{from{opacity:0}to{opacity:1}}",""]);let C=x},2044:(I,D,E)=>{E.r(D),E.d(D,{default:()=>C});var R=E(3645),x=E.n(R)()(function(T){return T[1]});x.push([I.id,":export{themeFilter:invert(93%) hue-rotate(180deg)}.excalidraw .ToolIcon{display:inline-flex;align-items:center;position:relative;font-family:Cascadia;cursor:pointer;background-color:var(--button-gray-1);-webkit-tap-highlight-color:transparent;border-radius:var(--space-factor)}.excalidraw .ToolIcon__icon{width:2.5rem;height:2.5rem;color:var(--icon-fill-color);display:flex;justify-content:center;align-items:center;border-radius:var(--space-factor)}.excalidraw .ToolIcon__icon svg{position:relative;height:1em;fill:var(--icon-fill-color);color:var(--icon-fill-color)}.excalidraw .ToolIcon__icon+.ToolIcon__label{margin-inline-start:0}.excalidraw .ToolIcon__label{color:var(--icon-fill-color);font-family:var(--ui-font);margin:0 .8em;text-overflow:ellipsis}.excalidraw .ToolIcon_size_s .ToolIcon__icon{width:1.4rem;height:1.4rem;font-size:.8em}.excalidraw .excalidraw .ToolIcon_type_button,.excalidraw .Modal .ToolIcon_type_button,.excalidraw .ToolIcon_type_button{padding:0;border:none;margin:0;font-size:inherit}.excalidraw .excalidraw .ToolIcon_type_button:hover,.excalidraw .Modal .ToolIcon_type_button:hover,.excalidraw .ToolIcon_type_button:hover{background-color:var(--button-gray-1)}.excalidraw .excalidraw .ToolIcon_type_button:active,.excalidraw .Modal .ToolIcon_type_button:active,.excalidraw .ToolIcon_type_button:active{background-color:var(--button-gray-2)}.excalidraw .excalidraw .ToolIcon_type_button:focus,.excalidraw .Modal .ToolIcon_type_button:focus,.excalidraw .ToolIcon_type_button:focus{box-shadow:0 0 0 2px var(--focus-highlight-color)}.excalidraw .excalidraw .ToolIcon_type_button.ToolIcon--selected,.excalidraw .Modal .ToolIcon_type_button.ToolIcon--selected,.excalidraw .ToolIcon_type_button.ToolIcon--selected{background-color:var(--button-gray-2)}.excalidraw .excalidraw .ToolIcon_type_button.ToolIcon--selected:active,.excalidraw .Modal .ToolIcon_type_button.ToolIcon--selected:active,.excalidraw .ToolIcon_type_button.ToolIcon--selected:active{background-color:var(--button-gray-3)}.excalidraw .excalidraw .ToolIcon_type_button--show,.excalidraw .Modal .ToolIcon_type_button--show,.excalidraw .ToolIcon_type_button--show{visibility:visible}.excalidraw .excalidraw .ToolIcon_type_button--hide,.excalidraw .Modal .ToolIcon_type_button--hide,.excalidraw .ToolIcon_type_button--hide{visibility:hidden}.excalidraw .ToolIcon_type_radio,.excalidraw .ToolIcon_type_checkbox{position:absolute;opacity:0;pointer-events:none}.excalidraw .ToolIcon_type_radio:not(.ToolIcon_toggle_opaque):checked+.ToolIcon__icon,.excalidraw .ToolIcon_type_checkbox:not(.ToolIcon_toggle_opaque):checked+.ToolIcon__icon{background-color:var(--button-gray-2)}.excalidraw .ToolIcon_type_radio:focus+.ToolIcon__icon,.excalidraw .ToolIcon_type_checkbox:focus+.ToolIcon__icon{box-shadow:0 0 0 2px var(--focus-highlight-color)}.excalidraw .ToolIcon_type_radio:active+.ToolIcon__icon,.excalidraw .ToolIcon_type_checkbox:active+.ToolIcon__icon{background-color:var(--button-gray-3)}.excalidraw .ToolIcon_type_floating{background-color:transparent}.excalidraw .ToolIcon_type_floating:hover{background-color:transparent}.excalidraw .ToolIcon_type_floating:active{background-color:transparent}.excalidraw .ToolIcon_type_floating:focus{box-shadow:none}.excalidraw .ToolIcon_type_floating .ToolIcon__icon{width:2rem;height:2em}.excalidraw .ToolIcon.ToolIcon__lock.ToolIcon_type_floating{margin-left:.1rem}.excalidraw .ToolIcon__keybinding{position:absolute;bottom:2px;right:3px;font-size:.5em;color:var(--keybinding-color);font-family:var(--ui-font);-webkit-user-select:none;user-select:none}@media(max-width: 425px){.excalidraw .Shape .ToolIcon__icon{width:2rem;height:2rem}.excalidraw .Shape .ToolIcon__icon svg{height:.8em}}@media(max-width: 760px){.excalidraw .ToolIcon.ToolIcon__lock{display:inline-block;position:absolute;top:60px;right:-8px;margin-left:0;border-radius:20px 0 0 20px;z-index:1;background-color:var(--button-gray-1)}.excalidraw .ToolIcon.ToolIcon__lock:hover{background-color:var(--button-gray-1)}.excalidraw .ToolIcon.ToolIcon__lock:active{background-color:var(--button-gray-2)}.excalidraw .ToolIcon.ToolIcon__lock .ToolIcon__icon{border-radius:inherit}.excalidraw .ToolIcon.ToolIcon__lock svg{position:static}}.excalidraw .TooltipIcon{width:.9em;height:.9em;margin-left:5px;margin-top:1px}.excalidraw--mobile.excalidraw .TooltipIcon{display:none}:root[dir=ltr] .excalidraw .unlocked-icon{left:2px}:root[dir=rtl] .excalidraw .unlocked-icon{right:2px}",""]);let C=x},6626:(I,D,E)=>{E.r(D),E.d(D,{default:()=>C});var R=E(3645),x=E.n(R)()(function(T){return T[1]});x.push([I.id,':export{themeFilter:invert(93%) hue-rotate(180deg)}.excalidraw .Tooltip{position:relative}.excalidraw .Tooltip__label{--arrow-size: 4px;visibility:hidden;background:#000;color:#fff;text-align:center;border-radius:6px;padding:8px;position:absolute;z-index:10;font-size:13px;line-height:1.5;font-weight:500;left:calc(50% + var(--arrow-size) / 2 - 1px);transform:translateX(-50%);word-wrap:break-word}.excalidraw .Tooltip__label::after{content:"";border:var(--arrow-size) solid transparent;position:absolute;left:calc(50% - var(--arrow-size))}.excalidraw .Tooltip__label--above{bottom:calc(100% + var(--arrow-size) + 3px)}.excalidraw .Tooltip__label--above::after{border-top-color:#000;top:100%}.excalidraw .Tooltip__label--below{top:calc(100% + var(--arrow-size) + 3px)}.excalidraw .Tooltip__label--below::after{border-bottom-color:#000;bottom:100%}.excalidraw .Tooltip:hover .Tooltip__label{visibility:visible}.excalidraw .Tooltip__label:hover{visibility:visible}',""]);let C=x},6359:(I,D,E)=>{E.r(D),E.d(D,{default:()=>C});var R=E(3645),x=E.n(R)()(function(T){return T[1]});x.push([I.id,".excalidraw .UserList{pointer-events:none;padding:var(--space-factor) var(--space-factor) var(--space-factor) var(--space-factor);display:flex;flex-wrap:wrap;justify-content:flex-end}.excalidraw .UserList>*{pointer-events:all;margin:0 0 var(--space-factor) var(--space-factor)}.excalidraw .UserList_mobile{padding:0;justify-content:normal}.excalidraw .UserList_mobile>*{margin:0 var(--space-factor) var(--space-factor) 0}",""]);let C=x},9915:(I,D,E)=>{E.r(D),E.d(D,{default:()=>C});var R=E(3645),x=E.n(R)()(function(T){return T[1]});x.push([I.id,".visually-hidden{position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px);white-space:nowrap;-webkit-user-select:none;user-select:none}.LoadingMessage{position:absolute;top:0;right:0;bottom:0;left:0;z-index:999;display:flex;align-items:center;justify-content:center;pointer-events:none}.LoadingMessage span{background-color:var(--button-gray-1);border-radius:5px;padding:.8em 1.2em;color:var(--popup-text-color);font-size:1.3em}",""]);let C=x},9310:(I,D,E)=>{E.r(D),E.d(D,{default:()=>C});var R=E(3645),x=E.n(R)()(function(T){return T[1]});x.push([I.id,`:export{themeFilter:invert(93%) hue-rotate(180deg)}:export{themeFilter:invert(93%) hue-rotate(180deg)}.excalidraw{--theme-filter: none;--button-destructive-bg-color: #ffe3e3;--button-destructive-color: #c92a2a;--button-gray-1: #e9ecef;--button-gray-2: #ced4da;--button-gray-3: #adb5bd;--button-special-active-bg-color: #ebfbee;--dialog-border-color: #868e96;--dropdown-icon: url('data:image/svg+xml,');--focus-highlight-color: #a5d8ff;--icon-fill-color: #000000;--icon-green-fill-color: #2b8a3e;--default-bg-color: #ffffff;--input-bg-color: #ffffff;--input-border-color: #dee2e6;--input-hover-bg-color: #f1f3f5;--input-label-color: #495057;--island-bg-color: rgba(255, 255, 255, 0.96);--keybinding-color: #adb5bd;--link-color: #1c7ed6;--overlay-bg-color: rgba(255, 255, 255, 0.88);--popup-bg-color: #ffffff;--popup-secondary-bg-color: #f1f3f5;--popup-text-color: #000000;--popup-text-inverted-color: #ffffff;--sab: env(safe-area-inset-bottom);--sal: env(safe-area-inset-left);--sar: env(safe-area-inset-right);--sat: env(safe-area-inset-top);--select-highlight-color: #339af0;--shadow-island: 0 1px 5px rgba(0, 0, 0, 0.15);--space-factor: 0.25rem;--text-primary-color: #343a40}.excalidraw.theme--dark{background:#000}.excalidraw.theme--dark.theme--dark-background-none{background:none}.excalidraw.theme--dark{--theme-filter: invert(93%) hue-rotate(180deg);--button-destructive-bg-color: #5a0000;--button-destructive-color: #ffa8a8;--button-gray-1: #363636;--button-gray-2: #272727;--button-gray-3: #222;--button-special-active-bg-color: #204624;--dialog-border-color: #212529;--dropdown-icon: url('data:image/svg+xml,');--focus-highlight-color: #228be6;--icon-fill-color: #ced4da;--icon-green-fill-color: #69db7c;--default-bg-color: #121212;--input-bg-color: #121212;--input-border-color: #2e2e2e;--input-hover-bg-color: #181818;--input-label-color: #e9ecef;--island-bg-color: rgba(30, 30, 30, 0.98);--keybinding-color: #868e96;--overlay-bg-color: rgba(52, 58, 64, 0.12);--popup-bg-color: #2c2c2c;--popup-secondary-bg-color: #222;--popup-text-color: #ced4da;--popup-text-inverted-color: #2c2c2c;--select-highlight-color: #4dabf7;--shadow-island: 0 1px 5px rgba(0, 0, 0, 0.3);--text-primary-color: #ced4da}:root{--zIndex-canvas: 1;--zIndex-wysiwyg: 2;--zIndex-layerUI: 3}.excalidraw{position:relative;overflow:hidden;color:var(--text-primary-color);display:flex;top:0;bottom:0;left:0;right:0;height:100%;width:100%;-webkit-user-select:none;user-select:none}.excalidraw:focus{outline:none}.excalidraw a{font-weight:500;text-decoration:none;color:var(--link-color)}.excalidraw a:hover{text-decoration:underline}.excalidraw canvas{touch-action:none;image-rendering:pixelated;image-rendering:-moz-crisp-edges;z-index:var(--zIndex-canvas)}.excalidraw #canvas{position:absolute}.excalidraw.theme--dark canvas{filter:var(--theme-filter)}.excalidraw .FixedSideContainer{padding-top:var(--sat, 0);padding-right:var(--sar, 0);padding-bottom:var(--sab, 0);padding-left:var(--sal, 0)}.excalidraw .panelRow{display:flex;justify-content:space-between}.excalidraw .panelColumn{display:flex;flex-direction:column}.excalidraw .panelColumn h3,.excalidraw .panelColumn legend,.excalidraw .panelColumn .control-label{margin-top:.333rem;margin-bottom:.333rem;font-size:.75rem;color:var(--text-primary-color);font-weight:bold;display:block}.excalidraw .panelColumn .control-label input{display:block;width:100%}.excalidraw .panelColumn h3:first-child,.excalidraw .panelColumn legend:first-child,.excalidraw .panelColumn .control-label:first-child{margin-top:0}.excalidraw .panelColumn legend{padding:0}.excalidraw .panelColumn .iconSelectList{flex-wrap:wrap;position:relative}.excalidraw .panelColumn .buttonList{flex-wrap:wrap}.excalidraw .panelColumn .buttonList label{margin-right:.25rem;font-size:.75rem;display:inline-block}.excalidraw .panelColumn .buttonList input[type=radio],.excalidraw .panelColumn .buttonList input[type=button]{opacity:0;position:absolute;pointer-events:none}.excalidraw .panelColumn .buttonList .iconRow{margin-top:8px}.excalidraw .panelColumn .buttonList .ToolIcon{margin:0;margin-inline-end:8px}.excalidraw .panelColumn .buttonList .ToolIcon:focus{outline:transparent;box-shadow:0 0 0 2px var(--focus-highlight-color)}.excalidraw .panelColumn .buttonList .ToolIcon:hover{background-color:var(--button-gray-2)}.excalidraw .panelColumn .buttonList .ToolIcon:active{background-color:var(--button-gray-3)}.excalidraw .panelColumn .buttonList .ToolIcon:disabled{cursor:not-allowed}.excalidraw .panelColumn .buttonList .ToolIcon__icon{width:28px;height:28px}.excalidraw .panelColumn fieldset{margin:0;margin-top:.333rem;padding:0;border:none}.excalidraw .divider{width:1px;background-color:#e9ecef;margin:1px}.excalidraw .buttonList label:focus-within,.excalidraw input:focus{outline:transparent;box-shadow:0 0 0 2px var(--focus-highlight-color)}.excalidraw button,.excalidraw .buttonList label{-webkit-user-select:none;user-select:none;background-color:var(--button-gray-1);border:0;border-radius:4px;margin:.125rem 0;padding:.25rem;white-space:nowrap;cursor:pointer}.excalidraw button:focus,.excalidraw .buttonList label:focus{outline:transparent;box-shadow:0 0 0 2px var(--focus-highlight-color)}.excalidraw button:hover,.excalidraw .buttonList label:hover{background-color:var(--button-gray-2)}.excalidraw button:active,.excalidraw .buttonList label:active{background-color:var(--button-gray-3)}.excalidraw button:disabled,.excalidraw .buttonList label:disabled{cursor:not-allowed}.excalidraw .active,.excalidraw .buttonList label.active{background-color:var(--button-gray-2)}.excalidraw .active:hover,.excalidraw .buttonList label.active:hover{background-color:var(--button-gray-2)}.excalidraw .active:active,.excalidraw .buttonList label.active:active{background-color:var(--button-gray-3)}.excalidraw .buttonList.buttonListIcon label{display:inline-flex;justify-content:center;align-items:center}.excalidraw .buttonList.buttonListIcon label svg{width:36px;height:14px;padding:2px;opacity:.6}.excalidraw .buttonList.buttonListIcon label.active svg{opacity:1}.excalidraw .App-top-bar{z-index:var(--zIndex-layerUI);display:flex;flex-direction:column;align-items:center}.excalidraw .App-bottom-bar{position:absolute;top:0;bottom:0;left:0;right:0;--bar-padding: calc(4 * var(--space-factor));padding-top:max(var(--bar-padding), var(--sat,0));padding-right:var(--sar, 0);padding-bottom:var(--sab, 0);padding-left:var(--sal, 0);z-index:4;display:flex;align-items:flex-end;pointer-events:none}.excalidraw .App-bottom-bar>.Island{width:100%;max-width:100%;min-width:100%;box-sizing:border-box;max-height:100%;display:flex;flex-direction:column;pointer-events:initial}.excalidraw .App-bottom-bar>.Island .panelColumn{padding:8px 8px 0 8px}.excalidraw .App-toolbar{width:100%;box-sizing:border-box}.excalidraw .App-toolbar-content{display:flex;align-items:center;justify-content:space-between;padding:8px}.excalidraw .App-mobile-menu{width:100%;overflow-x:visible;overflow-y:auto;box-sizing:border-box;margin-bottom:var(--bar-padding)}.excalidraw .App-menu{display:grid;color:var(--icon-fill-color)}.excalidraw .App-menu_top{grid-template-columns:1fr auto 1fr;grid-gap:4px;align-items:flex-start;cursor:default;pointer-events:none !important}.excalidraw .layer-ui__wrapper:not(.disable-pointerEvents) .App-menu_top>*{pointer-events:all}.excalidraw .App-menu_top>*:first-child{justify-self:flex-start}.excalidraw .App-menu_top>*:last-child{justify-self:flex-end}.excalidraw .App-menu_bottom{position:absolute;bottom:0;grid-template-columns:-webkit-min-content auto -webkit-min-content;grid-template-columns:min-content auto min-content;grid-gap:15px;align-items:flex-start;cursor:default;pointer-events:none !important;z-index:100}:root[dir=ltr] .excalidraw .App-menu_bottom{left:.25rem}:root[dir=rtl] .excalidraw .App-menu_bottom{right:.25rem}.excalidraw .App-menu_bottom--transition-left section{width:185px}.excalidraw .App-menu_bottom section{display:flex}.excalidraw .layer-ui__wrapper:not(.disable-pointerEvents) .App-menu_bottom>*{pointer-events:all}.excalidraw .App-menu_bottom>*:first-child{justify-self:flex-start}.excalidraw .App-menu_bottom>*:last-child{justify-self:flex-end}.excalidraw .App-menu_left{grid-template-rows:1fr auto 1fr;height:100%}.excalidraw .App-menu_right{grid-template-rows:1fr;height:100%}.excalidraw .App-menu__left{overflow-y:auto}.excalidraw .dropdown-select{height:1.5rem;padding:0;padding-inline-start:.5rem;padding-inline-end:1.5rem;color:var(--icon-fill-color);background-color:var(--button-gray-1);border-radius:var(--space-factor);border:1px solid var(--button-gray-2);font-size:.8rem;outline:none;-webkit-appearance:none;appearance:none;background-image:var(--dropdown-icon);background-repeat:no-repeat;background-position:right .7rem top 50%,0 0;background-size:.65em auto,100%}:root[dir=rtl] .excalidraw .dropdown-select{background-position:left .7rem top 50%,0 0}.excalidraw .dropdown-select:focus{box-shadow:0 0 0 2px var(--focus-highlight-color)}.excalidraw .dropdown-select:hover{background-color:var(--button-gray-2)}.excalidraw .dropdown-select:active{background-color:var(--button-gray-2)}.excalidraw .dropdown-select.dropdown-select--floating{margin:.5em}.excalidraw .dropdown-select__language.dropdown-select--floating{bottom:10px}:root[dir=ltr] .excalidraw .dropdown-select__language.dropdown-select--floating{right:44px}:root[dir=rtl] .excalidraw .dropdown-select__language.dropdown-select--floating{left:44px}.excalidraw .zIndexButton{margin:0;margin-inline-end:8px;padding:5px;display:inline-flex;align-items:center;justify-content:center}.excalidraw .zIndexButton svg{width:18px;height:18px}.excalidraw .scroll-back-to-content{color:var(--popup-text-color);position:absolute;left:50%;bottom:30px;transform:translateX(-50%);padding:10px 20px}.excalidraw .help-icon{cursor:pointer;fill:#868e96;width:1.5rem;padding:0;margin:0;margin-top:5px;background:none;color:var(--icon-fill-color)}.excalidraw .help-icon:hover{background:none}:root[dir=ltr] .excalidraw .help-icon{margin-right:14px}:root[dir=rtl] .excalidraw .help-icon{margin-left:14px}.excalidraw--mobile.excalidraw aside{display:none}.excalidraw--mobile.excalidraw .scroll-back-to-content{bottom:calc(80px + var(--sab, 0));z-index:-1}:root[dir=rtl] .excalidraw .rtl-mirror{transform:scaleX(-1)}.excalidraw .zen-mode-visibility{visibility:visible;opacity:1;height:auto;width:auto;transition:opacity .5s}.excalidraw .zen-mode-visibility.zen-mode-visibility--hidden{visibility:hidden;opacity:0;height:0;width:0;transition:opacity .5s}.excalidraw .disable-pointerEvents{pointer-events:none !important}.excalidraw.excalidraw--view-mode .App-menu{display:flex;justify-content:space-between}@media print{.excalidraw .App-bottom-bar,.excalidraw .FixedSideContainer,.excalidraw .layer-ui__wrapper{display:none}}.ErrorSplash.excalidraw{min-height:100vh;padding:20px 0;overflow:auto;display:flex;align-items:center;justify-content:center;-webkit-user-select:text;user-select:text}.ErrorSplash.excalidraw .ErrorSplash-messageContainer{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px;background-color:#ffe3e3;border:3px solid #c92a2a}.ErrorSplash.excalidraw .ErrorSplash-paragraph{margin:15px 0;max-width:600px}.ErrorSplash.excalidraw .ErrorSplash-paragraph.align-center{text-align:center}.ErrorSplash.excalidraw .bigger,.ErrorSplash.excalidraw .bigger button{font-size:1.1em}.ErrorSplash.excalidraw .smaller,.ErrorSplash.excalidraw .smaller button{font-size:.9em}.ErrorSplash.excalidraw .ErrorSplash-details{display:flex;flex-direction:column;align-items:flex-start}.ErrorSplash.excalidraw .ErrorSplash-details textarea{width:100%;margin:10px 0;font-family:"Cascadia";font-size:.8em}`,""]);let C=x},6464:(I,D,E)=>{E.r(D),E.d(D,{default:()=>C});var R=E(3645),x=E.n(R)()(function(T){return T[1]});x.push([I.id,"",""]),x.locals={themeFilter:"invert(93%) hue-rotate(180deg)"};let C=x},3645:I=>{I.exports=function(D){var E=[];return E.toString=function(){return this.map(function(R){var x=D(R);return R[2]?"@media ".concat(R[2]," {").concat(x,"}"):x}).join("")},E.i=function(R,x,C){typeof R=="string"&&(R=[[null,R,""]]);var T={};if(C)for(var F=0;F{I.exports=function(D,E){return E||(E={}),typeof(D=D&&D.__esModule?D.default:D)!="string"?D:(/^['"].*['"]$/.test(D)&&(D=D.slice(1,-1)),E.hash&&(D+=E.hash),/["'() \t\n]/.test(D)||E.needQuotes?'"'.concat(D.replace(/"/g,'\\"').replace(/\n/g,"\\n"),'"'):D)}},9638:(I,D,E)=>{E.d(D,{Z:()=>R});let R=E.p+"excalidraw-assets/Cascadia.woff2"},7464:(I,D,E)=>{E.d(D,{Z:()=>R});let R=E.p+"excalidraw-assets/Virgil.woff2"},8288:(I,D,E)=>{E.d(D,{iC:()=>T,f:()=>F,qx:()=>G,Iw:()=>V,$e:()=>m,wZ:()=>j,ay:()=>ne,oc:()=>Q,Oh:()=>se,Ks:()=>R,Vi:()=>nt,$C:()=>Tt,ut:()=>Ee,_D:()=>ve,n5:()=>ge,rk:()=>Ge,Hg:()=>ze,hs:()=>$e,k:()=>Z,LO:()=>ee,r8:()=>Oe,pb:()=>L,Gj:()=>q,nM:()=>ce,Lg:()=>ye,HM:()=>je,V4:()=>ae,EH:()=>pt,ZF:()=>Ft,UO:()=>lr,ah:()=>Tn,cW:()=>io,kV:()=>ao,sS:()=>Al,Yx:()=>Xo,zK:()=>Yi});var R,x=E(8635),C=E.n(x),T="Excalidraw",F=10,G=8,V=5,m=1,j=30,ne=Math.PI/12,Q={TEXT:"text",CROSSHAIR:"crosshair",GRABBING:"grabbing",POINTER:"pointer",MOVE:"move",AUTO:""},se={MAIN:0,WHEEL:1,SECONDARY:2,TOUCH:-1};(function(st){st.COPY="copy",st.PASTE="paste",st.CUT="cut",st.KEYDOWN="keydown",st.KEYUP="keyup",st.MOUSE_MOVE="mousemove",st.RESIZE="resize",st.UNLOAD="unload",st.BLUR="blur",st.DRAG_OVER="dragover",st.DROP="drop",st.GESTURE_END="gestureend",st.BEFORE_UNLOAD="beforeunload",st.GESTURE_START="gesturestart",st.GESTURE_CHANGE="gesturechange",st.POINTER_MOVE="pointermove",st.POINTER_UP="pointerup",st.STATE_CHANGE="statechange",st.WHEEL="wheel",st.TOUCH_START="touchstart",st.TOUCH_END="touchend",st.HASHCHANGE="hashchange",st.VISIBILITY_CHANGE="visibilitychange",st.SCROLL="scroll"})(R||(R={}));var nt={TEST:"test",DEVELOPMENT:"development"},Tt={SHAPE_ACTIONS_MENU:"App-menu__left"},Ee={1:"Virgil",2:"Helvetica",3:"Cascadia"},ve="Segoe UI Emoji",ge=20,Ge=1,ze="left",$e="top",Z=20,ee={excalidraw:"application/vnd.excalidraw+json",excalidrawlib:"application/vnd.excalidrawlib+json"},Oe={excalidraw:"excalidraw",excalidrawClipboard:"excalidraw/clipboard",excalidrawLibrary:"excalidrawlib"},L=window.location.origin,q=300,ce=500,ye=5e3,je=100,ae=.1,pt={VIEW:"viewMode",ZEN:"zenMode",GRID:"gridMode"},Ft=C().themeFilter,lr={addLibrary:"addLibrary"},Tn={addLibrary:"addLibrary"},io={canvasActions:{changeViewBackgroundColor:!0,clearCanvas:!0,export:!0,loadScene:!0,saveAsScene:!0,saveScene:!0,theme:!0}},ao=730,Al=1e3,Xo=500,Yi=2},1010:(I,D,E)=>{E.r(D),E.d(D,{default:()=>q4,defaultLang:()=>Ee,exportToBlob:()=>U4,exportToCanvas:()=>y1,exportToSvg:()=>Z4,getElementMap:()=>li,getSceneVersion:()=>pw,isInvisiblySmallElement:()=>bo,languages:()=>ve,restore:()=>Ma,restoreAppState:()=>q0,restoreElements:()=>Pa,serializeAsJSON:()=>xs});var R=E(7154),x=E.n(R),C=E(6479),T=E.n(C),F=E(9713),G=E.n(F),V=E(4698),m=E.n(V),j=E(8288);let ne=JSON.parse('{"u2":"@excalidraw/excalidraw","i8":"0.8.0"}');j.Vi.TEST!=="production"&&(E.p=window.EXCALIDRAW_ASSET_PATH||"https://unpkg.com/".concat(ne.u2,"@").concat(ne.i8,"/dist/"));var Q=E(6086),se=E(2829),nt=E(2051),Tt=function(e,t){var n,r,a,s,c={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]};return s={next:p(0),throw:p(1),return:p(2)},typeof Symbol=="function"&&(s[Symbol.iterator]=function(){return this}),s;function p(f){return function(g){return function(u){if(n)throw new TypeError("Generator is already executing.");for(;c;)try{if(n=1,r&&(a=2&u[0]?r.return:u[0]?r.throw||((a=r.return)&&a.call(r),0):r.next)&&!(a=a.call(r,u[1])).done)return a;switch(r=0,a&&(u=[2&u[0],a.value]),u[0]){case 0:case 1:a=u;break;case 4:return c.label++,{value:u[1],done:!1};case 5:c.label++,r=u[1],u=[0];continue;case 7:u=c.ops.pop(),c.trys.pop();continue;default:if(a=c.trys,!((a=a.length>0&&a[a.length-1])||u[0]!==6&&u[0]!==2)){c=0;continue}if(u[0]===3&&(!a||u[1]>a[0]&&u[1]t.label?1:-1}).filter(function(e){return nt[e.code]>=85}),ge="__test__";j.Vi.DEVELOPMENT==="production"&&ve.unshift({code:ge,label:"test language"},{code:"".concat(ge,".rtl"),label:"\u202Atest language (rtl)\u202C",rtl:!0});var Ge,ze=Ee,$e={},Z=function(){var e=(0,Q.Z)(function(t){return Tt(this,function(n){switch(n.label){case 0:return ze=t,document.documentElement.dir=ze.rtl?"rtl":"ltr",document.documentElement.lang=ze.code,t.code.startsWith(ge)?($e={},[3,3]):[3,1];case 1:return[4,E(788)("./".concat(ze.code,".json"))];case 2:$e=n.sent(),n.label=3;case 3:return[2]}})});return function(t){return e.apply(this,arguments)}}(),ee=function(){return ze},Oe=function(e,t){for(var n=0;n0&&a[a.length-1])||u[0]!==6&&u[0]!==2)){c=0;continue}if(u[0]===3&&(!a||u[1]>a[0]&&u[1]{let[g,u]=f;f[0]=(g-r)*c-(u-a)*p+r,f[1]=(g-r)*p+(u-a)*c+a})}}function Ft(e){let t=e[0],n=e[1];return Math.sqrt(Math.pow(t[0]-n[0],2)+Math.pow(t[1]-n[1],2))}function lr(e,t,n,r){let a=t[1]-e[1],s=e[0]-t[0],c=a*e[0]+s*e[1],p=r[1]-n[1],f=n[0]-r[0],g=p*n[0]+f*n[1],u=a*f-p*s;return u?[(f*c-s*g)/u,(a*g-p*c)/u]:null}function Tn(e,t,n){let r=e.length;if(r<3)return!1;let a=[Number.MAX_SAFE_INTEGER,n],s=[t,n],c=0;for(let p=0;p=Math.min(e[0],n[0])&&t[1]<=Math.max(e[1],n[1])&&t[1]>=Math.min(e[1],n[1])}function ao(e,t,n){let r=(t[1]-e[1])*(n[0]-t[0])-(t[0]-e[0])*(n[1]-t[1]);return r===0?0:r>0?1:2}function Al(e,t,n,r){let a=ao(e,t,n),s=ao(e,t,r),c=ao(n,r,e),p=ao(n,r,t);return a!==s&&c!==p||!(a!==0||!io(e,n,t))||!(s!==0||!io(e,r,t))||!(c!==0||!io(n,e,r))||!(p!==0||!io(n,t,r))}function Xo(e,t){let n=[0,0],r=Math.round(t.hachureAngle+90);r&&pt(e,n,r);let a=function(s,c){let p=[...s];p[0].join(",")!==p[p.length-1].join(",")&&p.push([p[0][0],p[0][1]]);let f=[];if(p&&p.length>2){let g=c.hachureGap;g<0&&(g=4*c.strokeWidth),g=Math.max(g,.1);let u=[];for(let w=0;ww.ymink.ymin?1:w.xk.x?1:w.ymax===k.ymax?0:(w.ymax-k.ymax)/Math.abs(w.ymax-k.ymax)),!u.length)return f;let y=[],b=u[0].ymin;for(;y.length||u.length;){if(u.length){let w=-1;for(let k=0;kb);k++)w=k;u.splice(0,w+1).forEach(k=>{y.push({s:b,edge:k})})}if(y=y.filter(w=>!(w.edge.ymax<=b)),y.sort((w,k)=>w.edge.x===k.edge.x?0:(w.edge.x-k.edge.x)/Math.abs(w.edge.x-k.edge.x)),y.length>1)for(let w=0;w=y.length)break;let M=y[w].edge,A=y[k].edge;f.push([[Math.round(M.x),b],[Math.round(A.x),b]])}b+=g,y.forEach(w=>{w.edge.x=w.edge.x+g*w.edge.islope})}}return f}(e,t);return r&&(pt(e,n,-r),function(s,c,p){let f=[];s.forEach(g=>f.push(...g)),pt(f,c,p)}(a,n,-r)),a}class Yi{constructor(t){this.helper=t}fillPolygon(t,n){return this._fillPolygon(t,n)}_fillPolygon(t,n,r=!1){let a=Xo(t,n);if(r){let s=this.connectingLines(t,a);a=a.concat(s)}return{type:"fillSketch",ops:this.renderLines(a,n)}}renderLines(t,n){let r=[];for(let a of t)r.push(...this.helper.doubleLineOps(a[0][0],a[0][1],a[1][0],a[1][1],n));return r}connectingLines(t,n){let r=[];if(n.length>1)for(let a=1;a3){let p=this.splitOnIntersections(t,c);r.push(...p)}}return r}midPointInPolygon(t,n){return Tn(t,(n[0][0]+n[1][0])/2,(n[0][1]+n[1][1])/2)}splitOnIntersections(t,n){let r=Math.max(5,.1*Ft(n)),a=[];for(let s=0;sr&&u>r&&a.push({point:f,distance:g})}}}if(a.length>1){let s=a.sort((f,g)=>f.distance-g.distance).map(f=>f.point);if(Tn(t,...n[0])||s.shift(),Tn(t,...n[1])||s.pop(),s.length<=1)return this.midPointInPolygon(t,n)?[n]:[];let c=[n[0],...s,n[1]],p=[];for(let f=0;f{let p=Ft(c),f=Math.floor(p/(r+a)),g=(p+a-f*(r+a))/2,u=c[0],y=c[1];u[0]>y[0]&&(u=c[1],y=c[0]);let b=Math.atan((y[1]-u[1])/(y[0]-u[0]));for(let w=0;w{let c=Ft(s),p=Math.round(c/(2*n)),f=s[0],g=s[1];f[0]>g[0]&&(f=s[1],g=s[0]);let u=Math.atan((g[1]-f[1])/(g[0]-f[0]));for(let y=0;yu%2?g+n:g+t);s.push({key:"C",data:f}),t=f[4],n=f[5];break}case"Q":s.push({key:"Q",data:[...p]}),t=p[2],n=p[3];break;case"q":{let f=p.map((g,u)=>u%2?g+n:g+t);s.push({key:"Q",data:f}),t=f[2],n=f[3];break}case"A":s.push({key:"A",data:[...p]}),t=p[5],n=p[6];break;case"a":t+=p[5],n+=p[6],s.push({key:"A",data:[p[0],p[1],p[2],p[3],p[4],t,n]});break;case"H":s.push({key:"H",data:[...p]}),t=p[0];break;case"h":t+=p[0],s.push({key:"H",data:[t]});break;case"V":s.push({key:"V",data:[...p]}),n=p[0];break;case"v":n+=p[0],s.push({key:"V",data:[n]});break;case"S":s.push({key:"S",data:[...p]}),t=p[2],n=p[3];break;case"s":{let f=p.map((g,u)=>u%2?g+n:g+t);s.push({key:"S",data:f}),t=f[2],n=f[3];break}case"T":s.push({key:"T",data:[...p]}),t=p[0],n=p[1];break;case"t":t+=p[0],n+=p[1],s.push({key:"T",data:[t,n]});break;case"Z":case"z":s.push({key:"Z",data:[]}),t=r,n=a}return s}function mf(e){let t=[],n="",r=0,a=0,s=0,c=0,p=0,f=0;for(let{key:g,data:u}of e){switch(g){case"M":t.push({key:"M",data:[...u]}),[r,a]=u,[s,c]=u;break;case"C":t.push({key:"C",data:[...u]}),r=u[4],a=u[5],p=u[2],f=u[3];break;case"L":t.push({key:"L",data:[...u]}),[r,a]=u;break;case"H":r=u[0],t.push({key:"L",data:[r,a]});break;case"V":a=u[0],t.push({key:"L",data:[r,a]});break;case"S":{let y=0,b=0;n==="C"||n==="S"?(y=r+(r-p),b=a+(a-f)):(y=r,b=a),t.push({key:"C",data:[y,b,...u]}),p=u[0],f=u[1],r=u[2],a=u[3];break}case"T":{let[y,b]=u,w=0,k=0;n==="Q"||n==="T"?(w=r+(r-p),k=a+(a-f)):(w=r,k=a);let M=r+2*(w-r)/3,A=a+2*(k-a)/3,O=y+2*(w-y)/3,N=b+2*(k-b)/3;t.push({key:"C",data:[M,A,O,N,y,b]}),p=w,f=k,r=y,a=b;break}case"Q":{let[y,b,w,k]=u,M=r+2*(y-r)/3,A=a+2*(b-a)/3,O=w+2*(y-w)/3,N=k+2*(b-k)/3;t.push({key:"C",data:[M,A,O,N,w,k]}),p=y,f=b,r=w,a=k;break}case"A":{let y=Math.abs(u[0]),b=Math.abs(u[1]),w=u[2],k=u[3],M=u[4],A=u[5],O=u[6];y===0||b===0?(t.push({key:"C",data:[r,a,A,O,A,O]}),r=A,a=O):(r!==A||a!==O)&&(gf(r,a,A,O,y,b,w,k,M).forEach(function(N){t.push({key:"C",data:N})}),r=A,a=O);break}case"Z":t.push({key:"Z",data:[]}),r=s,a=c}n=g}return t}function Xi(e,t,n){return[e*Math.cos(n)-t*Math.sin(n),e*Math.sin(n)+t*Math.cos(n)]}function gf(e,t,n,r,a,s,c,p,f,g){let u=(y=c,Math.PI*y/180);var y;let b=[],w=0,k=0,M=0,A=0;if(g)[w,k,M,A]=g;else{[e,t]=Xi(e,t,-u),[n,r]=Xi(n,r,-u);let Ie=(e-n)/2,de=(t-r)/2,le=Ie*Ie/(a*a)+de*de/(s*s);le>1&&(le=Math.sqrt(le),a*=le,s*=le);let Se=a*a,$=s*s,ke=Se*$-Se*de*de-$*Ie*Ie,Ze=Se*de*de+$*Ie*Ie,ue=(p===f?-1:1)*Math.sqrt(Math.abs(ke/Ze));M=ue*a*de/s+(e+n)/2,A=ue*-s*Ie/a+(t+r)/2,w=Math.asin(parseFloat(((t-A)/s).toFixed(9))),k=Math.asin(parseFloat(((r-A)/s).toFixed(9))),ek&&(w-=2*Math.PI),!f&&k>w&&(k-=2*Math.PI)}let O=k-w;if(Math.abs(O)>120*Math.PI/180){let Ie=k,de=n,le=r;k=f&&k>w?w+120*Math.PI/180*1:w+120*Math.PI/180*-1,b=gf(n=M+a*Math.cos(k),r=A+s*Math.sin(k),de,le,a,s,c,0,f,[k,Ie,M,A])}O=k-w;let N=Math.cos(w),U=Math.sin(w),W=Math.cos(k),K=Math.sin(k),B=Math.tan(O/4),Y=4/3*a*B,J=4/3*s*B,_=[e,t],te=[e+Y*U,t-J*N],oe=[n+Y*K,r-J*W],Ae=[n,r];if(te[0]=2*_[0]-te[0],te[1]=2*_[1]-te[1],g)return[te,oe,Ae].concat(b);{b=[te,oe,Ae].concat(b);let Ie=[];for(let de=0;de2){let a=[];for(let s=0;s2*Math.PI&&(w=0,k=2*Math.PI);let M=2*Math.PI/f.curveStepCount,A=Math.min(M/2,(k-w)/2),O=Sf(A,g,u,y,b,w,k,1,f);if(!f.disableMultiStroke){let N=Sf(A,g,u,y,b,w,k,1.5,f);O.push(...N)}return c&&(p?O.push(...sr(g,u,g+y*Math.cos(w),u+b*Math.sin(w),f),...sr(g,u,g+y*Math.cos(k),u+b*Math.sin(k),f)):O.push({op:"lineTo",data:[g,u]},{op:"lineTo",data:[g+y*Math.cos(w),u+b*Math.sin(w)]})),{type:"path",ops:O}}function Ji(e,t){let n=[];if(e.length){let r=t.maxRandomnessOffset||0,a=e.length;if(a>2){n.push({op:"move",data:[e[0][0]+Pe(r,t),e[0][1]+Pe(r,t)]});for(let s=1;s500?.4:-.0016668*f+1.233334;let u=a.maxRandomnessOffset||0;u*u*100>p&&(u=f/10);let y=u/2,b=.2+.2*bf(a),w=a.bowing*a.maxRandomnessOffset*(r-t)/200,k=a.bowing*a.maxRandomnessOffset*(e-n)/200;w=Pe(w,a,g),k=Pe(k,a,g);let M=[],A=()=>Pe(y,a,g),O=()=>Pe(u,a,g),N=a.preserveVertices;return s&&(c?M.push({op:"move",data:[e+(N?0:A()),t+(N?0:A())]}):M.push({op:"move",data:[e+(N?0:Pe(u,a,g)),t+(N?0:Pe(u,a,g))]})),c?M.push({op:"bcurveTo",data:[w+e+(n-e)*b+A(),k+t+(r-t)*b+A(),w+e+2*(n-e)*b+A(),k+t+2*(r-t)*b+A(),n+(N?0:A()),r+(N?0:A())]}):M.push({op:"bcurveTo",data:[w+e+(n-e)*b+O(),k+t+(r-t)*b+O(),w+e+2*(n-e)*b+O(),k+t+2*(r-t)*b+O(),n+(N?0:O()),r+(N?0:O())]}),M}function Ef(e,t,n){let r=[];r.push([e[0][0]+Pe(t,n),e[0][1]+Pe(t,n)]),r.push([e[0][0]+Pe(t,n),e[0][1]+Pe(t,n)]);for(let a=1;a3){let s=[],c=1-n.curveTightness;a.push({op:"move",data:[e[1][0],e[1][1]]});for(let p=1;p+21&&a.push(p)):a.push(p),a.push(e[t+3])}else{let p=.5,f=e[t+0],g=e[t+1],u=e[t+2],y=e[t+3],b=so(f,g,p),w=so(g,u,p),k=so(u,y,p),M=so(b,w,p),A=so(w,k,p),O=so(M,A,p);Uc([f,b,M,O],0,n,a),Uc([O,A,k,y],0,n,a)}var s,c;return a}function zy(e,t){return Rl(e,0,e.length,t)}function Rl(e,t,n,r,a){let s=a||[],c=e[t],p=e[n-1],f=0,g=1;for(let u=t+1;uf&&(f=y,g=u)}return Math.sqrt(f)>r?(Rl(e,t,g+1,r,s),Rl(e,g,n,r,s)):(s.length||s.push(c),s.push(p)),s}function Zc(e,t=.15,n){let r=[],a=(e.length-1)/3;for(let s=0;s0?Rl(r,0,r.length,n):r}let yn="none";class Fl{constructor(t){this.defaultOptions={maxRandomnessOffset:2,roughness:1,bowing:1,stroke:"#000",strokeWidth:1,curveTightness:0,curveFitting:.95,curveStepCount:9,fillStyle:"hachure",fillWeight:-1,hachureAngle:-41,hachureGap:-1,dashOffset:-1,dashGap:-1,zigzagOffset:-1,seed:0,combineNestedSvgPaths:!1,disableMultiStroke:!1,disableMultiStrokeFill:!1,preserveVertices:!1},this.config=t||{},this.config.options&&(this.defaultOptions=this._o(this.config.options))}static newSeed(){return Math.floor(Math.random()*2**31)}_o(t){return t?Object.assign({},this.defaultOptions,t):this.defaultOptions}_d(t,n,r){return{shape:t,sets:n||[],options:r||this.defaultOptions}}line(t,n,r,a,s){let c=this._o(s);return this._d("line",[vf(t,n,r,a,c)],c)}rectangle(t,n,r,a,s){let c=this._o(s),p=[],f=Iy(t,n,r,a,c);if(c.fill){let g=[[t,n],[t+r,n],[t+r,n+a],[t,n+a]];c.fillStyle==="solid"?p.push(Ji(g,c)):p.push(lo(g,c))}return c.stroke!==yn&&p.push(f),this._d("rectangle",p,c)}ellipse(t,n,r,a,s){let c=this._o(s),p=[],f=yf(r,a,c),g=Gc(t,n,c,f);if(c.fill)if(c.fillStyle==="solid"){let u=Gc(t,n,c,f).opset;u.type="fillPath",p.push(u)}else p.push(lo(g.estimatedPoints,c));return c.stroke!==yn&&p.push(g.opset),this._d("ellipse",p,c)}circle(t,n,r,a){let s=this.ellipse(t,n,r,r,a);return s.shape="circle",s}linearPath(t,n){let r=this._o(n);return this._d("linearPath",[Dl(t,!1,r)],r)}arc(t,n,r,a,s,c,p=!1,f){let g=this._o(f),u=[],y=wf(t,n,r,a,s,c,p,!0,g);if(p&&g.fill)if(g.fillStyle==="solid"){let b=wf(t,n,r,a,s,c,!0,!1,g);b.type="fillPath",u.push(b)}else u.push(function(b,w,k,M,A,O,N){let U=b,W=w,K=Math.abs(k/2),B=Math.abs(M/2);K+=Pe(.01*K,N),B+=Pe(.01*B,N);let Y=A,J=O;for(;Y<0;)Y+=2*Math.PI,J+=2*Math.PI;J-Y>2*Math.PI&&(Y=0,J=2*Math.PI);let _=(J-Y)/N.curveStepCount,te=[];for(let oe=Y;oe<=J;oe+=_)te.push([U+K*Math.cos(oe),W+B*Math.sin(oe)]);return te.push([U+K*Math.cos(J),W+B*Math.sin(J)]),te.push([U,W]),lo(te,N)}(t,n,r,a,s,c,g));return g.stroke!==yn&&u.push(y),this._d("arc",u,g)}curve(t,n){let r=this._o(n),a=[],s=Ay(t,r);if(r.fill&&r.fill!==yn&&t.length>=3){let c=Zc(function(p,f=0){let g=p.length;if(g<3)throw new Error("A curve must have at least three points.");let u=[];if(g===3)u.push(qi(p[0]),qi(p[1]),qi(p[2]),qi(p[2]));else{let y=[];y.push(p[0],p[0]);for(let k=1;k{A.length>=4&&k.push(...Zc(A,u)),A=[]},N=()=>{O(),k.length&&(w.push(k),k=[])};for(let{key:W,data:K}of b)switch(W){case"M":N(),M=[K[0],K[1]],k.push(M);break;case"L":O(),k.push([K[0],K[1]]);break;case"C":if(!A.length){let B=k.length?k[k.length-1]:M;A.push([B[0],B[1]])}A.push([K[0],K[1]]),A.push([K[2],K[3]]),A.push([K[4],K[5]]);break;case"Z":O(),k.push([M[0],M[1]])}if(N(),!y)return w;let U=[];for(let W of w){let K=zy(W,y);K.length&&U.push(K)}return U}(t,1,p?4-4*r.simplification:(1+r.roughness)/2);if(s)if(r.combineNestedSvgPaths){let g=[];f.forEach(u=>g.push(...u)),r.fillStyle==="solid"?a.push(Ji(g,r)):a.push(lo(g,r))}else f.forEach(g=>{r.fillStyle==="solid"?a.push(Ji(g,r)):a.push(lo(g,r))});return c&&(p?f.forEach(g=>{a.push(Dl(g,!1,r))}):a.push(function(g,u){let y=mf(hf(Wc(g))),b=[],w=[0,0],k=[0,0];for(let{key:M,data:A}of y)switch(M){case"M":{let O=1*(u.maxRandomnessOffset||0),N=u.preserveVertices;b.push({op:"move",data:A.map(U=>U+(N?0:Pe(O,u)))}),k=[A[0],A[1]],w=[A[0],A[1]];break}case"L":b.push(...sr(k[0],k[1],A[0],A[1],u)),k=[A[0],A[1]];break;case"C":{let[O,N,U,W,K,B]=A;b.push(...Ly(O,N,U,W,K,B,k,u)),k=[K,B];break}case"Z":b.push(...sr(k[0],k[1],w[0],w[1],u)),k=[w[0],w[1]]}return{type:"path",ops:b}}(t,r))),this._d("path",a,r)}opsToPath(t,n){let r="";for(let a of t.ops){let s=typeof n=="number"&&n>=0?a.data.map(c=>+c.toFixed(n)):a.data;switch(a.op){case"move":r+=`M${s[0]} ${s[1]} `;break;case"bcurveTo":r+=`C${s[0]} ${s[1]}, ${s[2]} ${s[3]}, ${s[4]} ${s[5]} `;break;case"lineTo":r+=`L${s[0]} ${s[1]} `}}return r.trim()}toPaths(t){let n=t.sets||[],r=t.options||this.defaultOptions,a=[];for(let s of n){let c=null;switch(s.type){case"path":c={d:this.opsToPath(s),stroke:r.stroke,strokeWidth:r.strokeWidth,fill:yn};break;case"fillPath":c={d:this.opsToPath(s),stroke:yn,strokeWidth:0,fill:r.fill||yn};break;case"fillSketch":c=this.fillSketch(s,r)}c&&a.push(c)}return a}fillSketch(t,n){let r=n.fillWeight;return r<0&&(r=n.strokeWidth/2),{d:this.opsToPath(t),stroke:n.fill||yn,strokeWidth:r,fill:yn}}}class Ny{constructor(t,n){this.canvas=t,this.ctx=this.canvas.getContext("2d"),this.gen=new Fl(n)}draw(t){let n=t.sets||[],r=t.options||this.getDefaultOptions(),a=this.ctx;for(let s of n)switch(s.type){case"path":a.save(),a.strokeStyle=r.stroke==="none"?"transparent":r.stroke,a.lineWidth=r.strokeWidth,r.strokeLineDash&&a.setLineDash(r.strokeLineDash),r.strokeLineDashOffset&&(a.lineDashOffset=r.strokeLineDashOffset),this._drawToContext(a,s),a.restore();break;case"fillPath":a.save(),a.fillStyle=r.fill||"";let c=t.shape==="curve"||t.shape==="polygon"?"evenodd":"nonzero";this._drawToContext(a,s,c),a.restore();break;case"fillSketch":this.fillSketch(a,s,r)}}fillSketch(t,n,r){let a=r.fillWeight;a<0&&(a=r.strokeWidth/2),t.save(),r.fillLineDash&&t.setLineDash(r.fillLineDash),r.fillLineDashOffset&&(t.lineDashOffset=r.fillLineDashOffset),t.strokeStyle=r.fill||"",t.lineWidth=a,this._drawToContext(t,n),t.restore()}_drawToContext(t,n,r="nonzero"){t.beginPath();for(let a of n.ops){let s=a.data;switch(a.op){case"move":t.moveTo(s[0],s[1]);break;case"bcurveTo":t.bezierCurveTo(s[0],s[1],s[2],s[3],s[4],s[5]);break;case"lineTo":t.lineTo(s[0],s[1])}}n.type==="fillPath"?t.fill(r):t.stroke()}get generator(){return this.gen}getDefaultOptions(){return this.gen.defaultOptions}line(t,n,r,a,s){let c=this.gen.line(t,n,r,a,s);return this.draw(c),c}rectangle(t,n,r,a,s){let c=this.gen.rectangle(t,n,r,a,s);return this.draw(c),c}ellipse(t,n,r,a,s){let c=this.gen.ellipse(t,n,r,a,s);return this.draw(c),c}circle(t,n,r,a){let s=this.gen.circle(t,n,r,a);return this.draw(s),s}linearPath(t,n){let r=this.gen.linearPath(t,n);return this.draw(r),r}polygon(t,n){let r=this.gen.polygon(t,n);return this.draw(r),r}arc(t,n,r,a,s,c,p=!1,f){let g=this.gen.arc(t,n,r,a,s,c,p,f);return this.draw(g),g}curve(t,n){let r=this.gen.curve(t,n);return this.draw(r),r}path(t,n){let r=this.gen.path(t,n);return this.draw(r),r}}let Hl="http://www.w3.org/2000/svg";class jy{constructor(t,n){this.svg=t,this.gen=new Fl(n)}draw(t){let n=t.sets||[],r=t.options||this.getDefaultOptions(),a=this.svg.ownerDocument||window.document,s=a.createElementNS(Hl,"g"),c=t.options.fixedDecimalPlaceDigits;for(let p of n){let f=null;switch(p.type){case"path":f=a.createElementNS(Hl,"path"),f.setAttribute("d",this.opsToPath(p,c)),f.setAttribute("stroke",r.stroke),f.setAttribute("stroke-width",r.strokeWidth+""),f.setAttribute("fill","none"),r.strokeLineDash&&f.setAttribute("stroke-dasharray",r.strokeLineDash.join(" ").trim()),r.strokeLineDashOffset&&f.setAttribute("stroke-dashoffset",`${r.strokeLineDashOffset}`);break;case"fillPath":f=a.createElementNS(Hl,"path"),f.setAttribute("d",this.opsToPath(p,c)),f.setAttribute("stroke","none"),f.setAttribute("stroke-width","0"),f.setAttribute("fill",r.fill||""),t.shape!=="curve"&&t.shape!=="polygon"||f.setAttribute("fill-rule","evenodd");break;case"fillSketch":f=this.fillSketch(a,p,r)}f&&s.appendChild(f)}return s}fillSketch(t,n,r){let a=r.fillWeight;a<0&&(a=r.strokeWidth/2);let s=t.createElementNS(Hl,"path");return s.setAttribute("d",this.opsToPath(n,r.fixedDecimalPlaceDigits)),s.setAttribute("stroke",r.fill||""),s.setAttribute("stroke-width",a+""),s.setAttribute("fill","none"),r.fillLineDash&&s.setAttribute("stroke-dasharray",r.fillLineDash.join(" ").trim()),r.fillLineDashOffset&&s.setAttribute("stroke-dashoffset",`${r.fillLineDashOffset}`),s}get generator(){return this.gen}getDefaultOptions(){return this.gen.defaultOptions}opsToPath(t,n){return this.gen.opsToPath(t,n)}line(t,n,r,a,s){let c=this.gen.line(t,n,r,a,s);return this.draw(c)}rectangle(t,n,r,a,s){let c=this.gen.rectangle(t,n,r,a,s);return this.draw(c)}ellipse(t,n,r,a,s){let c=this.gen.ellipse(t,n,r,a,s);return this.draw(c)}circle(t,n,r,a){let s=this.gen.circle(t,n,r,a);return this.draw(s)}linearPath(t,n){let r=this.gen.linearPath(t,n);return this.draw(r)}polygon(t,n){let r=this.gen.polygon(t,n);return this.draw(r)}arc(t,n,r,a,s,c,p=!1,f){let g=this.gen.arc(t,n,r,a,s,c,p,f);return this.draw(g)}curve(t,n){let r=this.gen.curve(t,n);return this.draw(r)}path(t,n){let r=this.gen.path(t,n);return this.draw(r)}}let Jo={canvas:(e,t)=>new Ny(e,t),svg:(e,t)=>new jy(e,t),generator:e=>new Fl(e),newSeed:()=>Fl.newSeed()};function Cf(e){var t,n,r="";if(typeof e=="string"||typeof e=="number")r+=e;else if(typeof e=="object")if(Array.isArray(e))for(t=0;t{if("top"in self&&self!==top)try{top.location}catch{return!1}else{if("chooseFileSystemEntries"in self)return"chooseFileSystemEntries";if("showOpenFilePicker"in self)return"showOpenFilePicker"}return!1})(),Ry=kr?kr==="chooseFileSystemEntries"?E.e(736).then(E.bind(E,9012)):E.e(736).then(E.bind(E,499)):E.e(736).then(E.bind(E,5034));async function Pf(...e){return(await Ry).default(...e)}kr?kr==="chooseFileSystemEntries"?E.e(736).then(E.bind(E,6980)):E.e(736).then(E.bind(E,868)):E.e(736).then(E.bind(E,3110));let Fy=kr?kr==="chooseFileSystemEntries"?E.e(736).then(E.bind(E,1170)):E.e(736).then(E.bind(E,7814)):E.e(736).then(E.bind(E,4001));async function Vl(...e){return(await Fy).default(...e)}let Mf=(e=21)=>{let t="",n=crypto.getRandomValues(new Uint8Array(e));for(;e--;){let r=63&n[e];t+=r<36?r.toString(36):r<62?(r-26).toString(36).toUpperCase():r<63?"_":"-"}return t};var Ht=function(e){return e!=null&&e.type==="text"},cr=function(e){return e!=null&&Hy(e.type)},Hy=function(e){return e==="freedraw"},Et=function(e){return e!=null&&co(e.type)},co=function(e){return e==="arrow"||e==="line"},wn=function(e){return e!=null&&Of(e.type)},Of=function(e){return e==="arrow"},Bl=function(e){return e!=null&&(e.type==="rectangle"||e.type==="diamond"||e.type==="ellipse"||e.type==="text")},Xe=function(e,t,n,r,a){return[(e-n)*Math.cos(a)-(t-r)*Math.sin(a)+n,(e-n)*Math.sin(a)+(t-r)*Math.cos(a)+r]},Qi=function(e,t,n){return Xe(e[0],e[1],t[0],t[1],n)},Kc=function(e,t,n,r,a,s,c,p){var f=Math.cos(r),g=Math.sin(r);return e.e&&e.w?t+=a+c:e.e?(t+=a*(1+f),n+=a*g,t+=c*(1-f),n+=c*-g):e.w&&(t+=a*(1-f),n+=a*-g,t+=c*(1+f),n+=c*g),e.n&&e.s?n+=s+p:e.n?(t+=s*g,n+=s*(1-f),t+=p*-g,n+=p*(1+f)):e.s&&(t+=s*-g,n+=s*(1+f),t+=p*g,n+=p*(1-f)),[t,n]},Bn=function(e,t,n,r){var a=n-e,s=r-t;return Math.hypot(a,s)},uo=function(e,t){if(t===void 0&&(t=1),e.length>=3){var n=[e[0],e[e.length-1]],r=n[0],a=n[1];return Bn(r[0],r[1],a[0],a[1])<=j.qx/t}return!1},Tf=function(e,t,n){var r=e.length;if(r<3)return!1;for(var a=[Number.MAX_SAFE_INTEGER,n],s=[t,n],c=0,p=0;p=Math.min(e[0],n[0])&&t[1]<=Math.max(e[1],n[1])&&t[1]>=Math.min(e[1],n[1])},$i=function(e,t,n){var r=(t[1]-e[1])*(n[0]-t[0])-(t[0]-e[0])*(n[1]-t[1]);return r===0?0:r>0?1:2},Vy=function(e,t,n,r){var a=$i(e,t,n),s=$i(e,t,r),c=$i(n,r,e),p=$i(n,r,t);return a!==s&&c!==p||!(a!==0||!_i(e,n,t))||!(s!==0||!_i(e,r,t))||!(c!==0||!_i(n,e,r))||!(p!==0||!_i(n,t,r))},Wn=function(e,t,n){return n?[Math.round(e/n)*n,Math.round(t/n)*n]:[e,t]},Wl=function(e,t,n){var r=n.map(function(y){return y[e]}),a=Math.max.apply(Math,r),s=Math.min.apply(Math,r),c=a-s,p=c===0?1:t/c,f=1/0,g=n.map(function(y){return y.map(function(b,w){if(w!==e)return b;var k=b*p;return f=Math.min(k,f),k})});if(g.length===2)return g;var u=s-f;return g.map(function(y){return y.map(function(b,w){return w===e?b+u:b})})},it=function(e){return cr(e)?By(e):Et(e)?Wy(e):[e.x,e.y,e.x+e.width,e.y+e.height]},po=function(e){for(var t=0,n=e.sets;t-1)return void t.focus();t=t.parentElement}},yo=function(){return{theme:"light",collaborators:new Map,currentChartType:"bar",currentItemBackgroundColor:"transparent",currentItemEndArrowhead:"arrow",currentItemFillStyle:"hachure",currentItemFontFamily:j.rk,currentItemFontSize:j.n5,currentItemLinearStrokeSharpness:"round",currentItemOpacity:100,currentItemRoughness:1,currentItemStartArrowhead:null,currentItemStrokeColor:qe.Sn,currentItemStrokeSharpness:"sharp",currentItemStrokeStyle:"solid",currentItemStrokeWidth:1,currentItemTextAlign:j.Hg,cursorButton:"up",draggingElement:null,editingElement:null,editingGroupId:null,editingLinearElement:null,elementLocked:!1,elementType:"selection",errorMessage:null,exportBackground:!0,exportEmbedScene:!1,exportWithDarkMode:!1,fileHandle:null,gridSize:null,isBindingEnabled:!0,isLibraryOpen:!1,isLoading:!1,isResizing:!1,isRotating:!1,lastPointerDownWith:"mouse",multiElement:null,name:"".concat(L("labels.untitled"),"-").concat(w2()),openMenu:null,pasteDialog:{shown:!1,data:null},previousSelectedElementIds:{},resizingElement:null,scrolledOutside:!1,scrollX:0,scrollY:0,selectedElementIds:{},selectedGroupIds:{},selectionElement:null,shouldAddWatermark:!1,shouldCacheIgnoreZoom:!1,showHelpDialog:!1,showStats:!1,startBoundElement:null,suggestedBindings:[],toastMessage:null,viewBackgroundColor:qe.ix,zenModeEnabled:!1,zoom:{value:1,translation:{x:0,y:0}},viewModeEnabled:!1}},E2={theme:{browser:!0,export:!1},collaborators:{browser:!1,export:!1},currentChartType:{browser:!0,export:!1},currentItemBackgroundColor:{browser:!0,export:!1},currentItemEndArrowhead:{browser:!0,export:!1},currentItemFillStyle:{browser:!0,export:!1},currentItemFontFamily:{browser:!0,export:!1},currentItemFontSize:{browser:!0,export:!1},currentItemLinearStrokeSharpness:{browser:!0,export:!1},currentItemOpacity:{browser:!0,export:!1},currentItemRoughness:{browser:!0,export:!1},currentItemStartArrowhead:{browser:!0,export:!1},currentItemStrokeColor:{browser:!0,export:!1},currentItemStrokeSharpness:{browser:!0,export:!1},currentItemStrokeStyle:{browser:!0,export:!1},currentItemStrokeWidth:{browser:!0,export:!1},currentItemTextAlign:{browser:!0,export:!1},cursorButton:{browser:!0,export:!1},draggingElement:{browser:!1,export:!1},editingElement:{browser:!1,export:!1},editingGroupId:{browser:!0,export:!1},editingLinearElement:{browser:!1,export:!1},elementLocked:{browser:!0,export:!1},elementType:{browser:!0,export:!1},errorMessage:{browser:!1,export:!1},exportBackground:{browser:!0,export:!1},exportEmbedScene:{browser:!0,export:!1},exportWithDarkMode:{browser:!0,export:!1},fileHandle:{browser:!1,export:!1},gridSize:{browser:!0,export:!0},height:{browser:!1,export:!1},isBindingEnabled:{browser:!1,export:!1},isLibraryOpen:{browser:!1,export:!1},isLoading:{browser:!1,export:!1},isResizing:{browser:!1,export:!1},isRotating:{browser:!1,export:!1},lastPointerDownWith:{browser:!0,export:!1},multiElement:{browser:!1,export:!1},name:{browser:!0,export:!1},offsetLeft:{browser:!1,export:!1},offsetTop:{browser:!1,export:!1},openMenu:{browser:!0,export:!1},pasteDialog:{browser:!1,export:!1},previousSelectedElementIds:{browser:!0,export:!1},resizingElement:{browser:!1,export:!1},scrolledOutside:{browser:!0,export:!1},scrollX:{browser:!0,export:!1},scrollY:{browser:!0,export:!1},selectedElementIds:{browser:!0,export:!1},selectedGroupIds:{browser:!0,export:!1},selectionElement:{browser:!1,export:!1},shouldAddWatermark:{browser:!0,export:!1},shouldCacheIgnoreZoom:{browser:!0,export:!1},showHelpDialog:{browser:!1,export:!1},showStats:{browser:!0,export:!1},startBoundElement:{browser:!1,export:!1},suggestedBindings:{browser:!1,export:!1},toastMessage:{browser:!1,export:!1},viewBackgroundColor:{browser:!0,export:!0},width:{browser:!1,export:!1},zenModeEnabled:{browser:!0,export:!1},zoom:{browser:!0,export:!1},viewModeEnabled:{browser:!1,export:!1}},k2=function(e,t){for(var n={},r=0,a=Object.keys(e);r1;W--){var K=u[W],B=K.runningLength,Y=K.vector,J=Yf(u[W-1].vector,u[W].vector);if(U-B>p/2||J<.8){for(var _=W;_c?c:c/2)*u,2);(Ne||Xf(Le,We)>Je)&&($.push(ql(Le,We,B)),Le=We),(Ne||Xf(Be,Qe)>Je)&&(ke.push(ql(Be,Qe,B)),Be=Qe),Ze=kt,_e=Mt}}var ut=n[0],at=n[le-1],rt=ke.length<2||$.length<2;if(rt&&(!J&&!Ae||W)){for(var Dt=0,zt=0;ztc){Dt=tu(c,f,k,La);break}}for(var gi=$o(ut.point,ei(Jl(nu(Xl(at.point,ut.point))),Dt||ue)),cn=[],un=0;un<=1;un+=.1)cn.push(ca(gi,ut.point,2*ua*un));return cn}var Ao=[];if(!(J||Ae&&rt)){Qe=ke[1],We=$[1];for(var Da=$o(ut.point,ei(nu(Xl(Qe,We)),Jf(Qe,We)/2)),Nt=0;Nt<=1;Nt+=.2)Ao.push(ca(Da,ut.point,ua*Nt));$.shift(),ke.shift()}var Lo=[];if(Ae||J&&rt)Lo.push(at.point);else for(var er=$o(at.point,ei(Jl(at.vector),ue)),Kn=0;Kn<=1;Kn+=.1)Lo.push(ca(er,at.point,3*ua*Kn));return $.concat(Lo,ke.reverse(),Ao)}(S2(e,t),t)};function qf(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),n.push.apply(n,r)}return n}function Ql(e){for(var t=1;t0?Da[Ao-1]:[0,0],Kn=er[0],Kt=er[1];return cn+Math.hypot(Nt-Kn,Lo-Kt)},0),ut=Math.min(Ne,Je/2),at=At-Ce*ut,rt=Lt-Re*ut;if(Qe==="dot")return[At,Lt,Math.hypot(rt-Lt,at-At)+Le.strokeWidth];var Dt={arrow:20,bar:90}[Qe],zt=Xe(at,rt,At,Lt,-Dt*Math.PI/180),Fr=zt[0],La=zt[1],gi=Xe(at,rt,At,Lt,Dt*Math.PI/180);return[At,Lt,Fr,La,gi[0],gi[1]]}(Y,J,_,te);if(oe===null)return[];if(te==="dot"){var Ae=oe[0],Ie=oe[1],de=oe[2];return[t.circle(Ae,Ie,de,Ql(Ql({},M),{},{fill:Y.strokeColor,fillStyle:"solid",stroke:"none"}))]}var le=oe[0],Se=oe[1],$=oe[2],ke=oe[3],Ze=oe[4],ue=oe[5];if(Y.strokeStyle==="dotted"){var _e=Qf(Y.strokeWidth-1);M.strokeLineDash=[_e[0],_e[1]-1]}else delete M.strokeLineDash;return[t.line($,ke,le,Se,M),t.line(Ze,ue,le,Se,M)]};if(N!==null){var B=K(e,n,"start",N);n.push.apply(n,B)}W!==null&&(B=K(e,n,"end",W),n.push.apply(n,B))}break;case"freedraw":oh(e),n=[];break;case"text":n=[]}_l.set(e,n)}},$f=function(e,t){var n=t?t.zoom:P2.zoom,r=iu.get(e),a=r&&r.canvasZoom!==n.value&&!(t!=null&&t.shouldCacheIgnoreZoom);if(!r||a){var s=function(c,p){var f=document.createElement("canvas"),g=f.getContext("2d"),u=_f(c),y=0,b=0;if(Et(c)||cr(c)){var w=it(c),k=w[0],M=w[1],A=w[2],O=w[3];k=Math.floor(k),A=Math.ceil(A),M=Math.floor(M),O=Math.ceil(O),f.width=In(k,A)*window.devicePixelRatio*p.value+u*p.value*2,f.height=In(M,O)*window.devicePixelRatio*p.value+u*p.value*2,y=c.x>k?Math.floor(In(c.x,k))*window.devicePixelRatio*p.value:0,b=c.y>M?Math.floor(In(c.y,M))*window.devicePixelRatio*p.value:0,g.translate(y,b)}else f.width=c.width*window.devicePixelRatio*p.value+u*p.value*2,f.height=c.height*window.devicePixelRatio*p.value+u*p.value*2;g.translate(u*p.value,u*p.value),g.scale(window.devicePixelRatio*p.value,window.devicePixelRatio*p.value);var N=Jo.canvas(f);return ou(c,N,g),g.translate(-u*p.value,-u*p.value),g.scale(1/(window.devicePixelRatio*p.value),1/(window.devicePixelRatio*p.value)),{element:c,canvas:f,canvasZoom:p.value,canvasOffsetX:y,canvasOffsetY:b}}(e,n);return iu.set(e,s),s}return r},eh=function(e,t,n,r){var a=e.element,s=_f(a),c=it(a),p=c[0],f=c[1],g=c[2],u=c[3];cr(a)&&(p=Math.floor(p),g=Math.ceil(g),f=Math.floor(f),u=Math.ceil(u));var y=((p+g)/2+r.scrollX)*window.devicePixelRatio,b=((f+u)/2+r.scrollY)*window.devicePixelRatio;n.scale(1/window.devicePixelRatio,1/window.devicePixelRatio),n.translate(y,b),n.rotate(a.angle),n.drawImage(e.canvas,-(g-p)/2*window.devicePixelRatio-s*e.canvasZoom/e.canvasZoom,-(u-f)/2*window.devicePixelRatio-s*e.canvasZoom/e.canvasZoom,e.canvas.width/e.canvasZoom,e.canvas.height/e.canvasZoom),n.rotate(-a.angle),n.translate(-y,-b),n.scale(window.devicePixelRatio,window.devicePixelRatio)},th=function(e,t,n,r,a){var s=t.generator;switch(e.type){case"selection":n.translate(e.x+a.scrollX,e.y+a.scrollY);var c=n.fillStyle;n.fillStyle="rgba(0, 0, 255, 0.10)",n.fillRect(0,0,e.width,e.height),n.fillStyle=c,n.translate(-e.x-a.scrollX,-e.y-a.scrollY);break;case"freedraw":if($l(e,s),r){var p=$f(e,a);eh(p,0,n,a)}else{var f=it(e),g=f[0],u=f[1],y=f[2],b=f[3],w=(g+y)/2+a.scrollX,k=(u+b)/2+a.scrollY,M=(y-g)/2-(e.x-g),A=(b-u)/2-(e.y-u);n.translate(w,k),n.rotate(e.angle),n.translate(-M,-A),ou(e,t,n),n.translate(M,A),n.rotate(-e.angle),n.translate(-w,-k)}break;case"rectangle":case"diamond":case"ellipse":case"line":case"arrow":case"text":if($l(e,s),r)p=$f(e,a),eh(p,0,n,a);else{var O=it(e);g=O[0],u=O[1],y=O[2],b=O[3],w=(g+y)/2+a.scrollX,k=(u+b)/2+a.scrollY,M=(y-g)/2-(e.x-g),A=(b-u)/2-(e.y-u),n.translate(w,k),n.rotate(e.angle),n.translate(-M,-A),ou(e,t,n),n.translate(M,A),n.rotate(-e.angle),n.translate(-w,-k)}break;default:throw new Error("Unimplemented type ".concat(e.type))}},nh=function(e,t,n){if(n===void 0)return e.draw(t);var r={sets:t.sets,shape:t.shape,options:Ql(Ql({},t.options),{},{fixedDecimalPlaceDigits:n})};return e.draw(r)},rh=new WeakMap([]);function oh(e){var t=ih(e),n=new Path2D(t);return rh.set(e,n),n}function ih(e){var t=e.simulatePressure?e.points:e.points.length?e.points.map(function(f,g){return[f[0],f[1],e.pressures[g]]}):[[0,0,0]],n={simulatePressure:e.simulatePressure,size:6*e.strokeWidth,thinning:.5,smoothing:.5,streamline:.5,easing:function(f){return f*(2-f)},last:!0},r=C2(t,n),a=[],s=r[0],c=r[1];a.push("M",s[0],s[1],"Q");for(var p=0;p=0||(u[f]=c[f]);return u}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var uh=function(e,t){for(var n=0,r=t.length,a=e.length;n-1&&(s=s.slice(0,c))}if(s.length>0){var p=s[s.length-1];n=ph(p,n,t)}}return n},pa=function(e,t){return e.groupIds.includes(t)},pr=function(e,t){return e.filter(function(n){return pa(n,t)})},O2=function(e,t,n){var r=uh([],e),a=n?r.indexOf(n):-1,s=a>-1?a:r.length;return r.splice(s,0,t),r};function mh(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),n.push.apply(n,r)}return n}function xo(e){for(var t=1;t-1?g:s.length,y=0;yK&&(a.n||(W.n=fr(s+k/2-u/2,c-N-w+U,u,y,A,O,t)),a.s||(W.s=fr(s+k/2-u/2,f+N-U,u,y,A,O,t))),Math.abs(M)>K&&(a.w||(W.w=fr(s-N-b+U,c+M/2-y/2,u,y,A,O,t)),a.e||(W.e=fr(p+N-U,c+M/2-y/2,u,y,A,O,t))),W},pu=function(e,t,n){n===void 0&&(n="mouse");var r={};if(e.type==="arrow"||e.type==="line"||e.type==="freedraw"){if(e.points.length===2){var a=e.points[1];a[0]===0||a[1]===0?r=uu:a[0]>0&&a[1]<0?r=wh:a[0]>0&&a[1]>0?r=uu:a[0]<0&&a[1]>0?r=wh:a[0]<0&&a[1]<0&&(r=uu)}}else e.type==="text"&&(r=I2);return du(it(e),e.angle,t,n,r)},Qt=function(e,t){return[0,0,0,0,t,e,1,0]},ko=function(e,t){e===void 0&&(e=0),t===void 0&&(t=0);var n=[0,0,0,0,0,0,0,0];if(t<0||t>7)throw new Error("Expected `index` betwen 0 and 7, got `".concat(t,"`"));return e!==0&&(n[t]=e),n},rs=function(e){return[e[0],e[1],e[2],e[3],-e[4],-e[5],-e[6],-e[7]]},bh=function(e,t){return fu(t)?[e[0]-t,e[1],e[2],e[3],e[4],e[5],e[6],e[7]]:[e[0]-t[0],e[1]-t[1],e[2]-t[2],e[3]-t[3],e[4]-t[4],e[5]-t[5],e[6]-t[6],e[7]-t[7]]},ii=function(e,t){return fu(t)?[e[0]*t,e[1]*t,e[2]*t,e[3]*t,e[4]*t,e[5]*t,e[6]*t,e[7]*t]:[A2(e,t),t[1]*e[0]+t[0]*e[1]-t[4]*e[2]+t[5]*e[3]+t[2]*e[4]-t[3]*e[5]-t[7]*e[6]-t[6]*e[7],t[2]*e[0]+t[0]*e[2]-t[6]*e[3]+t[3]*e[6],t[3]*e[0]+t[6]*e[2]+t[0]*e[3]-t[2]*e[6],t[4]*e[0]+t[2]*e[1]-t[1]*e[2]+t[7]*e[3]+t[0]*e[4]+t[6]*e[5]-t[5]*e[6]+t[3]*e[7],t[5]*e[0]-t[3]*e[1]+t[7]*e[2]+t[1]*e[3]-t[6]*e[4]+t[0]*e[5]+t[4]*e[6]+t[2]*e[7],t[6]*e[0]+t[3]*e[2]-t[2]*e[3]+t[0]*e[6],t[7]*e[0]+t[6]*e[1]+t[5]*e[2]+t[4]*e[3]+t[3]*e[4]+t[2]*e[5]+t[1]*e[6]+t[0]*e[7]]},A2=function(e,t){return t[0]*e[0]+t[2]*e[2]+t[3]*e[3]-t[6]*e[6]},xh=function(e,t){return[Eh(e,t),e[1]*t[7]+e[4]*t[5]-e[5]*t[4]+e[7]*t[1],e[2]*t[7]-e[4]*t[6]+e[6]*t[4]+e[7]*t[2],e[3]*t[7]+e[5]*t[6]-e[6]*t[5]+e[7]*t[3],e[4]*t[7]+e[7]*t[4],e[5]*t[7]+e[7]*t[5],e[6]*t[7]+e[7]*t[6],e[7]*t[7]]},Eh=function(e,t){return e[0]*t[7]+e[1]*t[6]+e[2]*t[5]+e[3]*t[4]+e[4]*t[3]+e[5]*t[2]+e[6]*t[1]+e[7]*t[0]},kh=function(e){return Math.sqrt(Math.abs(e[0]*e[0]-e[2]*e[2]-e[3]*e[3]+e[6]*e[6]))},os=function(e){var t=kh(e);if(t===0||t===1)return e;var n=e[6]<0?-1:1;return ii(e,n/t)},L2=function(e){var t=function(n){return Math.sqrt(Math.abs(n[7]*n[7]-n[5]*n[5]-n[4]*n[4]+n[1]*n[1]))}(e);return t===0||t===1?e:ii(e,1/t)},fu=function(e){return typeof e=="number"},fa=(ko(1,1),ko(1,2),ko(1,3),ko(1,4),ko(1,5),ko(1,6),ko(1,7),function(e,t,n){return os([0,n,e,t,0,0,0,0])}),ha=function(e,t){return os(xh(t,e))},D2=function(e,t){return n=e,[(r=t)[0]*n[0]+r[2]*n[2]+r[3]*n[3]-r[6]*n[6],r[1]*n[0]+r[0]*n[1]-r[4]*n[2]+r[5]*n[3]+r[2]*n[4]-r[3]*n[5]-r[7]*n[6]-r[6]*n[7],r[2]*n[0]+r[0]*n[2]-r[6]*n[3]+r[3]*n[6],r[3]*n[0]+r[6]*n[2]+r[0]*n[3]-r[2]*n[6],r[4]*n[0]+r[7]*n[3]+r[0]*n[4]+r[3]*n[7],r[5]*n[0]+r[7]*n[2]+r[0]*n[5]+r[2]*n[7],r[6]*n[0]+r[0]*n[6],r[7]*n[0]+r[0]*n[7]];var n,r},ai=function(e){var t=e[0];return[0,0,0,0,e[1],t,1,0]},So=function(e){return[e[5],e[4]]},z2=function(e,t){return os((n=e,[(r=t)[0]*n[0],r[1]*n[0]+r[0]*n[1],r[2]*n[0]+r[0]*n[2],r[3]*n[0]+r[0]*n[3],r[4]*n[0]+r[2]*n[1]-r[1]*n[2]+r[0]*n[4],r[5]*n[0]-r[3]*n[1]+r[1]*n[3]+r[0]*n[5],r[6]*n[0]+r[3]*n[2]-r[2]*n[3]+r[0]*n[6],r[7]*n[0]+r[6]*n[1]+r[5]*n[2]+r[4]*n[3]+r[3]*n[4]+r[2]*n[5]+r[1]*n[6]]));var n,r},Sh=function(e,t){return kh(xh(e,t))},hr=function(e,t){return Eh(e,t)},Ch=function(e){return[0,0,0,0,e[4],e[5],0,0]},Ph=function(e,t){return n=ii(e,Math.sin(t/2)),r=Math.cos(t/2),fu(r)?[n[0]+r,n[1],n[2],n[3],n[4],n[5],n[6],n[7]]:[n[0]+r[0],n[1]+r[1],n[2]+r[2],n[3]+r[3],n[4]+r[4],n[5]+r[5],n[6]+r[6],n[7]+r[7]];var n,r},Qn=function(e,t){return os(ii(ii(e,t),rs(e)))},Mh=function(e,t,n,r){var a=10/t.zoom.value;return!Oh(e,t,[n,r])&&Th(e,[n,r],a)},Oh=function(e,t,n){var r=10/t.zoom.value,a=e.type==="text"?j2:function(s){if(s.type==="arrow")return!1;if(s.type==="freedraw")return!0;var c=s.backgroundColor!=="transparent";return s.type==="line"?c&&uo(s.points):c}(e)?as:R2;return Ah({element:e,point:n,threshold:r,check:a})},N2=function(e,t){return e.selectedElementIds[t.id]},Th=function(e,t,n){var r=t[0],a=t[1],s=it(e),c=s[0],p=s[1],f=s[2],g=s[3],u=Xe(r,a,(c+f)/2,(p+g)/2,-e.angle),y=u[0],b=u[1];return y>c-n&&yp-n&&bO?k:KO?w:y,Math.hypot(a-y[1],r-y[0])=0?[]:[z2(e,ha(n,r))]},Y2=function(e,t){var n=e[0],r=e[1],a=function(s,c){var p=.5*c;return[1,0,0,0,p*s[4],p*s[5],0,0]}(function(s,c){return L2([0,0,0,0,c[4]-s[4],c[5]-s[5],0,0])}(n,r),t);return[Qn(a,n),Qn(a,r)]},X2=function(e,t,n){var r=e.width/2+t,a=e.height/2+t,s=n[2],c=n[3],p=n[1],f=r*r*s*s+a*a*c*c,g=f-p*p;if(f===0||g<=0)return[];var u=Math.sqrt(g),y=-r*r*s*p,b=-a*a*c*p;return[Qt((y+r*a*c*u)/f,(b-r*a*s*u)/f),Qt((y-r*a*c*u)/f,(b+r*a*s*u)/f)]},J2=function(e,t,n){if(t===0)return hr(n,e)===0?[e]:[];var r=n[2],a=n[3],s=n[1],c=So(e),p=c[0],f=c[1],g=r*r+a*a,u=t*t*g-Math.pow(r*p+a*f+s,2);if(g===0||u<=0)return[];var y=Math.sqrt(u),b=p*a*a-f*r*a-r*s,w=f*r*r-p*r*a-a*s;return[Qt((b+a*y)/g,(w-r*y)/g),Qt((b-a*y)/g,(w+r*y)/g)]},q2=function(e,t,n){var r=Math.abs(t),a=e.width*r/2,s=e.height*r/2,c=Math.sign(t),p=So(n),f=p[0],g=p[1],u=g===0?1e-4:g,y=Math.pow(f,2)*Math.pow(s,2)+Math.pow(u,2)*Math.pow(a,2),b=(-f*Math.pow(s,2)+c*u*Math.sqrt(Math.max(0,y-Math.pow(a,2)*Math.pow(s,2))))/y,w=(-b*f-1)/u,k=-Math.pow(a,2)*b/(Math.pow(w,2)*Math.pow(s,2)+Math.pow(b,2)*Math.pow(a,2));return Qt(k,(-b*k-1)/w)},Q2=function(e,t,n){var r=Math.abs(t),a=Math.sign(t),s=zh(e,r),c=0,p=null;return s.forEach(function(f){var g=a*ha(n,f)[1];g>c&&(c=g,p=f)}),p},_2=function(e,t,n,r){for(var a=[],s=!1,c=0,p=po(e);c=4){if(r==="sharp")return Tf(a,t,n);var g=Zc(a,10,5);return Tf(g,t,n)}return!1},$2=function(e,t,n,r){var a=po(e),s=[0,0];return a.some(function(c,p){var f=c.op,g=c.data;if(f==="move")s=g;else if(f==="bcurveTo"){var u=[g[0],g[1]],y=[g[2],g[3]],b=[g[4],g[5]],w=s;return s=b,function(k,M,A,O,N,U){for(var W=N[0],K=N[1],B=function(te,oe){return Math.pow(1-te,3)*O[oe]+3*te*Math.pow(1-te,2)*A[oe]+3*Math.pow(te,2)*(1-te)*M[oe]+k[oe]*Math.pow(te,3)},Y=0;Y<=1;){var J=B(Y,0),_=B(Y,1);if(Math.sqrt(Math.pow(J-W,2)+Math.pow(_-K,2))=e[0]&&t<=e[0]+e[2]&&n>=e[1]&&n<=e[1]+e[3]},Nh=function(e,t,n,r,a,s){return e.reduce(function(c,p){if(c)return c;var f=function(g,u,y,b,w,k){if(!u.selectedElementIds[g.id])return!1;var M=pu(g,w,k),A=M.rotation,O=es(M,["rotation"]);if(A&&gu(A,y,b))return"rotation";var N=Object.keys(O).filter(function(U){var W=O[U];return!!W&&gu(W,y,b)});return N.length>0&&N[0]}(p,t,n,r,a,s);return f?{element:p,transformHandleType:f}:null},null)},jh=function(e,t,n,r,a){var s=e[0],c=e[1],p=e[2],f=e[3],g=du([s,c,p,f],0,r,a,yh);return Object.keys(g).find(function(u){var y=g[u];return y&&gu(y,t,n)})||!1},vu=["ns","nesw","ew","nwse"],yu=function(e){var t=e.element,n=e.transformHandleType,r=t&&Math.sign(t.height)*Math.sign(t.width)==-1,a=null;switch(n){case"n":case"s":a="ns";break;case"w":case"e":a="ew";break;case"nw":case"se":a=r?"nesw":"nwse";break;case"ne":case"sw":a=r?"nwse":"nesw";break;case"rotation":return"grab"}return a&&t&&(a=function(s,c){var p=vu.indexOf(s);if(p>=0){var f=Math.round(c/(Math.PI/4));s=vu[(p+f)%vu.length]}return s}(a,t.angle)),a?"".concat(a,"-resize"):""},ss=function(e,t){for(var n=0,r=t.length,a=e.length;n-1){g===!1&&n({editingLinearElement:_t(_t({},c),{},{isDragging:!0})});var y=e.createPointAt(u,r-c.pointerOffset.x,a-c.pointerOffset.y,t.gridSize);return e.movePoint(u,p,y),wn(u)&&s(u,p===0?"start":"end"),!0}return!1},e.handlePointerUp=function(t,n,r){var a,s=n.elementId,c=n.activePointIndex,p=n.isDragging,f=e.getElement(s);if(!f)return n;var g={};if(p&&(c===0||c===f.points.length-1)){uo(f.points,r.zoom.value)&&e.movePoint(f,c,c===0?f.points[f.points.length-1]:f.points[0]);var u=Co(r)?Or(_o(e.getPointAtIndexGlobalCoordinates(f,c)),an.getScene(f)):null;(a={})[c===0?"startBindingElement":"endBindingElement"]=u,g=a}return _t(_t(_t({},n),g),{},{isDragging:!1,pointerOffset:{x:0,y:0}})},e.handlePointerDown=function(t,n,r,a,s){var c={didAddPoint:!1,hitElement:null};if(!n.editingLinearElement)return c;var p=n.editingLinearElement.elementId,f=e.getElement(p);if(!f)return c;if(t.altKey)return n.editingLinearElement.lastUncommittedPoint==null&&De(f,{points:ss(ss([],f.points),[e.createPointAt(f,s.x,s.y,n.gridSize)])}),a.resumeRecording(),r({editingLinearElement:_t(_t({},n.editingLinearElement),{},{activePointIndex:f.points.length-1,lastUncommittedPoint:null,endBindingElement:Or(s,an.getScene(f))})}),c.didAddPoint=!0,c;var g=e.getPointIndexUnderCursor(f,n.zoom,s.x,s.y);if(g>-1)c.hitElement=f;else{var u=n.editingLinearElement,y=u.startBindingElement,b=u.endBindingElement;Co(n)&&wn(f)&&ma(f,y,b)}var w=it(f),k=w[0],M=w[1],A=(k+w[2])/2,O=(M+w[3])/2,N=g>-1&&Xe(f.x+f.points[g][0],f.y+f.points[g][1],A,O,f.angle);return r({editingLinearElement:_t(_t({},n.editingLinearElement),{},{activePointIndex:g>-1?g:null,pointerOffset:N?{x:s.x-N[0],y:s.y-N[1]}:{x:0,y:0}})}),c},e.handlePointerMove=function(t,n,r,a,s){var c=a.elementId,p=a.lastUncommittedPoint,f=e.getElement(c);if(!f)return a;var g=f.points,u=g[g.length-1];if(!t.altKey)return u===p&&e.movePoint(f,g.length-1,"delete"),_t(_t({},a),{},{lastUncommittedPoint:null});var y=e.createPointAt(f,n-a.pointerOffset.x,r-a.pointerOffset.y,s);return u===p?e.movePoint(f,f.points.length-1,y):e.movePoint(f,"new",y),_t(_t({},a),{},{lastUncommittedPoint:f.points[f.points.length-1]})},e.getPointsGlobalCoordinates=function(t){var n=it(t),r=n[0],a=n[1],s=n[2],c=n[3],p=(r+s)/2,f=(a+c)/2;return t.points.map(function(g){var u,y=t.x,b=t.y;return[y=(u=Xe(y+g[0],b+g[1],p,f,t.angle))[0],b=u[1]]})},e.getPointAtIndexGlobalCoordinates=function(t,n){var r=n<0?t.points.length+n:n,a=it(t),s=a[0],c=a[1],p=(s+a[2])/2,f=(c+a[3])/2,g=t.points[r],u=t.x,y=t.y;return Xe(u+g[0],y+g[1],p,f,t.angle)},e.pointFromAbsoluteCoords=function(t,n){var r=it(t),a=r[0],s=r[1],c=(a+r[2])/2,p=(s+r[3])/2,f=Xe(n[0],n[1],c,p,-t.angle),g=f[0],u=f[1];return[g-t.x,u-t.y]},e.getPointIndexUnderCursor=function(t,n,r,a){for(var s=this.getPointsGlobalCoordinates(t),c=s.length;--c>-1;){var p=s[c];if(Bn(r,a,p[0],p[1])*n.value2)){var s=an.getScene(e).getElement(n.elementId);if(s!=null){var c,p=t==="start"?-1:1,f=p===-1?0:e.points.length-1,g=f-p,u=mt.getPointAtIndexGlobalCoordinates(e,g),y=function(w,k,M){if(k===0){var A=it(w),O=mu(A);return So(O)}var N,U=hu(w),W=Qn(U,ai(M)),K=rs(U);switch(w.type){case"rectangle":case"text":case"diamond":N=Q2(w,k,W);break;case"ellipse":N=q2(w,k,W)}return So(Qn(K,N))}(s,n.focus,u);if(n.gap===0)c=y;else{var b=function(w,k,M,A){A===void 0&&(A=0);var O=hu(w),N=Qn(O,ai(k)),U=Qn(O,ai(M)),W=ha(N,U),K=rs(O);return Z2(w,W,N,A).map(function(B){return So(Qn(K,B))})}(s,u,y,n.gap);c=b.length===0?y:b[0]}mt.movePoint(e,f,mt.pointFromAbsoluteCoords(e,c),((a={})[t==="start"?"startBinding":"endBinding"]=n,a))}}},Zh=function(e,t,n){if(t==null||n==null)return t;var r=t.gap,a=t.focus,s=t.elementId,c=n.width,p=n.height,f=e.width,g=e.height;return{elementId:s,gap:Math.max(1,Math.min(is(e,c,p),r*(c0&&(f.forEach(function(u){c&&!n.has(u)&&a.add(u)}),s.add(n.get(p.id))),wn(p)){if(p.startBinding!=null){var g=p.startBinding.elementId;c&&!n.has(g)&&s.add(g)}p.endBinding!=null&&(g=p.endBinding.elementId,c&&!n.has(g)&&s.add(g)),p.startBinding==null&&p.endBinding==null||a.add(n.get(p.id))}}),e.filter(function(p){var f=p.id;return a.has(f)}).forEach(function(p){var f=p.startBinding,g=p.endBinding;De(p,{startBinding:Jh(f,n),endBinding:Jh(g,n)})}),e.filter(function(p){var f=p.id;return s.has(f)}).forEach(function(p){var f=p.boundElementIds;f!=null&&f.length>0&&De(p,{boundElementIds:f.map(function(g){var u;return(u=n.get(g))!==null&&u!==void 0?u:g})})})},Jh=function(e,t){var n;if(e==null)return null;var r=e.elementId;return{focus:e.focus,gap:e.gap,elementId:(n=t.get(r))!==null&&n!==void 0?n:r}},ku=function(e,t){var n=new Set(t.map(function(a){return a.id})),r=new Set;t.forEach(function(a){var s;Bl(a)&&((s=a.boundElementIds)===null||s===void 0||s.forEach(function(c){n.has(c)||r.add(c)}))}),e.filter(function(a){var s=a.id;return r.has(s)}).forEach(function(a){var s=a.startBinding,c=a.endBinding;De(a,{startBinding:qh(s,n),endBinding:qh(c,n)})})},qh=function(e,t){return e==null||t.has(e.elementId)?null:e},ga=function(e,t){for(var n=0,r=t.length,a=e.length;n=2*Math.PI?e-2*Math.PI:e},aw=function(e,t,n,r){var a=it(e),s=a[0],c=a[1],p=(s+a[2])/2,f=(c+a[3])/2,g=5*Math.PI/2+Math.atan2(n-f,t-p);r&&(g+=j.ay/2,g-=g%j.ay),g=Ir(g),De(e,{angle:g})},lw=function(e,t,n,r,a){var s,c=it(e),p=c[0],f=c[1],g=c[2],u=c[3],y=Xe(r,a,(p+g)/2,(f+u)/2,-e.angle),b=y[0],w=y[1],k=t==="end"?[b-e.x,w-e.y]:[e.x+e.points[1][0]-b,e.y+e.points[1][1]-w],M=k[0],A=k[1];n&&(M=(s=function(W,K,B,Y){var J=su.apply(void 0,ga([W],Xe(K,B,0,0,Y)));return Xe(J.width,J.height,0,0,-Y)}(e.type,M,A,e.angle))[0],A=s[1]);var O=Kc(t==="end"?{s:!0,e:!0}:{n:!0,w:!0},e.x,e.y,e.angle,0,0,(e.points[1][0]-M)/2,(e.points[1][1]-A)/2),N=O[0],U=O[1];De(e,{x:N,y:U,points:[[0,0],[M,A]]})},_h=function(e,t,n){return Et(e)||cr(e)?{points:Wl(0,t,Wl(1,n,e.points))}:{}},$h=function(e,t,n){var r=e.fontSize*(t/e.width);if(r<1)return null;var a=la(e.text,vo({fontSize:r,fontFamily:e.fontFamily}));return{size:r,baseline:a.baseline+(n-a.height)}},sw=function(e,t,n,r,a){var s,c=it(e),p=c[0],f=c[1],g=c[2],u=c[3],y=Xe(r,a,(p+g)/2,(f+u)/2,-e.angle),b=y[0],w=y[1];switch(t){case"se":s=Math.max((b-p)/(g-p),(w-f)/(u-f));break;case"nw":s=Math.max((g-b)/(g-p),(u-w)/(u-f));break;case"ne":s=Math.max((b-p)/(g-p),(u-w)/(u-f));break;case"sw":s=Math.max((g-b)/(g-p),(w-f)/(u-f))}if(s>0){var k=e.width*s,M=e.height*s,A=$h(e,k,M);if(A===null)return;var O=qo(e,k,M),N=(p-O[0])/2,U=(f-O[1])/2,W=(g-O[2])/2,K=(u-O[3])/2,B=Kc(function(_,te){return{n:/^(n|ne|nw)$/.test(_)||te&&/^(s|se|sw)$/.test(_),s:/^(s|se|sw)$/.test(_)||te&&/^(n|ne|nw)$/.test(_),w:/^(w|nw|sw)$/.test(_)||te&&/^(e|ne|se)$/.test(_),e:/^(e|ne|se)$/.test(_)||te&&/^(w|nw|sw)$/.test(_)}}(t,n),e.x,e.y,e.angle,N,U,W,K),Y=B[0],J=B[1];De(e,{fontSize:A.size,width:k,height:M,baseline:A.baseline,x:Y,y:J})}},e0=function(e,t,n,r,a,s,c){var p,f,g=qo(e,e.width,e.height),u=[g[0],g[1]],y=[g[2],g[3]],b=[((p=u)[0]+(f=y)[0])/2,(p[1]+f[1])/2],w=Qi([s,c],b,-e.angle),k=qo(n,n.width,n.height),M=k[0],A=k[1],O=k[2]-M,N=k[3]-A,U=(y[0]-u[0])/O,W=(y[1]-u[1])/N;r.includes("e")&&(U=(w[0]-u[0])/O),r.includes("s")&&(W=(w[1]-u[1])/N),r.includes("w")&&(U=(y[0]-w[0])/O),r.includes("n")&&(W=(y[1]-w[1])/N);var K=e.width,B=e.height,Y=n.width*U,J=n.height*W;if(a&&(Y=2*Y-K,J=2*J-B),t){var _=Math.abs(Y)/K,te=Math.abs(J)/B;if(r.length===1&&(J*=_,Y*=te),r.length===2){var oe=Math.max(_,te);Y=K*oe*Math.sign(Y),J=B*oe*Math.sign(J)}}var Ae=qo(e,Y,J),Ie=Ae[0],de=Ae[1],le=Ae[2]-Ie,Se=Ae[3]-de,$=ga([],u);if(["n","w","nw"].includes(r)&&($=[y[0]-Math.abs(le),y[1]-Math.abs(Se)]),r==="ne"){var ke=[u[0],y[1]];$=[ke[0],ke[1]-Math.abs(Se)]}if(r==="sw"){var Ze=[y[0],u[1]];$=[Ze[0]-Math.abs(le),Ze[1]]}t&&(["s","n"].includes(r)&&($[0]=b[0]-le/2),["e","w"].includes(r)&&($[1]=b[1]-Se/2)),Y<0&&(r.includes("e")&&($[0]-=Math.abs(le)),r.includes("w")&&($[0]+=Math.abs(le))),J<0&&(r.includes("s")&&($[1]-=Math.abs(Se)),r.includes("n")&&($[1]+=Math.abs(Se))),a&&($[0]=b[0]-Math.abs(le)/2,$[1]=b[1]-Math.abs(Se)/2);var ue=e.angle,_e=Qi($,b,ue),Le=[$[0]+Math.abs(le)/2,$[1]+Math.abs(Se)/2],Be=Qi(Le,b,ue);$=Qi(_e,Be,-ue);var We=_h(e,Y,J),Qe=ga([],$);Qe[0]+=e.x-Ie,Qe[1]+=e.y-de;var Me=va({width:Math.abs(Y),height:Math.abs(J),x:Qe[0],y:Qe[1]},We);Me.width!==0&&Me.height!==0&&Number.isFinite(Me.x)&&Number.isFinite(Me.y)&&(Tr(n,{newSize:{width:Me.width,height:Me.height}}),De(n,Me))},cw=function(e,t,n,r){var a,s,c=Pt(e),p=c[0],f=c[1],g=c[2],u=c[3];switch(t){case"se":a=Math.max((n-p)/(g-p),(r-f)/(u-f)),s=function(b,w,k){var M=w[0],A=w[1],O=k[0],N=k[1];return{x:b.x+(M-p)*(a-1)+M-O,y:b.y+(A-f)*(a-1)+A-N}};break;case"nw":a=Math.max((g-n)/(g-p),(u-r)/(u-f)),s=function(b,w,k){var M=w[2],A=w[3],O=k[2],N=k[3];return{x:b.x-(g-M)*(a-1)+M-O,y:b.y-(u-A)*(a-1)+A-N}};break;case"ne":a=Math.max((n-p)/(g-p),(u-r)/(u-f)),s=function(b,w,k){var M=w[0],A=w[3],O=k[0],N=k[3];return{x:b.x+(M-p)*(a-1)+M-O,y:b.y-(u-A)*(a-1)+A-N}};break;case"sw":a=Math.max((g-n)/(g-p),(r-f)/(u-f)),s=function(b,w,k){var M=w[1],A=w[2],O=k[1],N=k[2];return{x:b.x-(g-A)*(a-1)+A-N,y:b.y+(M-f)*(a-1)+M-O}}}if(a>0){var y=e.reduce(function(b,w){if(!b)return b;var k=w.width*a,M=w.height*a,A={};if(w.type==="text"){var O=$h(w,k,M);if(O===null)return null;A={fontSize:O.size,baseline:O.baseline}}var N=it(w),U=_h(w,k,M);Tr(w,{newSize:{width:k,height:M},simultaneouslyUpdated:e});var W=qo(va(va({},w),U),k,M),K=s(w,N,W),B=K.x,Y=K.y;return ga(ga([],b),[va(va({width:k,height:M,x:B,y:Y},U),A)])},[]);y&&e.forEach(function(b,w){De(b,y[w])})}},uw=function(e,t,n,r,a,s,c){var p=5*Math.PI/2+Math.atan2(r-c,n-s);a&&(p+=j.ay/2,p-=p%j.ay),t.forEach(function(f,g){var u,y,b=it(f),w=b[0],k=b[1],M=(w+b[2])/2,A=(k+b[3])/2,O=(u=(y=e.originalElements.get(f.id))===null||y===void 0?void 0:y.angle)!==null&&u!==void 0?u:f.angle,N=Xe(M,A,s,c,p+O-f.angle),U=N[0],W=N[1];De(f,{x:f.x+(U-M),y:f.y+(W-A),angle:Ir(p+O)})})},t0=function(e,t,n,r,a,s,c,p,f,g){var u;f&&(c=(u=su(t,c,sa&&s.value!==1&&(g=a/2*(s.value-1)),"translate(".concat(g,"px, ").concat(u,"px) scale(").concat(s.value,") rotate(").concat(f,"deg)")},us=function(e){var t=la(e.text,vo(e));De(e,{width:t.width,height:t.height,baseline:t.baseline})},Su=function(e,t){return Boolean(!e.viewModeEnabled&&(e.editingElement||et(t,e).length||e.elementType!=="selection"))};function r0(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),n.push.apply(n,r)}return n}function o0(e){for(var t=1;tg.width||K-N>g.height}(t,0,[s,c,p,f])&&(s=(r=function(g,u){if(!g.length)return[0,0,0,0];var y=1/0,b=g[0];return g.forEach(function(w){var k=ea(w),M=k[0],A=k[1],O=k[2],N=k[3],U=Bn((M+O)/2,(A+N)/2,u.x,u.y);U=0;--r){var a=e[r];if(!a.isDeleted&&t(a)){n=a;break}}return n},Po=function(e,t,n,r){return r===void 0&&(r={x:0,y:0}),{value:e,translation:{x:r.x-n.left-(r.x-n.left-t.translation.x)*(e/t.value),y:r.y-n.top-(r.y-n.top-t.translation.y)*(e/t.value)}}},wa=function(e){var t=parseFloat(e.toFixed(2));return Math.max(.1,Math.min(t,10))},Ke=(E(5422),m().forwardRef(function(e,t){var n=m().useRef(null);m().useImperativeHandle(t,function(){return n.current});var r="ToolIcon_size_".concat(e.size||"m");return e.type==="button"?m().createElement("button",{className:ot("ToolIcon_type_button",r,e.className,e.visible&&!e.hidden?"ToolIcon_type_button--show":"ToolIcon_type_button--hide",{ToolIcon:!e.hidden,"ToolIcon--selected":e.selected}),"data-testid":e["data-testid"],hidden:e.hidden,title:e.title,"aria-label":e["aria-label"],type:"button",onClick:e.onClick,ref:n},m().createElement("div",{className:"ToolIcon__icon","aria-hidden":"true"},e.icon||e.label,e.keyBindingLabel&&m().createElement("span",{className:"ToolIcon__keybinding"},e.keyBindingLabel)),e.showAriaLabel&&m().createElement("div",{className:"ToolIcon__label"},e["aria-label"]),e.children):m().createElement("label",{className:ot("ToolIcon",e.className),title:e.title},m().createElement("input",{className:"ToolIcon_type_radio ".concat(r),type:"radio",name:e.name,"aria-label":e["aria-label"],"aria-keyshortcuts":e["aria-keyshortcuts"],"data-testid":e["data-testid"],id:e.id,onChange:e.onChange,checked:e.checked,ref:n}),m().createElement("div",{className:"ToolIcon__icon"},e.icon,e.keyBindingLabel&&m().createElement("span",{className:"ToolIcon__keybinding"},e.keyBindingLabel)))}));Ke.defaultProps={visible:!0,className:""};var wt=function(e){return e==="light"?qe.$y[4]:qe.$y[9]},we=function(e){return e==="light"?qe.Sn:qe.MA[4]},u0=function(e){return e==="light"?qe.ix:"#1e1e1e"},pe=function(e,t){t===void 0&&(t=512);var n=typeof t=="number"?{width:t}:t,r=n.width,a=r===void 0?512:r,s=n.height,c=s===void 0?a:s,p=n.mirror,f=n.style;return m().createElement("svg",{"aria-hidden":"true",focusable:"false",role:"img",viewBox:"0 0 ".concat(a," ").concat(c),className:ot({"rtl-mirror":p}),style:f},typeof e=="string"?m().createElement("path",{fill:"currentColor",d:e}):e)},mw=pe("M326.612 185.391c59.747 59.809 58.927 155.698.36 214.59-.11.12-.24.25-.36.37l-67.2 67.2c-59.27 59.27-155.699 59.262-214.96 0-59.27-59.26-59.27-155.7 0-214.96l37.106-37.106c9.84-9.84 26.786-3.3 27.294 10.606.648 17.722 3.826 35.527 9.69 52.721 1.986 5.822.567 12.262-3.783 16.612l-13.087 13.087c-28.026 28.026-28.905 73.66-1.155 101.96 28.024 28.579 74.086 28.749 102.325.51l67.2-67.19c28.191-28.191 28.073-73.757 0-101.83-3.701-3.694-7.429-6.564-10.341-8.569a16.037 16.037 0 0 1-6.947-12.606c-.396-10.567 3.348-21.456 11.698-29.806l21.054-21.055c5.521-5.521 14.182-6.199 20.584-1.731a152.482 152.482 0 0 1 20.522 17.197zM467.547 44.449c-59.261-59.262-155.69-59.27-214.96 0l-67.2 67.2c-.12.12-.25.25-.36.37-58.566 58.892-59.387 154.781.36 214.59a152.454 152.454 0 0 0 20.521 17.196c6.402 4.468 15.064 3.789 20.584-1.731l21.054-21.055c8.35-8.35 12.094-19.239 11.698-29.806a16.037 16.037 0 0 0-6.947-12.606c-2.912-2.005-6.64-4.875-10.341-8.569-28.073-28.073-28.191-73.639 0-101.83l67.2-67.19c28.239-28.239 74.3-28.069 102.325.51 27.75 28.3 26.872 73.934-1.155 101.96l-13.087 13.087c-4.35 4.35-5.769 10.79-3.783 16.612 5.864 17.194 9.042 34.999 9.69 52.721.509 13.906 17.454 20.446 27.294 10.606l37.106-37.106c59.271-59.259 59.271-155.699.001-214.959z",{mirror:!0}),gw=pe("M433.941 129.941l-83.882-83.882A48 48 0 0 0 316.118 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V163.882a48 48 0 0 0-14.059-33.941zM224 416c-35.346 0-64-28.654-64-64 0-35.346 28.654-64 64-64s64 28.654 64 64c0 35.346-28.654 64-64 64zm96-304.52V212c0 6.627-5.373 12-12 12H76c-6.627 0-12-5.373-12-12V108c0-6.627 5.373-12 12-12h228.52c3.183 0 6.235 1.264 8.485 3.515l3.48 3.48A11.996 11.996 0 0 1 320 111.48z",{width:448,height:512}),vw=pe("M252 54L203 8a28 27 0 00-20-8H28C12 0 0 12 0 27v195c0 15 12 26 28 26h204c15 0 28-11 28-26V73a28 27 0 00-8-19zM130 213c-21 0-37-16-37-36 0-19 16-35 37-35 20 0 37 16 37 35 0 20-17 36-37 36zm56-169v56c0 4-4 6-7 6H44c-4 0-7-2-7-6V42c0-4 3-7 7-7h133l4 2 3 2a7 7 0 012 5z M296 201l87 95-188 205-78 9c-10 1-19-8-18-20l9-84zm141-14l-41-44a31 31 0 00-46 0l-38 41 87 95 38-42c13-14 13-36 0-50z",{width:448,height:512}),d0=pe("M572.694 292.093L500.27 416.248A63.997 63.997 0 0 1 444.989 448H45.025c-18.523 0-30.064-20.093-20.731-36.093l72.424-124.155A64 64 0 0 1 152 256h399.964c18.523 0 30.064 20.093 20.73 36.093zM152 224h328v-48c0-26.51-21.49-48-48-48H272l-64-64H48C21.49 64 0 85.49 0 112v278.046l69.077-118.418C86.214 242.25 117.989 224 152 224z",{width:576,height:512,mirror:!0}),yw=pe("M384 112v352c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V112c0-26.51 21.49-48 48-48h80c0-35.29 28.71-64 64-64s64 28.71 64 64h80c26.51 0 48 21.49 48 48zM192 40c-13.255 0-24 10.745-24 24s10.745 24 24 24 24-10.745 24-24-10.745-24-24-24m96 114v-20a6 6 0 0 0-6-6H102a6 6 0 0 0-6 6v20a6 6 0 0 0 6 6h180a6 6 0 0 0 6-6z",{width:384,height:512}),Tu=pe("M32 464a48 48 0 0 0 48 48h288a48 48 0 0 0 48-48V128H32zm272-256a16 16 0 0 1 32 0v224a16 16 0 0 1-32 0zm-96 0a16 16 0 0 1 32 0v224a16 16 0 0 1-32 0zm-96 0a16 16 0 0 1 32 0v224a16 16 0 0 1-32 0zM432 32H312l-9.4-18.7A24 24 0 0 0 281.1 0H166.8a23.72 23.72 0 0 0-21.4 13.3L136 32H16A16 16 0 0 0 0 48v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16z",{width:448,height:512}),ww=pe("M204.3 5C104.9 24.4 24.8 104.3 5.2 203.4c-37 187 131.7 326.4 258.8 306.7 41.2-6.4 61.4-54.6 42.5-91.7-23.1-45.4 9.9-98.4 60.9-98.4h79.7c35.8 0 64.8-29.6 64.9-65.3C511.5 97.1 368.1-26.9 204.3 5zM96 320c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm32-128c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm128-64c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm128 64c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32z"),p0=pe("M384 121.9c0-6.3-2.5-12.4-7-16.9L279.1 7c-4.5-4.5-10.6-7-17-7H256v128h128zM571 308l-95.7-96.4c-10.1-10.1-27.4-3-27.4 11.3V288h-64v64h64v65.2c0 14.3 17.3 21.4 27.4 11.3L571 332c6.6-6.6 6.6-17.4 0-24zm-379 28v-32c0-8.8 7.2-16 16-16h176V160H248c-13.2 0-24-10.8-24-24V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V352H208c-8.8 0-16-7.2-16-16z",{width:576,height:512,mirror:!0}),bw=pe("M416 208H272V64c0-17.67-14.33-32-32-32h-32c-17.67 0-32 14.33-32 32v144H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h144v144c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32V304h144c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z",{width:448,height:512}),xw=pe("M416 208H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h384c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z",{width:448,height:512}),Ew=pe("M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z"),kw=pe("M16 132h416c8.837 0 16-7.163 16-16V76c0-8.837-7.163-16-16-16H16C7.163 60 0 67.163 0 76v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16z"),Sw=pe("M255.545 8c-66.269.119-126.438 26.233-170.86 68.685L48.971 40.971C33.851 25.851 8 36.559 8 57.941V192c0 13.255 10.745 24 24 24h134.059c21.382 0 32.09-25.851 16.971-40.971l-41.75-41.75c30.864-28.899 70.801-44.907 113.23-45.273 92.398-.798 170.283 73.977 169.484 169.442C423.236 348.009 349.816 424 256 424c-41.127 0-79.997-14.678-110.63-41.556-4.743-4.161-11.906-3.908-16.368.553L89.34 422.659c-4.872 4.872-4.631 12.815.482 17.433C133.798 479.813 192.074 504 256 504c136.966 0 247.999-111.033 248-247.998C504.001 119.193 392.354 7.755 255.545 8z",{mirror:!0}),Cw=pe("M256.455 8c66.269.119 126.437 26.233 170.859 68.685l35.715-35.715C478.149 25.851 504 36.559 504 57.941V192c0 13.255-10.745 24-24 24H345.941c-21.382 0-32.09-25.851-16.971-40.971l41.75-41.75c-30.864-28.899-70.801-44.907-113.23-45.273-92.398-.798-170.283 73.977-169.484 169.442C88.764 348.009 162.184 424 256 424c41.127 0 79.997-14.678 110.629-41.556 4.743-4.161 11.906-3.908 16.368.553l39.662 39.662c4.872 4.872 4.631 12.815-.482 17.433C378.202 479.813 319.926 504 256 504 119.034 504 8.001 392.967 8 256.002 7.999 119.193 119.646 7.755 256.455 8z",{mirror:!0}),f0=pe("M504 256c0 136.997-111.043 248-248 248S8 392.997 8 256C8 119.083 119.043 8 256 8s248 111.083 248 248zM262.655 90c-54.497 0-89.255 22.957-116.549 63.758-3.536 5.286-2.353 12.415 2.715 16.258l34.699 26.31c5.205 3.947 12.621 3.008 16.665-2.122 17.864-22.658 30.113-35.797 57.303-35.797 20.429 0 45.698 13.148 45.698 32.958 0 14.976-12.363 22.667-32.534 33.976C247.128 238.528 216 254.941 216 296v4c0 6.627 5.373 12 12 12h56c6.627 0 12-5.373 12-12v-1.333c0-28.462 83.186-29.647 83.186-106.667 0-58.002-60.165-102-116.531-102zM256 338c-25.365 0-46 20.635-46 46 0 25.364 20.635 46 46 46s46-20.636 46-46c0-25.365-20.635-46-46-46z",{mirror:!0}),Pw=(pe("M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81 1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9c-1.66 0-3 1.34-3 3s1.34 3 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.16c-.05.21-.08.43-.08.65 0 1.61 1.31 2.92 2.92 2.92 1.61 0 2.92-1.31 2.92-2.92s-1.31-2.92-2.92-2.92z",{width:24,height:24}),pe("M16 5l-1.42 1.42-1.59-1.59V16h-1.98V4.83L9.42 6.42 8 5l4-4 4 4zm4 5v11c0 1.1-.9 2-2 2H6c-1.11 0-2-.9-2-2V10c0-1.11.89-2 2-2h3v2H6v11h12V10h-3V8h3c1.1 0 2 .89 2 2z",{width:24,height:24}),pe(m().createElement(m().Fragment,null,m().createElement("path",{stroke:"currentColor",fill:"currentColor",d:"M40 5.6v6.1l-4.1.7c-8.9 1.4-16.5 6.9-20.6 15C13 32 10.9 43 12.4 43c.4 0 2.4-1.3 4.4-3 5-3.9 12.1-7 18.2-7.7l5-.6v12.8l11.2-11.3L62.5 22 51.2 10.8 40-.5v6.1zm10.2 22.6L44 34.5v-6.8l-6.9.6c-3.9.3-9.8 1.7-13.2 3.1-3.5 1.4-6.5 2.4-6.7 2.2-.9-1 3-7.5 6.4-10.8C28 18.6 34.4 16 40.1 16c3.7 0 3.9-.1 3.9-3.2V9.5l6.2 6.3 6.3 6.2-6.3 6.2z"}),m().createElement("path",{stroke:"currentColor",fill:"currentColor",d:"M0 36v20h48v-6.2c0-6 0-6.1-2-4.3-1.1 1-2 2.9-2 4.2V52H4V34c0-17.3-.1-18-2-18s-2 .7-2 20z"})),{width:64,height:64}),pe(m().createElement("path",{stroke:"currentColor",strokeWidth:"40",fill:"currentColor",d:"M148 560a318 318 0 0 0 522 110 316 316 0 0 0 0-450 316 316 0 0 0-450 0c-11 11-21 22-30 34v4h47c25 0 46 21 46 46s-21 45-46 45H90c-13 0-25-6-33-14-9-9-14-20-14-33V156c0-25 20-45 45-45s45 20 45 45v32l1 1a401 401 0 0 1 623 509l212 212a42 42 0 0 1-59 59L698 757A401 401 0 0 1 65 570a42 42 0 0 1 83-10z"}),{width:1024})),Mw=m().memo(function(e){var t=e.theme;return pe(m().createElement(m().Fragment,null,m().createElement("path",{d:"M22 9.556C22 8.696 21.303 8 20.444 8H16v8H8v4.444C8 21.304 8.697 22 9.556 22h10.888c.86 0 1.556-.697 1.556-1.556V9.556z",fill:we(t),stroke:we(t),strokeWidth:"2"}),m().createElement("path",{d:"M16 3.556C16 2.696 15.303 2 14.444 2H3.556C2.696 2 2 2.697 2 3.556v10.888C2 15.304 2.697 16 3.556 16h10.888c.86 0 1.556-.697 1.556-1.556V3.556z",fill:wt(t),stroke:wt(t),strokeWidth:"2"})),{width:24,mirror:!0})}),Ow=m().memo(function(e){var t=e.theme;return pe(m().createElement(m().Fragment,null,m().createElement("path",{d:"M16 3.556C16 2.696 15.303 2 14.444 2H3.556C2.696 2 2 2.697 2 3.556v10.888C2 15.304 2.697 16 3.556 16h10.888c.86 0 1.556-.697 1.556-1.556V3.556z",fill:wt(t),stroke:wt(t),strokeWidth:"2"}),m().createElement("path",{d:"M22 9.556C22 8.696 21.303 8 20.444 8H9.556C8.696 8 8 8.697 8 9.556v10.888C8 21.304 8.697 22 9.556 22h10.888c.86 0 1.556-.697 1.556-1.556V9.556z",fill:we(t),stroke:we(t),strokeWidth:"2"})),{width:24,mirror:!0})}),Tw=m().memo(function(e){var t=e.theme;return pe(m().createElement(m().Fragment,null,m().createElement("path",{d:"M13 21a1 1 0 001 1h7a1 1 0 001-1v-7a1 1 0 00-1-1h-3v5h-5v3zM11 3a1 1 0 00-1-1H3a1 1 0 00-1 1v7a1 1 0 001 1h3V6h5V3z",fill:we(t),stroke:we(t),strokeWidth:"2"}),m().createElement("path",{d:"M18 7.333C18 6.597 17.403 6 16.667 6H7.333C6.597 6 6 6.597 6 7.333v9.334C6 17.403 6.597 18 7.333 18h9.334c.736 0 1.333-.597 1.333-1.333V7.333z",fill:wt(t),stroke:wt(t),strokeWidth:"2"})),{width:24,mirror:!0})}),Iw=m().memo(function(e){var t=e.theme;return pe(m().createElement(m().Fragment,null,m().createElement("path",{d:"M18 7.333C18 6.597 17.403 6 16.667 6H7.333C6.597 6 6 6.597 6 7.333v9.334C6 17.403 6.597 18 7.333 18h9.334c.736 0 1.333-.597 1.333-1.333V7.333z",fill:wt(t),stroke:wt(t),strokeWidth:"2"}),m().createElement("path",{d:"M11 3a1 1 0 00-1-1H3a1 1 0 00-1 1v7a1 1 0 001 1h8V3zM22 14a1 1 0 00-1-1h-7a1 1 0 00-1 1v7a1 1 0 001 1h8v-8z",fill:we(t),stroke:we(t),strokeWidth:"2"})),{width:24,mirror:!0})}),Aw=m().memo(function(e){var t=e.theme;return pe(m().createElement(m().Fragment,null,m().createElement("path",{d:"M 2,5 H 22",fill:we(t),stroke:we(t),strokeWidth:"2",strokeLinecap:"round"}),m().createElement("path",{d:"M 6,7 C 5.446,7 5,7.446 5,8 v 9.999992 c 0,0.554 0.446,1 1,1 h 3.0000001 c 0.554,0 0.9999999,-0.446 0.9999999,-1 V 8 C 10,7.446 9.5540001,7 9.0000001,7 Z m 9,0 c -0.554,0 -1,0.446 -1,1 v 5.999992 c 0,0.554 0.446,1 1,1 h 3 c 0.554,0 1,-0.446 1,-1 V 8 C 19,7.446 18.554,7 18,7 Z",fill:wt(t),stroke:wt(t),strokeWidth:"2"})),{width:24,mirror:!0})}),Lw=m().memo(function(e){var t=e.theme;return pe(m().createElement(m().Fragment,null,m().createElement("path",{d:"M 2,19 H 22",fill:we(t),stroke:we(t),strokeWidth:"2",strokeLinecap:"round"}),m().createElement("path",{d:"m 6,16.999992 c -0.554,0 -1,-0.446 -1,-1 V 6 C 5,5.446 5.446,5 6,5 H 9.0000001 C 9.5540001,5 10,5.446 10,6 v 9.999992 c 0,0.554 -0.4459999,1 -0.9999999,1 z m 9,0 c -0.554,0 -1,-0.446 -1,-1 V 10 c 0,-0.554 0.446,-1 1,-1 h 3 c 0.554,0 1,0.446 1,1 v 5.999992 c 0,0.554 -0.446,1 -1,1 z",fill:wt(t),stroke:wt(t),strokeWidth:"2"})),{width:24,mirror:!0})}),Dw=m().memo(function(e){var t=e.theme;return pe(m().createElement(m().Fragment,null,m().createElement("path",{d:"M 5,2 V 22",fill:we(t),stroke:we(t),strokeWidth:"2",strokeLinecap:"round"}),m().createElement("path",{d:"m 7.000004,5.999996 c 0,-0.554 0.446,-1 1,-1 h 9.999992 c 0.554,0 1,0.446 1,1 v 3.0000001 c 0,0.554 -0.446,0.9999999 -1,0.9999999 H 8.000004 c -0.554,0 -1,-0.4459999 -1,-0.9999999 z m 0,9 c 0,-0.554 0.446,-1 1,-1 h 5.999992 c 0.554,0 1,0.446 1,1 v 3 c 0,0.554 -0.446,1 -1,1 H 8.000004 c -0.554,0 -1,-0.446 -1,-1 z",fill:wt(t),stroke:wt(t),strokeWidth:"2"})),{width:24})}),zw=m().memo(function(e){var t=e.theme;return pe(m().createElement(m().Fragment,null,m().createElement("path",{d:"M 19,2 V 22",fill:we(t),stroke:we(t),strokeWidth:"2",strokeLinecap:"round"}),m().createElement("path",{d:"m 16.999996,5.999996 c 0,-0.554 -0.446,-1 -1,-1 H 6.000004 c -0.554,0 -1,0.446 -1,1 v 3.0000001 c 0,0.554 0.446,0.9999999 1,0.9999999 h 9.999992 c 0.554,0 1,-0.4459999 1,-0.9999999 z m 0,9 c 0,-0.554 -0.446,-1 -1,-1 h -5.999992 c -0.554,0 -1,0.446 -1,1 v 3 c 0,0.554 0.446,1 1,1 h 5.999992 c 0.554,0 1,-0.446 1,-1 z",fill:wt(t),stroke:wt(t),strokeWidth:"2"})),{width:24})}),Nw=m().memo(function(e){var t=e.theme;return pe(m().createElement(m().Fragment,null,m().createElement("path",{d:"M19 5V19M5 5V19",stroke:we(t),strokeWidth:"2",strokeLinecap:"round"}),m().createElement("path",{d:"M15 9C15.554 9 16 9.446 16 10V14C16 14.554 15.554 15 15 15H9C8.446 15 8 14.554 8 14V10C8 9.446 8.446 9 9 9H15Z",fill:wt(t),stroke:wt(t),strokeWidth:"2"})),{width:24})}),jw=m().memo(function(e){var t=e.theme;return pe(m().createElement(m().Fragment,null,m().createElement("path",{d:"M5 5L19 5M5 19H19",fill:we(t),stroke:we(t),strokeWidth:"2",strokeLinecap:"round"}),m().createElement("path",{d:"M15 9C15.554 9 16 9.446 16 10V14C16 14.554 15.554 15 15 15H9C8.446 15 8 14.554 8 14V10C8 9.446 8.446 9 9 9H15Z",fill:wt(t),stroke:wt(t),strokeWidth:"2"})),{width:24})}),Rw=m().memo(function(e){var t=e.theme;return pe(m().createElement(m().Fragment,null,m().createElement("path",{d:"m 5.000004,16.999996 c 0,0.554 0.446,1 1,1 h 3 c 0.554,0 1,-0.446 1,-1 v -10 c 0,-0.554 -0.446,-1 -1,-1 h -3 c -0.554,0 -1,0.446 -1,1 z m 9,-2 c 0,0.554 0.446,1 1,1 h 3 c 0.554,0 1,-0.446 1,-1 v -6 c 0,-0.554 -0.446,-1 -1,-1 h -3 c -0.554,0 -1,0.446 -1,1 z",fill:wt(t),stroke:wt(t),strokeWidth:"2"}),m().createElement("path",{d:"M 2,12 H 22",fill:we(t),stroke:we(t),strokeWidth:"2",strokeDasharray:"1, 2.8",strokeLinecap:"round"})),{width:24,mirror:!0})}),Fw=m().memo(function(e){var t=e.theme;return pe(m().createElement(m().Fragment,null,m().createElement("path",{d:"M 7 5 C 6.446 5 6 5.446 6 6 L 6 9 C 6 9.554 6.446 10 7 10 L 17 10 C 17.554 10 18 9.554 18 9 L 18 6 C 18 5.446 17.554 5 17 5 L 7 5 z M 9 14 C 8.446 14 8 14.446 8 15 L 8 18 C 8 18.554 8.446 19 9 19 L 15 19 C 15.554 19 16 18.554 16 18 L 16 15 C 16 14.446 15.554 14 15 14 L 9 14 z ",fill:wt(t),stroke:wt(t),strokeWidth:"2"}),m().createElement("path",{d:"M 12,2 V 22",fill:we(t),stroke:we(t),strokeWidth:"2",strokeDasharray:"1, 2.8",strokeLinecap:"round"})),{width:24})}),Hw=pe("M192 256c61.9 0 112-50.1 112-112S253.9 32 192 32 80 82.1 80 144s50.1 112 112 112zm76.8 32h-8.3c-20.8 10-43.9 16-68.5 16s-47.6-6-68.5-16h-8.3C51.6 288 0 339.6 0 403.2V432c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48v-28.8c0-63.6-51.6-115.2-115.2-115.2zM480 256c53 0 96-43 96-96s-43-96-96-96-96 43-96 96 43 96 96 96zm48 32h-3.8c-13.9 4.8-28.6 8-44.2 8s-30.3-3.2-44.2-8H432c-20.4 0-39.2 5.9-55.7 15.4 24.4 26.3 39.7 61.2 39.7 99.8v38.4c0 2.2-.5 4.3-.6 6.4H592c26.5 0 48-21.5 48-48 0-61.9-50.1-112-112-112z",{width:640,height:512,mirror:!0}),Iu=(pe("M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm115.7 272l-176 101c-15.8 8.8-35.7-2.5-35.7-21V152c0-18.4 19.8-29.8 35.7-21l176 107c16.4 9.2 16.4 32.9 0 42z"),pe("M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm96 328c0 8.8-7.2 16-16 16H176c-8.8 0-16-7.2-16-16V176c0-8.8 7.2-16 16-16h160c8.8 0 16 7.2 16 16v160z"),pe("M242.72 256l100.07-100.07c12.28-12.28 12.28-32.19 0-44.48l-22.24-22.24c-12.28-12.28-32.19-12.28-44.48 0L176 189.28 75.93 89.21c-12.28-12.28-32.19-12.28-44.48 0L9.21 111.45c-12.28 12.28-12.28 32.19 0 44.48L109.28 256 9.21 356.07c-12.28 12.28-12.28 32.19 0 44.48l22.24 22.24c12.28 12.28 32.2 12.28 44.48 0L176 322.72l100.07 100.07c12.28 12.28 32.2 12.28 44.48 0l22.24-22.24c12.28-12.28 12.28-32.19 0-44.48L242.72 256z",{width:352,height:512})),Vw=pe("M34.52 239.03L228.87 44.69c9.37-9.37 24.57-9.37 33.94 0l22.67 22.67c9.36 9.36 9.37 24.52.04 33.9L131.49 256l154.02 154.75c9.34 9.38 9.32 24.54-.04 33.9l-22.67 22.67c-9.37 9.37-24.57 9.37-33.94 0L34.52 272.97c-9.37-9.37-9.37-24.57 0-33.94z",{width:320,height:512,style:{marginLeft:"-0.2rem"},mirror:!0}),Bw=pe("M464 0c26.51 0 48 21.49 48 48v288c0 26.51-21.49 48-48 48H176c-26.51 0-48-21.49-48-48V48c0-26.51 21.49-48 48-48h288M176 416c-44.112 0-80-35.888-80-80V128H48c-26.51 0-48 21.49-48 48v288c0 26.51 21.49 48 48 48h288c26.51 0 48-21.49 48-48v-48H176z",{mirror:!0}),Ww=(pe("M11.553 22.894a.998.998 0 00.894 0s3.037-1.516 5.465-4.097C19.616 16.987 21 14.663 21 12V5a1 1 0 00-.649-.936l-8-3a.998.998 0 00-.702 0l-8 3A1 1 0 003 5v7c0 2.663 1.384 4.987 3.088 6.797 2.428 2.581 5.465 4.097 5.465 4.097zm-1.303-8.481l6.644-6.644a.856.856 0 111.212 1.212l-7.25 7.25a.856.856 0 01-1.212 0l-3.75-3.75a.856.856 0 111.212-1.212l3.144 3.144z",{width:24}),m().memo(function(e){var t=e.theme;return pe(m().createElement(m().Fragment,null,m().createElement("path",{d:"M25 26H111V111H25",fill:we(t)}),m().createElement("path",{d:"M25 111C25 80.2068 25 49.4135 25 26M25 26C48.6174 26 72.2348 26 111 26H25ZM25 26C53.3671 26 81.7343 26 111 26H25ZM111 26C111 52.303 111 78.606 111 111V26ZM111 26C111 51.2947 111 76.5893 111 111V26ZM111 111C87.0792 111 63.1585 111 25 111H111ZM111 111C87.4646 111 63.9293 111 25 111H111ZM25 111C25 81.1514 25 51.3028 25 26V111Z",stroke:we(t),strokeWidth:"2"}),m().createElement("path",{d:"M100 100H160V160H100",fill:we(t)}),m().createElement("path",{d:"M100 160C100 144.106 100 128.211 100 100M100 100C117.706 100 135.412 100 160 100H100ZM100 100C114.214 100 128.428 100 160 100H100ZM160 100C160 120.184 160 140.369 160 160V100ZM160 100C160 113.219 160 126.437 160 160V100ZM160 160C145.534 160 131.068 160 100 160H160ZM160 160C143.467 160 126.934 160 100 160H160ZM100 160C100 143.661 100 127.321 100 100V160Z",stroke:we(t),strokeWidth:"2"}),m().createElement("g",{fill:u0(t),stroke:we(t),strokeWidth:"6"},m().createElement("rect",{x:"2.5",y:"2.5",width:"30",height:"30"}),m().createElement("rect",{x:"2.5",y:"149.5",width:"30",height:"30"}),m().createElement("rect",{x:"147.5",y:"149.5",width:"30",height:"30"}),m().createElement("rect",{x:"147.5",y:"2.5",width:"30",height:"30"}))),{width:182,height:182,mirror:!0})})),Gw=m().memo(function(e){var t=e.theme;return pe(m().createElement(m().Fragment,null,m().createElement("path",{d:"M25 26H111V111H25",fill:we(t)}),m().createElement("path",{d:"M25 111C25 80.2068 25 49.4135 25 26M25 26C48.6174 26 72.2348 26 111 26H25ZM25 26C53.3671 26 81.7343 26 111 26H25ZM111 26C111 52.303 111 78.606 111 111V26ZM111 26C111 51.2947 111 76.5893 111 111V26ZM111 111C87.0792 111 63.1585 111 25 111H111ZM111 111C87.4646 111 63.9293 111 25 111H111ZM25 111C25 81.1514 25 51.3028 25 26V111Z",stroke:we(t),strokeWidth:"2"}),m().createElement("path",{d:"M100 100H160V160H100",fill:we(t)}),m().createElement("path",{d:"M100 160C100 144.106 100 128.211 100 100M100 100C117.706 100 135.412 100 160 100H100ZM100 100C114.214 100 128.428 100 160 100H100ZM160 100C160 120.184 160 140.369 160 160V100ZM160 100C160 113.219 160 126.437 160 160V100ZM160 160C145.534 160 131.068 160 100 160H160ZM160 160C143.467 160 126.934 160 100 160H160ZM100 160C100 143.661 100 127.321 100 100V160Z",stroke:we(t),strokeWidth:"2"}),m().createElement("g",{fill:u0(t),stroke:we(t),strokeWidth:"6"},m().createElement("rect",{x:"2.5",y:"2.5",width:"30",height:"30"}),m().createElement("rect",{x:"78.5",y:"149.5",width:"30",height:"30"}),m().createElement("rect",{x:"147.5",y:"149.5",width:"30",height:"30"}),m().createElement("rect",{x:"147.5",y:"78.5",width:"30",height:"30"}),m().createElement("rect",{x:"105.5",y:"2.5",width:"30",height:"30"}),m().createElement("rect",{x:"2.5",y:"102.5",width:"30",height:"30"}))),{width:182,height:182,mirror:!0})}),Uw=m().memo(function(e){var t=e.theme;return pe(m().createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M20.101 16H28.0934L36 8.95989V4H33.5779L20.101 16ZM30.5704 4L17.0935 16H9.10101L22.5779 4H30.5704ZM19.5704 4L6.09349 16H4V10.7475L11.5779 4H19.5704ZM8.57036 4H4V8.06952L8.57036 4ZM36 11.6378L31.101 16H36V11.6378ZM2 2V18H38V2H2Z",fill:we(t)}),{width:40,height:20})}),Zw=m().memo(function(e){var t=e.theme;return pe(m().createElement("g",{fill:we(t),fillRule:"evenodd",clipRule:"evenodd"},m().createElement("path",{d:"M20.101 16H28.0934L36 8.95989V4H33.5779L20.101 16ZM30.5704 4L17.0935 16H9.10101L22.5779 4H30.5704ZM19.5704 4L6.09349 16H4V10.7475L11.5779 4H19.5704ZM8.57036 4H4V8.06952L8.57036 4ZM36 11.6378L31.101 16H36V11.6378ZM2 2V18H38V2H2Z"}),m().createElement("path",{d:"M14.0001 18L3.00006 4.00002L4.5727 2.76438L15.5727 16.7644L14.0001 18ZM25.0001 18L14.0001 4.00002L15.5727 2.76438L26.5727 16.7644L25.0001 18ZM36.0001 18L25.0001 4.00002L26.5727 2.76438L37.5727 16.7644L36.0001 18Z"})),{width:40,height:20})}),Kw=m().memo(function(e){var t=e.theme;return pe(m().createElement("path",{d:"M2 2H38V18H2V2Z",fill:we(t)}),{width:40,height:20})}),Au=m().memo(function(e){var t=e.theme,n=e.strokeWidth;return pe(m().createElement("path",{d:"M6 10H32",stroke:we(t),strokeWidth:n,strokeLinecap:"round",fill:"none"}),{width:40,height:20})}),Yw=m().memo(function(e){var t=e.theme;return pe(m().createElement("path",{d:"M6 10H34",stroke:we(t),strokeWidth:2,fill:"none",strokeLinecap:"round"}),{width:40,height:20})}),Xw=m().memo(function(e){var t=e.theme;return pe(m().createElement("path",{d:"M6 10H34",stroke:we(t),strokeWidth:2.5,strokeDasharray:"10, 8",fill:"none",strokeLinecap:"round"}),{width:40,height:20})}),Jw=m().memo(function(e){var t=e.theme;return pe(m().createElement("path",{d:"M6 10H36",stroke:we(t),strokeWidth:2.5,strokeDasharray:"2, 4.5",fill:"none",strokeLinecap:"round"}),{width:40,height:20})}),qw=m().memo(function(e){var t=e.theme;return pe(m().createElement("path",{d:"M3.00098 16.1691C6.28774 13.9744 19.6399 2.8905 22.7215 3.00082C25.8041 3.11113 19.1158 15.5488 21.4962 16.8309C23.8757 18.1131 34.4155 11.7148 37.0001 10.6919",stroke:we(t),strokeWidth:2,strokeLinecap:"round",fill:"none"}),{width:40,height:20,mirror:!0})}),Qw=m().memo(function(e){var t=e.theme;return pe(m().createElement("path",{d:"M3 17C6.68158 14.8752 16.1296 9.09849 22.0648 6.54922C28 3.99995 22.2896 13.3209 25 14C27.7104 14.6791 36.3757 9.6471 36.3757 9.6471M6.40706 15C13 11.1918 20.0468 1.51045 23.0234 3.0052C26 4.49995 20.457 12.8659 22.7285 16.4329C25 20 36.3757 13 36.3757 13",stroke:we(t),strokeWidth:2,strokeLinecap:"round",fill:"none"}),{width:40,height:20,mirror:!0})}),_w=m().memo(function(e){var t=e.theme;return pe(m().createElement("path",{d:"M3 15.6468C6.93692 13.5378 22.5544 2.81528 26.6206 3.00242C30.6877 3.18956 25.6708 15.3346 27.4009 16.7705C29.1309 18.2055 35.4001 12.4762 37 11.6177M3.97143 10.4917C6.61158 9.24563 16.3706 2.61886 19.8104 3.01724C23.2522 3.41472 22.0773 12.2013 24.6181 12.8783C27.1598 13.5536 33.3179 8.04068 35.0571 7.07244",stroke:we(t),strokeWidth:2,strokeLinecap:"round",fill:"none"}),{width:40,height:20,mirror:!0})}),$w=m().memo(function(e){var t=e.theme;return pe(m().createElement("path",{d:"M10 17L10 5L35 5",stroke:we(t),strokeWidth:2,strokeLinecap:"round",fill:"none"}),{width:40,height:20,mirror:!0})}),eb=m().memo(function(e){var t=e.theme;return pe(m().createElement("path",{d:"M10 17V15C10 8 13 5 21 5L33.5 5",stroke:we(t),strokeWidth:2,strokeLinecap:"round",fill:"none"}),{width:40,height:20,mirror:!0})}),h0=m().memo(function(e){var t=e.theme;return pe(m().createElement("path",{d:"M6 10H34",stroke:we(t),strokeWidth:2,fill:"none"}),{width:40,height:20})}),m0=m().memo(function(e){var t=e.theme,n=e.flip,r=n!==void 0&&n;return pe(m().createElement("g",{transform:r?"translate(40, 0) scale(-1, 1)":"",stroke:we(t),strokeWidth:2,fill:"none"},m().createElement("path",{d:"M34 10H6M34 10L27 5M34 10L27 15"}),m().createElement("path",{d:"M27.5 5L34.5 10L27.5 15"})),{width:40,height:20})}),g0=m().memo(function(e){var t=e.theme,n=e.flip,r=n!==void 0&&n;return pe(m().createElement("g",{stroke:we(t),fill:we(t),transform:r?"translate(40, 0) scale(-1, 1)":""},m().createElement("path",{d:"M32 10L6 10",strokeWidth:2}),m().createElement("circle",{r:"4",transform:"matrix(-1 0 0 1 30 10)"})),{width:40,height:20})}),v0=m().memo(function(e){var t=e.theme,n=e.flip,r=n!==void 0&&n;return pe(m().createElement("g",{transform:r?"translate(40, 0) scale(-1, 1)":""},m().createElement("path",{d:"M34 10H5.99996M34 10L34 5M34 10L34 15",stroke:we(t),strokeWidth:2,fill:"none"})),{width:40,height:20})}),tb=m().memo(function(e){var t=e.theme;return pe(m().createElement("path",{fill:we(t),d:"M 0 69.092 L 0 55.03 A 124.24 124.24 0 0 0 4.706 57.02 Q 6.826 57.863 8.708 58.5 A 53.466 53.466 0 0 0 12.231 59.571 Q 17.236 60.889 21.387 60.889 A 20.909 20.909 0 0 0 24.265 60.704 Q 25.719 60.502 26.903 60.077 A 8.649 8.649 0 0 0 29.028 58.985 Q 31.689 57.08 31.689 53.321 Q 31.689 51.221 30.518 49.585 A 10.126 10.126 0 0 0 29.282 48.177 Q 28.352 47.287 27.075 46.436 A 23.719 23.719 0 0 0 25.752 45.627 Q 23.774 44.492 20.176 42.735 A 254.44 254.44 0 0 0 17.822 41.602 Q 11.503 38.631 8.236 35.888 A 19.742 19.742 0 0 1 8.008 35.694 A 22.18 22.18 0 0 1 2.783 29.102 Q 0.83 25.342 0.83 20.313 A 22.471 22.471 0 0 1 1.733 13.778 A 17.283 17.283 0 0 1 7.251 5.42 A 21.486 21.486 0 0 1 15.177 1.272 Q 18.361 0.338 22.166 0.09 A 43.573 43.573 0 0 1 25 0 A 42.399 42.399 0 0 1 34.349 1.01 A 39.075 39.075 0 0 1 35.62 1.319 A 67.407 67.407 0 0 1 42.108 3.382 A 83.357 83.357 0 0 1 46.191 5.03 L 41.309 16.797 Q 35.596 14.453 31.86 13.526 A 30.762 30.762 0 0 0 25.417 12.612 A 28.337 28.337 0 0 0 24.512 12.598 A 14.846 14.846 0 0 0 22.022 12.793 Q 19.498 13.224 17.92 14.6 Q 15.625 16.602 15.625 19.824 Q 15.625 21.826 16.553 23.316 Q 17.48 24.805 19.507 26.197 A 18.343 18.343 0 0 0 20.659 26.912 Q 22.596 28.035 26.516 29.953 A 299.99 299.99 0 0 0 29.102 31.201 Q 37.91 35.412 41.841 39.642 A 16.553 16.553 0 0 1 42.822 40.796 A 17.675 17.675 0 0 1 46.301 49.233 A 23.517 23.517 0 0 1 46.533 52.588 A 21.581 21.581 0 0 1 45.471 59.515 A 17.733 17.733 0 0 1 39.575 67.823 Q 33.745 72.486 24.094 73.243 A 49.683 49.683 0 0 1 20.215 73.389 A 51.712 51.712 0 0 1 9.448 72.315 A 40.672 40.672 0 0 1 0 69.092 Z"}),{width:47,height:77})}),nb=m().memo(function(e){var t=e.theme;return pe(m().createElement("path",{fill:we(t),d:"M 44.092 71.387 L 30.225 71.387 L 13.037 15.381 L 12.598 15.381 A 1505.093 1505.093 0 0 1 12.959 22.313 Q 13.426 31.715 13.508 36.4 A 102.991 102.991 0 0 1 13.525 38.184 L 13.525 71.387 L 0 71.387 L 0 0 L 20.605 0 L 37.5 54.59 L 37.793 54.59 L 55.713 0 L 76.318 0 L 76.318 71.387 L 62.207 71.387 L 62.207 37.598 Q 62.207 35.205 62.28 32.08 A 160.703 160.703 0 0 1 62.326 30.544 Q 62.452 26.754 62.866 17.168 A 5390.536 5390.536 0 0 1 62.939 15.479 L 62.5 15.479 L 44.092 71.387 Z"}),{width:77,height:75})}),rb=m().memo(function(e){var t=e.theme;return pe(m().createElement("path",{fill:we(t),d:"M 44.092 71.387 L 0 71.387 L 0 0 L 15.137 0 L 15.137 58.887 L 44.092 58.887 L 44.092 71.387 Z"}),{width:45,height:75})}),ob=m().memo(function(e){var t=e.theme;return pe(m().createElement("path",{fill:we(t),d:"M 42.578 35.4 L 66.699 71.387 L 49.414 71.387 L 32.813 44.385 L 16.211 71.387 L 0 71.387 L 23.682 34.57 L 1.514 0 L 18.213 0 L 33.594 25.684 L 48.682 0 L 64.99 0 L 42.578 35.4 Z M 119.775 71.387 L 75.684 71.387 L 75.684 0 L 90.82 0 L 90.82 58.887 L 119.775 58.887 L 119.775 71.387 Z"}),{width:120,height:75})}),ib=m().memo(function(e){var t=e.theme;return pe(m().createElement("path",{fill:we(t),d:"M290.74 93.24l128.02 128.02-277.99 277.99-114.14 12.6C11.35 513.54-1.56 500.62.14 485.34l12.7-114.22 277.9-277.88zm207.2-19.06l-60.11-60.11c-18.75-18.75-49.16-18.75-67.91 0l-56.55 56.55 128.02 128.02 56.55-56.55c18.75-18.76 18.75-49.16 0-67.91z"}),{width:448,height:512})}),ab=m().memo(function(e){var t=e.theme;return pe(m().createElement(m().Fragment,null,m().createElement("path",{fill:we(t),d:"M 63.818 71.68 L 54.492 71.68 L 45.898 49.561 L 17.578 49.561 L 9.082 71.68 L 0 71.68 L 27.881 0 L 35.986 0 L 63.818 71.68 Z M 20.605 41.602 L 43.213 41.602 L 35.205 19.971 L 31.787 9.277 Q 30.322 15.137 28.711 19.971 L 20.605 41.602 Z"}),m().createElement("path",{fill:we(t),d:"M 68.994 71.68 L 52.686 71.68 L 47.51 54.688 L 21.484 54.688 L 16.309 71.68 L 0 71.68 L 25.195 0 L 43.701 0 L 68.994 71.68 Z M 25.293 41.992 L 43.896 41.992 A 27590.463 27590.463 0 0 1 42.2 36.532 Q 36.965 19.676 35.937 16.273 A 120.932 120.932 0 0 1 35.815 15.869 A 131.65 131.65 0 0 1 35.396 14.435 Q 34.951 12.879 34.675 11.741 A 34.866 34.866 0 0 1 34.521 11.084 A 141.762 141.762 0 0 1 33.706 14.075 Q 31.482 21.957 25.293 41.992 Z"})),{width:70,height:78})}),lb=m().memo(function(e){var t=e.theme;return pe(m().createElement(m().Fragment,null,m().createElement("path",{fill:we(t),d:"M278.9 511.5l-61-17.7c-6.4-1.8-10-8.5-8.2-14.9L346.2 8.7c1.8-6.4 8.5-10 14.9-8.2l61 17.7c6.4 1.8 10 8.5 8.2 14.9L293.8 503.3c-1.9 6.4-8.5 10.1-14.9 8.2zm-114-112.2l43.5-46.4c4.6-4.9 4.3-12.7-.8-17.2L117 256l90.6-79.7c5.1-4.5 5.5-12.3.8-17.2l-43.5-46.4c-4.5-4.8-12.1-5.1-17-.5L3.8 247.2c-5.1 4.7-5.1 12.8 0 17.5l144.1 135.1c4.9 4.6 12.5 4.4 17-.5zm327.2.6l144.1-135.1c5.1-4.7 5.1-12.8 0-17.5L492.1 112.1c-4.8-4.5-12.4-4.3-17 .5L431.6 159c-4.6 4.9-4.3 12.7.8 17.2L523 256l-90.6 79.7c-5.1 4.5-5.5 12.3-.8 17.2l43.5 46.4c4.5 4.9 12.1 5.1 17 .6z"})),{width:640,height:512})}),sb=m().memo(function(e){var t=e.theme;return pe(m().createElement("path",{d:"M12.83 352h262.34A12.82 12.82 0 00288 339.17v-38.34A12.82 12.82 0 00275.17 288H12.83A12.82 12.82 0 000 300.83v38.34A12.82 12.82 0 0012.83 352zm0-256h262.34A12.82 12.82 0 00288 83.17V44.83A12.82 12.82 0 00275.17 32H12.83A12.82 12.82 0 000 44.83v38.34A12.82 12.82 0 0012.83 96zM432 160H16a16 16 0 00-16 16v32a16 16 0 0016 16h416a16 16 0 0016-16v-32a16 16 0 00-16-16zm0 256H16a16 16 0 00-16 16v32a16 16 0 0016 16h416a16 16 0 0016-16v-32a16 16 0 00-16-16z",fill:we(t),strokeLinecap:"round"}),{width:448,height:512})}),cb=m().memo(function(e){var t=e.theme;return pe(m().createElement("path",{d:"M432 160H16a16 16 0 00-16 16v32a16 16 0 0016 16h416a16 16 0 0016-16v-32a16 16 0 00-16-16zm0 256H16a16 16 0 00-16 16v32a16 16 0 0016 16h416a16 16 0 0016-16v-32a16 16 0 00-16-16zM108.1 96h231.81A12.09 12.09 0 00352 83.9V44.09A12.09 12.09 0 00339.91 32H108.1A12.09 12.09 0 0096 44.09V83.9A12.1 12.1 0 00108.1 96zm231.81 256A12.09 12.09 0 00352 339.9v-39.81A12.09 12.09 0 00339.91 288H108.1A12.09 12.09 0 0096 300.09v39.81a12.1 12.1 0 0012.1 12.1z",fill:we(t)}),{width:448,height:512})}),ub=m().memo(function(e){var t=e.theme;return pe(m().createElement("path",{d:"M16 224h416a16 16 0 0016-16v-32a16 16 0 00-16-16H16a16 16 0 00-16 16v32a16 16 0 0016 16zm416 192H16a16 16 0 00-16 16v32a16 16 0 0016 16h416a16 16 0 0016-16v-32a16 16 0 00-16-16zm3.17-384H172.83A12.82 12.82 0 00160 44.83v38.34A12.82 12.82 0 00172.83 96h262.34A12.82 12.82 0 00448 83.17V44.83A12.82 12.82 0 00435.17 32zm0 256H172.83A12.82 12.82 0 00160 300.83v38.34A12.82 12.82 0 00172.83 352h262.34A12.82 12.82 0 00448 339.17v-38.34A12.82 12.82 0 00435.17 288z",fill:we(t),strokeLinecap:"round"}),{width:448,height:512})}),Lu=[],me=function(e){return Lu=Lu.concat(e),e};function y0(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),n.push.apply(n,r)}return n}function kn(e){for(var t=1;t0?a-1:0})}),commitToHistory:!0}}var u=function(w,k){return{elements:w.map(function(M){return k.selectedElementIds[M.id]?ht(M,{isDeleted:!0}):M}),appState:kn(kn({},k),{},{selectedElementIds:{}})}}(e,t),y=u.elements,b=u.appState;return ku(y,e.filter(function(w){var k=w.id;return t.selectedElementIds[k]})),{elements:y,appState:kn(kn({},b=w0(b,y)),{},{elementType:"selection",multiElement:null}),commitToHistory:Wt(He(e),t)}},contextItemLabel:"labels.delete",keyTest:function(e){return e.key===a2||e.key===s2},PanelComponent:function(e){var t=e.elements,n=e.appState,r=e.updateData;return m().createElement(Ke,{type:"button",icon:Tu,title:L("labels.delete"),"aria-label":L("labels.delete"),onClick:function(){return r(null)},visible:Wt(He(t),n)})}}),ln=function(e,t){for(var n=0,r=t.length,a=e.length;n-1;)if(y(u[w],w,u))return w;return-1}(t,s,Math.max(0,n-1)):function(u,y,b){b===void 0&&(b=0),b<0&&(b=u.length+b);for(var w=(b=Math.min(u.length,Math.max(b,0)))-1;++w0&&r[u-1]!==g-1&&(a=++a),(f[a]||(f[a]=[])).push(g),f},[]));return n==="right"&&(p=p.reverse()),p.forEach(function(f,g){var u=f[0],y=f[f.length-1],b=n==="left"?u:y,w=db(e,t,b,n);if(w!==-1&&b!==w){var k=n==="left"?t.slice(0,w):t.slice(0,u),M=t.slice(u,y+1),A=n==="left"?t.slice(w,u):t.slice(y+1,w+1),O=n==="left"?t.slice(y+1):t.slice(w+1);t=ln(n==="left"?ln(ln(ln([],k),M),A):ln(ln(ln([],k),A),M),O)}}),t.map(function(f){return c[f.id]?sh(f):f})},k0=function(e,t,n){var r,a,s=b0(e,t),c=x0(e,s),p=[];if(n==="left"){if(t.editingGroupId){if(!(f=pr(e,t.editingGroupId)).length)return e;r=e.indexOf(f[0])}else r=0;a=s[s.length-1]}else{if(t.editingGroupId){var f;if(!(f=pr(e,t.editingGroupId)).length)return e;a=e.indexOf(f[f.length-1])}else a=e.length-1;r=s[0]}for(var g=r;gk&&(f.style.left="".concat(k-b,"px"));var M=window.innerHeight;y+w>M&&(f.style.top="".concat(M-w,"px"))}},[c]),(0,V.useEffect)(function(){if(a){var f=function(g){var u;(u=p.current)!==null&&u!==void 0&&u.contains(g.target)||(0,fo.unstable_batchedUpdates)(function(){return a(g)})};return document.addEventListener("pointerdown",f,!1),function(){return document.removeEventListener("pointerdown",f,!1)}}},[a]),m().createElement("div",{className:"popover",style:{top:r,left:n},ref:p},t)}),M0=(E(4220),function(e){var t=new Option().style;return t.color=e,!!t.color}),xa=[["1","2","3","4","5"],["q","w","e","r","t"],["a","s","d","f","g"]].flat(),kb=function(e){var t=e.colors,n=e.color,r=e.onChange,a=e.onClose,s=e.label,c=e.showInput,p=c===void 0||c,f=e.type,g=m().useRef(),u=m().useRef(),y=m().useRef(),b=m().useRef();return m().useEffect(function(){u.current?u.current.focus():b.current?b.current.focus():y.current&&y.current.focus()},[]),m().createElement("div",{className:"color-picker color-picker-type-".concat(f),role:"dialog","aria-modal":"true","aria-label":L("labels.colorPicker"),onKeyDown:function(w){if(w.key===Zl){var k,M=document.activeElement;if(w.shiftKey)M===g.current&&((k=b.current)===null||k===void 0||k.focus(),w.preventDefault());else if(M===b.current){var A;(A=g.current)===null||A===void 0||A.focus(),w.preventDefault()}}else if(ia(w.key)){M=document.activeElement;var O=ee().rtl;if((W=Array.prototype.indexOf.call(y.current.children,M))!==-1){var N=y.current.children.length-(p?1:0),U=w.key===(O?ho:mo)?(W+1)%N:w.key===(O?mo:ho)?(N+W-1)%N:w.key===na?(W+5)%N:w.key===ra?(N+W-5)%N:W;y.current.children[U].focus()}w.preventDefault()}else if(xa.includes(w.key.toLowerCase())&&!Qo(w.target)){var W=xa.indexOf(w.key.toLowerCase());y.current.children[W].focus(),w.preventDefault()}else w.key!==go&&w.key!==oa||(w.preventDefault(),a());w.nativeEvent.stopImmediatePropagation(),w.stopPropagation()}},m().createElement("div",{className:"color-picker-triangle color-picker-triangle-shadow"}),m().createElement("div",{className:"color-picker-triangle"}),m().createElement("div",{className:"color-picker-content",ref:function(w){w&&(y.current=w)},tabIndex:0},t.map(function(w,k){return m().createElement("button",{className:"color-picker-swatch",onClick:function(M){M.currentTarget.focus(),r(w)},title:"".concat(w," \u2014 ").concat(xa[k].toUpperCase()),"aria-label":w,"aria-keyshortcuts":xa[k],style:{color:w},key:w,ref:function(M){M&&k===0&&(g.current=M),M&&w===n&&(u.current=M)},onFocus:function(){r(w)}},w==="transparent"?m().createElement("div",{className:"color-picker-transparent"}):void 0,m().createElement("span",{className:"color-picker-keybinding"},xa[k]))}),p&&m().createElement(O0,{color:n,label:s,onChange:function(w){r(w)},ref:b})))},O0=m().forwardRef(function(e,t){var n=e.color,r=e.onChange,a=e.label,s=m().useState(n),c=s[0],p=s[1],f=m().useRef(null);m().useEffect(function(){p(n)},[n]),m().useImperativeHandle(t,function(){return f.current});var g=m().useCallback(function(u){var y=u.toLowerCase(),b=function(w){return w==="transparent"||M0(w)?w:M0("#".concat(w))?"#".concat(w):null}(y);b&&r(b),p(y)},[r]);return m().createElement("label",{className:"color-input-container"},m().createElement("div",{className:"color-picker-hash"},"#"),m().createElement("input",{spellCheck:!1,className:"color-picker-input","aria-label":a,onChange:function(u){return g(u.target.value)},value:(c||"").replace(/^#/,""),onBlur:function(){return p(n)},ref:f}))}),Nu=function(e){var t=e.type,n=e.color,r=e.onChange,a=e.label,s=m().useState(!1),c=s[0],p=s[1],f=m().useRef(null);return m().createElement("div",null,m().createElement("div",{className:"color-picker-control-container"},m().createElement("button",{className:"color-picker-label-swatch","aria-label":a,style:n?{"--swatch-color":n}:void 0,onClick:function(){return p(!c)},ref:f}),m().createElement(O0,{color:n,label:a,onChange:function(g){r(g)}})),m().createElement(m().Suspense,{fallback:""},c?m().createElement(zu,{onCloseRequest:function(g){return g.target!==f.current&&p(!1)}},m().createElement(kb,{colors:Sr[t],color:n||null,onChange:function(g){r(g)},onClose:function(){var g;p(!1),(g=f.current)===null||g===void 0||g.focus()},label:a,showInput:!1,type:t})):null))};function fs(){return(fs=Object.assign||function(e){for(var t=1;t0&&c>0&&a(c-10)},value:(t=Sn(n,r,function(s){return s.opacity},r.currentItemOpacity))!==null&&t!==void 0?t:void 0}))}}),me({name:"changeFontSize",perform:function(e,t,n){return{elements:An(e,t,function(r){if(Ht(r)){var a=ht(r,{fontSize:n});return us(a),a}return r}),appState:bt(bt({},t),{},{currentItemFontSize:n}),commitToHistory:!0}},PanelComponent:function(e){var t=e.elements,n=e.appState,r=e.updateData;return m().createElement("fieldset",null,m().createElement("legend",null,L("labels.fontSize")),m().createElement(Lr,{group:"font-size",options:[{value:16,text:L("labels.small"),icon:m().createElement(tb,{theme:n.theme})},{value:20,text:L("labels.medium"),icon:m().createElement(nb,{theme:n.theme})},{value:28,text:L("labels.large"),icon:m().createElement(rb,{theme:n.theme})},{value:36,text:L("labels.veryLarge"),icon:m().createElement(ob,{theme:n.theme})}],value:Sn(t,n,function(a){return Ht(a)&&a.fontSize},n.currentItemFontSize||j.n5),onChange:function(a){return r(a)}}))}}),me({name:"changeFontFamily",perform:function(e,t,n){return{elements:An(e,t,function(r){if(Ht(r)){var a=ht(r,{fontFamily:n});return us(a),a}return r}),appState:bt(bt({},t),{},{currentItemFontFamily:n}),commitToHistory:!0}},PanelComponent:function(e){var t=e.elements,n=e.appState,r=e.updateData,a=[{value:1,text:L("labels.handDrawn"),icon:m().createElement(ib,{theme:n.theme})},{value:2,text:L("labels.normal"),icon:m().createElement(ab,{theme:n.theme})},{value:3,text:L("labels.code"),icon:m().createElement(lb,{theme:n.theme})}];return m().createElement("fieldset",null,m().createElement("legend",null,L("labels.fontFamily")),m().createElement(Lr,{group:"font-family",options:a,value:Sn(t,n,function(s){return Ht(s)&&s.fontFamily},n.currentItemFontFamily||j.rk),onChange:function(s){return r(s)}}))}}),me({name:"changeTextAlign",perform:function(e,t,n){return{elements:An(e,t,function(r){if(Ht(r)){var a=ht(r,{textAlign:n});return us(a),a}return r}),appState:bt(bt({},t),{},{currentItemTextAlign:n}),commitToHistory:!0}},PanelComponent:function(e){var t=e.elements,n=e.appState,r=e.updateData;return m().createElement("fieldset",null,m().createElement("legend",null,L("labels.textAlign")),m().createElement(Lr,{group:"text-align",options:[{value:"left",text:L("labels.left"),icon:m().createElement(sb,{theme:n.theme})},{value:"center",text:L("labels.center"),icon:m().createElement(cb,{theme:n.theme})},{value:"right",text:L("labels.right"),icon:m().createElement(ub,{theme:n.theme})}],value:Sn(t,n,function(a){return Ht(a)&&a.textAlign},n.currentItemTextAlign),onChange:function(a){return r(a)}}))}}),me({name:"changeSharpness",perform:function(e,t,n){var r=Pu(He(e),t),a=r.length?r.every(function(c){return!Et(c)}):!co(t.elementType),s=r.length?r.every(Et):co(t.elementType);return{elements:An(e,t,function(c){return ht(c,{strokeSharpness:n})}),appState:bt(bt({},t),{},{currentItemStrokeSharpness:a?n:t.currentItemStrokeSharpness,currentItemLinearStrokeSharpness:s?n:t.currentItemLinearStrokeSharpness}),commitToHistory:!0}},PanelComponent:function(e){var t=e.elements,n=e.appState,r=e.updateData;return m().createElement("fieldset",null,m().createElement("legend",null,L("labels.edges")),m().createElement(Lr,{group:"edges",options:[{value:"sharp",text:L("labels.sharp"),icon:m().createElement($w,{theme:n.theme})},{value:"round",text:L("labels.round"),icon:m().createElement(eb,{theme:n.theme})}],value:Sn(t,n,function(a){return a.strokeSharpness},Ou(n.elementType)&&(co(n.elementType)?n.currentItemLinearStrokeSharpness:n.currentItemStrokeSharpness)||null),onChange:function(a){return r(a)}}))}}),me({name:"changeArrowhead",perform:function(e,t,n){var r;return{elements:An(e,t,function(a){if(Et(a)){var s=n.position,c=n.type;if(s==="start")return ht(a,{startArrowhead:c});if(s==="end")return ht(a,{endArrowhead:c})}return a}),appState:bt(bt({},t),{},(r={},r[n.position==="start"?"currentItemStartArrowhead":"currentItemEndArrowhead"]=n.type,r)),commitToHistory:!0}},PanelComponent:function(e){var t=e.elements,n=e.appState,r=e.updateData,a=ee().rtl;return m().createElement("fieldset",null,m().createElement("legend",null,L("labels.arrowheads")),m().createElement("div",{className:"iconSelectList"},m().createElement(T0,{label:"arrowhead_start",options:[{value:null,text:L("labels.arrowhead_none"),icon:m().createElement(h0,{theme:n.theme}),keyBinding:"q"},{value:"arrow",text:L("labels.arrowhead_arrow"),icon:m().createElement(m0,{theme:n.theme,flip:!a}),keyBinding:"w"},{value:"bar",text:L("labels.arrowhead_bar"),icon:m().createElement(v0,{theme:n.theme,flip:!a}),keyBinding:"e"},{value:"dot",text:L("labels.arrowhead_dot"),icon:m().createElement(g0,{theme:n.theme,flip:!a}),keyBinding:"r"}],value:Sn(t,n,function(s){return Et(s)&&ps(s.type)?s.startArrowhead:n.currentItemStartArrowhead},n.currentItemStartArrowhead),onChange:function(s){return r({position:"start",type:s})}}),m().createElement(T0,{label:"arrowhead_end",group:"arrowheads",options:[{value:null,text:L("labels.arrowhead_none"),keyBinding:"q",icon:m().createElement(h0,{theme:n.theme})},{value:"arrow",text:L("labels.arrowhead_arrow"),keyBinding:"w",icon:m().createElement(m0,{theme:n.theme,flip:a})},{value:"bar",text:L("labels.arrowhead_bar"),keyBinding:"e",icon:m().createElement(v0,{theme:n.theme,flip:a})},{value:"dot",text:L("labels.arrowhead_dot"),keyBinding:"r",icon:m().createElement(g0,{theme:n.theme,flip:a})}],value:Sn(t,n,function(s){return Et(s)&&ps(s.type)?s.endArrowhead:n.currentItemEndArrowhead},n.currentItemEndArrowhead),onChange:function(s){return r({position:"end",type:s})}})))}}),function(e){var t=e.title?e.title:e.value==="dark"?L("buttons.lightMode"):L("buttons.darkMode");return m().createElement("label",{className:"ToolIcon ToolIcon_type_floating ToolIcon_size_M","data-testid":"toggle-dark-mode",title:t},m().createElement("input",{className:"ToolIcon_type_checkbox ToolIcon_toggle_opaque",type:"checkbox",onChange:function(n){return e.onChange(n.target.checked?"dark":"light")},checked:e.value==="dark","aria-label":t}),m().createElement("div",{className:"ToolIcon__icon"},e.value==="light"?L0.MOON:L0.SUN))}),L0={SUN:m().createElement("svg",{width:"512",height:"512",className:"rtl-mirror",viewBox:"0 0 512 512"},m().createElement("path",{fill:"currentColor",d:"M256 160c-52.9 0-96 43.1-96 96s43.1 96 96 96 96-43.1 96-96-43.1-96-96-96zm246.4 80.5l-94.7-47.3 33.5-100.4c4.5-13.6-8.4-26.5-21.9-21.9l-100.4 33.5-47.4-94.8c-6.4-12.8-24.6-12.8-31 0l-47.3 94.7L92.7 70.8c-13.6-4.5-26.5 8.4-21.9 21.9l33.5 100.4-94.7 47.4c-12.8 6.4-12.8 24.6 0 31l94.7 47.3-33.5 100.5c-4.5 13.6 8.4 26.5 21.9 21.9l100.4-33.5 47.3 94.7c6.4 12.8 24.6 12.8 31 0l47.3-94.7 100.4 33.5c13.6 4.5 26.5-8.4 21.9-21.9l-33.5-100.4 94.7-47.3c13-6.5 13-24.7.2-31.1zm-155.9 106c-49.9 49.9-131.1 49.9-181 0-49.9-49.9-49.9-131.1 0-181 49.9-49.9 131.1-49.9 181 0 49.9 49.9 49.9 131.1 0 181z"})),MOON:m().createElement("svg",{width:"512",height:"512",className:"rtl-mirror",viewBox:"0 0 512 512"},m().createElement("path",{fill:"currentColor",d:"M283.211 512c78.962 0 151.079-35.925 198.857-94.792 7.068-8.708-.639-21.43-11.562-19.35-124.203 23.654-238.262-71.576-238.262-196.954 0-72.222 38.662-138.635 101.498-174.394 9.686-5.512 7.25-20.197-3.756-22.23A258.156 258.156 0 0 0 283.211 0c-141.309 0-256 114.511-256 256 0 141.309 114.511 256 256 256z"}))};function D0(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),n.push.apply(n,r)}return n}function $t(e){for(var t=1;t0?Pt(a):Pt(r),c=function(b,w){var k=b[0],M=b[1],A=b[2],O=b[3],N=A-k,U=w.width/N,W=O-M,K=w.height/W,B=Math.min(U,K),Y=Math.floor(B/j.V4)*j.V4;return Math.min(Math.max(Y,j.V4),1)}(s,{width:t.width,height:t.height}),p=Po(c,t.zoom,{left:t.offsetLeft,top:t.offsetTop}),f=s[0],g=s[1],u=(f+s[2])/2,y=(g+s[3])/2;return{appState:$t($t($t({},t),Mu({scenePoint:{x:u,y},viewportDimensions:{width:t.width,height:t.height},zoom:p})),{},{zoom:p}),commitToHistory:!1}};me({name:"zoomToSelection",perform:function(e,t){return z0(e,t,!0)},keyTest:function(e){return e.code===Jy&&e.shiftKey&&!e.altKey&&!e[Ue]}}),me({name:"zoomToFit",perform:function(e,t){return z0(e,t,!1)},keyTest:function(e){return e.code===Xy&&e.shiftKey&&!e.altKey&&!e[Ue]}}),me({name:"toggleTheme",perform:function(e,t,n){return{appState:$t($t({},t),{},{theme:n||(t.theme==="light"?"dark":"light")}),commitToHistory:!1}},PanelComponent:function(e){var t=e.appState,n=e.updateData;return m().createElement("div",{style:{marginInlineStart:"0.25rem"}},m().createElement(A0,{value:t.theme,onChange:function(r){n(r)}}))},keyTest:function(e){return e.altKey&&e.shiftKey&&e.code===e2}});function N0(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),n.push.apply(n,r)}return n}function si(e){for(var t=1;t1){var W=mt.getPointAtIndexGlobalCoordinates(k,-1),K=W[0],B=W[1];wu(k,t,an.getScene(k),{x:K,y:B})}t.elementLocked||t.elementType==="freedraw"||(t.selectedElementIds[k.id]=!0)}return(t.elementLocked||t.elementType==="freedraw")&&k||ur(c),{elements:w,appState:si(si({},t),{},{elementType:(t.elementLocked||t.elementType==="freedraw")&&k?t.elementType:"selection",draggingElement:null,multiElement:null,editingElement:null,startBoundElement:null,suggestedBindings:[],selectedElementIds:k&&!t.elementLocked&&t.elementType!=="freedraw"?si(si({},t.selectedElementIds),{},(a={},a[k.id]=!0,a)):t.selectedElementIds}),commitToHistory:t.elementType==="freedraw"}},keyTest:function(e,t){return e.key===go&&(t.editingLinearElement!==null||!t.draggingElement&&t.multiElement===null)||(e.key===go||e.key===oa)&&t.multiElement!==null},PanelComponent:function(e){var t=e.appState,n=e.updateData;return m().createElement(Ke,{type:"button",icon:Ew,title:L("buttons.done"),"aria-label":L("buttons.done"),onClick:n,visible:t.multiElement!=null})}}),ci=typeof process!="undefined"&&(ju=process.env)!==null&&ju!==void 0&&ju.REACT_APP_GOOGLE_ANALYTICS_ID&&typeof window!="undefined"&&window.gtag?function(e,t,n,r){window.gtag("event",t,{event_category:e,event_label:n,value:r})}:(typeof process!="undefined"&&(Ru=process.env)!==null&&Ru!==void 0&&Ru.JEST_WORKER_ID,function(e,t,n,r){}),Cb=(E(518),function(){var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,a){r.__proto__=a}||function(r,a){for(var s in a)Object.prototype.hasOwnProperty.call(a,s)&&(r[s]=a[s])})(t,n)};return function(t,n){if(typeof n!="function"&&n!==null)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function r(){this.constructor=t}e(t,n),t.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r)}}()),Pb=function(e){function t(){for(var n=[],r=0;r1&&!t.isRotating){var Se=4/c.zoom.value;O.fillStyle=qe.ix;var $=Pt(de),ke=$[0],Ze=$[1],ue=$[2],_e=$[3],Le=O.getLineDash();O.setLineDash([2/c.zoom.value]);var Be=O.lineWidth;O.lineWidth=1/c.zoom.value,ms(O,ke-Se,Ze-Se,ue-ke+2*Se,_e-Ze+2*Se,(ke+ue)/2,(Ze+_e)/2,0),O.lineWidth=Be,O.setLineDash(Le),le=du([ke,Ze,ue,_e],0,c.zoom,"mouse",yh),F0(O,c,le,0)}O.translate(-c.scrollX,-c.scrollY)}for(var We in O.scale(1/c.zoom.value,1/c.zoom.value),O.translate(-K,-B),c.remotePointerViewportCoords){var Qe=c.remotePointerViewportCoords[We],Me=Qe.x,Ye=Qe.y;Me-=t.offsetLeft,Ye-=t.offsetTop;var ct=Me<0||Me>N-9||Ye<0||Ye>U-14;Me=Math.max(Me,0),Me=Math.min(Me,N-9),Ye=Math.max(Ye,0),Ye=Math.min(Ye,U-14);var kt=Fu(We,t),Mt=kt.background,zn=kt.stroke,It=O.strokeStyle,Pn=(W=O.fillStyle,O.globalAlpha);O.strokeStyle=zn,O.fillStyle=Mt;var sn=c.remotePointerUserStates[We];(ct||sn===Dr.AWAY)&&(O.globalAlpha=.48),c.remotePointerButton&&c.remotePointerButton[We]==="down"&&(O.beginPath(),O.arc(Me,Ye,15,0,2*Math.PI,!1),O.lineWidth=3,O.strokeStyle="#ffffff88",O.stroke(),O.closePath(),O.beginPath(),O.arc(Me,Ye,15,0,2*Math.PI,!1),O.lineWidth=1,O.strokeStyle=zn,O.stroke(),O.closePath()),O.beginPath(),O.moveTo(Me,Ye),O.lineTo(Me+1,Ye+14),O.lineTo(Me+4,Ye+9),O.lineTo(Me+9,Ye+10),O.lineTo(Me,Ye),O.fill(),O.stroke();var en=c.remotePointerUsernames[We],At="";sn===Dr.AWAY?At=Hu?"\u26AB\uFE0F":" (".concat(Dr.AWAY,")"):sn===Dr.IDLE?At=Hu?"\u{1F4A4}":" (".concat(Dr.IDLE,")"):sn===Dr.ACTIVE&&(At=Hu?"\u{1F7E2}":"");var Lt="".concat(en?"".concat(en," "):"").concat(At);if(!ct&&Lt){var Nn=Me+9,Zn=Ye+14,tn=O.measureText(Lt),Io=tn.actualBoundingBoxDescent+tn.actualBoundingBoxAscent;O.fillStyle=zn,O.fillRect(Nn-1,Zn-1,tn.width+8+2,Io+8+2),O.fillStyle=Mt,O.fillRect(Nn,Zn,tn.width+8,Io+8),O.fillStyle=qe.ix,O.fillText(Lt,Nn+4,Zn+4+tn.actualBoundingBoxAscent)}O.strokeStyle=It,O.fillStyle=W,O.globalAlpha=Pn,O.closePath()}return u&&(Y=function(Ce,Re,Ne,Je){var ut=Je.scrollX,at=Je.scrollY,rt=Je.zoom;if(Ce.length===0)return{horizontal:null,vertical:null};var Dt=Pt(Ce),zt=Dt[0],Fr=Dt[1],La=Dt[2],gi=Dt[3],cn=Re/rt.value,un=Ne/rt.value,Ao=Re-cn,Da=Ne-un,Nt={top:parseInt(Kl("sat")),bottom:parseInt(Kl("sab")),left:parseInt(Kl("sal")),right:parseInt(Kl("sar"))},Lo=ee().rtl,er=Ao/2-ut+Nt.left,Kn=Da/2-at+Nt.top,Kt=er+cn-Nt.right,za=Kn+un-Nt.bottom,As=Math.min(zt,er),Ls=Math.min(Fr,Kn),sd=Math.max(La,Kt),cd=Math.max(gi,za);return{horizontal:er===As&&Kt===sd?null:{x:Math.max(Nt.left,4)+(er-As)/(sd-As)*Re,y:Ne-6-Math.max(4,Nt.bottom),width:(Kt-er)/(sd-As)*Re-Math.max(8,Nt.left+Nt.right),height:6},vertical:Kn===Ls&&za===cd?null:{x:Lo?Math.max(Nt.left,4):Re-6-Math.max(Nt.right,4),y:(Kn-Ls)/(cd-Ls)*Ne+Math.max(Nt.top,4),width:6,height:(za-Kn)/(cd-Ls)*Ne-Math.max(8,Nt.top+Nt.bottom)}}}(e,N,U,c),W=O.fillStyle,It=O.strokeStyle,O.fillStyle="rgba(0,0,0,0.3)",O.strokeStyle="rgba(255,255,255,0.8)",[Y.horizontal,Y.vertical].forEach(function(Ce){Ce&&function(Re,Ne,Je,ut,at,rt){Re.beginPath(),Re.moveTo(Ne+rt,Je),Re.lineTo(Ne+ut-rt,Je),Re.quadraticCurveTo(Ne+ut,Je,Ne+ut,Je+rt),Re.lineTo(Ne+ut,Je+at-rt),Re.quadraticCurveTo(Ne+ut,Je+at,Ne+ut-rt,Je+at),Re.lineTo(Ne+rt,Je+at),Re.quadraticCurveTo(Ne,Je+at,Ne,Je+at-rt),Re.lineTo(Ne,Je+rt),Re.quadraticCurveTo(Ne,Je,Ne+rt,Je),Re.closePath(),Re.fill(),Re.stroke()}(O,Ce.x,Ce.y,Ce.width,Ce.height,3)}),O.fillStyle=W,O.strokeStyle=It),O.scale(1/r,1/r),{atLeastOneVisibleElement:J.length>0,scrollBars:Y}},F0=function(e,t,n,r){Object.keys(n).forEach(function(a){var s=n[a];if(s!==void 0){var c=e.lineWidth;e.lineWidth=1/t.zoom.value,a==="rotation"?Vu(e,s[0]+s[2]/2,s[1]+s[3]/2,s[2]/2):ms(e,s[0],s[1],s[2],s[3],s[0]+s[2]/2,s[1]+s[3]/2,r,!0),e.lineWidth=c}})},Mb=function(e,t,n){var r=n.angle,a=n.elementX1,s=n.elementY1,c=n.elementX2,p=n.elementY2,f=n.selectionColors,g=c-a,u=p-s,y=e.getLineDash(),b=e.lineWidth,w=e.lineDashOffset,k=e.strokeStyle,M=4/t.zoom.value,A=8/t.zoom.value,O=4/t.zoom.value;e.lineWidth=1/t.zoom.value,e.translate(t.scrollX,t.scrollY);for(var N=f.length,U=0;U=s&&u.y>=c},Lb=function(e,t,n,r){var a=r===void 0?{}:r,s=a.offsetX,c=s===void 0?0:s,p=a.offsetY,f=p===void 0?0:p;n&&e.forEach(function(g){if(!g.isDeleted)try{(function(u,y,b,w,k){var M=it(u),A=M[0],O=M[1],N=M[2],U=M[3],W=(N-A)/2-(u.x-A),K=(U-O)/2-(u.y-O),B=180*u.angle/Math.PI,Y=y.generator;switch(u.type){case"selection":throw new Error("Selection rendering is not supported for SVG");case"rectangle":case"diamond":case"ellipse":$l(u,Y);var J=nh(y,qn(u),j.zK);(oe=u.opacity/100)!=1&&(J.setAttribute("stroke-opacity","".concat(oe)),J.setAttribute("fill-opacity","".concat(oe))),J.setAttribute("stroke-linecap","round"),J.setAttribute("transform","translate(".concat(w||0," ").concat(k||0,") rotate(").concat(B," ").concat(W," ").concat(K,")")),b.appendChild(J);break;case"line":case"arrow":$l(u,Y);var _=b.ownerDocument.createElementNS(Cr,"g"),te=u.opacity/100;_.setAttribute("stroke-linecap","round"),qn(u).forEach(function(_e){var Le=nh(y,_e,j.zK);te!==1&&(Le.setAttribute("stroke-opacity","".concat(te)),Le.setAttribute("fill-opacity","".concat(te))),Le.setAttribute("transform","translate(".concat(w||0," ").concat(k||0,") rotate(").concat(B," ").concat(W," ").concat(K,")")),u.type==="line"&&uo(u.points)&&u.backgroundColor!=="transparent"&&Le.setAttribute("fill-rule","evenodd"),_.appendChild(Le)}),b.appendChild(_);break;case"freedraw":oh(u);var oe=u.opacity/100;J=b.ownerDocument.createElementNS(Cr,"g"),oe!==1&&(J.setAttribute("stroke-opacity","".concat(oe)),J.setAttribute("fill-opacity","".concat(oe))),J.setAttribute("transform","translate(".concat(w||0," ").concat(k||0,") rotate(").concat(B," ").concat(W," ").concat(K,")"));var Ae=b.ownerDocument.createElementNS(Cr,"path");J.setAttribute("stroke","none"),J.setAttribute("fill",u.strokeColor),Ae.setAttribute("d",ih(u)),J.appendChild(Ae),b.appendChild(J);break;default:if(!Ht(u))throw new Error("Unimplemented type ".concat(u.type));oe=u.opacity/100,J=b.ownerDocument.createElementNS(Cr,"g"),oe!==1&&(J.setAttribute("stroke-opacity","".concat(oe)),J.setAttribute("fill-opacity","".concat(oe))),J.setAttribute("transform","translate(".concat(w||0," ").concat(k||0,") rotate(").concat(B," ").concat(W," ").concat(K,")"));for(var Ie=u.text.replace(/\r\n?/g,` -`).split(` -`),de=u.height/Ie.length,le=u.height-u.baseline,Se=u.textAlign==="center"?u.width/2:u.textAlign==="right"?u.width:0,$=Uf(u.text)?"rtl":"ltr",ke=u.textAlign==="center"?"middle":u.textAlign==="right"||$==="rtl"?"end":"start",Ze=0;Ze - - - `),n&&s){var U=N.ownerDocument.createElementNS(Cr,"rect");U.setAttribute("x","0"),U.setAttribute("y","0"),U.setAttribute("width","".concat(A)),U.setAttribute("height","".concat(O)),U.setAttribute("fill",s),N.appendChild(U)}var W=Jo.svg(N);return Lb(b,W,N,{offsetX:-k+a,offsetY:-M+a}),N},Gu=function(e,t){var n=Bu([],e);if(t){var r=Pt(e),a=r[2],s=r[3];n=Bu(Bu([],n),[Db(a,s)])}return n},Db=function(e,t){return Eo({text:L("labels.madeWithExcalidraw"),fontSize:16,fontFamily:j.rk,textAlign:"right",verticalAlign:j.hs,x:e,y:t+16,strokeColor:qe.MA[5],backgroundColor:"transparent",fillStyle:"hachure",strokeWidth:1,strokeStyle:"solid",roughness:1,opacity:100,strokeSharpness:"sharp"})},Uu=function(e,t,n){var r=Pt(e),a=r[0],s=r[1],c=r[2],p=r[3];return[a,s,In(a,c)+2*t,In(s,p)+t+(n?0:t)]},Gn=function(e,t){for(var n=0,r=t.length,a=e.length;n2)return{type:Oo,reason:"More than 2 columns"};if(t===1){if(!Zu(e,0))return{type:Oo,reason:"Value is not numeric"};var n=ka(e[0][0])===null,r=(n?e.slice(1):e).map(function(f){return ka(f[0])});return r.length<2?{type:Oo,reason:"Less than two rows"}:{type:Ea,spreadsheet:{title:n?e[0][0]:null,labels:null,values:r}}}var a=Zu(e,0)?0:1;if(!Zu(e,a))return{type:Oo,reason:"Value is not numeric"};var s=(a+1)%2,c=ka(e[0][a])===null,p=c?e.slice(1):e;return p.length<2?{type:Oo,reason:"Less than 2 rows"}:{type:Ea,spreadsheet:{title:c?e[0][a]:null,labels:p.map(function(f){return f[s]}),values:p.map(function(f){return ka(f[a])})}}},vs=Sr.elementBackground.slice(2,Sr.elementBackground.length),Dn={fillStyle:"hachure",fontFamily:j.rk,fontSize:j.n5,opacity:100,roughness:1,strokeColor:Sr.elementStroke[0],strokeSharpness:"sharp",strokeStyle:"solid",strokeWidth:1,verticalAlign:"middle"},G0=function(e){return{chartWidth:44*e.values.length+Ln,chartHeight:280}},U0=function(e,t,n,r,a,s){var c=G0(e),p=c.chartWidth,f=c.chartHeight,g=e.title?Eo(xt(xt({backgroundColor:a,groupIds:[r]},Dn),{},{text:e.title,x:t+p/2,y:n-Mo-24-j.n5,strokeSharpness:"sharp",strokeStyle:"solid",textAlign:"center"})):null,u=s?ns(xt(xt({backgroundColor:a,groupIds:[r]},Dn),{},{type:"rectangle",x:t,y:n-f,width:p,height:f,strokeColor:Sr.elementStroke[0],fillStyle:"solid",opacity:6})):null;return Gn(Gn(Gn(Gn(Gn([],u?[u]:[]),g?[g]:[]),function(y,b,w,k,M){var A;return((A=y.labels)===null||A===void 0?void 0:A.map(function(O,N){return Eo(xt(xt({groupIds:[k],backgroundColor:M},Dn),{},{text:O.length>8?"".concat(O.slice(0,5),"..."):O,x:b+44*N+24,y:w+6,width:B0,angle:5.87,fontSize:16,textAlign:"center",verticalAlign:"top"}))}))||[]}(e,t,n,r,a)),function(y,b,w,k,M){var A=Eo(xt(xt({groupIds:[k],backgroundColor:M},Dn),{},{x:b-Ln,y:w-Ln,text:"0",textAlign:"right"}));return[A,Eo(xt(xt({groupIds:[k],backgroundColor:M},Dn),{},{x:b-Ln,y:w-Mo-A.height/2,text:Math.max.apply(Math,y.values).toLocaleString(),textAlign:"right"}))]}(e,t,n,r,a)),function(y,b,w,k,M){var A=G0(y),O=A.chartWidth,N=A.chartHeight;return[ri(xt(xt({backgroundColor:M,groupIds:[k]},Dn),{},{type:"line",x:b,y:w,startArrowhead:null,endArrowhead:null,width:O,points:[[0,0],[O,0]]})),ri(xt(xt({backgroundColor:M,groupIds:[k]},Dn),{},{type:"line",x:b,y:w,startArrowhead:null,endArrowhead:null,height:N,points:[[0,0],[0,-N]]})),ri(xt(xt({backgroundColor:M,groupIds:[k]},Dn),{},{type:"line",x:b,y:w-Mo-Ln,startArrowhead:null,endArrowhead:null,strokeStyle:"dotted",width:O,opacity:50,points:[[0,0],[O,0]]}))]}(e,t,n,r,a))},zb=function(e,t,n,r){return e==="line"?function(a,s,c){for(var p=Math.max.apply(Math,a.values),f=wo(),g=vs[Math.floor(Math.random()*vs.length)],u=0,y=[],b=0,w=a.values;b0&&a[a.length-1])||u[0]!==6&&u[0]!==2)){c=0;continue}if(u[0]===3&&(!a||u[1]>a[0]&&u[1]0&&a[a.length-1])||u[0]!==6&&u[0]!==2)){c=0;continue}if(u[0]===3&&(!a||u[1]>a[0]&&u[1]0&&a[a.length-1])||u[0]!==6&&u[0]!==2)){c=0;continue}if(u[0]===3&&(!a||u[1]>a[0]&&u[1]0&&a[a.length-1])||u[0]!==6&&u[0]!==2)){c=0;continue}if(u[0]===3&&(!a||u[1]>a[0]&&u[1]0&&a[a.length-1])||u[0]!==6&&u[0]!==2)){c=0;continue}if(u[0]===3&&(!a||u[1]>a[0]&&u[1]=2&&!function(r){if(r.length>=2)for(var a=function(f){if(r.reduce(function(g,u){return g&&pa(u,f)},!0))return{value:!0}},s=0,c=r[0].groupIds;s0},PanelComponent:function(e){var t=e.elements,n=e.appState,r=e.updateData;return m().createElement(Ke,{type:"button",hidden:ni(n).length===0,icon:m().createElement(Gw,{theme:n.theme}),onClick:function(){return r(null)},title:"".concat(L("labels.ungroup")," \u2014 ").concat(ie("CtrlOrCmd+Shift+G")),"aria-label":L("labels.ungroup"),visible:Wt(He(t),n)})}}),_b=(E(2789),function(e){var t=e.children,n=e.color,r=e.border,a=e.onClick;return m().createElement("div",{className:"Avatar",style:{background:n,border:"1px solid ".concat(r)},onClick:a},t)});function fm(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),n.push.apply(n,r)}return n}function Qu(e){for(var t=1;t1},pi=function(e,t,n){var r=function(s,c){var p=e4(s),f=ym(s);return p.flatMap(function(g){var u=t4(g,f,c);return g.map(function(y){return ht(y,{x:y.x+u.x,y:y.y+u.y})})})}(et(He(e),t),n),a=li(r);return e.map(function(s){return a[s.id]||s})},wm=(me({name:"alignTop",perform:function(e,t){return{appState:t,elements:pi(e,t,{position:"start",axis:"y"}),commitToHistory:!0}},keyTest:function(e){return e[Ue]&&e.shiftKey&&e.key===ra},PanelComponent:function(e){var t=e.elements,n=e.appState,r=e.updateData;return m().createElement(Ke,{hidden:!di(t,n),type:"button",icon:m().createElement(Aw,{theme:n.theme}),onClick:function(){return r(null)},title:"".concat(L("labels.alignTop")," \u2014 ").concat(ie("CtrlOrCmd+Shift+Up")),"aria-label":L("labels.alignTop"),visible:Wt(He(t),n)})}}),me({name:"alignBottom",perform:function(e,t){return{appState:t,elements:pi(e,t,{position:"end",axis:"y"}),commitToHistory:!0}},keyTest:function(e){return e[Ue]&&e.shiftKey&&e.key===na},PanelComponent:function(e){var t=e.elements,n=e.appState,r=e.updateData;return m().createElement(Ke,{hidden:!di(t,n),type:"button",icon:m().createElement(Lw,{theme:n.theme}),onClick:function(){return r(null)},title:"".concat(L("labels.alignBottom")," \u2014 ").concat(ie("CtrlOrCmd+Shift+Down")),"aria-label":L("labels.alignBottom"),visible:Wt(He(t),n)})}}),me({name:"alignLeft",perform:function(e,t){return{appState:t,elements:pi(e,t,{position:"start",axis:"x"}),commitToHistory:!0}},keyTest:function(e){return e[Ue]&&e.shiftKey&&e.key===ho},PanelComponent:function(e){var t=e.elements,n=e.appState,r=e.updateData;return m().createElement(Ke,{hidden:!di(t,n),type:"button",icon:m().createElement(Dw,{theme:n.theme}),onClick:function(){return r(null)},title:"".concat(L("labels.alignLeft")," \u2014 ").concat(ie("CtrlOrCmd+Shift+Left")),"aria-label":L("labels.alignLeft"),visible:Wt(He(t),n)})}}),me({name:"alignRight",perform:function(e,t){return{appState:t,elements:pi(e,t,{position:"end",axis:"x"}),commitToHistory:!0}},keyTest:function(e){return e[Ue]&&e.shiftKey&&e.key===mo},PanelComponent:function(e){var t=e.elements,n=e.appState,r=e.updateData;return m().createElement(Ke,{hidden:!di(t,n),type:"button",icon:m().createElement(zw,{theme:n.theme}),onClick:function(){return r(null)},title:"".concat(L("labels.alignRight")," \u2014 ").concat(ie("CtrlOrCmd+Shift+Right")),"aria-label":L("labels.alignRight"),visible:Wt(He(t),n)})}}),me({name:"alignVerticallyCentered",perform:function(e,t){return{appState:t,elements:pi(e,t,{position:"center",axis:"y"}),commitToHistory:!0}},PanelComponent:function(e){var t=e.elements,n=e.appState,r=e.updateData;return m().createElement(Ke,{hidden:!di(t,n),type:"button",icon:m().createElement(Rw,{theme:n.theme}),onClick:function(){return r(null)},title:L("labels.centerVertically"),"aria-label":L("labels.centerVertically"),visible:Wt(He(t),n)})}}),me({name:"alignHorizontallyCentered",perform:function(e,t){return{appState:t,elements:pi(e,t,{position:"center",axis:"x"}),commitToHistory:!0}},PanelComponent:function(e){var t=e.elements,n=e.appState,r=e.updateData;return m().createElement(Ke,{hidden:!di(t,n),type:"button",icon:m().createElement(Fw,{theme:n.theme}),onClick:function(){return r(null)},title:L("labels.centerHorizontally"),"aria-label":L("labels.centerHorizontally"),visible:Wt(He(t),n)})}}),function(e,t){for(var n=0,r=t.length,a=e.length;n1},Em=function(e,t,n){var r=function(s,c){for(var p=c.axis==="x"?["minX","midX","maxX","width"]:["minY","midY","maxY","height"],f=p[0],g=p[1],u=p[2],y=p[3],b=bm(s),w=n4(s).map(function(Y){return[Y,bm(Y)]}).sort(function(Y,J){return Y[1][g]-J[1][g]}),k=0,M=0,A=w;M1)return e;var a=r4(r,t,n),s=li(a);return e.map(function(c){return s[c.id]||c})},r4=function(e,t,n){for(var r=0;r0&&a[a.length-1])||u[0]!==6&&u[0]!==2)){c=0;continue}if(u[0]===3&&(!a||u[1]>a[0]&&u[1]0&&a[a.length-1])||u[0]!==6&&u[0]!==2)){c=0;continue}if(u[0]===3&&(!a||u[1]>a[0]&&u[1]-1;a--){var s=t.elements[a],c=r.elements[a];if(!s||!c||s.id!==c.id||s.versionNonce!==c.versionNonce)return!0}for(n in t.appState){var p,f;if(!(n==="editingLinearElement"&&((p=t.appState[n])===null||p===void 0?void 0:p.elementId)===((f=r.appState[n])===null||f===void 0?void 0:f.elementId))&&n!=="selectedElementIds"&&t.appState[n]!==r.appState[n])return!0}return!1},e.prototype.pushEntry=function(t,n){var r=this.generateEntry(t,n),a=this.hydrateHistoryEntry(r);if(a){if(!this.shouldCreateEntry(a))return;this.stateHistory.push(r),this.lastEntry=a,this.clearRedoStack()}},e.prototype.clearRedoStack=function(){this.redoStack.splice(0,this.redoStack.length)},e.prototype.redoOnce=function(){if(this.redoStack.length===0)return null;var t=this.redoStack.pop();return t!==void 0?(this.stateHistory.push(t),this.hydrateHistoryEntry(t)):null},e.prototype.undoOnce=function(){if(this.stateHistory.length===1)return null;var t=this.stateHistory.pop(),n=this.stateHistory[this.stateHistory.length-1];return t!==void 0?(this.redoStack.push(t),this.hydrateHistoryEntry(n)):null},e.prototype.setCurrentState=function(t,n){this.lastEntry=this.hydrateHistoryEntry(this.generateEntry(t,n))},e.prototype.resumeRecording=function(){this.recording=!0},e.prototype.record=function(t,n){this.recording&&(this.pushEntry(t,n),this.recording=!1)},e}();var Km=[{icon:m().createElement("svg",{viewBox:"0 0 320 512",className:""},m().createElement("path",{d:"M302.189 329.126H196.105l55.831 135.993c3.889 9.428-.555 19.999-9.444 23.999l-49.165 21.427c-9.165 4-19.443-.571-23.332-9.714l-53.053-129.136-86.664 89.138C18.729 472.71 0 463.554 0 447.977V18.299C0 1.899 19.921-6.096 30.277 5.443l284.412 292.542c11.472 11.179 3.007 31.141-12.5 31.141z"})),value:"selection",key:[g2,qc]},{icon:m().createElement("svg",{viewBox:"0 0 448 512"},m().createElement("path",{d:"M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48z"})),value:"rectangle",key:h2},{icon:m().createElement("svg",{viewBox:"0 0 223.646 223.646"},m().createElement("path",{d:"M111.823 0L16.622 111.823 111.823 223.646 207.025 111.823z"})),value:"diamond",key:Ff},{icon:m().createElement("svg",{viewBox:"0 0 512 512"},m().createElement("path",{d:"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8z"})),value:"ellipse",key:c2},{icon:m().createElement("svg",{viewBox:"0 0 448 512",className:"rtl-mirror"},m().createElement("path",{d:"M313.941 216H12c-6.627 0-12 5.373-12 12v56c0 6.627 5.373 12 12 12h301.941v46.059c0 21.382 25.851 32.09 40.971 16.971l86.059-86.059c9.373-9.373 9.373-24.569 0-33.941l-86.059-86.059c-15.119-15.119-40.971-4.411-40.971 16.971V216z"})),value:"arrow",key:Rf},{icon:m().createElement("svg",{viewBox:"0 0 6 6"},m().createElement("line",{x1:"0",y1:"3",x2:"6",y2:"3",stroke:"currentColor",strokeLinecap:"round"})),value:"line",key:[p2,u2]},{icon:m().createElement("svg",{viewBox:"0 0 512 512"},m().createElement("path",{fill:"currentColor",d:"M290.74 93.24l128.02 128.02-277.99 277.99-114.14 12.6C11.35 513.54-1.56 500.62.14 485.34l12.7-114.22 277.9-277.88zm207.2-19.06l-60.11-60.11c-18.75-18.75-49.16-18.75-67.91 0l-56.55 56.55 128.02 128.02 56.55-56.55c18.75-18.76 18.75-49.16 0-67.91z"})),value:"freedraw",key:v2},{icon:m().createElement("svg",{viewBox:"0 0 448 512"},m().createElement("path",{d:"M432 416h-23.41L277.88 53.69A32 32 0 0 0 247.58 32h-47.16a32 32 0 0 0-30.3 21.69L39.41 416H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16h-19.58l23.3-64h152.56l23.3 64H304a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zM176.85 272L224 142.51 271.15 272z"})),value:"text",key:m2}],d4=(E(1292),{cut:[ie("CtrlOrCmd+X")],copy:[ie("CtrlOrCmd+C")],paste:[ie("CtrlOrCmd+V")],copyStyles:[ie("CtrlOrCmd+Alt+C")],pasteStyles:[ie("CtrlOrCmd+Alt+V")],selectAll:[ie("CtrlOrCmd+A")],deleteSelectedElements:[ie("Del")],duplicateSelection:[ie("CtrlOrCmd+D"),ie("Alt+".concat(L("helpDialog.drag")))],sendBackward:[ie("CtrlOrCmd+[")],bringForward:[ie("CtrlOrCmd+]")],sendToBack:[ie(Jn?"CtrlOrCmd+Alt+[":"CtrlOrCmd+Shift+[")],bringToFront:[ie(Jn?"CtrlOrCmd+Alt+]":"CtrlOrCmd+Shift+]")],copyAsPng:[ie("Shift+Alt+C")],copyAsSvg:[],group:[ie("CtrlOrCmd+G")],ungroup:[ie("CtrlOrCmd+Shift+G")],gridMode:[ie("CtrlOrCmd+'")],zenMode:[ie("Alt+Z")],stats:[ie("Alt+/")],addToLibrary:[],flipHorizontal:[ie("Shift+H")],flipVertical:[ie("Shift+V")],viewMode:[ie("Alt+R")]}),p4=function(e){var t=e.options,n=e.onCloseRequest,r=e.top,a=e.left,s=e.actionManager,c=e.appState;return m().createElement(zu,{onCloseRequest:n,top:r,left:a,fitInViewport:!0},m().createElement("ul",{className:"context-menu",onContextMenu:function(p){return p.preventDefault()}},t.map(function(p,f){var g;if(p==="separator")return m().createElement("hr",{key:f,className:"context-menu-option-separator"});var u,y=p.name,b=p.contextItemLabel?L(p.contextItemLabel):"";return m().createElement("li",{key:f,"data-testid":y,onClick:n},m().createElement("button",{className:ot("context-menu-option",{dangerous:y==="deleteSelectedElements",checkmark:(g=p.checked)===null||g===void 0?void 0:g.call(p,c)}),onClick:function(){return s.executeAction(p)}},m().createElement("div",{className:"context-menu-option__label"},b),m().createElement("kbd",{className:"context-menu-option__shortcut"},y&&(u=d4[y])&&u.length>0?u[0]:"")))})))},Ms=new WeakMap;let Os=function(e){var t,n,r=Array.of();e.options.forEach(function(a){a&&r.push(a)}),r.length&&(0,fo.render)(m().createElement(p4,{top:e.top,left:e.left,options:r,onCloseRequest:function(){return a=e.container,void((s=Ms.get(a))&&((0,fo.unmountComponentAtNode)(s),s.remove(),Ms.delete(a)));var a,s},actionManager:e.actionManager,appState:e.appState}),(t=e.container,(n=Ms.get(t))||(n=document.createElement("div"),t.querySelector(".excalidraw-contextMenuContainer").appendChild(n),Ms.set(t,n),n)))};E(4623);function Ym(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),n.push.apply(n,r)}return n}function f4(e){for(var t=1;t1&&m().createElement("fieldset",null,m().createElement("legend",null,L("labels.align")),m().createElement("div",{className:"buttonList"},f?m().createElement(m().Fragment,null,r("alignRight"),r("alignHorizontallyCentered"),r("alignLeft")):m().createElement(m().Fragment,null,r("alignLeft"),r("alignHorizontallyCentered"),r("alignRight")),s.length>2&&r("distributeHorizontally"),m().createElement("div",{className:"iconRow"},r("alignTop"),r("alignVerticallyCentered"),r("alignBottom"),s.length>2&&r("distributeVertically")))),!p&&!c&&s.length>0&&m().createElement("fieldset",null,m().createElement("legend",null,L("labels.actions")),m().createElement("div",{className:"buttonList"},r("duplicateSelection"),r("deleteSelectedElements"),r("group"),r("ungroup"))))},h4=m().createElement("svg",{viewBox:"0 0 512 512"},m().createElement("path",{d:"M296 32h192c13.255 0 24 10.745 24 24v160c0 13.255-10.745 24-24 24H296c-13.255 0-24-10.745-24-24V56c0-13.255 10.745-24 24-24zm-80 0H24C10.745 32 0 42.745 0 56v160c0 13.255 10.745 24 24 24h192c13.255 0 24-10.745 24-24V56c0-13.255-10.745-24-24-24zM0 296v160c0 13.255 10.745 24 24 24h192c13.255 0 24-10.745 24-24V296c0-13.255-10.745-24-24-24H24c-13.255 0-24 10.745-24 24zm296 184h192c13.255 0 24-10.745 24-24V296c0-13.255-10.745-24-24-24H296c-13.255 0-24 10.745-24 24v160c0 13.255 10.745 24 24 24z"})),Jm=function(e){var t=e.canvas,n=e.elementType,r=e.setAppState,a=e.isLibraryOpen;return m().createElement(m().Fragment,null,Km.map(function(s,c){var p=s.value,f=s.icon,g=s.key,u=L("toolBar.".concat(p)),y=typeof g=="string"?g:g[0],b="".concat(aa(y)," ").concat(L("helpDialog.or")," ").concat(c+1);return m().createElement(Ke,{className:"Shape",key:p,type:"radio",icon:f,checked:n===p,name:"editor-current-shape",title:"".concat(aa(u)," \u2014 ").concat(b),keyBindingLabel:"".concat(c+1),"aria-label":aa(u),"aria-keyshortcuts":b,"data-testid":p,onChange:function(){r({elementType:p,multiElement:null,selectedElementIds:{}}),Pr(t,p),r({})}})}),m().createElement(Ke,{className:"Shape ToolIcon_type_button__library",type:"button",icon:h4,name:"editor-library",keyBindingLabel:"9","aria-keyshortcuts":"9",title:"".concat(aa(L("toolBar.library"))," \u2014 9"),"aria-label":aa(L("toolBar.library")),onClick:function(){r({isLibraryOpen:!a})}}))},m4=function(e){var t=e.renderAction,n=e.zoom;return m().createElement(Un,{gap:1},m().createElement(_n,{gap:1,align:"center"},t("zoomIn"),t("zoomOut"),t("resetZoom"),m().createElement("div",{style:{marginInlineStart:4}},(100*n.value).toFixed(0),"%")))},qm=function(e){e.appState,e.setAppState;var t=e.actionManager,n=e.showThemeBtn;return m().createElement("div",{style:{display:"flex"}},t.renderAction("changeViewBackgroundColor"),n&&m().createElement(m().Fragment,null,t.renderAction("toggleTheme")))};E(778);let Qm=function(e){var t=e.isCollaborating,n=e.collaboratorCount,r=e.onClick;return m().createElement(m().Fragment,null,m().createElement(Ke,{className:ot("CollabButton",{"is-collaborating":t}),onClick:r,icon:Hw,type:"button",title:L("labels.liveCollaboration"),"aria-label":L("labels.liveCollaboration"),showAriaLabel:Cn()},n>0&&m().createElement("div",{className:"CollabButton-collaborators"},n)))};E(196),E(1106);function _m(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),n.push.apply(n,r)}return n}function g4(e){for(var t=1;t0&&e.autofocus!==!1&&(p[1]||p[0]).focus();var f=function(g){if(g.key===Zl){var u=s(n),y=document.activeElement,b=u.findIndex(function(w){return w===y});b===0&&g.shiftKey?(u[u.length-1].focus(),g.preventDefault()):b!==u.length-1||g.shiftKey||(u[0].focus(),g.preventDefault())}};return n.addEventListener("keydown",f),function(){return n.removeEventListener("keydown",f)}}},[n,e.autofocus]);var s=function(p){var f=p.querySelectorAll("button, a, input, select, textarea, div[tabindex]");return f?Array.from(f):[]},c=function(){a.focus(),e.onCloseRequest()};return m().createElement(v4,{className:ot("Dialog",e.className),labelledBy:"dialog-title",maxWidth:e.small?550:800,onCloseRequest:c,theme:e.theme},m().createElement($n,{ref:r},m().createElement("h2",{id:"dialog-title",className:"Dialog__title"},m().createElement("span",{className:"Dialog__titleContent"},e.title),m().createElement("button",{className:"Modal__close",onClick:c,"aria-label":L("buttons.close")},Cn()?Vw:Iu)),m().createElement("div",{className:"Dialog__content"},e.children)))},w4=function(e){var t=e.message,n=e.onClose,r=(0,V.useState)(!!t),a=r[0],s=r[1],c=g1(),p=m().useCallback(function(){s(!1),n&&n(),c==null||c.focus()},[n,c]);return m().createElement(m().Fragment,null,a&&m().createElement(Ts,{small:!0,onCloseRequest:p,title:L("errorDialog.title")},m().createElement("div",{style:{whiteSpace:"pre-wrap"}},t)))},$m=(E(2205),[1,2,3]),b4=$m.includes(devicePixelRatio)?devicePixelRatio:1,x4="filter"in document.createElement("canvas").getContext("2d"),E4=function(){return m().createElement("div",null,m().createElement("h3",null,L("canvasError.cannotShowPreview")),m().createElement("p",null,m().createElement("span",null,L("canvasError.canvasTooBig"))),m().createElement("em",null,"(",L("canvasError.canvasTooBigTip"),")"))},td=function(e,t){(0,fo.unmountComponentAtNode)(t),t.innerHTML="",e instanceof HTMLCanvasElement?t.appendChild(e):(0,fo.render)(m().createElement(E4,null),t)},k4=function(e){var t=e.elements,n=e.appState,r=e.exportPadding,a=r===void 0?10:r,s=e.actionManager,c=e.onExportToPng,p=e.onExportToSvg,f=e.onExportToClipboard,g=e.onExportToBackend,u=Wt(t,n),y=(0,V.useState)(b4),b=y[0],w=y[1],k=(0,V.useState)(u),M=k[0],A=k[1],O=(0,V.useRef)(null),N=n.exportBackground,U=n.viewBackgroundColor,W=n.shouldAddWatermark,K=M?et(t,n):t;return(0,V.useEffect)(function(){A(u)},[u]),(0,V.useEffect)(function(){var B=O.current;if(B)try{var Y=Wu(K,n,{exportBackground:N,viewBackgroundColor:U,exportPadding:a,scale:b,shouldAddWatermark:W});em(Y).then(function(){td(Y,B)}).catch(function(J){console.error(J),td(new Xu,B)})}catch(J){console.error(J),td(new Xu,B)}},[n,K,N,a,U,b,W]),m().createElement("div",{className:"ExportDialog"},m().createElement("div",{className:"ExportDialog__preview",ref:O}),x4&&s.renderAction("exportWithDarkMode"),m().createElement(Un,{gap:2,align:"center"},m().createElement("div",{className:"ExportDialog__actions"},m().createElement(_n,{gap:2},m().createElement(Ke,{type:"button",label:"PNG",title:L("buttons.exportToPng"),"aria-label":L("buttons.exportToPng"),onClick:function(){return c(K,b)}}),m().createElement(Ke,{type:"button",label:"SVG",title:L("buttons.exportToSvg"),"aria-label":L("buttons.exportToSvg"),onClick:function(){return p(K,b)}}),ws&&m().createElement(Ke,{type:"button",icon:yw,title:L("buttons.copyPngToClipboard"),"aria-label":L("buttons.copyPngToClipboard"),onClick:function(){return f(K,b)}}),g&&m().createElement(Ke,{type:"button",icon:mw,title:L("buttons.getShareableLink"),"aria-label":L("buttons.getShareableLink"),onClick:function(){return g(K)}})),m().createElement("div",{className:"ExportDialog__name"},s.renderAction("changeProjectName")),m().createElement(_n,{gap:2},$m.map(function(B){var Y=function(oe,Ae,Ie,de){var le=Gu(oe,Ie),Se=Uu(le,Ae,Ie).map(function($){return Math.trunc($*de)});return[Se[2],Se[3]]}(K,a,W,B),J=Y[0],_=Y[1],te="".concat(L("buttons.scale")," ").concat(B,"x (").concat(J,"x").concat(_,")");return m().createElement(Ke,{key:B,size:"s",type:"radio",icon:"".concat(B,"x"),name:"export-canvas-scale",title:te,"aria-label":te,id:"export-canvas-scale",checked:B===b,onChange:function(){return w(B)}})}))),s.renderAction("changeExportBackground"),u&&m().createElement("div",null,m().createElement("label",null,m().createElement("input",{type:"checkbox",checked:M,onChange:function(B){return A(B.currentTarget.checked)}})," ",L("labels.onlySelected"))),s.renderAction("changeExportEmbedScene"),s.renderAction("changeShouldAddWatermark")))},S4=function(e){var t=e.elements,n=e.appState,r=e.exportPadding,a=r===void 0?10:r,s=e.actionManager,c=e.onExportToPng,p=e.onExportToSvg,f=e.onExportToClipboard,g=e.onExportToBackend,u=(0,V.useState)(!1),y=u[0],b=u[1],w=m().useCallback(function(){b(!1)},[]);return m().createElement(m().Fragment,null,m().createElement(Ke,{onClick:function(){b(!0)},"data-testid":"export-button",icon:p0,type:"button","aria-label":L("buttons.export"),showAriaLabel:Cn(),title:L("buttons.export")}),y&&m().createElement(Ts,{onCloseRequest:w,title:L("buttons.export")},m().createElement(k4,{elements:t,appState:n,exportPadding:a,actionManager:s,onExportToPng:c,onExportToSvg:p,onExportToClipboard:f,onExportToBackend:g,onCloseRequest:w})))},e1=(E(1310),function(e){var t=e.children,n=e.side,r=e.className;return m().createElement("div",{className:ot("FixedSideContainer","FixedSideContainer_side_".concat(n),r)},t)}),t1=(E(7096),function(e){var t=function(n){var r=n.appState,a=n.elements,s=r.elementType,c=r.isResizing,p=r.isRotating,f=r.lastPointerDownWith,g=r.multiElement!==null;if(s==="arrow"||s==="line")return L(g?"hints.linearElementMulti":"hints.linearElement");if(s==="freedraw")return L("hints.freeDraw");if(s==="text")return L("hints.text");var u=et(a,r);if(c&&f==="mouse"&&u.length===1){var y=u[0];return Et(y)&&y.points.length===2?L("hints.lockAngle"):L("hints.resize")}return p&&f==="mouse"?L("hints.rotate"):u.length===1&&Et(u[0])?r.editingLinearElement?r.editingLinearElement.activePointIndex?L("hints.lineEditor_pointSelected"):L("hints.lineEditor_nothingSelected"):L("hints.lineEditor_info"):null}({appState:e.appState,elements:e.elements});return t?(t=ie(t),m().createElement("div",{className:"HintViewer"},m().createElement("span",null,t))):null}),C4=(E(3336),E(694),m().createElement("svg",{viewBox:"0 0 1792 1792"},m().createElement("path",{fill:"currentColor",d:"M1600 736v192q0 40-28 68t-68 28h-416v416q0 40-28 68t-68 28h-192q-40 0-68-28t-28-68v-416h-416q-40 0-68-28t-28-68v-192q0-40 28-68t68-28h416v-416q0-40 28-68t68-28h192q40 0 68 28t28 68v416h416q40 0 68 28t28 68z"}))),P4=function(e){var t=e.elements,n=e.pendingElements,r=e.onRemoveFromLibrary,a=e.onClick,s=(0,V.useRef)(null);(0,V.useEffect)(function(){var y=t||n;if(y){for(var b=gs(y,{exportBackground:!1,viewBackgroundColor:qe.ix,shouldAddWatermark:!1}),w=0,k=s.current.children;w0&&m().createElement("fieldset",null,m().createElement("legend",null,L("labels.collaborators")),m().createElement(o1,{mobile:!0},Array.from(t.collaborators).filter(function(k){k[0];var M=k[1];return Object.keys(M).length!==0}).map(function(k){var M=k[0];return k[1],m().createElement(m().Fragment,{key:M},a.renderAction("goToCollaborator",M))})))))):t.openMenu==="shape"&&!b&&Su(t,n)?m().createElement(zr,{className:"App-mobile-menu",heading:"selectedShapeActions"},m().createElement(Xm,{appState:t,elements:n,renderAction:a.renderAction,elementType:t.elementType})):null,m().createElement("footer",{className:"App-toolbar"},b?m().createElement("div",{className:"App-toolbar-content"},a.renderAction("toggleCanvasMenu")):m().createElement("div",{className:"App-toolbar-content"},a.renderAction("toggleCanvasMenu"),a.renderAction("toggleEditMenu"),a.renderAction("undo"),a.renderAction("redo"),a.renderAction(t.multiElement?"finalize":"duplicateSelection"),a.renderAction("deleteSelectedElements")),t.scrolledOutside&&!t.openMenu&&m().createElement("button",{className:"scroll-back-to-content",onClick:function(){c(function(k){for(var M=1;M0&&a[a.length-1])||u[0]!==6&&u[0]!==2)){c=0;continue}if(u[0]===3&&(!a||u[1]>a[0]&&u[1]0?1:0),k=b?4:6,M=Math.max(1,Math.ceil(w/k)),A=[],O=!1,N=f||window.location.origin+window.location.pathname;A.push(m().createElement("div",{className:"layer-ui__library-header",key:"library-header"},m().createElement(Ke,{key:"import",type:"button",title:L("buttons.load"),"aria-label":L("buttons.load"),icon:d0,onClick:function(){Ub(u).then(function(){c({isLibraryOpen:!1}),c({isLibraryOpen:!0})}).catch($c).catch(function(J){c({errorMessage:J.message})})}}),!!t.length&&m().createElement(m().Fragment,null,m().createElement(Ke,{key:"export",type:"button",title:L("buttons.export"),"aria-label":L("buttons.export"),icon:p0,onClick:function(){Gb(u).catch($c).catch(function(J){c({errorMessage:J.message})})}}),m().createElement(Ke,{key:"reset",type:"button",title:L("buttons.resetLibrary"),"aria-label":L("buttons.resetLibrary"),icon:Tu,onClick:function(){window.confirm(L("alerts.resetLibrary"))&&(u.resetLibrary(),p([]),g())}})),m().createElement("a",{href:"https://libraries.excalidraw.com?target=".concat(window.name||"_blank","&referrer=").concat(N,"&useHash=true&token=").concat(y),target:"_excalidraw_libraries"},L("labels.libraries"))));for(var U=0;U0&&!O&&W+B>=t.length;O=O||Y,K.push(m().createElement(Un,{key:B},m().createElement(P4,{elements:t[W+B],pendingElements:Y?s:void 0,onRemoveFromLibrary:n.bind(null,W+B),onClick:Y?r.bind(null,s):a.bind(null,t[W+B])})))}A.push(m().createElement(_n,{align:"center",gap:1,key:U},K))}return m().createElement(Un,{align:"start",gap:1,className:"layer-ui__library-items"},A)},N4=function(e){var t=e.onClickOutside,n=e.onInsertShape,r=e.pendingElements,a=e.onAddToLibrary,s=e.setAppState,c=e.libraryReturnUrl,p=e.focusContainer,f=e.library,g=e.id,u=(0,V.useRef)(null);(function(W,K){(0,V.useEffect)(function(){var B=function(Y){W.current&&(Y.target instanceof Element&&(W.current.contains(Y.target)||!document.body.contains(Y.target))||K(Y))};return document.addEventListener("pointerdown",B,!1),function(){document.removeEventListener("pointerdown",B)}},[W,K])})(u,function(W){W.target.closest(".ToolIcon_type_button__library")||t(W)});var y=(0,V.useState)([]),b=y[0],w=y[1],k=(0,V.useState)("preloading"),M=k[0],A=k[1],O=(0,V.useRef)(null);(0,V.useEffect)(function(){return Promise.race([new Promise(function(W){O.current=setTimeout(function(){W("loading")},100)}),f.loadLibrary().then(function(W){w(W),A("ready")})]).then(function(W){W==="loading"&&A("loading")}),function(){clearTimeout(O.current)}},[f]);var N=(0,V.useCallback)(function(){var W=(0,Q.Z)(function(K){var B,Y;return rd(this,function(J){switch(J.label){case 0:return[4,f.loadLibrary()];case 1:return B=J.sent(),Y=B.filter(function(_,te){return te!==K}),f.saveLibrary(Y).catch(function(_){w(B),s({errorMessage:L("alerts.errorRemovingFromLibrary")})}),w(Y),[2]}})});return function(K){return W.apply(this,arguments)}}(),[f,s]),U=(0,V.useCallback)(function(){var W=(0,Q.Z)(function(K){var B,Y;return rd(this,function(J){switch(J.label){case 0:return[4,f.loadLibrary()];case 1:return B=J.sent(),Y=s1(s1([],B),[K]),a(),f.saveLibrary(Y).catch(function(_){w(B),s({errorMessage:L("alerts.errorAddingToLibrary")})}),w(Y),[2]}})});return function(K){return W.apply(this,arguments)}}(),[a,f,s]);return M==="preloading"?null:m().createElement($n,{padding:1,ref:u,className:"layer-ui__library"},M==="loading"?m().createElement("div",{className:"layer-ui__library-message"},L("labels.libraryLoadingMessage")):m().createElement(z4,{libraryItems:b,onRemoveFromLibrary:N,onAddToLibrary:U,onInsertShape:n,pendingElements:r,setAppState:s,setLibraryItems:w,libraryReturnUrl:c,focusContainer:p,library:f,id:g}))},j4=function(e){var t,n=e.actionManager,r=e.appState,a=e.setAppState,s=e.canvas,c=e.elements,p=e.onCollabButtonClick,f=e.onLockToggle,g=e.onInsertElements,u=e.zenModeEnabled,y=e.showExitZenModeBtn,b=e.showThemeBtn,w=e.toggleZenMode,k=e.isCollaborating,M=e.onExportToBackend,A=e.renderTopRightUI,O=e.renderCustomFooter,N=e.viewModeEnabled,U=e.libraryReturnUrl,W=e.UIOptions,K=e.focusContainer,B=e.library,Y=e.id,J=Cn(),_=function(){if(!W.canvasActions.export)return null;var de=function(le){return function(){var Se=(0,Q.Z)(function($,ke){return rd(this,function(Ze){switch(Ze.label){case 0:return[4,Ju(le,$,r,{exportBackground:r.exportBackground,name:r.name,viewBackgroundColor:r.viewBackgroundColor,scale:ke,shouldAddWatermark:r.shouldAddWatermark}).catch($c).catch(function(ue){console.error(ue),a({errorMessage:ue.message})})];case 1:return Ze.sent(),[2]}})});return function($,ke){return Se.apply(this,arguments)}}()};return m().createElement(S4,{elements:c,appState:r,actionManager:n,onExportToPng:de("png"),onExportToSvg:de("svg"),onExportToClipboard:de("clipboard"),onExportToBackend:M?function(le){M&&M(le,r,s)}:void 0})},te=(0,V.useCallback)(function(de){a({isLibraryOpen:!1})},[a]),oe=(0,V.useCallback)(function(){a({selectedElementIds:{},selectedGroupIds:{}})},[a]),Ae=r.isLibraryOpen?m().createElement(N4,{pendingElements:et(c,r),onClickOutside:te,onInsertShape:g,onAddToLibrary:oe,setAppState:a,libraryReturnUrl:U,focusContainer:K,library:B,id:Y}):null,Ie=m().createElement(m().Fragment,null,r.isLoading&&m().createElement(q,null),r.errorMessage&&m().createElement(w4,{message:r.errorMessage,onClose:function(){return a({errorMessage:null})}}),r.showHelpDialog&&m().createElement(D4,{onClose:function(){a({showHelpDialog:!1})}}),r.pasteDialog.shown&&m().createElement(O4,{setAppState:a,appState:r,onInsertChart:g,onClose:function(){return a({pasteDialog:{shown:!1,data:null}})}}));return J?m().createElement(m().Fragment,null,Ie,m().createElement(M4,{appState:r,elements:c,actionManager:n,libraryMenu:Ae,exportButton:_(),setAppState:a,onCollabButtonClick:p,onLockToggle:f,canvas:s,isCollaborating:k,renderCustomFooter:O,viewModeEnabled:N,showThemeBtn:b})):m().createElement("div",{className:ot("layer-ui__wrapper",{"disable-pointerEvents":r.draggingElement||r.resizingElement||r.editingElement&&!Ht(r.editingElement)})},Ie,(t=Su(r,c),m().createElement(e1,{side:"top"},m().createElement("div",{className:"App-menu App-menu_top"},m().createElement(Un,{gap:4,className:ot({"disable-pointerEvents":u})},N?m().createElement(zr,{heading:"canvasActions",className:ot("zen-mode-transition",{"transition-left":u})},m().createElement($n,{padding:2,style:{zIndex:1}},m().createElement(Un,{gap:4},m().createElement(_n,{gap:1,justifyContent:"space-between"},n.renderAction("saveScene"),n.renderAction("saveAsScene"),_())))):m().createElement(zr,{heading:"canvasActions",className:ot("zen-mode-transition",{"transition-left":u})},m().createElement($n,{padding:2,style:{zIndex:1}},m().createElement(Un,{gap:4},m().createElement(_n,{gap:1,justifyContent:"space-between"},n.renderAction("loadScene"),n.renderAction("saveScene"),n.renderAction("saveAsScene"),_(),n.renderAction("clearCanvas"),p&&m().createElement(Qm,{isCollaborating:k,collaboratorCount:r.collaborators.size,onClick:p})),m().createElement(qm,{actionManager:n,appState:r,setAppState:a,showThemeBtn:b})))),t&&m().createElement(zr,{heading:"selectedShapeActions",className:ot("zen-mode-transition",{"transition-left":u})},m().createElement($n,{className:j.$C.SHAPE_ACTIONS_MENU,padding:2,style:{maxHeight:"".concat(r.height-200,"px")}},m().createElement(Xm,{appState:r,elements:c,renderAction:n.renderAction,elementType:r.elementType})))),!N&&m().createElement(zr,{heading:"shapes"},function(de){return m().createElement(Un,{gap:4,align:"start"},m().createElement(_n,{gap:1},m().createElement($n,{padding:1,className:ot({"zen-mode":u})},m().createElement(t1,{appState:r,elements:c}),de,m().createElement(_n,{gap:1},m().createElement(Jm,{canvas:s,elementType:r.elementType,setAppState:a,isLibraryOpen:r.isLibraryOpen}))),m().createElement(r1,{zenModeEnabled:u,checked:r.elementLocked,onChange:f,title:L("toolBar.lock")})),Ae)}),m().createElement("div",{className:ot("layer-ui__wrapper__top-right zen-mode-transition",{"transition-right":u})},m().createElement(o1,null,r.collaborators.size>0&&Array.from(r.collaborators).filter(function(de){de[0];var le=de[1];return Object.keys(le).length!==0}).map(function(de){var le=de[0],Se=de[1];return m().createElement(j0,{label:Se.username||"Unknown user",key:le},n.renderAction("goToCollaborator",le))})),A==null?void 0:A(J,r))))),m().createElement("footer",{role:"contentinfo",className:"layer-ui__wrapper__footer App-menu App-menu_bottom"},m().createElement("div",{className:ot("layer-ui__wrapper__footer-left zen-mode-transition",{"layer-ui__wrapper__footer-left--transition-left":u})},m().createElement(Un,{gap:2},m().createElement(zr,{heading:"canvasActions"},m().createElement($n,{padding:1},m().createElement(m4,{renderAction:n.renderAction,zoom:r.zoom}))))),m().createElement("div",{className:ot("layer-ui__wrapper__footer-center zen-mode-transition",{"layer-ui__wrapper__footer-left--transition-bottom":u})},O==null?void 0:O(!1,r)),m().createElement("div",{className:ot("layer-ui__wrapper__footer-right zen-mode-transition",{"transition-right disable-pointerEvents":u})},n.renderAction("toggleShortcuts")),m().createElement("button",{className:ot("disable-zen-mode",{"disable-zen-mode--visible":y}),onClick:w},L("buttons.exitZenMode"))),r.scrolledOutside&&m().createElement("button",{className:"scroll-back-to-content",onClick:function(){a(function(de){for(var le=1;le1&&m().createElement(m().Fragment,null,m().createElement("tr",null,m().createElement("th",{colSpan:2},L("stats.selected"))),m().createElement("tr",null,m().createElement("td",null,L("stats.elements")),m().createElement("td",null,a.length))),a.length>0&&m().createElement(m().Fragment,null,m().createElement("tr",null,m().createElement("td",null,"x"),m().createElement("td",null,Math.round(s[0]))),m().createElement("tr",null,m().createElement("td",null,"y"),m().createElement("td",null,Math.round(s[1]))),m().createElement("tr",null,m().createElement("td",null,L("stats.width")),m().createElement("td",null,Math.round(s[2]-s[0]))),m().createElement("tr",null,m().createElement("td",null,L("stats.height")),m().createElement("td",null,Math.round(s[3]-s[1])))),a.length===1&&m().createElement("tr",null,m().createElement("td",null,L("stats.angle")),m().createElement("td",null,"".concat(Math.round(180*a[0].angle/Math.PI),"\xB0"))),(t=e.renderCustomStats)===null||t===void 0?void 0:t.call(e,e.elements,e.appState)))))},V4=(E(9757),function(e){var t=e.message,n=e.clearToast,r=(0,V.useRef)(0),a=(0,V.useCallback)(function(){return r.current=window.setTimeout(function(){return n()},j.Lg)},[n]);return(0,V.useEffect)(function(){return a(),function(){return clearTimeout(r.current)}},[a,t]),m().createElement("div",{className:"Toast",onMouseEnter:function(){return clearTimeout(r==null?void 0:r.current)},onMouseLeave:a},m().createElement("p",{className:"Toast__message"},t))});function u1(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),n.push.apply(n,r)}return n}function d1(e){for(var t=1;t0&&a[a.length-1])||u[0]!==6&&u[0]!==2)){c=0;continue}if(u[0]===3&&(!a||u[1]>a[0]&&u[1]s.clientHeight&&(c==="auto"||c==="scroll"))return s;s=s.parentElement}return document}(this.excalidrawContainerRef.current),this.nearestScrollableContainer.addEventListener(j.Ks.SCROLL,this.onScroll)),window.addEventListener(j.Ks.RESIZE,this.onResize,!1),window.addEventListener(j.Ks.UNLOAD,this.onUnload,!1),window.addEventListener(j.Ks.BLUR,this.onBlur,!1),window.addEventListener(j.Ks.DRAG_OVER,this.disableEvent,!1),window.addEventListener(j.Ks.DROP,this.disableEvent,!1))},t.prototype.componentDidUpdate=function(n,r){var a,s,c=this;n.langCode!==this.props.langCode&&this.updateLanguage(),n.viewModeEnabled!==this.props.viewModeEnabled&&this.setState({viewModeEnabled:!!this.props.viewModeEnabled},this.addEventListeners),r.viewModeEnabled!==this.state.viewModeEnabled&&this.addEventListeners(),n.zenModeEnabled!==this.props.zenModeEnabled&&this.setState({zenModeEnabled:!!this.props.zenModeEnabled}),n.theme!==this.props.theme&&this.props.theme&&this.setState({theme:this.props.theme}),n.gridModeEnabled!==this.props.gridModeEnabled&&this.setState({gridSize:this.props.gridModeEnabled?j.k:null}),this.props.name&&n.name!==this.props.name&&this.setState({name:this.props.name}),(a=this.excalidrawContainerRef.current)===null||a===void 0||a.classList.toggle("theme--dark",this.state.theme==="dark"),this.state.editingLinearElement&&!this.state.selectedElementIds[this.state.editingLinearElement.elementId]&&setTimeout(function(){c.actionManager.executeAction(hs)});var p=r.multiElement;r.elementType!==this.state.elementType&&p!=null&&Co(this.state)&&wn(p)&&wu(p,this.state,this.scene,_o(mt.getPointAtIndexGlobalCoordinates(p,-1)));var f={},g={},u={},y={},b={};this.state.collaborators.forEach(function(W,K){if(W.selectedElementIds)for(var B=0,Y=Object.keys(W.selectedElementIds);B0;this.state.scrolledOutside!==U&&this.setState({scrolledOutside:U}),this.history.record(this.state,this.scene.getElementsIncludingDeleted()),this.state.isLoading||(O=(N=this.props).onChange)===null||O===void 0||O.call(N,this.scene.getElementsIncludingDeleted(),this.state)},t.resetTapTwice=function(){Ta=!1},t.prototype.addTextFromPaste=function(n){var r,a=xn({clientX:hi,clientY:mi},this.state),s=a.x,c=a.y,p=Eo({x:s,y:c,strokeColor:this.state.currentItemStrokeColor,backgroundColor:this.state.currentItemBackgroundColor,fillStyle:this.state.currentItemFillStyle,strokeWidth:this.state.currentItemStrokeWidth,strokeStyle:this.state.currentItemStrokeStyle,roughness:this.state.currentItemRoughness,opacity:this.state.currentItemOpacity,strokeSharpness:this.state.currentItemStrokeSharpness,text:n,fontSize:this.state.currentItemFontSize,fontFamily:this.state.currentItemFontFamily,textAlign:this.state.currentItemTextAlign,verticalAlign:j.hs});this.scene.replaceAllElements(Ve(Ve([],this.scene.getElementsIncludingDeleted()),[p])),this.setState({selectedElementIds:(r={},r[p.id]=!0,r)}),this.history.resumeRecording()},t.prototype.selectShapeTool=function(n){var r;To||Pr(this.canvas,n),(r=document.activeElement)instanceof HTMLElement&&r.className.includes("ToolIcon")&&this.focusContainer(),co(n)||this.setState({suggestedBindings:[]}),n!=="selection"?this.setState({elementType:n,selectedElementIds:{},selectedGroupIds:{},editingGroupId:null}):this.setState({elementType:n})},t.prototype.handleTextWysiwyg=function(n,r){var a=r.isExistingElement,s=a!==void 0&&a,c=this,p=function(f,g){g===void 0&&(g=!1),c.scene.replaceAllElements(Ve([],c.scene.getElementsIncludingDeleted().map(function(u){return u.id===n.id&&Ht(u)?T2(u,{text:f,isDeleted:g}):u})))};(function(f){var g=f.id,u=f.appState,y=f.onChange,b=f.onSubmit,w=f.getViewportCoords,k=f.element,M=f.canvas,A=f.excalidrawContainer,O=function(){var $,ke=($=an.getScene(k))===null||$===void 0?void 0:$.getElement(g);if(ke&&Ht(ke)){var Ze=w(ke.x,ke.y),ue=Ze[0],_e=Ze[1],Le=ke.textAlign,Be=ke.angle;N.value=ke.text;var We=ke.text.replace(/\r\n?/g,` -`).split(` -`),Qe=ke.height/We.length,Me=(u.offsetLeft+u.width-ue-8)/u.zoom.value-Number(getComputedStyle(A==null?void 0:A.parentNode).marginRight.slice(0,-2));Object.assign(N.style,{font:vo(ke),lineHeight:"".concat(Qe,"px"),width:"".concat(ke.width,"px"),height:"".concat(ke.height,"px"),left:"".concat(ue,"px"),top:"".concat(_e,"px"),transform:dw(ke.width,ke.height,Be,u,Me),textAlign:Le,color:ke.strokeColor,opacity:ke.opacity/100,filter:"var(--theme-filter)",maxWidth:"".concat(Me,"px")})}},N=document.createElement("textarea");N.dir="auto",N.tabIndex=0,N.dataset.type="wysiwyg",N.wrap="off",Object.assign(N.style,{position:"absolute",display:"inline-block",minHeight:"1em",backfaceVisibility:"hidden",margin:0,padding:0,border:0,outline:0,resize:"none",background:"transparent",overflow:"hidden",whiteSpace:"pre",zIndex:"var(--zIndex-wysiwyg)"}),O(),y&&(N.oninput=function(){y(n0(N.value))}),N.onkeydown=function($){if($.stopPropagation(),$.key===go)$.preventDefault(),_=!0,te();else if($.key===oa&&$[Ue]){if($.preventDefault(),$.isComposing||$.keyCode===229)return;_=!0,te()}else($.key===Zl||$[Ue]&&($.code===ta||$.code===Ul))&&($.preventDefault(),$.shiftKey||$.code===ta?B():K(),N.dispatchEvent(new Event("input")))};var U=" ".repeat(4),W=new RegExp("^ {1,".concat(4,"}")),K=function(){var $=N.selectionStart,ke=N.selectionEnd,Ze=Y(),ue=N.value;Ze.forEach(function(_e){var Le=ue.slice(0,_e),Be=ue.slice(_e);ue="".concat(Le).concat(U).concat(Be)}),N.value=ue,N.selectionStart=$+4,N.selectionEnd=ke+4*Ze.length},B=function(){var $=N.selectionStart,ke=N.selectionEnd,Ze=Y(),ue=[],_e=N.value;Ze.forEach(function(Le){var Be=_e.slice(Le,Le+4).match(W);if(Be){var We=_e.slice(0,Le),Qe=_e.slice(Le+Be[0].length);_e="".concat(We).concat(Qe),ue.push(Le)}}),N.value=_e,ue.length&&($>ue[ue.length-1]?N.selectionStart=Math.max($-4,ue[ue.length-1]):N.selectionStart=$,N.selectionEnd=Math.max(N.selectionStart,ke-4*ue.length))},Y=function(){var $=N.selectionStart,ke=N.selectionEnd,Ze=N.value,ue=Ze.slice(0,$).match(/[^\n]*$/)[0].length;return $-=ue,Ze.slice($,ke).split(` -`).reduce(function(_e,Le,Be,We){return _e.concat(Be?_e[Be-1]+We[Be-1].length+1:$)},[]).reverse()},J=function($){$.preventDefault(),$.stopPropagation()},_=!1,te=function(){oe(),b({text:n0(N.value),viaKeyboard:_})},oe=function(){le||(le=!0,N.onblur=null,N.oninput=null,N.onkeydown=null,Se&&Se.disconnect(),window.removeEventListener("resize",O),window.removeEventListener("wheel",J,!0),window.removeEventListener("pointerdown",Ie),window.removeEventListener("pointerup",Ae),window.removeEventListener("blur",te),de(),N.remove())},Ae=function(){window.removeEventListener("pointerup",Ae),setTimeout(function(){N.onblur=te,N.focus()})},Ie=function($){($.target instanceof HTMLElement||$.target instanceof SVGElement)&&$.target.closest(".".concat(j.$C.SHAPE_ACTIONS_MENU))&&!Qo($.target)&&(N.onblur=null,window.addEventListener("pointerup",Ae),window.addEventListener("blur",te))},de=an.getScene(k).addCallback(function(){O(),N.focus()}),le=!1;N.select(),Ae();var Se=null;M&&"ResizeObserver"in window?(Se=new window.ResizeObserver(function(){O()})).observe(M):window.addEventListener("resize",O),window.addEventListener("pointerdown",Ie),window.addEventListener("wheel",J,{passive:!1,capture:!0}),A==null||A.querySelector(".excalidraw-textEditorContainer").appendChild(N)})({id:n.id,appState:this.state,canvas:this.canvas,getViewportCoords:function(f,g){var u=sa({sceneX:f,sceneY:g},c.state),y=u.x,b=u.y;return[y-c.state.offsetLeft,b-c.state.offsetTop]},onChange:ft(function(f){p(f),Cu(n)&&Tr(n)}),onSubmit:ft(function(f){var g=f.text,u=f.viaKeyboard,y=!g.trim();p(g,y),!y&&u?c.setState(function(b){var w;return{selectedElementIds:fe(fe({},b.selectedElementIds),{},(w={},w[n.id]=!0,w))}}):ku(c.scene.getElements(),[n]),y&&!s||c.history.resumeRecording(),c.setState({draggingElement:null,editingElement:null}),c.state.elementLocked&&Pr(c.canvas,c.state.elementType),c.focusContainer()}),element:n,excalidrawContainer:this.excalidrawContainerRef.current}),this.setState({selectedElementIds:{},selectedGroupIds:{},editingGroupId:null}),p(n.text)},t.prototype.getTextElementAtPosition=function(n,r){var a=this.getElementAtPosition(n,r);return a&&Ht(a)&&!a.isDeleted?a:null},t.prototype.getElementAtPosition=function(n,r){var a=this.getElementsAtPosition(n,r);if(a.length>1){var s=a[a.length-1];return Mh(s,this.state,n,r)?a[a.length-2]:s}return a.length===1?a[0]:null},t.prototype.getElementsAtPosition=function(n,r){var a,s,c=this;return a=this.scene.getElements(),s=function(p){return function(f,g,u,y){var b=10/g.zoom.value,w=[u,y];return N2(g,f)?Th(f,w,b):Oh(f,g,w)}(p,c.state,n,r)},a.filter(function(p){return!p.isDeleted&&s(p)})},t.prototype.maybeCleanupAfterMissingPointerUp=function(n){Rr!==null&&Rr(n)},t.prototype.updateGestureOnPointerDown=function(n){tt.pointers.set(n.pointerId,{x:n.clientX,y:n.clientY}),tt.pointers.size===2&&(tt.lastCenter=Bm(tt.pointers),tt.initialScale=this.state.zoom.value,tt.initialDistance=Wm(Array.from(tt.pointers.values())))},t.prototype.initialPointerDownState=function(n){var r=xn(n,this.state),a=et(this.scene.getElements(),this.state),s=Pt(a),c=s[0],p=s[1],f=s[2],g=s[3];return{origin:r,originInGrid:_o(Wn(r.x,r.y,this.state.gridSize)),scrollbars:a0(ad,n.clientX-this.state.offsetLeft,n.clientY-this.state.offsetTop),lastCoords:fe({},r),originalElements:this.scene.getElements().reduce(function(u,y){return u.set(y.id,oi(y)),u},new Map),resize:{handleType:!1,isResizing:!1,offset:{x:0,y:0},arrowDirection:"origin",center:{x:(f+c)/2,y:(g+p)/2}},hit:{element:null,allHitElements:[],wasAddedToSelection:!1,hasBeenDuplicated:!1,hasHitCommonBoundingBoxOfSelectedElements:this.isHittingCommonBoundingBoxOfSelectedElements(r,a)},drag:{hasOccurred:!1,offset:null},eventListeners:{onMove:null,onUp:null,onKeyUp:null,onKeyDown:null}}},t.prototype.handleDraggingScrollBar=function(n,r){var a=this;if(!r.scrollbars.isOverEither||this.state.multiElement)return!1;id=!0,r.lastCoords.x=n.clientX,r.lastCoords.y=n.clientY;var s=ft(function(p){p.target instanceof HTMLElement&&a.handlePointerMoveOverScrollbars(p,r)}),c=ft(function(){id=!1,Pr(a.canvas,a.state.elementType),Rr=null,a.setState({cursorButton:"up"}),a.savePointer(n.clientX,n.clientY,"up"),window.removeEventListener(j.Ks.POINTER_MOVE,s),window.removeEventListener(j.Ks.POINTER_UP,c)});return Rr=c,window.addEventListener(j.Ks.POINTER_MOVE,s),window.addEventListener(j.Ks.POINTER_UP,c),!0},t.prototype.isASelectedElement=function(n){return n!=null&&this.state.selectedElementIds[n.id]},t.prototype.isHittingCommonBoundingBoxOfSelectedElements=function(n,r){if(r.length<2)return!1;var a=10/this.state.zoom.value,s=Pt(r),c=s[0],p=s[1],f=s[2],g=s[3];return n.x>c-a&&n.xp-a&&n.y0){var y=Wn(c.x-n.drag.offset.x,c.y-n.drag.offset.y,r.state.gridSize),b=y[0],w=y[1],k=[Math.abs(c.x-n.origin.x),Math.abs(c.y-n.origin.y)],M=k[0],A=k[1],O=a.shiftKey;if(function(Le,Be,We,Qe,Me,Ye,ct,kt){Ye===void 0&&(Ye=!1),ct===void 0&&(ct=0),kt===void 0&&(kt=0);var Mt=Pt(Be),zn=Mt[0],It=Mt[1],Pn=We-zn,sn=Qe-It;Be.forEach(function(en){var At,Lt;if(Ye){var Nn=Ye&&ctkt,tn=Le.originalElements.get(en.id);At=Nn&&tn?tn.x:en.x+Pn,Lt=Zn&&tn?tn.y:en.y+sn}else At=en.x+Pn,Lt=en.y+sn;De(en,{x:At,y:Lt}),Tr(en,{simultaneouslyUpdated:Be})})}(n,u,b,w,r.scene,O,M,A),r.maybeSuggestBindingForAll(u),a.altKey&&!n.hit.hasBeenDuplicated){n.hit.hasBeenDuplicated=!0;for(var N=[],U=[],W=new Map,K=new Map,B=n.hit.element,Y=0,J=r.scene.getElementsIncludingDeleted();Y1&&De(le,{points:Ve(Ve([],Se.slice(0,-1)),[[$,ke]])}),wn(le)&&r.maybeSuggestBindingForLinearElementAtCursor(le,"end",c,r.state.startBoundElement)):(n.lastCoords.x=c.x,n.lastCoords.y=c.y,r.maybeDragNewGenericElement(n,a));if(r.state.elementType==="selection"){var ue=r.scene.getElements();!a.shiftKey&&Wt(ue,r.state)&&r.setState({selectedElementIds:{},selectedGroupIds:{},editingGroupId:null});var _e=function(Le,Be){var We=it(Be),Qe=We[0],Me=We[1],Ye=We[2],ct=We[3];return Le.filter(function(kt){var Mt=ea(kt),zn=Mt[0],It=Mt[1],Pn=Mt[2],sn=Mt[3];return kt.type!=="selection"&&Qe<=zn&&Me<=It&&Ye>=Pn&&ct>=sn})}(ue,le);r.setState(function(Le){return Mr(fe(fe({},Le),{},{selectedElementIds:fe(fe({},Le.selectedElementIds),_e.reduce(function(Be,We){return Be[We.id]=!0,Be},{}))}),r.scene.getElements())})}}}}})},t.prototype.handlePointerMoveOverScrollbars=function(n,r){if(r.scrollbars.isOverHorizontal){var a=n.clientX,s=a-r.lastCoords.x;return this.setState({scrollX:this.state.scrollX-s/this.state.zoom.value}),r.lastCoords.x=a,!0}if(r.scrollbars.isOverVertical){var c=n.clientY,p=c-r.lastCoords.y;return this.setState({scrollY:this.state.scrollY-p/this.state.zoom.value}),r.lastCoords.y=c,!0}return!1},t.prototype.onPointerUpFromPointerDownHandler=function(n){var r=this;return ft(function(a){var s=r.state,c=s.draggingElement,p=s.resizingElement,f=s.multiElement,g=s.elementType,u=s.elementLocked,y=s.isResizing,b=s.isRotating;if(r.setState({isResizing:!1,isRotating:!1,resizingElement:null,selectionElement:null,cursorButton:"up",editingElement:f||Ht(r.state.editingElement)?r.state.editingElement:null}),r.savePointer(a.clientX,a.clientY,"up"),r.state.editingLinearElement){var w=mt.handlePointerUp(a,r.state.editingLinearElement,r.state);w!==r.state.editingLinearElement&&r.setState({editingLinearElement:w,suggestedBindings:[]})}if(Rr=null,window.removeEventListener(j.Ks.POINTER_MOVE,n.eventListeners.onMove),window.removeEventListener(j.Ks.POINTER_UP,n.eventListeners.onUp),window.removeEventListener(j.Ks.KEYDOWN,n.eventListeners.onKeyDown),window.removeEventListener(j.Ks.KEYUP,n.eventListeners.onKeyUp),(c==null?void 0:c.type)==="freedraw"){var k=xn(a,r.state),M=c.points,A=k.x-c.x,O=k.y-c.y;A===M[0][0]&&O===M[0][1]&&(O+=1e-4,A+=1e-4);var N=c.simulatePressure?[]:Ve(Ve([],c.pressures),[a.pressure]);return De(c,{points:Ve(Ve([],M),[[A,O]]),pressures:N}),void r.actionManager.executeAction(hs)}if(Et(c))c.points.length>1&&r.history.resumeRecording(),k=xn(a,r.state),n.drag.hasOccurred||!c||f?n.drag.hasOccurred&&!f&&(Co(r.state)&&wn(c)&&wu(c,r.state,r.scene,k),r.setState({suggestedBindings:[],startBoundElement:null}),u?r.setState(function(K){var B;return{draggingElement:null,selectedElementIds:fe(fe({},K.selectedElementIds),{},(B={},B[r.state.draggingElement.id]=!0,B))}}):(ur(r.canvas),r.setState(function(K){var B;return{draggingElement:null,elementType:"selection",selectedElementIds:fe(fe({},K.selectedElementIds),{},(B={},B[r.state.draggingElement.id]=!0,B))}}))):(De(c,{points:Ve(Ve([],c.points),[[k.x-c.x,k.y-c.y]])}),r.setState({multiElement:c,editingElement:r.state.draggingElement}));else{if(g!=="selection"&&c&&bo(c))return r.scene.replaceAllElements(r.scene.getElementsIncludingDeleted().slice(0,-1)),void r.setState({draggingElement:null});c&&De(c,ch(c)),p&&r.history.resumeRecording(),p&&bo(p)&&r.scene.replaceAllElements(r.scene.getElementsIncludingDeleted().filter(function(K){return K.id!==p.id}));var U=n.hit.element;if(U&&!n.drag.hasOccurred&&!n.hit.wasAddedToSelection)if(a.shiftKey)if(r.state.selectedElementIds[U.id])if(fh(r.state,U)){var W=U.groupIds.flatMap(function(K){return pr(r.scene.getElements(),K)}).map(function(K){var B;return(B={})[K.id]=!1,B}).reduce(function(K,B){return fe(fe({},K),B)},{});r.setState(function(K){return{selectedGroupIds:fe(fe({},K.selectedElementIds),U.groupIds.map(function(B){var Y;return(Y={})[B]=!1,Y}).reduce(function(B,Y){return fe(fe({},B),Y)},{})),selectedElementIds:fe(fe({},K.selectedElementIds),W)}})}else r.setState(function(K){var B;return{selectedElementIds:fe(fe({},K.selectedElementIds),{},(B={},B[U.id]=!1,B))}});else r.setState(function(K){var B;return{selectedElementIds:fe(fe({},K.selectedElementIds),{},(B={},B[U.id]=!0,B))}});else r.setState(function(K){var B;return fe({},Mr(fe(fe({},K),{},{selectedElementIds:(B={},B[U.id]=!0,B)}),r.scene.getElements()))});r.state.editingLinearElement||n.drag.hasOccurred||r.state.isResizing||!(U&&Mh(U,r.state,n.origin.x,n.origin.y)||!U&&n.hit.hasHitCommonBoundingBoxOfSelectedElements)?(!u&&g!=="freedraw"&&c&&r.setState(function(K){var B;return{selectedElementIds:fe(fe({},K.selectedElementIds),{},(B={},B[c.id]=!0,B))}}),(g!=="selection"||Wt(r.scene.getElements(),r.state))&&r.history.resumeRecording(),(n.drag.hasOccurred||y||b)&&(Co(r.state)?Bh:Gh)(et(r.scene.getElements(),r.state)),u||g==="freedraw"?r.setState({draggingElement:null,suggestedBindings:[]}):(ur(r.canvas),r.setState({draggingElement:null,suggestedBindings:[],elementType:"selection"}))):r.setState({selectedElementIds:{},selectedGroupIds:{},editingGroupId:null})}})},t.prototype.maybeSuggestBindingForAll=function(n){var r,a,s=(r=n,a=new Set(r.map(function(c){return c.id})),r.flatMap(function(c){return wn(c)?iw(c).filter(function(p){return!a.has(p.id)}):Bl(c)?Yh(c).filter(function(p){return!a.has(p[0].id)}):[]}));this.setState({suggestedBindings:s})},t.prototype.clearSelection=function(n){this.setState(function(r){return{selectedElementIds:{},selectedGroupIds:{},editingGroupId:r.editingGroupId&&n!=null&&pa(n,r.editingGroupId)?r.editingGroupId:null}}),this.setState({selectedElementIds:{},previousSelectedElementIds:this.state.selectedElementIds})},t.prototype.getTextWysiwygSnappedToCenterPosition=function(n,r,a,s,c){var p=function(y,b,w){for(var k=null,M=y.length-1;M>=0;--M)if(!y[M].isDeleted){var A=it(y[M]),O=A[0],N=A[1],U=A[2],W=A[3];if(O0&&e.setState({previousSelectedElementIds:{},selectedElementIds:e.state.previousSelectedElementIds})},this.pasteFromClipboard=ft(function(){var t=(0,Q.Z)(function(n){var r,a,s,c;return Nr(this,function(p){switch(p.label){case 0:return a=document.activeElement,((r=e.excalidrawContainerRef.current)===null||r===void 0?void 0:r.contains(a))?(s=document.elementFromPoint(hi,mi),!n||s instanceof HTMLCanvasElement&&!Qo(a)?[4,Fb(n)]:[2]):[2];case 1:return c=p.sent(),e.props.onPaste?[4,e.props.onPaste(c,n)]:[3,3];case 2:if(p.sent())return[2];p.label=3;case 3:return c.errorMessage?e.setState({errorMessage:c.errorMessage}):c.spreadsheet?e.setState({pasteDialog:{data:c.spreadsheet,shown:!0}}):c.elements?e.addElementsFromPasteOrLibrary({elements:Pa(c.elements),position:"cursor"}):c.text&&e.addTextFromPaste(c.text),e.selectShapeTool("selection"),n==null||n.preventDefault(),[2]}})});return function(n){return t.apply(this,arguments)}}()),this.addElementsFromPasteOrLibrary=function(t){var n=Pa(t.elements),r=Pt(n),a=r[0],s=r[1],c=r[2],p=r[3],f=In(a,c)/2,g=In(s,p)/2,u=typeof t.position=="object"?t.position.clientX:t.position==="cursor"?hi:e.state.width/2+e.state.offsetLeft,y=typeof t.position=="object"?t.position.clientY:t.position==="cursor"?mi:e.state.height/2+e.state.offsetTop,b=xn({clientX:u,clientY:y},e.state),w=b.x-f,k=b.y-g,M=new Map,A=Wn(w,k,e.state.gridSize),O=A[0],N=A[1],U=new Map,W=n.map(function(B){var Y=cu(e.state.editingGroupId,M,B,{x:B.x+O-a,y:B.y+N-s});return U.set(B.id,Y.id),Y}),K=Ve(Ve([],e.scene.getElementsIncludingDeleted()),W);Eu(K,n,U),e.scene.replaceAllElements(K),e.history.resumeRecording(),e.setState(Mr(fe(fe({},e.state),{},{isLibraryOpen:!1,selectedElementIds:W.reduce(function(B,Y){return B[Y.id]=!0,B},{}),selectedGroupIds:{}}),e.scene.getElements()))},this.setAppState=function(t){e.setState(t)},this.removePointer=function(t){t.pointerType==="touch"&&jr&&(clearTimeout(jr),jr=0,Aa=!1),tt.pointers.delete(t.pointerId)},this.toggleLock=function(){e.setState(function(t){return{elementLocked:!t.elementLocked,elementType:t.elementLocked?"selection":t.elementType}})},this.toggleZenMode=function(){e.actionManager.executeAction($u)},this.toggleStats=function(){e.state.showStats||ci("dialog","stats"),e.actionManager.executeAction(ed)},this.scrollToContent=function(t){t===void 0&&(t=e.scene.getElements()),e.setState(fe({},ya(Array.isArray(t)?t:[t],e.state,e.canvas)))},this.clearToast=function(){e.setState({toastMessage:null})},this.setToastMessage=function(t){e.setState({toastMessage:t})},this.restoreFileFromShare=(0,Q.Z)(function(){var t,n,r,a;return Nr(this,function(s){switch(s.label){case 0:return s.trys.push([0,6,,7]),[4,caches.open("web-share-target")];case 1:return[4,(t=s.sent()).match("shared-file")];case 2:return(n=s.sent())?[4,n.blob()]:[3,5];case 3:return r=s.sent(),e.loadFileToCanvas(r),[4,t.delete("shared-file")];case 4:s.sent(),window.history.replaceState(null,j.iC,window.location.pathname),s.label=5;case 5:return[3,7];case 6:return a=s.sent(),e.setState({errorMessage:a.message}),[3,7];case 7:return[2]}})}),this.updateScene=ft(function(t){t.commitToHistory&&e.history.resumeRecording(),t.appState&&e.setState(t.appState),t.elements&&e.scene.replaceAllElements(t.elements),t.collaborators&&e.setState({collaborators:t.collaborators})}),this.onSceneUpdated=function(){e.setState({})},this.updateCurrentCursorPosition=ft(function(t){hi=t.clientX,mi=t.clientY}),this.onKeyDown=ft(function(t){var n;if("Proxy"in window&&(!t.shiftKey&&/^[A-Z]$/.test(t.key)||t.shiftKey&&/^[a-z]$/.test(t.key))&&(t=new Proxy(t,{get:function(u,y){var b=u[y];return typeof b=="function"?b.bind(u):y==="key"?t.shiftKey?u.key.toUpperCase():u.key.toLowerCase():b}})),!(Qo(t.target)&&t.key!==go||ia(t.key)&&(n=t.target,n instanceof HTMLElement&&n.dataset.type==="wysiwyg"||n instanceof HTMLBRElement||n instanceof HTMLInputElement||n instanceof HTMLTextAreaElement||n instanceof HTMLSelectElement))&&(t.key===Nf&&e.setState({showHelpDialog:!0}),!e.actionManager.handleKeyDown(t)&&!e.state.viewModeEnabled)){if(t[Ue]&&e.state.isBindingEnabled&&e.setState({isBindingEnabled:!1}),t.code===qy&&e.setState({isLibraryOpen:!e.state.isLibraryOpen}),ia(t.key)){var r=e.state.gridSize&&(t.shiftKey?j.$e:e.state.gridSize)||(t.shiftKey?j.Iw:j.$e),a=e.scene.getElements().filter(function(u){return e.state.selectedElementIds[u.id]}),s=0,c=0;t.key===ho?s=-r:t.key===mo?s=r:t.key===ra?c=-r:t.key===na&&(c=r),a.forEach(function(u){De(u,{x:u.x+s,y:u.y+c}),Tr(u,{simultaneouslyUpdated:a})}),e.maybeSuggestBindingForAll(a),t.preventDefault()}else if(t.key===oa){var p=et(e.scene.getElements(),e.state);if(p.length===1&&Et(p[0]))e.state.editingLinearElement&&e.state.editingLinearElement.elementId===p[0].id||(e.history.resumeRecording(),e.setState({editingLinearElement:new mt(p[0],e.scene)}));else if(p.length===1&&!Et(p[0])){var f=p[0];return e.startTextEditing({sceneX:f.x+f.width/2,sceneY:f.y+f.height/2}),void t.preventDefault()}}else if(!t.ctrlKey&&!t.altKey&&!t.metaKey&&e.state.draggingElement===null){var g=function(u){var y=Km.find(function(b,w){return u===(w+1).toString()||(typeof b.key=="string"?b.key===u:b.key.includes(u))});return(y==null?void 0:y.value)||null}(t.key);g?e.selectShapeTool(g):t.key===f2&&e.toggleLock()}t.key===jf&&tt.pointers.size===0&&(To=!0,bn(e.canvas,j.oc.GRABBING))}}),this.onKeyUp=ft(function(t){if(t.key===jf&&(e.state.elementType==="selection"?ur(e.canvas):(Pr(e.canvas,e.state.elementType),e.setState({selectedElementIds:{},selectedGroupIds:{},editingGroupId:null})),To=!1),t[Ue]||e.state.isBindingEnabled||e.setState({isBindingEnabled:!0}),ia(t.key)){var n=et(e.scene.getElements(),e.state);Co(e.state)?Bh(n):Gh(n),e.setState({suggestedBindings:[]})}}),this.onGestureStart=ft(function(t){t.preventDefault(),e.setState({selectedElementIds:{}}),tt.initialScale=e.state.zoom.value}),this.onGestureChange=ft(function(t){if(t.preventDefault(),tt.pointers.size!==2){var n=tt.initialScale;n&&e.setState(function(r){var a=r.zoom,s=r.offsetLeft,c=r.offsetTop;return{zoom:Po(wa(n*t.scale),a,{left:s,top:c},{x:hi,y:mi})}})}}),this.onGestureEnd=ft(function(t){t.preventDefault(),e.setState({previousSelectedElementIds:{},selectedElementIds:e.state.previousSelectedElementIds}),tt.initialScale=null}),this.startTextEditing=function(t){var n=t.sceneX,r=t.sceneY,a=t.insertAtParentCenter,s=a===void 0||a,c=e.getTextElementAtPosition(n,r),p=s&&e.getTextWysiwygSnappedToCenterPosition(n,r,e.state,e.canvas,window.devicePixelRatio),f=c||Eo({x:p?p.elementCenterX:n,y:p?p.elementCenterY:r,strokeColor:e.state.currentItemStrokeColor,backgroundColor:e.state.currentItemBackgroundColor,fillStyle:e.state.currentItemFillStyle,strokeWidth:e.state.currentItemStrokeWidth,strokeStyle:e.state.currentItemStrokeStyle,roughness:e.state.currentItemRoughness,opacity:e.state.currentItemOpacity,strokeSharpness:e.state.currentItemStrokeSharpness,text:"",fontSize:e.state.currentItemFontSize,fontFamily:e.state.currentItemFontFamily,textAlign:p?"center":e.state.currentItemTextAlign,verticalAlign:p?"middle":j.hs});e.setState({editingElement:f}),c?p&&f.textAlign==="center"||De(f,{verticalAlign:j.hs}):(e.scene.replaceAllElements(Ve(Ve([],e.scene.getElementsIncludingDeleted()),[f])),p||De(f,{y:f.y-f.baseline/2})),e.setState({editingElement:f}),e.handleTextWysiwyg(f,{isExistingElement:!!c})},this.handleCanvasDoubleClick=function(t){if(!e.state.multiElement&&e.state.elementType==="selection"){var n=et(e.scene.getElements(),e.state);if(n.length===1&&Et(n[0]))e.state.editingLinearElement&&e.state.editingLinearElement.elementId===n[0].id||(e.history.resumeRecording(),e.setState({editingLinearElement:new mt(n[0],e.scene)}));else{ur(e.canvas);var r=xn(t,e.state),a=r.x,s=r.y;if(ni(e.state).length>0){var c=e.getElementAtPosition(a,s),p=c&&function(f,g){return f.groupIds.find(function(u){return g[u]})}(c,e.state.selectedGroupIds);if(p)return void e.setState(function(f){var g;return Mr(fe(fe({},f),{},{editingGroupId:p,selectedElementIds:(g={},g[c.id]=!0,g),selectedGroupIds:{}}),e.scene.getElements())})}ur(e.canvas),t[Ue]||e.state.viewModeEnabled||e.startTextEditing({sceneX:a,sceneY:s,insertAtParentCenter:!t.altKey})}}},this.handleCanvasPointerMove=function(t){e.savePointer(t.clientX,t.clientY,e.state.cursorButton),tt.pointers.has(t.pointerId)&&tt.pointers.set(t.pointerId,{x:t.clientX,y:t.clientY});var n=tt.initialScale;if(tt.pointers.size===2&&tt.lastCenter&&n&&tt.initialDistance){var r=Bm(tt.pointers),a=r.x-tt.lastCenter.x,s=r.y-tt.lastCenter.y;tt.lastCenter=r;var c=Wm(Array.from(tt.pointers.values()))/tt.initialDistance;e.setState(function(J){var _=J.zoom,te=J.scrollX,oe=J.scrollY,Ae=J.offsetLeft,Ie=J.offsetTop;return{scrollX:te+a/_.value,scrollY:oe+s/_.value,zoom:Po(wa(n*c),_,{left:Ae,top:Ie},r),shouldCacheIgnoreZoom:!0}}),e.resetShouldCacheIgnoreZoomDebounced()}else tt.lastCenter=tt.initialDistance=tt.initialScale=null;if(!(To||Ia||id)){var p=a0(ad,t.clientX-e.state.offsetLeft,t.clientY-e.state.offsetTop).isOverEither;e.state.draggingElement||e.state.multiElement||(p?ur(e.canvas):Pr(e.canvas,e.state.elementType));var f=xn(t,e.state),g=f.x,u=f.y;if(e.state.editingLinearElement&&!e.state.editingLinearElement.isDragging){var y=mt.handlePointerMove(t,g,u,e.state.editingLinearElement,e.state.gridSize);y!==e.state.editingLinearElement&&e.setState({editingLinearElement:y}),y.lastUncommittedPoint!=null?e.maybeSuggestBindingAtCursor(f):e.setState({suggestedBindings:[]})}if(Of(e.state.elementType)){var b=e.state.draggingElement;wn(b)?e.maybeSuggestBindingForLinearElementAtCursor(b,"end",f,e.state.startBoundElement):e.maybeSuggestBindingAtCursor(f)}if(e.state.multiElement){var w=e.state.multiElement,k=w.x,M=w.y,A=w.points,O=w.lastCommittedPoint,N=A[A.length-1];return Pr(e.canvas,e.state.elementType),void(N===O?Bn(g-k,u-M,N[0],N[1])>=j.qx?De(w,{points:Ve(Ve([],A),[[g-k,u-M]])}):bn(e.canvas,j.oc.POINTER):A.length>2&&O&&Bn(g-k,u-M,O[0],O[1])1&&!p){var K=jh(Pt(W),g,u,e.state.zoom,t.pointerType);if(K)return void bn(e.canvas,yu({transformHandleType:K}))}}else{var B=Nh(U,e.state,g,u,e.state.zoom,t.pointerType);if(B&&B.transformHandleType)return void bn(e.canvas,yu(B))}var Y=e.getElementAtPosition(f.x,f.y);e.state.elementType==="text"?bn(e.canvas,Ht(Y)?j.oc.TEXT:j.oc.CROSSHAIR):p?bn(e.canvas,j.oc.AUTO):Y||e.isHittingCommonBoundingBoxOfSelectedElements(f,W)?bn(e.canvas,j.oc.MOVE):bn(e.canvas,j.oc.AUTO)}}},this.handleTouchMove=function(t){Aa=!0},this.handleCanvasPointerDown=function(t){t.persist();var n=document.getSelection();if(n!=null&&n.anchorNode&&n.removeAllRanges(),e.maybeOpenContextMenuAfterPointerDownOnTouchDevices(t),e.maybeCleanupAfterMissingPointerUp(t),!Ia&&(e.setState({lastPointerDownWith:t.pointerType,cursorButton:"down"}),e.savePointer(t.clientX,t.clientY,"down"),!e.handleCanvasPanUsingWheelOrSpaceDrag(t)&&!(t.button!==j.Oh.MAIN&&t.button!==j.Oh.TOUCH||(e.updateGestureOnPointerDown(t),tt.pointers.size>1)))){var r=e.initialPointerDownState(t);if(!e.handleDraggingScrollBar(t,r)&&(e.clearSelectionIfNotUsingSelection(),e.updateBindingEnabledOnPointerMove(t),!e.handleSelectionOnPointerDown(t,r)))if(e.state.elementType!=="text"){e.state.elementType==="arrow"||e.state.elementType==="line"?e.handleLinearElementOnPointerDown(t,e.state.elementType,r):e.state.elementType==="freedraw"?e.handleFreeDrawElementOnPointerDown(t,e.state.elementType,r):e.createGenericElementOnPointerDown(e.state.elementType,r);var a=e.onPointerMoveFromPointerDownHandler(r),s=e.onPointerUpFromPointerDownHandler(r),c=e.onKeyDownFromPointerDownHandler(r),p=e.onKeyUpFromPointerDownHandler(r);Rr=s,e.state.viewModeEnabled||(window.addEventListener(j.Ks.POINTER_MOVE,a),window.addEventListener(j.Ks.POINTER_UP,s),window.addEventListener(j.Ks.KEYDOWN,c),window.addEventListener(j.Ks.KEYUP,p),r.eventListeners.onMove=a,r.eventListeners.onUp=s,r.eventListeners.onKeyUp=p,r.eventListeners.onKeyDown=c)}else e.handleTextOnPointerDown(t,r)}},this.maybeOpenContextMenuAfterPointerDownOnTouchDevices=function(t){t.pointerType==="touch"&&(Aa=!1,jr?Aa=!0:jr=window.setTimeout(function(){jr=0,Aa||e.handleCanvasContextMenu(t)},j.nM))},this.handleCanvasPanUsingWheelOrSpaceDrag=function(t){if(tt.pointers.size!==0||!(t.button===j.Oh.WHEEL||t.button===j.Oh.MAIN&&To||e.state.viewModeEnabled))return!1;Ia=!0;var n=!1,r=/Linux/.test(window.navigator.platform);bn(e.canvas,j.oc.GRABBING);var a=t.clientX,s=t.clientY,c=ft(function(f){var g=a-f.clientX,u=s-f.clientY;if(a=f.clientX,s=f.clientY,r&&!n&&(Math.abs(g)>1||Math.abs(u)>1)){n=!0;var y=function(w){document.body.removeEventListener(j.Ks.PASTE,y),w.stopPropagation()},b=function(){setTimeout(function(){document.body.removeEventListener(j.Ks.PASTE,y),window.removeEventListener(j.Ks.POINTER_UP,b)},100)};document.body.addEventListener(j.Ks.PASTE,y),window.addEventListener(j.Ks.POINTER_UP,b)}e.setState({scrollX:e.state.scrollX-g/e.state.zoom.value,scrollY:e.state.scrollY-u/e.state.zoom.value})}),p=ft(Rr=function(){Rr=null,Ia=!1,To||Pr(e.canvas,e.state.elementType),e.setState({cursorButton:"up"}),e.savePointer(t.clientX,t.clientY,"up"),window.removeEventListener(j.Ks.POINTER_MOVE,c),window.removeEventListener(j.Ks.POINTER_UP,p),window.removeEventListener(j.Ks.BLUR,p)});return window.addEventListener(j.Ks.BLUR,p),window.addEventListener(j.Ks.POINTER_MOVE,c,{passive:!0}),window.addEventListener(j.Ks.POINTER_UP,p),!0},this.clearSelectionIfNotUsingSelection=function(){e.state.elementType!=="selection"&&e.setState({selectedElementIds:{},selectedGroupIds:{},editingGroupId:null})},this.handleSelectionOnPointerDown=function(t,n){if(e.state.elementType==="selection"){var r=e.scene.getElements(),a=et(r,e.state);if(a.length!==1||e.state.editingLinearElement)a.length>1&&(n.resize.handleType=jh(Pt(a),n.origin.x,n.origin.y,e.state.zoom,t.pointerType));else{var s=Nh(r,e.state,n.origin.x,n.origin.y,e.state.zoom,t.pointerType);s!=null&&(e.setState({resizingElement:s.element}),n.resize.handleType=s.transformHandleType)}if(n.resize.handleType)bn(e.canvas,yu({transformHandleType:n.resize.handleType})),n.resize.isResizing=!0,n.resize.offset=_o(function(M,A,O,N){var U,W=A.length===1?it(A[0]):Pt(A),K=W[0],B=W[1],Y=W[2],J=W[3],_=(K+Y)/2,te=(B+J)/2,oe=A.length===1?A[0].angle:0;switch(O=(U=Xe(O,N,_,te,-oe))[0],N=U[1],M){case"n":return Xe(O-(K+Y)/2,N-B,0,0,oe);case"s":return Xe(O-(K+Y)/2,N-J,0,0,oe);case"w":return Xe(O-K,N-(B+J)/2,0,0,oe);case"e":return Xe(O-Y,N-(B+J)/2,0,0,oe);case"nw":return Xe(O-K,N-B,0,0,oe);case"ne":return Xe(O-Y,N-B,0,0,oe);case"sw":return Xe(O-K,N-J,0,0,oe);case"se":return Xe(O-Y,N-J,0,0,oe);default:return[0,0]}}(n.resize.handleType,a,n.origin.x,n.origin.y)),a.length===1&&Et(a[0])&&a[0].points.length===2&&(n.resize.arrowDirection=(u=n.resize.handleType,y=a[0],b=y.points[1],w=b[0],k=b[1],u==="nw"&&(w<0||k<0)||u==="ne"&&w>=0||u==="sw"&&w<=0||u==="se"&&(w>0||k>0)?"end":"origin"));else{var c;if(e.state.editingLinearElement){var p=mt.handlePointerDown(t,e.state,function(M){return e.setState(M)},e.history,n.origin);if(p.hitElement&&(n.hit.element=p.hitElement),p.didAddPoint)return!0}n.hit.element=(c=n.hit.element)!==null&&c!==void 0?c:e.getElementAtPosition(n.origin.x,n.origin.y),n.hit.allHitElements=e.getElementsAtPosition(n.origin.x,n.origin.y);var f=n.hit.element,g=n.hit.allHitElements.some(function(M){return e.isASelectedElement(M)});if(f!==null&&g||t.shiftKey||n.hit.hasHitCommonBoundingBoxOfSelectedElements||e.clearSelection(f),f!=null){if(t[Ue])return e.setState(function(M){return fe(fe({},function(A,O){var N;return En(En({},A),{},{editingGroupId:O.groupIds.length?O.groupIds[0]:null,selectedGroupIds:{},selectedElementIds:(N={},N[O.id]=!0,N)})}(M,f)),{},{previousSelectedElementIds:e.state.selectedElementIds})}),!1;e.state.selectedElementIds[f.id]||(e.state.editingGroupId&&!pa(f,e.state.editingGroupId)&&e.setState({selectedElementIds:{},selectedGroupIds:{},editingGroupId:null}),g||n.hit.hasHitCommonBoundingBoxOfSelectedElements||(e.setState(function(M){var A;return Mr(fe(fe({},M),{},{selectedElementIds:fe(fe({},M.selectedElementIds),{},(A={},A[f.id]=!0,A))}),e.scene.getElements())}),n.hit.wasAddedToSelection=!0))}e.setState({previousSelectedElementIds:e.state.selectedElementIds})}}var u,y,b,w,k;return!1},this.handleTextOnPointerDown=function(t,n){var r;((r=e.state.editingElement)===null||r===void 0?void 0:r.type)!=="text"&&(e.startTextEditing({sceneX:n.origin.x,sceneY:n.origin.y,insertAtParentCenter:!t.altKey}),ur(e.canvas),e.state.elementLocked||e.setState({elementType:"selection"}))},this.handleFreeDrawElementOnPointerDown=function(t,n,r){var a,s=Wn(r.origin.x,r.origin.y,null),c=s[0],p=s[1],f=(a={type:n,x:c,y:p,strokeColor:e.state.currentItemStrokeColor,backgroundColor:e.state.currentItemBackgroundColor,fillStyle:e.state.currentItemFillStyle,strokeWidth:e.state.currentItemStrokeWidth,strokeStyle:e.state.currentItemStrokeStyle,roughness:e.state.currentItemRoughness,opacity:e.state.currentItemOpacity,strokeSharpness:e.state.currentItemLinearStrokeSharpness,simulatePressure:t.pressure===.5},xo(xo({},ts(a.type,a)),{},{points:a.points||[],pressures:[],simulatePressure:a.simulatePressure,lastCommittedPoint:null}));e.setState(function(y){var b;return{selectedElementIds:fe(fe({},y.selectedElementIds),{},(b={},b[f.id]=!1,b))}});var g=f.simulatePressure?f.pressures:Ve(Ve([],f.pressures),[t.pressure]);De(f,{points:[[0,0]],pressures:g});var u=Or(r.origin,e.scene);e.scene.replaceAllElements(Ve(Ve([],e.scene.getElementsIncludingDeleted()),[f])),e.setState({draggingElement:f,editingElement:f,startBoundElement:u,suggestedBindings:[]})},this.handleLinearElementOnPointerDown=function(t,n,r){if(e.state.multiElement){var a=e.state.multiElement;if(a.type==="line"&&uo(a.points,e.state.zoom.value))return De(a,{lastCommittedPoint:a.points[a.points.length-1]}),void e.actionManager.executeAction(hs);var s=a.x,c=a.y,p=a.lastCommittedPoint;if(a.points.length>1&&p&&Bn(r.origin.x-s,r.origin.y-c,p[0],p[1])1){if(u==="rotation")return uw(g,y,A,O,w,N,U),!0;if(u==="nw"||u==="ne"||u==="sw"||u==="se")return cw(y,u,A,O),!0}return!1}(t,a,r,t.resize.arrowDirection,Vf(n),Qc(n),_c(n),p,f,t.resize.center.x,t.resize.center.y)&&(e.maybeSuggestBindingForAll(r),!0)},this._openContextMenu=function(t,n){var r=t.left,a=t.top,s=dm.contextItemPredicate(e.actionManager.getElementsIncludingDeleted(),e.actionManager.getAppState()),c=pm.contextItemPredicate(e.actionManager.getElementsIncludingDeleted(),e.actionManager.getAppState()),p=km.contextItemPredicate(e.actionManager.getElementsIncludingDeleted(),e.actionManager.getAppState()),f=Sm.contextItemPredicate(e.actionManager.getElementsIncludingDeleted(),e.actionManager.getAppState()),g="separator",u=e.scene.getElements(),y=[];if(ws&&u.length>0&&y.push(Tm),ys&&u.length>0&&y.push(Om),n!=="canvas")e.state.viewModeEnabled?Os({options:Ve([navigator.clipboard&&_u],y),top:a,left:r,actionManager:e.actionManager,appState:e.state,container:e.excalidrawContainerRef.current}):Os({options:Ve(Ve([e.isMobile&&a4,e.isMobile&&navigator.clipboard&&_u,e.isMobile&&navigator.clipboard&&{name:"paste",perform:function(w,k){return e.pasteFromClipboard(null),{commitToHistory:!1}},contextItemLabel:"labels.paste"},e.isMobile&&g],y),[g,Jb,qb,g,s&&dm,c&&pm,(s||c)&&g,$b,g,gb,vb,yb,wb,g,p&&km,f&&Sm,(p||f)&&g,xb,Du]),top:a,left:r,actionManager:e.actionManager,appState:e.state,container:e.excalidrawContainerRef.current});else{var b=Ve(Ve([],y),[e.props.gridModeEnabled===void 0&&Lm,e.props.zenModeEnabled===void 0&&$u,e.props.viewModeEnabled===void 0&&p1,ed]);if(Os({options:b,top:a,left:r,actionManager:e.actionManager,appState:e.state,container:e.excalidrawContainerRef.current}),e.state.viewModeEnabled)return;Os({options:[e.isMobile&&navigator.clipboard&&{name:"paste",perform:function(w,k){return e.pasteFromClipboard(null),{commitToHistory:!1}},contextItemLabel:"labels.paste"},e.isMobile&&navigator.clipboard&&g,ws&&u.length>0&&Tm,ys&&u.length>0&&Om,(ws&&u.length>0||ys&&u.length>0)&&g,bb,g,e.props.gridModeEnabled===void 0&&Lm,e.props.zenModeEnabled===void 0&&$u,e.props.viewModeEnabled===void 0&&p1,ed],top:a,left:r,actionManager:e.actionManager,appState:e.state,container:e.excalidrawContainerRef.current})}},this.handleWheel=ft(function(t){if(t.preventDefault(),!Ia){var n=t.deltaX,r=t.deltaY,a=e.state,s=a.selectedElementIds,c=a.previousSelectedElementIds;if(t.metaKey||t.ctrlKey){var p=Math.sign(r),f=Math.abs(r);f>10&&(f=10),f*=p,Object.keys(c).length!==0&&setTimeout(function(){e.setState({selectedElementIds:c,previousSelectedElementIds:{}})},1e3);var g=e.state.zoom.value-f/100;return g+=Math.log10(Math.max(1,e.state.zoom.value))*-p,g=Math.round(g*j.V4*100)/(100*j.V4),e.setState(function(u){var y=u.zoom,b=u.offsetLeft,w=u.offsetTop;return{zoom:Po(wa(g),y,{left:b,top:w},{x:hi,y:mi}),selectedElementIds:{},previousSelectedElementIds:Object.keys(s).length!==0?s:c,shouldCacheIgnoreZoom:!0}}),void e.resetShouldCacheIgnoreZoomDebounced()}t.shiftKey?e.setState(function(u){var y=u.zoom;return{scrollX:u.scrollX-(r||n)/y.value}}):e.setState(function(u){var y=u.zoom,b=u.scrollX,w=u.scrollY;return{scrollX:b-n/y.value,scrollY:w-r/y.value}})}}),this.savePointer=function(t,n,r){var a,s;if(t&&n){var c=xn({clientX:t,clientY:n},e.state);isNaN(c.x)||isNaN(c.y),(a=(s=e.props).onPointerUpdate)===null||a===void 0||a.call(s,{pointer:c,button:r,pointersMap:tt.pointers})}},this.resetShouldCacheIgnoreZoomDebounced=Wf(function(){e.unmounted||e.setState({shouldCacheIgnoreZoom:!1})},300),this.updateDOMRect=function(t){var n;if((n=e.excalidrawContainerRef)!==null&&n!==void 0&&n.current){var r=e.excalidrawContainerRef.current.getBoundingClientRect(),a=r.width,s=r.height,c=r.left,p=r.top,f=e.state,g=f.width,u=f.height,y=f.offsetTop,b=f.offsetLeft;if(a===g&&s===u&&c===b&&p===y)return void(t&&t());e.setState({width:a,height:s,offsetLeft:c,offsetTop:p},function(){t&&t()})}},this.refresh=function(){e.setState(fe({},e.getCanvasOffsets()))}};j.Vi.TEST!=="production"&&j.Vi.DEVELOPMENT!=="production"||(window.h=window.h||{},Object.defineProperties(window.h,{elements:{configurable:!0,get:function(){return this.app.scene.getElementsIncludingDeleted()},set:function(e){return this.app.scene.replaceAllElements(e)}}}));let G4=ld;E(4285),E(3313);function v1(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),n.push.apply(n,r)}return n}function Is(e){for(var t=1;t{I.exports=l},6207:I=>{I.exports=d}},H={};function X(I){var D=H[I];if(D!==void 0)return D.exports;var E=H[I]={id:I,exports:{}};return z[I](E,E.exports,X),E.exports}return X.m=z,X.n=I=>{var D=I&&I.__esModule?()=>I.default:()=>I;return X.d(D,{a:D}),D},v=Object.getPrototypeOf?I=>Object.getPrototypeOf(I):I=>I.__proto__,X.t=function(I,D){if(1&D&&(I=this(I)),8&D||typeof I=="object"&&I&&(4&D&&I.__esModule||16&D&&typeof I.then=="function"))return I;var E=Object.create(null);X.r(E);var R={};h=h||[null,v({}),v([]),v(v)];for(var x=2&D&&I;typeof x=="object"&&!~h.indexOf(x);x=v(x))Object.getOwnPropertyNames(x).forEach(C=>R[C]=()=>I[C]);return R.default=()=>I,X.d(E,R),E},X.d=(I,D)=>{for(var E in D)X.o(D,E)&&!X.o(I,E)&&Object.defineProperty(I,E,{enumerable:!0,get:D[E]})},X.f={},X.e=I=>Promise.all(Object.keys(X.f).reduce((D,E)=>(X.f[E](I,D),D),[])),X.u=I=>"excalidraw-assets/"+{9:"image",43:"i18n-de-DE-json",60:"i18n-ko-KR-json",62:"i18n-zh-TW-json",137:"i18n-ja-JP-json",149:"i18n-pt-PT-json",164:"i18n-kab-KAB-json",196:"i18n-nl-NL-json",213:"i18n-tr-TR-json",242:"i18n-my-MM-json",246:"i18n-nb-NO-json",262:"i18n-he-IL-json",280:"i18n-pa-IN-json",304:"i18n-zh-CN-json",317:"i18n-es-ES-json",351:"i18n-ca-ES-json",364:"i18n-fr-FR-json",381:"i18n-pt-BR-json",384:"i18n-bg-BG-json",401:"i18n-sk-SK-json",465:"i18n-it-IT-json",472:"i18n-fi-FI-json",491:"i18n-id-ID-json",526:"i18n-el-GR-json",558:"i18n-ar-SA-json",565:"i18n-oc-FR-json",583:"i18n-uk-UA-json",661:"i18n-hu-HU-json",698:"i18n-sv-SE-json",710:"i18n-fa-IR-json",736:"vendor",752:"i18n-ro-RO-json",852:"i18n-pl-PL-json",869:"i18n-ru-RU-json",899:"i18n-lv-LV-json",920:"i18n-nn-NO-json",933:"i18n-hi-IN-json"}[I]+"-"+{9:"5fe4e27670d5147fb1f2",43:"f85a8a52534c04c3f3b8",60:"e42ededaa35032a201b9",62:"0e77c896018bcd221bf6",137:"ccb5ffd0f8a0980c2ec0",149:"bc0cd589bd87a3079407",164:"d9acc7b8ee952e356d06",196:"23fdfd9f11bc8efbaf56",213:"cba7e62d9610795a5ac3",242:"26d1e27bab3b8ac4a3e6",246:"8ce0749d46f0b4a8defb",262:"157ae036fcf470528687",280:"27063e4865142ac11b1a",304:"94f562845a945a45e385",317:"32dc3bf0f789ef18e65d",351:"9924fbd53652d5f15134",364:"79fa555bfea0a356f393",381:"db86828d6e3ced9f9854",384:"35c0e8b92b0dba8a4e6d",401:"4757551ceb15fa0a29a9",465:"59f2e9d3dac07f3264cb",472:"46abeda8d809d4091924",491:"87212daac6113b5bf808",526:"3b209ec86ca2ce69bdfa",558:"efd63375f9605b72c4af",565:"c6414107ad634b113aba",583:"f0cab296bdc4089ffa77",661:"50a13e322a60bb701615",698:"dc7718d79b9bf93a4ba4",710:"7ee232d4ef08da0903f6",736:"5678a46e9c49ae846a9e",752:"f13a2e7b7a63fbfb6ae7",852:"16af1b83ac16af57ad07",869:"69b1a919b7f42adfd6ec",899:"07f6bffcb44fdd9aad4f",920:"b5931de6e1ed336bf087",933:"3035c3b3ab3ce981dbc7"}[I]+".js",X.o=(I,D)=>Object.prototype.hasOwnProperty.call(I,D),S={},P="Excalidraw:",X.l=(I,D,E,R)=>{if(S[I])S[I].push(D);else{var x,C;if(E!==void 0)for(var T=document.getElementsByTagName("script"),F=0;F{x.onerror=x.onload=null,clearTimeout(m);var Q=S[I];if(delete S[I],x.parentNode&&x.parentNode.removeChild(x),Q&&Q.forEach(se=>se(ne)),j)return j(ne)},m=setTimeout(V.bind(null,void 0,{type:"timeout",target:x}),12e4);x.onerror=V.bind(null,x.onerror),x.onload=V.bind(null,x.onload),C&&document.head.appendChild(x)}},X.r=I=>{typeof Symbol!="undefined"&&Symbol.toStringTag&&Object.defineProperty(I,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(I,"__esModule",{value:!0})},X.p="",(()=>{var I={388:0};X.f.j=(R,x)=>{var C=X.o(I,R)?I[R]:void 0;if(C!==0)if(C)x.push(C[2]);else{var T=new Promise((V,m)=>C=I[R]=[V,m]);x.push(C[2]=T);var F=X.p+X.u(R),G=new Error;X.l(F,V=>{if(X.o(I,R)&&((C=I[R])!==0&&(I[R]=void 0),C)){var m=V&&(V.type==="load"?"missing":V.type),j=V&&V.target&&V.target.src;G.message="Loading chunk "+R+` failed. -(`+m+": "+j+")",G.name="ChunkLoadError",G.type=m,G.request=j,C[1](G)}},"chunk-"+R,R)}};var D=(R,x)=>{var C,T,[F,G,V]=x,m=0;for(C in G)X.o(G,C)&&(X.m[C]=G[C]);for(V&&V(X),R&&R(x);m"),i}savePNG(i){return xe(this,void 0,void 0,function*(){if(!i){if(!this.getScene)return!1;i=this.getScene()}let l=this.file.path.substring(0,this.file.path.lastIndexOf("."+gt))+".png",d=this.app.vault.getAbstractFileByPath(be.normalizePath(l)),h={withBackground:this.plugin.settings.exportWithBackground,withTheme:this.plugin.settings.exportWithTheme},v=yield gn.getPNG(i,h);!v||(d&&d instanceof be.TFile?yield this.app.vault.modifyBinary(d,yield v.arrayBuffer()):yield this.app.vault.createBinary(l,yield v.arrayBuffer()))})}getViewData(){if(this.getScene){let i=this.getScene();return this.plugin.settings.autoexportSVG&&this.saveSVG(i),this.plugin.settings.autoexportPNG&&this.savePNG(i),i}else return this.data}handleLinkClick(i,l){let d=this.getSelectedText();if(!d){new be.Notice(`Select a text element. -If it is a web link, it will open in a new browser window. -Else, if it is a valid filename, Excalidraw will handle it as an Obsidian internal link. -Use Shift+click to open it in a new pane. -You can also ctrl/meta click on the text element in the drawing as a shortcut to using this button.`,2e4);return}if(d.match(dd)){window.open(d,"_blank");return}let h=d.matchAll(ud).next();if(i.plugin.settings.validLinksOnly&&(d=""),h.value&&(d=h.value[1]),d==""){new be.Notice("Text element is empty, or [[valid links only]] setting is enabled in settings, and text does not contain a [[valid Obsidian link]]",4e3);return}if(d.match(pd)){new be.Notice('File name cannot contain any of the following characters: *\xA0"\xA0\\\xA0\xA0<\xA0>\xA0:\xA0|\xA0?',4e3);return}if(!l.altKey&&!i.app.metadataCache.getFirstLinkpathDest(d,i.file.path)){new be.Notice("File does not exist. Hold down ALT (or ALT+SHIFT) and click link button to create a new file.",4e3);return}try{let v=i.file;i.app.workspace.openLinkText(d,i.file.path,l.shiftKey).then(()=>{l.altKey&&i.plugin.linkIndex.indexFile(v)})}catch(v){new be.Notice(v,4e3)}}onload(){return xe(this,void 0,void 0,function*(){this.addAction(S1,`Force-save now to update transclusion visible in adjacent workspace pane -(Please note, that autosave is always on)`,i=>xe(this,void 0,void 0,function*(){yield this.save(),this.plugin.triggerEmbedUpdates()})),this.addAction(C1,"Export as PNG",i=>xe(this,void 0,void 0,function*(){return this.savePNG()})),this.addAction(P1,"Export as SVG",i=>xe(this,void 0,void 0,function*(){return this.saveSVG()})),this.addAction("link",`Open selected text as link -(SHIFT+click to open in a new pane)`,i=>this.handleLinkClick(this,i)),this.app.workspace.layoutReady?this.app.workspace.rootSplit.containerEl.addEventListener("scroll",i=>{this.refresh&&this.refresh()}):this.registerEvent(this.app.workspace.on("layout-ready",()=>xe(this,void 0,void 0,function*(){return this.app.workspace.rootSplit.containerEl.addEventListener("scroll",i=>{this.refresh&&this.refresh()})}))),this.setupAutosaveTimer()})}setupAutosaveTimer(){let i=()=>xe(this,void 0,void 0,function*(){this.dirty&&(this.dirty=!1,this.excalidrawRef&&(yield this.save()),this.plugin.triggerEmbedUpdates())});this.autosaveTimer=setInterval(i,3e4)}onunload(){return xe(this,void 0,void 0,function*(){this.autosaveTimer&&clearInterval(this.autosaveTimer),this.excalidrawRef&&(yield this.save())})}setViewData(i,l){this.app.workspace.layoutReady?this.loadDrawing(i,l):this.registerEvent(this.app.workspace.on("layout-ready",()=>xe(this,void 0,void 0,function*(){return this.loadDrawing(i,l)})))}clear(){}loadDrawing(i,l){return xe(this,void 0,void 0,function*(){l&&this.clear(),this.justLoaded=!0;let d=JSON.parse(i);this.excalidrawRef?this.excalidrawRef.current.updateScene({elements:d.elements,appState:d.appState}):this.instantiateExcalidraw({elements:d.elements,appState:d.appState,scrollToContent:!0,libraryItems:yield this.getLibrary()})})}getDisplayText(){return this.file?this.file.basename:"Excalidraw (no file)"}canAcceptExtension(i){return i==gt}getViewType(){return dn}getIcon(){return Ds}getLibrary(){return xe(this,void 0,void 0,function*(){let i=JSON.parse(this.plugin.settings.library);return(i==null?void 0:i.library)?i.library:[]})}instantiateExcalidraw(i){this.dirty=!1,this.previousSceneVersion=0;let l=gr.createElement(()=>{let d={x:0,y:0},h=gr.useRef(null),v=gr.useRef(null),[S,P]=gr.useState({width:void 0,height:void 0});return this.excalidrawRef=h,gr.useEffect(()=>{P({width:this.contentEl.clientWidth,height:this.contentEl.clientHeight});let z=()=>{try{P({width:this.contentEl.clientWidth,height:this.contentEl.clientHeight})}catch(H){console.log("Excalidraw React-Wrapper, onResize ",H)}};return window.addEventListener("resize",z),()=>window.removeEventListener("resize",z)},[v]),this.getSelectedText=()=>{if(!(h==null?void 0:h.current))return null;let z=h.current.getSceneElements().filter(H=>H.id==Object.keys(h.current.getAppState().selectedElementIds)[0]);return z.length==0||z[0].type!="text"?null:z[0].text},this.addText=(z,H)=>{if(!(h==null?void 0:h.current))return;let X=h.current.getSceneElements(),I=h.current.getAppState();window.ExcalidrawAutomate.reset(),window.ExcalidrawAutomate.style.strokeColor=I.currentItemStrokeColor,window.ExcalidrawAutomate.style.opacity=I.currentItemOpacity,window.ExcalidrawAutomate.style.fontFamily=H||I.currentItemFontFamily,window.ExcalidrawAutomate.style.fontSize=I.currentItemFontSize,window.ExcalidrawAutomate.style.textAlign=I.currentItemTextAlign;let D=window.ExcalidrawAutomate.addText(d.x,d.y,z);X.push(window.ExcalidrawAutomate.elementsDict[D]),h.current.updateScene({elements:X,appState:I})},this.getScene=()=>{if(!(h==null?void 0:h.current))return null;let z=h.current.getSceneElements(),H=h.current.getAppState();return JSON.stringify({type:"excalidraw",version:2,source:"https://excalidraw.com",elements:z,appState:{theme:H.theme,viewBackgroundColor:H.viewBackgroundColor,currentItemStrokeColor:H.currentItemStrokeColor,currentItemBackgroundColor:H.currentItemBackgroundColor,currentItemFillStyle:H.currentItemFillStyle,currentItemStrokeWidth:H.currentItemStrokeWidth,currentItemStrokeStyle:H.currentItemStrokeStyle,currentItemRoughness:H.currentItemRoughness,currentItemOpacity:H.currentItemOpacity,currentItemFontFamily:H.currentItemFontFamily,currentItemFontSize:H.currentItemFontSize,currentItemTextAlign:H.currentItemTextAlign,currentItemStrokeSharpness:H.currentItemStrokeSharpness,currentItemStartArrowhead:H.currentItemStartArrowhead,currentItemEndArrowhead:H.currentItemEndArrowhead,currentItemLinearStrokeSharpness:H.currentItemLinearStrokeSharpness}})},this.refresh=()=>{!(h==null?void 0:h.current)||h.current.refresh()},gr.createElement(gr.Fragment,null,gr.createElement("div",{className:"excalidraw-wrapper",ref:v,key:"abc",onClick:z=>{!(z.ctrlKey||z.metaKey)||!this.getSelectedText()||this.handleLinkClick(this,z)}},gr.createElement(Fc.default,{ref:h,width:S.width,height:S.height,UIOptions:{canvasActions:{loadScene:!1,saveScene:!1,saveAsScene:!1,export:!1}},initialData:i,detectScroll:!0,onPointerUpdate:z=>{d=z.pointer},onChange:(z,H)=>{var X;if(this.justLoaded){this.justLoaded=!1;let I=new KeyboardEvent("keydown",{bubbles:!0,cancelable:!0,shiftKey:!0,code:"Digit1"});(X=this.contentEl.querySelector("canvas"))===null||X===void 0||X.dispatchEvent(I)}if(H.editingElement==null&&H.resizingElement==null&&H.draggingElement==null&&H.editingGroupId==null&&H.editingLinearElement==null){let I=Fc.getSceneVersion(z);I!=this.previousSceneVersion&&(this.previousSceneVersion=I,this.dirty=!0)}},onLibraryChange:z=>{(()=>xe(this,void 0,void 0,function*(){this.plugin.settings.library=n3+JSON.stringify(z)+"}",yield this.plugin.saveSettings()}))()}})))});h6.render(l,this.contentEl)}static getSVG(i,l){var d;try{let h=JSON.parse(i);return Fc.exportToSvg({elements:h.elements,appState:Object.assign({exportBackground:l.withBackground,exportWithDarkMode:l.withTheme?((d=h.appState)===null||d===void 0?void 0:d.theme)!="light":!1},h.appState),exportPadding:10,metadata:"Generated by Excalidraw-Obsidian plugin"})}catch(h){return null}}static getPNG(i,l){var d;return xe(this,void 0,void 0,function*(){try{let h=JSON.parse(i);return yield Fc.exportToBlob({elements:h.elements,appState:Object.assign({exportBackground:l.withBackground,exportWithDarkMode:l.withTheme?((d=h.appState)===null||d===void 0?void 0:d.theme)!="light":!1},h.appState),mimeType:"image/png",exportWithDarkMode:"true",metadata:"Generated by Excalidraw-Obsidian plugin"})}catch(h){return null}})}},v6={folder:"Excalidraw",templateFilePath:"Excalidraw/Template.excalidraw",drawingFilenamePrefix:"Drawing ",drawingFilenameDateTime:"YYYY-MM-DD HH.mm.ss",width:"400",validLinksOnly:!1,exportWithTheme:!0,exportWithBackground:!0,autoexportSVG:!1,autoexportPNG:!1,keepInSync:!1,library:'{"type":"excalidrawlib","version":1,"library":[]}',syncFolder:"excalidraw_sync",excalidrawSync:!1},yy=class extends be.PluginSettingTab{constructor(i,l){super(i,l);this.plugin=l}display(){let{containerEl:i}=this;this.containerEl.empty(),new be.Setting(i).setName("Default width of embedded (transcluded) image").setDesc("The default width of an embedded drawing. You can specify a different width when embedding an image using the ![[drawing.excalidraw|100]] or [[drawing.excalidraw|100x100]] format.").addText(h=>h.setPlaceholder("400").setValue(this.plugin.settings.width).onChange(v=>xe(this,void 0,void 0,function*(){this.plugin.settings.width=v,yield this.plugin.saveSettings(),this.plugin.triggerEmbedUpdates()}))),new be.Setting(i).setName("Excalidraw folder").setDesc("Default location for your Excalidraw drawings. Leaving this empty means drawings will be created in the Vault root.").addText(h=>h.setPlaceholder("Excalidraw").setValue(this.plugin.settings.folder).onChange(v=>xe(this,void 0,void 0,function*(){this.plugin.settings.folder=v,yield this.plugin.saveSettings()}))),new be.Setting(i).setName("Excalidraw template file").setDesc('Full path to file containing the file you want to use as the template for new Excalidraw drawings. Note that Excalidraw files will have the extension ".excalidraw". Assuming your template is in the default Excalidraw folder, the setting would be: Excalidraw/Template.excalidraw').addText(h=>h.setPlaceholder("Excalidraw/Template.excalidraw").setValue(this.plugin.settings.templateFilePath).onChange(v=>xe(this,void 0,void 0,function*(){this.plugin.settings.templateFilePath=v,yield this.plugin.saveSettings()}))),this.containerEl.createEl("h1",{text:"New drawing filename"}),i.createDiv("",h=>{h.innerHTML='

The automatically generated filename consists of a prefix and a date. e.g."Drawing 2021-05-24 12.58.07".

Click this link for the date and time format reference.

'});let l=()=>"The current file format is: "+this.plugin.settings.drawingFilenamePrefix+window.moment().format(this.plugin.settings.drawingFilenameDateTime)+"."+gt+"",d=i.createEl("p",{text:""});d.innerHTML=l(),new be.Setting(i).setName("Filename prefix").setDesc("The first part of the filename").addText(h=>h.setPlaceholder("Drawing ").setValue(this.plugin.settings.drawingFilenamePrefix).onChange(v=>xe(this,void 0,void 0,function*(){this.plugin.settings.drawingFilenamePrefix=v.replaceAll(/[<>:"/\\|?*]/g,"_"),h.setValue(this.plugin.settings.drawingFilenamePrefix),d.innerHTML=l(),yield this.plugin.saveSettings()}))),new be.Setting(i).setName("Filename date").setDesc("The second part of the filename").addText(h=>h.setPlaceholder("YYYY-MM-DD HH.mm.ss").setValue(this.plugin.settings.drawingFilenameDateTime).onChange(v=>xe(this,void 0,void 0,function*(){this.plugin.settings.drawingFilenameDateTime=v.replaceAll(/[<>:"/\\|?*]/g,"_"),h.setValue(this.plugin.settings.drawingFilenameDateTime),d.innerHTML=l(),yield this.plugin.saveSettings()}))),this.containerEl.createEl("h1",{text:"Links in drawings"}),this.containerEl.createEl("p",{text:"You can CTRL/META + click on text elements in your drawings to open them as links. By default the plugin will handle any text as a link, and will try to open it. If the text element includes a [[valid Obsidian link]] then the rest of the text element will be ignored and only the [[valid Obsidian link]] will be processed as a link. If the text element starts as a valid web link (i.e. https:// or http://), then it will be treated as a web link and the plugin will try to open it in a browser window. The plugin indexes your drawings, and when Obsidian files change, the matching text in your drawings will also change. If you don't want text accidentally\xA0changing in your drawings, you can set the below toggle to limit the link feature to only [[valid Obsidian links]]."}),new be.Setting(i).setName("Accept only [[valid Obsidian links]]").setDesc("If this is on, text in text elements will be ignored unless they contain a [[valid Obsidian link]]").addToggle(h=>h.setValue(this.plugin.settings.validLinksOnly).onChange(v=>xe(this,void 0,void 0,function*(){this.plugin.settings.validLinksOnly=v,this.plugin.reloadIndex(),yield this.plugin.saveSettings()}))),this.containerEl.createEl("h1",{text:"Embedded image settings"}),new be.Setting(i).setName("Export image with background").setDesc("If turned off, the exported image will be transparent.").addToggle(h=>h.setValue(this.plugin.settings.exportWithBackground).onChange(v=>xe(this,void 0,void 0,function*(){this.plugin.settings.exportWithBackground=v,yield this.plugin.saveSettings(),this.plugin.triggerEmbedUpdates()}))),new be.Setting(i).setName("Export image with theme").setDesc("Export the image matching the dark/light theme setting used for your drawing in Excalidraw. If turned off, drawings created in drak mode will appear as they would in light mode.").addToggle(h=>h.setValue(this.plugin.settings.exportWithTheme).onChange(v=>xe(this,void 0,void 0,function*(){this.plugin.settings.exportWithTheme=v,yield this.plugin.saveSettings(),this.plugin.triggerEmbedUpdates()}))),new be.Setting(i).setName("Auto-export SVG").setDesc('Automatically create an SVG export of your drawing matching the title of your "my drawing.excalidraw" file. The plugin will save the .SVG file in the same folder as the drawing. You can use this file ("my drawing.svg") to embed your drawing into documents in a platform independent way. While the auto export switch is on, this file will get updated every time you edit the excalidraw drawing with the matching name.').addToggle(h=>h.setValue(this.plugin.settings.autoexportSVG).onChange(v=>xe(this,void 0,void 0,function*(){this.plugin.settings.autoexportSVG=v,yield this.plugin.saveSettings()}))),new be.Setting(i).setName("Auto-export PNG").setDesc("Same as the auto-export SVG, but for PNG.").addToggle(h=>h.setValue(this.plugin.settings.autoexportPNG).onChange(v=>xe(this,void 0,void 0,function*(){this.plugin.settings.autoexportPNG=v,yield this.plugin.saveSettings()}))),new be.Setting(i).setName("Keep the .SVG and/or .PNG filenames in sync with the .excalidraw file").setDesc("When turned on, the plugin will automaticaly update the filename of the .SVG and/or .PNG files when the .excalidraw file in the same folder (and same name) is renamed. The plugin will also automatically delete the .SVG and/or .PNG files when the .excalidraw file in the same folder (and same name) is deleted. ").addToggle(h=>h.setValue(this.plugin.settings.keepInSync).onChange(v=>xe(this,void 0,void 0,function*(){this.plugin.settings.keepInSync=v,yield this.plugin.saveSettings()}))),this.containerEl.createEl("h1",{text:"Excalidraw sync"}),this.containerEl.createEl("h3",{text:"This is a hack and a temporary workaround. Turn it on only if you are comfortable with hacky solutions..."}),this.containerEl.createEl("p",{text:'By enabling this feature Excalidraw will sync drawings to a sync folder where drawings are stored in an ".md" file. This will allow Obsidian sync to synchronize Excalidraw drawings as well... Whenever your drawing changes, the corresponding file in the sync folder will also get updated. Similarly, whenever a file is synchronized to the sync folder by Obsidian sync, Excalidraw will sync it with the .excalidraw file in your vault.'}),this.containerEl.createEl("p",{text:"Because this is a temporary workaround until Obsidian sync is ready, I didn't implement extensive application logic to manage sync. Sync might get confused requiring some manual intervention."}),new be.Setting(i).setName("Excalidraw sync folder").setDesc("Configure the folder first, before activating the feature! This is the root folder for your mirrored excalidraw drawings. Don't save other files here, as my algorithm is not prepared to handle those... and I can't predict the outcome. ").addText(h=>h.setPlaceholder(".excalidraw_sync").setValue(this.plugin.settings.syncFolder).onChange(v=>xe(this,void 0,void 0,function*(){this.plugin.settings.syncFolder=v,yield this.plugin.saveSettings()}))),new be.Setting(i).setName("Excalidraw sync").setDesc("Enable Excalidraw Sync").addToggle(h=>h.setValue(this.plugin.settings.excalidrawSync).onChange(v=>xe(this,void 0,void 0,function*(){this.plugin.settings.excalidrawSync=v,yield this.plugin.saveSettings(),this.plugin.initiateSync()})))}},vn;(function(o){o[o.openFile=0]="openFile",o[o.insertLinkToDrawing=1]="insertLinkToDrawing",o[o.insertLink=2]="insertLink"})(vn||(vn={}));var wy=class extends be.FuzzySuggestModal{constructor(i,l){super(i);this.app=i,this.action=vn.openFile,this.plugin=l,this.onNewPane=!1,this.inputEl.onkeyup=d=>{d.key=="Enter"&&this.action==vn.openFile&&this.containerEl.innerText.includes(k1)&&(this.plugin.createDrawing(this.plugin.settings.folder+"/"+this.inputEl.value+"."+gt,this.onNewPane),this.close())}}getItems(){return(this.app.vault.getFiles()||[]).filter(l=>this.action==vn.insertLink||l.extension==gt)}getItemText(i){return i.path}onChooseItem(i,l){switch(this.action){case vn.openFile:this.plugin.openDrawing(i,this.onNewPane);break;case vn.insertLinkToDrawing:this.plugin.embedDrawing(i.path);break;case vn.insertLink:let d=this.app.metadataCache.getLinkpathDest(i.path,this.drawingPath)[0].path;this.addText("[["+(d.endsWith(".md")?d.substr(0,d.length-3):d)+"]]");break}}insertLink(i,l){this.action=vn.insertLink,this.addText=l,this.drawingPath=i,this.setInstructions([{command:"Select a file then hit enter.",purpose:""}]),this.emptyStateText="No file matches your query.",this.setPlaceholder("Select existing file to insert link into drawing."),this.open()}start(i,l){switch(this.setInstructions([{command:"Type name of drawing to select.",purpose:""}]),this.action=i,this.onNewPane=l,i){case vn.openFile:this.emptyStateText=k1,this.setPlaceholder("Select existing drawing or type name of new and hit enter.");break;case vn.insertLinkToDrawing:this.emptyStateText="No file matches your query.",this.setPlaceholder("Select existing drawing to insert into document.");break}this.open()}},y6=o=>crypto.getRandomValues(new Uint8Array(o)),w6=(o,i,l)=>{let d=(2<{let v="";for(;;){let S=l(h),P=h;for(;P--;)if(v+=o[S[P]&d]||"",v.length===i)return v}}},b6=(o,i)=>w6(o,i,y6),Yo=b6("1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",8);function E6(o){window.ExcalidrawAutomate={plugin:o,elementIds:[],elementsDict:{},style:{strokeColor:"#000000",backgroundColor:"transparent",angle:0,fillStyle:"hachure",strokeWidth:1,storkeStyle:"solid",roughness:1,opacity:100,strokeSharpness:"sharp",fontFamily:1,fontSize:20,textAlign:"left",verticalAlign:"top",startArrowHead:null,endArrowHead:"arrow"},canvas:{theme:"light",viewBackgroundColor:"#FFFFFF"},setFillStyle(i){switch(i){case 0:return this.style.fillStyle="hachure","hachure";case 1:return this.style.fillStyle="cross-hatch","cross-hatch";default:return this.style.fillStyle="solid","solid"}},setStrokeStyle(i){switch(i){case 0:return this.style.strokeStyle="solid","solid";case 1:return this.style.strokeStyle="dashed","dashed";default:return this.style.strokeStyle="dotted","dotted"}},setStrokeSharpness(i){switch(i){case 0:return this.style.strokeSharpness="round","round";default:return this.style.strokeSharpness="sharp","sharp"}},setFontFamily(i){switch(i){case 1:return this.style.fontFamily=1,Il(1);case 2:return this.style.fontFamily=2,Il(2);default:return this.style.strokeSharpness=3,Il(3)}},setTheme(i){switch(i){case 0:return this.canvas.theme="light","light";default:return this.canvas.theme="dark","dark"}},addToGroup(i){let l=Yo();i.forEach(d=>{var h,v;(v=(h=this.elementsDict[d])===null||h===void 0?void 0:h.groupIds)===null||v===void 0||v.push(l)})},toClipboard(i){return xe(this,void 0,void 0,function*(){let l=i?yield Hc(i):null,d=l?l.elements:[];for(let h=0;h{switch(x){case"bottom":return[(C.x+(C.x+C.width))/2,C.y+C.height+S];case"left":return[C.x-S,(C.y+(C.y+C.height))/2];case"right":return[C.x+C.width+S,(C.y+(C.y+C.height))/2];default:return[(C.x+(C.x+C.width))/2,C.y-S]}},[H,X]=z(l,this.elementsDict[i]),[I,D]=z(h,this.elementsDict[d]),E=P+2,R=[];for(let x=0;xH||" ").join(` -`);let v=d.offsetWidth,S=d.offsetHeight,P=document.createElement("span");P.style.display="inline-block",P.style.overflow="hidden",P.style.width="1px",P.style.height="1px",d.appendChild(P);let z=P.offsetTop+P.offsetHeight;return document.body.removeChild(d),{w:v,h:S,baseline:z}}function Hc(o){return xe(this,void 0,void 0,function*(){let i=window.ExcalidrawAutomate.plugin.app.vault,l=i.getAbstractFileByPath(be.normalizePath(o));if(l&&l instanceof be.TFile){let d=yield i.read(l),h=JSON.parse(d);return{elements:h.elements,appState:h.appState}}return{elements:[],appState:{}}})}var Vc=class{constructor(i){this.app=i.app,this.plugin=i,this.link2ex=new Map,this.ex2link=new Map,this.vaultEventHandlers=new Map}reloadIndex(){return xe(this,void 0,void 0,function*(){this.initialize()})}initialize(){return xe(this,void 0,void 0,function*(){let i=new Map,l=new Map,d=new Date().getTime(),h=0,v=this.app.vault.getFiles().filter(P=>P.extension==gt);for(let P of v){let z=yield this.parseLinks(P);z.size>0&&(h+=z.size,l.set(P.path,z),z.forEach(H=>{i.has(H.link)?i.set(H.link,i.get(H.link).add(P.path)):i.set(H.link,new Set().add(P.path))}))}this.link2ex=i,this.ex2link=l;let S=new Date().getTime()-d;console.log(`Excalidraw: Parsed ${v.length} drawings and indexed ${h} links - (${S/1e3}s)`),this.registerEventHandlers()})}indexFile(i){i.extension==gt&&(this.clearIndex(i),this.parseLinks(i).then(l=>{l.size!=0&&(this.ex2link.set(i.path,l),l.forEach(d=>{this.link2ex.has(d.link)?this.link2ex.set(d.link,this.link2ex.get(d.link).add(i.path)):this.link2ex.set(d.link,new Set().add(i.path))}))}))}clearIndex(i,l){i&&i.extension!=gt||(l||(l=i.path),!!this.ex2link.get(l)&&(this.ex2link.get(l).forEach(d=>{if(!this.link2ex.has(d.link))return;let h=this.link2ex.get(d.link);h.delete(l),h.size>0?this.link2ex.set(d.link,h):this.link2ex.delete(d.link)}),this.ex2link.delete(l)))}static getLinks(i,l,d,h){let v=new Set;if(!i)return v;let S,P,z;for(let H of i)z=H.text,S=z==null?void 0:z.matchAll(ud).next(),h&&(z=""),S&&S.value&&(z=S.value[1]),z!=""&&!(z==null?void 0:z.match(dd))&&!(z==null?void 0:z.match(pd))&&(P=d.metadataCache.getFirstLinkpathDest(z,l),P&&v.add({link:P.path,text:z}));return v}parseLinks(i){var l,d;return xe(this,void 0,void 0,function*(){let h=yield this.app.vault.read(i),v=(d=(l=JSON.parse(h))===null||l===void 0?void 0:l.elements)===null||d===void 0?void 0:d.filter(S=>S.type=="text");return Vc.getLinks(v,i.path,this.app,this.plugin.settings.validLinksOnly)})}updateKey(i,l){!this.link2ex.has(i)||(this.link2ex.set(l,this.link2ex.get(i)),this.link2ex.delete(i))}getLinkTextForDrawing(i,l){if(!!this.ex2link.has(i)){for(let d of this.ex2link.get(i))if(d.link==l)return d.text}}registerEventHandlers(){let i=h=>{h instanceof be.TFile&&h.extension==gt&&this.indexFile(h)},l=h=>{this.clearIndex(h)},d=(h,v)=>{!v.endsWith("."+gt)||(this.clearIndex(null,v),i(h))};this.app.vault.on("create",i),this.vaultEventHandlers.set("create",i),this.app.vault.on("modify",i),this.vaultEventHandlers.set("modify",i),this.app.vault.on("delete",l),this.vaultEventHandlers.set("delete",l),this.app.vault.on("rename",d),this.vaultEventHandlers.set("rename",d)}deregisterEventHandlers(){for(let i of this.vaultEventHandlers.keys())this.app.vault.off(i,this.vaultEventHandlers.get(i))}},ky=class extends be.Modal{constructor(i,l,d){super(i);this.prompt_text=l,this.default_value=d}onOpen(){this.titleEl.setText(this.prompt_text),this.createForm()}onClose(){this.contentEl.empty()}createForm(){var i;let l=this.contentEl.createDiv();l.addClass("excalidarw-prompt-div");let d=l.createEl("form");d.addClass("excalidraw-prompt-form"),d.type="submit",d.onsubmit=h=>{h.preventDefault(),this.resolve(this.promptEl.value),this.close()},this.promptEl=d.createEl("input"),this.promptEl.type="text",this.promptEl.placeholder="$\\theta$",this.promptEl.value=(i=this.default_value)!==null&&i!==void 0?i:"",this.promptEl.addClass("excalidraw-prompt-input"),this.promptEl.select()}openAndGetValue(i){return xe(this,void 0,void 0,function*(){this.resolve=i,this.open()})}},Sy=class extends be.Plugin{constructor(i,l){super(i,l);this.activeExcalidrawView=null,this.lastActiveExcalidrawFilePath=null,this.workspaceEventHandlers=new Map,this.vaultEventHandlers=new Map,this.hover={linkText:null,sourcePath:null},this.excalidrawSync=new Set,this.syncModifyCreate=null}onload(){return xe(this,void 0,void 0,function*(){be.addIcon(Ds,t3),be.addIcon(S1,_4),be.addIcon(C1,$4),be.addIcon(P1,e3);let i=document.createElement("style");i.appendChild(document.createTextNode(M1)),i.appendChild(document.createTextNode(O1)),document.head.appendChild(i),yield this.loadSettings(),this.addSettingTab(new yy(this.app,this)),this.registerView(dn,l=>new gn(l,this)),E6(this),this.registerExtensions([gt],dn),this.addMarkdownPostProcessor(),this.addCommands(),this.linkIndex=new Vc(this),this.app.workspace.layoutReady?this.addEventListeners(this):this.registerEvent(this.app.workspace.on("layout-ready",()=>xe(this,void 0,void 0,function*(){return this.addEventListeners(this)})))})}addMarkdownPostProcessor(){let i=h=>xe(this,void 0,void 0,function*(){let v=this.app.vault.getAbstractFileByPath(h.fname);if(!(v&&v instanceof be.TFile))return null;let S=yield this.app.vault.read(v),P={withBackground:this.settings.exportWithBackground,withTheme:this.settings.exportWithTheme},z=gn.getSVG(S,P);if(!z)return null;z=gn.embedFontsInSVG(z);let H=createEl("img");return z.removeAttribute("width"),z.removeAttribute("height"),H.setAttribute("width",h.fwidth),h.fheight&&H.setAttribute("height",h.fheight),H.addClass(h.style),H.setAttribute("src","data:image/svg+xml;base64,"+btoa(unescape(encodeURIComponent(z.outerHTML)))),H}),l=(h,v)=>xe(this,void 0,void 0,function*(){let S=h.querySelectorAll('.internal-embed[src$=".excalidraw"]'),P,z,H,X,I,D,E,R,x;for(let C of S)P=C.getAttribute("src"),z=C.getAttribute("width"),H=C.getAttribute("height"),X=C.getAttribute("alt"),X==P&&(X=""),I="excalidraw-svg",X&&(C.tagName.toLowerCase()=="span"&&(X="|"+X),E=X.match(/[^\|]*\|?(\d*)x?(\d*)\|?(.*)/),z=E[1]?E[1]:this.settings.width,H=E[2],E[3]!=P&&(I="excalidraw-svg"+(E[3]?"-"+E[3]:""))),x=this.app.metadataCache.getFirstLinkpathDest(P,v.sourcePath),x?(P=x==null?void 0:x.path,D=yield i({fname:P,fwidth:z,fheight:H,style:I}),R=createDiv(I,T=>{T.append(D),T.setAttribute("src",x.path),T.setAttribute("w",z),T.setAttribute("h",H),T.onClickEvent(F=>{if(F.target instanceof Element&&F.target.tagName.toLowerCase()!="img")return;let G=T.getAttribute("src");G&&this.openDrawing(this.app.vault.getAbstractFileByPath(G),F.ctrlKey||F.metaKey)}),T.addEventListener(x1,F=>xe(this,void 0,void 0,function*(){F.stopPropagation,T.empty();let G=yield i({fname:T.getAttribute("src"),fwidth:T.getAttribute("w"),fheight:T.getAttribute("h"),style:T.getAttribute("class")});T.append(G)}))})):R=createDiv("excalidraw-new",T=>{T.setAttribute("src",P),T.createSpan("internal-embed file-embed mod-empty is-loaded",F=>{F.setText('"'+P+'" is not created yet. Click to create.')}),T.onClickEvent(F=>xe(this,void 0,void 0,function*(){let G=T.getAttribute("src");if(!G)return;let V=G.lastIndexOf("/");V>-1?this.createDrawing(G.substring(V+1),!1,G.substring(0,V)):this.createDrawing(G,!1)}))}),C.parentElement.replaceChild(R,C)});this.registerMarkdownPostProcessor(l);let d=h=>{if(!!h.linktext){if(!h.linktext.endsWith("."+gt)){this.hover.linkText=null;return}this.hover.linkText=h.linktext,this.hover.sourcePath=h.sourcePath}};this.app.workspace.on("hover-link",d),this.workspaceEventHandlers.set("hover-link",d),this.observer=new MutationObserver(h=>{if(!this.hover.linkText||h.length!=1||h[0].addedNodes.length!=1||h[0].addedNodes[0].className!="popover hover-popover file-embed is-loaded")return;let v=h[0].addedNodes[0];v.empty();let S=this.app.metadataCache.getFirstLinkpathDest(this.hover.linkText,this.hover.sourcePath?this.hover.sourcePath:"");if(S){let P=createDiv("",z=>xe(this,void 0,void 0,function*(){let H=yield i({fname:S.path,fwidth:300,fheight:null,style:"excalidraw-svg"});z.appendChild(H),z.setAttribute("src",S.path),z.onClickEvent(X=>{X.stopImmediatePropagation();let I=z.getAttribute("src");I&&this.openDrawing(this.app.vault.getAbstractFileByPath(I),X.ctrlKey||X.metaKey)})}));v.appendChild(P)}}),this.observer.observe(document,{childList:!0,subtree:!0})}addCommands(){this.openDialog=new wy(this.app,this),this.addRibbonIcon(Ds,"Create a new drawing in Excalidraw",d=>xe(this,void 0,void 0,function*(){this.createDrawing(this.getNextDefaultFilename(),d.ctrlKey||d.metaKey)}));let i=(d,h)=>{h instanceof be.TFolder&&d.addItem(v=>{v.setTitle("Create Excalidraw drawing").setIcon(Ds).onClick(S=>{this.createDrawing(this.getNextDefaultFilename(),!1,h.path)})})};this.registerEvent(this.app.workspace.on("file-menu",i)),this.workspaceEventHandlers.set("file-menu",i),this.addCommand({id:"excalidraw-open",name:"Open an existing drawing - IN A NEW PANE",callback:()=>{this.openDialog.start(vn.openFile,!0)}}),this.addCommand({id:"excalidraw-open-on-current",name:"Open an existing drawing - IN THE CURRENT ACTIVE PANE",callback:()=>{this.openDialog.start(vn.openFile,!1)}}),this.addCommand({id:"excalidraw-insert-transclusion",name:"Transclude (embed) an Excalidraw drawing",checkCallback:d=>d?this.app.workspace.activeLeaf.view.getViewType()=="markdown":(this.openDialog.start(vn.insertLinkToDrawing,!1),!0)}),this.addCommand({id:"excalidraw-insert-last-active-transclusion",name:"Transclude (embed) the most recently edited Excalidraw drawing",checkCallback:d=>d?this.app.workspace.activeLeaf.view.getViewType()=="markdown"&&this.lastActiveExcalidrawFilePath!=null:(this.embedDrawing(this.lastActiveExcalidrawFilePath),!0)}),this.addCommand({id:"excalidraw-autocreate",name:"Create a new drawing - IN A NEW PANE",callback:()=>{this.createDrawing(this.getNextDefaultFilename(),!0)}}),this.addCommand({id:"excalidraw-autocreate-on-current",name:"Create a new drawing - IN THE CURRENT ACTIVE PANE",callback:()=>{this.createDrawing(this.getNextDefaultFilename(),!1)}}),this.addCommand({id:"excalidraw-autocreate-and-embed",name:"Create a new drawing - IN A NEW PANE - and embed in current document",checkCallback:d=>{if(d)return this.app.workspace.activeLeaf.view.getViewType()=="markdown";{let h=this.getNextDefaultFilename();return this.embedDrawing(h),this.createDrawing(h,!0),!0}}}),this.addCommand({id:"excalidraw-autocreate-and-embed-on-current",name:"Create a new drawing - IN THE CURRENT ACTIVE PANE - and embed in current document",checkCallback:d=>{if(d)return this.app.workspace.activeLeaf.view.getViewType()=="markdown";{let h=this.getNextDefaultFilename();return this.embedDrawing(h),this.createDrawing(h,!1),!0}}}),this.addCommand({id:"export-svg",name:"Export SVG. Save it next to the current file",checkCallback:d=>{if(d)return this.app.workspace.activeLeaf.view.getViewType()==dn;{let h=this.app.workspace.activeLeaf.view;return h instanceof gn?(h.saveSVG(),!0):!1}}}),this.addCommand({id:"export-png",name:"Export PNG. Save it next to the current file",checkCallback:d=>{if(d)return this.app.workspace.activeLeaf.view.getViewType()==dn;{let h=this.app.workspace.activeLeaf.view;return h instanceof gn?(h.savePNG(),!0):!1}}}),this.addCommand({id:"insert-link",name:"Insert link to file",checkCallback:d=>{if(d)return this.app.workspace.activeLeaf.view.getViewType()==dn;{let h=this.app.workspace.activeLeaf.view;return h instanceof gn?(this.openDialog.insertLink(h.file.path,h.addText),!0):!1}}}),this.addCommand({id:"insert-LaTeX-symbol",name:"Insert LaTeX-symbol (e.g. $\\theta$)",checkCallback:d=>{if(d)return this.app.workspace.activeLeaf.view.getViewType()==dn;{let h=this.app.workspace.activeLeaf.view;return h instanceof gn?(new ky(this.app,"Enter a valid LaTeX expression","").openAndGetValue(S=>xe(this,void 0,void 0,function*(){if(!S)return;let P=createEl("p");yield be.MarkdownRenderer.renderMarkdown(S,P,"",this),h.addText(P.getText()),P.empty()})),!0):!1}}});let l=()=>xe(this,void 0,void 0,function*(){let d=new Date().getTime(),h=0,v=this.app.vault.getMarkdownFiles(),S,P=new RegExp(String.fromCharCode(96,96,96)+"excalidraw\\s+([^`]*)\\s+"+String.fromCharCode(96,96,96),"gms");for(let H of v){S=yield this.app.vault.read(H);for(let X of[...S.matchAll(P)])X[0]&&X[1]&&(S=S.split(X[0]).join("!"+X[1]),h++);yield this.app.vault.modify(H,S)}let z=new Date().getTime()-d;console.log(`Excalidraw: Parsed ${v.length} markdown files - and made ${h} replacements in ${z/1e3} seconds.`)});this.addCommand({id:"migrate-codeblock-transclusions",name:"MIGRATE to version 1.1: Replace codeblocks with ![[...]] style embedments",callback:()=>xe(this,void 0,void 0,function*(){return l()})})}initiateSync(){if(!this.syncModifyCreate)return;let i=this.app.vault.getFiles();(i||[]).filter(l=>l.path.startsWith(this.settings.syncFolder)&&l.extension=="md").forEach(l=>this.syncModifyCreate(l)),(i||[]).filter(l=>!l.path.startsWith(this.settings.syncFolder)&&l.extension==gt).forEach(l=>this.syncModifyCreate(l))}reloadIndex(){return xe(this,void 0,void 0,function*(){this.linkIndex.reloadIndex()})}addEventListeners(i){return xe(this,void 0,void 0,function*(){i.linkIndex.initialize();let l=E=>xe(this,void 0,void 0,function*(){let R=i.app.workspace.getLeavesOfType(dn);for(let x=0;xxe(this,void 0,void 0,function*(){let x=i.app.vault.getAbstractFileByPath(R);if(!(x&&x instanceof be.TFile))return;let C=i.app.workspace.getLeavesOfType(dn);for(let T=0;Txe(this,void 0,void 0,function*(){let R=E.split("/");R.pop();let x=R.join("/");i.app.vault.getAbstractFileByPath(x)||(yield i.app.vault.createFolder(x))}),v=E=>be.normalizePath(i.settings.syncFolder)+"/"+E.slice(0,E.length-Q4)+"md",S=E=>{let R=be.normalizePath(i.settings.syncFolder)+"/",x=E.slice(R.length);return x.slice(0,x.length-2)+gt},P=(E,R)=>xe(this,void 0,void 0,function*(){yield h(R);let x=i.app.vault.getAbstractFileByPath(R);i.excalidrawSync.add(R),x&&x instanceof be.TFile?yield i.app.vault.modify(x,yield i.app.vault.read(E)):yield i.app.vault.create(R,yield i.app.vault.read(E))}),z=E=>xe(this,void 0,void 0,function*(){if(E instanceof be.TFile){if(i.excalidrawSync.has(E.path)){i.excalidrawSync.delete(E.path);return}if(i.settings.excalidrawSync)switch(E.extension){case gt:let R=v(E.path);yield P(E,R);break;case"md":if(E.path.startsWith(be.normalizePath(i.settings.syncFolder))){let x=S(E.path);yield P(E,x),d(x,x)}break}}});this.syncModifyCreate=z,i.app.vault.on("create",z),i.app.vault.on("modify",z),this.vaultEventHandlers.set("create",z),this.vaultEventHandlers.set("modify",z);let H=(E,R)=>xe(this,void 0,void 0,function*(){if(!(E instanceof be.TFile))return;if(i.settings.excalidrawSync)if(i.excalidrawSync.has(E.path))i.excalidrawSync.delete(E.path);else switch(E.extension){case gt:let F=v(R),G=v(E.path),V=i.app.vault.getAbstractFileByPath(F);V&&V instanceof be.TFile?(i.excalidrawSync.add(G),yield h(G),yield i.app.vault.rename(V,G)):yield P(E,G);break;case"md":if(E.path.startsWith(be.normalizePath(i.settings.syncFolder))){let m=S(R),j=S(E.path),ne=i.app.vault.getAbstractFileByPath(m);ne&&ne instanceof be.TFile?(i.excalidrawSync.add(j),yield h(j),yield i.app.vault.rename(ne,j)):yield P(E,j),d(ne.path,j)}break}let x=F=>F.extension=="md"?F.path.substr(0,F.path.length-3):F.path;if(i.linkIndex.link2ex.has(R)){let F,G,V,m,j,ne;i.linkIndex.updateKey(R,E.path);for(let Q of i.linkIndex.link2ex.get(E.path))if(j=i.app.vault.getAbstractFileByPath(Q),j&&j instanceof be.TFile){m=JSON.parse(yield i.app.vault.read(j)),V=i.linkIndex.getLinkTextForDrawing(Q,R);for(let se of m.elements.filter(nt=>nt.type=="text"))F=se.text,G=F==null?void 0:F.matchAll(ud).next(),G&&G.value&&(F=G.value[1]),!(F==null?void 0:F.match(dd))&&!(F==null?void 0:F.match(pd))&&V==F&&(G&&G.value?se.text=se.text.replace("[["+F+"]]","[["+x(E)+"]]"):se.text=x(E),ne=Ey(se.text,se.fontSize,se.fontFamily),se.width=ne.w,se.height=ne.h,se.baseline=ne.baseline);yield i.app.vault.modify(j,JSON.stringify(m)),d(Q,Q)}}if(E.extension!=gt||!i.settings.keepInSync)return;let C=R.substring(0,R.lastIndexOf("."+gt))+".svg",T=i.app.vault.getAbstractFileByPath(be.normalizePath(C));if(T&&T instanceof be.TFile){let F=E.path.substring(0,E.path.lastIndexOf("."+gt))+".svg";yield i.app.vault.rename(T,F)}});i.app.vault.on("rename",H),this.vaultEventHandlers.set("rename",H);let X=E=>xe(this,void 0,void 0,function*(){if(E instanceof be.TFile){if(i.settings.excalidrawSync)if(i.excalidrawSync.has(E.path))i.excalidrawSync.delete(E.path);else switch(E.extension){case gt:let R=v(E.path),x=i.app.vault.getAbstractFileByPath(R);x&&x instanceof be.TFile&&(i.excalidrawSync.add(x.path),i.app.vault.delete(x));break;case"md":if(E.path.startsWith(be.normalizePath(i.settings.syncFolder))){let C=S(E.path),T=i.app.vault.getAbstractFileByPath(C);T&&T instanceof be.TFile&&(i.excalidrawSync.add(T.path),yield l(T.path),i.app.vault.delete(T))}break}if(E.extension==gt&&(l(E.path),i.settings.keepInSync)){let R=E.path.substring(0,E.path.lastIndexOf("."+gt))+".svg",x=i.app.vault.getAbstractFileByPath(be.normalizePath(R));x&&x instanceof be.TFile&&(yield i.app.vault.delete(x))}}});i.app.vault.on("delete",X),this.vaultEventHandlers.set("delete",X);let I=E=>{let R=i.app.workspace.getLeavesOfType(dn);for(let x=0;x{var R,x;i.activeExcalidrawView&&(i.activeExcalidrawView.save(),i.triggerEmbedUpdates((R=i.activeExcalidrawView.file)===null||R===void 0?void 0:R.path)),i.activeExcalidrawView=E.view.getViewType()==dn?E.view:null,i.activeExcalidrawView&&(i.lastActiveExcalidrawFilePath=(x=i.activeExcalidrawView.file)===null||x===void 0?void 0:x.path)};i.app.workspace.on("active-leaf-change",D),this.workspaceEventHandlers.set("active-leaf-change",D)})}onunload(){k6();for(let i of this.vaultEventHandlers.keys())this.app.vault.off(i,this.vaultEventHandlers.get(i));for(let i of this.workspaceEventHandlers.keys())this.app.workspace.off(i,this.workspaceEventHandlers.get(i));this.observer.disconnect(),this.linkIndex.deregisterEventHandlers()}embedDrawing(i){let l=this.app.workspace.getActiveViewOfType(be.MarkdownView);if(l){let d=l.editor;d.replaceSelection("![["+i+"]]"),d.focus()}}loadSettings(){return xe(this,void 0,void 0,function*(){this.settings=Object.assign({},v6,yield this.loadData())})}saveSettings(){return xe(this,void 0,void 0,function*(){yield this.saveData(this.settings)})}triggerEmbedUpdates(i){let l=document.createEvent("Event");l.initEvent(x1,!0,!1),document.querySelectorAll("div[class^='excalidraw-svg']"+(i?"[src='"+i.replaceAll("'","\\'")+"']":"")).forEach(d=>d.dispatchEvent(l))}openDrawing(i,l){let d=this.app.workspace.getLeavesOfType(dn),h=null;(d==null?void 0:d.length)>0&&(h=d[0]),h||(h=this.app.workspace.activeLeaf),h||(h=this.app.workspace.getLeaf()),l&&(h=this.app.workspace.createLeafBySplit(h)),h.setViewState({type:dn,state:{file:i.path}})}getNextDefaultFilename(){return this.settings.drawingFilenamePrefix+window.moment().format(this.settings.drawingFilenameDateTime)+"."+gt}createDrawing(i,l,d,h){return xe(this,void 0,void 0,function*(){let v=be.normalizePath(d||this.settings.folder),S=v+"/"+i,P=this.app.vault.getAbstractFileByPath(v);P&&P instanceof be.TFolder||(yield this.app.vault.createFolder(v));let z=this.app.vault.getAbstractFileByPath(S),H=0;for(;z;)S=v+"/"+i.slice(0,i.lastIndexOf("."))+"_"+H+i.slice(i.lastIndexOf(".")),H++,z=this.app.vault.getAbstractFileByPath(S);if(h){this.openDrawing(yield this.app.vault.create(S,h),l);return}let X=this.app.vault.getAbstractFileByPath(be.normalizePath(this.settings.templateFilePath));if(X&&X instanceof be.TFile){let I=yield this.app.vault.read(X);this.openDrawing(yield this.app.vault.create(S,I==""?E1:I),l)}else this.openDrawing(yield this.app.vault.create(S,E1),l)})}};module.exports=Sy; -/* -object-assign -(c) Sindre Sorhus -@license MIT -*/ -/*! ***************************************************************************** -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -***************************************************************************** */ -/*! For license information please see excalidraw.production.min.js.LICENSE.txt */ diff --git a/.obsidian/plugins/obsidian-excalidraw-plugin/manifest.json b/.obsidian/plugins/obsidian-excalidraw-plugin/manifest.json deleted file mode 100644 index cd47fbec4..000000000 --- a/.obsidian/plugins/obsidian-excalidraw-plugin/manifest.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "id": "obsidian-excalidraw-plugin", - "name": "Excalidraw", - "version": "1.1.9", - "minAppVersion": "0.11.13", - "description": "An Obsidian plugin to edit and view Excalidraw drawings", - "author": "Zsolt Viczian", - "authorUrl": "https://zsolt.blog", - "isDesktopOnly": false -} diff --git a/.obsidian/plugins/obsidian-excalidraw-plugin/styles.css b/.obsidian/plugins/obsidian-excalidraw-plugin/styles.css deleted file mode 100644 index ee212e2ca..000000000 --- a/.obsidian/plugins/obsidian-excalidraw-plugin/styles.css +++ /dev/null @@ -1 +0,0 @@ -.App{font-family:sans-serif;text-align:center}.excalidraw-wrapper{height:100%;margin:0px;background-color:#fff}.context-menu-option__shortcut{background-color:transparent!important}.block-language-excalidraw{text-align:center}.excalidraw .github-corner{display:none}img.excalidraw-svg-right-wrap{float:right;margin:0px 0px 20px 20px}img.excalidraw-svg-left-wrap{float:left;margin:0px 35px 20px 0px}img.excalidraw-svg-right{float:right}img.excalidraw-svg-left{float:left}div.excalidraw-svg-right,div.excalidraw-svg-left{display:table;width:100%}button.ToolIcon_type_button[title=Export]{display:none}.excalidraw-prompt-div{display:flex}.excalidraw-prompt-form{display:flex;flex-grow:1}.excalidraw-prompt-input{flex-grow:1} diff --git a/.obsidian/plugins/obsidian-git/data.json b/.obsidian/plugins/obsidian-git/data.json deleted file mode 100644 index 72b192885..000000000 --- a/.obsidian/plugins/obsidian-git/data.json +++ /dev/null @@ -1 +0,0 @@ -{"commitMessage":"[[snapshot]]: {{date}}","commitDateFormat":"YYYY-MM-DD HH:mm:ss","autoSaveInterval":1,"autoPullInterval":1,"autoPullOnBoot":true,"disablePush":false,"pullBeforePush":true,"disablePopups":false,"listChangedFilesInMessageBody":true,"showStatusBar":true,"lastAutoBackUp":"Sat Jul 03 2021 11:50:30 GMT+0200 (Central European Summer Time)","lastAutoPull":"Sat Jul 03 2021 11:50:30 GMT+0200 (Central European Summer Time)"} \ No newline at end of file diff --git a/.obsidian/plugins/obsidian-git/main.js b/.obsidian/plugins/obsidian-git/main.js deleted file mode 100644 index 145bac3e5..000000000 --- a/.obsidian/plugins/obsidian-git/main.js +++ /dev/null @@ -1,6583 +0,0 @@ -'use strict'; - -var child_process_1 = require('child_process'); -var obsidian = require('obsidian'); -var fs_1 = require('fs'); -var tty = require('tty'); -var util$1 = require('util'); -var os = require('os'); - -function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } - -var child_process_1__default = /*#__PURE__*/_interopDefaultLegacy(child_process_1); -var fs_1__default = /*#__PURE__*/_interopDefaultLegacy(fs_1); -var tty__default = /*#__PURE__*/_interopDefaultLegacy(tty); -var util__default = /*#__PURE__*/_interopDefaultLegacy(util$1); -var os__default = /*#__PURE__*/_interopDefaultLegacy(os); - -/*! ***************************************************************************** -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -***************************************************************************** */ -/* global Reflect, Promise */ - -var extendStatics = function(d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); -}; - -function __extends(d, b) { - if (typeof b !== "function" && b !== null) - throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -} - -var __assign = function() { - __assign = Object.assign || function __assign(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); -}; - -function __awaiter(thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -} - -function __generator(thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -} - -function __spreadArray(to, from) { - for (var i = 0, il = from.length, j = to.length; i < il; i++, j++) - to[j] = from[i]; - return to; -} - -var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; - -function createCommonjsModule(fn, basedir, module) { - return module = { - path: basedir, - exports: {}, - require: function (path, base) { - return commonjsRequire(path, (base === undefined || base === null) ? module.path : base); - } - }, fn(module, module.exports), module.exports; -} - -function commonjsRequire () { - throw new Error('Dynamic requires are not currently supported by @rollup/plugin-commonjs'); -} - -var gitError = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.GitError = void 0; -/** - * The `GitError` is thrown when the underlying `git` process throws a - * fatal exception (eg an `ENOENT` exception when attempting to use a - * non-writable directory as the root for your repo), and acts as the - * base class for more specific errors thrown by the parsing of the - * git response or errors in the configuration of the task about to - * be run. - * - * When an exception is thrown, pending tasks in the same instance will - * not be executed. The recommended way to run a series of tasks that - * can independently fail without needing to prevent future tasks from - * running is to catch them individually: - * - * ```typescript - import { gitP, SimpleGit, GitError, PullResult } from 'simple-git'; - - function catchTask (e: GitError) { - return e. - } - - const git = gitP(repoWorkingDir); - const pulled: PullResult | GitError = await git.pull().catch(catchTask); - const pushed: string | GitError = await git.pushTags().catch(catchTask); - ``` - */ -class GitError extends Error { - constructor(task, message) { - super(message); - this.task = task; - Object.setPrototypeOf(this, new.target.prototype); - } -} -exports.GitError = GitError; -//# sourceMappingURL=git-error.js.map -}); - -var gitResponseError = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.GitResponseError = void 0; - -/** - * The `GitResponseError` is the wrapper for a parsed response that is treated as - * a fatal error, for example attempting a `merge` can leave the repo in a corrupted - * state when there are conflicts so the task will reject rather than resolve. - * - * For example, catching the merge conflict exception: - * - * ```typescript - import { gitP, SimpleGit, GitResponseError, MergeSummary } from 'simple-git'; - - const git = gitP(repoRoot); - const mergeOptions: string[] = ['--no-ff', 'other-branch']; - const mergeSummary: MergeSummary = await git.merge(mergeOptions) - .catch((e: GitResponseError) => e.git); - - if (mergeSummary.failed) { - // deal with the error - } - ``` - */ -class GitResponseError extends gitError.GitError { - constructor( - /** - * `.git` access the parsed response that is treated as being an error - */ - git, message) { - super(undefined, message || String(git)); - this.git = git; - } -} -exports.GitResponseError = GitResponseError; -//# sourceMappingURL=git-response-error.js.map -}); - -var gitConstructError = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.GitConstructError = void 0; - -/** - * The `GitConstructError` is thrown when an error occurs in the constructor - * of the `simple-git` instance itself. Most commonly as a result of using - * a `baseDir` option that points to a folder that either does not exist, - * or cannot be read by the user the node script is running as. - * - * Check the `.message` property for more detail including the properties - * passed to the constructor. - */ -class GitConstructError extends gitError.GitError { - constructor(config, message) { - super(undefined, message); - this.config = config; - } -} -exports.GitConstructError = GitConstructError; -//# sourceMappingURL=git-construct-error.js.map -}); - -var gitPluginError = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.GitPluginError = void 0; - -class GitPluginError extends gitError.GitError { - constructor(task, plugin, message) { - super(task, message); - this.task = task; - this.plugin = plugin; - Object.setPrototypeOf(this, new.target.prototype); - } -} -exports.GitPluginError = GitPluginError; -//# sourceMappingURL=git-plugin-error.js.map -}); - -var taskConfigurationError = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TaskConfigurationError = void 0; - -/** - * The `TaskConfigurationError` is thrown when a command was incorrectly - * configured. An error of this kind means that no attempt was made to - * run your command through the underlying `git` binary. - * - * Check the `.message` property for more detail on why your configuration - * resulted in an error. - */ -class TaskConfigurationError extends gitError.GitError { - constructor(message) { - super(undefined, message); - } -} -exports.TaskConfigurationError = TaskConfigurationError; -//# sourceMappingURL=task-configuration-error.js.map -}); - -/** - * Helpers. - */ - -var s = 1000; -var m = s * 60; -var h = m * 60; -var d = h * 24; -var w = d * 7; -var y = d * 365.25; - -/** - * Parse or format the given `val`. - * - * Options: - * - * - `long` verbose formatting [false] - * - * @param {String|Number} val - * @param {Object} [options] - * @throws {Error} throw an error if val is not a non-empty string or a number - * @return {String|Number} - * @api public - */ - -var ms = function(val, options) { - options = options || {}; - var type = typeof val; - if (type === 'string' && val.length > 0) { - return parse(val); - } else if (type === 'number' && isFinite(val)) { - return options.long ? fmtLong(val) : fmtShort(val); - } - throw new Error( - 'val is not a non-empty string or a valid number. val=' + - JSON.stringify(val) - ); -}; - -/** - * Parse the given `str` and return milliseconds. - * - * @param {String} str - * @return {Number} - * @api private - */ - -function parse(str) { - str = String(str); - if (str.length > 100) { - return; - } - var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec( - str - ); - if (!match) { - return; - } - var n = parseFloat(match[1]); - var type = (match[2] || 'ms').toLowerCase(); - switch (type) { - case 'years': - case 'year': - case 'yrs': - case 'yr': - case 'y': - return n * y; - case 'weeks': - case 'week': - case 'w': - return n * w; - case 'days': - case 'day': - case 'd': - return n * d; - case 'hours': - case 'hour': - case 'hrs': - case 'hr': - case 'h': - return n * h; - case 'minutes': - case 'minute': - case 'mins': - case 'min': - case 'm': - return n * m; - case 'seconds': - case 'second': - case 'secs': - case 'sec': - case 's': - return n * s; - case 'milliseconds': - case 'millisecond': - case 'msecs': - case 'msec': - case 'ms': - return n; - default: - return undefined; - } -} - -/** - * Short format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function fmtShort(ms) { - var msAbs = Math.abs(ms); - if (msAbs >= d) { - return Math.round(ms / d) + 'd'; - } - if (msAbs >= h) { - return Math.round(ms / h) + 'h'; - } - if (msAbs >= m) { - return Math.round(ms / m) + 'm'; - } - if (msAbs >= s) { - return Math.round(ms / s) + 's'; - } - return ms + 'ms'; -} - -/** - * Long format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function fmtLong(ms) { - var msAbs = Math.abs(ms); - if (msAbs >= d) { - return plural(ms, msAbs, d, 'day'); - } - if (msAbs >= h) { - return plural(ms, msAbs, h, 'hour'); - } - if (msAbs >= m) { - return plural(ms, msAbs, m, 'minute'); - } - if (msAbs >= s) { - return plural(ms, msAbs, s, 'second'); - } - return ms + ' ms'; -} - -/** - * Pluralization helper. - */ - -function plural(ms, msAbs, n, name) { - var isPlural = msAbs >= n * 1.5; - return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : ''); -} - -/** - * This is the common logic for both the Node.js and web browser - * implementations of `debug()`. - */ - -function setup(env) { - createDebug.debug = createDebug; - createDebug.default = createDebug; - createDebug.coerce = coerce; - createDebug.disable = disable; - createDebug.enable = enable; - createDebug.enabled = enabled; - createDebug.humanize = ms; - createDebug.destroy = destroy; - - Object.keys(env).forEach(key => { - createDebug[key] = env[key]; - }); - - /** - * The currently active debug mode names, and names to skip. - */ - - createDebug.names = []; - createDebug.skips = []; - - /** - * Map of special "%n" handling functions, for the debug "format" argument. - * - * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N". - */ - createDebug.formatters = {}; - - /** - * Selects a color for a debug namespace - * @param {String} namespace The namespace string for the for the debug instance to be colored - * @return {Number|String} An ANSI color code for the given namespace - * @api private - */ - function selectColor(namespace) { - let hash = 0; - - for (let i = 0; i < namespace.length; i++) { - hash = ((hash << 5) - hash) + namespace.charCodeAt(i); - hash |= 0; // Convert to 32bit integer - } - - return createDebug.colors[Math.abs(hash) % createDebug.colors.length]; - } - createDebug.selectColor = selectColor; - - /** - * Create a debugger with the given `namespace`. - * - * @param {String} namespace - * @return {Function} - * @api public - */ - function createDebug(namespace) { - let prevTime; - let enableOverride = null; - - function debug(...args) { - // Disabled? - if (!debug.enabled) { - return; - } - - const self = debug; - - // Set `diff` timestamp - const curr = Number(new Date()); - const ms = curr - (prevTime || curr); - self.diff = ms; - self.prev = prevTime; - self.curr = curr; - prevTime = curr; - - args[0] = createDebug.coerce(args[0]); - - if (typeof args[0] !== 'string') { - // Anything else let's inspect with %O - args.unshift('%O'); - } - - // Apply any `formatters` transformations - let index = 0; - args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => { - // If we encounter an escaped % then don't increase the array index - if (match === '%%') { - return '%'; - } - index++; - const formatter = createDebug.formatters[format]; - if (typeof formatter === 'function') { - const val = args[index]; - match = formatter.call(self, val); - - // Now we need to remove `args[index]` since it's inlined in the `format` - args.splice(index, 1); - index--; - } - return match; - }); - - // Apply env-specific formatting (colors, etc.) - createDebug.formatArgs.call(self, args); - - const logFn = self.log || createDebug.log; - logFn.apply(self, args); - } - - debug.namespace = namespace; - debug.useColors = createDebug.useColors(); - debug.color = createDebug.selectColor(namespace); - debug.extend = extend; - debug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release. - - Object.defineProperty(debug, 'enabled', { - enumerable: true, - configurable: false, - get: () => enableOverride === null ? createDebug.enabled(namespace) : enableOverride, - set: v => { - enableOverride = v; - } - }); - - // Env-specific initialization logic for debug instances - if (typeof createDebug.init === 'function') { - createDebug.init(debug); - } - - return debug; - } - - function extend(namespace, delimiter) { - const newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace); - newDebug.log = this.log; - return newDebug; - } - - /** - * Enables a debug mode by namespaces. This can include modes - * separated by a colon and wildcards. - * - * @param {String} namespaces - * @api public - */ - function enable(namespaces) { - createDebug.save(namespaces); - - createDebug.names = []; - createDebug.skips = []; - - let i; - const split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); - const len = split.length; - - for (i = 0; i < len; i++) { - if (!split[i]) { - // ignore empty strings - continue; - } - - namespaces = split[i].replace(/\*/g, '.*?'); - - if (namespaces[0] === '-') { - createDebug.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); - } else { - createDebug.names.push(new RegExp('^' + namespaces + '$')); - } - } - } - - /** - * Disable debug output. - * - * @return {String} namespaces - * @api public - */ - function disable() { - const namespaces = [ - ...createDebug.names.map(toNamespace), - ...createDebug.skips.map(toNamespace).map(namespace => '-' + namespace) - ].join(','); - createDebug.enable(''); - return namespaces; - } - - /** - * Returns true if the given mode name is enabled, false otherwise. - * - * @param {String} name - * @return {Boolean} - * @api public - */ - function enabled(name) { - if (name[name.length - 1] === '*') { - return true; - } - - let i; - let len; - - for (i = 0, len = createDebug.skips.length; i < len; i++) { - if (createDebug.skips[i].test(name)) { - return false; - } - } - - for (i = 0, len = createDebug.names.length; i < len; i++) { - if (createDebug.names[i].test(name)) { - return true; - } - } - - return false; - } - - /** - * Convert regexp to namespace - * - * @param {RegExp} regxep - * @return {String} namespace - * @api private - */ - function toNamespace(regexp) { - return regexp.toString() - .substring(2, regexp.toString().length - 2) - .replace(/\.\*\?$/, '*'); - } - - /** - * Coerce `val`. - * - * @param {Mixed} val - * @return {Mixed} - * @api private - */ - function coerce(val) { - if (val instanceof Error) { - return val.stack || val.message; - } - return val; - } - - /** - * XXX DO NOT USE. This is a temporary stub function. - * XXX It WILL be removed in the next major release. - */ - function destroy() { - console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'); - } - - createDebug.enable(createDebug.load()); - - return createDebug; -} - -var common = setup; - -var browser = createCommonjsModule(function (module, exports) { -/* eslint-env browser */ - -/** - * This is the web browser implementation of `debug()`. - */ - -exports.formatArgs = formatArgs; -exports.save = save; -exports.load = load; -exports.useColors = useColors; -exports.storage = localstorage(); -exports.destroy = (() => { - let warned = false; - - return () => { - if (!warned) { - warned = true; - console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'); - } - }; -})(); - -/** - * Colors. - */ - -exports.colors = [ - '#0000CC', - '#0000FF', - '#0033CC', - '#0033FF', - '#0066CC', - '#0066FF', - '#0099CC', - '#0099FF', - '#00CC00', - '#00CC33', - '#00CC66', - '#00CC99', - '#00CCCC', - '#00CCFF', - '#3300CC', - '#3300FF', - '#3333CC', - '#3333FF', - '#3366CC', - '#3366FF', - '#3399CC', - '#3399FF', - '#33CC00', - '#33CC33', - '#33CC66', - '#33CC99', - '#33CCCC', - '#33CCFF', - '#6600CC', - '#6600FF', - '#6633CC', - '#6633FF', - '#66CC00', - '#66CC33', - '#9900CC', - '#9900FF', - '#9933CC', - '#9933FF', - '#99CC00', - '#99CC33', - '#CC0000', - '#CC0033', - '#CC0066', - '#CC0099', - '#CC00CC', - '#CC00FF', - '#CC3300', - '#CC3333', - '#CC3366', - '#CC3399', - '#CC33CC', - '#CC33FF', - '#CC6600', - '#CC6633', - '#CC9900', - '#CC9933', - '#CCCC00', - '#CCCC33', - '#FF0000', - '#FF0033', - '#FF0066', - '#FF0099', - '#FF00CC', - '#FF00FF', - '#FF3300', - '#FF3333', - '#FF3366', - '#FF3399', - '#FF33CC', - '#FF33FF', - '#FF6600', - '#FF6633', - '#FF9900', - '#FF9933', - '#FFCC00', - '#FFCC33' -]; - -/** - * Currently only WebKit-based Web Inspectors, Firefox >= v31, - * and the Firebug extension (any Firefox version) are known - * to support "%c" CSS customizations. - * - * TODO: add a `localStorage` variable to explicitly enable/disable colors - */ - -// eslint-disable-next-line complexity -function useColors() { - // NB: In an Electron preload script, document will be defined but not fully - // initialized. Since we know we're in Chrome, we'll just detect this case - // explicitly - if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) { - return true; - } - - // Internet Explorer and Edge do not support colors. - if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) { - return false; - } - - // Is webkit? http://stackoverflow.com/a/16459606/376773 - // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 - return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) || - // Is firebug? http://stackoverflow.com/a/398120/376773 - (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) || - // Is firefox >= v31? - // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages - (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) || - // Double check webkit in userAgent just in case we are in a worker - (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)); -} - -/** - * Colorize log arguments if enabled. - * - * @api public - */ - -function formatArgs(args) { - args[0] = (this.useColors ? '%c' : '') + - this.namespace + - (this.useColors ? ' %c' : ' ') + - args[0] + - (this.useColors ? '%c ' : ' ') + - '+' + module.exports.humanize(this.diff); - - if (!this.useColors) { - return; - } - - const c = 'color: ' + this.color; - args.splice(1, 0, c, 'color: inherit'); - - // The final "%c" is somewhat tricky, because there could be other - // arguments passed either before or after the %c, so we need to - // figure out the correct index to insert the CSS into - let index = 0; - let lastC = 0; - args[0].replace(/%[a-zA-Z%]/g, match => { - if (match === '%%') { - return; - } - index++; - if (match === '%c') { - // We only are interested in the *last* %c - // (the user may have provided their own) - lastC = index; - } - }); - - args.splice(lastC, 0, c); -} - -/** - * Invokes `console.debug()` when available. - * No-op when `console.debug` is not a "function". - * If `console.debug` is not available, falls back - * to `console.log`. - * - * @api public - */ -exports.log = console.debug || console.log || (() => {}); - -/** - * Save `namespaces`. - * - * @param {String} namespaces - * @api private - */ -function save(namespaces) { - try { - if (namespaces) { - exports.storage.setItem('debug', namespaces); - } else { - exports.storage.removeItem('debug'); - } - } catch (error) { - // Swallow - // XXX (@Qix-) should we be logging these? - } -} - -/** - * Load `namespaces`. - * - * @return {String} returns the previously persisted debug modes - * @api private - */ -function load() { - let r; - try { - r = exports.storage.getItem('debug'); - } catch (error) { - // Swallow - // XXX (@Qix-) should we be logging these? - } - - // If debug isn't set in LS, and we're in Electron, try to load $DEBUG - if (!r && typeof process !== 'undefined' && 'env' in process) { - r = process.env.DEBUG; - } - - return r; -} - -/** - * Localstorage attempts to return the localstorage. - * - * This is necessary because safari throws - * when a user disables cookies/localstorage - * and you attempt to access it. - * - * @return {LocalStorage} - * @api private - */ - -function localstorage() { - try { - // TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context - // The Browser also has localStorage in the global context. - return localStorage; - } catch (error) { - // Swallow - // XXX (@Qix-) should we be logging these? - } -} - -module.exports = common(exports); - -const {formatters} = module.exports; - -/** - * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. - */ - -formatters.j = function (v) { - try { - return JSON.stringify(v); - } catch (error) { - return '[UnexpectedJSONParseError]: ' + error.message; - } -}; -}); - -var hasFlag = (flag, argv = process.argv) => { - const prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--'); - const position = argv.indexOf(prefix + flag); - const terminatorPosition = argv.indexOf('--'); - return position !== -1 && (terminatorPosition === -1 || position < terminatorPosition); -}; - -const {env} = process; - -let forceColor; -if (hasFlag('no-color') || - hasFlag('no-colors') || - hasFlag('color=false') || - hasFlag('color=never')) { - forceColor = 0; -} else if (hasFlag('color') || - hasFlag('colors') || - hasFlag('color=true') || - hasFlag('color=always')) { - forceColor = 1; -} - -if ('FORCE_COLOR' in env) { - if (env.FORCE_COLOR === 'true') { - forceColor = 1; - } else if (env.FORCE_COLOR === 'false') { - forceColor = 0; - } else { - forceColor = env.FORCE_COLOR.length === 0 ? 1 : Math.min(parseInt(env.FORCE_COLOR, 10), 3); - } -} - -function translateLevel(level) { - if (level === 0) { - return false; - } - - return { - level, - hasBasic: true, - has256: level >= 2, - has16m: level >= 3 - }; -} - -function supportsColor(haveStream, streamIsTTY) { - if (forceColor === 0) { - return 0; - } - - if (hasFlag('color=16m') || - hasFlag('color=full') || - hasFlag('color=truecolor')) { - return 3; - } - - if (hasFlag('color=256')) { - return 2; - } - - if (haveStream && !streamIsTTY && forceColor === undefined) { - return 0; - } - - const min = forceColor || 0; - - if (env.TERM === 'dumb') { - return min; - } - - if (process.platform === 'win32') { - // Windows 10 build 10586 is the first Windows release that supports 256 colors. - // Windows 10 build 14931 is the first release that supports 16m/TrueColor. - const osRelease = os__default['default'].release().split('.'); - if ( - Number(osRelease[0]) >= 10 && - Number(osRelease[2]) >= 10586 - ) { - return Number(osRelease[2]) >= 14931 ? 3 : 2; - } - - return 1; - } - - if ('CI' in env) { - if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI', 'GITHUB_ACTIONS', 'BUILDKITE'].some(sign => sign in env) || env.CI_NAME === 'codeship') { - return 1; - } - - return min; - } - - if ('TEAMCITY_VERSION' in env) { - return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; - } - - if (env.COLORTERM === 'truecolor') { - return 3; - } - - if ('TERM_PROGRAM' in env) { - const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); - - switch (env.TERM_PROGRAM) { - case 'iTerm.app': - return version >= 3 ? 3 : 2; - case 'Apple_Terminal': - return 2; - // No default - } - } - - if (/-256(color)?$/i.test(env.TERM)) { - return 2; - } - - if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { - return 1; - } - - if ('COLORTERM' in env) { - return 1; - } - - return min; -} - -function getSupportLevel(stream) { - const level = supportsColor(stream, stream && stream.isTTY); - return translateLevel(level); -} - -var supportsColor_1 = { - supportsColor: getSupportLevel, - stdout: translateLevel(supportsColor(true, tty__default['default'].isatty(1))), - stderr: translateLevel(supportsColor(true, tty__default['default'].isatty(2))) -}; - -var node = createCommonjsModule(function (module, exports) { -/** - * Module dependencies. - */ - - - - -/** - * This is the Node.js implementation of `debug()`. - */ - -exports.init = init; -exports.log = log; -exports.formatArgs = formatArgs; -exports.save = save; -exports.load = load; -exports.useColors = useColors; -exports.destroy = util__default['default'].deprecate( - () => {}, - 'Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.' -); - -/** - * Colors. - */ - -exports.colors = [6, 2, 3, 4, 5, 1]; - -try { - // Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json) - // eslint-disable-next-line import/no-extraneous-dependencies - const supportsColor = supportsColor_1; - - if (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) { - exports.colors = [ - 20, - 21, - 26, - 27, - 32, - 33, - 38, - 39, - 40, - 41, - 42, - 43, - 44, - 45, - 56, - 57, - 62, - 63, - 68, - 69, - 74, - 75, - 76, - 77, - 78, - 79, - 80, - 81, - 92, - 93, - 98, - 99, - 112, - 113, - 128, - 129, - 134, - 135, - 148, - 149, - 160, - 161, - 162, - 163, - 164, - 165, - 166, - 167, - 168, - 169, - 170, - 171, - 172, - 173, - 178, - 179, - 184, - 185, - 196, - 197, - 198, - 199, - 200, - 201, - 202, - 203, - 204, - 205, - 206, - 207, - 208, - 209, - 214, - 215, - 220, - 221 - ]; - } -} catch (error) { - // Swallow - we only care if `supports-color` is available; it doesn't have to be. -} - -/** - * Build up the default `inspectOpts` object from the environment variables. - * - * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js - */ - -exports.inspectOpts = Object.keys(process.env).filter(key => { - return /^debug_/i.test(key); -}).reduce((obj, key) => { - // Camel-case - const prop = key - .substring(6) - .toLowerCase() - .replace(/_([a-z])/g, (_, k) => { - return k.toUpperCase(); - }); - - // Coerce string value into JS value - let val = process.env[key]; - if (/^(yes|on|true|enabled)$/i.test(val)) { - val = true; - } else if (/^(no|off|false|disabled)$/i.test(val)) { - val = false; - } else if (val === 'null') { - val = null; - } else { - val = Number(val); - } - - obj[prop] = val; - return obj; -}, {}); - -/** - * Is stdout a TTY? Colored output is enabled when `true`. - */ - -function useColors() { - return 'colors' in exports.inspectOpts ? - Boolean(exports.inspectOpts.colors) : - tty__default['default'].isatty(process.stderr.fd); -} - -/** - * Adds ANSI color escape codes if enabled. - * - * @api public - */ - -function formatArgs(args) { - const {namespace: name, useColors} = this; - - if (useColors) { - const c = this.color; - const colorCode = '\u001B[3' + (c < 8 ? c : '8;5;' + c); - const prefix = ` ${colorCode};1m${name} \u001B[0m`; - - args[0] = prefix + args[0].split('\n').join('\n' + prefix); - args.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\u001B[0m'); - } else { - args[0] = getDate() + name + ' ' + args[0]; - } -} - -function getDate() { - if (exports.inspectOpts.hideDate) { - return ''; - } - return new Date().toISOString() + ' '; -} - -/** - * Invokes `util.format()` with the specified arguments and writes to stderr. - */ - -function log(...args) { - return process.stderr.write(util__default['default'].format(...args) + '\n'); -} - -/** - * Save `namespaces`. - * - * @param {String} namespaces - * @api private - */ -function save(namespaces) { - if (namespaces) { - process.env.DEBUG = namespaces; - } else { - // If you set a process.env field to null or undefined, it gets cast to the - // string 'null' or 'undefined'. Just delete instead. - delete process.env.DEBUG; - } -} - -/** - * Load `namespaces`. - * - * @return {String} returns the previously persisted debug modes - * @api private - */ - -function load() { - return process.env.DEBUG; -} - -/** - * Init logic for `debug` instances. - * - * Create a new `inspectOpts` object in case `useColors` is set - * differently for a particular `debug` instance. - */ - -function init(debug) { - debug.inspectOpts = {}; - - const keys = Object.keys(exports.inspectOpts); - for (let i = 0; i < keys.length; i++) { - debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]]; - } -} - -module.exports = common(exports); - -const {formatters} = module.exports; - -/** - * Map %o to `util.inspect()`, all on a single line. - */ - -formatters.o = function (v) { - this.inspectOpts.colors = this.useColors; - return util__default['default'].inspect(v, this.inspectOpts) - .split('\n') - .map(str => str.trim()) - .join(' '); -}; - -/** - * Map %O to `util.inspect()`, allowing multiple lines if needed. - */ - -formatters.O = function (v) { - this.inspectOpts.colors = this.useColors; - return util__default['default'].inspect(v, this.inspectOpts); -}; -}); - -var src$2 = createCommonjsModule(function (module) { -/** - * Detect Electron renderer / nwjs process, which is node, but we should - * treat as a browser. - */ - -if (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) { - module.exports = browser; -} else { - module.exports = node; -} -}); - -var src$1 = createCommonjsModule(function (module, exports) { -var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); - -const debug_1 = __importDefault(src$2); -const log = debug_1.default('@kwsites/file-exists'); -function check(path, isFile, isDirectory) { - log(`checking %s`, path); - try { - const stat = fs_1__default['default'].statSync(path); - if (stat.isFile() && isFile) { - log(`[OK] path represents a file`); - return true; - } - if (stat.isDirectory() && isDirectory) { - log(`[OK] path represents a directory`); - return true; - } - log(`[FAIL] path represents something other than a file or directory`); - return false; - } - catch (e) { - if (e.code === 'ENOENT') { - log(`[FAIL] path is not accessible: %o`, e); - return false; - } - log(`[FATAL] %o`, e); - throw e; - } -} -/** - * Synchronous validation of a path existing either as a file or as a directory. - * - * @param {string} path The path to check - * @param {number} type One or both of the exported numeric constants - */ -function exists(path, type = exports.READABLE) { - return check(path, (type & exports.FILE) > 0, (type & exports.FOLDER) > 0); -} -exports.exists = exists; -/** - * Constant representing a file - */ -exports.FILE = 1; -/** - * Constant representing a folder - */ -exports.FOLDER = 2; -/** - * Constant representing either a file or a folder - */ -exports.READABLE = exports.FILE + exports.FOLDER; -//# sourceMappingURL=index.js.map -}); - -var dist$1 = createCommonjsModule(function (module, exports) { -function __export(m) { - for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; -} -Object.defineProperty(exports, "__esModule", { value: true }); -__export(src$1); -//# sourceMappingURL=index.js.map -}); - -var util = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.bufferToString = exports.prefixedArray = exports.asNumber = exports.asStringArray = exports.asArray = exports.objectToString = exports.remove = exports.including = exports.append = exports.folderExists = exports.forEachLineWithContent = exports.toLinesWithContent = exports.last = exports.first = exports.splitOn = exports.isUserFunction = exports.asFunction = exports.NOOP = void 0; - -const NOOP = () => { -}; -exports.NOOP = NOOP; -/** - * Returns either the source argument when it is a `Function`, or the default - * `NOOP` function constant - */ -function asFunction(source) { - return typeof source === 'function' ? source : exports.NOOP; -} -exports.asFunction = asFunction; -/** - * Determines whether the supplied argument is both a function, and is not - * the `NOOP` function. - */ -function isUserFunction(source) { - return (typeof source === 'function' && source !== exports.NOOP); -} -exports.isUserFunction = isUserFunction; -function splitOn(input, char) { - const index = input.indexOf(char); - if (index <= 0) { - return [input, '']; - } - return [ - input.substr(0, index), - input.substr(index + 1), - ]; -} -exports.splitOn = splitOn; -function first(input, offset = 0) { - return isArrayLike(input) && input.length > offset ? input[offset] : undefined; -} -exports.first = first; -function last(input, offset = 0) { - if (isArrayLike(input) && input.length > offset) { - return input[input.length - 1 - offset]; - } -} -exports.last = last; -function isArrayLike(input) { - return !!(input && typeof input.length === 'number'); -} -function toLinesWithContent(input, trimmed = true, separator = '\n') { - return input.split(separator) - .reduce((output, line) => { - const lineContent = trimmed ? line.trim() : line; - if (lineContent) { - output.push(lineContent); - } - return output; - }, []); -} -exports.toLinesWithContent = toLinesWithContent; -function forEachLineWithContent(input, callback) { - return toLinesWithContent(input, true).map(line => callback(line)); -} -exports.forEachLineWithContent = forEachLineWithContent; -function folderExists(path) { - return dist$1.exists(path, dist$1.FOLDER); -} -exports.folderExists = folderExists; -/** - * Adds `item` into the `target` `Array` or `Set` when it is not already present and returns the `item`. - */ -function append(target, item) { - if (Array.isArray(target)) { - if (!target.includes(item)) { - target.push(item); - } - } - else { - target.add(item); - } - return item; -} -exports.append = append; -/** - * Adds `item` into the `target` `Array` when it is not already present and returns the `target`. - */ -function including(target, item) { - if (Array.isArray(target) && !target.includes(item)) { - target.push(item); - } - return target; -} -exports.including = including; -function remove(target, item) { - if (Array.isArray(target)) { - const index = target.indexOf(item); - if (index >= 0) { - target.splice(index, 1); - } - } - else { - target.delete(item); - } - return item; -} -exports.remove = remove; -exports.objectToString = Object.prototype.toString.call.bind(Object.prototype.toString); -function asArray(source) { - return Array.isArray(source) ? source : [source]; -} -exports.asArray = asArray; -function asStringArray(source) { - return asArray(source).map(String); -} -exports.asStringArray = asStringArray; -function asNumber(source, onNaN = 0) { - if (source == null) { - return onNaN; - } - const num = parseInt(source, 10); - return isNaN(num) ? onNaN : num; -} -exports.asNumber = asNumber; -function prefixedArray(input, prefix) { - const output = []; - for (let i = 0, max = input.length; i < max; i++) { - output.push(prefix, input[i]); - } - return output; -} -exports.prefixedArray = prefixedArray; -function bufferToString(input) { - return (Array.isArray(input) ? Buffer.concat(input) : input).toString('utf-8'); -} -exports.bufferToString = bufferToString; -//# sourceMappingURL=util.js.map -}); - -var argumentFilters = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.filterHasLength = exports.filterFunction = exports.filterPlainObject = exports.filterStringOrStringArray = exports.filterStringArray = exports.filterString = exports.filterPrimitives = exports.filterArray = exports.filterType = void 0; - -function filterType(input, filter, def) { - if (filter(input)) { - return input; - } - return (arguments.length > 2) ? def : undefined; -} -exports.filterType = filterType; -const filterArray = (input) => { - return Array.isArray(input); -}; -exports.filterArray = filterArray; -function filterPrimitives(input, omit) { - return /number|string|boolean/.test(typeof input) && (!omit || !omit.includes((typeof input))); -} -exports.filterPrimitives = filterPrimitives; -const filterString = (input) => { - return typeof input === 'string'; -}; -exports.filterString = filterString; -const filterStringArray = (input) => { - return Array.isArray(input) && input.every(exports.filterString); -}; -exports.filterStringArray = filterStringArray; -const filterStringOrStringArray = (input) => { - return exports.filterString(input) || (Array.isArray(input) && input.every(exports.filterString)); -}; -exports.filterStringOrStringArray = filterStringOrStringArray; -function filterPlainObject(input) { - return !!input && util.objectToString(input) === '[object Object]'; -} -exports.filterPlainObject = filterPlainObject; -function filterFunction(input) { - return typeof input === 'function'; -} -exports.filterFunction = filterFunction; -const filterHasLength = (input) => { - if (input == null || 'number|boolean|function'.includes(typeof input)) { - return false; - } - return Array.isArray(input) || typeof input === 'string' || typeof input.length === 'number'; -}; -exports.filterHasLength = filterHasLength; -//# sourceMappingURL=argument-filters.js.map -}); - -var exitCodes = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ExitCodes = void 0; -(function (ExitCodes) { - ExitCodes[ExitCodes["SUCCESS"] = 0] = "SUCCESS"; - ExitCodes[ExitCodes["ERROR"] = 1] = "ERROR"; - ExitCodes[ExitCodes["UNCLEAN"] = 128] = "UNCLEAN"; -})(exports.ExitCodes || (exports.ExitCodes = {})); -//# sourceMappingURL=exit-codes.js.map -}); - -var gitOutputStreams = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.GitOutputStreams = void 0; -class GitOutputStreams { - constructor(stdOut, stdErr) { - this.stdOut = stdOut; - this.stdErr = stdErr; - } - asStrings() { - return new GitOutputStreams(this.stdOut.toString('utf8'), this.stdErr.toString('utf8')); - } -} -exports.GitOutputStreams = GitOutputStreams; -//# sourceMappingURL=git-output-streams.js.map -}); - -var lineParser = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.RemoteLineParser = exports.LineParser = void 0; -class LineParser { - constructor(regExp, useMatches) { - this.matches = []; - this.parse = (line, target) => { - this.resetMatches(); - if (!this._regExp.every((reg, index) => this.addMatch(reg, index, line(index)))) { - return false; - } - return this.useMatches(target, this.prepareMatches()) !== false; - }; - this._regExp = Array.isArray(regExp) ? regExp : [regExp]; - if (useMatches) { - this.useMatches = useMatches; - } - } - // @ts-ignore - useMatches(target, match) { - throw new Error(`LineParser:useMatches not implemented`); - } - resetMatches() { - this.matches.length = 0; - } - prepareMatches() { - return this.matches; - } - addMatch(reg, index, line) { - const matched = line && reg.exec(line); - if (matched) { - this.pushMatch(index, matched); - } - return !!matched; - } - pushMatch(_index, matched) { - this.matches.push(...matched.slice(1)); - } -} -exports.LineParser = LineParser; -class RemoteLineParser extends LineParser { - addMatch(reg, index, line) { - return /^remote:\s/.test(String(line)) && super.addMatch(reg, index, line); - } - pushMatch(index, matched) { - if (index > 0 || matched.length > 1) { - super.pushMatch(index, matched); - } - } -} -exports.RemoteLineParser = RemoteLineParser; -//# sourceMappingURL=line-parser.js.map -}); - -var simpleGitOptions = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.createInstanceConfig = void 0; -const defaultOptions = { - binary: 'git', - maxConcurrentProcesses: 5, - config: [], -}; -function createInstanceConfig(...options) { - const baseDir = process.cwd(); - const config = Object.assign(Object.assign({ baseDir }, defaultOptions), ...(options.filter(o => typeof o === 'object' && o))); - config.baseDir = config.baseDir || baseDir; - return config; -} -exports.createInstanceConfig = createInstanceConfig; -//# sourceMappingURL=simple-git-options.js.map -}); - -var taskOptions = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.trailingFunctionArgument = exports.trailingOptionsArgument = exports.getTrailingOptions = exports.appendTaskOptions = void 0; - - -function appendTaskOptions(options, commands = []) { - if (!argumentFilters.filterPlainObject(options)) { - return commands; - } - return Object.keys(options).reduce((commands, key) => { - const value = options[key]; - if (argumentFilters.filterPrimitives(value, ['boolean'])) { - commands.push(key + '=' + value); - } - else { - commands.push(key); - } - return commands; - }, commands); -} -exports.appendTaskOptions = appendTaskOptions; -function getTrailingOptions(args, initialPrimitive = 0, objectOnly = false) { - const command = []; - for (let i = 0, max = initialPrimitive < 0 ? args.length : initialPrimitive; i < max; i++) { - if ('string|number'.includes(typeof args[i])) { - command.push(String(args[i])); - } - } - appendTaskOptions(trailingOptionsArgument(args), command); - if (!objectOnly) { - command.push(...trailingArrayArgument(args)); - } - return command; -} -exports.getTrailingOptions = getTrailingOptions; -function trailingArrayArgument(args) { - const hasTrailingCallback = typeof util.last(args) === 'function'; - return argumentFilters.filterType(util.last(args, hasTrailingCallback ? 1 : 0), argumentFilters.filterArray, []); -} -/** - * Given any number of arguments, returns the trailing options argument, ignoring a trailing function argument - * if there is one. When not found, the return value is null. - */ -function trailingOptionsArgument(args) { - const hasTrailingCallback = argumentFilters.filterFunction(util.last(args)); - return argumentFilters.filterType(util.last(args, hasTrailingCallback ? 1 : 0), argumentFilters.filterPlainObject); -} -exports.trailingOptionsArgument = trailingOptionsArgument; -/** - * Returns either the source argument when it is a `Function`, or the default - * `NOOP` function constant - */ -function trailingFunctionArgument(args, includeNoop = true) { - const callback = util.asFunction(util.last(args)); - return includeNoop || util.isUserFunction(callback) ? callback : undefined; -} -exports.trailingFunctionArgument = trailingFunctionArgument; -//# sourceMappingURL=task-options.js.map -}); - -var taskParser = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.parseStringResponse = exports.callTaskParser = void 0; - -function callTaskParser(parser, streams) { - return parser(streams.stdOut, streams.stdErr); -} -exports.callTaskParser = callTaskParser; -function parseStringResponse(result, parsers, ...texts) { - texts.forEach(text => { - for (let lines = util.toLinesWithContent(text), i = 0, max = lines.length; i < max; i++) { - const line = (offset = 0) => { - if ((i + offset) >= max) { - return; - } - return lines[i + offset]; - }; - parsers.some(({ parse }) => parse(line, result)); - } - }); - return result; -} -exports.parseStringResponse = parseStringResponse; -//# sourceMappingURL=task-parser.js.map -}); - -var utils = createCommonjsModule(function (module, exports) { -var __createBinding = (commonjsGlobal && commonjsGlobal.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __exportStar = (commonjsGlobal && commonjsGlobal.__exportStar) || function(m, exports) { - for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(argumentFilters, exports); -__exportStar(exitCodes, exports); -__exportStar(gitOutputStreams, exports); -__exportStar(lineParser, exports); -__exportStar(simpleGitOptions, exports); -__exportStar(taskOptions, exports); -__exportStar(taskParser, exports); -__exportStar(util, exports); -//# sourceMappingURL=index.js.map -}); - -var checkIsRepo = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.checkIsBareRepoTask = exports.checkIsRepoRootTask = exports.checkIsRepoTask = exports.CheckRepoActions = void 0; - -var CheckRepoActions; -(function (CheckRepoActions) { - CheckRepoActions["BARE"] = "bare"; - CheckRepoActions["IN_TREE"] = "tree"; - CheckRepoActions["IS_REPO_ROOT"] = "root"; -})(CheckRepoActions = exports.CheckRepoActions || (exports.CheckRepoActions = {})); -const onError = ({ exitCode }, error, done, fail) => { - if (exitCode === utils.ExitCodes.UNCLEAN && isNotRepoMessage(error)) { - return done(Buffer.from('false')); - } - fail(error); -}; -const parser = (text) => { - return text.trim() === 'true'; -}; -function checkIsRepoTask(action) { - switch (action) { - case CheckRepoActions.BARE: - return checkIsBareRepoTask(); - case CheckRepoActions.IS_REPO_ROOT: - return checkIsRepoRootTask(); - } - const commands = ['rev-parse', '--is-inside-work-tree']; - return { - commands, - format: 'utf-8', - onError, - parser, - }; -} -exports.checkIsRepoTask = checkIsRepoTask; -function checkIsRepoRootTask() { - const commands = ['rev-parse', '--git-dir']; - return { - commands, - format: 'utf-8', - onError, - parser(path) { - return /^\.(git)?$/.test(path.trim()); - }, - }; -} -exports.checkIsRepoRootTask = checkIsRepoRootTask; -function checkIsBareRepoTask() { - const commands = ['rev-parse', '--is-bare-repository']; - return { - commands, - format: 'utf-8', - onError, - parser, - }; -} -exports.checkIsBareRepoTask = checkIsBareRepoTask; -function isNotRepoMessage(error) { - return /(Not a git repository|Kein Git-Repository)/i.test(String(error)); -} -//# sourceMappingURL=check-is-repo.js.map -}); - -var CleanSummary = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.cleanSummaryParser = exports.CleanResponse = void 0; - -class CleanResponse { - constructor(dryRun) { - this.dryRun = dryRun; - this.paths = []; - this.files = []; - this.folders = []; - } -} -exports.CleanResponse = CleanResponse; -const removalRegexp = /^[a-z]+\s*/i; -const dryRunRemovalRegexp = /^[a-z]+\s+[a-z]+\s*/i; -const isFolderRegexp = /\/$/; -function cleanSummaryParser(dryRun, text) { - const summary = new CleanResponse(dryRun); - const regexp = dryRun ? dryRunRemovalRegexp : removalRegexp; - utils.toLinesWithContent(text).forEach(line => { - const removed = line.replace(regexp, ''); - summary.paths.push(removed); - (isFolderRegexp.test(removed) ? summary.folders : summary.files).push(removed); - }); - return summary; -} -exports.cleanSummaryParser = cleanSummaryParser; -//# sourceMappingURL=CleanSummary.js.map -}); - -var task = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.isEmptyTask = exports.isBufferTask = exports.straightThroughBufferTask = exports.straightThroughStringTask = exports.configurationErrorTask = exports.adhocExecTask = exports.EMPTY_COMMANDS = void 0; - -exports.EMPTY_COMMANDS = []; -function adhocExecTask(parser) { - return { - commands: exports.EMPTY_COMMANDS, - format: 'utf-8', - parser, - }; -} -exports.adhocExecTask = adhocExecTask; -function configurationErrorTask(error) { - return { - commands: exports.EMPTY_COMMANDS, - format: 'utf-8', - parser() { - throw typeof error === 'string' ? new taskConfigurationError.TaskConfigurationError(error) : error; - } - }; -} -exports.configurationErrorTask = configurationErrorTask; -function straightThroughStringTask(commands, trimmed = false) { - return { - commands, - format: 'utf-8', - parser(text) { - return trimmed ? String(text).trim() : text; - }, - }; -} -exports.straightThroughStringTask = straightThroughStringTask; -function straightThroughBufferTask(commands) { - return { - commands, - format: 'buffer', - parser(buffer) { - return buffer; - }, - }; -} -exports.straightThroughBufferTask = straightThroughBufferTask; -function isBufferTask(task) { - return task.format === 'buffer'; -} -exports.isBufferTask = isBufferTask; -function isEmptyTask(task) { - return !task.commands.length; -} -exports.isEmptyTask = isEmptyTask; -//# sourceMappingURL=task.js.map -}); - -var clean = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.isCleanOptionsArray = exports.cleanTask = exports.cleanWithOptionsTask = exports.CleanOptions = exports.CONFIG_ERROR_UNKNOWN_OPTION = exports.CONFIG_ERROR_MODE_REQUIRED = exports.CONFIG_ERROR_INTERACTIVE_MODE = void 0; - - - -exports.CONFIG_ERROR_INTERACTIVE_MODE = 'Git clean interactive mode is not supported'; -exports.CONFIG_ERROR_MODE_REQUIRED = 'Git clean mode parameter ("n" or "f") is required'; -exports.CONFIG_ERROR_UNKNOWN_OPTION = 'Git clean unknown option found in: '; -/** - * All supported option switches available for use in a `git.clean` operation - */ -var CleanOptions; -(function (CleanOptions) { - CleanOptions["DRY_RUN"] = "n"; - CleanOptions["FORCE"] = "f"; - CleanOptions["IGNORED_INCLUDED"] = "x"; - CleanOptions["IGNORED_ONLY"] = "X"; - CleanOptions["EXCLUDING"] = "e"; - CleanOptions["QUIET"] = "q"; - CleanOptions["RECURSIVE"] = "d"; -})(CleanOptions = exports.CleanOptions || (exports.CleanOptions = {})); -const CleanOptionValues = new Set(['i', ...utils.asStringArray(Object.values(CleanOptions))]); -function cleanWithOptionsTask(mode, customArgs) { - const { cleanMode, options, valid } = getCleanOptions(mode); - if (!cleanMode) { - return task.configurationErrorTask(exports.CONFIG_ERROR_MODE_REQUIRED); - } - if (!valid.options) { - return task.configurationErrorTask(exports.CONFIG_ERROR_UNKNOWN_OPTION + JSON.stringify(mode)); - } - options.push(...customArgs); - if (options.some(isInteractiveMode)) { - return task.configurationErrorTask(exports.CONFIG_ERROR_INTERACTIVE_MODE); - } - return cleanTask(cleanMode, options); -} -exports.cleanWithOptionsTask = cleanWithOptionsTask; -function cleanTask(mode, customArgs) { - const commands = ['clean', `-${mode}`, ...customArgs]; - return { - commands, - format: 'utf-8', - parser(text) { - return CleanSummary.cleanSummaryParser(mode === CleanOptions.DRY_RUN, text); - } - }; -} -exports.cleanTask = cleanTask; -function isCleanOptionsArray(input) { - return Array.isArray(input) && input.every(test => CleanOptionValues.has(test)); -} -exports.isCleanOptionsArray = isCleanOptionsArray; -function getCleanOptions(input) { - let cleanMode; - let options = []; - let valid = { cleanMode: false, options: true }; - input.replace(/[^a-z]i/g, '').split('').forEach(char => { - if (isCleanMode(char)) { - cleanMode = char; - valid.cleanMode = true; - } - else { - valid.options = valid.options && isKnownOption(options[options.length] = (`-${char}`)); - } - }); - return { - cleanMode, - options, - valid, - }; -} -function isCleanMode(cleanMode) { - return cleanMode === CleanOptions.FORCE || cleanMode === CleanOptions.DRY_RUN; -} -function isKnownOption(option) { - return /^-[a-z]$/i.test(option) && CleanOptionValues.has(option.charAt(1)); -} -function isInteractiveMode(option) { - if (/^-[^\-]/.test(option)) { - return option.indexOf('i') > 0; - } - return option === '--interactive'; -} -//# sourceMappingURL=clean.js.map -}); - -var reset = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.getResetMode = exports.resetTask = exports.ResetMode = void 0; - -var ResetMode; -(function (ResetMode) { - ResetMode["MIXED"] = "mixed"; - ResetMode["SOFT"] = "soft"; - ResetMode["HARD"] = "hard"; - ResetMode["MERGE"] = "merge"; - ResetMode["KEEP"] = "keep"; -})(ResetMode = exports.ResetMode || (exports.ResetMode = {})); -const ResetModes = Array.from(Object.values(ResetMode)); -function resetTask(mode, customArgs) { - const commands = ['reset']; - if (isValidResetMode(mode)) { - commands.push(`--${mode}`); - } - commands.push(...customArgs); - return task.straightThroughStringTask(commands); -} -exports.resetTask = resetTask; -function getResetMode(mode) { - if (isValidResetMode(mode)) { - return mode; - } - switch (typeof mode) { - case 'string': - case 'undefined': - return ResetMode.SOFT; - } - return; -} -exports.getResetMode = getResetMode; -function isValidResetMode(mode) { - return ResetModes.includes(mode); -} -//# sourceMappingURL=reset.js.map -}); - -var api_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); - - - - - - - - -const api = { - CheckRepoActions: checkIsRepo.CheckRepoActions, - CleanOptions: clean.CleanOptions, - GitConstructError: gitConstructError.GitConstructError, - GitError: gitError.GitError, - GitPluginError: gitPluginError.GitPluginError, - GitResponseError: gitResponseError.GitResponseError, - ResetMode: reset.ResetMode, - TaskConfigurationError: taskConfigurationError.TaskConfigurationError, -}; -exports.default = api; -//# sourceMappingURL=api.js.map -}); - -var commandConfigPrefixingPlugin_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.commandConfigPrefixingPlugin = void 0; - -function commandConfigPrefixingPlugin(configuration) { - const prefix = utils.prefixedArray(configuration, '-c'); - return { - type: 'spawn.args', - action(data) { - return [...prefix, ...data]; - }, - }; -} -exports.commandConfigPrefixingPlugin = commandConfigPrefixingPlugin; -//# sourceMappingURL=command-config-prefixing-plugin.js.map -}); - -var errorDetection_plugin = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.errorDetectionPlugin = exports.errorDetectionHandler = void 0; - -function isTaskError(result) { - return !!(result.exitCode && result.stdErr.length); -} -function getErrorMessage(result) { - return Buffer.concat([...result.stdOut, ...result.stdErr]); -} -function errorDetectionHandler(overwrite = false, isError = isTaskError, errorMessage = getErrorMessage) { - return (error, result) => { - if ((!overwrite && error) || !isError(result)) { - return error; - } - return errorMessage(result); - }; -} -exports.errorDetectionHandler = errorDetectionHandler; -function errorDetectionPlugin(config) { - return { - type: 'task.error', - action(data, context) { - const error = config(data.error, { - stdErr: context.stdErr, - stdOut: context.stdOut, - exitCode: context.exitCode - }); - if (Buffer.isBuffer(error)) { - return { error: new gitError.GitError(undefined, error.toString('utf-8')) }; - } - return { - error - }; - }, - }; -} -exports.errorDetectionPlugin = errorDetectionPlugin; -//# sourceMappingURL=error-detection.plugin.js.map -}); - -var pluginStore = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.PluginStore = void 0; - -class PluginStore { - constructor() { - this.plugins = new Set(); - } - add(plugin) { - const plugins = []; - utils.asArray(plugin).forEach(plugin => plugin && this.plugins.add(utils.append(plugins, plugin))); - return () => { - plugins.forEach(plugin => this.plugins.delete(plugin)); - }; - } - exec(type, data, context) { - let output = data; - const contextual = Object.freeze(Object.create(context)); - for (const plugin of this.plugins) { - if (plugin.type === type) { - output = plugin.action(output, contextual); - } - } - return output; - } -} -exports.PluginStore = PluginStore; -//# sourceMappingURL=plugin-store.js.map -}); - -var progressMonitorPlugin_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.progressMonitorPlugin = void 0; - -function progressMonitorPlugin(progress) { - const progressCommand = '--progress'; - const progressMethods = ['checkout', 'clone', 'fetch', 'pull', 'push']; - const onProgress = { - type: 'spawn.after', - action(_data, context) { - var _a; - if (!context.commands.includes(progressCommand)) { - return; - } - (_a = context.spawned.stderr) === null || _a === void 0 ? void 0 : _a.on('data', (chunk) => { - const message = /^([a-zA-Z ]+):\s*(\d+)% \((\d+)\/(\d+)\)/.exec(chunk.toString('utf8')); - if (!message) { - return; - } - progress({ - method: context.method, - stage: progressEventStage(message[1]), - progress: utils.asNumber(message[2]), - processed: utils.asNumber(message[3]), - total: utils.asNumber(message[4]), - }); - }); - } - }; - const onArgs = { - type: 'spawn.args', - action(args, context) { - if (!progressMethods.includes(context.method)) { - return args; - } - return utils.including(args, progressCommand); - } - }; - return [onArgs, onProgress]; -} -exports.progressMonitorPlugin = progressMonitorPlugin; -function progressEventStage(input) { - return String(input.toLowerCase().split(' ', 1)) || 'unknown'; -} -//# sourceMappingURL=progress-monitor-plugin.js.map -}); - -var simpleGitPlugin = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=simple-git-plugin.js.map -}); - -var timoutPlugin = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.timeoutPlugin = void 0; - -function timeoutPlugin({ block }) { - if (block > 0) { - return { - type: 'spawn.after', - action(_data, context) { - var _a, _b; - let timeout; - function wait() { - timeout && clearTimeout(timeout); - timeout = setTimeout(kill, block); - } - function stop() { - var _a, _b; - (_a = context.spawned.stdout) === null || _a === void 0 ? void 0 : _a.off('data', wait); - (_b = context.spawned.stderr) === null || _b === void 0 ? void 0 : _b.off('data', wait); - context.spawned.off('exit', stop); - context.spawned.off('close', stop); - } - function kill() { - stop(); - context.kill(new gitPluginError.GitPluginError(undefined, 'timeout', `block timeout reached`)); - } - (_a = context.spawned.stdout) === null || _a === void 0 ? void 0 : _a.on('data', wait); - (_b = context.spawned.stderr) === null || _b === void 0 ? void 0 : _b.on('data', wait); - context.spawned.on('exit', stop); - context.spawned.on('close', stop); - wait(); - } - }; - } -} -exports.timeoutPlugin = timeoutPlugin; -//# sourceMappingURL=timout-plugin.js.map -}); - -var plugins = createCommonjsModule(function (module, exports) { -var __createBinding = (commonjsGlobal && commonjsGlobal.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __exportStar = (commonjsGlobal && commonjsGlobal.__exportStar) || function(m, exports) { - for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(commandConfigPrefixingPlugin_1, exports); -__exportStar(errorDetection_plugin, exports); -__exportStar(pluginStore, exports); -__exportStar(progressMonitorPlugin_1, exports); -__exportStar(simpleGitPlugin, exports); -__exportStar(timoutPlugin, exports); -//# sourceMappingURL=index.js.map -}); - -var gitLogger = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.GitLogger = exports.createLogger = void 0; - - -src$2.default.formatters.L = (value) => String(utils.filterHasLength(value) ? value.length : '-'); -src$2.default.formatters.B = (value) => { - if (Buffer.isBuffer(value)) { - return value.toString('utf8'); - } - return utils.objectToString(value); -}; -function createLog() { - return src$2.default('simple-git'); -} -function prefixedLogger(to, prefix, forward) { - if (!prefix || !String(prefix).replace(/\s*/, '')) { - return !forward ? to : (message, ...args) => { - to(message, ...args); - forward(message, ...args); - }; - } - return (message, ...args) => { - to(`%s ${message}`, prefix, ...args); - if (forward) { - forward(message, ...args); - } - }; -} -function childLoggerName(name, childDebugger, { namespace: parentNamespace }) { - if (typeof name === 'string') { - return name; - } - const childNamespace = childDebugger && childDebugger.namespace || ''; - if (childNamespace.startsWith(parentNamespace)) { - return childNamespace.substr(parentNamespace.length + 1); - } - return childNamespace || parentNamespace; -} -function createLogger(label, verbose, initialStep, infoDebugger = createLog()) { - const labelPrefix = label && `[${label}]` || ''; - const spawned = []; - const debugDebugger = (typeof verbose === 'string') ? infoDebugger.extend(verbose) : verbose; - const key = childLoggerName(utils.filterType(verbose, utils.filterString), debugDebugger, infoDebugger); - return step(initialStep); - function sibling(name, initial) { - return utils.append(spawned, createLogger(label, key.replace(/^[^:]+/, name), initial, infoDebugger)); - } - function step(phase) { - const stepPrefix = phase && `[${phase}]` || ''; - const debug = debugDebugger && prefixedLogger(debugDebugger, stepPrefix) || utils.NOOP; - const info = prefixedLogger(infoDebugger, `${labelPrefix} ${stepPrefix}`, debug); - return Object.assign(debugDebugger ? debug : info, { - label, - sibling, - info, - step, - }); - } -} -exports.createLogger = createLogger; -/** - * The `GitLogger` is used by the main `SimpleGit` runner to handle logging - * any warnings or errors. - */ -class GitLogger { - constructor(_out = createLog()) { - this._out = _out; - this.error = prefixedLogger(_out, '[ERROR]'); - this.warn = prefixedLogger(_out, '[WARN]'); - } - silent(silence = false) { - if (silence !== this._out.enabled) { - return; - } - const { namespace } = this._out; - const env = (process.env.DEBUG || '').split(',').filter(s => !!s); - const hasOn = env.includes(namespace); - const hasOff = env.includes(`-${namespace}`); - // enabling the log - if (!silence) { - if (hasOff) { - utils.remove(env, `-${namespace}`); - } - else { - env.push(namespace); - } - } - else { - if (hasOn) { - utils.remove(env, namespace); - } - else { - env.push(`-${namespace}`); - } - } - src$2.default.enable(env.join(',')); - } -} -exports.GitLogger = GitLogger; -//# sourceMappingURL=git-logger.js.map -}); - -var tasksPendingQueue = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TasksPendingQueue = void 0; - - -class TasksPendingQueue { - constructor(logLabel = 'GitExecutor') { - this.logLabel = logLabel; - this._queue = new Map(); - } - withProgress(task) { - return this._queue.get(task); - } - createProgress(task) { - const name = TasksPendingQueue.getName(task.commands[0]); - const logger = gitLogger.createLogger(this.logLabel, name); - return { - task, - logger, - name, - }; - } - push(task) { - const progress = this.createProgress(task); - progress.logger('Adding task to the queue, commands = %o', task.commands); - this._queue.set(task, progress); - return progress; - } - fatal(err) { - for (const [task, { logger }] of Array.from(this._queue.entries())) { - if (task === err.task) { - logger.info(`Failed %o`, err); - logger(`Fatal exception, any as-yet un-started tasks run through this executor will not be attempted`); - } - else { - logger.info(`A fatal exception occurred in a previous task, the queue has been purged: %o`, err.message); - } - this.complete(task); - } - if (this._queue.size !== 0) { - throw new Error(`Queue size should be zero after fatal: ${this._queue.size}`); - } - } - complete(task) { - const progress = this.withProgress(task); - if (progress) { - this._queue.delete(task); - } - } - attempt(task) { - const progress = this.withProgress(task); - if (!progress) { - throw new gitError.GitError(undefined, 'TasksPendingQueue: attempt called for an unknown task'); - } - progress.logger('Starting task'); - return progress; - } - static getName(name = 'empty') { - return `task:${name}:${++TasksPendingQueue.counter}`; - } -} -exports.TasksPendingQueue = TasksPendingQueue; -TasksPendingQueue.counter = 0; -//# sourceMappingURL=tasks-pending-queue.js.map -}); - -var gitExecutorChain = createCommonjsModule(function (module, exports) { -var __awaiter = (commonjsGlobal && commonjsGlobal.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.GitExecutorChain = void 0; - - - - - -class GitExecutorChain { - constructor(_executor, _scheduler, _plugins) { - this._executor = _executor; - this._scheduler = _scheduler; - this._plugins = _plugins; - this._chain = Promise.resolve(); - this._queue = new tasksPendingQueue.TasksPendingQueue(); - } - get binary() { - return this._executor.binary; - } - get cwd() { - return this._executor.cwd; - } - get env() { - return this._executor.env; - } - get outputHandler() { - return this._executor.outputHandler; - } - chain() { - return this; - } - push(task) { - this._queue.push(task); - return this._chain = this._chain.then(() => this.attemptTask(task)); - } - attemptTask(task$1) { - return __awaiter(this, void 0, void 0, function* () { - const onScheduleComplete = yield this._scheduler.next(); - const onQueueComplete = () => this._queue.complete(task$1); - try { - const { logger } = this._queue.attempt(task$1); - return yield (task.isEmptyTask(task$1) - ? this.attemptEmptyTask(task$1, logger) - : this.attemptRemoteTask(task$1, logger)); - } - catch (e) { - throw this.onFatalException(task$1, e); - } - finally { - onQueueComplete(); - onScheduleComplete(); - } - }); - } - onFatalException(task, e) { - const gitError$1 = (e instanceof gitError.GitError) ? Object.assign(e, { task }) : new gitError.GitError(task, e && String(e)); - this._chain = Promise.resolve(); - this._queue.fatal(gitError$1); - return gitError$1; - } - attemptRemoteTask(task$1, logger) { - return __awaiter(this, void 0, void 0, function* () { - const args = this._plugins.exec('spawn.args', [...task$1.commands], pluginContext(task$1, task$1.commands)); - const raw = yield this.gitResponse(task$1, this.binary, args, this.outputHandler, logger.step('SPAWN')); - const outputStreams = yield this.handleTaskData(task$1, args, raw, logger.step('HANDLE')); - logger(`passing response to task's parser as a %s`, task$1.format); - if (task.isBufferTask(task$1)) { - return utils.callTaskParser(task$1.parser, outputStreams); - } - return utils.callTaskParser(task$1.parser, outputStreams.asStrings()); - }); - } - attemptEmptyTask(task, logger) { - return __awaiter(this, void 0, void 0, function* () { - logger(`empty task bypassing child process to call to task's parser`); - return task.parser(); - }); - } - handleTaskData(task, args, result, logger) { - const { exitCode, rejection, stdOut, stdErr } = result; - return new Promise((done, fail) => { - logger(`Preparing to handle process response exitCode=%d stdOut=`, exitCode); - const { error } = this._plugins.exec('task.error', { error: rejection }, Object.assign(Object.assign({}, pluginContext(task, args)), result)); - if (error && task.onError) { - logger.info(`exitCode=%s handling with custom error handler`); - return task.onError(result, error, (newStdOut) => { - logger.info(`custom error handler treated as success`); - logger(`custom error returned a %s`, utils.objectToString(newStdOut)); - done(new utils.GitOutputStreams(Array.isArray(newStdOut) ? Buffer.concat(newStdOut) : newStdOut, Buffer.concat(stdErr))); - }, fail); - } - if (error) { - logger.info(`handling as error: exitCode=%s stdErr=%s rejection=%o`, exitCode, stdErr.length, rejection); - return fail(error); - } - logger.info(`retrieving task output complete`); - done(new utils.GitOutputStreams(Buffer.concat(stdOut), Buffer.concat(stdErr))); - }); - } - gitResponse(task, command, args, outputHandler, logger) { - return __awaiter(this, void 0, void 0, function* () { - const outputLogger = logger.sibling('output'); - const spawnOptions = { - cwd: this.cwd, - env: this.env, - windowsHide: true, - }; - return new Promise((done) => { - const stdOut = []; - const stdErr = []; - let attempted = false; - let rejection; - function attemptClose(exitCode, event = 'retry') { - // closing when there is content, terminate immediately - if (attempted || stdErr.length || stdOut.length) { - logger.info(`exitCode=%s event=%s rejection=%o`, exitCode, event, rejection); - done({ - stdOut, - stdErr, - exitCode, - rejection, - }); - attempted = true; - } - // first attempt at closing but no content yet, wait briefly for the close/exit that may follow - if (!attempted) { - attempted = true; - setTimeout(() => attemptClose(exitCode, 'deferred'), 50); - logger('received %s event before content on stdOut/stdErr', event); - } - } - logger.info(`%s %o`, command, args); - logger('%O', spawnOptions); - const spawned = child_process_1__default['default'].spawn(command, args, spawnOptions); - spawned.stdout.on('data', onDataReceived(stdOut, 'stdOut', logger, outputLogger.step('stdOut'))); - spawned.stderr.on('data', onDataReceived(stdErr, 'stdErr', logger, outputLogger.step('stdErr'))); - spawned.on('error', onErrorReceived(stdErr, logger)); - spawned.on('close', (code) => attemptClose(code, 'close')); - spawned.on('exit', (code) => attemptClose(code, 'exit')); - if (outputHandler) { - logger(`Passing child process stdOut/stdErr to custom outputHandler`); - outputHandler(command, spawned.stdout, spawned.stderr, [...args]); - } - this._plugins.exec('spawn.after', undefined, Object.assign(Object.assign({}, pluginContext(task, args)), { spawned, kill(reason) { - if (spawned.killed) { - return; - } - rejection = reason; - spawned.kill('SIGINT'); - } })); - }); - }); - } -} -exports.GitExecutorChain = GitExecutorChain; -function pluginContext(task, commands) { - return { - method: utils.first(task.commands) || '', - commands, - }; -} -function onErrorReceived(target, logger) { - return (err) => { - logger(`[ERROR] child process exception %o`, err); - target.push(Buffer.from(String(err.stack), 'ascii')); - }; -} -function onDataReceived(target, name, logger, output) { - return (buffer) => { - logger(`%s received %L bytes`, name, buffer); - output(`%B`, buffer); - target.push(buffer); - }; -} -//# sourceMappingURL=git-executor-chain.js.map -}); - -var gitExecutor = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.GitExecutor = void 0; - -class GitExecutor { - constructor(binary = 'git', cwd, _scheduler, _plugins) { - this.binary = binary; - this.cwd = cwd; - this._scheduler = _scheduler; - this._plugins = _plugins; - this._chain = new gitExecutorChain.GitExecutorChain(this, this._scheduler, this._plugins); - } - chain() { - return new gitExecutorChain.GitExecutorChain(this, this._scheduler, this._plugins); - } - push(task) { - return this._chain.push(task); - } -} -exports.GitExecutor = GitExecutor; -//# sourceMappingURL=git-executor.js.map -}); - -var taskCallback_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.taskCallback = void 0; - - -function taskCallback(task, response, callback = utils.NOOP) { - const onSuccess = (data) => { - callback(null, data); - }; - const onError = (err) => { - if ((err === null || err === void 0 ? void 0 : err.task) === task) { - if (err instanceof gitResponseError.GitResponseError) { - return callback(addDeprecationNoticeToError(err)); - } - callback(err); - } - }; - response.then(onSuccess, onError); -} -exports.taskCallback = taskCallback; -function addDeprecationNoticeToError(err) { - let log = (name) => { - console.warn(`simple-git deprecation notice: accessing GitResponseError.${name} should be GitResponseError.git.${name}, this will no longer be available in version 3`); - log = utils.NOOP; - }; - return Object.create(err, Object.getOwnPropertyNames(err.git).reduce(descriptorReducer, {})); - function descriptorReducer(all, name) { - if (name in err) { - return all; - } - all[name] = { - enumerable: false, - configurable: false, - get() { - log(name); - return err.git[name]; - }, - }; - return all; - } -} -//# sourceMappingURL=task-callback.js.map -}); - -var parseRemoteObjects = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.remoteMessagesObjectParsers = void 0; - -function objectEnumerationResult(remoteMessages) { - return (remoteMessages.objects = remoteMessages.objects || { - compressing: 0, - counting: 0, - enumerating: 0, - packReused: 0, - reused: { count: 0, delta: 0 }, - total: { count: 0, delta: 0 } - }); -} -function asObjectCount(source) { - const count = /^\s*(\d+)/.exec(source); - const delta = /delta (\d+)/i.exec(source); - return { - count: utils.asNumber(count && count[1] || '0'), - delta: utils.asNumber(delta && delta[1] || '0'), - }; -} -exports.remoteMessagesObjectParsers = [ - new utils.RemoteLineParser(/^remote:\s*(enumerating|counting|compressing) objects: (\d+),/i, (result, [action, count]) => { - const key = action.toLowerCase(); - const enumeration = objectEnumerationResult(result.remoteMessages); - Object.assign(enumeration, { [key]: utils.asNumber(count) }); - }), - new utils.RemoteLineParser(/^remote:\s*(enumerating|counting|compressing) objects: \d+% \(\d+\/(\d+)\),/i, (result, [action, count]) => { - const key = action.toLowerCase(); - const enumeration = objectEnumerationResult(result.remoteMessages); - Object.assign(enumeration, { [key]: utils.asNumber(count) }); - }), - new utils.RemoteLineParser(/total ([^,]+), reused ([^,]+), pack-reused (\d+)/i, (result, [total, reused, packReused]) => { - const objects = objectEnumerationResult(result.remoteMessages); - objects.total = asObjectCount(total); - objects.reused = asObjectCount(reused); - objects.packReused = utils.asNumber(packReused); - }), -]; -//# sourceMappingURL=parse-remote-objects.js.map -}); - -var parseRemoteMessages_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.RemoteMessageSummary = exports.parseRemoteMessages = void 0; - - -const parsers = [ - new utils.RemoteLineParser(/^remote:\s*(.+)$/, (result, [text]) => { - result.remoteMessages.all.push(text.trim()); - return false; - }), - ...parseRemoteObjects.remoteMessagesObjectParsers, - new utils.RemoteLineParser([/create a (?:pull|merge) request/i, /\s(https?:\/\/\S+)$/], (result, [pullRequestUrl]) => { - result.remoteMessages.pullRequestUrl = pullRequestUrl; - }), - new utils.RemoteLineParser([/found (\d+) vulnerabilities.+\(([^)]+)\)/i, /\s(https?:\/\/\S+)$/], (result, [count, summary, url]) => { - result.remoteMessages.vulnerabilities = { - count: utils.asNumber(count), - summary, - url, - }; - }), -]; -function parseRemoteMessages(_stdOut, stdErr) { - return utils.parseStringResponse({ remoteMessages: new RemoteMessageSummary() }, parsers, stdErr); -} -exports.parseRemoteMessages = parseRemoteMessages; -class RemoteMessageSummary { - constructor() { - this.all = []; - } -} -exports.RemoteMessageSummary = RemoteMessageSummary; -//# sourceMappingURL=parse-remote-messages.js.map -}); - -var parsePush = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.parsePushDetail = exports.parsePushResult = void 0; - - -function pushResultPushedItem(local, remote, status) { - const deleted = status.includes('deleted'); - const tag = status.includes('tag') || /^refs\/tags/.test(local); - const alreadyUpdated = !status.includes('new'); - return { - deleted, - tag, - branch: !tag, - new: !alreadyUpdated, - alreadyUpdated, - local, - remote, - }; -} -const parsers = [ - new utils.LineParser(/^Pushing to (.+)$/, (result, [repo]) => { - result.repo = repo; - }), - new utils.LineParser(/^updating local tracking ref '(.+)'/, (result, [local]) => { - result.ref = Object.assign(Object.assign({}, (result.ref || {})), { local }); - }), - new utils.LineParser(/^[*-=]\s+([^:]+):(\S+)\s+\[(.+)]$/, (result, [local, remote, type]) => { - result.pushed.push(pushResultPushedItem(local, remote, type)); - }), - new utils.LineParser(/^Branch '([^']+)' set up to track remote branch '([^']+)' from '([^']+)'/, (result, [local, remote, remoteName]) => { - result.branch = Object.assign(Object.assign({}, (result.branch || {})), { local, - remote, - remoteName }); - }), - new utils.LineParser(/^([^:]+):(\S+)\s+([a-z0-9]+)\.\.([a-z0-9]+)$/, (result, [local, remote, from, to]) => { - result.update = { - head: { - local, - remote, - }, - hash: { - from, - to, - }, - }; - }), -]; -const parsePushResult = (stdOut, stdErr) => { - const pushDetail = exports.parsePushDetail(stdOut, stdErr); - const responseDetail = parseRemoteMessages_1.parseRemoteMessages(stdOut, stdErr); - return Object.assign(Object.assign({}, pushDetail), responseDetail); -}; -exports.parsePushResult = parsePushResult; -const parsePushDetail = (stdOut, stdErr) => { - return utils.parseStringResponse({ pushed: [] }, parsers, stdOut, stdErr); -}; -exports.parsePushDetail = parsePushDetail; -//# sourceMappingURL=parse-push.js.map -}); - -var push = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.pushTask = exports.pushTagsTask = void 0; - - -function pushTagsTask(ref = {}, customArgs) { - utils.append(customArgs, '--tags'); - return pushTask(ref, customArgs); -} -exports.pushTagsTask = pushTagsTask; -function pushTask(ref = {}, customArgs) { - const commands = ['push', ...customArgs]; - if (ref.branch) { - commands.splice(1, 0, ref.branch); - } - if (ref.remote) { - commands.splice(1, 0, ref.remote); - } - utils.remove(commands, '-v'); - utils.append(commands, '--verbose'); - utils.append(commands, '--porcelain'); - return { - commands, - format: 'utf-8', - parser: parsePush.parsePushResult, - }; -} -exports.pushTask = pushTask; -//# sourceMappingURL=push.js.map -}); - -var simpleGitApi = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.SimpleGitApi = void 0; - - - - -class SimpleGitApi { - constructor(_executor) { - this._executor = _executor; - } - _runTask(task, then) { - const chain = this._executor.chain(); - const promise = chain.push(task); - if (then) { - taskCallback_1.taskCallback(task, promise, then); - } - return Object.create(this, { - then: { value: promise.then.bind(promise) }, - catch: { value: promise.catch.bind(promise) }, - _executor: { value: chain }, - }); - } - add(files) { - return this._runTask(task.straightThroughStringTask(['add', ...utils.asArray(files)]), utils.trailingFunctionArgument(arguments)); - } - push() { - const task = push.pushTask({ - remote: utils.filterType(arguments[0], utils.filterString), - branch: utils.filterType(arguments[1], utils.filterString), - }, utils.getTrailingOptions(arguments)); - return this._runTask(task, utils.trailingFunctionArgument(arguments)); - } -} -exports.SimpleGitApi = SimpleGitApi; -//# sourceMappingURL=simple-git-api.js.map -}); - -var dist = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.createDeferred = exports.deferred = void 0; -/** - * Creates a new `DeferredPromise` - * - * ```typescript - import {deferred} from '@kwsites/promise-deferred`; - ``` - */ -function deferred() { - let done; - let fail; - let status = 'pending'; - const promise = new Promise((_done, _fail) => { - done = _done; - fail = _fail; - }); - return { - promise, - done(result) { - if (status === 'pending') { - status = 'resolved'; - done(result); - } - }, - fail(error) { - if (status === 'pending') { - status = 'rejected'; - fail(error); - } - }, - get fulfilled() { - return status !== 'pending'; - }, - get status() { - return status; - }, - }; -} -exports.deferred = deferred; -/** - * Alias of the exported `deferred` function, to help consumers wanting to use `deferred` as the - * local variable name rather than the factory import name, without needing to rename on import. - * - * ```typescript - import {createDeferred} from '@kwsites/promise-deferred`; - ``` - */ -exports.createDeferred = deferred; -/** - * Default export allows use as: - * - * ```typescript - import deferred from '@kwsites/promise-deferred`; - ``` - */ -exports.default = deferred; -//# sourceMappingURL=index.js.map -}); - -var scheduler = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Scheduler = void 0; - - - -const createScheduledTask = (() => { - let id = 0; - return () => { - id++; - const { promise, done } = dist.createDeferred(); - return { - promise, - done, - id, - }; - }; -})(); -class Scheduler { - constructor(concurrency = 2) { - this.concurrency = concurrency; - this.logger = gitLogger.createLogger('', 'scheduler'); - this.pending = []; - this.running = []; - this.logger(`Constructed, concurrency=%s`, concurrency); - } - schedule() { - if (!this.pending.length || this.running.length >= this.concurrency) { - this.logger(`Schedule attempt ignored, pending=%s running=%s concurrency=%s`, this.pending.length, this.running.length, this.concurrency); - return; - } - const task = utils.append(this.running, this.pending.shift()); - this.logger(`Attempting id=%s`, task.id); - task.done(() => { - this.logger(`Completing id=`, task.id); - utils.remove(this.running, task); - this.schedule(); - }); - } - next() { - const { promise, id } = utils.append(this.pending, createScheduledTask()); - this.logger(`Scheduling id=%s`, id); - this.schedule(); - return promise; - } -} -exports.Scheduler = Scheduler; -//# sourceMappingURL=scheduler.js.map -}); - -var applyPatch = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.applyPatchTask = void 0; - -function applyPatchTask(patches, customArgs) { - return task.straightThroughStringTask(['apply', ...customArgs, ...patches]); -} -exports.applyPatchTask = applyPatchTask; -//# sourceMappingURL=apply-patch.js.map -}); - -var BranchDeleteSummary = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.isSingleBranchDeleteFailure = exports.branchDeletionFailure = exports.branchDeletionSuccess = exports.BranchDeletionBatch = void 0; -class BranchDeletionBatch { - constructor() { - this.all = []; - this.branches = {}; - this.errors = []; - } - get success() { - return !this.errors.length; - } -} -exports.BranchDeletionBatch = BranchDeletionBatch; -function branchDeletionSuccess(branch, hash) { - return { - branch, hash, success: true, - }; -} -exports.branchDeletionSuccess = branchDeletionSuccess; -function branchDeletionFailure(branch) { - return { - branch, hash: null, success: false, - }; -} -exports.branchDeletionFailure = branchDeletionFailure; -function isSingleBranchDeleteFailure(test) { - return test.success; -} -exports.isSingleBranchDeleteFailure = isSingleBranchDeleteFailure; -//# sourceMappingURL=BranchDeleteSummary.js.map -}); - -var parseBranchDelete = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.hasBranchDeletionError = exports.parseBranchDeletions = void 0; - - -const deleteSuccessRegex = /(\S+)\s+\(\S+\s([^)]+)\)/; -const deleteErrorRegex = /^error[^']+'([^']+)'/m; -const parsers = [ - new utils.LineParser(deleteSuccessRegex, (result, [branch, hash]) => { - const deletion = BranchDeleteSummary.branchDeletionSuccess(branch, hash); - result.all.push(deletion); - result.branches[branch] = deletion; - }), - new utils.LineParser(deleteErrorRegex, (result, [branch]) => { - const deletion = BranchDeleteSummary.branchDeletionFailure(branch); - result.errors.push(deletion); - result.all.push(deletion); - result.branches[branch] = deletion; - }), -]; -const parseBranchDeletions = (stdOut, stdErr) => { - return utils.parseStringResponse(new BranchDeleteSummary.BranchDeletionBatch(), parsers, stdOut, stdErr); -}; -exports.parseBranchDeletions = parseBranchDeletions; -function hasBranchDeletionError(data, processExitCode) { - return processExitCode === utils.ExitCodes.ERROR && deleteErrorRegex.test(data); -} -exports.hasBranchDeletionError = hasBranchDeletionError; -//# sourceMappingURL=parse-branch-delete.js.map -}); - -var BranchSummary = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.BranchSummaryResult = void 0; -class BranchSummaryResult { - constructor() { - this.all = []; - this.branches = {}; - this.current = ''; - this.detached = false; - } - push(current, detached, name, commit, label) { - if (current) { - this.detached = detached; - this.current = name; - } - this.all.push(name); - this.branches[name] = { - current: current, - name: name, - commit: commit, - label: label - }; - } -} -exports.BranchSummaryResult = BranchSummaryResult; -//# sourceMappingURL=BranchSummary.js.map -}); - -var parseBranch = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.parseBranchSummary = void 0; - - -const parsers = [ - new utils.LineParser(/^(\*\s)?\((?:HEAD )?detached (?:from|at) (\S+)\)\s+([a-z0-9]+)\s(.*)$/, (result, [current, name, commit, label]) => { - result.push(!!current, true, name, commit, label); - }), - new utils.LineParser(/^(\*\s)?(\S+)\s+([a-z0-9]+)\s(.*)$/s, (result, [current, name, commit, label]) => { - result.push(!!current, false, name, commit, label); - }) -]; -function parseBranchSummary(stdOut) { - return utils.parseStringResponse(new BranchSummary.BranchSummaryResult(), parsers, stdOut); -} -exports.parseBranchSummary = parseBranchSummary; -//# sourceMappingURL=parse-branch.js.map -}); - -var branch = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.deleteBranchTask = exports.deleteBranchesTask = exports.branchLocalTask = exports.branchTask = exports.containsDeleteBranchCommand = void 0; - - - - -function containsDeleteBranchCommand(commands) { - const deleteCommands = ['-d', '-D', '--delete']; - return commands.some(command => deleteCommands.includes(command)); -} -exports.containsDeleteBranchCommand = containsDeleteBranchCommand; -function branchTask(customArgs) { - const isDelete = containsDeleteBranchCommand(customArgs); - const commands = ['branch', ...customArgs]; - if (commands.length === 1) { - commands.push('-a'); - } - if (!commands.includes('-v')) { - commands.splice(1, 0, '-v'); - } - return { - format: 'utf-8', - commands, - parser(stdOut, stdErr) { - if (isDelete) { - return parseBranchDelete.parseBranchDeletions(stdOut, stdErr).all[0]; - } - return parseBranch.parseBranchSummary(stdOut); - }, - }; -} -exports.branchTask = branchTask; -function branchLocalTask() { - const parser = parseBranch.parseBranchSummary; - return { - format: 'utf-8', - commands: ['branch', '-v'], - parser, - }; -} -exports.branchLocalTask = branchLocalTask; -function deleteBranchesTask(branches, forceDelete = false) { - return { - format: 'utf-8', - commands: ['branch', '-v', forceDelete ? '-D' : '-d', ...branches], - parser(stdOut, stdErr) { - return parseBranchDelete.parseBranchDeletions(stdOut, stdErr); - }, - onError({ exitCode, stdOut }, error, done, fail) { - if (!parseBranchDelete.hasBranchDeletionError(String(error), exitCode)) { - return fail(error); - } - done(stdOut); - }, - }; -} -exports.deleteBranchesTask = deleteBranchesTask; -function deleteBranchTask(branch, forceDelete = false) { - const task = { - format: 'utf-8', - commands: ['branch', '-v', forceDelete ? '-D' : '-d', branch], - parser(stdOut, stdErr) { - return parseBranchDelete.parseBranchDeletions(stdOut, stdErr).branches[branch]; - }, - onError({ exitCode, stdErr, stdOut }, error, _, fail) { - if (!parseBranchDelete.hasBranchDeletionError(String(error), exitCode)) { - return fail(error); - } - throw new gitResponseError.GitResponseError(task.parser(utils.bufferToString(stdOut), utils.bufferToString(stdErr)), String(error)); - }, - }; - return task; -} -exports.deleteBranchTask = deleteBranchTask; -//# sourceMappingURL=branch.js.map -}); - -var CheckIgnore = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.parseCheckIgnore = void 0; -/** - * Parser for the `check-ignore` command - returns each file as a string array - */ -const parseCheckIgnore = (text) => { - return text.split(/\n/g) - .map(line => line.trim()) - .filter(file => !!file); -}; -exports.parseCheckIgnore = parseCheckIgnore; -//# sourceMappingURL=CheckIgnore.js.map -}); - -var checkIgnore = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.checkIgnoreTask = void 0; - -function checkIgnoreTask(paths) { - return { - commands: ['check-ignore', ...paths], - format: 'utf-8', - parser: CheckIgnore.parseCheckIgnore, - }; -} -exports.checkIgnoreTask = checkIgnoreTask; -//# sourceMappingURL=check-ignore.js.map -}); - -var clone = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.cloneMirrorTask = exports.cloneTask = void 0; - - -function cloneTask(repo, directory, customArgs) { - const commands = ['clone', ...customArgs]; - if (typeof repo === 'string') { - commands.push(repo); - } - if (typeof directory === 'string') { - commands.push(directory); - } - return task.straightThroughStringTask(commands); -} -exports.cloneTask = cloneTask; -function cloneMirrorTask(repo, directory, customArgs) { - utils.append(customArgs, '--mirror'); - return cloneTask(repo, directory, customArgs); -} -exports.cloneMirrorTask = cloneMirrorTask; -//# sourceMappingURL=clone.js.map -}); - -var ConfigList_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.configListParser = exports.ConfigList = void 0; - -class ConfigList { - constructor() { - this.files = []; - this.values = Object.create(null); - } - get all() { - if (!this._all) { - this._all = this.files.reduce((all, file) => { - return Object.assign(all, this.values[file]); - }, {}); - } - return this._all; - } - addFile(file) { - if (!(file in this.values)) { - const latest = utils.last(this.files); - this.values[file] = latest ? Object.create(this.values[latest]) : {}; - this.files.push(file); - } - return this.values[file]; - } - addValue(file, key, value) { - const values = this.addFile(file); - if (!values.hasOwnProperty(key)) { - values[key] = value; - } - else if (Array.isArray(values[key])) { - values[key].push(value); - } - else { - values[key] = [values[key], value]; - } - this._all = undefined; - } -} -exports.ConfigList = ConfigList; -function configListParser(text) { - const config = new ConfigList(); - const lines = text.split('\0'); - for (let i = 0, max = lines.length - 1; i < max;) { - const file = configFilePath(lines[i++]); - const [key, value] = utils.splitOn(lines[i++], '\n'); - config.addValue(file, key, value); - } - return config; -} -exports.configListParser = configListParser; -function configFilePath(filePath) { - return filePath.replace(/^(file):/, ''); -} -//# sourceMappingURL=ConfigList.js.map -}); - -var config = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.listConfigTask = exports.addConfigTask = void 0; - -function addConfigTask(key, value, append = false) { - const commands = ['config', '--local']; - if (append) { - commands.push('--add'); - } - commands.push(key, value); - return { - commands, - format: 'utf-8', - parser(text) { - return text; - } - }; -} -exports.addConfigTask = addConfigTask; -function listConfigTask() { - return { - commands: ['config', '--list', '--show-origin', '--null'], - format: 'utf-8', - parser(text) { - return ConfigList_1.configListParser(text); - }, - }; -} -exports.listConfigTask = listConfigTask; -//# sourceMappingURL=config.js.map -}); - -var parseCommit = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.parseCommitResult = void 0; - -const parsers = [ - new utils.LineParser(/\[([^\s]+)( \([^)]+\))? ([^\]]+)/, (result, [branch, root, commit]) => { - result.branch = branch; - result.commit = commit; - result.root = !!root; - }), - new utils.LineParser(/\s*Author:\s(.+)/i, (result, [author]) => { - const parts = author.split('<'); - const email = parts.pop(); - if (!email || !email.includes('@')) { - return; - } - result.author = { - email: email.substr(0, email.length - 1), - name: parts.join('<').trim() - }; - }), - new utils.LineParser(/(\d+)[^,]*(?:,\s*(\d+)[^,]*)(?:,\s*(\d+))/g, (result, [changes, insertions, deletions]) => { - result.summary.changes = parseInt(changes, 10) || 0; - result.summary.insertions = parseInt(insertions, 10) || 0; - result.summary.deletions = parseInt(deletions, 10) || 0; - }), - new utils.LineParser(/^(\d+)[^,]*(?:,\s*(\d+)[^(]+\(([+-]))?/, (result, [changes, lines, direction]) => { - result.summary.changes = parseInt(changes, 10) || 0; - const count = parseInt(lines, 10) || 0; - if (direction === '-') { - result.summary.deletions = count; - } - else if (direction === '+') { - result.summary.insertions = count; - } - }), -]; -function parseCommitResult(stdOut) { - const result = { - author: null, - branch: '', - commit: '', - root: false, - summary: { - changes: 0, - insertions: 0, - deletions: 0, - }, - }; - return utils.parseStringResponse(result, parsers, stdOut); -} -exports.parseCommitResult = parseCommitResult; -//# sourceMappingURL=parse-commit.js.map -}); - -var commit = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.commitTask = void 0; - -function commitTask(message, files, customArgs) { - const commands = ['commit']; - message.forEach((m) => commands.push('-m', m)); - commands.push(...files, ...customArgs); - return { - commands, - format: 'utf-8', - parser: parseCommit.parseCommitResult, - }; -} -exports.commitTask = commitTask; -//# sourceMappingURL=commit.js.map -}); - -var DiffSummary_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.DiffSummary = void 0; -/*** - * The DiffSummary is returned as a response to getting `git().status()` - */ -class DiffSummary { - constructor() { - this.changed = 0; - this.deletions = 0; - this.insertions = 0; - this.files = []; - } -} -exports.DiffSummary = DiffSummary; -//# sourceMappingURL=DiffSummary.js.map -}); - -var parseDiffSummary = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.parseDiffResult = void 0; - -function parseDiffResult(stdOut) { - const lines = stdOut.trim().split('\n'); - const status = new DiffSummary_1.DiffSummary(); - readSummaryLine(status, lines.pop()); - for (let i = 0, max = lines.length; i < max; i++) { - const line = lines[i]; - textFileChange(line, status) || binaryFileChange(line, status); - } - return status; -} -exports.parseDiffResult = parseDiffResult; -function readSummaryLine(status, summary) { - (summary || '') - .trim() - .split(', ') - .forEach(function (text) { - const summary = /(\d+)\s([a-z]+)/.exec(text); - if (!summary) { - return; - } - summaryType(status, summary[2], parseInt(summary[1], 10)); - }); -} -function summaryType(status, key, value) { - const match = (/([a-z]+?)s?\b/.exec(key)); - if (!match || !statusUpdate[match[1]]) { - return; - } - statusUpdate[match[1]](status, value); -} -const statusUpdate = { - file(status, value) { - status.changed = value; - }, - deletion(status, value) { - status.deletions = value; - }, - insertion(status, value) { - status.insertions = value; - } -}; -function textFileChange(input, { files }) { - const line = input.trim().match(/^(.+)\s+\|\s+(\d+)(\s+[+\-]+)?$/); - if (line) { - var alterations = (line[3] || '').trim(); - files.push({ - file: line[1].trim(), - changes: parseInt(line[2], 10), - insertions: alterations.replace(/-/g, '').length, - deletions: alterations.replace(/\+/g, '').length, - binary: false - }); - return true; - } - return false; -} -function binaryFileChange(input, { files }) { - const line = input.match(/^(.+) \|\s+Bin ([0-9.]+) -> ([0-9.]+) ([a-z]+)$/); - if (line) { - files.push({ - file: line[1].trim(), - before: +line[2], - after: +line[3], - binary: true - }); - return true; - } - return false; -} -//# sourceMappingURL=parse-diff-summary.js.map -}); - -var diff = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.diffSummaryTask = void 0; - -function diffSummaryTask(customArgs) { - return { - commands: ['diff', '--stat=4096', ...customArgs], - format: 'utf-8', - parser(stdOut) { - return parseDiffSummary.parseDiffResult(stdOut); - } - }; -} -exports.diffSummaryTask = diffSummaryTask; -//# sourceMappingURL=diff.js.map -}); - -var parseFetch = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.parseFetchResult = void 0; - -const parsers = [ - new utils.LineParser(/From (.+)$/, (result, [remote]) => { - result.remote = remote; - }), - new utils.LineParser(/\* \[new branch]\s+(\S+)\s*-> (.+)$/, (result, [name, tracking]) => { - result.branches.push({ - name, - tracking, - }); - }), - new utils.LineParser(/\* \[new tag]\s+(\S+)\s*-> (.+)$/, (result, [name, tracking]) => { - result.tags.push({ - name, - tracking, - }); - }) -]; -function parseFetchResult(stdOut, stdErr) { - const result = { - raw: stdOut, - remote: null, - branches: [], - tags: [], - }; - return utils.parseStringResponse(result, parsers, stdOut, stdErr); -} -exports.parseFetchResult = parseFetchResult; -//# sourceMappingURL=parse-fetch.js.map -}); - -var fetch = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.fetchTask = void 0; - -function fetchTask(remote, branch, customArgs) { - const commands = ['fetch', ...customArgs]; - if (remote && branch) { - commands.push(remote, branch); - } - return { - commands, - format: 'utf-8', - parser: parseFetch.parseFetchResult, - }; -} -exports.fetchTask = fetchTask; -//# sourceMappingURL=fetch.js.map -}); - -var hashObject = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.hashObjectTask = void 0; - -/** - * Task used by `git.hashObject` - */ -function hashObjectTask(filePath, write) { - const commands = ['hash-object', filePath]; - if (write) { - commands.push('-w'); - } - return task.straightThroughStringTask(commands, true); -} -exports.hashObjectTask = hashObjectTask; -//# sourceMappingURL=hash-object.js.map -}); - -var InitSummary_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.parseInit = exports.InitSummary = void 0; -class InitSummary { - constructor(bare, path, existing, gitDir) { - this.bare = bare; - this.path = path; - this.existing = existing; - this.gitDir = gitDir; - } -} -exports.InitSummary = InitSummary; -const initResponseRegex = /^Init.+ repository in (.+)$/; -const reInitResponseRegex = /^Rein.+ in (.+)$/; -function parseInit(bare, path, text) { - const response = String(text).trim(); - let result; - if ((result = initResponseRegex.exec(response))) { - return new InitSummary(bare, path, false, result[1]); - } - if ((result = reInitResponseRegex.exec(response))) { - return new InitSummary(bare, path, true, result[1]); - } - let gitDir = ''; - const tokens = response.split(' '); - while (tokens.length) { - const token = tokens.shift(); - if (token === 'in') { - gitDir = tokens.join(' '); - break; - } - } - return new InitSummary(bare, path, /^re/i.test(response), gitDir); -} -exports.parseInit = parseInit; -//# sourceMappingURL=InitSummary.js.map -}); - -var init = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.initTask = void 0; - -const bareCommand = '--bare'; -function hasBareCommand(command) { - return command.includes(bareCommand); -} -function initTask(bare = false, path, customArgs) { - const commands = ['init', ...customArgs]; - if (bare && !hasBareCommand(commands)) { - commands.splice(1, 0, bareCommand); - } - return { - commands, - format: 'utf-8', - parser(text) { - return InitSummary_1.parseInit(commands.includes('--bare'), path, text); - } - }; -} -exports.initTask = initTask; -//# sourceMappingURL=init.js.map -}); - -var parseListLogSummary = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.createListLogSummaryParser = exports.SPLITTER = exports.COMMIT_BOUNDARY = exports.START_BOUNDARY = void 0; - - -exports.START_BOUNDARY = 'òòòòòò '; -exports.COMMIT_BOUNDARY = ' òò'; -exports.SPLITTER = ' ò '; -const defaultFieldNames = ['hash', 'date', 'message', 'refs', 'author_name', 'author_email']; -function lineBuilder(tokens, fields) { - return fields.reduce((line, field, index) => { - line[field] = tokens[index] || ''; - return line; - }, Object.create({ diff: null })); -} -function createListLogSummaryParser(splitter = exports.SPLITTER, fields = defaultFieldNames) { - return function (stdOut) { - const all = utils.toLinesWithContent(stdOut, true, exports.START_BOUNDARY) - .map(function (item) { - const lineDetail = item.trim().split(exports.COMMIT_BOUNDARY); - const listLogLine = lineBuilder(lineDetail[0].trim().split(splitter), fields); - if (lineDetail.length > 1 && !!lineDetail[1].trim()) { - listLogLine.diff = parseDiffSummary.parseDiffResult(lineDetail[1]); - } - return listLogLine; - }); - return { - all, - latest: all.length && all[0] || null, - total: all.length, - }; - }; -} -exports.createListLogSummaryParser = createListLogSummaryParser; -//# sourceMappingURL=parse-list-log-summary.js.map -}); - -var log = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.logTask = exports.parseLogOptions = void 0; - - -var excludeOptions; -(function (excludeOptions) { - excludeOptions[excludeOptions["--pretty"] = 0] = "--pretty"; - excludeOptions[excludeOptions["max-count"] = 1] = "max-count"; - excludeOptions[excludeOptions["maxCount"] = 2] = "maxCount"; - excludeOptions[excludeOptions["n"] = 3] = "n"; - excludeOptions[excludeOptions["file"] = 4] = "file"; - excludeOptions[excludeOptions["format"] = 5] = "format"; - excludeOptions[excludeOptions["from"] = 6] = "from"; - excludeOptions[excludeOptions["to"] = 7] = "to"; - excludeOptions[excludeOptions["splitter"] = 8] = "splitter"; - excludeOptions[excludeOptions["symmetric"] = 9] = "symmetric"; - excludeOptions[excludeOptions["multiLine"] = 10] = "multiLine"; - excludeOptions[excludeOptions["strictDate"] = 11] = "strictDate"; -})(excludeOptions || (excludeOptions = {})); -function prettyFormat(format, splitter) { - const fields = []; - const formatStr = []; - Object.keys(format).forEach((field) => { - fields.push(field); - formatStr.push(String(format[field])); - }); - return [ - fields, formatStr.join(splitter) - ]; -} -function userOptions(input) { - const output = Object.assign({}, input); - Object.keys(input).forEach(key => { - if (key in excludeOptions) { - delete output[key]; - } - }); - return output; -} -function parseLogOptions(opt = {}, customArgs = []) { - const splitter = opt.splitter || parseListLogSummary.SPLITTER; - const format = opt.format || { - hash: '%H', - date: opt.strictDate === false ? '%ai' : '%aI', - message: '%s', - refs: '%D', - body: opt.multiLine ? '%B' : '%b', - author_name: '%aN', - author_email: '%ae' - }; - const [fields, formatStr] = prettyFormat(format, splitter); - const suffix = []; - const command = [ - `--pretty=format:${parseListLogSummary.START_BOUNDARY}${formatStr}${parseListLogSummary.COMMIT_BOUNDARY}`, - ...customArgs, - ]; - const maxCount = opt.n || opt['max-count'] || opt.maxCount; - if (maxCount) { - command.push(`--max-count=${maxCount}`); - } - if (opt.from && opt.to) { - const rangeOperator = (opt.symmetric !== false) ? '...' : '..'; - suffix.push(`${opt.from}${rangeOperator}${opt.to}`); - } - if (opt.file) { - suffix.push('--follow', opt.file); - } - utils.appendTaskOptions(userOptions(opt), command); - return { - fields, - splitter, - commands: [ - ...command, - ...suffix, - ], - }; -} -exports.parseLogOptions = parseLogOptions; -function logTask(splitter, fields, customArgs) { - return { - commands: ['log', ...customArgs], - format: 'utf-8', - parser: parseListLogSummary.createListLogSummaryParser(splitter, fields), - }; -} -exports.logTask = logTask; -//# sourceMappingURL=log.js.map -}); - -var MergeSummary = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.MergeSummaryDetail = exports.MergeSummaryConflict = void 0; -class MergeSummaryConflict { - constructor(reason, file = null, meta) { - this.reason = reason; - this.file = file; - this.meta = meta; - } - toString() { - return `${this.file}:${this.reason}`; - } -} -exports.MergeSummaryConflict = MergeSummaryConflict; -class MergeSummaryDetail { - constructor() { - this.conflicts = []; - this.merges = []; - this.result = 'success'; - } - get failed() { - return this.conflicts.length > 0; - } - get reason() { - return this.result; - } - toString() { - if (this.conflicts.length) { - return `CONFLICTS: ${this.conflicts.join(', ')}`; - } - return 'OK'; - } -} -exports.MergeSummaryDetail = MergeSummaryDetail; -//# sourceMappingURL=MergeSummary.js.map -}); - -var PullSummary_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.PullSummary = void 0; -class PullSummary { - constructor() { - this.remoteMessages = { - all: [], - }; - this.created = []; - this.deleted = []; - this.files = []; - this.deletions = {}; - this.insertions = {}; - this.summary = { - changes: 0, - deletions: 0, - insertions: 0, - }; - } -} -exports.PullSummary = PullSummary; -//# sourceMappingURL=PullSummary.js.map -}); - -var parsePull = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.parsePullResult = exports.parsePullDetail = void 0; - - - -const FILE_UPDATE_REGEX = /^\s*(.+?)\s+\|\s+\d+\s*(\+*)(-*)/; -const SUMMARY_REGEX = /(\d+)\D+((\d+)\D+\(\+\))?(\D+(\d+)\D+\(-\))?/; -const ACTION_REGEX = /^(create|delete) mode \d+ (.+)/; -const parsers = [ - new utils.LineParser(FILE_UPDATE_REGEX, (result, [file, insertions, deletions]) => { - result.files.push(file); - if (insertions) { - result.insertions[file] = insertions.length; - } - if (deletions) { - result.deletions[file] = deletions.length; - } - }), - new utils.LineParser(SUMMARY_REGEX, (result, [changes, , insertions, , deletions]) => { - if (insertions !== undefined || deletions !== undefined) { - result.summary.changes = +changes || 0; - result.summary.insertions = +insertions || 0; - result.summary.deletions = +deletions || 0; - return true; - } - return false; - }), - new utils.LineParser(ACTION_REGEX, (result, [action, file]) => { - utils.append(result.files, file); - utils.append((action === 'create') ? result.created : result.deleted, file); - }), -]; -const parsePullDetail = (stdOut, stdErr) => { - return utils.parseStringResponse(new PullSummary_1.PullSummary(), parsers, stdOut, stdErr); -}; -exports.parsePullDetail = parsePullDetail; -const parsePullResult = (stdOut, stdErr) => { - return Object.assign(new PullSummary_1.PullSummary(), exports.parsePullDetail(stdOut, stdErr), parseRemoteMessages_1.parseRemoteMessages(stdOut, stdErr)); -}; -exports.parsePullResult = parsePullResult; -//# sourceMappingURL=parse-pull.js.map -}); - -var parseMerge = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.parseMergeDetail = exports.parseMergeResult = void 0; - - - -const parsers = [ - new utils.LineParser(/^Auto-merging\s+(.+)$/, (summary, [autoMerge]) => { - summary.merges.push(autoMerge); - }), - new utils.LineParser(/^CONFLICT\s+\((.+)\): Merge conflict in (.+)$/, (summary, [reason, file]) => { - summary.conflicts.push(new MergeSummary.MergeSummaryConflict(reason, file)); - }), - new utils.LineParser(/^CONFLICT\s+\((.+\/delete)\): (.+) deleted in (.+) and/, (summary, [reason, file, deleteRef]) => { - summary.conflicts.push(new MergeSummary.MergeSummaryConflict(reason, file, { deleteRef })); - }), - new utils.LineParser(/^CONFLICT\s+\((.+)\):/, (summary, [reason]) => { - summary.conflicts.push(new MergeSummary.MergeSummaryConflict(reason, null)); - }), - new utils.LineParser(/^Automatic merge failed;\s+(.+)$/, (summary, [result]) => { - summary.result = result; - }), -]; -/** - * Parse the complete response from `git.merge` - */ -const parseMergeResult = (stdOut, stdErr) => { - return Object.assign(exports.parseMergeDetail(stdOut, stdErr), parsePull.parsePullResult(stdOut, stdErr)); -}; -exports.parseMergeResult = parseMergeResult; -/** - * Parse the merge specific detail (ie: not the content also available in the pull detail) from `git.mnerge` - * @param stdOut - */ -const parseMergeDetail = (stdOut) => { - return utils.parseStringResponse(new MergeSummary.MergeSummaryDetail(), parsers, stdOut); -}; -exports.parseMergeDetail = parseMergeDetail; -//# sourceMappingURL=parse-merge.js.map -}); - -var merge = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.mergeTask = void 0; - - - -function mergeTask(customArgs) { - if (!customArgs.length) { - return task.configurationErrorTask('Git.merge requires at least one option'); - } - return { - commands: ['merge', ...customArgs], - format: 'utf-8', - parser(stdOut, stdErr) { - const merge = parseMerge.parseMergeResult(stdOut, stdErr); - if (merge.failed) { - throw new gitResponseError.GitResponseError(merge); - } - return merge; - } - }; -} -exports.mergeTask = mergeTask; -//# sourceMappingURL=merge.js.map -}); - -var parseMove = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.parseMoveResult = void 0; - -const parsers = [ - new utils.LineParser(/^Renaming (.+) to (.+)$/, (result, [from, to]) => { - result.moves.push({ from, to }); - }), -]; -function parseMoveResult(stdOut) { - return utils.parseStringResponse({ moves: [] }, parsers, stdOut); -} -exports.parseMoveResult = parseMoveResult; -//# sourceMappingURL=parse-move.js.map -}); - -var move = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.moveTask = void 0; - - -function moveTask(from, to) { - return { - commands: ['mv', '-v', ...utils.asArray(from), to], - format: 'utf-8', - parser: parseMove.parseMoveResult, - }; -} -exports.moveTask = moveTask; -//# sourceMappingURL=move.js.map -}); - -var pull = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.pullTask = void 0; - -function pullTask(remote, branch, customArgs) { - const commands = ['pull', ...customArgs]; - if (remote && branch) { - commands.splice(1, 0, remote, branch); - } - return { - commands, - format: 'utf-8', - parser(stdOut, stdErr) { - return parsePull.parsePullResult(stdOut, stdErr); - } - }; -} -exports.pullTask = pullTask; -//# sourceMappingURL=pull.js.map -}); - -var GetRemoteSummary = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.parseGetRemotesVerbose = exports.parseGetRemotes = void 0; - -function parseGetRemotes(text) { - const remotes = {}; - forEach(text, ([name]) => remotes[name] = { name }); - return Object.values(remotes); -} -exports.parseGetRemotes = parseGetRemotes; -function parseGetRemotesVerbose(text) { - const remotes = {}; - forEach(text, ([name, url, purpose]) => { - if (!remotes.hasOwnProperty(name)) { - remotes[name] = { - name: name, - refs: { fetch: '', push: '' }, - }; - } - if (purpose && url) { - remotes[name].refs[purpose.replace(/[^a-z]/g, '')] = url; - } - }); - return Object.values(remotes); -} -exports.parseGetRemotesVerbose = parseGetRemotesVerbose; -function forEach(text, handler) { - utils.forEachLineWithContent(text, (line) => handler(line.split(/\s+/))); -} -//# sourceMappingURL=GetRemoteSummary.js.map -}); - -var remote = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.removeRemoteTask = exports.remoteTask = exports.listRemotesTask = exports.getRemotesTask = exports.addRemoteTask = void 0; - - -function addRemoteTask(remoteName, remoteRepo, customArgs = []) { - return task.straightThroughStringTask(['remote', 'add', ...customArgs, remoteName, remoteRepo]); -} -exports.addRemoteTask = addRemoteTask; -function getRemotesTask(verbose) { - const commands = ['remote']; - if (verbose) { - commands.push('-v'); - } - return { - commands, - format: 'utf-8', - parser: verbose ? GetRemoteSummary.parseGetRemotesVerbose : GetRemoteSummary.parseGetRemotes, - }; -} -exports.getRemotesTask = getRemotesTask; -function listRemotesTask(customArgs = []) { - const commands = [...customArgs]; - if (commands[0] !== 'ls-remote') { - commands.unshift('ls-remote'); - } - return task.straightThroughStringTask(commands); -} -exports.listRemotesTask = listRemotesTask; -function remoteTask(customArgs = []) { - const commands = [...customArgs]; - if (commands[0] !== 'remote') { - commands.unshift('remote'); - } - return task.straightThroughStringTask(commands); -} -exports.remoteTask = remoteTask; -function removeRemoteTask(remoteName) { - return task.straightThroughStringTask(['remote', 'remove', remoteName]); -} -exports.removeRemoteTask = removeRemoteTask; -//# sourceMappingURL=remote.js.map -}); - -var stashList = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.stashListTask = void 0; - - -function stashListTask(opt = {}, customArgs) { - const options = log.parseLogOptions(opt); - const parser = parseListLogSummary.createListLogSummaryParser(options.splitter, options.fields); - return { - commands: ['stash', 'list', ...options.commands, ...customArgs], - format: 'utf-8', - parser, - }; -} -exports.stashListTask = stashListTask; -//# sourceMappingURL=stash-list.js.map -}); - -var FileStatusSummary_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.FileStatusSummary = exports.fromPathRegex = void 0; -exports.fromPathRegex = /^(.+) -> (.+)$/; -class FileStatusSummary { - constructor(path, index, working_dir) { - this.path = path; - this.index = index; - this.working_dir = working_dir; - if ('R' === (index + working_dir)) { - const detail = exports.fromPathRegex.exec(path) || [null, path, path]; - this.from = detail[1] || ''; - this.path = detail[2] || ''; - } - } -} -exports.FileStatusSummary = FileStatusSummary; -//# sourceMappingURL=FileStatusSummary.js.map -}); - -var StatusSummary_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.parseStatusSummary = exports.StatusSummary = void 0; - - -/** - * The StatusSummary is returned as a response to getting `git().status()` - */ -class StatusSummary { - constructor() { - this.not_added = []; - this.conflicted = []; - this.created = []; - this.deleted = []; - this.modified = []; - this.renamed = []; - /** - * All files represented as an array of objects containing the `path` and status in `index` and - * in the `working_dir`. - */ - this.files = []; - this.staged = []; - /** - * Number of commits ahead of the tracked branch - */ - this.ahead = 0; - /** - *Number of commits behind the tracked branch - */ - this.behind = 0; - /** - * Name of the current branch - */ - this.current = null; - /** - * Name of the branch being tracked - */ - this.tracking = null; - } - /** - * Gets whether this StatusSummary represents a clean working branch. - */ - isClean() { - return !this.files.length; - } -} -exports.StatusSummary = StatusSummary; -var PorcelainFileStatus; -(function (PorcelainFileStatus) { - PorcelainFileStatus["ADDED"] = "A"; - PorcelainFileStatus["DELETED"] = "D"; - PorcelainFileStatus["MODIFIED"] = "M"; - PorcelainFileStatus["RENAMED"] = "R"; - PorcelainFileStatus["COPIED"] = "C"; - PorcelainFileStatus["UNMERGED"] = "U"; - PorcelainFileStatus["UNTRACKED"] = "?"; - PorcelainFileStatus["IGNORED"] = "!"; - PorcelainFileStatus["NONE"] = " "; -})(PorcelainFileStatus || (PorcelainFileStatus = {})); -function renamedFile(line) { - const detail = /^(.+) -> (.+)$/.exec(line); - if (!detail) { - return { - from: line, to: line - }; - } - return { - from: String(detail[1]), - to: String(detail[2]), - }; -} -function parser(indexX, indexY, handler) { - return [`${indexX}${indexY}`, handler]; -} -function conflicts(indexX, ...indexY) { - return indexY.map(y => parser(indexX, y, (result, file) => utils.append(result.conflicted, file))); -} -const parsers = new Map([ - parser(PorcelainFileStatus.NONE, PorcelainFileStatus.ADDED, (result, file) => utils.append(result.created, file)), - parser(PorcelainFileStatus.NONE, PorcelainFileStatus.DELETED, (result, file) => utils.append(result.deleted, file)), - parser(PorcelainFileStatus.NONE, PorcelainFileStatus.MODIFIED, (result, file) => utils.append(result.modified, file)), - parser(PorcelainFileStatus.ADDED, PorcelainFileStatus.NONE, (result, file) => utils.append(result.created, file) && utils.append(result.staged, file)), - parser(PorcelainFileStatus.ADDED, PorcelainFileStatus.MODIFIED, (result, file) => utils.append(result.created, file) && utils.append(result.staged, file) && utils.append(result.modified, file)), - parser(PorcelainFileStatus.DELETED, PorcelainFileStatus.NONE, (result, file) => utils.append(result.deleted, file) && utils.append(result.staged, file)), - parser(PorcelainFileStatus.MODIFIED, PorcelainFileStatus.NONE, (result, file) => utils.append(result.modified, file) && utils.append(result.staged, file)), - parser(PorcelainFileStatus.MODIFIED, PorcelainFileStatus.MODIFIED, (result, file) => utils.append(result.modified, file) && utils.append(result.staged, file)), - parser(PorcelainFileStatus.RENAMED, PorcelainFileStatus.NONE, (result, file) => { - utils.append(result.renamed, renamedFile(file)); - }), - parser(PorcelainFileStatus.RENAMED, PorcelainFileStatus.MODIFIED, (result, file) => { - const renamed = renamedFile(file); - utils.append(result.renamed, renamed); - utils.append(result.modified, renamed.to); - }), - parser(PorcelainFileStatus.UNTRACKED, PorcelainFileStatus.UNTRACKED, (result, file) => utils.append(result.not_added, file)), - ...conflicts(PorcelainFileStatus.ADDED, PorcelainFileStatus.ADDED, PorcelainFileStatus.UNMERGED), - ...conflicts(PorcelainFileStatus.DELETED, PorcelainFileStatus.DELETED, PorcelainFileStatus.UNMERGED), - ...conflicts(PorcelainFileStatus.UNMERGED, PorcelainFileStatus.ADDED, PorcelainFileStatus.DELETED, PorcelainFileStatus.UNMERGED), - ['##', (result, line) => { - const aheadReg = /ahead (\d+)/; - const behindReg = /behind (\d+)/; - const currentReg = /^(.+?(?=(?:\.{3}|\s|$)))/; - const trackingReg = /\.{3}(\S*)/; - const onEmptyBranchReg = /\son\s([\S]+)$/; - let regexResult; - regexResult = aheadReg.exec(line); - result.ahead = regexResult && +regexResult[1] || 0; - regexResult = behindReg.exec(line); - result.behind = regexResult && +regexResult[1] || 0; - regexResult = currentReg.exec(line); - result.current = regexResult && regexResult[1]; - regexResult = trackingReg.exec(line); - result.tracking = regexResult && regexResult[1]; - regexResult = onEmptyBranchReg.exec(line); - result.current = regexResult && regexResult[1] || result.current; - }] -]); -const parseStatusSummary = function (text) { - const lines = text.trim().split('\n'); - const status = new StatusSummary(); - for (let i = 0, l = lines.length; i < l; i++) { - splitLine(status, lines[i]); - } - return status; -}; -exports.parseStatusSummary = parseStatusSummary; -function splitLine(result, lineStr) { - const trimmed = lineStr.trim(); - switch (' ') { - case trimmed.charAt(2): - return data(trimmed.charAt(0), trimmed.charAt(1), trimmed.substr(3)); - case trimmed.charAt(1): - return data(PorcelainFileStatus.NONE, trimmed.charAt(0), trimmed.substr(2)); - default: - return; - } - function data(index, workingDir, path) { - const raw = `${index}${workingDir}`; - const handler = parsers.get(raw); - if (handler) { - handler(result, path); - } - if (raw !== '##') { - result.files.push(new FileStatusSummary_1.FileStatusSummary(path, index, workingDir)); - } - } -} -//# sourceMappingURL=StatusSummary.js.map -}); - -var status = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.statusTask = void 0; - -function statusTask(customArgs) { - return { - format: 'utf-8', - commands: ['status', '--porcelain', '-b', '-u', ...customArgs], - parser(text) { - return StatusSummary_1.parseStatusSummary(text); - } - }; -} -exports.statusTask = statusTask; -//# sourceMappingURL=status.js.map -}); - -var subModule = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.updateSubModuleTask = exports.subModuleTask = exports.initSubModuleTask = exports.addSubModuleTask = void 0; - -function addSubModuleTask(repo, path) { - return subModuleTask(['add', repo, path]); -} -exports.addSubModuleTask = addSubModuleTask; -function initSubModuleTask(customArgs) { - return subModuleTask(['init', ...customArgs]); -} -exports.initSubModuleTask = initSubModuleTask; -function subModuleTask(customArgs) { - const commands = [...customArgs]; - if (commands[0] !== 'submodule') { - commands.unshift('submodule'); - } - return task.straightThroughStringTask(commands); -} -exports.subModuleTask = subModuleTask; -function updateSubModuleTask(customArgs) { - return subModuleTask(['update', ...customArgs]); -} -exports.updateSubModuleTask = updateSubModuleTask; -//# sourceMappingURL=sub-module.js.map -}); - -var TagList_1 = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.parseTagList = exports.TagList = void 0; -class TagList { - constructor(all, latest) { - this.all = all; - this.latest = latest; - } -} -exports.TagList = TagList; -const parseTagList = function (data, customSort = false) { - const tags = data - .split('\n') - .map(trimmed) - .filter(Boolean); - if (!customSort) { - tags.sort(function (tagA, tagB) { - const partsA = tagA.split('.'); - const partsB = tagB.split('.'); - if (partsA.length === 1 || partsB.length === 1) { - return singleSorted(toNumber(partsA[0]), toNumber(partsB[0])); - } - for (let i = 0, l = Math.max(partsA.length, partsB.length); i < l; i++) { - const diff = sorted(toNumber(partsA[i]), toNumber(partsB[i])); - if (diff) { - return diff; - } - } - return 0; - }); - } - const latest = customSort ? tags[0] : [...tags].reverse().find((tag) => tag.indexOf('.') >= 0); - return new TagList(tags, latest); -}; -exports.parseTagList = parseTagList; -function singleSorted(a, b) { - const aIsNum = isNaN(a); - const bIsNum = isNaN(b); - if (aIsNum !== bIsNum) { - return aIsNum ? 1 : -1; - } - return aIsNum ? sorted(a, b) : 0; -} -function sorted(a, b) { - return a === b ? 0 : a > b ? 1 : -1; -} -function trimmed(input) { - return input.trim(); -} -function toNumber(input) { - if (typeof input === 'string') { - return parseInt(input.replace(/^\D+/g, ''), 10) || 0; - } - return 0; -} -//# sourceMappingURL=TagList.js.map -}); - -var tag = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.addAnnotatedTagTask = exports.addTagTask = exports.tagListTask = void 0; - -/** - * Task used by `git.tags` - */ -function tagListTask(customArgs = []) { - const hasCustomSort = customArgs.some((option) => /^--sort=/.test(option)); - return { - format: 'utf-8', - commands: ['tag', '-l', ...customArgs], - parser(text) { - return TagList_1.parseTagList(text, hasCustomSort); - }, - }; -} -exports.tagListTask = tagListTask; -/** - * Task used by `git.addTag` - */ -function addTagTask(name) { - return { - format: 'utf-8', - commands: ['tag', name], - parser() { - return { name }; - } - }; -} -exports.addTagTask = addTagTask; -/** - * Task used by `git.addTag` - */ -function addAnnotatedTagTask(name, tagMessage) { - return { - format: 'utf-8', - commands: ['tag', '-a', '-m', tagMessage, name], - parser() { - return { name }; - } - }; -} -exports.addAnnotatedTagTask = addAnnotatedTagTask; -//# sourceMappingURL=tag.js.map -}); - -const {GitExecutor} = gitExecutor; -const {SimpleGitApi} = simpleGitApi; - -const {Scheduler} = scheduler; -const {GitLogger} = gitLogger; -const {adhocExecTask, configurationErrorTask} = task; -const { - NOOP, - asArray, - filterArray, - filterPrimitives, - filterString, - filterStringOrStringArray, - filterType, - folderExists, - getTrailingOptions, - trailingFunctionArgument, - trailingOptionsArgument -} = utils; -const {applyPatchTask} = applyPatch; -const {branchTask, branchLocalTask, deleteBranchesTask, deleteBranchTask} = branch; -const {checkIgnoreTask} = checkIgnore; -const {checkIsRepoTask} = checkIsRepo; -const {cloneTask, cloneMirrorTask} = clone; -const {addConfigTask, listConfigTask} = config; -const {cleanWithOptionsTask, isCleanOptionsArray} = clean; -const {commitTask} = commit; -const {diffSummaryTask} = diff; -const {fetchTask} = fetch; -const {hashObjectTask} = hashObject; -const {initTask} = init; -const {logTask, parseLogOptions} = log; -const {mergeTask} = merge; -const {moveTask} = move; -const {pullTask} = pull; -const {pushTagsTask} = push; -const {addRemoteTask, getRemotesTask, listRemotesTask, remoteTask, removeRemoteTask} = remote; -const {getResetMode, resetTask} = reset; -const {stashListTask} = stashList; -const {statusTask} = status; -const {addSubModuleTask, initSubModuleTask, subModuleTask, updateSubModuleTask} = subModule; -const {addAnnotatedTagTask, addTagTask, tagListTask} = tag; -const {straightThroughBufferTask, straightThroughStringTask} = task; - -function Git (options, plugins) { - this._executor = new GitExecutor( - options.binary, options.baseDir, - new Scheduler(options.maxConcurrentProcesses), plugins, - ); - this._logger = new GitLogger(); -} - -(Git.prototype = Object.create(SimpleGitApi.prototype)).constructor = Git; - -/** - * Logging utility for printing out info or error messages to the user - * @type {GitLogger} - * @private - */ -Git.prototype._logger = null; - -/** - * Sets the path to a custom git binary, should either be `git` when there is an installation of git available on - * the system path, or a fully qualified path to the executable. - * - * @param {string} command - * @returns {Git} - */ -Git.prototype.customBinary = function (command) { - this._executor.binary = command; - return this; -}; - -/** - * Sets an environment variable for the spawned child process, either supply both a name and value as strings or - * a single object to entirely replace the current environment variables. - * - * @param {string|Object} name - * @param {string} [value] - * @returns {Git} - */ -Git.prototype.env = function (name, value) { - if (arguments.length === 1 && typeof name === 'object') { - this._executor.env = name; - } else { - (this._executor.env = this._executor.env || {})[name] = value; - } - - return this; -}; - -/** - * Sets the working directory of the subsequent commands. - */ -Git.prototype.cwd = function (workingDirectory) { - const task = (typeof workingDirectory !== 'string') - ? configurationErrorTask('Git.cwd: workingDirectory must be supplied as a string') - : adhocExecTask(() => { - if (!folderExists(workingDirectory)) { - throw new Error(`Git.cwd: cannot change to non-directory "${ workingDirectory }"`); - } - - return (this._executor.cwd = workingDirectory); - }); - - return this._runTask(task, trailingFunctionArgument(arguments) || NOOP); -}; - -/** - * Sets a handler function to be called whenever a new child process is created, the handler function will be called - * with the name of the command being run and the stdout & stderr streams used by the ChildProcess. - * - * @example - * require('simple-git') - * .outputHandler(function (command, stdout, stderr) { - * stdout.pipe(process.stdout); - * }) - * .checkout('https://github.com/user/repo.git'); - * - * @see https://nodejs.org/api/child_process.html#child_process_class_childprocess - * @see https://nodejs.org/api/stream.html#stream_class_stream_readable - * @param {Function} outputHandler - * @returns {Git} - */ -Git.prototype.outputHandler = function (outputHandler) { - this._executor.outputHandler = outputHandler; - return this; -}; - -/** - * Initialize a git repo - * - * @param {Boolean} [bare=false] - * @param {Function} [then] - */ -Git.prototype.init = function (bare, then) { - return this._runTask( - initTask(bare === true, this._executor.cwd, getTrailingOptions(arguments)), - trailingFunctionArgument(arguments), - ); -}; - -/** - * Check the status of the local repo - */ -Git.prototype.status = function () { - return this._runTask( - statusTask(getTrailingOptions(arguments)), - trailingFunctionArgument(arguments), - ); -}; - -/** - * List the stash(s) of the local repo - */ -Git.prototype.stashList = function (options) { - return this._runTask( - stashListTask( - trailingOptionsArgument(arguments) || {}, - filterArray(options) && options || [] - ), - trailingFunctionArgument(arguments), - ); -}; - -/** - * Stash the local repo - * - * @param {Object|Array} [options] - * @param {Function} [then] - */ -Git.prototype.stash = function (options, then) { - return this._runTask( - straightThroughStringTask(['stash', ...getTrailingOptions(arguments)]), - trailingFunctionArgument(arguments), - ); -}; - -function createCloneTask (api, task, repoPath, localPath) { - if (typeof repoPath !== 'string') { - return configurationErrorTask(`git.${ api }() requires a string 'repoPath'`); - } - - return task(repoPath, filterType(localPath, filterString), getTrailingOptions(arguments)); -} - - -/** - * Clone a git repo - */ -Git.prototype.clone = function () { - return this._runTask( - createCloneTask('clone', cloneTask, ...arguments), - trailingFunctionArgument(arguments), - ); -}; - -/** - * Mirror a git repo - */ -Git.prototype.mirror = function () { - return this._runTask( - createCloneTask('mirror', cloneMirrorTask, ...arguments), - trailingFunctionArgument(arguments), - ); -}; - -/** - * Moves one or more files to a new destination. - * - * @see https://git-scm.com/docs/git-mv - * - * @param {string|string[]} from - * @param {string} to - */ -Git.prototype.mv = function (from, to) { - return this._runTask(moveTask(from, to), trailingFunctionArgument(arguments)); -}; - -/** - * Internally uses pull and tags to get the list of tags then checks out the latest tag. - * - * @param {Function} [then] - */ -Git.prototype.checkoutLatestTag = function (then) { - var git = this; - return this.pull(function () { - git.tags(function (err, tags) { - git.checkout(tags.latest, then); - }); - }); -}; - -/** - * Commits changes in the current working directory - when specific file paths are supplied, only changes on those - * files will be committed. - * - * @param {string|string[]} message - * @param {string|string[]} [files] - * @param {Object} [options] - * @param {Function} [then] - */ -Git.prototype.commit = function (message, files, options, then) { - const next = trailingFunctionArgument(arguments); - const messages = []; - - if (filterStringOrStringArray(message)) { - messages.push(...asArray(message)); - } else { - console.warn('simple-git deprecation notice: git.commit: requires the commit message to be supplied as a string/string[], this will be an error in version 3'); - } - - return this._runTask( - commitTask( - messages, - asArray(filterType(files, filterStringOrStringArray, [])), - [...filterType(options, filterArray, []), ...getTrailingOptions(arguments, 0, true)] - ), - next - ); -}; - -/** - * Pull the updated contents of the current repo - */ -Git.prototype.pull = function (remote, branch, options, then) { - return this._runTask( - pullTask(filterType(remote, filterString), filterType(branch, filterString), getTrailingOptions(arguments)), - trailingFunctionArgument(arguments), - ); -}; - -/** - * Fetch the updated contents of the current repo. - * - * @example - * .fetch('upstream', 'master') // fetches from master on remote named upstream - * .fetch(function () {}) // runs fetch against default remote and branch and calls function - * - * @param {string} [remote] - * @param {string} [branch] - */ -Git.prototype.fetch = function (remote, branch) { - return this._runTask( - fetchTask(filterType(remote, filterString), filterType(branch, filterString), getTrailingOptions(arguments)), - trailingFunctionArgument(arguments), - ); -}; - -/** - * Disables/enables the use of the console for printing warnings and errors, by default messages are not shown in - * a production environment. - * - * @param {boolean} silence - * @returns {Git} - */ -Git.prototype.silent = function (silence) { - console.warn('simple-git deprecation notice: git.silent: logging should be configured using the `debug` library / `DEBUG` environment variable, this will be an error in version 3'); - this._logger.silent(!!silence); - return this; -}; - -/** - * List all tags. When using git 2.7.0 or above, include an options object with `"--sort": "property-name"` to - * sort the tags by that property instead of using the default semantic versioning sort. - * - * Note, supplying this option when it is not supported by your Git version will cause the operation to fail. - * - * @param {Object} [options] - * @param {Function} [then] - */ -Git.prototype.tags = function (options, then) { - return this._runTask( - tagListTask(getTrailingOptions(arguments)), - trailingFunctionArgument(arguments), - ); -}; - -/** - * Rebases the current working copy. Options can be supplied either as an array of string parameters - * to be sent to the `git rebase` command, or a standard options object. - */ -Git.prototype.rebase = function () { - return this._runTask( - straightThroughStringTask(['rebase', ...getTrailingOptions(arguments)]), - trailingFunctionArgument(arguments) - ); -}; - -/** - * Reset a repo - */ -Git.prototype.reset = function (mode) { - return this._runTask( - resetTask(getResetMode(mode), getTrailingOptions(arguments)), - trailingFunctionArgument(arguments), - ); -}; - -/** - * Revert one or more commits in the local working copy - */ -Git.prototype.revert = function (commit) { - const next = trailingFunctionArgument(arguments); - - if (typeof commit !== 'string') { - return this._runTask( - configurationErrorTask('Commit must be a string'), - next, - ); - } - - return this._runTask( - straightThroughStringTask(['revert', ...getTrailingOptions(arguments, 0, true), commit]), - next - ); -}; - -/** - * Add a lightweight tag to the head of the current branch - */ -Git.prototype.addTag = function (name) { - const task = (typeof name === 'string') - ? addTagTask(name) - : configurationErrorTask('Git.addTag requires a tag name'); - - return this._runTask(task, trailingFunctionArgument(arguments)); -}; - -/** - * Add an annotated tag to the head of the current branch - */ -Git.prototype.addAnnotatedTag = function (tagName, tagMessage) { - return this._runTask( - addAnnotatedTagTask(tagName, tagMessage), - trailingFunctionArgument(arguments), - ); -}; - -/** - * Check out a tag or revision, any number of additional arguments can be passed to the `git checkout` command - * by supplying either a string or array of strings as the first argument. - */ -Git.prototype.checkout = function () { - const commands = ['checkout', ...getTrailingOptions(arguments, true)]; - return this._runTask( - straightThroughStringTask(commands), - trailingFunctionArgument(arguments), - ); -}; - -/** - * Check out a remote branch - * - * @param {string} branchName name of branch - * @param {string} startPoint (e.g origin/development) - * @param {Function} [then] - */ -Git.prototype.checkoutBranch = function (branchName, startPoint, then) { - return this.checkout(['-b', branchName, startPoint], trailingFunctionArgument(arguments)); -}; - -/** - * Check out a local branch - */ -Git.prototype.checkoutLocalBranch = function (branchName, then) { - return this.checkout(['-b', branchName], trailingFunctionArgument(arguments)); -}; - -/** - * Delete a local branch - */ -Git.prototype.deleteLocalBranch = function (branchName, forceDelete, then) { - return this._runTask( - deleteBranchTask(branchName, typeof forceDelete === "boolean" ? forceDelete : false), - trailingFunctionArgument(arguments), - ); -}; - -/** - * Delete one or more local branches - */ -Git.prototype.deleteLocalBranches = function (branchNames, forceDelete, then) { - return this._runTask( - deleteBranchesTask(branchNames, typeof forceDelete === "boolean" ? forceDelete : false), - trailingFunctionArgument(arguments), - ); -}; - -/** - * List all branches - * - * @param {Object | string[]} [options] - * @param {Function} [then] - */ -Git.prototype.branch = function (options, then) { - return this._runTask( - branchTask(getTrailingOptions(arguments)), - trailingFunctionArgument(arguments), - ); -}; - -/** - * Return list of local branches - * - * @param {Function} [then] - */ -Git.prototype.branchLocal = function (then) { - return this._runTask( - branchLocalTask(), - trailingFunctionArgument(arguments), - ); -}; - -/** - * Add config to local git instance - * - * @param {string} key configuration key (e.g user.name) - * @param {string} value for the given key (e.g your name) - * @param {boolean} [append=false] optionally append the key/value pair (equivalent of passing `--add` option). - * @param {Function} [then] - */ -Git.prototype.addConfig = function (key, value, append, then) { - return this._runTask( - addConfigTask(key, value, typeof append === "boolean" ? append : false), - trailingFunctionArgument(arguments), - ); -}; - -Git.prototype.listConfig = function () { - return this._runTask(listConfigTask(), trailingFunctionArgument(arguments)); -}; - -/** - * Executes any command against the git binary. - */ -Git.prototype.raw = function (commands) { - const createRestCommands = !Array.isArray(commands); - const command = [].slice.call(createRestCommands ? arguments : commands, 0); - - for (let i = 0; i < command.length && createRestCommands; i++) { - if (!filterPrimitives(command[i])) { - command.splice(i, command.length - i); - break; - } - } - - command.push( - ...getTrailingOptions(arguments, 0, true), - ); - - var next = trailingFunctionArgument(arguments); - - if (!command.length) { - return this._runTask( - configurationErrorTask('Raw: must supply one or more command to execute'), - next, - ); - } - - return this._runTask(straightThroughStringTask(command), next); -}; - -Git.prototype.submoduleAdd = function (repo, path, then) { - return this._runTask( - addSubModuleTask(repo, path), - trailingFunctionArgument(arguments), - ); -}; - -Git.prototype.submoduleUpdate = function (args, then) { - return this._runTask( - updateSubModuleTask(getTrailingOptions(arguments, true)), - trailingFunctionArgument(arguments), - ); -}; - -Git.prototype.submoduleInit = function (args, then) { - return this._runTask( - initSubModuleTask(getTrailingOptions(arguments, true)), - trailingFunctionArgument(arguments), - ); -}; - -Git.prototype.subModule = function (options, then) { - return this._runTask( - subModuleTask(getTrailingOptions(arguments)), - trailingFunctionArgument(arguments), - ); -}; - -Git.prototype.listRemote = function () { - return this._runTask( - listRemotesTask(getTrailingOptions(arguments)), - trailingFunctionArgument(arguments), - ); -}; - -/** - * Adds a remote to the list of remotes. - */ -Git.prototype.addRemote = function (remoteName, remoteRepo, then) { - return this._runTask( - addRemoteTask(remoteName, remoteRepo, getTrailingOptions(arguments)), - trailingFunctionArgument(arguments), - ); -}; - -/** - * Removes an entry by name from the list of remotes. - */ -Git.prototype.removeRemote = function (remoteName, then) { - return this._runTask( - removeRemoteTask(remoteName), - trailingFunctionArgument(arguments), - ); -}; - -/** - * Gets the currently available remotes, setting the optional verbose argument to true includes additional - * detail on the remotes themselves. - */ -Git.prototype.getRemotes = function (verbose, then) { - return this._runTask( - getRemotesTask(verbose === true), - trailingFunctionArgument(arguments), - ); -}; - -/** - * Compute object ID from a file - */ -Git.prototype.hashObject = function (path, write) { - return this._runTask( - hashObjectTask(path, write === true), - trailingFunctionArgument(arguments), - ); -}; - -/** - * Call any `git remote` function with arguments passed as an array of strings. - * - * @param {string[]} options - * @param {Function} [then] - */ -Git.prototype.remote = function (options, then) { - return this._runTask( - remoteTask(getTrailingOptions(arguments)), - trailingFunctionArgument(arguments), - ); -}; - -/** - * Merges from one branch to another, equivalent to running `git merge ${from} $[to}`, the `options` argument can - * either be an array of additional parameters to pass to the command or null / omitted to be ignored. - * - * @param {string} from - * @param {string} to - */ -Git.prototype.mergeFromTo = function (from, to) { - if (!(filterString(from) && filterString(to))) { - return this._runTask(configurationErrorTask( - `Git.mergeFromTo requires that the 'from' and 'to' arguments are supplied as strings` - )); - } - - return this._runTask( - mergeTask([from, to, ...getTrailingOptions(arguments)]), - trailingFunctionArgument(arguments, false), - ); -}; - -/** - * Runs a merge, `options` can be either an array of arguments - * supported by the [`git merge`](https://git-scm.com/docs/git-merge) - * or an options object. - * - * Conflicts during the merge result in an error response, - * the response type whether it was an error or success will be a MergeSummary instance. - * When successful, the MergeSummary has all detail from a the PullSummary - * - * @param {Object | string[]} [options] - * @param {Function} [then] - * @returns {*} - * - * @see ./responses/MergeSummary.js - * @see ./responses/PullSummary.js - */ -Git.prototype.merge = function () { - return this._runTask( - mergeTask(getTrailingOptions(arguments)), - trailingFunctionArgument(arguments), - ); -}; - -/** - * Call any `git tag` function with arguments passed as an array of strings. - * - * @param {string[]} options - * @param {Function} [then] - */ -Git.prototype.tag = function (options, then) { - const command = getTrailingOptions(arguments); - - if (command[0] !== 'tag') { - command.unshift('tag'); - } - - return this._runTask( - straightThroughStringTask(command), - trailingFunctionArgument(arguments) - ); -}; - -/** - * Updates repository server info - * - * @param {Function} [then] - */ -Git.prototype.updateServerInfo = function (then) { - return this._runTask( - straightThroughStringTask(['update-server-info']), - trailingFunctionArgument(arguments), - ); -}; - -/** - * Pushes the current tag changes to a remote which can be either a URL or named remote. When not specified uses the - * default configured remote spec. - * - * @param {string} [remote] - * @param {Function} [then] - */ -Git.prototype.pushTags = function (remote, then) { - const task = pushTagsTask({remote: filterType(remote, filterString)}, getTrailingOptions(arguments)); - - return this._runTask(task, trailingFunctionArgument(arguments)); -}; - -/** - * Removes the named files from source control. - */ -Git.prototype.rm = function (files) { - return this._runTask( - straightThroughStringTask(['rm', '-f', ...asArray(files)]), - trailingFunctionArgument(arguments) - ); -}; - -/** - * Removes the named files from source control but keeps them on disk rather than deleting them entirely. To - * completely remove the files, use `rm`. - * - * @param {string|string[]} files - */ -Git.prototype.rmKeepLocal = function (files) { - return this._runTask( - straightThroughStringTask(['rm', '--cached', ...asArray(files)]), - trailingFunctionArgument(arguments) - ); -}; - -/** - * Returns a list of objects in a tree based on commit hash. Passing in an object hash returns the object's content, - * size, and type. - * - * Passing "-p" will instruct cat-file to determine the object type, and display its formatted contents. - * - * @param {string[]} [options] - * @param {Function} [then] - */ -Git.prototype.catFile = function (options, then) { - return this._catFile('utf-8', arguments); -}; - -Git.prototype.binaryCatFile = function () { - return this._catFile('buffer', arguments); -}; - -Git.prototype._catFile = function (format, args) { - var handler = trailingFunctionArgument(args); - var command = ['cat-file']; - var options = args[0]; - - if (typeof options === 'string') { - return this._runTask( - configurationErrorTask('Git.catFile: options must be supplied as an array of strings'), - handler, - ); - } - - if (Array.isArray(options)) { - command.push.apply(command, options); - } - - const task = format === 'buffer' - ? straightThroughBufferTask(command) - : straightThroughStringTask(command); - - return this._runTask(task, handler); -}; - -Git.prototype.diff = function (options, then) { - const command = ['diff', ...getTrailingOptions(arguments)]; - - if (typeof options === 'string') { - command.splice(1, 0, options); - this._logger.warn('Git#diff: supplying options as a single string is now deprecated, switch to an array of strings'); - } - - return this._runTask( - straightThroughStringTask(command), - trailingFunctionArgument(arguments), - ); -}; - -Git.prototype.diffSummary = function () { - return this._runTask( - diffSummaryTask(getTrailingOptions(arguments, 1)), - trailingFunctionArgument(arguments), - ); -}; - -Git.prototype.applyPatch = function (patches) { - const task = !filterStringOrStringArray(patches) - ? configurationErrorTask(`git.applyPatch requires one or more string patches as the first argument`) - : applyPatchTask(asArray(patches), getTrailingOptions([].slice.call(arguments, 1))); - - return this._runTask( - task, - trailingFunctionArgument(arguments), - ); -}; - -Git.prototype.revparse = function () { - const commands = ['rev-parse', ...getTrailingOptions(arguments, true)]; - return this._runTask( - straightThroughStringTask(commands, true), - trailingFunctionArgument(arguments), - ); -}; - -/** - * Show various types of objects, for example the file at a certain commit - * - * @param {string[]} [options] - * @param {Function} [then] - */ -Git.prototype.show = function (options, then) { - return this._runTask( - straightThroughStringTask(['show', ...getTrailingOptions(arguments, 1)]), - trailingFunctionArgument(arguments) - ); -}; - -/** - */ -Git.prototype.clean = function (mode, options, then) { - const usingCleanOptionsArray = isCleanOptionsArray(mode); - const cleanMode = usingCleanOptionsArray && mode.join('') || filterType(mode, filterString) || ''; - const customArgs = getTrailingOptions([].slice.call(arguments, usingCleanOptionsArray ? 1 : 0)); - - return this._runTask( - cleanWithOptionsTask(cleanMode, customArgs), - trailingFunctionArgument(arguments), - ); -}; - -/** - * Call a simple function at the next step in the chain. - * @param {Function} [then] - */ -Git.prototype.exec = function (then) { - const task = { - commands: [], - format: 'utf-8', - parser () { - if (typeof then === 'function') { - then(); - } - } - }; - - return this._runTask(task); -}; - -/** - * Show commit logs from `HEAD` to the first commit. - * If provided between `options.from` and `options.to` tags or branch. - * - * Additionally you can provide options.file, which is the path to a file in your repository. Then only this file will be considered. - * - * To use a custom splitter in the log format, set `options.splitter` to be the string the log should be split on. - * - * Options can also be supplied as a standard options object for adding custom properties supported by the git log command. - * For any other set of options, supply options as an array of strings to be appended to the git log command. - */ -Git.prototype.log = function (options) { - const next = trailingFunctionArgument(arguments); - - if (filterString(arguments[0]) && filterString(arguments[1])) { - return this._runTask( - configurationErrorTask(`git.log(string, string) should be replaced with git.log({ from: string, to: string })`), - next - ); - } - - const parsedOptions = parseLogOptions( - trailingOptionsArgument(arguments) || {}, - filterArray(options) && options || [] - ); - - return this._runTask( - logTask(parsedOptions.splitter, parsedOptions.fields, parsedOptions.commands), - next, - ) -}; - -/** - * Clears the queue of pending commands and returns the wrapper instance for chaining. - * - * @returns {Git} - */ -Git.prototype.clearQueue = function () { - // TODO: - // this._executor.clear(); - return this; -}; - -/** - * Check if a pathname or pathnames are excluded by .gitignore - * - * @param {string|string[]} pathnames - * @param {Function} [then] - */ -Git.prototype.checkIgnore = function (pathnames, then) { - return this._runTask( - checkIgnoreTask(asArray((filterType(pathnames, filterStringOrStringArray, [])))), - trailingFunctionArgument(arguments), - ); -}; - -Git.prototype.checkIsRepo = function (checkType, then) { - return this._runTask( - checkIsRepoTask(filterType(checkType, filterString)), - trailingFunctionArgument(arguments), - ); -}; - -var git = Git; - -var gitFactory = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.gitInstanceFactory = exports.gitExportFactory = exports.esModuleFactory = void 0; - - - - -/** - * Adds the necessary properties to the supplied object to enable it for use as - * the default export of a module. - * - * Eg: `module.exports = esModuleFactory({ something () {} })` - */ -function esModuleFactory(defaultExport) { - return Object.defineProperties(defaultExport, { - __esModule: { value: true }, - default: { value: defaultExport }, - }); -} -exports.esModuleFactory = esModuleFactory; -function gitExportFactory(factory, extra) { - return Object.assign(function (...args) { - return factory.apply(null, args); - }, api_1.default, extra || {}); -} -exports.gitExportFactory = gitExportFactory; -function gitInstanceFactory(baseDir, options) { - const plugins$1 = new plugins.PluginStore(); - const config = utils.createInstanceConfig(baseDir && (typeof baseDir === 'string' ? { baseDir } : baseDir) || {}, options); - if (!utils.folderExists(config.baseDir)) { - throw new api_1.default.GitConstructError(config, `Cannot use simple-git on a directory that does not exist`); - } - if (Array.isArray(config.config)) { - plugins$1.add(plugins.commandConfigPrefixingPlugin(config.config)); - } - config.progress && plugins$1.add(plugins.progressMonitorPlugin(config.progress)); - config.timeout && plugins$1.add(plugins.timeoutPlugin(config.timeout)); - plugins$1.add(plugins.errorDetectionPlugin(plugins.errorDetectionHandler(true))); - config.errors && plugins$1.add(plugins.errorDetectionPlugin(config.errors)); - return new git(config, plugins$1); -} -exports.gitInstanceFactory = gitInstanceFactory; -//# sourceMappingURL=git-factory.js.map -}); - -var promiseWrapped = createCommonjsModule(function (module, exports) { -Object.defineProperty(exports, "__esModule", { value: true }); -exports.gitP = void 0; - - -const functionNamesBuilderApi = [ - 'customBinary', 'env', 'outputHandler', 'silent', -]; -const functionNamesPromiseApi = [ - 'add', - 'addAnnotatedTag', - 'addConfig', - 'addRemote', - 'addTag', - 'applyPatch', - 'binaryCatFile', - 'branch', - 'branchLocal', - 'catFile', - 'checkIgnore', - 'checkIsRepo', - 'checkout', - 'checkoutBranch', - 'checkoutLatestTag', - 'checkoutLocalBranch', - 'clean', - 'clone', - 'commit', - 'cwd', - 'deleteLocalBranch', - 'deleteLocalBranches', - 'diff', - 'diffSummary', - 'exec', - 'fetch', - 'getRemotes', - 'init', - 'listConfig', - 'listRemote', - 'log', - 'merge', - 'mergeFromTo', - 'mirror', - 'mv', - 'pull', - 'push', - 'pushTags', - 'raw', - 'rebase', - 'remote', - 'removeRemote', - 'reset', - 'revert', - 'revparse', - 'rm', - 'rmKeepLocal', - 'show', - 'stash', - 'stashList', - 'status', - 'subModule', - 'submoduleAdd', - 'submoduleInit', - 'submoduleUpdate', - 'tag', - 'tags', - 'updateServerInfo' -]; -function gitP(...args) { - let git; - let chain = Promise.resolve(); - try { - git = gitFactory.gitInstanceFactory(...args); - } - catch (e) { - chain = Promise.reject(e); - } - function builderReturn() { - return promiseApi; - } - function chainReturn() { - return chain; - } - const promiseApi = [...functionNamesBuilderApi, ...functionNamesPromiseApi].reduce((api, name) => { - const isAsync = functionNamesPromiseApi.includes(name); - const valid = isAsync ? asyncWrapper(name, git) : syncWrapper(name, git, api); - const alternative = isAsync ? chainReturn : builderReturn; - Object.defineProperty(api, name, { - enumerable: false, - configurable: false, - value: git ? valid : alternative, - }); - return api; - }, {}); - return promiseApi; - function asyncWrapper(fn, git) { - return function (...args) { - if (typeof args[args.length] === 'function') { - throw new TypeError('Promise interface requires that handlers are not supplied inline, ' + - 'trailing function not allowed in call to ' + fn); - } - return chain.then(function () { - return new Promise(function (resolve, reject) { - const callback = (err, result) => { - if (err) { - return reject(toError(err)); - } - resolve(result); - }; - args.push(callback); - git[fn].apply(git, args); - }); - }); - }; - } - function syncWrapper(fn, git, api) { - return (...args) => { - git[fn](...args); - return api; - }; - } -} -exports.gitP = gitP; -function toError(error) { - if (error instanceof Error) { - return error; - } - if (typeof error === 'string') { - return new Error(error); - } - return new gitResponseError.GitResponseError(error); -} -//# sourceMappingURL=promise-wrapped.js.map -}); - -const {gitP} = promiseWrapped; -const {esModuleFactory, gitInstanceFactory, gitExportFactory} = gitFactory; - -var src = esModuleFactory( - gitExportFactory(gitInstanceFactory, {gitP}) -); - -var PluginState; -(function (PluginState) { - PluginState[PluginState["idle"] = 0] = "idle"; - PluginState[PluginState["status"] = 1] = "status"; - PluginState[PluginState["pull"] = 2] = "pull"; - PluginState[PluginState["add"] = 3] = "add"; - PluginState[PluginState["commit"] = 4] = "commit"; - PluginState[PluginState["push"] = 5] = "push"; - PluginState[PluginState["conflicted"] = 6] = "conflicted"; -})(PluginState || (PluginState = {})); -var DEFAULT_SETTINGS = { - commitMessage: "vault backup: {{date}}", - commitDateFormat: "YYYY-MM-DD HH:mm:ss", - autoSaveInterval: 0, - autoPullInterval: 0, - autoPullOnBoot: false, - disablePush: false, - pullBeforePush: true, - disablePopups: false, - listChangedFilesInMessageBody: false, - showStatusBar: true, -}; -var ObsidianGit = /** @class */ (function (_super) { - __extends(ObsidianGit, _super); - function ObsidianGit() { - var _this = _super !== null && _super.apply(this, arguments) || this; - _this.gitReady = false; - _this.promiseQueue = new PromiseQueue(); - _this.conflictOutputFile = "conflict-files-obsidian-git.md"; - return _this; - // endregion: displaying / formatting stuff - } - ObsidianGit.prototype.setState = function (state) { - var _a; - this.state = state; - (_a = this.statusBar) === null || _a === void 0 ? void 0 : _a.display(); - }; - ObsidianGit.prototype.onload = function () { - return __awaiter(this, void 0, void 0, function () { - var statusBarEl; - var _this = this; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - console.log('loading ' + this.manifest.name + " plugin"); - return [4 /*yield*/, this.loadSettings()]; - case 1: - _a.sent(); - this.addSettingTab(new ObsidianGitSettingsTab(this.app, this)); - this.addCommand({ - id: "pull", - name: "Pull from remote repository", - callback: function () { return _this.promiseQueue.addTask(function () { return _this.pullChangesFromRemote(); }); }, - }); - this.addCommand({ - id: "push", - name: "Commit *all* changes and push to remote repository", - callback: function () { return _this.promiseQueue.addTask(function () { return _this.createBackup(false); }); } - }); - this.addCommand({ - id: "commit-push-specified-message", - name: "Commit and push all changes with specified message", - callback: function () { return new CustomMessageModal(_this).open(); } - }); - this.addCommand({ - id: "list-changed-files", - name: "List changed files", - callback: function () { return __awaiter(_this, void 0, void 0, function () { - var status; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: return [4 /*yield*/, this.git.status()]; - case 1: - status = _a.sent(); - new ChangedFilesModal(this, status.files).open(); - return [2 /*return*/]; - } - }); - }); } - }); - if (this.settings.showStatusBar) { - statusBarEl = this.addStatusBarItem(); - this.statusBar = new StatusBar(statusBarEl, this); - this.registerInterval(window.setInterval(function () { return _this.statusBar.display(); }, 1000)); - } - if (this.app.workspace.layoutReady) { - this.init(); - } - else { - this.app.workspace.on("layout-ready", function () { return _this.init(); }); - } - return [2 /*return*/]; - } - }); - }); - }; - ObsidianGit.prototype.onunload = function () { - return __awaiter(this, void 0, void 0, function () { - return __generator(this, function (_a) { - window.clearTimeout(this.timeoutIDBackup); - window.clearTimeout(this.timeoutIDPull); - console.log('unloading ' + this.manifest.name + " plugin"); - return [2 /*return*/]; - }); - }); - }; - ObsidianGit.prototype.loadSettings = function () { - return __awaiter(this, void 0, void 0, function () { - var _a, _b, _c, _d; - return __generator(this, function (_e) { - switch (_e.label) { - case 0: - _a = this; - _c = (_b = Object).assign; - _d = [{}, DEFAULT_SETTINGS]; - return [4 /*yield*/, this.loadData()]; - case 1: - _a.settings = _c.apply(_b, _d.concat([_e.sent()])); - return [2 /*return*/]; - } - }); - }); - }; - ObsidianGit.prototype.saveSettings = function () { - return __awaiter(this, void 0, void 0, function () { - return __generator(this, function (_a) { - switch (_a.label) { - case 0: return [4 /*yield*/, this.saveData(this.settings)]; - case 1: - _a.sent(); - return [2 /*return*/]; - } - }); - }); - }; - ObsidianGit.prototype.saveLastAuto = function (date, mode) { - return __awaiter(this, void 0, void 0, function () { - var fileName, data, lines; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - fileName = ".obsidian-git-data"; - data = "\n"; - return [4 /*yield*/, this.app.vault.adapter.exists(fileName)]; - case 1: - if (!_a.sent()) return [3 /*break*/, 3]; - return [4 /*yield*/, this.app.vault.adapter.read(fileName)]; - case 2: - data = _a.sent(); - _a.label = 3; - case 3: - lines = data.split("\n"); - if (mode === "backup") { - lines[0] = date.toString(); - } - else if (mode === "pull") { - lines[1] = date.toString(); - } - return [4 /*yield*/, this.app.vault.adapter.write(fileName, lines.join("\n"))]; - case 4: - _a.sent(); - return [2 /*return*/]; - } - }); - }); - }; - ObsidianGit.prototype.loadLastAuto = function () { - return __awaiter(this, void 0, void 0, function () { - var fileName, data, lines; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - fileName = ".obsidian-git-data"; - data = "\n"; - return [4 /*yield*/, this.app.vault.adapter.exists(fileName)]; - case 1: - if (!_a.sent()) return [3 /*break*/, 3]; - return [4 /*yield*/, this.app.vault.adapter.read(fileName)]; - case 2: - data = _a.sent(); - _a.label = 3; - case 3: - lines = data.split("\n"); - return [2 /*return*/, { - "backup": new Date(lines[0]), - "pull": new Date(lines[1]) - }]; - } - }); - }); - }; - ObsidianGit.prototype.init = function () { - return __awaiter(this, void 0, void 0, function () { - var adapter, path, isValidRepo, lastAutos, now, diff, now, diff, error_1; - var _this = this; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - if (!this.isGitInstalled()) { - this.displayError("Cannot run git command"); - return [2 /*return*/]; - } - _a.label = 1; - case 1: - _a.trys.push([1, 6, , 7]); - adapter = this.app.vault.adapter; - path = adapter.getBasePath(); - this.git = src(path); - return [4 /*yield*/, this.git.checkIsRepo()]; - case 2: - isValidRepo = _a.sent(); - if (!!isValidRepo) return [3 /*break*/, 3]; - this.displayError("Valid git repository not found."); - return [3 /*break*/, 5]; - case 3: - this.gitReady = true; - this.setState(PluginState.idle); - if (this.settings.autoPullOnBoot) { - this.promiseQueue.addTask(function () { return _this.pullChangesFromRemote(); }); - } - return [4 /*yield*/, this.loadLastAuto()]; - case 4: - lastAutos = _a.sent(); - if (this.settings.autoSaveInterval > 0) { - now = new Date(); - diff = this.settings.autoSaveInterval - (Math.round(((now.getTime() - lastAutos.backup.getTime()) / 1000) / 60)); - this.startAutoBackup(diff <= 0 ? 0 : diff); - } - if (this.settings.autoPullInterval > 0) { - now = new Date(); - diff = this.settings.autoPullInterval - (Math.round(((now.getTime() - lastAutos.pull.getTime()) / 1000) / 60)); - this.startAutoPull(diff <= 0 ? 0 : diff); - } - _a.label = 5; - case 5: return [3 /*break*/, 7]; - case 6: - error_1 = _a.sent(); - this.displayError(error_1); - console.error(error_1); - return [3 /*break*/, 7]; - case 7: return [2 /*return*/]; - } - }); - }); - }; - ObsidianGit.prototype.pullChangesFromRemote = function () { - return __awaiter(this, void 0, void 0, function () { - var filesUpdated, status; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - if (!!this.gitReady) return [3 /*break*/, 2]; - return [4 /*yield*/, this.init()]; - case 1: - _a.sent(); - _a.label = 2; - case 2: - if (!this.gitReady) - return [2 /*return*/]; - return [4 /*yield*/, this.pull()]; - case 3: - filesUpdated = _a.sent(); - if (filesUpdated > 0) { - this.displayMessage("Pulled new changes. " + filesUpdated + " files updated"); - } - else { - this.displayMessage("Everything is up-to-date"); - } - return [4 /*yield*/, this.git.status()]; - case 4: - status = _a.sent(); - if (status.conflicted.length > 0) { - this.displayError("You have " + status.conflicted.length + " conflict files"); - } - this.lastUpdate = Date.now(); - this.setState(PluginState.idle); - return [2 /*return*/]; - } - }); - }); - }; - ObsidianGit.prototype.createBackup = function (fromAutoBackup, commitMessage) { - return __awaiter(this, void 0, void 0, function () { - var status, file, changedFiles, trackingBranch, currentBranch, remoteChangedFiles, pulledFilesLength, remoteChangedFiles_1; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - if (!!this.gitReady) return [3 /*break*/, 2]; - return [4 /*yield*/, this.init()]; - case 1: - _a.sent(); - _a.label = 2; - case 2: - if (!this.gitReady) - return [2 /*return*/]; - this.setState(PluginState.status); - return [4 /*yield*/, this.git.status()]; - case 3: - status = _a.sent(); - if (!!fromAutoBackup) return [3 /*break*/, 5]; - file = this.app.vault.getAbstractFileByPath(this.conflictOutputFile); - return [4 /*yield*/, this.app.vault.delete(file)]; - case 4: - _a.sent(); - _a.label = 5; - case 5: - // check for conflict files on auto backup - if (fromAutoBackup && status.conflicted.length > 0) { - this.setState(PluginState.idle); - this.displayError("Did not commit, because you have " + status.conflicted.length + " conflict files. Please resolve them and commit per command."); - this.handleConflict(status.conflicted); - return [2 /*return*/]; - } - return [4 /*yield*/, this.git.status()]; - case 6: - changedFiles = (_a.sent()).files; - if (!(changedFiles.length !== 0)) return [3 /*break*/, 10]; - return [4 /*yield*/, this.add()]; - case 7: - _a.sent(); - return [4 /*yield*/, this.git.status()]; - case 8: - status = _a.sent(); - return [4 /*yield*/, this.commit(commitMessage)]; - case 9: - _a.sent(); - this.lastUpdate = Date.now(); - this.displayMessage("Committed " + status.staged.length + " files"); - return [3 /*break*/, 11]; - case 10: - this.displayMessage("No changes to commit"); - _a.label = 11; - case 11: - if (!!this.settings.disablePush) return [3 /*break*/, 21]; - trackingBranch = status.tracking; - currentBranch = status.current; - if (!trackingBranch) { - this.displayError("Did not push. No upstream branch is set! See README for instructions", 10000); - this.setState(PluginState.idle); - return [2 /*return*/]; - } - return [4 /*yield*/, this.git.diffSummary([currentBranch, trackingBranch])]; - case 12: - remoteChangedFiles = (_a.sent()).changed; - if (!(remoteChangedFiles > 0)) return [3 /*break*/, 20]; - if (!this.settings.pullBeforePush) return [3 /*break*/, 14]; - return [4 /*yield*/, this.pull()]; - case 13: - pulledFilesLength = _a.sent(); - if (pulledFilesLength > 0) { - this.displayMessage("Pulled " + pulledFilesLength + " files from remote"); - } - _a.label = 14; - case 14: return [4 /*yield*/, this.git.status()]; - case 15: - // Refresh because of pull - status = _a.sent(); - if (!(status.conflicted.length > 0)) return [3 /*break*/, 16]; - this.displayError("Cannot push. You have " + status.conflicted.length + " conflict files"); - this.handleConflict(status.conflicted); - return [2 /*return*/]; - case 16: return [4 /*yield*/, this.git.diffSummary([currentBranch, trackingBranch])]; - case 17: - remoteChangedFiles_1 = (_a.sent()).changed; - return [4 /*yield*/, this.push()]; - case 18: - _a.sent(); - this.displayMessage("Pushed " + remoteChangedFiles_1 + " files to remote"); - _a.label = 19; - case 19: return [3 /*break*/, 21]; - case 20: - this.displayMessage("No changes to push"); - _a.label = 21; - case 21: - this.setState(PluginState.idle); - return [2 /*return*/]; - } - }); - }); - }; - // region: main methods - ObsidianGit.prototype.isGitInstalled = function () { - // https://github.com/steveukx/git-js/issues/402 - var command = child_process_1.spawnSync('git', ['--version'], { - stdio: 'ignore' - }); - if (command.error) { - console.error(command.error); - return false; - } - return true; - }; - ObsidianGit.prototype.add = function () { - return __awaiter(this, void 0, void 0, function () { - var _this = this; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - this.setState(PluginState.add); - return [4 /*yield*/, this.git.add("./*", function (err) { - return err && _this.displayError("Cannot add files: " + err.message); - })]; - case 1: - _a.sent(); - return [2 /*return*/]; - } - }); - }); - }; - ObsidianGit.prototype.commit = function (message) { - return __awaiter(this, void 0, void 0, function () { - var commitMessage, _a, _b; - return __generator(this, function (_c) { - switch (_c.label) { - case 0: - this.setState(PluginState.commit); - if (!(message !== null && message !== void 0)) return [3 /*break*/, 1]; - _a = message; - return [3 /*break*/, 3]; - case 1: return [4 /*yield*/, this.formatCommitMessage(this.settings.commitMessage)]; - case 2: - _a = _c.sent(); - _c.label = 3; - case 3: - commitMessage = _a; - if (!this.settings.listChangedFilesInMessageBody) return [3 /*break*/, 5]; - _b = [commitMessage, "Affected files:"]; - return [4 /*yield*/, this.git.status()]; - case 4: - commitMessage = _b.concat([(_c.sent()).staged.join("\n")]); - _c.label = 5; - case 5: return [4 /*yield*/, this.git.commit(commitMessage)]; - case 6: - _c.sent(); - return [2 /*return*/]; - } - }); - }); - }; - ObsidianGit.prototype.push = function () { - return __awaiter(this, void 0, void 0, function () { - var _this = this; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - this.setState(PluginState.push); - return [4 /*yield*/, this.git.env(__assign(__assign({}, process.env), { "OBSIDIAN_GIT": 1 })).push(function (err) { - err && _this.displayError("Push failed " + err.message); - })]; - case 1: - _a.sent(); - this.lastUpdate = Date.now(); - return [2 /*return*/]; - } - }); - }); - }; - ObsidianGit.prototype.pull = function () { - return __awaiter(this, void 0, void 0, function () { - var pullResult; - var _this = this; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - this.setState(PluginState.pull); - return [4 /*yield*/, this.git.pull(["--no-rebase"], function (err) { return __awaiter(_this, void 0, void 0, function () { - var status_1; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - if (!err) return [3 /*break*/, 2]; - this.displayError("Pull failed " + err.message); - return [4 /*yield*/, this.git.status()]; - case 1: - status_1 = _a.sent(); - if (status_1.conflicted.length > 0) { - this.handleConflict(status_1.conflicted); - } - _a.label = 2; - case 2: return [2 /*return*/]; - } - }); - }); })]; - case 1: - pullResult = _a.sent(); - this.lastUpdate = Date.now(); - return [2 /*return*/, pullResult.files.length]; - } - }); - }); - }; - // endregion: main methods - ObsidianGit.prototype.startAutoBackup = function (minutes) { - var _this = this; - this.timeoutIDBackup = window.setTimeout(function () { - _this.promiseQueue.addTask(function () { return _this.createBackup(true); }); - _this.saveLastAuto(new Date(), "backup"); - _this.saveSettings(); - _this.startAutoBackup(); - }, (minutes !== null && minutes !== void 0 ? minutes : this.settings.autoSaveInterval) * 60000); - }; - ObsidianGit.prototype.startAutoPull = function (minutes) { - var _this = this; - this.timeoutIDPull = window.setTimeout(function () { - _this.promiseQueue.addTask(function () { return _this.pullChangesFromRemote(); }); - _this.saveLastAuto(new Date(), "pull"); - _this.saveSettings(); - _this.startAutoPull(); - }, (minutes !== null && minutes !== void 0 ? minutes : this.settings.autoPullInterval) * 60000); - }; - ObsidianGit.prototype.clearAutoBackup = function () { - if (this.timeoutIDBackup) { - window.clearTimeout(this.timeoutIDBackup); - return true; - } - return false; - }; - ObsidianGit.prototype.clearAutoPull = function () { - if (this.timeoutIDPull) { - window.clearTimeout(this.timeoutIDPull); - return true; - } - return false; - }; - ObsidianGit.prototype.handleConflict = function (conflicted) { - return __awaiter(this, void 0, void 0, function () { - var lines; - var _this = this; - return __generator(this, function (_a) { - this.setState(PluginState.conflicted); - lines = __spreadArray([ - "# Conflict files", - "Please resolve them and commit per command (This file will be deleted before the commit)." - ], conflicted.map(function (e) { - var file = _this.app.vault.getAbstractFileByPath(e); - if (file instanceof obsidian.TFile) { - var link = _this.app.metadataCache.fileToLinktext(file, "/"); - return "- [[" + link + "]]"; - } - else { - return "- Not a file: " + e; - } - })); - this.writeAndOpenFile(lines.join("\n")); - return [2 /*return*/]; - }); - }); - }; - ObsidianGit.prototype.writeAndOpenFile = function (text) { - return __awaiter(this, void 0, void 0, function () { - var fileIsAlreadyOpened; - var _this = this; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: return [4 /*yield*/, this.app.vault.adapter.write(this.conflictOutputFile, text)]; - case 1: - _a.sent(); - fileIsAlreadyOpened = false; - this.app.workspace.iterateAllLeaves(function (leaf) { - if (leaf.getDisplayText() != "" && _this.conflictOutputFile.startsWith(leaf.getDisplayText())) { - fileIsAlreadyOpened = true; - } - }); - if (!fileIsAlreadyOpened) { - this.app.workspace.openLinkText(this.conflictOutputFile, "/", true); - } - return [2 /*return*/]; - } - }); - }); - }; - // region: displaying / formatting messages - ObsidianGit.prototype.displayMessage = function (message, timeout) { - var _a; - if (timeout === void 0) { timeout = 4 * 1000; } - (_a = this.statusBar) === null || _a === void 0 ? void 0 : _a.displayMessage(message.toLowerCase(), timeout); - if (!this.settings.disablePopups) { - new obsidian.Notice(message); - } - console.log("git obsidian message: " + message); - }; - ObsidianGit.prototype.displayError = function (message, timeout) { - var _a; - if (timeout === void 0) { timeout = 0; } - new obsidian.Notice(message); - console.log("git obsidian error: " + message); - (_a = this.statusBar) === null || _a === void 0 ? void 0 : _a.displayMessage(message.toLowerCase(), timeout); - }; - ObsidianGit.prototype.formatCommitMessage = function (template) { - return __awaiter(this, void 0, void 0, function () { - var status_2, numFiles, status_3, changeset_1, chunks, _i, _a, _b, action, files_1, files, moment; - return __generator(this, function (_c) { - switch (_c.label) { - case 0: - if (!template.includes("{{numFiles}}")) return [3 /*break*/, 2]; - return [4 /*yield*/, this.git.status()]; - case 1: - status_2 = _c.sent(); - numFiles = status_2.files.length; - template = template.replace("{{numFiles}}", String(numFiles)); - _c.label = 2; - case 2: - if (!template.includes("{{files}}")) return [3 /*break*/, 4]; - return [4 /*yield*/, this.git.status()]; - case 3: - status_3 = _c.sent(); - changeset_1 = {}; - status_3.files.forEach(function (value) { - if (value.index in changeset_1) { - changeset_1[value.index].push(value.path); - } - else { - changeset_1[value.index] = [value.path]; - } - }); - chunks = []; - for (_i = 0, _a = Object.entries(changeset_1); _i < _a.length; _i++) { - _b = _a[_i], action = _b[0], files_1 = _b[1]; - chunks.push(action + " " + files_1.join(" ")); - } - files = chunks.join(", "); - template = template.replace("{{files}}", files); - _c.label = 4; - case 4: - moment = window.moment; - return [2 /*return*/, template.replace("{{date}}", moment().format(this.settings.commitDateFormat))]; - } - }); - }); - }; - return ObsidianGit; -}(obsidian.Plugin)); -var ObsidianGitSettingsTab = /** @class */ (function (_super) { - __extends(ObsidianGitSettingsTab, _super); - function ObsidianGitSettingsTab() { - return _super !== null && _super.apply(this, arguments) || this; - } - ObsidianGitSettingsTab.prototype.display = function () { - var _this = this; - var containerEl = this.containerEl; - var plugin = this.plugin; - containerEl.empty(); - containerEl.createEl("h2", { text: "Git Backup settings" }); - new obsidian.Setting(containerEl) - .setName("Vault backup interval (minutes)") - .setDesc("Commit and push changes every X minutes. To disable automatic backup, specify negative value or zero (default)") - .addText(function (text) { - return text - .setValue(String(plugin.settings.autoSaveInterval)) - .onChange(function (value) { - if (!isNaN(Number(value))) { - plugin.settings.autoSaveInterval = Number(value); - plugin.saveSettings(); - if (plugin.settings.autoSaveInterval > 0) { - plugin.clearAutoBackup(); - plugin.startAutoBackup(plugin.settings.autoSaveInterval); - new obsidian.Notice("Automatic backup enabled! Every " + plugin.settings.autoSaveInterval + " minutes."); - } - else if (plugin.settings.autoSaveInterval <= 0 && - plugin.timeoutIDBackup) { - plugin.clearAutoBackup() && - new obsidian.Notice("Automatic backup disabled!"); - } - } - else { - new obsidian.Notice("Please specify a valid number."); - } - }); - }); - new obsidian.Setting(containerEl) - .setName("Auto pull interval (minutes)") - .setDesc("Pull changes every X minutes. To disable automatic pull, specify negative value or zero (default)") - .addText(function (text) { - return text - .setValue(String(plugin.settings.autoPullInterval)) - .onChange(function (value) { - if (!isNaN(Number(value))) { - plugin.settings.autoPullInterval = Number(value); - plugin.saveSettings(); - if (plugin.settings.autoPullInterval > 0) { - plugin.clearAutoPull(); - plugin.startAutoPull(plugin.settings.autoPullInterval); - new obsidian.Notice("Automatic pull enabled! Every " + plugin.settings.autoPullInterval + " minutes."); - } - else if (plugin.settings.autoPullInterval <= 0 && - plugin.timeoutIDPull) { - plugin.clearAutoPull() && - new obsidian.Notice("Automatic pull disabled!"); - } - } - else { - new obsidian.Notice("Please specify a valid number."); - } - }); - }); - new obsidian.Setting(containerEl) - .setName("Commit message") - .setDesc("Specify custom commit message. Available placeholders: {{date}}" + - " (see below) and {{numFiles}} (number of changed files in the commit)") - .addText(function (text) { - return text - .setPlaceholder("vault backup") - .setValue(plugin.settings.commitMessage - ? plugin.settings.commitMessage - : "") - .onChange(function (value) { - plugin.settings.commitMessage = value; - plugin.saveSettings(); - }); - }); - new obsidian.Setting(containerEl) - .setName("{{date}} placeholder format") - .setDesc('Specify custom date format. E.g. "YYYY-MM-DD HH:mm:ss"') - .addText(function (text) { - return text - .setPlaceholder(plugin.settings.commitDateFormat) - .setValue(plugin.settings.commitDateFormat) - .onChange(function (value) { return __awaiter(_this, void 0, void 0, function () { - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - plugin.settings.commitDateFormat = value; - return [4 /*yield*/, plugin.saveSettings()]; - case 1: - _a.sent(); - return [2 /*return*/]; - } - }); - }); }); - }); - new obsidian.Setting(containerEl) - .setName("Preview commit message") - .addButton(function (button) { - return button.setButtonText("Preview").onClick(function () { return __awaiter(_this, void 0, void 0, function () { - var commitMessagePreview; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: return [4 /*yield*/, plugin.formatCommitMessage(plugin.settings.commitMessage)]; - case 1: - commitMessagePreview = _a.sent(); - new obsidian.Notice("" + commitMessagePreview); - return [2 /*return*/]; - } - }); - }); }); - }); - new obsidian.Setting(containerEl) - .setName("List filenames affected by commit in the commit body") - .addToggle(function (toggle) { - return toggle - .setValue(plugin.settings.listChangedFilesInMessageBody) - .onChange(function (value) { - plugin.settings.listChangedFilesInMessageBody = value; - plugin.saveSettings(); - }); - }); - new obsidian.Setting(containerEl) - .setName("Current branch") - .setDesc("Switch to a different branch") - .addDropdown(function (dropdown) { return __awaiter(_this, void 0, void 0, function () { - var branchInfo, _i, _a, branch; - var _this = this; - return __generator(this, function (_b) { - switch (_b.label) { - case 0: return [4 /*yield*/, plugin.git.branchLocal()]; - case 1: - branchInfo = _b.sent(); - for (_i = 0, _a = branchInfo.all; _i < _a.length; _i++) { - branch = _a[_i]; - dropdown.addOption(branch, branch); - } - dropdown.setValue(branchInfo.current); - dropdown.onChange(function (option) { return __awaiter(_this, void 0, void 0, function () { - var _this = this; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: return [4 /*yield*/, plugin.git.checkout(option, [], function (err) { return __awaiter(_this, void 0, void 0, function () { - return __generator(this, function (_a) { - if (err) { - new obsidian.Notice(err.message); - dropdown.setValue(branchInfo.current); - } - else { - new obsidian.Notice("Checked out to " + option); - } - return [2 /*return*/]; - }); - }); })]; - case 1: - _a.sent(); - return [2 /*return*/]; - } - }); - }); }); - return [2 /*return*/]; - } - }); - }); }); - new obsidian.Setting(containerEl) - .setName("Pull updates on startup") - .setDesc("Automatically pull updates when Obsidian starts") - .addToggle(function (toggle) { - return toggle - .setValue(plugin.settings.autoPullOnBoot) - .onChange(function (value) { - plugin.settings.autoPullOnBoot = value; - plugin.saveSettings(); - }); - }); - new obsidian.Setting(containerEl) - .setName("Disable push") - .setDesc("Do not push changes to the remote repository") - .addToggle(function (toggle) { - return toggle - .setValue(plugin.settings.disablePush) - .onChange(function (value) { - plugin.settings.disablePush = value; - plugin.saveSettings(); - }); - }); - new obsidian.Setting(containerEl) - .setName("Pull changes before push") - .setDesc("Commit -> pull -> push (Only if pushing is enabled)") - .addToggle(function (toggle) { - return toggle - .setValue(plugin.settings.pullBeforePush) - .onChange(function (value) { - plugin.settings.pullBeforePush = value; - plugin.saveSettings(); - }); - }); - new obsidian.Setting(containerEl) - .setName("Disable notifications") - .setDesc("Disable notifications for git operations to minimize distraction (refer to status bar for updates)") - .addToggle(function (toggle) { - return toggle - .setValue(plugin.settings.disablePopups) - .onChange(function (value) { - plugin.settings.disablePopups = value; - plugin.saveSettings(); - }); - }); - new obsidian.Setting(containerEl) - .setName("Show status bar") - .setDesc("Obsidian must be restarted for the changes to take affect") - .addToggle(function (toggle) { - return toggle - .setValue(plugin.settings.showStatusBar) - .onChange(function (value) { - plugin.settings.showStatusBar = value; - plugin.saveSettings(); - }); - }); - }; - return ObsidianGitSettingsTab; -}(obsidian.PluginSettingTab)); -var StatusBar = /** @class */ (function () { - function StatusBar(statusBarEl, plugin) { - this.messages = []; - this.statusBarEl = statusBarEl; - this.plugin = plugin; - } - StatusBar.prototype.displayMessage = function (message, timeout) { - this.messages.push({ - message: "git: " + message.slice(0, 100), - timeout: timeout, - }); - this.display(); - }; - StatusBar.prototype.display = function () { - if (this.messages.length > 0 && !this.currentMessage) { - this.currentMessage = this.messages.shift(); - this.statusBarEl.setText(this.currentMessage.message); - this.lastMessageTimestamp = Date.now(); - } - else if (this.currentMessage) { - var messageAge = Date.now() - this.lastMessageTimestamp; - if (messageAge >= this.currentMessage.timeout) { - this.currentMessage = null; - this.lastMessageTimestamp = null; - } - } - else { - this.displayState(); - } - }; - StatusBar.prototype.displayState = function () { - switch (this.plugin.state) { - case PluginState.idle: - this.displayFromNow(this.plugin.lastUpdate); - break; - case PluginState.status: - this.statusBarEl.setText("git: checking repo status.."); - break; - case PluginState.add: - this.statusBarEl.setText("git: adding files to repo.."); - break; - case PluginState.commit: - this.statusBarEl.setText("git: committing changes.."); - break; - case PluginState.push: - this.statusBarEl.setText("git: pushing changes.."); - break; - case PluginState.pull: - this.statusBarEl.setText("git: pulling changes.."); - break; - case PluginState.conflicted: - this.statusBarEl.setText("git: you have conflict files.."); - break; - default: - this.statusBarEl.setText("git: failed on initialization!"); - break; - } - }; - StatusBar.prototype.displayFromNow = function (timestamp) { - if (timestamp) { - var moment_1 = window.moment; - var fromNow = moment_1(timestamp).fromNow(); - this.statusBarEl.setText("git: last update " + fromNow + ".."); - } - else { - this.statusBarEl.setText("git: ready"); - } - }; - return StatusBar; -}()); -var CustomMessageModal = /** @class */ (function (_super) { - __extends(CustomMessageModal, _super); - function CustomMessageModal(plugin) { - var _this = _super.call(this, plugin.app) || this; - _this.plugin = plugin; - _this.setPlaceholder("Type your message and select optional the version with the added date."); - return _this; - } - CustomMessageModal.prototype.getSuggestions = function (query) { - var date = window.moment().format(this.plugin.settings.commitDateFormat); - if (query == "") - query = "..."; - return [query, date + ": " + query, query + ": " + date]; - }; - CustomMessageModal.prototype.renderSuggestion = function (value, el) { - el.innerText = value; - }; - CustomMessageModal.prototype.onChooseSuggestion = function (item, _) { - var _this = this; - this.plugin.promiseQueue.addTask(function () { return _this.plugin.createBackup(false, item); }); - }; - return CustomMessageModal; -}(obsidian.SuggestModal)); -var ChangedFilesModal = /** @class */ (function (_super) { - __extends(ChangedFilesModal, _super); - function ChangedFilesModal(plugin, changedFiles) { - var _this = _super.call(this, plugin.app) || this; - _this.plugin = plugin; - _this.changedFiles = changedFiles; - _this.setPlaceholder("Not supported files will be opened by default app!"); - return _this; - } - ChangedFilesModal.prototype.getItems = function () { - return this.changedFiles; - }; - ChangedFilesModal.prototype.getItemText = function (item) { - if (item.index == "?" && item.working_dir == "?") { - return "Untracked | " + item.path; - } - var working_dir = ""; - var index = ""; - if (item.working_dir != " ") - working_dir = "Working dir: " + item.working_dir + " "; - if (item.index != " ") - index = "Index: " + item.index; - return "" + working_dir + index + " | " + item.path; - }; - ChangedFilesModal.prototype.onChooseItem = function (item, _) { - if (this.plugin.app.metadataCache.getFirstLinkpathDest(item.path, "") == null) { - this.app.openWithDefaultApp(item.path); - } - else { - this.plugin.app.workspace.openLinkText(item.path, "/"); - } - }; - return ChangedFilesModal; -}(obsidian.FuzzySuggestModal)); -var PromiseQueue = /** @class */ (function () { - function PromiseQueue() { - this.tasks = []; - } - PromiseQueue.prototype.addTask = function (task) { - this.tasks.push(task); - if (this.tasks.length === 1) { - this.handleTask(); - } - }; - PromiseQueue.prototype.handleTask = function () { - return __awaiter(this, void 0, void 0, function () { - var _this = this; - return __generator(this, function (_a) { - if (this.tasks.length > 0) { - this.tasks[0]().finally(function () { - _this.tasks.shift(); - _this.handleTask(); - }); - } - return [2 /*return*/]; - }); - }); - }; - return PromiseQueue; -}()); - -module.exports = ObsidianGit; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvZXJyb3JzL2dpdC1lcnJvci5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvZXJyb3JzL2dpdC1yZXNwb25zZS1lcnJvci5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvZXJyb3JzL2dpdC1jb25zdHJ1Y3QtZXJyb3IuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL2Vycm9ycy9naXQtcGx1Z2luLWVycm9yLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9lcnJvcnMvdGFzay1jb25maWd1cmF0aW9uLWVycm9yLmpzIiwibm9kZV9tb2R1bGVzL21zL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2RlYnVnL3NyYy9jb21tb24uanMiLCJub2RlX21vZHVsZXMvZGVidWcvc3JjL2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvaGFzLWZsYWcvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc3VwcG9ydHMtY29sb3IvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZGVidWcvc3JjL25vZGUuanMiLCJub2RlX21vZHVsZXMvZGVidWcvc3JjL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL0Brd3NpdGVzL2ZpbGUtZXhpc3RzL2Rpc3Qvc3JjL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL0Brd3NpdGVzL2ZpbGUtZXhpc3RzL2Rpc3QvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3V0aWxzL3V0aWwuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3V0aWxzL2FyZ3VtZW50LWZpbHRlcnMuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3V0aWxzL2V4aXQtY29kZXMuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3V0aWxzL2dpdC1vdXRwdXQtc3RyZWFtcy5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvdXRpbHMvbGluZS1wYXJzZXIuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3V0aWxzL3NpbXBsZS1naXQtb3B0aW9ucy5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvdXRpbHMvdGFzay1vcHRpb25zLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi91dGlscy90YXNrLXBhcnNlci5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvdXRpbHMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Rhc2tzL2NoZWNrLWlzLXJlcG8uanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Jlc3BvbnNlcy9DbGVhblN1bW1hcnkuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Rhc2tzL3Rhc2suanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Rhc2tzL2NsZWFuLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi90YXNrcy9yZXNldC5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvYXBpLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9wbHVnaW5zL2NvbW1hbmQtY29uZmlnLXByZWZpeGluZy1wbHVnaW4uanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3BsdWdpbnMvZXJyb3ItZGV0ZWN0aW9uLnBsdWdpbi5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcGx1Z2lucy9wbHVnaW4tc3RvcmUuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3BsdWdpbnMvcHJvZ3Jlc3MtbW9uaXRvci1wbHVnaW4uanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3BsdWdpbnMvc2ltcGxlLWdpdC1wbHVnaW4uanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3BsdWdpbnMvdGltb3V0LXBsdWdpbi5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcGx1Z2lucy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvZ2l0LWxvZ2dlci5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcnVubmVycy90YXNrcy1wZW5kaW5nLXF1ZXVlLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9ydW5uZXJzL2dpdC1leGVjdXRvci1jaGFpbi5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcnVubmVycy9naXQtZXhlY3V0b3IuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Rhc2stY2FsbGJhY2suanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3BhcnNlcnMvcGFyc2UtcmVtb3RlLW9iamVjdHMuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3BhcnNlcnMvcGFyc2UtcmVtb3RlLW1lc3NhZ2VzLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9wYXJzZXJzL3BhcnNlLXB1c2guanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Rhc2tzL3B1c2guanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3NpbXBsZS1naXQtYXBpLmpzIiwibm9kZV9tb2R1bGVzL0Brd3NpdGVzL3Byb21pc2UtZGVmZXJyZWQvZGlzdC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcnVubmVycy9zY2hlZHVsZXIuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Rhc2tzL2FwcGx5LXBhdGNoLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9yZXNwb25zZXMvQnJhbmNoRGVsZXRlU3VtbWFyeS5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcGFyc2Vycy9wYXJzZS1icmFuY2gtZGVsZXRlLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9yZXNwb25zZXMvQnJhbmNoU3VtbWFyeS5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcGFyc2Vycy9wYXJzZS1icmFuY2guanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Rhc2tzL2JyYW5jaC5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcmVzcG9uc2VzL0NoZWNrSWdub3JlLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi90YXNrcy9jaGVjay1pZ25vcmUuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Rhc2tzL2Nsb25lLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9yZXNwb25zZXMvQ29uZmlnTGlzdC5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvdGFza3MvY29uZmlnLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9wYXJzZXJzL3BhcnNlLWNvbW1pdC5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvdGFza3MvY29tbWl0LmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9yZXNwb25zZXMvRGlmZlN1bW1hcnkuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3BhcnNlcnMvcGFyc2UtZGlmZi1zdW1tYXJ5LmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi90YXNrcy9kaWZmLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9wYXJzZXJzL3BhcnNlLWZldGNoLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi90YXNrcy9mZXRjaC5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvdGFza3MvaGFzaC1vYmplY3QuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Jlc3BvbnNlcy9Jbml0U3VtbWFyeS5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvdGFza3MvaW5pdC5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcGFyc2Vycy9wYXJzZS1saXN0LWxvZy1zdW1tYXJ5LmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi90YXNrcy9sb2cuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Jlc3BvbnNlcy9NZXJnZVN1bW1hcnkuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Jlc3BvbnNlcy9QdWxsU3VtbWFyeS5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcGFyc2Vycy9wYXJzZS1wdWxsLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9wYXJzZXJzL3BhcnNlLW1lcmdlLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi90YXNrcy9tZXJnZS5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcGFyc2Vycy9wYXJzZS1tb3ZlLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi90YXNrcy9tb3ZlLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi90YXNrcy9wdWxsLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9yZXNwb25zZXMvR2V0UmVtb3RlU3VtbWFyeS5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvdGFza3MvcmVtb3RlLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi90YXNrcy9zdGFzaC1saXN0LmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9yZXNwb25zZXMvRmlsZVN0YXR1c1N1bW1hcnkuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Jlc3BvbnNlcy9TdGF0dXNTdW1tYXJ5LmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi90YXNrcy9zdGF0dXMuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Rhc2tzL3N1Yi1tb2R1bGUuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Jlc3BvbnNlcy9UYWdMaXN0LmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi90YXNrcy90YWcuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvZ2l0LmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9naXQtZmFjdG9yeS5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcnVubmVycy9wcm9taXNlLXdyYXBwZWQuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvaW5kZXguanMiLCJtYWluLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XHJcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgb1trMl0gPSBtW2tdO1xyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xyXG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xyXG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XHJcbiAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXHJcbiAgICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXHJcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xyXG4gICAgcmV0dXJuIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tKSB7XHJcbiAgICBmb3IgKHZhciBpID0gMCwgaWwgPSBmcm9tLmxlbmd0aCwgaiA9IHRvLmxlbmd0aDsgaSA8IGlsOyBpKyssIGorKylcclxuICAgICAgICB0b1tqXSA9IGZyb21baV07XHJcbiAgICByZXR1cm4gdG87XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcclxufSkgOiBmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcclxuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiBraW5kID09PSBcIm1cIiA/IGYgOiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlcikgOiBmID8gZi52YWx1ZSA6IHN0YXRlLmdldChyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcclxufVxyXG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuR2l0RXJyb3IgPSB2b2lkIDA7XG4vKipcbiAqIFRoZSBgR2l0RXJyb3JgIGlzIHRocm93biB3aGVuIHRoZSB1bmRlcmx5aW5nIGBnaXRgIHByb2Nlc3MgdGhyb3dzIGFcbiAqIGZhdGFsIGV4Y2VwdGlvbiAoZWcgYW4gYEVOT0VOVGAgZXhjZXB0aW9uIHdoZW4gYXR0ZW1wdGluZyB0byB1c2UgYVxuICogbm9uLXdyaXRhYmxlIGRpcmVjdG9yeSBhcyB0aGUgcm9vdCBmb3IgeW91ciByZXBvKSwgYW5kIGFjdHMgYXMgdGhlXG4gKiBiYXNlIGNsYXNzIGZvciBtb3JlIHNwZWNpZmljIGVycm9ycyB0aHJvd24gYnkgdGhlIHBhcnNpbmcgb2YgdGhlXG4gKiBnaXQgcmVzcG9uc2Ugb3IgZXJyb3JzIGluIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSB0YXNrIGFib3V0IHRvXG4gKiBiZSBydW4uXG4gKlxuICogV2hlbiBhbiBleGNlcHRpb24gaXMgdGhyb3duLCBwZW5kaW5nIHRhc2tzIGluIHRoZSBzYW1lIGluc3RhbmNlIHdpbGxcbiAqIG5vdCBiZSBleGVjdXRlZC4gVGhlIHJlY29tbWVuZGVkIHdheSB0byBydW4gYSBzZXJpZXMgb2YgdGFza3MgdGhhdFxuICogY2FuIGluZGVwZW5kZW50bHkgZmFpbCB3aXRob3V0IG5lZWRpbmcgdG8gcHJldmVudCBmdXR1cmUgdGFza3MgZnJvbVxuICogcnVubmluZyBpcyB0byBjYXRjaCB0aGVtIGluZGl2aWR1YWxseTpcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gaW1wb3J0IHsgZ2l0UCwgU2ltcGxlR2l0LCBHaXRFcnJvciwgUHVsbFJlc3VsdCB9IGZyb20gJ3NpbXBsZS1naXQnO1xuXG4gZnVuY3Rpb24gY2F0Y2hUYXNrIChlOiBHaXRFcnJvcikge1xuICAgcmV0dXJuIGUuXG4gfVxuXG4gY29uc3QgZ2l0ID0gZ2l0UChyZXBvV29ya2luZ0Rpcik7XG4gY29uc3QgcHVsbGVkOiBQdWxsUmVzdWx0IHwgR2l0RXJyb3IgPSBhd2FpdCBnaXQucHVsbCgpLmNhdGNoKGNhdGNoVGFzayk7XG4gY29uc3QgcHVzaGVkOiBzdHJpbmcgfCBHaXRFcnJvciA9IGF3YWl0IGdpdC5wdXNoVGFncygpLmNhdGNoKGNhdGNoVGFzayk7XG4gYGBgXG4gKi9cbmNsYXNzIEdpdEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKHRhc2ssIG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMudGFzayA9IHRhc2s7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBuZXcudGFyZ2V0LnByb3RvdHlwZSk7XG4gICAgfVxufVxuZXhwb3J0cy5HaXRFcnJvciA9IEdpdEVycm9yO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2l0LWVycm9yLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5HaXRSZXNwb25zZUVycm9yID0gdm9pZCAwO1xuY29uc3QgZ2l0X2Vycm9yXzEgPSByZXF1aXJlKFwiLi9naXQtZXJyb3JcIik7XG4vKipcbiAqIFRoZSBgR2l0UmVzcG9uc2VFcnJvcmAgaXMgdGhlIHdyYXBwZXIgZm9yIGEgcGFyc2VkIHJlc3BvbnNlIHRoYXQgaXMgdHJlYXRlZCBhc1xuICogYSBmYXRhbCBlcnJvciwgZm9yIGV4YW1wbGUgYXR0ZW1wdGluZyBhIGBtZXJnZWAgY2FuIGxlYXZlIHRoZSByZXBvIGluIGEgY29ycnVwdGVkXG4gKiBzdGF0ZSB3aGVuIHRoZXJlIGFyZSBjb25mbGljdHMgc28gdGhlIHRhc2sgd2lsbCByZWplY3QgcmF0aGVyIHRoYW4gcmVzb2x2ZS5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgY2F0Y2hpbmcgdGhlIG1lcmdlIGNvbmZsaWN0IGV4Y2VwdGlvbjpcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gaW1wb3J0IHsgZ2l0UCwgU2ltcGxlR2l0LCBHaXRSZXNwb25zZUVycm9yLCBNZXJnZVN1bW1hcnkgfSBmcm9tICdzaW1wbGUtZ2l0JztcblxuIGNvbnN0IGdpdCA9IGdpdFAocmVwb1Jvb3QpO1xuIGNvbnN0IG1lcmdlT3B0aW9uczogc3RyaW5nW10gPSBbJy0tbm8tZmYnLCAnb3RoZXItYnJhbmNoJ107XG4gY29uc3QgbWVyZ2VTdW1tYXJ5OiBNZXJnZVN1bW1hcnkgPSBhd2FpdCBnaXQubWVyZ2UobWVyZ2VPcHRpb25zKVxuICAgICAgLmNhdGNoKChlOiBHaXRSZXNwb25zZUVycm9yPE1lcmdlU3VtbWFyeT4pID0+IGUuZ2l0KTtcblxuIGlmIChtZXJnZVN1bW1hcnkuZmFpbGVkKSB7XG4gICAvLyBkZWFsIHdpdGggdGhlIGVycm9yXG4gfVxuIGBgYFxuICovXG5jbGFzcyBHaXRSZXNwb25zZUVycm9yIGV4dGVuZHMgZ2l0X2Vycm9yXzEuR2l0RXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgICAqIGAuZ2l0YCBhY2Nlc3MgdGhlIHBhcnNlZCByZXNwb25zZSB0aGF0IGlzIHRyZWF0ZWQgYXMgYmVpbmcgYW4gZXJyb3JcbiAgICAgKi9cbiAgICBnaXQsIG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIodW5kZWZpbmVkLCBtZXNzYWdlIHx8IFN0cmluZyhnaXQpKTtcbiAgICAgICAgdGhpcy5naXQgPSBnaXQ7XG4gICAgfVxufVxuZXhwb3J0cy5HaXRSZXNwb25zZUVycm9yID0gR2l0UmVzcG9uc2VFcnJvcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdpdC1yZXNwb25zZS1lcnJvci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuR2l0Q29uc3RydWN0RXJyb3IgPSB2b2lkIDA7XG5jb25zdCBnaXRfZXJyb3JfMSA9IHJlcXVpcmUoXCIuL2dpdC1lcnJvclwiKTtcbi8qKlxuICogVGhlIGBHaXRDb25zdHJ1Y3RFcnJvcmAgaXMgdGhyb3duIHdoZW4gYW4gZXJyb3Igb2NjdXJzIGluIHRoZSBjb25zdHJ1Y3RvclxuICogb2YgdGhlIGBzaW1wbGUtZ2l0YCBpbnN0YW5jZSBpdHNlbGYuIE1vc3QgY29tbW9ubHkgYXMgYSByZXN1bHQgb2YgdXNpbmdcbiAqIGEgYGJhc2VEaXJgIG9wdGlvbiB0aGF0IHBvaW50cyB0byBhIGZvbGRlciB0aGF0IGVpdGhlciBkb2VzIG5vdCBleGlzdCxcbiAqIG9yIGNhbm5vdCBiZSByZWFkIGJ5IHRoZSB1c2VyIHRoZSBub2RlIHNjcmlwdCBpcyBydW5uaW5nIGFzLlxuICpcbiAqIENoZWNrIHRoZSBgLm1lc3NhZ2VgIHByb3BlcnR5IGZvciBtb3JlIGRldGFpbCBpbmNsdWRpbmcgdGhlIHByb3BlcnRpZXNcbiAqIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuXG4gKi9cbmNsYXNzIEdpdENvbnN0cnVjdEVycm9yIGV4dGVuZHMgZ2l0X2Vycm9yXzEuR2l0RXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvbmZpZywgbWVzc2FnZSkge1xuICAgICAgICBzdXBlcih1bmRlZmluZWQsIG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB9XG59XG5leHBvcnRzLkdpdENvbnN0cnVjdEVycm9yID0gR2l0Q29uc3RydWN0RXJyb3I7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1naXQtY29uc3RydWN0LWVycm9yLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5HaXRQbHVnaW5FcnJvciA9IHZvaWQgMDtcbmNvbnN0IGdpdF9lcnJvcl8xID0gcmVxdWlyZShcIi4vZ2l0LWVycm9yXCIpO1xuY2xhc3MgR2l0UGx1Z2luRXJyb3IgZXh0ZW5kcyBnaXRfZXJyb3JfMS5HaXRFcnJvciB7XG4gICAgY29uc3RydWN0b3IodGFzaywgcGx1Z2luLCBtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKHRhc2ssIG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLnRhc2sgPSB0YXNrO1xuICAgICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIG5ldy50YXJnZXQucHJvdG90eXBlKTtcbiAgICB9XG59XG5leHBvcnRzLkdpdFBsdWdpbkVycm9yID0gR2l0UGx1Z2luRXJyb3I7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1naXQtcGx1Z2luLWVycm9yLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5UYXNrQ29uZmlndXJhdGlvbkVycm9yID0gdm9pZCAwO1xuY29uc3QgZ2l0X2Vycm9yXzEgPSByZXF1aXJlKFwiLi9naXQtZXJyb3JcIik7XG4vKipcbiAqIFRoZSBgVGFza0NvbmZpZ3VyYXRpb25FcnJvcmAgaXMgdGhyb3duIHdoZW4gYSBjb21tYW5kIHdhcyBpbmNvcnJlY3RseVxuICogY29uZmlndXJlZC4gQW4gZXJyb3Igb2YgdGhpcyBraW5kIG1lYW5zIHRoYXQgbm8gYXR0ZW1wdCB3YXMgbWFkZSB0b1xuICogcnVuIHlvdXIgY29tbWFuZCB0aHJvdWdoIHRoZSB1bmRlcmx5aW5nIGBnaXRgIGJpbmFyeS5cbiAqXG4gKiBDaGVjayB0aGUgYC5tZXNzYWdlYCBwcm9wZXJ0eSBmb3IgbW9yZSBkZXRhaWwgb24gd2h5IHlvdXIgY29uZmlndXJhdGlvblxuICogcmVzdWx0ZWQgaW4gYW4gZXJyb3IuXG4gKi9cbmNsYXNzIFRhc2tDb25maWd1cmF0aW9uRXJyb3IgZXh0ZW5kcyBnaXRfZXJyb3JfMS5HaXRFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgICAgICBzdXBlcih1bmRlZmluZWQsIG1lc3NhZ2UpO1xuICAgIH1cbn1cbmV4cG9ydHMuVGFza0NvbmZpZ3VyYXRpb25FcnJvciA9IFRhc2tDb25maWd1cmF0aW9uRXJyb3I7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10YXNrLWNvbmZpZ3VyYXRpb24tZXJyb3IuanMubWFwIiwiLyoqXG4gKiBIZWxwZXJzLlxuICovXG5cbnZhciBzID0gMTAwMDtcbnZhciBtID0gcyAqIDYwO1xudmFyIGggPSBtICogNjA7XG52YXIgZCA9IGggKiAyNDtcbnZhciB3ID0gZCAqIDc7XG52YXIgeSA9IGQgKiAzNjUuMjU7XG5cbi8qKlxuICogUGFyc2Ugb3IgZm9ybWF0IHRoZSBnaXZlbiBgdmFsYC5cbiAqXG4gKiBPcHRpb25zOlxuICpcbiAqICAtIGBsb25nYCB2ZXJib3NlIGZvcm1hdHRpbmcgW2ZhbHNlXVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gdmFsXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhyb3cgYW4gZXJyb3IgaWYgdmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSBudW1iZXJcbiAqIEByZXR1cm4ge1N0cmluZ3xOdW1iZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24odmFsLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWw7XG4gIGlmICh0eXBlID09PSAnc3RyaW5nJyAmJiB2YWwubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBwYXJzZSh2YWwpO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdudW1iZXInICYmIGlzRmluaXRlKHZhbCkpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5sb25nID8gZm10TG9uZyh2YWwpIDogZm10U2hvcnQodmFsKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgJ3ZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgdmFsaWQgbnVtYmVyLiB2YWw9JyArXG4gICAgICBKU09OLnN0cmluZ2lmeSh2YWwpXG4gICk7XG59O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBgc3RyYCBhbmQgcmV0dXJuIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZShzdHIpIHtcbiAgc3RyID0gU3RyaW5nKHN0cik7XG4gIGlmIChzdHIubGVuZ3RoID4gMTAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBtYXRjaCA9IC9eKC0/KD86XFxkKyk/XFwuP1xcZCspICoobWlsbGlzZWNvbmRzP3xtc2Vjcz98bXN8c2Vjb25kcz98c2Vjcz98c3xtaW51dGVzP3xtaW5zP3xtfGhvdXJzP3xocnM/fGh8ZGF5cz98ZHx3ZWVrcz98d3x5ZWFycz98eXJzP3x5KT8kL2kuZXhlYyhcbiAgICBzdHJcbiAgKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbiA9IHBhcnNlRmxvYXQobWF0Y2hbMV0pO1xuICB2YXIgdHlwZSA9IChtYXRjaFsyXSB8fCAnbXMnKS50b0xvd2VyQ2FzZSgpO1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICd5ZWFycyc6XG4gICAgY2FzZSAneWVhcic6XG4gICAgY2FzZSAneXJzJzpcbiAgICBjYXNlICd5cic6XG4gICAgY2FzZSAneSc6XG4gICAgICByZXR1cm4gbiAqIHk7XG4gICAgY2FzZSAnd2Vla3MnOlxuICAgIGNhc2UgJ3dlZWsnOlxuICAgIGNhc2UgJ3cnOlxuICAgICAgcmV0dXJuIG4gKiB3O1xuICAgIGNhc2UgJ2RheXMnOlxuICAgIGNhc2UgJ2RheSc6XG4gICAgY2FzZSAnZCc6XG4gICAgICByZXR1cm4gbiAqIGQ7XG4gICAgY2FzZSAnaG91cnMnOlxuICAgIGNhc2UgJ2hvdXInOlxuICAgIGNhc2UgJ2hycyc6XG4gICAgY2FzZSAnaHInOlxuICAgIGNhc2UgJ2gnOlxuICAgICAgcmV0dXJuIG4gKiBoO1xuICAgIGNhc2UgJ21pbnV0ZXMnOlxuICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgY2FzZSAnbWlucyc6XG4gICAgY2FzZSAnbWluJzpcbiAgICBjYXNlICdtJzpcbiAgICAgIHJldHVybiBuICogbTtcbiAgICBjYXNlICdzZWNvbmRzJzpcbiAgICBjYXNlICdzZWNvbmQnOlxuICAgIGNhc2UgJ3NlY3MnOlxuICAgIGNhc2UgJ3NlYyc6XG4gICAgY2FzZSAncyc6XG4gICAgICByZXR1cm4gbiAqIHM7XG4gICAgY2FzZSAnbWlsbGlzZWNvbmRzJzpcbiAgICBjYXNlICdtaWxsaXNlY29uZCc6XG4gICAgY2FzZSAnbXNlY3MnOlxuICAgIGNhc2UgJ21zZWMnOlxuICAgIGNhc2UgJ21zJzpcbiAgICAgIHJldHVybiBuO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogU2hvcnQgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZm10U2hvcnQobXMpIHtcbiAgdmFyIG1zQWJzID0gTWF0aC5hYnMobXMpO1xuICBpZiAobXNBYnMgPj0gZCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gZCkgKyAnZCc7XG4gIH1cbiAgaWYgKG1zQWJzID49IGgpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGgpICsgJ2gnO1xuICB9XG4gIGlmIChtc0FicyA+PSBtKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBtKSArICdtJztcbiAgfVxuICBpZiAobXNBYnMgPj0gcykge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gcykgKyAncyc7XG4gIH1cbiAgcmV0dXJuIG1zICsgJ21zJztcbn1cblxuLyoqXG4gKiBMb25nIGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZtdExvbmcobXMpIHtcbiAgdmFyIG1zQWJzID0gTWF0aC5hYnMobXMpO1xuICBpZiAobXNBYnMgPj0gZCkge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBkLCAnZGF5Jyk7XG4gIH1cbiAgaWYgKG1zQWJzID49IGgpIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgaCwgJ2hvdXInKTtcbiAgfVxuICBpZiAobXNBYnMgPj0gbSkge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBtLCAnbWludXRlJyk7XG4gIH1cbiAgaWYgKG1zQWJzID49IHMpIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgcywgJ3NlY29uZCcpO1xuICB9XG4gIHJldHVybiBtcyArICcgbXMnO1xufVxuXG4vKipcbiAqIFBsdXJhbGl6YXRpb24gaGVscGVyLlxuICovXG5cbmZ1bmN0aW9uIHBsdXJhbChtcywgbXNBYnMsIG4sIG5hbWUpIHtcbiAgdmFyIGlzUGx1cmFsID0gbXNBYnMgPj0gbiAqIDEuNTtcbiAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBuKSArICcgJyArIG5hbWUgKyAoaXNQbHVyYWwgPyAncycgOiAnJyk7XG59XG4iLCJcbi8qKlxuICogVGhpcyBpcyB0aGUgY29tbW9uIGxvZ2ljIGZvciBib3RoIHRoZSBOb2RlLmpzIGFuZCB3ZWIgYnJvd3NlclxuICogaW1wbGVtZW50YXRpb25zIG9mIGBkZWJ1ZygpYC5cbiAqL1xuXG5mdW5jdGlvbiBzZXR1cChlbnYpIHtcblx0Y3JlYXRlRGVidWcuZGVidWcgPSBjcmVhdGVEZWJ1Zztcblx0Y3JlYXRlRGVidWcuZGVmYXVsdCA9IGNyZWF0ZURlYnVnO1xuXHRjcmVhdGVEZWJ1Zy5jb2VyY2UgPSBjb2VyY2U7XG5cdGNyZWF0ZURlYnVnLmRpc2FibGUgPSBkaXNhYmxlO1xuXHRjcmVhdGVEZWJ1Zy5lbmFibGUgPSBlbmFibGU7XG5cdGNyZWF0ZURlYnVnLmVuYWJsZWQgPSBlbmFibGVkO1xuXHRjcmVhdGVEZWJ1Zy5odW1hbml6ZSA9IHJlcXVpcmUoJ21zJyk7XG5cdGNyZWF0ZURlYnVnLmRlc3Ryb3kgPSBkZXN0cm95O1xuXG5cdE9iamVjdC5rZXlzKGVudikuZm9yRWFjaChrZXkgPT4ge1xuXHRcdGNyZWF0ZURlYnVnW2tleV0gPSBlbnZba2V5XTtcblx0fSk7XG5cblx0LyoqXG5cdCogVGhlIGN1cnJlbnRseSBhY3RpdmUgZGVidWcgbW9kZSBuYW1lcywgYW5kIG5hbWVzIHRvIHNraXAuXG5cdCovXG5cblx0Y3JlYXRlRGVidWcubmFtZXMgPSBbXTtcblx0Y3JlYXRlRGVidWcuc2tpcHMgPSBbXTtcblxuXHQvKipcblx0KiBNYXAgb2Ygc3BlY2lhbCBcIiVuXCIgaGFuZGxpbmcgZnVuY3Rpb25zLCBmb3IgdGhlIGRlYnVnIFwiZm9ybWF0XCIgYXJndW1lbnQuXG5cdCpcblx0KiBWYWxpZCBrZXkgbmFtZXMgYXJlIGEgc2luZ2xlLCBsb3dlciBvciB1cHBlci1jYXNlIGxldHRlciwgaS5lLiBcIm5cIiBhbmQgXCJOXCIuXG5cdCovXG5cdGNyZWF0ZURlYnVnLmZvcm1hdHRlcnMgPSB7fTtcblxuXHQvKipcblx0KiBTZWxlY3RzIGEgY29sb3IgZm9yIGEgZGVidWcgbmFtZXNwYWNlXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIHN0cmluZyBmb3IgdGhlIGZvciB0aGUgZGVidWcgaW5zdGFuY2UgdG8gYmUgY29sb3JlZFxuXHQqIEByZXR1cm4ge051bWJlcnxTdHJpbmd9IEFuIEFOU0kgY29sb3IgY29kZSBmb3IgdGhlIGdpdmVuIG5hbWVzcGFjZVxuXHQqIEBhcGkgcHJpdmF0ZVxuXHQqL1xuXHRmdW5jdGlvbiBzZWxlY3RDb2xvcihuYW1lc3BhY2UpIHtcblx0XHRsZXQgaGFzaCA9IDA7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVzcGFjZS5sZW5ndGg7IGkrKykge1xuXHRcdFx0aGFzaCA9ICgoaGFzaCA8PCA1KSAtIGhhc2gpICsgbmFtZXNwYWNlLmNoYXJDb2RlQXQoaSk7XG5cdFx0XHRoYXNoIHw9IDA7IC8vIENvbnZlcnQgdG8gMzJiaXQgaW50ZWdlclxuXHRcdH1cblxuXHRcdHJldHVybiBjcmVhdGVEZWJ1Zy5jb2xvcnNbTWF0aC5hYnMoaGFzaCkgJSBjcmVhdGVEZWJ1Zy5jb2xvcnMubGVuZ3RoXTtcblx0fVxuXHRjcmVhdGVEZWJ1Zy5zZWxlY3RDb2xvciA9IHNlbGVjdENvbG9yO1xuXG5cdC8qKlxuXHQqIENyZWF0ZSBhIGRlYnVnZ2VyIHdpdGggdGhlIGdpdmVuIGBuYW1lc3BhY2VgLlxuXHQqXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZVxuXHQqIEByZXR1cm4ge0Z1bmN0aW9ufVxuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGNyZWF0ZURlYnVnKG5hbWVzcGFjZSkge1xuXHRcdGxldCBwcmV2VGltZTtcblx0XHRsZXQgZW5hYmxlT3ZlcnJpZGUgPSBudWxsO1xuXG5cdFx0ZnVuY3Rpb24gZGVidWcoLi4uYXJncykge1xuXHRcdFx0Ly8gRGlzYWJsZWQ/XG5cdFx0XHRpZiAoIWRlYnVnLmVuYWJsZWQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBzZWxmID0gZGVidWc7XG5cblx0XHRcdC8vIFNldCBgZGlmZmAgdGltZXN0YW1wXG5cdFx0XHRjb25zdCBjdXJyID0gTnVtYmVyKG5ldyBEYXRlKCkpO1xuXHRcdFx0Y29uc3QgbXMgPSBjdXJyIC0gKHByZXZUaW1lIHx8IGN1cnIpO1xuXHRcdFx0c2VsZi5kaWZmID0gbXM7XG5cdFx0XHRzZWxmLnByZXYgPSBwcmV2VGltZTtcblx0XHRcdHNlbGYuY3VyciA9IGN1cnI7XG5cdFx0XHRwcmV2VGltZSA9IGN1cnI7XG5cblx0XHRcdGFyZ3NbMF0gPSBjcmVhdGVEZWJ1Zy5jb2VyY2UoYXJnc1swXSk7XG5cblx0XHRcdGlmICh0eXBlb2YgYXJnc1swXSAhPT0gJ3N0cmluZycpIHtcblx0XHRcdFx0Ly8gQW55dGhpbmcgZWxzZSBsZXQncyBpbnNwZWN0IHdpdGggJU9cblx0XHRcdFx0YXJncy51bnNoaWZ0KCclTycpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBcHBseSBhbnkgYGZvcm1hdHRlcnNgIHRyYW5zZm9ybWF0aW9uc1xuXHRcdFx0bGV0IGluZGV4ID0gMDtcblx0XHRcdGFyZ3NbMF0gPSBhcmdzWzBdLnJlcGxhY2UoLyUoW2EtekEtWiVdKS9nLCAobWF0Y2gsIGZvcm1hdCkgPT4ge1xuXHRcdFx0XHQvLyBJZiB3ZSBlbmNvdW50ZXIgYW4gZXNjYXBlZCAlIHRoZW4gZG9uJ3QgaW5jcmVhc2UgdGhlIGFycmF5IGluZGV4XG5cdFx0XHRcdGlmIChtYXRjaCA9PT0gJyUlJykge1xuXHRcdFx0XHRcdHJldHVybiAnJSc7XG5cdFx0XHRcdH1cblx0XHRcdFx0aW5kZXgrKztcblx0XHRcdFx0Y29uc3QgZm9ybWF0dGVyID0gY3JlYXRlRGVidWcuZm9ybWF0dGVyc1tmb3JtYXRdO1xuXHRcdFx0XHRpZiAodHlwZW9mIGZvcm1hdHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRcdGNvbnN0IHZhbCA9IGFyZ3NbaW5kZXhdO1xuXHRcdFx0XHRcdG1hdGNoID0gZm9ybWF0dGVyLmNhbGwoc2VsZiwgdmFsKTtcblxuXHRcdFx0XHRcdC8vIE5vdyB3ZSBuZWVkIHRvIHJlbW92ZSBgYXJnc1tpbmRleF1gIHNpbmNlIGl0J3MgaW5saW5lZCBpbiB0aGUgYGZvcm1hdGBcblx0XHRcdFx0XHRhcmdzLnNwbGljZShpbmRleCwgMSk7XG5cdFx0XHRcdFx0aW5kZXgtLTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gbWF0Y2g7XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gQXBwbHkgZW52LXNwZWNpZmljIGZvcm1hdHRpbmcgKGNvbG9ycywgZXRjLilcblx0XHRcdGNyZWF0ZURlYnVnLmZvcm1hdEFyZ3MuY2FsbChzZWxmLCBhcmdzKTtcblxuXHRcdFx0Y29uc3QgbG9nRm4gPSBzZWxmLmxvZyB8fCBjcmVhdGVEZWJ1Zy5sb2c7XG5cdFx0XHRsb2dGbi5hcHBseShzZWxmLCBhcmdzKTtcblx0XHR9XG5cblx0XHRkZWJ1Zy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG5cdFx0ZGVidWcudXNlQ29sb3JzID0gY3JlYXRlRGVidWcudXNlQ29sb3JzKCk7XG5cdFx0ZGVidWcuY29sb3IgPSBjcmVhdGVEZWJ1Zy5zZWxlY3RDb2xvcihuYW1lc3BhY2UpO1xuXHRcdGRlYnVnLmV4dGVuZCA9IGV4dGVuZDtcblx0XHRkZWJ1Zy5kZXN0cm95ID0gY3JlYXRlRGVidWcuZGVzdHJveTsgLy8gWFhYIFRlbXBvcmFyeS4gV2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2UuXG5cblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZGVidWcsICdlbmFibGVkJywge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG5cdFx0XHRnZXQ6ICgpID0+IGVuYWJsZU92ZXJyaWRlID09PSBudWxsID8gY3JlYXRlRGVidWcuZW5hYmxlZChuYW1lc3BhY2UpIDogZW5hYmxlT3ZlcnJpZGUsXG5cdFx0XHRzZXQ6IHYgPT4ge1xuXHRcdFx0XHRlbmFibGVPdmVycmlkZSA9IHY7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBFbnYtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gbG9naWMgZm9yIGRlYnVnIGluc3RhbmNlc1xuXHRcdGlmICh0eXBlb2YgY3JlYXRlRGVidWcuaW5pdCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0Y3JlYXRlRGVidWcuaW5pdChkZWJ1Zyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRlYnVnO1xuXHR9XG5cblx0ZnVuY3Rpb24gZXh0ZW5kKG5hbWVzcGFjZSwgZGVsaW1pdGVyKSB7XG5cdFx0Y29uc3QgbmV3RGVidWcgPSBjcmVhdGVEZWJ1Zyh0aGlzLm5hbWVzcGFjZSArICh0eXBlb2YgZGVsaW1pdGVyID09PSAndW5kZWZpbmVkJyA/ICc6JyA6IGRlbGltaXRlcikgKyBuYW1lc3BhY2UpO1xuXHRcdG5ld0RlYnVnLmxvZyA9IHRoaXMubG9nO1xuXHRcdHJldHVybiBuZXdEZWJ1Zztcblx0fVxuXG5cdC8qKlxuXHQqIEVuYWJsZXMgYSBkZWJ1ZyBtb2RlIGJ5IG5hbWVzcGFjZXMuIFRoaXMgY2FuIGluY2x1ZGUgbW9kZXNcblx0KiBzZXBhcmF0ZWQgYnkgYSBjb2xvbiBhbmQgd2lsZGNhcmRzLlxuXHQqXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBlbmFibGUobmFtZXNwYWNlcykge1xuXHRcdGNyZWF0ZURlYnVnLnNhdmUobmFtZXNwYWNlcyk7XG5cblx0XHRjcmVhdGVEZWJ1Zy5uYW1lcyA9IFtdO1xuXHRcdGNyZWF0ZURlYnVnLnNraXBzID0gW107XG5cblx0XHRsZXQgaTtcblx0XHRjb25zdCBzcGxpdCA9ICh0eXBlb2YgbmFtZXNwYWNlcyA9PT0gJ3N0cmluZycgPyBuYW1lc3BhY2VzIDogJycpLnNwbGl0KC9bXFxzLF0rLyk7XG5cdFx0Y29uc3QgbGVuID0gc3BsaXQubGVuZ3RoO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRpZiAoIXNwbGl0W2ldKSB7XG5cdFx0XHRcdC8vIGlnbm9yZSBlbXB0eSBzdHJpbmdzXG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRuYW1lc3BhY2VzID0gc3BsaXRbaV0ucmVwbGFjZSgvXFwqL2csICcuKj8nKTtcblxuXHRcdFx0aWYgKG5hbWVzcGFjZXNbMF0gPT09ICctJykge1xuXHRcdFx0XHRjcmVhdGVEZWJ1Zy5za2lwcy5wdXNoKG5ldyBSZWdFeHAoJ14nICsgbmFtZXNwYWNlcy5zdWJzdHIoMSkgKyAnJCcpKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNyZWF0ZURlYnVnLm5hbWVzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lc3BhY2VzICsgJyQnKSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCogRGlzYWJsZSBkZWJ1ZyBvdXRwdXQuXG5cdCpcblx0KiBAcmV0dXJuIHtTdHJpbmd9IG5hbWVzcGFjZXNcblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBkaXNhYmxlKCkge1xuXHRcdGNvbnN0IG5hbWVzcGFjZXMgPSBbXG5cdFx0XHQuLi5jcmVhdGVEZWJ1Zy5uYW1lcy5tYXAodG9OYW1lc3BhY2UpLFxuXHRcdFx0Li4uY3JlYXRlRGVidWcuc2tpcHMubWFwKHRvTmFtZXNwYWNlKS5tYXAobmFtZXNwYWNlID0+ICctJyArIG5hbWVzcGFjZSlcblx0XHRdLmpvaW4oJywnKTtcblx0XHRjcmVhdGVEZWJ1Zy5lbmFibGUoJycpO1xuXHRcdHJldHVybiBuYW1lc3BhY2VzO1xuXHR9XG5cblx0LyoqXG5cdCogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBtb2RlIG5hbWUgaXMgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuXHQqXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVcblx0KiBAcmV0dXJuIHtCb29sZWFufVxuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGVuYWJsZWQobmFtZSkge1xuXHRcdGlmIChuYW1lW25hbWUubGVuZ3RoIC0gMV0gPT09ICcqJykge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0bGV0IGk7XG5cdFx0bGV0IGxlbjtcblxuXHRcdGZvciAoaSA9IDAsIGxlbiA9IGNyZWF0ZURlYnVnLnNraXBzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRpZiAoY3JlYXRlRGVidWcuc2tpcHNbaV0udGVzdChuYW1lKSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Zm9yIChpID0gMCwgbGVuID0gY3JlYXRlRGVidWcubmFtZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdGlmIChjcmVhdGVEZWJ1Zy5uYW1lc1tpXS50ZXN0KG5hbWUpKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQqIENvbnZlcnQgcmVnZXhwIHRvIG5hbWVzcGFjZVxuXHQqXG5cdCogQHBhcmFtIHtSZWdFeHB9IHJlZ3hlcFxuXHQqIEByZXR1cm4ge1N0cmluZ30gbmFtZXNwYWNlXG5cdCogQGFwaSBwcml2YXRlXG5cdCovXG5cdGZ1bmN0aW9uIHRvTmFtZXNwYWNlKHJlZ2V4cCkge1xuXHRcdHJldHVybiByZWdleHAudG9TdHJpbmcoKVxuXHRcdFx0LnN1YnN0cmluZygyLCByZWdleHAudG9TdHJpbmcoKS5sZW5ndGggLSAyKVxuXHRcdFx0LnJlcGxhY2UoL1xcLlxcKlxcPyQvLCAnKicpO1xuXHR9XG5cblx0LyoqXG5cdCogQ29lcmNlIGB2YWxgLlxuXHQqXG5cdCogQHBhcmFtIHtNaXhlZH0gdmFsXG5cdCogQHJldHVybiB7TWl4ZWR9XG5cdCogQGFwaSBwcml2YXRlXG5cdCovXG5cdGZ1bmN0aW9uIGNvZXJjZSh2YWwpIHtcblx0XHRpZiAodmFsIGluc3RhbmNlb2YgRXJyb3IpIHtcblx0XHRcdHJldHVybiB2YWwuc3RhY2sgfHwgdmFsLm1lc3NhZ2U7XG5cdFx0fVxuXHRcdHJldHVybiB2YWw7XG5cdH1cblxuXHQvKipcblx0KiBYWFggRE8gTk9UIFVTRS4gVGhpcyBpcyBhIHRlbXBvcmFyeSBzdHViIGZ1bmN0aW9uLlxuXHQqIFhYWCBJdCBXSUxMIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS5cblx0Ki9cblx0ZnVuY3Rpb24gZGVzdHJveSgpIHtcblx0XHRjb25zb2xlLndhcm4oJ0luc3RhbmNlIG1ldGhvZCBgZGVidWcuZGVzdHJveSgpYCBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgYGRlYnVnYC4nKTtcblx0fVxuXG5cdGNyZWF0ZURlYnVnLmVuYWJsZShjcmVhdGVEZWJ1Zy5sb2FkKCkpO1xuXG5cdHJldHVybiBjcmVhdGVEZWJ1Zztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzZXR1cDtcbiIsIi8qIGVzbGludC1lbnYgYnJvd3NlciAqL1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIHdlYiBicm93c2VyIGltcGxlbWVudGF0aW9uIG9mIGBkZWJ1ZygpYC5cbiAqL1xuXG5leHBvcnRzLmZvcm1hdEFyZ3MgPSBmb3JtYXRBcmdzO1xuZXhwb3J0cy5zYXZlID0gc2F2ZTtcbmV4cG9ydHMubG9hZCA9IGxvYWQ7XG5leHBvcnRzLnVzZUNvbG9ycyA9IHVzZUNvbG9ycztcbmV4cG9ydHMuc3RvcmFnZSA9IGxvY2Fsc3RvcmFnZSgpO1xuZXhwb3J0cy5kZXN0cm95ID0gKCgpID0+IHtcblx0bGV0IHdhcm5lZCA9IGZhbHNlO1xuXG5cdHJldHVybiAoKSA9PiB7XG5cdFx0aWYgKCF3YXJuZWQpIHtcblx0XHRcdHdhcm5lZCA9IHRydWU7XG5cdFx0XHRjb25zb2xlLndhcm4oJ0luc3RhbmNlIG1ldGhvZCBgZGVidWcuZGVzdHJveSgpYCBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgYGRlYnVnYC4nKTtcblx0XHR9XG5cdH07XG59KSgpO1xuXG4vKipcbiAqIENvbG9ycy5cbiAqL1xuXG5leHBvcnRzLmNvbG9ycyA9IFtcblx0JyMwMDAwQ0MnLFxuXHQnIzAwMDBGRicsXG5cdCcjMDAzM0NDJyxcblx0JyMwMDMzRkYnLFxuXHQnIzAwNjZDQycsXG5cdCcjMDA2NkZGJyxcblx0JyMwMDk5Q0MnLFxuXHQnIzAwOTlGRicsXG5cdCcjMDBDQzAwJyxcblx0JyMwMENDMzMnLFxuXHQnIzAwQ0M2NicsXG5cdCcjMDBDQzk5Jyxcblx0JyMwMENDQ0MnLFxuXHQnIzAwQ0NGRicsXG5cdCcjMzMwMENDJyxcblx0JyMzMzAwRkYnLFxuXHQnIzMzMzNDQycsXG5cdCcjMzMzM0ZGJyxcblx0JyMzMzY2Q0MnLFxuXHQnIzMzNjZGRicsXG5cdCcjMzM5OUNDJyxcblx0JyMzMzk5RkYnLFxuXHQnIzMzQ0MwMCcsXG5cdCcjMzNDQzMzJyxcblx0JyMzM0NDNjYnLFxuXHQnIzMzQ0M5OScsXG5cdCcjMzNDQ0NDJyxcblx0JyMzM0NDRkYnLFxuXHQnIzY2MDBDQycsXG5cdCcjNjYwMEZGJyxcblx0JyM2NjMzQ0MnLFxuXHQnIzY2MzNGRicsXG5cdCcjNjZDQzAwJyxcblx0JyM2NkNDMzMnLFxuXHQnIzk5MDBDQycsXG5cdCcjOTkwMEZGJyxcblx0JyM5OTMzQ0MnLFxuXHQnIzk5MzNGRicsXG5cdCcjOTlDQzAwJyxcblx0JyM5OUNDMzMnLFxuXHQnI0NDMDAwMCcsXG5cdCcjQ0MwMDMzJyxcblx0JyNDQzAwNjYnLFxuXHQnI0NDMDA5OScsXG5cdCcjQ0MwMENDJyxcblx0JyNDQzAwRkYnLFxuXHQnI0NDMzMwMCcsXG5cdCcjQ0MzMzMzJyxcblx0JyNDQzMzNjYnLFxuXHQnI0NDMzM5OScsXG5cdCcjQ0MzM0NDJyxcblx0JyNDQzMzRkYnLFxuXHQnI0NDNjYwMCcsXG5cdCcjQ0M2NjMzJyxcblx0JyNDQzk5MDAnLFxuXHQnI0NDOTkzMycsXG5cdCcjQ0NDQzAwJyxcblx0JyNDQ0NDMzMnLFxuXHQnI0ZGMDAwMCcsXG5cdCcjRkYwMDMzJyxcblx0JyNGRjAwNjYnLFxuXHQnI0ZGMDA5OScsXG5cdCcjRkYwMENDJyxcblx0JyNGRjAwRkYnLFxuXHQnI0ZGMzMwMCcsXG5cdCcjRkYzMzMzJyxcblx0JyNGRjMzNjYnLFxuXHQnI0ZGMzM5OScsXG5cdCcjRkYzM0NDJyxcblx0JyNGRjMzRkYnLFxuXHQnI0ZGNjYwMCcsXG5cdCcjRkY2NjMzJyxcblx0JyNGRjk5MDAnLFxuXHQnI0ZGOTkzMycsXG5cdCcjRkZDQzAwJyxcblx0JyNGRkNDMzMnXG5dO1xuXG4vKipcbiAqIEN1cnJlbnRseSBvbmx5IFdlYktpdC1iYXNlZCBXZWIgSW5zcGVjdG9ycywgRmlyZWZveCA+PSB2MzEsXG4gKiBhbmQgdGhlIEZpcmVidWcgZXh0ZW5zaW9uIChhbnkgRmlyZWZveCB2ZXJzaW9uKSBhcmUga25vd25cbiAqIHRvIHN1cHBvcnQgXCIlY1wiIENTUyBjdXN0b21pemF0aW9ucy5cbiAqXG4gKiBUT0RPOiBhZGQgYSBgbG9jYWxTdG9yYWdlYCB2YXJpYWJsZSB0byBleHBsaWNpdGx5IGVuYWJsZS9kaXNhYmxlIGNvbG9yc1xuICovXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5mdW5jdGlvbiB1c2VDb2xvcnMoKSB7XG5cdC8vIE5COiBJbiBhbiBFbGVjdHJvbiBwcmVsb2FkIHNjcmlwdCwgZG9jdW1lbnQgd2lsbCBiZSBkZWZpbmVkIGJ1dCBub3QgZnVsbHlcblx0Ly8gaW5pdGlhbGl6ZWQuIFNpbmNlIHdlIGtub3cgd2UncmUgaW4gQ2hyb21lLCB3ZSdsbCBqdXN0IGRldGVjdCB0aGlzIGNhc2Vcblx0Ly8gZXhwbGljaXRseVxuXHRpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LnByb2Nlc3MgJiYgKHdpbmRvdy5wcm9jZXNzLnR5cGUgPT09ICdyZW5kZXJlcicgfHwgd2luZG93LnByb2Nlc3MuX19ud2pzKSkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0Ly8gSW50ZXJuZXQgRXhwbG9yZXIgYW5kIEVkZ2UgZG8gbm90IHN1cHBvcnQgY29sb3JzLlxuXHRpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goLyhlZGdlfHRyaWRlbnQpXFwvKFxcZCspLykpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvLyBJcyB3ZWJraXQ/IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE2NDU5NjA2LzM3Njc3M1xuXHQvLyBkb2N1bWVudCBpcyB1bmRlZmluZWQgaW4gcmVhY3QtbmF0aXZlOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QtbmF0aXZlL3B1bGwvMTYzMlxuXHRyZXR1cm4gKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuV2Via2l0QXBwZWFyYW5jZSkgfHxcblx0XHQvLyBJcyBmaXJlYnVnPyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zOTgxMjAvMzc2NzczXG5cdFx0KHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5jb25zb2xlICYmICh3aW5kb3cuY29uc29sZS5maXJlYnVnIHx8ICh3aW5kb3cuY29uc29sZS5leGNlcHRpb24gJiYgd2luZG93LmNvbnNvbGUudGFibGUpKSkgfHxcblx0XHQvLyBJcyBmaXJlZm94ID49IHYzMT9cblx0XHQvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1Rvb2xzL1dlYl9Db25zb2xlI1N0eWxpbmdfbWVzc2FnZXNcblx0XHQodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2ZpcmVmb3hcXC8oXFxkKykvKSAmJiBwYXJzZUludChSZWdFeHAuJDEsIDEwKSA+PSAzMSkgfHxcblx0XHQvLyBEb3VibGUgY2hlY2sgd2Via2l0IGluIHVzZXJBZ2VudCBqdXN0IGluIGNhc2Ugd2UgYXJlIGluIGEgd29ya2VyXG5cdFx0KHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9hcHBsZXdlYmtpdFxcLyhcXGQrKS8pKTtcbn1cblxuLyoqXG4gKiBDb2xvcml6ZSBsb2cgYXJndW1lbnRzIGlmIGVuYWJsZWQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXRBcmdzKGFyZ3MpIHtcblx0YXJnc1swXSA9ICh0aGlzLnVzZUNvbG9ycyA/ICclYycgOiAnJykgK1xuXHRcdHRoaXMubmFtZXNwYWNlICtcblx0XHQodGhpcy51c2VDb2xvcnMgPyAnICVjJyA6ICcgJykgK1xuXHRcdGFyZ3NbMF0gK1xuXHRcdCh0aGlzLnVzZUNvbG9ycyA/ICclYyAnIDogJyAnKSArXG5cdFx0JysnICsgbW9kdWxlLmV4cG9ydHMuaHVtYW5pemUodGhpcy5kaWZmKTtcblxuXHRpZiAoIXRoaXMudXNlQ29sb3JzKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgYyA9ICdjb2xvcjogJyArIHRoaXMuY29sb3I7XG5cdGFyZ3Muc3BsaWNlKDEsIDAsIGMsICdjb2xvcjogaW5oZXJpdCcpO1xuXG5cdC8vIFRoZSBmaW5hbCBcIiVjXCIgaXMgc29tZXdoYXQgdHJpY2t5LCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG90aGVyXG5cdC8vIGFyZ3VtZW50cyBwYXNzZWQgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGUgJWMsIHNvIHdlIG5lZWQgdG9cblx0Ly8gZmlndXJlIG91dCB0aGUgY29ycmVjdCBpbmRleCB0byBpbnNlcnQgdGhlIENTUyBpbnRvXG5cdGxldCBpbmRleCA9IDA7XG5cdGxldCBsYXN0QyA9IDA7XG5cdGFyZ3NbMF0ucmVwbGFjZSgvJVthLXpBLVolXS9nLCBtYXRjaCA9PiB7XG5cdFx0aWYgKG1hdGNoID09PSAnJSUnKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGluZGV4Kys7XG5cdFx0aWYgKG1hdGNoID09PSAnJWMnKSB7XG5cdFx0XHQvLyBXZSBvbmx5IGFyZSBpbnRlcmVzdGVkIGluIHRoZSAqbGFzdCogJWNcblx0XHRcdC8vICh0aGUgdXNlciBtYXkgaGF2ZSBwcm92aWRlZCB0aGVpciBvd24pXG5cdFx0XHRsYXN0QyA9IGluZGV4O1xuXHRcdH1cblx0fSk7XG5cblx0YXJncy5zcGxpY2UobGFzdEMsIDAsIGMpO1xufVxuXG4vKipcbiAqIEludm9rZXMgYGNvbnNvbGUuZGVidWcoKWAgd2hlbiBhdmFpbGFibGUuXG4gKiBOby1vcCB3aGVuIGBjb25zb2xlLmRlYnVnYCBpcyBub3QgYSBcImZ1bmN0aW9uXCIuXG4gKiBJZiBgY29uc29sZS5kZWJ1Z2AgaXMgbm90IGF2YWlsYWJsZSwgZmFsbHMgYmFja1xuICogdG8gYGNvbnNvbGUubG9nYC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5leHBvcnRzLmxvZyA9IGNvbnNvbGUuZGVidWcgfHwgY29uc29sZS5sb2cgfHwgKCgpID0+IHt9KTtcblxuLyoqXG4gKiBTYXZlIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNhdmUobmFtZXNwYWNlcykge1xuXHR0cnkge1xuXHRcdGlmIChuYW1lc3BhY2VzKSB7XG5cdFx0XHRleHBvcnRzLnN0b3JhZ2Uuc2V0SXRlbSgnZGVidWcnLCBuYW1lc3BhY2VzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZXhwb3J0cy5zdG9yYWdlLnJlbW92ZUl0ZW0oJ2RlYnVnJyk7XG5cdFx0fVxuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdC8vIFN3YWxsb3dcblx0XHQvLyBYWFggKEBRaXgtKSBzaG91bGQgd2UgYmUgbG9nZ2luZyB0aGVzZT9cblx0fVxufVxuXG4vKipcbiAqIExvYWQgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgcHJldmlvdXNseSBwZXJzaXN0ZWQgZGVidWcgbW9kZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBsb2FkKCkge1xuXHRsZXQgcjtcblx0dHJ5IHtcblx0XHRyID0gZXhwb3J0cy5zdG9yYWdlLmdldEl0ZW0oJ2RlYnVnJyk7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0Ly8gU3dhbGxvd1xuXHRcdC8vIFhYWCAoQFFpeC0pIHNob3VsZCB3ZSBiZSBsb2dnaW5nIHRoZXNlP1xuXHR9XG5cblx0Ly8gSWYgZGVidWcgaXNuJ3Qgc2V0IGluIExTLCBhbmQgd2UncmUgaW4gRWxlY3Ryb24sIHRyeSB0byBsb2FkICRERUJVR1xuXHRpZiAoIXIgJiYgdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmICdlbnYnIGluIHByb2Nlc3MpIHtcblx0XHRyID0gcHJvY2Vzcy5lbnYuREVCVUc7XG5cdH1cblxuXHRyZXR1cm4gcjtcbn1cblxuLyoqXG4gKiBMb2NhbHN0b3JhZ2UgYXR0ZW1wdHMgdG8gcmV0dXJuIHRoZSBsb2NhbHN0b3JhZ2UuXG4gKlxuICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBzYWZhcmkgdGhyb3dzXG4gKiB3aGVuIGEgdXNlciBkaXNhYmxlcyBjb29raWVzL2xvY2Fsc3RvcmFnZVxuICogYW5kIHlvdSBhdHRlbXB0IHRvIGFjY2VzcyBpdC5cbiAqXG4gKiBAcmV0dXJuIHtMb2NhbFN0b3JhZ2V9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2NhbHN0b3JhZ2UoKSB7XG5cdHRyeSB7XG5cdFx0Ly8gVFZNTEtpdCAoQXBwbGUgVFYgSlMgUnVudGltZSkgZG9lcyBub3QgaGF2ZSBhIHdpbmRvdyBvYmplY3QsIGp1c3QgbG9jYWxTdG9yYWdlIGluIHRoZSBnbG9iYWwgY29udGV4dFxuXHRcdC8vIFRoZSBCcm93c2VyIGFsc28gaGFzIGxvY2FsU3RvcmFnZSBpbiB0aGUgZ2xvYmFsIGNvbnRleHQuXG5cdFx0cmV0dXJuIGxvY2FsU3RvcmFnZTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHQvLyBTd2FsbG93XG5cdFx0Ly8gWFhYIChAUWl4LSkgc2hvdWxkIHdlIGJlIGxvZ2dpbmcgdGhlc2U/XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2NvbW1vbicpKGV4cG9ydHMpO1xuXG5jb25zdCB7Zm9ybWF0dGVyc30gPSBtb2R1bGUuZXhwb3J0cztcblxuLyoqXG4gKiBNYXAgJWogdG8gYEpTT04uc3RyaW5naWZ5KClgLCBzaW5jZSBubyBXZWIgSW5zcGVjdG9ycyBkbyB0aGF0IGJ5IGRlZmF1bHQuXG4gKi9cblxuZm9ybWF0dGVycy5qID0gZnVuY3Rpb24gKHYpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkodik7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0cmV0dXJuICdbVW5leHBlY3RlZEpTT05QYXJzZUVycm9yXTogJyArIGVycm9yLm1lc3NhZ2U7XG5cdH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gKGZsYWcsIGFyZ3YgPSBwcm9jZXNzLmFyZ3YpID0+IHtcblx0Y29uc3QgcHJlZml4ID0gZmxhZy5zdGFydHNXaXRoKCctJykgPyAnJyA6IChmbGFnLmxlbmd0aCA9PT0gMSA/ICctJyA6ICctLScpO1xuXHRjb25zdCBwb3NpdGlvbiA9IGFyZ3YuaW5kZXhPZihwcmVmaXggKyBmbGFnKTtcblx0Y29uc3QgdGVybWluYXRvclBvc2l0aW9uID0gYXJndi5pbmRleE9mKCctLScpO1xuXHRyZXR1cm4gcG9zaXRpb24gIT09IC0xICYmICh0ZXJtaW5hdG9yUG9zaXRpb24gPT09IC0xIHx8IHBvc2l0aW9uIDwgdGVybWluYXRvclBvc2l0aW9uKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5jb25zdCBvcyA9IHJlcXVpcmUoJ29zJyk7XG5jb25zdCB0dHkgPSByZXF1aXJlKCd0dHknKTtcbmNvbnN0IGhhc0ZsYWcgPSByZXF1aXJlKCdoYXMtZmxhZycpO1xuXG5jb25zdCB7ZW52fSA9IHByb2Nlc3M7XG5cbmxldCBmb3JjZUNvbG9yO1xuaWYgKGhhc0ZsYWcoJ25vLWNvbG9yJykgfHxcblx0aGFzRmxhZygnbm8tY29sb3JzJykgfHxcblx0aGFzRmxhZygnY29sb3I9ZmFsc2UnKSB8fFxuXHRoYXNGbGFnKCdjb2xvcj1uZXZlcicpKSB7XG5cdGZvcmNlQ29sb3IgPSAwO1xufSBlbHNlIGlmIChoYXNGbGFnKCdjb2xvcicpIHx8XG5cdGhhc0ZsYWcoJ2NvbG9ycycpIHx8XG5cdGhhc0ZsYWcoJ2NvbG9yPXRydWUnKSB8fFxuXHRoYXNGbGFnKCdjb2xvcj1hbHdheXMnKSkge1xuXHRmb3JjZUNvbG9yID0gMTtcbn1cblxuaWYgKCdGT1JDRV9DT0xPUicgaW4gZW52KSB7XG5cdGlmIChlbnYuRk9SQ0VfQ09MT1IgPT09ICd0cnVlJykge1xuXHRcdGZvcmNlQ29sb3IgPSAxO1xuXHR9IGVsc2UgaWYgKGVudi5GT1JDRV9DT0xPUiA9PT0gJ2ZhbHNlJykge1xuXHRcdGZvcmNlQ29sb3IgPSAwO1xuXHR9IGVsc2Uge1xuXHRcdGZvcmNlQ29sb3IgPSBlbnYuRk9SQ0VfQ09MT1IubGVuZ3RoID09PSAwID8gMSA6IE1hdGgubWluKHBhcnNlSW50KGVudi5GT1JDRV9DT0xPUiwgMTApLCAzKTtcblx0fVxufVxuXG5mdW5jdGlvbiB0cmFuc2xhdGVMZXZlbChsZXZlbCkge1xuXHRpZiAobGV2ZWwgPT09IDApIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGxldmVsLFxuXHRcdGhhc0Jhc2ljOiB0cnVlLFxuXHRcdGhhczI1NjogbGV2ZWwgPj0gMixcblx0XHRoYXMxNm06IGxldmVsID49IDNcblx0fTtcbn1cblxuZnVuY3Rpb24gc3VwcG9ydHNDb2xvcihoYXZlU3RyZWFtLCBzdHJlYW1Jc1RUWSkge1xuXHRpZiAoZm9yY2VDb2xvciA9PT0gMCkge1xuXHRcdHJldHVybiAwO1xuXHR9XG5cblx0aWYgKGhhc0ZsYWcoJ2NvbG9yPTE2bScpIHx8XG5cdFx0aGFzRmxhZygnY29sb3I9ZnVsbCcpIHx8XG5cdFx0aGFzRmxhZygnY29sb3I9dHJ1ZWNvbG9yJykpIHtcblx0XHRyZXR1cm4gMztcblx0fVxuXG5cdGlmIChoYXNGbGFnKCdjb2xvcj0yNTYnKSkge1xuXHRcdHJldHVybiAyO1xuXHR9XG5cblx0aWYgKGhhdmVTdHJlYW0gJiYgIXN0cmVhbUlzVFRZICYmIGZvcmNlQ29sb3IgPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiAwO1xuXHR9XG5cblx0Y29uc3QgbWluID0gZm9yY2VDb2xvciB8fCAwO1xuXG5cdGlmIChlbnYuVEVSTSA9PT0gJ2R1bWInKSB7XG5cdFx0cmV0dXJuIG1pbjtcblx0fVxuXG5cdGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG5cdFx0Ly8gV2luZG93cyAxMCBidWlsZCAxMDU4NiBpcyB0aGUgZmlyc3QgV2luZG93cyByZWxlYXNlIHRoYXQgc3VwcG9ydHMgMjU2IGNvbG9ycy5cblx0XHQvLyBXaW5kb3dzIDEwIGJ1aWxkIDE0OTMxIGlzIHRoZSBmaXJzdCByZWxlYXNlIHRoYXQgc3VwcG9ydHMgMTZtL1RydWVDb2xvci5cblx0XHRjb25zdCBvc1JlbGVhc2UgPSBvcy5yZWxlYXNlKCkuc3BsaXQoJy4nKTtcblx0XHRpZiAoXG5cdFx0XHROdW1iZXIob3NSZWxlYXNlWzBdKSA+PSAxMCAmJlxuXHRcdFx0TnVtYmVyKG9zUmVsZWFzZVsyXSkgPj0gMTA1ODZcblx0XHQpIHtcblx0XHRcdHJldHVybiBOdW1iZXIob3NSZWxlYXNlWzJdKSA+PSAxNDkzMSA/IDMgOiAyO1xuXHRcdH1cblxuXHRcdHJldHVybiAxO1xuXHR9XG5cblx0aWYgKCdDSScgaW4gZW52KSB7XG5cdFx0aWYgKFsnVFJBVklTJywgJ0NJUkNMRUNJJywgJ0FQUFZFWU9SJywgJ0dJVExBQl9DSScsICdHSVRIVUJfQUNUSU9OUycsICdCVUlMREtJVEUnXS5zb21lKHNpZ24gPT4gc2lnbiBpbiBlbnYpIHx8IGVudi5DSV9OQU1FID09PSAnY29kZXNoaXAnKSB7XG5cdFx0XHRyZXR1cm4gMTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbWluO1xuXHR9XG5cblx0aWYgKCdURUFNQ0lUWV9WRVJTSU9OJyBpbiBlbnYpIHtcblx0XHRyZXR1cm4gL14oOVxcLigwKlsxLTldXFxkKilcXC58XFxkezIsfVxcLikvLnRlc3QoZW52LlRFQU1DSVRZX1ZFUlNJT04pID8gMSA6IDA7XG5cdH1cblxuXHRpZiAoZW52LkNPTE9SVEVSTSA9PT0gJ3RydWVjb2xvcicpIHtcblx0XHRyZXR1cm4gMztcblx0fVxuXG5cdGlmICgnVEVSTV9QUk9HUkFNJyBpbiBlbnYpIHtcblx0XHRjb25zdCB2ZXJzaW9uID0gcGFyc2VJbnQoKGVudi5URVJNX1BST0dSQU1fVkVSU0lPTiB8fCAnJykuc3BsaXQoJy4nKVswXSwgMTApO1xuXG5cdFx0c3dpdGNoIChlbnYuVEVSTV9QUk9HUkFNKSB7XG5cdFx0XHRjYXNlICdpVGVybS5hcHAnOlxuXHRcdFx0XHRyZXR1cm4gdmVyc2lvbiA+PSAzID8gMyA6IDI7XG5cdFx0XHRjYXNlICdBcHBsZV9UZXJtaW5hbCc6XG5cdFx0XHRcdHJldHVybiAyO1xuXHRcdFx0Ly8gTm8gZGVmYXVsdFxuXHRcdH1cblx0fVxuXG5cdGlmICgvLTI1Nihjb2xvcik/JC9pLnRlc3QoZW52LlRFUk0pKSB7XG5cdFx0cmV0dXJuIDI7XG5cdH1cblxuXHRpZiAoL15zY3JlZW58Xnh0ZXJtfF52dDEwMHxednQyMjB8XnJ4dnR8Y29sb3J8YW5zaXxjeWd3aW58bGludXgvaS50ZXN0KGVudi5URVJNKSkge1xuXHRcdHJldHVybiAxO1xuXHR9XG5cblx0aWYgKCdDT0xPUlRFUk0nIGluIGVudikge1xuXHRcdHJldHVybiAxO1xuXHR9XG5cblx0cmV0dXJuIG1pbjtcbn1cblxuZnVuY3Rpb24gZ2V0U3VwcG9ydExldmVsKHN0cmVhbSkge1xuXHRjb25zdCBsZXZlbCA9IHN1cHBvcnRzQ29sb3Ioc3RyZWFtLCBzdHJlYW0gJiYgc3RyZWFtLmlzVFRZKTtcblx0cmV0dXJuIHRyYW5zbGF0ZUxldmVsKGxldmVsKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdHN1cHBvcnRzQ29sb3I6IGdldFN1cHBvcnRMZXZlbCxcblx0c3Rkb3V0OiB0cmFuc2xhdGVMZXZlbChzdXBwb3J0c0NvbG9yKHRydWUsIHR0eS5pc2F0dHkoMSkpKSxcblx0c3RkZXJyOiB0cmFuc2xhdGVMZXZlbChzdXBwb3J0c0NvbG9yKHRydWUsIHR0eS5pc2F0dHkoMikpKVxufTtcbiIsIi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG5jb25zdCB0dHkgPSByZXF1aXJlKCd0dHknKTtcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgTm9kZS5qcyBpbXBsZW1lbnRhdGlvbiBvZiBgZGVidWcoKWAuXG4gKi9cblxuZXhwb3J0cy5pbml0ID0gaW5pdDtcbmV4cG9ydHMubG9nID0gbG9nO1xuZXhwb3J0cy5mb3JtYXRBcmdzID0gZm9ybWF0QXJncztcbmV4cG9ydHMuc2F2ZSA9IHNhdmU7XG5leHBvcnRzLmxvYWQgPSBsb2FkO1xuZXhwb3J0cy51c2VDb2xvcnMgPSB1c2VDb2xvcnM7XG5leHBvcnRzLmRlc3Ryb3kgPSB1dGlsLmRlcHJlY2F0ZShcblx0KCkgPT4ge30sXG5cdCdJbnN0YW5jZSBtZXRob2QgYGRlYnVnLmRlc3Ryb3koKWAgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIGRvZXMgYW55dGhpbmcuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIGBkZWJ1Z2AuJ1xuKTtcblxuLyoqXG4gKiBDb2xvcnMuXG4gKi9cblxuZXhwb3J0cy5jb2xvcnMgPSBbNiwgMiwgMywgNCwgNSwgMV07XG5cbnRyeSB7XG5cdC8vIE9wdGlvbmFsIGRlcGVuZGVuY3kgKGFzIGluLCBkb2Vzbid0IG5lZWQgdG8gYmUgaW5zdGFsbGVkLCBOT1QgbGlrZSBvcHRpb25hbERlcGVuZGVuY2llcyBpbiBwYWNrYWdlLmpzb24pXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXNcblx0Y29uc3Qgc3VwcG9ydHNDb2xvciA9IHJlcXVpcmUoJ3N1cHBvcnRzLWNvbG9yJyk7XG5cblx0aWYgKHN1cHBvcnRzQ29sb3IgJiYgKHN1cHBvcnRzQ29sb3Iuc3RkZXJyIHx8IHN1cHBvcnRzQ29sb3IpLmxldmVsID49IDIpIHtcblx0XHRleHBvcnRzLmNvbG9ycyA9IFtcblx0XHRcdDIwLFxuXHRcdFx0MjEsXG5cdFx0XHQyNixcblx0XHRcdDI3LFxuXHRcdFx0MzIsXG5cdFx0XHQzMyxcblx0XHRcdDM4LFxuXHRcdFx0MzksXG5cdFx0XHQ0MCxcblx0XHRcdDQxLFxuXHRcdFx0NDIsXG5cdFx0XHQ0Myxcblx0XHRcdDQ0LFxuXHRcdFx0NDUsXG5cdFx0XHQ1Nixcblx0XHRcdDU3LFxuXHRcdFx0NjIsXG5cdFx0XHQ2Myxcblx0XHRcdDY4LFxuXHRcdFx0NjksXG5cdFx0XHQ3NCxcblx0XHRcdDc1LFxuXHRcdFx0NzYsXG5cdFx0XHQ3Nyxcblx0XHRcdDc4LFxuXHRcdFx0NzksXG5cdFx0XHQ4MCxcblx0XHRcdDgxLFxuXHRcdFx0OTIsXG5cdFx0XHQ5Myxcblx0XHRcdDk4LFxuXHRcdFx0OTksXG5cdFx0XHQxMTIsXG5cdFx0XHQxMTMsXG5cdFx0XHQxMjgsXG5cdFx0XHQxMjksXG5cdFx0XHQxMzQsXG5cdFx0XHQxMzUsXG5cdFx0XHQxNDgsXG5cdFx0XHQxNDksXG5cdFx0XHQxNjAsXG5cdFx0XHQxNjEsXG5cdFx0XHQxNjIsXG5cdFx0XHQxNjMsXG5cdFx0XHQxNjQsXG5cdFx0XHQxNjUsXG5cdFx0XHQxNjYsXG5cdFx0XHQxNjcsXG5cdFx0XHQxNjgsXG5cdFx0XHQxNjksXG5cdFx0XHQxNzAsXG5cdFx0XHQxNzEsXG5cdFx0XHQxNzIsXG5cdFx0XHQxNzMsXG5cdFx0XHQxNzgsXG5cdFx0XHQxNzksXG5cdFx0XHQxODQsXG5cdFx0XHQxODUsXG5cdFx0XHQxOTYsXG5cdFx0XHQxOTcsXG5cdFx0XHQxOTgsXG5cdFx0XHQxOTksXG5cdFx0XHQyMDAsXG5cdFx0XHQyMDEsXG5cdFx0XHQyMDIsXG5cdFx0XHQyMDMsXG5cdFx0XHQyMDQsXG5cdFx0XHQyMDUsXG5cdFx0XHQyMDYsXG5cdFx0XHQyMDcsXG5cdFx0XHQyMDgsXG5cdFx0XHQyMDksXG5cdFx0XHQyMTQsXG5cdFx0XHQyMTUsXG5cdFx0XHQyMjAsXG5cdFx0XHQyMjFcblx0XHRdO1xuXHR9XG59IGNhdGNoIChlcnJvcikge1xuXHQvLyBTd2FsbG93IC0gd2Ugb25seSBjYXJlIGlmIGBzdXBwb3J0cy1jb2xvcmAgaXMgYXZhaWxhYmxlOyBpdCBkb2Vzbid0IGhhdmUgdG8gYmUuXG59XG5cbi8qKlxuICogQnVpbGQgdXAgdGhlIGRlZmF1bHQgYGluc3BlY3RPcHRzYCBvYmplY3QgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICpcbiAqICAgJCBERUJVR19DT0xPUlM9bm8gREVCVUdfREVQVEg9MTAgREVCVUdfU0hPV19ISURERU49ZW5hYmxlZCBub2RlIHNjcmlwdC5qc1xuICovXG5cbmV4cG9ydHMuaW5zcGVjdE9wdHMgPSBPYmplY3Qua2V5cyhwcm9jZXNzLmVudikuZmlsdGVyKGtleSA9PiB7XG5cdHJldHVybiAvXmRlYnVnXy9pLnRlc3Qoa2V5KTtcbn0pLnJlZHVjZSgob2JqLCBrZXkpID0+IHtcblx0Ly8gQ2FtZWwtY2FzZVxuXHRjb25zdCBwcm9wID0ga2V5XG5cdFx0LnN1YnN0cmluZyg2KVxuXHRcdC50b0xvd2VyQ2FzZSgpXG5cdFx0LnJlcGxhY2UoL18oW2Etel0pL2csIChfLCBrKSA9PiB7XG5cdFx0XHRyZXR1cm4gay50b1VwcGVyQ2FzZSgpO1xuXHRcdH0pO1xuXG5cdC8vIENvZXJjZSBzdHJpbmcgdmFsdWUgaW50byBKUyB2YWx1ZVxuXHRsZXQgdmFsID0gcHJvY2Vzcy5lbnZba2V5XTtcblx0aWYgKC9eKHllc3xvbnx0cnVlfGVuYWJsZWQpJC9pLnRlc3QodmFsKSkge1xuXHRcdHZhbCA9IHRydWU7XG5cdH0gZWxzZSBpZiAoL14obm98b2ZmfGZhbHNlfGRpc2FibGVkKSQvaS50ZXN0KHZhbCkpIHtcblx0XHR2YWwgPSBmYWxzZTtcblx0fSBlbHNlIGlmICh2YWwgPT09ICdudWxsJykge1xuXHRcdHZhbCA9IG51bGw7XG5cdH0gZWxzZSB7XG5cdFx0dmFsID0gTnVtYmVyKHZhbCk7XG5cdH1cblxuXHRvYmpbcHJvcF0gPSB2YWw7XG5cdHJldHVybiBvYmo7XG59LCB7fSk7XG5cbi8qKlxuICogSXMgc3Rkb3V0IGEgVFRZPyBDb2xvcmVkIG91dHB1dCBpcyBlbmFibGVkIHdoZW4gYHRydWVgLlxuICovXG5cbmZ1bmN0aW9uIHVzZUNvbG9ycygpIHtcblx0cmV0dXJuICdjb2xvcnMnIGluIGV4cG9ydHMuaW5zcGVjdE9wdHMgP1xuXHRcdEJvb2xlYW4oZXhwb3J0cy5pbnNwZWN0T3B0cy5jb2xvcnMpIDpcblx0XHR0dHkuaXNhdHR5KHByb2Nlc3Muc3RkZXJyLmZkKTtcbn1cblxuLyoqXG4gKiBBZGRzIEFOU0kgY29sb3IgZXNjYXBlIGNvZGVzIGlmIGVuYWJsZWQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXRBcmdzKGFyZ3MpIHtcblx0Y29uc3Qge25hbWVzcGFjZTogbmFtZSwgdXNlQ29sb3JzfSA9IHRoaXM7XG5cblx0aWYgKHVzZUNvbG9ycykge1xuXHRcdGNvbnN0IGMgPSB0aGlzLmNvbG9yO1xuXHRcdGNvbnN0IGNvbG9yQ29kZSA9ICdcXHUwMDFCWzMnICsgKGMgPCA4ID8gYyA6ICc4OzU7JyArIGMpO1xuXHRcdGNvbnN0IHByZWZpeCA9IGAgICR7Y29sb3JDb2RlfTsxbSR7bmFtZX0gXFx1MDAxQlswbWA7XG5cblx0XHRhcmdzWzBdID0gcHJlZml4ICsgYXJnc1swXS5zcGxpdCgnXFxuJykuam9pbignXFxuJyArIHByZWZpeCk7XG5cdFx0YXJncy5wdXNoKGNvbG9yQ29kZSArICdtKycgKyBtb2R1bGUuZXhwb3J0cy5odW1hbml6ZSh0aGlzLmRpZmYpICsgJ1xcdTAwMUJbMG0nKTtcblx0fSBlbHNlIHtcblx0XHRhcmdzWzBdID0gZ2V0RGF0ZSgpICsgbmFtZSArICcgJyArIGFyZ3NbMF07XG5cdH1cbn1cblxuZnVuY3Rpb24gZ2V0RGF0ZSgpIHtcblx0aWYgKGV4cG9ydHMuaW5zcGVjdE9wdHMuaGlkZURhdGUpIHtcblx0XHRyZXR1cm4gJyc7XG5cdH1cblx0cmV0dXJuIG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSArICcgJztcbn1cblxuLyoqXG4gKiBJbnZva2VzIGB1dGlsLmZvcm1hdCgpYCB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzIGFuZCB3cml0ZXMgdG8gc3RkZXJyLlxuICovXG5cbmZ1bmN0aW9uIGxvZyguLi5hcmdzKSB7XG5cdHJldHVybiBwcm9jZXNzLnN0ZGVyci53cml0ZSh1dGlsLmZvcm1hdCguLi5hcmdzKSArICdcXG4nKTtcbn1cblxuLyoqXG4gKiBTYXZlIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNhdmUobmFtZXNwYWNlcykge1xuXHRpZiAobmFtZXNwYWNlcykge1xuXHRcdHByb2Nlc3MuZW52LkRFQlVHID0gbmFtZXNwYWNlcztcblx0fSBlbHNlIHtcblx0XHQvLyBJZiB5b3Ugc2V0IGEgcHJvY2Vzcy5lbnYgZmllbGQgdG8gbnVsbCBvciB1bmRlZmluZWQsIGl0IGdldHMgY2FzdCB0byB0aGVcblx0XHQvLyBzdHJpbmcgJ251bGwnIG9yICd1bmRlZmluZWQnLiBKdXN0IGRlbGV0ZSBpbnN0ZWFkLlxuXHRcdGRlbGV0ZSBwcm9jZXNzLmVudi5ERUJVRztcblx0fVxufVxuXG4vKipcbiAqIExvYWQgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgcHJldmlvdXNseSBwZXJzaXN0ZWQgZGVidWcgbW9kZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGxvYWQoKSB7XG5cdHJldHVybiBwcm9jZXNzLmVudi5ERUJVRztcbn1cblxuLyoqXG4gKiBJbml0IGxvZ2ljIGZvciBgZGVidWdgIGluc3RhbmNlcy5cbiAqXG4gKiBDcmVhdGUgYSBuZXcgYGluc3BlY3RPcHRzYCBvYmplY3QgaW4gY2FzZSBgdXNlQ29sb3JzYCBpcyBzZXRcbiAqIGRpZmZlcmVudGx5IGZvciBhIHBhcnRpY3VsYXIgYGRlYnVnYCBpbnN0YW5jZS5cbiAqL1xuXG5mdW5jdGlvbiBpbml0KGRlYnVnKSB7XG5cdGRlYnVnLmluc3BlY3RPcHRzID0ge307XG5cblx0Y29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGV4cG9ydHMuaW5zcGVjdE9wdHMpO1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcblx0XHRkZWJ1Zy5pbnNwZWN0T3B0c1trZXlzW2ldXSA9IGV4cG9ydHMuaW5zcGVjdE9wdHNba2V5c1tpXV07XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2NvbW1vbicpKGV4cG9ydHMpO1xuXG5jb25zdCB7Zm9ybWF0dGVyc30gPSBtb2R1bGUuZXhwb3J0cztcblxuLyoqXG4gKiBNYXAgJW8gdG8gYHV0aWwuaW5zcGVjdCgpYCwgYWxsIG9uIGEgc2luZ2xlIGxpbmUuXG4gKi9cblxuZm9ybWF0dGVycy5vID0gZnVuY3Rpb24gKHYpIHtcblx0dGhpcy5pbnNwZWN0T3B0cy5jb2xvcnMgPSB0aGlzLnVzZUNvbG9ycztcblx0cmV0dXJuIHV0aWwuaW5zcGVjdCh2LCB0aGlzLmluc3BlY3RPcHRzKVxuXHRcdC5zcGxpdCgnXFxuJylcblx0XHQubWFwKHN0ciA9PiBzdHIudHJpbSgpKVxuXHRcdC5qb2luKCcgJyk7XG59O1xuXG4vKipcbiAqIE1hcCAlTyB0byBgdXRpbC5pbnNwZWN0KClgLCBhbGxvd2luZyBtdWx0aXBsZSBsaW5lcyBpZiBuZWVkZWQuXG4gKi9cblxuZm9ybWF0dGVycy5PID0gZnVuY3Rpb24gKHYpIHtcblx0dGhpcy5pbnNwZWN0T3B0cy5jb2xvcnMgPSB0aGlzLnVzZUNvbG9ycztcblx0cmV0dXJuIHV0aWwuaW5zcGVjdCh2LCB0aGlzLmluc3BlY3RPcHRzKTtcbn07XG4iLCIvKipcbiAqIERldGVjdCBFbGVjdHJvbiByZW5kZXJlciAvIG53anMgcHJvY2Vzcywgd2hpY2ggaXMgbm9kZSwgYnV0IHdlIHNob3VsZFxuICogdHJlYXQgYXMgYSBicm93c2VyLlxuICovXG5cbmlmICh0eXBlb2YgcHJvY2VzcyA9PT0gJ3VuZGVmaW5lZCcgfHwgcHJvY2Vzcy50eXBlID09PSAncmVuZGVyZXInIHx8IHByb2Nlc3MuYnJvd3NlciA9PT0gdHJ1ZSB8fCBwcm9jZXNzLl9fbndqcykge1xuXHRtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vYnJvd3Nlci5qcycpO1xufSBlbHNlIHtcblx0bW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL25vZGUuanMnKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgZnNfMSA9IHJlcXVpcmUoXCJmc1wiKTtcbmNvbnN0IGRlYnVnXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImRlYnVnXCIpKTtcbmNvbnN0IGxvZyA9IGRlYnVnXzEuZGVmYXVsdCgnQGt3c2l0ZXMvZmlsZS1leGlzdHMnKTtcbmZ1bmN0aW9uIGNoZWNrKHBhdGgsIGlzRmlsZSwgaXNEaXJlY3RvcnkpIHtcbiAgICBsb2coYGNoZWNraW5nICVzYCwgcGF0aCk7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc3RhdCA9IGZzXzEuc3RhdFN5bmMocGF0aCk7XG4gICAgICAgIGlmIChzdGF0LmlzRmlsZSgpICYmIGlzRmlsZSkge1xuICAgICAgICAgICAgbG9nKGBbT0tdIHBhdGggcmVwcmVzZW50cyBhIGZpbGVgKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0LmlzRGlyZWN0b3J5KCkgJiYgaXNEaXJlY3RvcnkpIHtcbiAgICAgICAgICAgIGxvZyhgW09LXSBwYXRoIHJlcHJlc2VudHMgYSBkaXJlY3RvcnlgKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGxvZyhgW0ZBSUxdIHBhdGggcmVwcmVzZW50cyBzb21ldGhpbmcgb3RoZXIgdGhhbiBhIGZpbGUgb3IgZGlyZWN0b3J5YCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGUuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgICAgIGxvZyhgW0ZBSUxdIHBhdGggaXMgbm90IGFjY2Vzc2libGU6ICVvYCwgZSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgbG9nKGBbRkFUQUxdICVvYCwgZSk7XG4gICAgICAgIHRocm93IGU7XG4gICAgfVxufVxuLyoqXG4gKiBTeW5jaHJvbm91cyB2YWxpZGF0aW9uIG9mIGEgcGF0aCBleGlzdGluZyBlaXRoZXIgYXMgYSBmaWxlIG9yIGFzIGEgZGlyZWN0b3J5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIGNoZWNrXG4gKiBAcGFyYW0ge251bWJlcn0gdHlwZSBPbmUgb3IgYm90aCBvZiB0aGUgZXhwb3J0ZWQgbnVtZXJpYyBjb25zdGFudHNcbiAqL1xuZnVuY3Rpb24gZXhpc3RzKHBhdGgsIHR5cGUgPSBleHBvcnRzLlJFQURBQkxFKSB7XG4gICAgcmV0dXJuIGNoZWNrKHBhdGgsICh0eXBlICYgZXhwb3J0cy5GSUxFKSA+IDAsICh0eXBlICYgZXhwb3J0cy5GT0xERVIpID4gMCk7XG59XG5leHBvcnRzLmV4aXN0cyA9IGV4aXN0cztcbi8qKlxuICogQ29uc3RhbnQgcmVwcmVzZW50aW5nIGEgZmlsZVxuICovXG5leHBvcnRzLkZJTEUgPSAxO1xuLyoqXG4gKiBDb25zdGFudCByZXByZXNlbnRpbmcgYSBmb2xkZXJcbiAqL1xuZXhwb3J0cy5GT0xERVIgPSAyO1xuLyoqXG4gKiBDb25zdGFudCByZXByZXNlbnRpbmcgZWl0aGVyIGEgZmlsZSBvciBhIGZvbGRlclxuICovXG5leHBvcnRzLlJFQURBQkxFID0gZXhwb3J0cy5GSUxFICsgZXhwb3J0cy5GT0xERVI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbmZ1bmN0aW9uIF9fZXhwb3J0KG0pIHtcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmICghZXhwb3J0cy5oYXNPd25Qcm9wZXJ0eShwKSkgZXhwb3J0c1twXSA9IG1bcF07XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5fX2V4cG9ydChyZXF1aXJlKFwiLi9zcmNcIikpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmJ1ZmZlclRvU3RyaW5nID0gZXhwb3J0cy5wcmVmaXhlZEFycmF5ID0gZXhwb3J0cy5hc051bWJlciA9IGV4cG9ydHMuYXNTdHJpbmdBcnJheSA9IGV4cG9ydHMuYXNBcnJheSA9IGV4cG9ydHMub2JqZWN0VG9TdHJpbmcgPSBleHBvcnRzLnJlbW92ZSA9IGV4cG9ydHMuaW5jbHVkaW5nID0gZXhwb3J0cy5hcHBlbmQgPSBleHBvcnRzLmZvbGRlckV4aXN0cyA9IGV4cG9ydHMuZm9yRWFjaExpbmVXaXRoQ29udGVudCA9IGV4cG9ydHMudG9MaW5lc1dpdGhDb250ZW50ID0gZXhwb3J0cy5sYXN0ID0gZXhwb3J0cy5maXJzdCA9IGV4cG9ydHMuc3BsaXRPbiA9IGV4cG9ydHMuaXNVc2VyRnVuY3Rpb24gPSBleHBvcnRzLmFzRnVuY3Rpb24gPSBleHBvcnRzLk5PT1AgPSB2b2lkIDA7XG5jb25zdCBmaWxlX2V4aXN0c18xID0gcmVxdWlyZShcIkBrd3NpdGVzL2ZpbGUtZXhpc3RzXCIpO1xuY29uc3QgTk9PUCA9ICgpID0+IHtcbn07XG5leHBvcnRzLk5PT1AgPSBOT09QO1xuLyoqXG4gKiBSZXR1cm5zIGVpdGhlciB0aGUgc291cmNlIGFyZ3VtZW50IHdoZW4gaXQgaXMgYSBgRnVuY3Rpb25gLCBvciB0aGUgZGVmYXVsdFxuICogYE5PT1BgIGZ1bmN0aW9uIGNvbnN0YW50XG4gKi9cbmZ1bmN0aW9uIGFzRnVuY3Rpb24oc291cmNlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBzb3VyY2UgPT09ICdmdW5jdGlvbicgPyBzb3VyY2UgOiBleHBvcnRzLk5PT1A7XG59XG5leHBvcnRzLmFzRnVuY3Rpb24gPSBhc0Z1bmN0aW9uO1xuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHN1cHBsaWVkIGFyZ3VtZW50IGlzIGJvdGggYSBmdW5jdGlvbiwgYW5kIGlzIG5vdFxuICogdGhlIGBOT09QYCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gaXNVc2VyRnVuY3Rpb24oc291cmNlKSB7XG4gICAgcmV0dXJuICh0eXBlb2Ygc291cmNlID09PSAnZnVuY3Rpb24nICYmIHNvdXJjZSAhPT0gZXhwb3J0cy5OT09QKTtcbn1cbmV4cG9ydHMuaXNVc2VyRnVuY3Rpb24gPSBpc1VzZXJGdW5jdGlvbjtcbmZ1bmN0aW9uIHNwbGl0T24oaW5wdXQsIGNoYXIpIHtcbiAgICBjb25zdCBpbmRleCA9IGlucHV0LmluZGV4T2YoY2hhcik7XG4gICAgaWYgKGluZGV4IDw9IDApIHtcbiAgICAgICAgcmV0dXJuIFtpbnB1dCwgJyddO1xuICAgIH1cbiAgICByZXR1cm4gW1xuICAgICAgICBpbnB1dC5zdWJzdHIoMCwgaW5kZXgpLFxuICAgICAgICBpbnB1dC5zdWJzdHIoaW5kZXggKyAxKSxcbiAgICBdO1xufVxuZXhwb3J0cy5zcGxpdE9uID0gc3BsaXRPbjtcbmZ1bmN0aW9uIGZpcnN0KGlucHV0LCBvZmZzZXQgPSAwKSB7XG4gICAgcmV0dXJuIGlzQXJyYXlMaWtlKGlucHV0KSAmJiBpbnB1dC5sZW5ndGggPiBvZmZzZXQgPyBpbnB1dFtvZmZzZXRdIDogdW5kZWZpbmVkO1xufVxuZXhwb3J0cy5maXJzdCA9IGZpcnN0O1xuZnVuY3Rpb24gbGFzdChpbnB1dCwgb2Zmc2V0ID0gMCkge1xuICAgIGlmIChpc0FycmF5TGlrZShpbnB1dCkgJiYgaW5wdXQubGVuZ3RoID4gb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiBpbnB1dFtpbnB1dC5sZW5ndGggLSAxIC0gb2Zmc2V0XTtcbiAgICB9XG59XG5leHBvcnRzLmxhc3QgPSBsYXN0O1xuZnVuY3Rpb24gaXNBcnJheUxpa2UoaW5wdXQpIHtcbiAgICByZXR1cm4gISEoaW5wdXQgJiYgdHlwZW9mIGlucHV0Lmxlbmd0aCA9PT0gJ251bWJlcicpO1xufVxuZnVuY3Rpb24gdG9MaW5lc1dpdGhDb250ZW50KGlucHV0LCB0cmltbWVkID0gdHJ1ZSwgc2VwYXJhdG9yID0gJ1xcbicpIHtcbiAgICByZXR1cm4gaW5wdXQuc3BsaXQoc2VwYXJhdG9yKVxuICAgICAgICAucmVkdWNlKChvdXRwdXQsIGxpbmUpID0+IHtcbiAgICAgICAgY29uc3QgbGluZUNvbnRlbnQgPSB0cmltbWVkID8gbGluZS50cmltKCkgOiBsaW5lO1xuICAgICAgICBpZiAobGluZUNvbnRlbnQpIHtcbiAgICAgICAgICAgIG91dHB1dC5wdXNoKGxpbmVDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH0sIFtdKTtcbn1cbmV4cG9ydHMudG9MaW5lc1dpdGhDb250ZW50ID0gdG9MaW5lc1dpdGhDb250ZW50O1xuZnVuY3Rpb24gZm9yRWFjaExpbmVXaXRoQ29udGVudChpbnB1dCwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gdG9MaW5lc1dpdGhDb250ZW50KGlucHV0LCB0cnVlKS5tYXAobGluZSA9PiBjYWxsYmFjayhsaW5lKSk7XG59XG5leHBvcnRzLmZvckVhY2hMaW5lV2l0aENvbnRlbnQgPSBmb3JFYWNoTGluZVdpdGhDb250ZW50O1xuZnVuY3Rpb24gZm9sZGVyRXhpc3RzKHBhdGgpIHtcbiAgICByZXR1cm4gZmlsZV9leGlzdHNfMS5leGlzdHMocGF0aCwgZmlsZV9leGlzdHNfMS5GT0xERVIpO1xufVxuZXhwb3J0cy5mb2xkZXJFeGlzdHMgPSBmb2xkZXJFeGlzdHM7XG4vKipcbiAqIEFkZHMgYGl0ZW1gIGludG8gdGhlIGB0YXJnZXRgIGBBcnJheWAgb3IgYFNldGAgd2hlbiBpdCBpcyBub3QgYWxyZWFkeSBwcmVzZW50IGFuZCByZXR1cm5zIHRoZSBgaXRlbWAuXG4gKi9cbmZ1bmN0aW9uIGFwcGVuZCh0YXJnZXQsIGl0ZW0pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpKSB7XG4gICAgICAgIGlmICghdGFyZ2V0LmluY2x1ZGVzKGl0ZW0pKSB7XG4gICAgICAgICAgICB0YXJnZXQucHVzaChpdGVtKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGFyZ2V0LmFkZChpdGVtKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW07XG59XG5leHBvcnRzLmFwcGVuZCA9IGFwcGVuZDtcbi8qKlxuICogQWRkcyBgaXRlbWAgaW50byB0aGUgYHRhcmdldGAgYEFycmF5YCB3aGVuIGl0IGlzIG5vdCBhbHJlYWR5IHByZXNlbnQgYW5kIHJldHVybnMgdGhlIGB0YXJnZXRgLlxuICovXG5mdW5jdGlvbiBpbmNsdWRpbmcodGFyZ2V0LCBpdGVtKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSAmJiAhdGFyZ2V0LmluY2x1ZGVzKGl0ZW0pKSB7XG4gICAgICAgIHRhcmdldC5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuZXhwb3J0cy5pbmNsdWRpbmcgPSBpbmNsdWRpbmc7XG5mdW5jdGlvbiByZW1vdmUodGFyZ2V0LCBpdGVtKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSkge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRhcmdldC5pbmRleE9mKGl0ZW0pO1xuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgdGFyZ2V0LnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRhcmdldC5kZWxldGUoaXRlbSk7XG4gICAgfVxuICAgIHJldHVybiBpdGVtO1xufVxuZXhwb3J0cy5yZW1vdmUgPSByZW1vdmU7XG5leHBvcnRzLm9iamVjdFRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsLmJpbmQoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyk7XG5mdW5jdGlvbiBhc0FycmF5KHNvdXJjZSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHNvdXJjZSkgPyBzb3VyY2UgOiBbc291cmNlXTtcbn1cbmV4cG9ydHMuYXNBcnJheSA9IGFzQXJyYXk7XG5mdW5jdGlvbiBhc1N0cmluZ0FycmF5KHNvdXJjZSkge1xuICAgIHJldHVybiBhc0FycmF5KHNvdXJjZSkubWFwKFN0cmluZyk7XG59XG5leHBvcnRzLmFzU3RyaW5nQXJyYXkgPSBhc1N0cmluZ0FycmF5O1xuZnVuY3Rpb24gYXNOdW1iZXIoc291cmNlLCBvbk5hTiA9IDApIHtcbiAgICBpZiAoc291cmNlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG9uTmFOO1xuICAgIH1cbiAgICBjb25zdCBudW0gPSBwYXJzZUludChzb3VyY2UsIDEwKTtcbiAgICByZXR1cm4gaXNOYU4obnVtKSA/IG9uTmFOIDogbnVtO1xufVxuZXhwb3J0cy5hc051bWJlciA9IGFzTnVtYmVyO1xuZnVuY3Rpb24gcHJlZml4ZWRBcnJheShpbnB1dCwgcHJlZml4KSB7XG4gICAgY29uc3Qgb3V0cHV0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDAsIG1heCA9IGlucHV0Lmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7XG4gICAgICAgIG91dHB1dC5wdXNoKHByZWZpeCwgaW5wdXRbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xufVxuZXhwb3J0cy5wcmVmaXhlZEFycmF5ID0gcHJlZml4ZWRBcnJheTtcbmZ1bmN0aW9uIGJ1ZmZlclRvU3RyaW5nKGlucHV0KSB7XG4gICAgcmV0dXJuIChBcnJheS5pc0FycmF5KGlucHV0KSA/IEJ1ZmZlci5jb25jYXQoaW5wdXQpIDogaW5wdXQpLnRvU3RyaW5nKCd1dGYtOCcpO1xufVxuZXhwb3J0cy5idWZmZXJUb1N0cmluZyA9IGJ1ZmZlclRvU3RyaW5nO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZmlsdGVySGFzTGVuZ3RoID0gZXhwb3J0cy5maWx0ZXJGdW5jdGlvbiA9IGV4cG9ydHMuZmlsdGVyUGxhaW5PYmplY3QgPSBleHBvcnRzLmZpbHRlclN0cmluZ09yU3RyaW5nQXJyYXkgPSBleHBvcnRzLmZpbHRlclN0cmluZ0FycmF5ID0gZXhwb3J0cy5maWx0ZXJTdHJpbmcgPSBleHBvcnRzLmZpbHRlclByaW1pdGl2ZXMgPSBleHBvcnRzLmZpbHRlckFycmF5ID0gZXhwb3J0cy5maWx0ZXJUeXBlID0gdm9pZCAwO1xuY29uc3QgdXRpbF8xID0gcmVxdWlyZShcIi4vdXRpbFwiKTtcbmZ1bmN0aW9uIGZpbHRlclR5cGUoaW5wdXQsIGZpbHRlciwgZGVmKSB7XG4gICAgaWYgKGZpbHRlcihpbnB1dCkpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH1cbiAgICByZXR1cm4gKGFyZ3VtZW50cy5sZW5ndGggPiAyKSA/IGRlZiA6IHVuZGVmaW5lZDtcbn1cbmV4cG9ydHMuZmlsdGVyVHlwZSA9IGZpbHRlclR5cGU7XG5jb25zdCBmaWx0ZXJBcnJheSA9IChpbnB1dCkgPT4ge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGlucHV0KTtcbn07XG5leHBvcnRzLmZpbHRlckFycmF5ID0gZmlsdGVyQXJyYXk7XG5mdW5jdGlvbiBmaWx0ZXJQcmltaXRpdmVzKGlucHV0LCBvbWl0KSB7XG4gICAgcmV0dXJuIC9udW1iZXJ8c3RyaW5nfGJvb2xlYW4vLnRlc3QodHlwZW9mIGlucHV0KSAmJiAoIW9taXQgfHwgIW9taXQuaW5jbHVkZXMoKHR5cGVvZiBpbnB1dCkpKTtcbn1cbmV4cG9ydHMuZmlsdGVyUHJpbWl0aXZlcyA9IGZpbHRlclByaW1pdGl2ZXM7XG5jb25zdCBmaWx0ZXJTdHJpbmcgPSAoaW5wdXQpID0+IHtcbiAgICByZXR1cm4gdHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJztcbn07XG5leHBvcnRzLmZpbHRlclN0cmluZyA9IGZpbHRlclN0cmluZztcbmNvbnN0IGZpbHRlclN0cmluZ0FycmF5ID0gKGlucHV0KSA9PiB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoaW5wdXQpICYmIGlucHV0LmV2ZXJ5KGV4cG9ydHMuZmlsdGVyU3RyaW5nKTtcbn07XG5leHBvcnRzLmZpbHRlclN0cmluZ0FycmF5ID0gZmlsdGVyU3RyaW5nQXJyYXk7XG5jb25zdCBmaWx0ZXJTdHJpbmdPclN0cmluZ0FycmF5ID0gKGlucHV0KSA9PiB7XG4gICAgcmV0dXJuIGV4cG9ydHMuZmlsdGVyU3RyaW5nKGlucHV0KSB8fCAoQXJyYXkuaXNBcnJheShpbnB1dCkgJiYgaW5wdXQuZXZlcnkoZXhwb3J0cy5maWx0ZXJTdHJpbmcpKTtcbn07XG5leHBvcnRzLmZpbHRlclN0cmluZ09yU3RyaW5nQXJyYXkgPSBmaWx0ZXJTdHJpbmdPclN0cmluZ0FycmF5O1xuZnVuY3Rpb24gZmlsdGVyUGxhaW5PYmplY3QoaW5wdXQpIHtcbiAgICByZXR1cm4gISFpbnB1dCAmJiB1dGlsXzEub2JqZWN0VG9TdHJpbmcoaW5wdXQpID09PSAnW29iamVjdCBPYmplY3RdJztcbn1cbmV4cG9ydHMuZmlsdGVyUGxhaW5PYmplY3QgPSBmaWx0ZXJQbGFpbk9iamVjdDtcbmZ1bmN0aW9uIGZpbHRlckZ1bmN0aW9uKGlucHV0KSB7XG4gICAgcmV0dXJuIHR5cGVvZiBpbnB1dCA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuZmlsdGVyRnVuY3Rpb24gPSBmaWx0ZXJGdW5jdGlvbjtcbmNvbnN0IGZpbHRlckhhc0xlbmd0aCA9IChpbnB1dCkgPT4ge1xuICAgIGlmIChpbnB1dCA9PSBudWxsIHx8ICdudW1iZXJ8Ym9vbGVhbnxmdW5jdGlvbicuaW5jbHVkZXModHlwZW9mIGlucHV0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGlucHV0KSB8fCB0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBpbnB1dC5sZW5ndGggPT09ICdudW1iZXInO1xufTtcbmV4cG9ydHMuZmlsdGVySGFzTGVuZ3RoID0gZmlsdGVySGFzTGVuZ3RoO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXJndW1lbnQtZmlsdGVycy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuRXhpdENvZGVzID0gdm9pZCAwO1xuLyoqXG4gKiBLbm93biBwcm9jZXNzIGV4aXQgY29kZXMgdXNlZCBieSB0aGUgdGFzayBwYXJzZXJzIHRvIGRldGVybWluZSB3aGV0aGVyIGFuIGVycm9yXG4gKiB3YXMgb25lIHRoZXkgY2FuIGF1dG9tYXRpY2FsbHkgaGFuZGxlXG4gKi9cbnZhciBFeGl0Q29kZXM7XG4oZnVuY3Rpb24gKEV4aXRDb2Rlcykge1xuICAgIEV4aXRDb2Rlc1tFeGl0Q29kZXNbXCJTVUNDRVNTXCJdID0gMF0gPSBcIlNVQ0NFU1NcIjtcbiAgICBFeGl0Q29kZXNbRXhpdENvZGVzW1wiRVJST1JcIl0gPSAxXSA9IFwiRVJST1JcIjtcbiAgICBFeGl0Q29kZXNbRXhpdENvZGVzW1wiVU5DTEVBTlwiXSA9IDEyOF0gPSBcIlVOQ0xFQU5cIjtcbn0pKEV4aXRDb2RlcyA9IGV4cG9ydHMuRXhpdENvZGVzIHx8IChleHBvcnRzLkV4aXRDb2RlcyA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1leGl0LWNvZGVzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5HaXRPdXRwdXRTdHJlYW1zID0gdm9pZCAwO1xuY2xhc3MgR2l0T3V0cHV0U3RyZWFtcyB7XG4gICAgY29uc3RydWN0b3Ioc3RkT3V0LCBzdGRFcnIpIHtcbiAgICAgICAgdGhpcy5zdGRPdXQgPSBzdGRPdXQ7XG4gICAgICAgIHRoaXMuc3RkRXJyID0gc3RkRXJyO1xuICAgIH1cbiAgICBhc1N0cmluZ3MoKSB7XG4gICAgICAgIHJldHVybiBuZXcgR2l0T3V0cHV0U3RyZWFtcyh0aGlzLnN0ZE91dC50b1N0cmluZygndXRmOCcpLCB0aGlzLnN0ZEVyci50b1N0cmluZygndXRmOCcpKTtcbiAgICB9XG59XG5leHBvcnRzLkdpdE91dHB1dFN0cmVhbXMgPSBHaXRPdXRwdXRTdHJlYW1zO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2l0LW91dHB1dC1zdHJlYW1zLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5SZW1vdGVMaW5lUGFyc2VyID0gZXhwb3J0cy5MaW5lUGFyc2VyID0gdm9pZCAwO1xuY2xhc3MgTGluZVBhcnNlciB7XG4gICAgY29uc3RydWN0b3IocmVnRXhwLCB1c2VNYXRjaGVzKSB7XG4gICAgICAgIHRoaXMubWF0Y2hlcyA9IFtdO1xuICAgICAgICB0aGlzLnBhcnNlID0gKGxpbmUsIHRhcmdldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZXNldE1hdGNoZXMoKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5fcmVnRXhwLmV2ZXJ5KChyZWcsIGluZGV4KSA9PiB0aGlzLmFkZE1hdGNoKHJlZywgaW5kZXgsIGxpbmUoaW5kZXgpKSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy51c2VNYXRjaGVzKHRhcmdldCwgdGhpcy5wcmVwYXJlTWF0Y2hlcygpKSAhPT0gZmFsc2U7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX3JlZ0V4cCA9IEFycmF5LmlzQXJyYXkocmVnRXhwKSA/IHJlZ0V4cCA6IFtyZWdFeHBdO1xuICAgICAgICBpZiAodXNlTWF0Y2hlcykge1xuICAgICAgICAgICAgdGhpcy51c2VNYXRjaGVzID0gdXNlTWF0Y2hlcztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgdXNlTWF0Y2hlcyh0YXJnZXQsIG1hdGNoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTGluZVBhcnNlcjp1c2VNYXRjaGVzIG5vdCBpbXBsZW1lbnRlZGApO1xuICAgIH1cbiAgICByZXNldE1hdGNoZXMoKSB7XG4gICAgICAgIHRoaXMubWF0Y2hlcy5sZW5ndGggPSAwO1xuICAgIH1cbiAgICBwcmVwYXJlTWF0Y2hlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2hlcztcbiAgICB9XG4gICAgYWRkTWF0Y2gocmVnLCBpbmRleCwgbGluZSkge1xuICAgICAgICBjb25zdCBtYXRjaGVkID0gbGluZSAmJiByZWcuZXhlYyhsaW5lKTtcbiAgICAgICAgaWYgKG1hdGNoZWQpIHtcbiAgICAgICAgICAgIHRoaXMucHVzaE1hdGNoKGluZGV4LCBtYXRjaGVkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gISFtYXRjaGVkO1xuICAgIH1cbiAgICBwdXNoTWF0Y2goX2luZGV4LCBtYXRjaGVkKSB7XG4gICAgICAgIHRoaXMubWF0Y2hlcy5wdXNoKC4uLm1hdGNoZWQuc2xpY2UoMSkpO1xuICAgIH1cbn1cbmV4cG9ydHMuTGluZVBhcnNlciA9IExpbmVQYXJzZXI7XG5jbGFzcyBSZW1vdGVMaW5lUGFyc2VyIGV4dGVuZHMgTGluZVBhcnNlciB7XG4gICAgYWRkTWF0Y2gocmVnLCBpbmRleCwgbGluZSkge1xuICAgICAgICByZXR1cm4gL15yZW1vdGU6XFxzLy50ZXN0KFN0cmluZyhsaW5lKSkgJiYgc3VwZXIuYWRkTWF0Y2gocmVnLCBpbmRleCwgbGluZSk7XG4gICAgfVxuICAgIHB1c2hNYXRjaChpbmRleCwgbWF0Y2hlZCkge1xuICAgICAgICBpZiAoaW5kZXggPiAwIHx8IG1hdGNoZWQubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgc3VwZXIucHVzaE1hdGNoKGluZGV4LCBtYXRjaGVkKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuUmVtb3RlTGluZVBhcnNlciA9IFJlbW90ZUxpbmVQYXJzZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1saW5lLXBhcnNlci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlSW5zdGFuY2VDb25maWcgPSB2b2lkIDA7XG5jb25zdCBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgICBiaW5hcnk6ICdnaXQnLFxuICAgIG1heENvbmN1cnJlbnRQcm9jZXNzZXM6IDUsXG4gICAgY29uZmlnOiBbXSxcbn07XG5mdW5jdGlvbiBjcmVhdGVJbnN0YW5jZUNvbmZpZyguLi5vcHRpb25zKSB7XG4gICAgY29uc3QgYmFzZURpciA9IHByb2Nlc3MuY3dkKCk7XG4gICAgY29uc3QgY29uZmlnID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHsgYmFzZURpciB9LCBkZWZhdWx0T3B0aW9ucyksIC4uLihvcHRpb25zLmZpbHRlcihvID0+IHR5cGVvZiBvID09PSAnb2JqZWN0JyAmJiBvKSkpO1xuICAgIGNvbmZpZy5iYXNlRGlyID0gY29uZmlnLmJhc2VEaXIgfHwgYmFzZURpcjtcbiAgICByZXR1cm4gY29uZmlnO1xufVxuZXhwb3J0cy5jcmVhdGVJbnN0YW5jZUNvbmZpZyA9IGNyZWF0ZUluc3RhbmNlQ29uZmlnO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2ltcGxlLWdpdC1vcHRpb25zLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy50cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQgPSBleHBvcnRzLnRyYWlsaW5nT3B0aW9uc0FyZ3VtZW50ID0gZXhwb3J0cy5nZXRUcmFpbGluZ09wdGlvbnMgPSBleHBvcnRzLmFwcGVuZFRhc2tPcHRpb25zID0gdm9pZCAwO1xuY29uc3QgYXJndW1lbnRfZmlsdGVyc18xID0gcmVxdWlyZShcIi4vYXJndW1lbnQtZmlsdGVyc1wiKTtcbmNvbnN0IHV0aWxfMSA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG5mdW5jdGlvbiBhcHBlbmRUYXNrT3B0aW9ucyhvcHRpb25zLCBjb21tYW5kcyA9IFtdKSB7XG4gICAgaWYgKCFhcmd1bWVudF9maWx0ZXJzXzEuZmlsdGVyUGxhaW5PYmplY3Qob3B0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzO1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmtleXMob3B0aW9ucykucmVkdWNlKChjb21tYW5kcywga2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gb3B0aW9uc1trZXldO1xuICAgICAgICBpZiAoYXJndW1lbnRfZmlsdGVyc18xLmZpbHRlclByaW1pdGl2ZXModmFsdWUsIFsnYm9vbGVhbiddKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaChrZXkgKyAnPScgKyB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzO1xuICAgIH0sIGNvbW1hbmRzKTtcbn1cbmV4cG9ydHMuYXBwZW5kVGFza09wdGlvbnMgPSBhcHBlbmRUYXNrT3B0aW9ucztcbmZ1bmN0aW9uIGdldFRyYWlsaW5nT3B0aW9ucyhhcmdzLCBpbml0aWFsUHJpbWl0aXZlID0gMCwgb2JqZWN0T25seSA9IGZhbHNlKSB7XG4gICAgY29uc3QgY29tbWFuZCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwLCBtYXggPSBpbml0aWFsUHJpbWl0aXZlIDwgMCA/IGFyZ3MubGVuZ3RoIDogaW5pdGlhbFByaW1pdGl2ZTsgaSA8IG1heDsgaSsrKSB7XG4gICAgICAgIGlmICgnc3RyaW5nfG51bWJlcicuaW5jbHVkZXModHlwZW9mIGFyZ3NbaV0pKSB7XG4gICAgICAgICAgICBjb21tYW5kLnB1c2goU3RyaW5nKGFyZ3NbaV0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhcHBlbmRUYXNrT3B0aW9ucyh0cmFpbGluZ09wdGlvbnNBcmd1bWVudChhcmdzKSwgY29tbWFuZCk7XG4gICAgaWYgKCFvYmplY3RPbmx5KSB7XG4gICAgICAgIGNvbW1hbmQucHVzaCguLi50cmFpbGluZ0FycmF5QXJndW1lbnQoYXJncykpO1xuICAgIH1cbiAgICByZXR1cm4gY29tbWFuZDtcbn1cbmV4cG9ydHMuZ2V0VHJhaWxpbmdPcHRpb25zID0gZ2V0VHJhaWxpbmdPcHRpb25zO1xuZnVuY3Rpb24gdHJhaWxpbmdBcnJheUFyZ3VtZW50KGFyZ3MpIHtcbiAgICBjb25zdCBoYXNUcmFpbGluZ0NhbGxiYWNrID0gdHlwZW9mIHV0aWxfMS5sYXN0KGFyZ3MpID09PSAnZnVuY3Rpb24nO1xuICAgIHJldHVybiBhcmd1bWVudF9maWx0ZXJzXzEuZmlsdGVyVHlwZSh1dGlsXzEubGFzdChhcmdzLCBoYXNUcmFpbGluZ0NhbGxiYWNrID8gMSA6IDApLCBhcmd1bWVudF9maWx0ZXJzXzEuZmlsdGVyQXJyYXksIFtdKTtcbn1cbi8qKlxuICogR2l2ZW4gYW55IG51bWJlciBvZiBhcmd1bWVudHMsIHJldHVybnMgdGhlIHRyYWlsaW5nIG9wdGlvbnMgYXJndW1lbnQsIGlnbm9yaW5nIGEgdHJhaWxpbmcgZnVuY3Rpb24gYXJndW1lbnRcbiAqIGlmIHRoZXJlIGlzIG9uZS4gV2hlbiBub3QgZm91bmQsIHRoZSByZXR1cm4gdmFsdWUgaXMgbnVsbC5cbiAqL1xuZnVuY3Rpb24gdHJhaWxpbmdPcHRpb25zQXJndW1lbnQoYXJncykge1xuICAgIGNvbnN0IGhhc1RyYWlsaW5nQ2FsbGJhY2sgPSBhcmd1bWVudF9maWx0ZXJzXzEuZmlsdGVyRnVuY3Rpb24odXRpbF8xLmxhc3QoYXJncykpO1xuICAgIHJldHVybiBhcmd1bWVudF9maWx0ZXJzXzEuZmlsdGVyVHlwZSh1dGlsXzEubGFzdChhcmdzLCBoYXNUcmFpbGluZ0NhbGxiYWNrID8gMSA6IDApLCBhcmd1bWVudF9maWx0ZXJzXzEuZmlsdGVyUGxhaW5PYmplY3QpO1xufVxuZXhwb3J0cy50cmFpbGluZ09wdGlvbnNBcmd1bWVudCA9IHRyYWlsaW5nT3B0aW9uc0FyZ3VtZW50O1xuLyoqXG4gKiBSZXR1cm5zIGVpdGhlciB0aGUgc291cmNlIGFyZ3VtZW50IHdoZW4gaXQgaXMgYSBgRnVuY3Rpb25gLCBvciB0aGUgZGVmYXVsdFxuICogYE5PT1BgIGZ1bmN0aW9uIGNvbnN0YW50XG4gKi9cbmZ1bmN0aW9uIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmdzLCBpbmNsdWRlTm9vcCA9IHRydWUpIHtcbiAgICBjb25zdCBjYWxsYmFjayA9IHV0aWxfMS5hc0Z1bmN0aW9uKHV0aWxfMS5sYXN0KGFyZ3MpKTtcbiAgICByZXR1cm4gaW5jbHVkZU5vb3AgfHwgdXRpbF8xLmlzVXNlckZ1bmN0aW9uKGNhbGxiYWNrKSA/IGNhbGxiYWNrIDogdW5kZWZpbmVkO1xufVxuZXhwb3J0cy50cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQgPSB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10YXNrLW9wdGlvbnMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnBhcnNlU3RyaW5nUmVzcG9uc2UgPSBleHBvcnRzLmNhbGxUYXNrUGFyc2VyID0gdm9pZCAwO1xuY29uc3QgdXRpbF8xID0gcmVxdWlyZShcIi4vdXRpbFwiKTtcbmZ1bmN0aW9uIGNhbGxUYXNrUGFyc2VyKHBhcnNlciwgc3RyZWFtcykge1xuICAgIHJldHVybiBwYXJzZXIoc3RyZWFtcy5zdGRPdXQsIHN0cmVhbXMuc3RkRXJyKTtcbn1cbmV4cG9ydHMuY2FsbFRhc2tQYXJzZXIgPSBjYWxsVGFza1BhcnNlcjtcbmZ1bmN0aW9uIHBhcnNlU3RyaW5nUmVzcG9uc2UocmVzdWx0LCBwYXJzZXJzLCAuLi50ZXh0cykge1xuICAgIHRleHRzLmZvckVhY2godGV4dCA9PiB7XG4gICAgICAgIGZvciAobGV0IGxpbmVzID0gdXRpbF8xLnRvTGluZXNXaXRoQ29udGVudCh0ZXh0KSwgaSA9IDAsIG1heCA9IGxpbmVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBsaW5lID0gKG9mZnNldCA9IDApID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoKGkgKyBvZmZzZXQpID49IG1heCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBsaW5lc1tpICsgb2Zmc2V0XTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBwYXJzZXJzLnNvbWUoKHsgcGFyc2UgfSkgPT4gcGFyc2UobGluZSwgcmVzdWx0KSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0cy5wYXJzZVN0cmluZ1Jlc3BvbnNlID0gcGFyc2VTdHJpbmdSZXNwb25zZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRhc2stcGFyc2VyLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX2V4cG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9fZXhwb3J0U3RhcikgfHwgZnVuY3Rpb24obSwgZXhwb3J0cykge1xuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXhwb3J0cywgcCkpIF9fY3JlYXRlQmluZGluZyhleHBvcnRzLCBtLCBwKTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vYXJndW1lbnQtZmlsdGVyc1wiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vZXhpdC1jb2Rlc1wiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vZ2l0LW91dHB1dC1zdHJlYW1zXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9saW5lLXBhcnNlclwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vc2ltcGxlLWdpdC1vcHRpb25zXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi90YXNrLW9wdGlvbnNcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL3Rhc2stcGFyc2VyXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi91dGlsXCIpLCBleHBvcnRzKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5jaGVja0lzQmFyZVJlcG9UYXNrID0gZXhwb3J0cy5jaGVja0lzUmVwb1Jvb3RUYXNrID0gZXhwb3J0cy5jaGVja0lzUmVwb1Rhc2sgPSBleHBvcnRzLkNoZWNrUmVwb0FjdGlvbnMgPSB2b2lkIDA7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xudmFyIENoZWNrUmVwb0FjdGlvbnM7XG4oZnVuY3Rpb24gKENoZWNrUmVwb0FjdGlvbnMpIHtcbiAgICBDaGVja1JlcG9BY3Rpb25zW1wiQkFSRVwiXSA9IFwiYmFyZVwiO1xuICAgIENoZWNrUmVwb0FjdGlvbnNbXCJJTl9UUkVFXCJdID0gXCJ0cmVlXCI7XG4gICAgQ2hlY2tSZXBvQWN0aW9uc1tcIklTX1JFUE9fUk9PVFwiXSA9IFwicm9vdFwiO1xufSkoQ2hlY2tSZXBvQWN0aW9ucyA9IGV4cG9ydHMuQ2hlY2tSZXBvQWN0aW9ucyB8fCAoZXhwb3J0cy5DaGVja1JlcG9BY3Rpb25zID0ge30pKTtcbmNvbnN0IG9uRXJyb3IgPSAoeyBleGl0Q29kZSB9LCBlcnJvciwgZG9uZSwgZmFpbCkgPT4ge1xuICAgIGlmIChleGl0Q29kZSA9PT0gdXRpbHNfMS5FeGl0Q29kZXMuVU5DTEVBTiAmJiBpc05vdFJlcG9NZXNzYWdlKGVycm9yKSkge1xuICAgICAgICByZXR1cm4gZG9uZShCdWZmZXIuZnJvbSgnZmFsc2UnKSk7XG4gICAgfVxuICAgIGZhaWwoZXJyb3IpO1xufTtcbmNvbnN0IHBhcnNlciA9ICh0ZXh0KSA9PiB7XG4gICAgcmV0dXJuIHRleHQudHJpbSgpID09PSAndHJ1ZSc7XG59O1xuZnVuY3Rpb24gY2hlY2tJc1JlcG9UYXNrKGFjdGlvbikge1xuICAgIHN3aXRjaCAoYWN0aW9uKSB7XG4gICAgICAgIGNhc2UgQ2hlY2tSZXBvQWN0aW9ucy5CQVJFOlxuICAgICAgICAgICAgcmV0dXJuIGNoZWNrSXNCYXJlUmVwb1Rhc2soKTtcbiAgICAgICAgY2FzZSBDaGVja1JlcG9BY3Rpb25zLklTX1JFUE9fUk9PVDpcbiAgICAgICAgICAgIHJldHVybiBjaGVja0lzUmVwb1Jvb3RUYXNrKCk7XG4gICAgfVxuICAgIGNvbnN0IGNvbW1hbmRzID0gWydyZXYtcGFyc2UnLCAnLS1pcy1pbnNpZGUtd29yay10cmVlJ107XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29tbWFuZHMsXG4gICAgICAgIGZvcm1hdDogJ3V0Zi04JyxcbiAgICAgICAgb25FcnJvcixcbiAgICAgICAgcGFyc2VyLFxuICAgIH07XG59XG5leHBvcnRzLmNoZWNrSXNSZXBvVGFzayA9IGNoZWNrSXNSZXBvVGFzaztcbmZ1bmN0aW9uIGNoZWNrSXNSZXBvUm9vdFRhc2soKSB7XG4gICAgY29uc3QgY29tbWFuZHMgPSBbJ3Jldi1wYXJzZScsICctLWdpdC1kaXInXTtcbiAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kcyxcbiAgICAgICAgZm9ybWF0OiAndXRmLTgnLFxuICAgICAgICBvbkVycm9yLFxuICAgICAgICBwYXJzZXIocGF0aCkge1xuICAgICAgICAgICAgcmV0dXJuIC9eXFwuKGdpdCk/JC8udGVzdChwYXRoLnRyaW0oKSk7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbmV4cG9ydHMuY2hlY2tJc1JlcG9Sb290VGFzayA9IGNoZWNrSXNSZXBvUm9vdFRhc2s7XG5mdW5jdGlvbiBjaGVja0lzQmFyZVJlcG9UYXNrKCkge1xuICAgIGNvbnN0IGNvbW1hbmRzID0gWydyZXYtcGFyc2UnLCAnLS1pcy1iYXJlLXJlcG9zaXRvcnknXTtcbiAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kcyxcbiAgICAgICAgZm9ybWF0OiAndXRmLTgnLFxuICAgICAgICBvbkVycm9yLFxuICAgICAgICBwYXJzZXIsXG4gICAgfTtcbn1cbmV4cG9ydHMuY2hlY2tJc0JhcmVSZXBvVGFzayA9IGNoZWNrSXNCYXJlUmVwb1Rhc2s7XG5mdW5jdGlvbiBpc05vdFJlcG9NZXNzYWdlKGVycm9yKSB7XG4gICAgcmV0dXJuIC8oTm90IGEgZ2l0IHJlcG9zaXRvcnl8S2VpbiBHaXQtUmVwb3NpdG9yeSkvaS50ZXN0KFN0cmluZyhlcnJvcikpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2hlY2staXMtcmVwby5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY2xlYW5TdW1tYXJ5UGFyc2VyID0gZXhwb3J0cy5DbGVhblJlc3BvbnNlID0gdm9pZCAwO1xuY29uc3QgdXRpbHNfMSA9IHJlcXVpcmUoXCIuLi91dGlsc1wiKTtcbmNsYXNzIENsZWFuUmVzcG9uc2Uge1xuICAgIGNvbnN0cnVjdG9yKGRyeVJ1bikge1xuICAgICAgICB0aGlzLmRyeVJ1biA9IGRyeVJ1bjtcbiAgICAgICAgdGhpcy5wYXRocyA9IFtdO1xuICAgICAgICB0aGlzLmZpbGVzID0gW107XG4gICAgICAgIHRoaXMuZm9sZGVycyA9IFtdO1xuICAgIH1cbn1cbmV4cG9ydHMuQ2xlYW5SZXNwb25zZSA9IENsZWFuUmVzcG9uc2U7XG5jb25zdCByZW1vdmFsUmVnZXhwID0gL15bYS16XStcXHMqL2k7XG5jb25zdCBkcnlSdW5SZW1vdmFsUmVnZXhwID0gL15bYS16XStcXHMrW2Etel0rXFxzKi9pO1xuY29uc3QgaXNGb2xkZXJSZWdleHAgPSAvXFwvJC87XG5mdW5jdGlvbiBjbGVhblN1bW1hcnlQYXJzZXIoZHJ5UnVuLCB0ZXh0KSB7XG4gICAgY29uc3Qgc3VtbWFyeSA9IG5ldyBDbGVhblJlc3BvbnNlKGRyeVJ1bik7XG4gICAgY29uc3QgcmVnZXhwID0gZHJ5UnVuID8gZHJ5UnVuUmVtb3ZhbFJlZ2V4cCA6IHJlbW92YWxSZWdleHA7XG4gICAgdXRpbHNfMS50b0xpbmVzV2l0aENvbnRlbnQodGV4dCkuZm9yRWFjaChsaW5lID0+IHtcbiAgICAgICAgY29uc3QgcmVtb3ZlZCA9IGxpbmUucmVwbGFjZShyZWdleHAsICcnKTtcbiAgICAgICAgc3VtbWFyeS5wYXRocy5wdXNoKHJlbW92ZWQpO1xuICAgICAgICAoaXNGb2xkZXJSZWdleHAudGVzdChyZW1vdmVkKSA/IHN1bW1hcnkuZm9sZGVycyA6IHN1bW1hcnkuZmlsZXMpLnB1c2gocmVtb3ZlZCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHN1bW1hcnk7XG59XG5leHBvcnRzLmNsZWFuU3VtbWFyeVBhcnNlciA9IGNsZWFuU3VtbWFyeVBhcnNlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNsZWFuU3VtbWFyeS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuaXNFbXB0eVRhc2sgPSBleHBvcnRzLmlzQnVmZmVyVGFzayA9IGV4cG9ydHMuc3RyYWlnaHRUaHJvdWdoQnVmZmVyVGFzayA9IGV4cG9ydHMuc3RyYWlnaHRUaHJvdWdoU3RyaW5nVGFzayA9IGV4cG9ydHMuY29uZmlndXJhdGlvbkVycm9yVGFzayA9IGV4cG9ydHMuYWRob2NFeGVjVGFzayA9IGV4cG9ydHMuRU1QVFlfQ09NTUFORFMgPSB2b2lkIDA7XG5jb25zdCB0YXNrX2NvbmZpZ3VyYXRpb25fZXJyb3JfMSA9IHJlcXVpcmUoXCIuLi9lcnJvcnMvdGFzay1jb25maWd1cmF0aW9uLWVycm9yXCIpO1xuZXhwb3J0cy5FTVBUWV9DT01NQU5EUyA9IFtdO1xuZnVuY3Rpb24gYWRob2NFeGVjVGFzayhwYXJzZXIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kczogZXhwb3J0cy5FTVBUWV9DT01NQU5EUyxcbiAgICAgICAgZm9ybWF0OiAndXRmLTgnLFxuICAgICAgICBwYXJzZXIsXG4gICAgfTtcbn1cbmV4cG9ydHMuYWRob2NFeGVjVGFzayA9IGFkaG9jRXhlY1Rhc2s7XG5mdW5jdGlvbiBjb25maWd1cmF0aW9uRXJyb3JUYXNrKGVycm9yKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29tbWFuZHM6IGV4cG9ydHMuRU1QVFlfQ09NTUFORFMsXG4gICAgICAgIGZvcm1hdDogJ3V0Zi04JyxcbiAgICAgICAgcGFyc2VyKCkge1xuICAgICAgICAgICAgdGhyb3cgdHlwZW9mIGVycm9yID09PSAnc3RyaW5nJyA/IG5ldyB0YXNrX2NvbmZpZ3VyYXRpb25fZXJyb3JfMS5UYXNrQ29uZmlndXJhdGlvbkVycm9yKGVycm9yKSA6IGVycm9yO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmV4cG9ydHMuY29uZmlndXJhdGlvbkVycm9yVGFzayA9IGNvbmZpZ3VyYXRpb25FcnJvclRhc2s7XG5mdW5jdGlvbiBzdHJhaWdodFRocm91Z2hTdHJpbmdUYXNrKGNvbW1hbmRzLCB0cmltbWVkID0gZmFsc2UpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kcyxcbiAgICAgICAgZm9ybWF0OiAndXRmLTgnLFxuICAgICAgICBwYXJzZXIodGV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIHRyaW1tZWQgPyBTdHJpbmcodGV4dCkudHJpbSgpIDogdGV4dDtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuZXhwb3J0cy5zdHJhaWdodFRocm91Z2hTdHJpbmdUYXNrID0gc3RyYWlnaHRUaHJvdWdoU3RyaW5nVGFzaztcbmZ1bmN0aW9uIHN0cmFpZ2h0VGhyb3VnaEJ1ZmZlclRhc2soY29tbWFuZHMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kcyxcbiAgICAgICAgZm9ybWF0OiAnYnVmZmVyJyxcbiAgICAgICAgcGFyc2VyKGJ1ZmZlcikge1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuZXhwb3J0cy5zdHJhaWdodFRocm91Z2hCdWZmZXJUYXNrID0gc3RyYWlnaHRUaHJvdWdoQnVmZmVyVGFzaztcbmZ1bmN0aW9uIGlzQnVmZmVyVGFzayh0YXNrKSB7XG4gICAgcmV0dXJuIHRhc2suZm9ybWF0ID09PSAnYnVmZmVyJztcbn1cbmV4cG9ydHMuaXNCdWZmZXJUYXNrID0gaXNCdWZmZXJUYXNrO1xuZnVuY3Rpb24gaXNFbXB0eVRhc2sodGFzaykge1xuICAgIHJldHVybiAhdGFzay5jb21tYW5kcy5sZW5ndGg7XG59XG5leHBvcnRzLmlzRW1wdHlUYXNrID0gaXNFbXB0eVRhc2s7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10YXNrLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5pc0NsZWFuT3B0aW9uc0FycmF5ID0gZXhwb3J0cy5jbGVhblRhc2sgPSBleHBvcnRzLmNsZWFuV2l0aE9wdGlvbnNUYXNrID0gZXhwb3J0cy5DbGVhbk9wdGlvbnMgPSBleHBvcnRzLkNPTkZJR19FUlJPUl9VTktOT1dOX09QVElPTiA9IGV4cG9ydHMuQ09ORklHX0VSUk9SX01PREVfUkVRVUlSRUQgPSBleHBvcnRzLkNPTkZJR19FUlJPUl9JTlRFUkFDVElWRV9NT0RFID0gdm9pZCAwO1xuY29uc3QgQ2xlYW5TdW1tYXJ5XzEgPSByZXF1aXJlKFwiLi4vcmVzcG9uc2VzL0NsZWFuU3VtbWFyeVwiKTtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5jb25zdCB0YXNrXzEgPSByZXF1aXJlKFwiLi90YXNrXCIpO1xuZXhwb3J0cy5DT05GSUdfRVJST1JfSU5URVJBQ1RJVkVfTU9ERSA9ICdHaXQgY2xlYW4gaW50ZXJhY3RpdmUgbW9kZSBpcyBub3Qgc3VwcG9ydGVkJztcbmV4cG9ydHMuQ09ORklHX0VSUk9SX01PREVfUkVRVUlSRUQgPSAnR2l0IGNsZWFuIG1vZGUgcGFyYW1ldGVyIChcIm5cIiBvciBcImZcIikgaXMgcmVxdWlyZWQnO1xuZXhwb3J0cy5DT05GSUdfRVJST1JfVU5LTk9XTl9PUFRJT04gPSAnR2l0IGNsZWFuIHVua25vd24gb3B0aW9uIGZvdW5kIGluOiAnO1xuLyoqXG4gKiBBbGwgc3VwcG9ydGVkIG9wdGlvbiBzd2l0Y2hlcyBhdmFpbGFibGUgZm9yIHVzZSBpbiBhIGBnaXQuY2xlYW5gIG9wZXJhdGlvblxuICovXG52YXIgQ2xlYW5PcHRpb25zO1xuKGZ1bmN0aW9uIChDbGVhbk9wdGlvbnMpIHtcbiAgICBDbGVhbk9wdGlvbnNbXCJEUllfUlVOXCJdID0gXCJuXCI7XG4gICAgQ2xlYW5PcHRpb25zW1wiRk9SQ0VcIl0gPSBcImZcIjtcbiAgICBDbGVhbk9wdGlvbnNbXCJJR05PUkVEX0lOQ0xVREVEXCJdID0gXCJ4XCI7XG4gICAgQ2xlYW5PcHRpb25zW1wiSUdOT1JFRF9PTkxZXCJdID0gXCJYXCI7XG4gICAgQ2xlYW5PcHRpb25zW1wiRVhDTFVESU5HXCJdID0gXCJlXCI7XG4gICAgQ2xlYW5PcHRpb25zW1wiUVVJRVRcIl0gPSBcInFcIjtcbiAgICBDbGVhbk9wdGlvbnNbXCJSRUNVUlNJVkVcIl0gPSBcImRcIjtcbn0pKENsZWFuT3B0aW9ucyA9IGV4cG9ydHMuQ2xlYW5PcHRpb25zIHx8IChleHBvcnRzLkNsZWFuT3B0aW9ucyA9IHt9KSk7XG5jb25zdCBDbGVhbk9wdGlvblZhbHVlcyA9IG5ldyBTZXQoWydpJywgLi4udXRpbHNfMS5hc1N0cmluZ0FycmF5KE9iamVjdC52YWx1ZXMoQ2xlYW5PcHRpb25zKSldKTtcbmZ1bmN0aW9uIGNsZWFuV2l0aE9wdGlvbnNUYXNrKG1vZGUsIGN1c3RvbUFyZ3MpIHtcbiAgICBjb25zdCB7IGNsZWFuTW9kZSwgb3B0aW9ucywgdmFsaWQgfSA9IGdldENsZWFuT3B0aW9ucyhtb2RlKTtcbiAgICBpZiAoIWNsZWFuTW9kZSkge1xuICAgICAgICByZXR1cm4gdGFza18xLmNvbmZpZ3VyYXRpb25FcnJvclRhc2soZXhwb3J0cy5DT05GSUdfRVJST1JfTU9ERV9SRVFVSVJFRCk7XG4gICAgfVxuICAgIGlmICghdmFsaWQub3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGFza18xLmNvbmZpZ3VyYXRpb25FcnJvclRhc2soZXhwb3J0cy5DT05GSUdfRVJST1JfVU5LTk9XTl9PUFRJT04gKyBKU09OLnN0cmluZ2lmeShtb2RlKSk7XG4gICAgfVxuICAgIG9wdGlvbnMucHVzaCguLi5jdXN0b21BcmdzKTtcbiAgICBpZiAob3B0aW9ucy5zb21lKGlzSW50ZXJhY3RpdmVNb2RlKSkge1xuICAgICAgICByZXR1cm4gdGFza18xLmNvbmZpZ3VyYXRpb25FcnJvclRhc2soZXhwb3J0cy5DT05GSUdfRVJST1JfSU5URVJBQ1RJVkVfTU9ERSk7XG4gICAgfVxuICAgIHJldHVybiBjbGVhblRhc2soY2xlYW5Nb2RlLCBvcHRpb25zKTtcbn1cbmV4cG9ydHMuY2xlYW5XaXRoT3B0aW9uc1Rhc2sgPSBjbGVhbldpdGhPcHRpb25zVGFzaztcbmZ1bmN0aW9uIGNsZWFuVGFzayhtb2RlLCBjdXN0b21BcmdzKSB7XG4gICAgY29uc3QgY29tbWFuZHMgPSBbJ2NsZWFuJywgYC0ke21vZGV9YCwgLi4uY3VzdG9tQXJnc107XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29tbWFuZHMsXG4gICAgICAgIGZvcm1hdDogJ3V0Zi04JyxcbiAgICAgICAgcGFyc2VyKHRleHQpIHtcbiAgICAgICAgICAgIHJldHVybiBDbGVhblN1bW1hcnlfMS5jbGVhblN1bW1hcnlQYXJzZXIobW9kZSA9PT0gQ2xlYW5PcHRpb25zLkRSWV9SVU4sIHRleHQpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmV4cG9ydHMuY2xlYW5UYXNrID0gY2xlYW5UYXNrO1xuZnVuY3Rpb24gaXNDbGVhbk9wdGlvbnNBcnJheShpbnB1dCkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGlucHV0KSAmJiBpbnB1dC5ldmVyeSh0ZXN0ID0+IENsZWFuT3B0aW9uVmFsdWVzLmhhcyh0ZXN0KSk7XG59XG5leHBvcnRzLmlzQ2xlYW5PcHRpb25zQXJyYXkgPSBpc0NsZWFuT3B0aW9uc0FycmF5O1xuZnVuY3Rpb24gZ2V0Q2xlYW5PcHRpb25zKGlucHV0KSB7XG4gICAgbGV0IGNsZWFuTW9kZTtcbiAgICBsZXQgb3B0aW9ucyA9IFtdO1xuICAgIGxldCB2YWxpZCA9IHsgY2xlYW5Nb2RlOiBmYWxzZSwgb3B0aW9uczogdHJ1ZSB9O1xuICAgIGlucHV0LnJlcGxhY2UoL1teYS16XWkvZywgJycpLnNwbGl0KCcnKS5mb3JFYWNoKGNoYXIgPT4ge1xuICAgICAgICBpZiAoaXNDbGVhbk1vZGUoY2hhcikpIHtcbiAgICAgICAgICAgIGNsZWFuTW9kZSA9IGNoYXI7XG4gICAgICAgICAgICB2YWxpZC5jbGVhbk1vZGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFsaWQub3B0aW9ucyA9IHZhbGlkLm9wdGlvbnMgJiYgaXNLbm93bk9wdGlvbihvcHRpb25zW29wdGlvbnMubGVuZ3RoXSA9IChgLSR7Y2hhcn1gKSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBjbGVhbk1vZGUsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIHZhbGlkLFxuICAgIH07XG59XG5mdW5jdGlvbiBpc0NsZWFuTW9kZShjbGVhbk1vZGUpIHtcbiAgICByZXR1cm4gY2xlYW5Nb2RlID09PSBDbGVhbk9wdGlvbnMuRk9SQ0UgfHwgY2xlYW5Nb2RlID09PSBDbGVhbk9wdGlvbnMuRFJZX1JVTjtcbn1cbmZ1bmN0aW9uIGlzS25vd25PcHRpb24ob3B0aW9uKSB7XG4gICAgcmV0dXJuIC9eLVthLXpdJC9pLnRlc3Qob3B0aW9uKSAmJiBDbGVhbk9wdGlvblZhbHVlcy5oYXMob3B0aW9uLmNoYXJBdCgxKSk7XG59XG5mdW5jdGlvbiBpc0ludGVyYWN0aXZlTW9kZShvcHRpb24pIHtcbiAgICBpZiAoL14tW15cXC1dLy50ZXN0KG9wdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbi5pbmRleE9mKCdpJykgPiAwO1xuICAgIH1cbiAgICByZXR1cm4gb3B0aW9uID09PSAnLS1pbnRlcmFjdGl2ZSc7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jbGVhbi5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2V0UmVzZXRNb2RlID0gZXhwb3J0cy5yZXNldFRhc2sgPSBleHBvcnRzLlJlc2V0TW9kZSA9IHZvaWQgMDtcbmNvbnN0IHRhc2tfMSA9IHJlcXVpcmUoXCIuL3Rhc2tcIik7XG52YXIgUmVzZXRNb2RlO1xuKGZ1bmN0aW9uIChSZXNldE1vZGUpIHtcbiAgICBSZXNldE1vZGVbXCJNSVhFRFwiXSA9IFwibWl4ZWRcIjtcbiAgICBSZXNldE1vZGVbXCJTT0ZUXCJdID0gXCJzb2Z0XCI7XG4gICAgUmVzZXRNb2RlW1wiSEFSRFwiXSA9IFwiaGFyZFwiO1xuICAgIFJlc2V0TW9kZVtcIk1FUkdFXCJdID0gXCJtZXJnZVwiO1xuICAgIFJlc2V0TW9kZVtcIktFRVBcIl0gPSBcImtlZXBcIjtcbn0pKFJlc2V0TW9kZSA9IGV4cG9ydHMuUmVzZXRNb2RlIHx8IChleHBvcnRzLlJlc2V0TW9kZSA9IHt9KSk7XG5jb25zdCBSZXNldE1vZGVzID0gQXJyYXkuZnJvbShPYmplY3QudmFsdWVzKFJlc2V0TW9kZSkpO1xuZnVuY3Rpb24gcmVzZXRUYXNrKG1vZGUsIGN1c3RvbUFyZ3MpIHtcbiAgICBjb25zdCBjb21tYW5kcyA9IFsncmVzZXQnXTtcbiAgICBpZiAoaXNWYWxpZFJlc2V0TW9kZShtb2RlKSkge1xuICAgICAgICBjb21tYW5kcy5wdXNoKGAtLSR7bW9kZX1gKTtcbiAgICB9XG4gICAgY29tbWFuZHMucHVzaCguLi5jdXN0b21BcmdzKTtcbiAgICByZXR1cm4gdGFza18xLnN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soY29tbWFuZHMpO1xufVxuZXhwb3J0cy5yZXNldFRhc2sgPSByZXNldFRhc2s7XG5mdW5jdGlvbiBnZXRSZXNldE1vZGUobW9kZSkge1xuICAgIGlmIChpc1ZhbGlkUmVzZXRNb2RlKG1vZGUpKSB7XG4gICAgICAgIHJldHVybiBtb2RlO1xuICAgIH1cbiAgICBzd2l0Y2ggKHR5cGVvZiBtb2RlKSB7XG4gICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgICAgICByZXR1cm4gUmVzZXRNb2RlLlNPRlQ7XG4gICAgfVxuICAgIHJldHVybjtcbn1cbmV4cG9ydHMuZ2V0UmVzZXRNb2RlID0gZ2V0UmVzZXRNb2RlO1xuZnVuY3Rpb24gaXNWYWxpZFJlc2V0TW9kZShtb2RlKSB7XG4gICAgcmV0dXJuIFJlc2V0TW9kZXMuaW5jbHVkZXMobW9kZSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZXNldC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGdpdF9jb25zdHJ1Y3RfZXJyb3JfMSA9IHJlcXVpcmUoXCIuL2Vycm9ycy9naXQtY29uc3RydWN0LWVycm9yXCIpO1xuY29uc3QgZ2l0X2Vycm9yXzEgPSByZXF1aXJlKFwiLi9lcnJvcnMvZ2l0LWVycm9yXCIpO1xuY29uc3QgZ2l0X3BsdWdpbl9lcnJvcl8xID0gcmVxdWlyZShcIi4vZXJyb3JzL2dpdC1wbHVnaW4tZXJyb3JcIik7XG5jb25zdCBnaXRfcmVzcG9uc2VfZXJyb3JfMSA9IHJlcXVpcmUoXCIuL2Vycm9ycy9naXQtcmVzcG9uc2UtZXJyb3JcIik7XG5jb25zdCB0YXNrX2NvbmZpZ3VyYXRpb25fZXJyb3JfMSA9IHJlcXVpcmUoXCIuL2Vycm9ycy90YXNrLWNvbmZpZ3VyYXRpb24tZXJyb3JcIik7XG5jb25zdCBjaGVja19pc19yZXBvXzEgPSByZXF1aXJlKFwiLi90YXNrcy9jaGVjay1pcy1yZXBvXCIpO1xuY29uc3QgY2xlYW5fMSA9IHJlcXVpcmUoXCIuL3Rhc2tzL2NsZWFuXCIpO1xuY29uc3QgcmVzZXRfMSA9IHJlcXVpcmUoXCIuL3Rhc2tzL3Jlc2V0XCIpO1xuY29uc3QgYXBpID0ge1xuICAgIENoZWNrUmVwb0FjdGlvbnM6IGNoZWNrX2lzX3JlcG9fMS5DaGVja1JlcG9BY3Rpb25zLFxuICAgIENsZWFuT3B0aW9uczogY2xlYW5fMS5DbGVhbk9wdGlvbnMsXG4gICAgR2l0Q29uc3RydWN0RXJyb3I6IGdpdF9jb25zdHJ1Y3RfZXJyb3JfMS5HaXRDb25zdHJ1Y3RFcnJvcixcbiAgICBHaXRFcnJvcjogZ2l0X2Vycm9yXzEuR2l0RXJyb3IsXG4gICAgR2l0UGx1Z2luRXJyb3I6IGdpdF9wbHVnaW5fZXJyb3JfMS5HaXRQbHVnaW5FcnJvcixcbiAgICBHaXRSZXNwb25zZUVycm9yOiBnaXRfcmVzcG9uc2VfZXJyb3JfMS5HaXRSZXNwb25zZUVycm9yLFxuICAgIFJlc2V0TW9kZTogcmVzZXRfMS5SZXNldE1vZGUsXG4gICAgVGFza0NvbmZpZ3VyYXRpb25FcnJvcjogdGFza19jb25maWd1cmF0aW9uX2Vycm9yXzEuVGFza0NvbmZpZ3VyYXRpb25FcnJvcixcbn07XG5leHBvcnRzLmRlZmF1bHQgPSBhcGk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hcGkuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNvbW1hbmRDb25maWdQcmVmaXhpbmdQbHVnaW4gPSB2b2lkIDA7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xuZnVuY3Rpb24gY29tbWFuZENvbmZpZ1ByZWZpeGluZ1BsdWdpbihjb25maWd1cmF0aW9uKSB7XG4gICAgY29uc3QgcHJlZml4ID0gdXRpbHNfMS5wcmVmaXhlZEFycmF5KGNvbmZpZ3VyYXRpb24sICctYycpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdzcGF3bi5hcmdzJyxcbiAgICAgICAgYWN0aW9uKGRhdGEpIHtcbiAgICAgICAgICAgIHJldHVybiBbLi4ucHJlZml4LCAuLi5kYXRhXTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuZXhwb3J0cy5jb21tYW5kQ29uZmlnUHJlZml4aW5nUGx1Z2luID0gY29tbWFuZENvbmZpZ1ByZWZpeGluZ1BsdWdpbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbW1hbmQtY29uZmlnLXByZWZpeGluZy1wbHVnaW4uanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmVycm9yRGV0ZWN0aW9uUGx1Z2luID0gZXhwb3J0cy5lcnJvckRldGVjdGlvbkhhbmRsZXIgPSB2b2lkIDA7XG5jb25zdCBnaXRfZXJyb3JfMSA9IHJlcXVpcmUoXCIuLi9lcnJvcnMvZ2l0LWVycm9yXCIpO1xuZnVuY3Rpb24gaXNUYXNrRXJyb3IocmVzdWx0KSB7XG4gICAgcmV0dXJuICEhKHJlc3VsdC5leGl0Q29kZSAmJiByZXN1bHQuc3RkRXJyLmxlbmd0aCk7XG59XG5mdW5jdGlvbiBnZXRFcnJvck1lc3NhZ2UocmVzdWx0KSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoWy4uLnJlc3VsdC5zdGRPdXQsIC4uLnJlc3VsdC5zdGRFcnJdKTtcbn1cbmZ1bmN0aW9uIGVycm9yRGV0ZWN0aW9uSGFuZGxlcihvdmVyd3JpdGUgPSBmYWxzZSwgaXNFcnJvciA9IGlzVGFza0Vycm9yLCBlcnJvck1lc3NhZ2UgPSBnZXRFcnJvck1lc3NhZ2UpIHtcbiAgICByZXR1cm4gKGVycm9yLCByZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKCghb3ZlcndyaXRlICYmIGVycm9yKSB8fCAhaXNFcnJvcihyZXN1bHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVycm9yTWVzc2FnZShyZXN1bHQpO1xuICAgIH07XG59XG5leHBvcnRzLmVycm9yRGV0ZWN0aW9uSGFuZGxlciA9IGVycm9yRGV0ZWN0aW9uSGFuZGxlcjtcbmZ1bmN0aW9uIGVycm9yRGV0ZWN0aW9uUGx1Z2luKGNvbmZpZykge1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICd0YXNrLmVycm9yJyxcbiAgICAgICAgYWN0aW9uKGRhdGEsIGNvbnRleHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gY29uZmlnKGRhdGEuZXJyb3IsIHtcbiAgICAgICAgICAgICAgICBzdGRFcnI6IGNvbnRleHQuc3RkRXJyLFxuICAgICAgICAgICAgICAgIHN0ZE91dDogY29udGV4dC5zdGRPdXQsXG4gICAgICAgICAgICAgICAgZXhpdENvZGU6IGNvbnRleHQuZXhpdENvZGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBlcnJvcjogbmV3IGdpdF9lcnJvcl8xLkdpdEVycm9yKHVuZGVmaW5lZCwgZXJyb3IudG9TdHJpbmcoJ3V0Zi04JykpIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGVycm9yXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgIH07XG59XG5leHBvcnRzLmVycm9yRGV0ZWN0aW9uUGx1Z2luID0gZXJyb3JEZXRlY3Rpb25QbHVnaW47XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lcnJvci1kZXRlY3Rpb24ucGx1Z2luLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5QbHVnaW5TdG9yZSA9IHZvaWQgMDtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5jbGFzcyBQbHVnaW5TdG9yZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucGx1Z2lucyA9IG5ldyBTZXQoKTtcbiAgICB9XG4gICAgYWRkKHBsdWdpbikge1xuICAgICAgICBjb25zdCBwbHVnaW5zID0gW107XG4gICAgICAgIHV0aWxzXzEuYXNBcnJheShwbHVnaW4pLmZvckVhY2gocGx1Z2luID0+IHBsdWdpbiAmJiB0aGlzLnBsdWdpbnMuYWRkKHV0aWxzXzEuYXBwZW5kKHBsdWdpbnMsIHBsdWdpbikpKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIHBsdWdpbnMuZm9yRWFjaChwbHVnaW4gPT4gdGhpcy5wbHVnaW5zLmRlbGV0ZShwbHVnaW4pKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZXhlYyh0eXBlLCBkYXRhLCBjb250ZXh0KSB7XG4gICAgICAgIGxldCBvdXRwdXQgPSBkYXRhO1xuICAgICAgICBjb25zdCBjb250ZXh0dWFsID0gT2JqZWN0LmZyZWV6ZShPYmplY3QuY3JlYXRlKGNvbnRleHQpKTtcbiAgICAgICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zKSB7XG4gICAgICAgICAgICBpZiAocGx1Z2luLnR5cGUgPT09IHR5cGUpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSBwbHVnaW4uYWN0aW9uKG91dHB1dCwgY29udGV4dHVhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9XG59XG5leHBvcnRzLlBsdWdpblN0b3JlID0gUGx1Z2luU3RvcmU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wbHVnaW4tc3RvcmUuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnByb2dyZXNzTW9uaXRvclBsdWdpbiA9IHZvaWQgMDtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5mdW5jdGlvbiBwcm9ncmVzc01vbml0b3JQbHVnaW4ocHJvZ3Jlc3MpIHtcbiAgICBjb25zdCBwcm9ncmVzc0NvbW1hbmQgPSAnLS1wcm9ncmVzcyc7XG4gICAgY29uc3QgcHJvZ3Jlc3NNZXRob2RzID0gWydjaGVja291dCcsICdjbG9uZScsICdmZXRjaCcsICdwdWxsJywgJ3B1c2gnXTtcbiAgICBjb25zdCBvblByb2dyZXNzID0ge1xuICAgICAgICB0eXBlOiAnc3Bhd24uYWZ0ZXInLFxuICAgICAgICBhY3Rpb24oX2RhdGEsIGNvbnRleHQpIHtcbiAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgIGlmICghY29udGV4dC5jb21tYW5kcy5pbmNsdWRlcyhwcm9ncmVzc0NvbW1hbmQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgKF9hID0gY29udGV4dC5zcGF3bmVkLnN0ZGVycikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm9uKCdkYXRhJywgKGNodW5rKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IC9eKFthLXpBLVogXSspOlxccyooXFxkKyklIFxcKChcXGQrKVxcLyhcXGQrKVxcKS8uZXhlYyhjaHVuay50b1N0cmluZygndXRmOCcpKTtcbiAgICAgICAgICAgICAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwcm9ncmVzcyh7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogY29udGV4dC5tZXRob2QsXG4gICAgICAgICAgICAgICAgICAgIHN0YWdlOiBwcm9ncmVzc0V2ZW50U3RhZ2UobWVzc2FnZVsxXSksXG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzOiB1dGlsc18xLmFzTnVtYmVyKG1lc3NhZ2VbMl0pLFxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWQ6IHV0aWxzXzEuYXNOdW1iZXIobWVzc2FnZVszXSksXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsOiB1dGlsc18xLmFzTnVtYmVyKG1lc3NhZ2VbNF0pLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IG9uQXJncyA9IHtcbiAgICAgICAgdHlwZTogJ3NwYXduLmFyZ3MnLFxuICAgICAgICBhY3Rpb24oYXJncywgY29udGV4dCkge1xuICAgICAgICAgICAgaWYgKCFwcm9ncmVzc01ldGhvZHMuaW5jbHVkZXMoY29udGV4dC5tZXRob2QpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFyZ3M7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdXRpbHNfMS5pbmNsdWRpbmcoYXJncywgcHJvZ3Jlc3NDb21tYW5kKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIFtvbkFyZ3MsIG9uUHJvZ3Jlc3NdO1xufVxuZXhwb3J0cy5wcm9ncmVzc01vbml0b3JQbHVnaW4gPSBwcm9ncmVzc01vbml0b3JQbHVnaW47XG5mdW5jdGlvbiBwcm9ncmVzc0V2ZW50U3RhZ2UoaW5wdXQpIHtcbiAgICByZXR1cm4gU3RyaW5nKGlucHV0LnRvTG93ZXJDYXNlKCkuc3BsaXQoJyAnLCAxKSkgfHwgJ3Vua25vd24nO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHJvZ3Jlc3MtbW9uaXRvci1wbHVnaW4uanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zaW1wbGUtZ2l0LXBsdWdpbi5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudGltZW91dFBsdWdpbiA9IHZvaWQgMDtcbmNvbnN0IGdpdF9wbHVnaW5fZXJyb3JfMSA9IHJlcXVpcmUoXCIuLi9lcnJvcnMvZ2l0LXBsdWdpbi1lcnJvclwiKTtcbmZ1bmN0aW9uIHRpbWVvdXRQbHVnaW4oeyBibG9jayB9KSB7XG4gICAgaWYgKGJsb2NrID4gMCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ3NwYXduLmFmdGVyJyxcbiAgICAgICAgICAgIGFjdGlvbihfZGF0YSwgY29udGV4dCkge1xuICAgICAgICAgICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgICAgICAgICAgbGV0IHRpbWVvdXQ7XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gd2FpdCgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGltZW91dCAmJiBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgICAgICAgICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGtpbGwsIGJsb2NrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gc3RvcCgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgICAgICAgICAgICAgKF9hID0gY29udGV4dC5zcGF3bmVkLnN0ZG91dCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm9mZignZGF0YScsIHdhaXQpO1xuICAgICAgICAgICAgICAgICAgICAoX2IgPSBjb250ZXh0LnNwYXduZWQuc3RkZXJyKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Iub2ZmKCdkYXRhJywgd2FpdCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc3Bhd25lZC5vZmYoJ2V4aXQnLCBzdG9wKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zcGF3bmVkLm9mZignY2xvc2UnLCBzdG9wKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24ga2lsbCgpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RvcCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmtpbGwobmV3IGdpdF9wbHVnaW5fZXJyb3JfMS5HaXRQbHVnaW5FcnJvcih1bmRlZmluZWQsICd0aW1lb3V0JywgYGJsb2NrIHRpbWVvdXQgcmVhY2hlZGApKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKF9hID0gY29udGV4dC5zcGF3bmVkLnN0ZG91dCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm9uKCdkYXRhJywgd2FpdCk7XG4gICAgICAgICAgICAgICAgKF9iID0gY29udGV4dC5zcGF3bmVkLnN0ZGVycikgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLm9uKCdkYXRhJywgd2FpdCk7XG4gICAgICAgICAgICAgICAgY29udGV4dC5zcGF3bmVkLm9uKCdleGl0Jywgc3RvcCk7XG4gICAgICAgICAgICAgICAgY29udGV4dC5zcGF3bmVkLm9uKCdjbG9zZScsIHN0b3ApO1xuICAgICAgICAgICAgICAgIHdhaXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG59XG5leHBvcnRzLnRpbWVvdXRQbHVnaW4gPSB0aW1lb3V0UGx1Z2luO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGltb3V0LXBsdWdpbi5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19leHBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2V4cG9ydFN0YXIpIHx8IGZ1bmN0aW9uKG0sIGV4cG9ydHMpIHtcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4cG9ydHMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0cywgbSwgcCk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2NvbW1hbmQtY29uZmlnLXByZWZpeGluZy1wbHVnaW5cIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2Vycm9yLWRldGVjdGlvbi5wbHVnaW5cIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL3BsdWdpbi1zdG9yZVwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vcHJvZ3Jlc3MtbW9uaXRvci1wbHVnaW5cIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL3NpbXBsZS1naXQtcGx1Z2luXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi90aW1vdXQtcGx1Z2luXCIpLCBleHBvcnRzKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5HaXRMb2dnZXIgPSBleHBvcnRzLmNyZWF0ZUxvZ2dlciA9IHZvaWQgMDtcbmNvbnN0IGRlYnVnXzEgPSByZXF1aXJlKFwiZGVidWdcIik7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4vdXRpbHNcIik7XG5kZWJ1Z18xLmRlZmF1bHQuZm9ybWF0dGVycy5MID0gKHZhbHVlKSA9PiBTdHJpbmcodXRpbHNfMS5maWx0ZXJIYXNMZW5ndGgodmFsdWUpID8gdmFsdWUubGVuZ3RoIDogJy0nKTtcbmRlYnVnXzEuZGVmYXVsdC5mb3JtYXR0ZXJzLkIgPSAodmFsdWUpID0+IHtcbiAgICBpZiAoQnVmZmVyLmlzQnVmZmVyKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgICB9XG4gICAgcmV0dXJuIHV0aWxzXzEub2JqZWN0VG9TdHJpbmcodmFsdWUpO1xufTtcbmZ1bmN0aW9uIGNyZWF0ZUxvZygpIHtcbiAgICByZXR1cm4gZGVidWdfMS5kZWZhdWx0KCdzaW1wbGUtZ2l0Jyk7XG59XG5mdW5jdGlvbiBwcmVmaXhlZExvZ2dlcih0bywgcHJlZml4LCBmb3J3YXJkKSB7XG4gICAgaWYgKCFwcmVmaXggfHwgIVN0cmluZyhwcmVmaXgpLnJlcGxhY2UoL1xccyovLCAnJykpIHtcbiAgICAgICAgcmV0dXJuICFmb3J3YXJkID8gdG8gOiAobWVzc2FnZSwgLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgdG8obWVzc2FnZSwgLi4uYXJncyk7XG4gICAgICAgICAgICBmb3J3YXJkKG1lc3NhZ2UsIC4uLmFyZ3MpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gKG1lc3NhZ2UsIC4uLmFyZ3MpID0+IHtcbiAgICAgICAgdG8oYCVzICR7bWVzc2FnZX1gLCBwcmVmaXgsIC4uLmFyZ3MpO1xuICAgICAgICBpZiAoZm9yd2FyZCkge1xuICAgICAgICAgICAgZm9yd2FyZChtZXNzYWdlLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5mdW5jdGlvbiBjaGlsZExvZ2dlck5hbWUobmFtZSwgY2hpbGREZWJ1Z2dlciwgeyBuYW1lc3BhY2U6IHBhcmVudE5hbWVzcGFjZSB9KSB7XG4gICAgaWYgKHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gbmFtZTtcbiAgICB9XG4gICAgY29uc3QgY2hpbGROYW1lc3BhY2UgPSBjaGlsZERlYnVnZ2VyICYmIGNoaWxkRGVidWdnZXIubmFtZXNwYWNlIHx8ICcnO1xuICAgIGlmIChjaGlsZE5hbWVzcGFjZS5zdGFydHNXaXRoKHBhcmVudE5hbWVzcGFjZSkpIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkTmFtZXNwYWNlLnN1YnN0cihwYXJlbnROYW1lc3BhY2UubGVuZ3RoICsgMSk7XG4gICAgfVxuICAgIHJldHVybiBjaGlsZE5hbWVzcGFjZSB8fCBwYXJlbnROYW1lc3BhY2U7XG59XG5mdW5jdGlvbiBjcmVhdGVMb2dnZXIobGFiZWwsIHZlcmJvc2UsIGluaXRpYWxTdGVwLCBpbmZvRGVidWdnZXIgPSBjcmVhdGVMb2coKSkge1xuICAgIGNvbnN0IGxhYmVsUHJlZml4ID0gbGFiZWwgJiYgYFske2xhYmVsfV1gIHx8ICcnO1xuICAgIGNvbnN0IHNwYXduZWQgPSBbXTtcbiAgICBjb25zdCBkZWJ1Z0RlYnVnZ2VyID0gKHR5cGVvZiB2ZXJib3NlID09PSAnc3RyaW5nJykgPyBpbmZvRGVidWdnZXIuZXh0ZW5kKHZlcmJvc2UpIDogdmVyYm9zZTtcbiAgICBjb25zdCBrZXkgPSBjaGlsZExvZ2dlck5hbWUodXRpbHNfMS5maWx0ZXJUeXBlKHZlcmJvc2UsIHV0aWxzXzEuZmlsdGVyU3RyaW5nKSwgZGVidWdEZWJ1Z2dlciwgaW5mb0RlYnVnZ2VyKTtcbiAgICByZXR1cm4gc3RlcChpbml0aWFsU3RlcCk7XG4gICAgZnVuY3Rpb24gc2libGluZyhuYW1lLCBpbml0aWFsKSB7XG4gICAgICAgIHJldHVybiB1dGlsc18xLmFwcGVuZChzcGF3bmVkLCBjcmVhdGVMb2dnZXIobGFiZWwsIGtleS5yZXBsYWNlKC9eW146XSsvLCBuYW1lKSwgaW5pdGlhbCwgaW5mb0RlYnVnZ2VyKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0ZXAocGhhc2UpIHtcbiAgICAgICAgY29uc3Qgc3RlcFByZWZpeCA9IHBoYXNlICYmIGBbJHtwaGFzZX1dYCB8fCAnJztcbiAgICAgICAgY29uc3QgZGVidWcgPSBkZWJ1Z0RlYnVnZ2VyICYmIHByZWZpeGVkTG9nZ2VyKGRlYnVnRGVidWdnZXIsIHN0ZXBQcmVmaXgpIHx8IHV0aWxzXzEuTk9PUDtcbiAgICAgICAgY29uc3QgaW5mbyA9IHByZWZpeGVkTG9nZ2VyKGluZm9EZWJ1Z2dlciwgYCR7bGFiZWxQcmVmaXh9ICR7c3RlcFByZWZpeH1gLCBkZWJ1Zyk7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGRlYnVnRGVidWdnZXIgPyBkZWJ1ZyA6IGluZm8sIHtcbiAgICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgICAgc2libGluZyxcbiAgICAgICAgICAgIGluZm8sXG4gICAgICAgICAgICBzdGVwLFxuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLmNyZWF0ZUxvZ2dlciA9IGNyZWF0ZUxvZ2dlcjtcbi8qKlxuICogVGhlIGBHaXRMb2dnZXJgIGlzIHVzZWQgYnkgdGhlIG1haW4gYFNpbXBsZUdpdGAgcnVubmVyIHRvIGhhbmRsZSBsb2dnaW5nXG4gKiBhbnkgd2FybmluZ3Mgb3IgZXJyb3JzLlxuICovXG5jbGFzcyBHaXRMb2dnZXIge1xuICAgIGNvbnN0cnVjdG9yKF9vdXQgPSBjcmVhdGVMb2coKSkge1xuICAgICAgICB0aGlzLl9vdXQgPSBfb3V0O1xuICAgICAgICB0aGlzLmVycm9yID0gcHJlZml4ZWRMb2dnZXIoX291dCwgJ1tFUlJPUl0nKTtcbiAgICAgICAgdGhpcy53YXJuID0gcHJlZml4ZWRMb2dnZXIoX291dCwgJ1tXQVJOXScpO1xuICAgIH1cbiAgICBzaWxlbnQoc2lsZW5jZSA9IGZhbHNlKSB7XG4gICAgICAgIGlmIChzaWxlbmNlICE9PSB0aGlzLl9vdXQuZW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgbmFtZXNwYWNlIH0gPSB0aGlzLl9vdXQ7XG4gICAgICAgIGNvbnN0IGVudiA9IChwcm9jZXNzLmVudi5ERUJVRyB8fCAnJykuc3BsaXQoJywnKS5maWx0ZXIocyA9PiAhIXMpO1xuICAgICAgICBjb25zdCBoYXNPbiA9IGVudi5pbmNsdWRlcyhuYW1lc3BhY2UpO1xuICAgICAgICBjb25zdCBoYXNPZmYgPSBlbnYuaW5jbHVkZXMoYC0ke25hbWVzcGFjZX1gKTtcbiAgICAgICAgLy8gZW5hYmxpbmcgdGhlIGxvZ1xuICAgICAgICBpZiAoIXNpbGVuY2UpIHtcbiAgICAgICAgICAgIGlmIChoYXNPZmYpIHtcbiAgICAgICAgICAgICAgICB1dGlsc18xLnJlbW92ZShlbnYsIGAtJHtuYW1lc3BhY2V9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbnYucHVzaChuYW1lc3BhY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGhhc09uKSB7XG4gICAgICAgICAgICAgICAgdXRpbHNfMS5yZW1vdmUoZW52LCBuYW1lc3BhY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZW52LnB1c2goYC0ke25hbWVzcGFjZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkZWJ1Z18xLmRlZmF1bHQuZW5hYmxlKGVudi5qb2luKCcsJykpO1xuICAgIH1cbn1cbmV4cG9ydHMuR2l0TG9nZ2VyID0gR2l0TG9nZ2VyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2l0LWxvZ2dlci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuVGFza3NQZW5kaW5nUXVldWUgPSB2b2lkIDA7XG5jb25zdCBnaXRfZXJyb3JfMSA9IHJlcXVpcmUoXCIuLi9lcnJvcnMvZ2l0LWVycm9yXCIpO1xuY29uc3QgZ2l0X2xvZ2dlcl8xID0gcmVxdWlyZShcIi4uL2dpdC1sb2dnZXJcIik7XG5jbGFzcyBUYXNrc1BlbmRpbmdRdWV1ZSB7XG4gICAgY29uc3RydWN0b3IobG9nTGFiZWwgPSAnR2l0RXhlY3V0b3InKSB7XG4gICAgICAgIHRoaXMubG9nTGFiZWwgPSBsb2dMYWJlbDtcbiAgICAgICAgdGhpcy5fcXVldWUgPSBuZXcgTWFwKCk7XG4gICAgfVxuICAgIHdpdGhQcm9ncmVzcyh0YXNrKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9xdWV1ZS5nZXQodGFzayk7XG4gICAgfVxuICAgIGNyZWF0ZVByb2dyZXNzKHRhc2spIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IFRhc2tzUGVuZGluZ1F1ZXVlLmdldE5hbWUodGFzay5jb21tYW5kc1swXSk7XG4gICAgICAgIGNvbnN0IGxvZ2dlciA9IGdpdF9sb2dnZXJfMS5jcmVhdGVMb2dnZXIodGhpcy5sb2dMYWJlbCwgbmFtZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0YXNrLFxuICAgICAgICAgICAgbG9nZ2VyLFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVzaCh0YXNrKSB7XG4gICAgICAgIGNvbnN0IHByb2dyZXNzID0gdGhpcy5jcmVhdGVQcm9ncmVzcyh0YXNrKTtcbiAgICAgICAgcHJvZ3Jlc3MubG9nZ2VyKCdBZGRpbmcgdGFzayB0byB0aGUgcXVldWUsIGNvbW1hbmRzID0gJW8nLCB0YXNrLmNvbW1hbmRzKTtcbiAgICAgICAgdGhpcy5fcXVldWUuc2V0KHRhc2ssIHByb2dyZXNzKTtcbiAgICAgICAgcmV0dXJuIHByb2dyZXNzO1xuICAgIH1cbiAgICBmYXRhbChlcnIpIHtcbiAgICAgICAgZm9yIChjb25zdCBbdGFzaywgeyBsb2dnZXIgfV0gb2YgQXJyYXkuZnJvbSh0aGlzLl9xdWV1ZS5lbnRyaWVzKCkpKSB7XG4gICAgICAgICAgICBpZiAodGFzayA9PT0gZXJyLnRhc2spIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgRmFpbGVkICVvYCwgZXJyKTtcbiAgICAgICAgICAgICAgICBsb2dnZXIoYEZhdGFsIGV4Y2VwdGlvbiwgYW55IGFzLXlldCB1bi1zdGFydGVkIHRhc2tzIHJ1biB0aHJvdWdoIHRoaXMgZXhlY3V0b3Igd2lsbCBub3QgYmUgYXR0ZW1wdGVkYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgQSBmYXRhbCBleGNlcHRpb24gb2NjdXJyZWQgaW4gYSBwcmV2aW91cyB0YXNrLCB0aGUgcXVldWUgaGFzIGJlZW4gcHVyZ2VkOiAlb2AsIGVyci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29tcGxldGUodGFzayk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3F1ZXVlLnNpemUgIT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUXVldWUgc2l6ZSBzaG91bGQgYmUgemVybyBhZnRlciBmYXRhbDogJHt0aGlzLl9xdWV1ZS5zaXplfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbXBsZXRlKHRhc2spIHtcbiAgICAgICAgY29uc3QgcHJvZ3Jlc3MgPSB0aGlzLndpdGhQcm9ncmVzcyh0YXNrKTtcbiAgICAgICAgaWYgKHByb2dyZXNzKSB7XG4gICAgICAgICAgICB0aGlzLl9xdWV1ZS5kZWxldGUodGFzayk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXR0ZW1wdCh0YXNrKSB7XG4gICAgICAgIGNvbnN0IHByb2dyZXNzID0gdGhpcy53aXRoUHJvZ3Jlc3ModGFzayk7XG4gICAgICAgIGlmICghcHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBnaXRfZXJyb3JfMS5HaXRFcnJvcih1bmRlZmluZWQsICdUYXNrc1BlbmRpbmdRdWV1ZTogYXR0ZW1wdCBjYWxsZWQgZm9yIGFuIHVua25vd24gdGFzaycpO1xuICAgICAgICB9XG4gICAgICAgIHByb2dyZXNzLmxvZ2dlcignU3RhcnRpbmcgdGFzaycpO1xuICAgICAgICByZXR1cm4gcHJvZ3Jlc3M7XG4gICAgfVxuICAgIHN0YXRpYyBnZXROYW1lKG5hbWUgPSAnZW1wdHknKSB7XG4gICAgICAgIHJldHVybiBgdGFzazoke25hbWV9OiR7KytUYXNrc1BlbmRpbmdRdWV1ZS5jb3VudGVyfWA7XG4gICAgfVxufVxuZXhwb3J0cy5UYXNrc1BlbmRpbmdRdWV1ZSA9IFRhc2tzUGVuZGluZ1F1ZXVlO1xuVGFza3NQZW5kaW5nUXVldWUuY291bnRlciA9IDA7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10YXNrcy1wZW5kaW5nLXF1ZXVlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkdpdEV4ZWN1dG9yQ2hhaW4gPSB2b2lkIDA7XG5jb25zdCBjaGlsZF9wcm9jZXNzXzEgPSByZXF1aXJlKFwiY2hpbGRfcHJvY2Vzc1wiKTtcbmNvbnN0IGdpdF9lcnJvcl8xID0gcmVxdWlyZShcIi4uL2Vycm9ycy9naXQtZXJyb3JcIik7XG5jb25zdCB0YXNrXzEgPSByZXF1aXJlKFwiLi4vdGFza3MvdGFza1wiKTtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5jb25zdCB0YXNrc19wZW5kaW5nX3F1ZXVlXzEgPSByZXF1aXJlKFwiLi90YXNrcy1wZW5kaW5nLXF1ZXVlXCIpO1xuY2xhc3MgR2l0RXhlY3V0b3JDaGFpbiB7XG4gICAgY29uc3RydWN0b3IoX2V4ZWN1dG9yLCBfc2NoZWR1bGVyLCBfcGx1Z2lucykge1xuICAgICAgICB0aGlzLl9leGVjdXRvciA9IF9leGVjdXRvcjtcbiAgICAgICAgdGhpcy5fc2NoZWR1bGVyID0gX3NjaGVkdWxlcjtcbiAgICAgICAgdGhpcy5fcGx1Z2lucyA9IF9wbHVnaW5zO1xuICAgICAgICB0aGlzLl9jaGFpbiA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB0aGlzLl9xdWV1ZSA9IG5ldyB0YXNrc19wZW5kaW5nX3F1ZXVlXzEuVGFza3NQZW5kaW5nUXVldWUoKTtcbiAgICB9XG4gICAgZ2V0IGJpbmFyeSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4ZWN1dG9yLmJpbmFyeTtcbiAgICB9XG4gICAgZ2V0IGN3ZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4ZWN1dG9yLmN3ZDtcbiAgICB9XG4gICAgZ2V0IGVudigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4ZWN1dG9yLmVudjtcbiAgICB9XG4gICAgZ2V0IG91dHB1dEhhbmRsZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9leGVjdXRvci5vdXRwdXRIYW5kbGVyO1xuICAgIH1cbiAgICBjaGFpbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHB1c2godGFzaykge1xuICAgICAgICB0aGlzLl9xdWV1ZS5wdXNoKHRhc2spO1xuICAgICAgICByZXR1cm4gdGhpcy5fY2hhaW4gPSB0aGlzLl9jaGFpbi50aGVuKCgpID0+IHRoaXMuYXR0ZW1wdFRhc2sodGFzaykpO1xuICAgIH1cbiAgICBhdHRlbXB0VGFzayh0YXNrKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBvblNjaGVkdWxlQ29tcGxldGUgPSB5aWVsZCB0aGlzLl9zY2hlZHVsZXIubmV4dCgpO1xuICAgICAgICAgICAgY29uc3Qgb25RdWV1ZUNvbXBsZXRlID0gKCkgPT4gdGhpcy5fcXVldWUuY29tcGxldGUodGFzayk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgbG9nZ2VyIH0gPSB0aGlzLl9xdWV1ZS5hdHRlbXB0KHRhc2spO1xuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCAodGFza18xLmlzRW1wdHlUYXNrKHRhc2spXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5hdHRlbXB0RW1wdHlUYXNrKHRhc2ssIGxvZ2dlcilcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmF0dGVtcHRSZW1vdGVUYXNrKHRhc2ssIGxvZ2dlcikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyB0aGlzLm9uRmF0YWxFeGNlcHRpb24odGFzaywgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBvblF1ZXVlQ29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICBvblNjaGVkdWxlQ29tcGxldGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG9uRmF0YWxFeGNlcHRpb24odGFzaywgZSkge1xuICAgICAgICBjb25zdCBnaXRFcnJvciA9IChlIGluc3RhbmNlb2YgZ2l0X2Vycm9yXzEuR2l0RXJyb3IpID8gT2JqZWN0LmFzc2lnbihlLCB7IHRhc2sgfSkgOiBuZXcgZ2l0X2Vycm9yXzEuR2l0RXJyb3IodGFzaywgZSAmJiBTdHJpbmcoZSkpO1xuICAgICAgICB0aGlzLl9jaGFpbiA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB0aGlzLl9xdWV1ZS5mYXRhbChnaXRFcnJvcik7XG4gICAgICAgIHJldHVybiBnaXRFcnJvcjtcbiAgICB9XG4gICAgYXR0ZW1wdFJlbW90ZVRhc2sodGFzaywgbG9nZ2VyKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBhcmdzID0gdGhpcy5fcGx1Z2lucy5leGVjKCdzcGF3bi5hcmdzJywgWy4uLnRhc2suY29tbWFuZHNdLCBwbHVnaW5Db250ZXh0KHRhc2ssIHRhc2suY29tbWFuZHMpKTtcbiAgICAgICAgICAgIGNvbnN0IHJhdyA9IHlpZWxkIHRoaXMuZ2l0UmVzcG9uc2UodGFzaywgdGhpcy5iaW5hcnksIGFyZ3MsIHRoaXMub3V0cHV0SGFuZGxlciwgbG9nZ2VyLnN0ZXAoJ1NQQVdOJykpO1xuICAgICAgICAgICAgY29uc3Qgb3V0cHV0U3RyZWFtcyA9IHlpZWxkIHRoaXMuaGFuZGxlVGFza0RhdGEodGFzaywgYXJncywgcmF3LCBsb2dnZXIuc3RlcCgnSEFORExFJykpO1xuICAgICAgICAgICAgbG9nZ2VyKGBwYXNzaW5nIHJlc3BvbnNlIHRvIHRhc2sncyBwYXJzZXIgYXMgYSAlc2AsIHRhc2suZm9ybWF0KTtcbiAgICAgICAgICAgIGlmICh0YXNrXzEuaXNCdWZmZXJUYXNrKHRhc2spKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHV0aWxzXzEuY2FsbFRhc2tQYXJzZXIodGFzay5wYXJzZXIsIG91dHB1dFN0cmVhbXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHV0aWxzXzEuY2FsbFRhc2tQYXJzZXIodGFzay5wYXJzZXIsIG91dHB1dFN0cmVhbXMuYXNTdHJpbmdzKCkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXR0ZW1wdEVtcHR5VGFzayh0YXNrLCBsb2dnZXIpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGxvZ2dlcihgZW1wdHkgdGFzayBieXBhc3NpbmcgY2hpbGQgcHJvY2VzcyB0byBjYWxsIHRvIHRhc2sncyBwYXJzZXJgKTtcbiAgICAgICAgICAgIHJldHVybiB0YXNrLnBhcnNlcigpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgaGFuZGxlVGFza0RhdGEodGFzaywgYXJncywgcmVzdWx0LCBsb2dnZXIpIHtcbiAgICAgICAgY29uc3QgeyBleGl0Q29kZSwgcmVqZWN0aW9uLCBzdGRPdXQsIHN0ZEVyciB9ID0gcmVzdWx0O1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKGRvbmUsIGZhaWwpID0+IHtcbiAgICAgICAgICAgIGxvZ2dlcihgUHJlcGFyaW5nIHRvIGhhbmRsZSBwcm9jZXNzIHJlc3BvbnNlIGV4aXRDb2RlPSVkIHN0ZE91dD1gLCBleGl0Q29kZSk7XG4gICAgICAgICAgICBjb25zdCB7IGVycm9yIH0gPSB0aGlzLl9wbHVnaW5zLmV4ZWMoJ3Rhc2suZXJyb3InLCB7IGVycm9yOiByZWplY3Rpb24gfSwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwbHVnaW5Db250ZXh0KHRhc2ssIGFyZ3MpKSwgcmVzdWx0KSk7XG4gICAgICAgICAgICBpZiAoZXJyb3IgJiYgdGFzay5vbkVycm9yKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYGV4aXRDb2RlPSVzIGhhbmRsaW5nIHdpdGggY3VzdG9tIGVycm9yIGhhbmRsZXJgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFzay5vbkVycm9yKHJlc3VsdCwgZXJyb3IsIChuZXdTdGRPdXQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYGN1c3RvbSBlcnJvciBoYW5kbGVyIHRyZWF0ZWQgYXMgc3VjY2Vzc2ApO1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIoYGN1c3RvbSBlcnJvciByZXR1cm5lZCBhICVzYCwgdXRpbHNfMS5vYmplY3RUb1N0cmluZyhuZXdTdGRPdXQpKTtcbiAgICAgICAgICAgICAgICAgICAgZG9uZShuZXcgdXRpbHNfMS5HaXRPdXRwdXRTdHJlYW1zKEFycmF5LmlzQXJyYXkobmV3U3RkT3V0KSA/IEJ1ZmZlci5jb25jYXQobmV3U3RkT3V0KSA6IG5ld1N0ZE91dCwgQnVmZmVyLmNvbmNhdChzdGRFcnIpKSk7XG4gICAgICAgICAgICAgICAgfSwgZmFpbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgaGFuZGxpbmcgYXMgZXJyb3I6IGV4aXRDb2RlPSVzIHN0ZEVycj0lcyByZWplY3Rpb249JW9gLCBleGl0Q29kZSwgc3RkRXJyLmxlbmd0aCwgcmVqZWN0aW9uKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgcmV0cmlldmluZyB0YXNrIG91dHB1dCBjb21wbGV0ZWApO1xuICAgICAgICAgICAgZG9uZShuZXcgdXRpbHNfMS5HaXRPdXRwdXRTdHJlYW1zKEJ1ZmZlci5jb25jYXQoc3RkT3V0KSwgQnVmZmVyLmNvbmNhdChzdGRFcnIpKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnaXRSZXNwb25zZSh0YXNrLCBjb21tYW5kLCBhcmdzLCBvdXRwdXRIYW5kbGVyLCBsb2dnZXIpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dExvZ2dlciA9IGxvZ2dlci5zaWJsaW5nKCdvdXRwdXQnKTtcbiAgICAgICAgICAgIGNvbnN0IHNwYXduT3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICBjd2Q6IHRoaXMuY3dkLFxuICAgICAgICAgICAgICAgIGVudjogdGhpcy5lbnYsXG4gICAgICAgICAgICAgICAgd2luZG93c0hpZGU6IHRydWUsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChkb25lKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RkT3V0ID0gW107XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RkRXJyID0gW107XG4gICAgICAgICAgICAgICAgbGV0IGF0dGVtcHRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGxldCByZWplY3Rpb247XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gYXR0ZW1wdENsb3NlKGV4aXRDb2RlLCBldmVudCA9ICdyZXRyeScpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2xvc2luZyB3aGVuIHRoZXJlIGlzIGNvbnRlbnQsIHRlcm1pbmF0ZSBpbW1lZGlhdGVseVxuICAgICAgICAgICAgICAgICAgICBpZiAoYXR0ZW1wdGVkIHx8IHN0ZEVyci5sZW5ndGggfHwgc3RkT3V0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYGV4aXRDb2RlPSVzIGV2ZW50PSVzIHJlamVjdGlvbj0lb2AsIGV4aXRDb2RlLCBldmVudCwgcmVqZWN0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZE91dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRFcnIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdENvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRlbXB0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IGF0dGVtcHQgYXQgY2xvc2luZyBidXQgbm8gY29udGVudCB5ZXQsIHdhaXQgYnJpZWZseSBmb3IgdGhlIGNsb3NlL2V4aXQgdGhhdCBtYXkgZm9sbG93XG4gICAgICAgICAgICAgICAgICAgIGlmICghYXR0ZW1wdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRlbXB0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiBhdHRlbXB0Q2xvc2UoZXhpdENvZGUsICdkZWZlcnJlZCcpLCA1MCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIoJ3JlY2VpdmVkICVzIGV2ZW50IGJlZm9yZSBjb250ZW50IG9uIHN0ZE91dC9zdGRFcnInLCBldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYCVzICVvYCwgY29tbWFuZCwgYXJncyk7XG4gICAgICAgICAgICAgICAgbG9nZ2VyKCclTycsIHNwYXduT3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3Bhd25lZCA9IGNoaWxkX3Byb2Nlc3NfMS5zcGF3bihjb21tYW5kLCBhcmdzLCBzcGF3bk9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIHNwYXduZWQuc3Rkb3V0Lm9uKCdkYXRhJywgb25EYXRhUmVjZWl2ZWQoc3RkT3V0LCAnc3RkT3V0JywgbG9nZ2VyLCBvdXRwdXRMb2dnZXIuc3RlcCgnc3RkT3V0JykpKTtcbiAgICAgICAgICAgICAgICBzcGF3bmVkLnN0ZGVyci5vbignZGF0YScsIG9uRGF0YVJlY2VpdmVkKHN0ZEVyciwgJ3N0ZEVycicsIGxvZ2dlciwgb3V0cHV0TG9nZ2VyLnN0ZXAoJ3N0ZEVycicpKSk7XG4gICAgICAgICAgICAgICAgc3Bhd25lZC5vbignZXJyb3InLCBvbkVycm9yUmVjZWl2ZWQoc3RkRXJyLCBsb2dnZXIpKTtcbiAgICAgICAgICAgICAgICBzcGF3bmVkLm9uKCdjbG9zZScsIChjb2RlKSA9PiBhdHRlbXB0Q2xvc2UoY29kZSwgJ2Nsb3NlJykpO1xuICAgICAgICAgICAgICAgIHNwYXduZWQub24oJ2V4aXQnLCAoY29kZSkgPT4gYXR0ZW1wdENsb3NlKGNvZGUsICdleGl0JykpO1xuICAgICAgICAgICAgICAgIGlmIChvdXRwdXRIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlcihgUGFzc2luZyBjaGlsZCBwcm9jZXNzIHN0ZE91dC9zdGRFcnIgdG8gY3VzdG9tIG91dHB1dEhhbmRsZXJgKTtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0SGFuZGxlcihjb21tYW5kLCBzcGF3bmVkLnN0ZG91dCwgc3Bhd25lZC5zdGRlcnIsIFsuLi5hcmdzXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX3BsdWdpbnMuZXhlYygnc3Bhd24uYWZ0ZXInLCB1bmRlZmluZWQsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcGx1Z2luQ29udGV4dCh0YXNrLCBhcmdzKSksIHsgc3Bhd25lZCwga2lsbChyZWFzb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcGF3bmVkLmtpbGxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdGlvbiA9IHJlYXNvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwYXduZWQua2lsbCgnU0lHSU5UJyk7XG4gICAgICAgICAgICAgICAgICAgIH0gfSkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydHMuR2l0RXhlY3V0b3JDaGFpbiA9IEdpdEV4ZWN1dG9yQ2hhaW47XG5mdW5jdGlvbiBwbHVnaW5Db250ZXh0KHRhc2ssIGNvbW1hbmRzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbWV0aG9kOiB1dGlsc18xLmZpcnN0KHRhc2suY29tbWFuZHMpIHx8ICcnLFxuICAgICAgICBjb21tYW5kcyxcbiAgICB9O1xufVxuZnVuY3Rpb24gb25FcnJvclJlY2VpdmVkKHRhcmdldCwgbG9nZ2VyKSB7XG4gICAgcmV0dXJuIChlcnIpID0+IHtcbiAgICAgICAgbG9nZ2VyKGBbRVJST1JdIGNoaWxkIHByb2Nlc3MgZXhjZXB0aW9uICVvYCwgZXJyKTtcbiAgICAgICAgdGFyZ2V0LnB1c2goQnVmZmVyLmZyb20oU3RyaW5nKGVyci5zdGFjayksICdhc2NpaScpKTtcbiAgICB9O1xufVxuZnVuY3Rpb24gb25EYXRhUmVjZWl2ZWQodGFyZ2V0LCBuYW1lLCBsb2dnZXIsIG91dHB1dCkge1xuICAgIHJldHVybiAoYnVmZmVyKSA9PiB7XG4gICAgICAgIGxvZ2dlcihgJXMgcmVjZWl2ZWQgJUwgYnl0ZXNgLCBuYW1lLCBidWZmZXIpO1xuICAgICAgICBvdXRwdXQoYCVCYCwgYnVmZmVyKTtcbiAgICAgICAgdGFyZ2V0LnB1c2goYnVmZmVyKTtcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2l0LWV4ZWN1dG9yLWNoYWluLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5HaXRFeGVjdXRvciA9IHZvaWQgMDtcbmNvbnN0IGdpdF9leGVjdXRvcl9jaGFpbl8xID0gcmVxdWlyZShcIi4vZ2l0LWV4ZWN1dG9yLWNoYWluXCIpO1xuY2xhc3MgR2l0RXhlY3V0b3Ige1xuICAgIGNvbnN0cnVjdG9yKGJpbmFyeSA9ICdnaXQnLCBjd2QsIF9zY2hlZHVsZXIsIF9wbHVnaW5zKSB7XG4gICAgICAgIHRoaXMuYmluYXJ5ID0gYmluYXJ5O1xuICAgICAgICB0aGlzLmN3ZCA9IGN3ZDtcbiAgICAgICAgdGhpcy5fc2NoZWR1bGVyID0gX3NjaGVkdWxlcjtcbiAgICAgICAgdGhpcy5fcGx1Z2lucyA9IF9wbHVnaW5zO1xuICAgICAgICB0aGlzLl9jaGFpbiA9IG5ldyBnaXRfZXhlY3V0b3JfY2hhaW5fMS5HaXRFeGVjdXRvckNoYWluKHRoaXMsIHRoaXMuX3NjaGVkdWxlciwgdGhpcy5fcGx1Z2lucyk7XG4gICAgfVxuICAgIGNoYWluKCkge1xuICAgICAgICByZXR1cm4gbmV3IGdpdF9leGVjdXRvcl9jaGFpbl8xLkdpdEV4ZWN1dG9yQ2hhaW4odGhpcywgdGhpcy5fc2NoZWR1bGVyLCB0aGlzLl9wbHVnaW5zKTtcbiAgICB9XG4gICAgcHVzaCh0YXNrKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jaGFpbi5wdXNoKHRhc2spO1xuICAgIH1cbn1cbmV4cG9ydHMuR2l0RXhlY3V0b3IgPSBHaXRFeGVjdXRvcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdpdC1leGVjdXRvci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudGFza0NhbGxiYWNrID0gdm9pZCAwO1xuY29uc3QgZ2l0X3Jlc3BvbnNlX2Vycm9yXzEgPSByZXF1aXJlKFwiLi9lcnJvcnMvZ2l0LXJlc3BvbnNlLWVycm9yXCIpO1xuY29uc3QgdXRpbHNfMSA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpO1xuZnVuY3Rpb24gdGFza0NhbGxiYWNrKHRhc2ssIHJlc3BvbnNlLCBjYWxsYmFjayA9IHV0aWxzXzEuTk9PUCkge1xuICAgIGNvbnN0IG9uU3VjY2VzcyA9IChkYXRhKSA9PiB7XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIGRhdGEpO1xuICAgIH07XG4gICAgY29uc3Qgb25FcnJvciA9IChlcnIpID0+IHtcbiAgICAgICAgaWYgKChlcnIgPT09IG51bGwgfHwgZXJyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnIudGFzaykgPT09IHRhc2spIHtcbiAgICAgICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBnaXRfcmVzcG9uc2VfZXJyb3JfMS5HaXRSZXNwb25zZUVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGFkZERlcHJlY2F0aW9uTm90aWNlVG9FcnJvcihlcnIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJlc3BvbnNlLnRoZW4ob25TdWNjZXNzLCBvbkVycm9yKTtcbn1cbmV4cG9ydHMudGFza0NhbGxiYWNrID0gdGFza0NhbGxiYWNrO1xuZnVuY3Rpb24gYWRkRGVwcmVjYXRpb25Ob3RpY2VUb0Vycm9yKGVycikge1xuICAgIGxldCBsb2cgPSAobmFtZSkgPT4ge1xuICAgICAgICBjb25zb2xlLndhcm4oYHNpbXBsZS1naXQgZGVwcmVjYXRpb24gbm90aWNlOiBhY2Nlc3NpbmcgR2l0UmVzcG9uc2VFcnJvci4ke25hbWV9IHNob3VsZCBiZSBHaXRSZXNwb25zZUVycm9yLmdpdC4ke25hbWV9LCB0aGlzIHdpbGwgbm8gbG9uZ2VyIGJlIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDNgKTtcbiAgICAgICAgbG9nID0gdXRpbHNfMS5OT09QO1xuICAgIH07XG4gICAgcmV0dXJuIE9iamVjdC5jcmVhdGUoZXJyLCBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlcnIuZ2l0KS5yZWR1Y2UoZGVzY3JpcHRvclJlZHVjZXIsIHt9KSk7XG4gICAgZnVuY3Rpb24gZGVzY3JpcHRvclJlZHVjZXIoYWxsLCBuYW1lKSB7XG4gICAgICAgIGlmIChuYW1lIGluIGVycikge1xuICAgICAgICAgICAgcmV0dXJuIGFsbDtcbiAgICAgICAgfVxuICAgICAgICBhbGxbbmFtZV0gPSB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICAgICAgbG9nKG5hbWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlcnIuZ2l0W25hbWVdO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGFsbDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD10YXNrLWNhbGxiYWNrLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5yZW1vdGVNZXNzYWdlc09iamVjdFBhcnNlcnMgPSB2b2lkIDA7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xuZnVuY3Rpb24gb2JqZWN0RW51bWVyYXRpb25SZXN1bHQocmVtb3RlTWVzc2FnZXMpIHtcbiAgICByZXR1cm4gKHJlbW90ZU1lc3NhZ2VzLm9iamVjdHMgPSByZW1vdGVNZXNzYWdlcy5vYmplY3RzIHx8IHtcbiAgICAgICAgY29tcHJlc3Npbmc6IDAsXG4gICAgICAgIGNvdW50aW5nOiAwLFxuICAgICAgICBlbnVtZXJhdGluZzogMCxcbiAgICAgICAgcGFja1JldXNlZDogMCxcbiAgICAgICAgcmV1c2VkOiB7IGNvdW50OiAwLCBkZWx0YTogMCB9LFxuICAgICAgICB0b3RhbDogeyBjb3VudDogMCwgZGVsdGE6IDAgfVxuICAgIH0pO1xufVxuZnVuY3Rpb24gYXNPYmplY3RDb3VudChzb3VyY2UpIHtcbiAgICBjb25zdCBjb3VudCA9IC9eXFxzKihcXGQrKS8uZXhlYyhzb3VyY2UpO1xuICAgIGNvbnN0IGRlbHRhID0gL2RlbHRhIChcXGQrKS9pLmV4ZWMoc291cmNlKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBjb3VudDogdXRpbHNfMS5hc051bWJlcihjb3VudCAmJiBjb3VudFsxXSB8fCAnMCcpLFxuICAgICAgICBkZWx0YTogdXRpbHNfMS5hc051bWJlcihkZWx0YSAmJiBkZWx0YVsxXSB8fCAnMCcpLFxuICAgIH07XG59XG5leHBvcnRzLnJlbW90ZU1lc3NhZ2VzT2JqZWN0UGFyc2VycyA9IFtcbiAgICBuZXcgdXRpbHNfMS5SZW1vdGVMaW5lUGFyc2VyKC9ecmVtb3RlOlxccyooZW51bWVyYXRpbmd8Y291bnRpbmd8Y29tcHJlc3NpbmcpIG9iamVjdHM6IChcXGQrKSwvaSwgKHJlc3VsdCwgW2FjdGlvbiwgY291bnRdKSA9PiB7XG4gICAgICAgIGNvbnN0IGtleSA9IGFjdGlvbi50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCBlbnVtZXJhdGlvbiA9IG9iamVjdEVudW1lcmF0aW9uUmVzdWx0KHJlc3VsdC5yZW1vdGVNZXNzYWdlcyk7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oZW51bWVyYXRpb24sIHsgW2tleV06IHV0aWxzXzEuYXNOdW1iZXIoY291bnQpIH0pO1xuICAgIH0pLFxuICAgIG5ldyB1dGlsc18xLlJlbW90ZUxpbmVQYXJzZXIoL15yZW1vdGU6XFxzKihlbnVtZXJhdGluZ3xjb3VudGluZ3xjb21wcmVzc2luZykgb2JqZWN0czogXFxkKyUgXFwoXFxkK1xcLyhcXGQrKVxcKSwvaSwgKHJlc3VsdCwgW2FjdGlvbiwgY291bnRdKSA9PiB7XG4gICAgICAgIGNvbnN0IGtleSA9IGFjdGlvbi50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCBlbnVtZXJhdGlvbiA9IG9iamVjdEVudW1lcmF0aW9uUmVzdWx0KHJlc3VsdC5yZW1vdGVNZXNzYWdlcyk7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oZW51bWVyYXRpb24sIHsgW2tleV06IHV0aWxzXzEuYXNOdW1iZXIoY291bnQpIH0pO1xuICAgIH0pLFxuICAgIG5ldyB1dGlsc18xLlJlbW90ZUxpbmVQYXJzZXIoL3RvdGFsIChbXixdKyksIHJldXNlZCAoW14sXSspLCBwYWNrLXJldXNlZCAoXFxkKykvaSwgKHJlc3VsdCwgW3RvdGFsLCByZXVzZWQsIHBhY2tSZXVzZWRdKSA9PiB7XG4gICAgICAgIGNvbnN0IG9iamVjdHMgPSBvYmplY3RFbnVtZXJhdGlvblJlc3VsdChyZXN1bHQucmVtb3RlTWVzc2FnZXMpO1xuICAgICAgICBvYmplY3RzLnRvdGFsID0gYXNPYmplY3RDb3VudCh0b3RhbCk7XG4gICAgICAgIG9iamVjdHMucmV1c2VkID0gYXNPYmplY3RDb3VudChyZXVzZWQpO1xuICAgICAgICBvYmplY3RzLnBhY2tSZXVzZWQgPSB1dGlsc18xLmFzTnVtYmVyKHBhY2tSZXVzZWQpO1xuICAgIH0pLFxuXTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBhcnNlLXJlbW90ZS1vYmplY3RzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5SZW1vdGVNZXNzYWdlU3VtbWFyeSA9IGV4cG9ydHMucGFyc2VSZW1vdGVNZXNzYWdlcyA9IHZvaWQgMDtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5jb25zdCBwYXJzZV9yZW1vdGVfb2JqZWN0c18xID0gcmVxdWlyZShcIi4vcGFyc2UtcmVtb3RlLW9iamVjdHNcIik7XG5jb25zdCBwYXJzZXJzID0gW1xuICAgIG5ldyB1dGlsc18xLlJlbW90ZUxpbmVQYXJzZXIoL15yZW1vdGU6XFxzKiguKykkLywgKHJlc3VsdCwgW3RleHRdKSA9PiB7XG4gICAgICAgIHJlc3VsdC5yZW1vdGVNZXNzYWdlcy5hbGwucHVzaCh0ZXh0LnRyaW0oKSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KSxcbiAgICAuLi5wYXJzZV9yZW1vdGVfb2JqZWN0c18xLnJlbW90ZU1lc3NhZ2VzT2JqZWN0UGFyc2VycyxcbiAgICBuZXcgdXRpbHNfMS5SZW1vdGVMaW5lUGFyc2VyKFsvY3JlYXRlIGEgKD86cHVsbHxtZXJnZSkgcmVxdWVzdC9pLCAvXFxzKGh0dHBzPzpcXC9cXC9cXFMrKSQvXSwgKHJlc3VsdCwgW3B1bGxSZXF1ZXN0VXJsXSkgPT4ge1xuICAgICAgICByZXN1bHQucmVtb3RlTWVzc2FnZXMucHVsbFJlcXVlc3RVcmwgPSBwdWxsUmVxdWVzdFVybDtcbiAgICB9KSxcbiAgICBuZXcgdXRpbHNfMS5SZW1vdGVMaW5lUGFyc2VyKFsvZm91bmQgKFxcZCspIHZ1bG5lcmFiaWxpdGllcy4rXFwoKFteKV0rKVxcKS9pLCAvXFxzKGh0dHBzPzpcXC9cXC9cXFMrKSQvXSwgKHJlc3VsdCwgW2NvdW50LCBzdW1tYXJ5LCB1cmxdKSA9PiB7XG4gICAgICAgIHJlc3VsdC5yZW1vdGVNZXNzYWdlcy52dWxuZXJhYmlsaXRpZXMgPSB7XG4gICAgICAgICAgICBjb3VudDogdXRpbHNfMS5hc051bWJlcihjb3VudCksXG4gICAgICAgICAgICBzdW1tYXJ5LFxuICAgICAgICAgICAgdXJsLFxuICAgICAgICB9O1xuICAgIH0pLFxuXTtcbmZ1bmN0aW9uIHBhcnNlUmVtb3RlTWVzc2FnZXMoX3N0ZE91dCwgc3RkRXJyKSB7XG4gICAgcmV0dXJuIHV0aWxzXzEucGFyc2VTdHJpbmdSZXNwb25zZSh7IHJlbW90ZU1lc3NhZ2VzOiBuZXcgUmVtb3RlTWVzc2FnZVN1bW1hcnkoKSB9LCBwYXJzZXJzLCBzdGRFcnIpO1xufVxuZXhwb3J0cy5wYXJzZVJlbW90ZU1lc3NhZ2VzID0gcGFyc2VSZW1vdGVNZXNzYWdlcztcbmNsYXNzIFJlbW90ZU1lc3NhZ2VTdW1tYXJ5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5hbGwgPSBbXTtcbiAgICB9XG59XG5leHBvcnRzLlJlbW90ZU1lc3NhZ2VTdW1tYXJ5ID0gUmVtb3RlTWVzc2FnZVN1bW1hcnk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXJzZS1yZW1vdGUtbWVzc2FnZXMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnBhcnNlUHVzaERldGFpbCA9IGV4cG9ydHMucGFyc2VQdXNoUmVzdWx0ID0gdm9pZCAwO1xuY29uc3QgdXRpbHNfMSA9IHJlcXVpcmUoXCIuLi91dGlsc1wiKTtcbmNvbnN0IHBhcnNlX3JlbW90ZV9tZXNzYWdlc18xID0gcmVxdWlyZShcIi4vcGFyc2UtcmVtb3RlLW1lc3NhZ2VzXCIpO1xuZnVuY3Rpb24gcHVzaFJlc3VsdFB1c2hlZEl0ZW0obG9jYWwsIHJlbW90ZSwgc3RhdHVzKSB7XG4gICAgY29uc3QgZGVsZXRlZCA9IHN0YXR1cy5pbmNsdWRlcygnZGVsZXRlZCcpO1xuICAgIGNvbnN0IHRhZyA9IHN0YXR1cy5pbmNsdWRlcygndGFnJykgfHwgL15yZWZzXFwvdGFncy8udGVzdChsb2NhbCk7XG4gICAgY29uc3QgYWxyZWFkeVVwZGF0ZWQgPSAhc3RhdHVzLmluY2x1ZGVzKCduZXcnKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBkZWxldGVkLFxuICAgICAgICB0YWcsXG4gICAgICAgIGJyYW5jaDogIXRhZyxcbiAgICAgICAgbmV3OiAhYWxyZWFkeVVwZGF0ZWQsXG4gICAgICAgIGFscmVhZHlVcGRhdGVkLFxuICAgICAgICBsb2NhbCxcbiAgICAgICAgcmVtb3RlLFxuICAgIH07XG59XG5jb25zdCBwYXJzZXJzID0gW1xuICAgIG5ldyB1dGlsc18xLkxpbmVQYXJzZXIoL15QdXNoaW5nIHRvICguKykkLywgKHJlc3VsdCwgW3JlcG9dKSA9PiB7XG4gICAgICAgIHJlc3VsdC5yZXBvID0gcmVwbztcbiAgICB9KSxcbiAgICBuZXcgdXRpbHNfMS5MaW5lUGFyc2VyKC9edXBkYXRpbmcgbG9jYWwgdHJhY2tpbmcgcmVmICcoLispJy8sIChyZXN1bHQsIFtsb2NhbF0pID0+IHtcbiAgICAgICAgcmVzdWx0LnJlZiA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgKHJlc3VsdC5yZWYgfHwge30pKSwgeyBsb2NhbCB9KTtcbiAgICB9KSxcbiAgICBuZXcgdXRpbHNfMS5MaW5lUGFyc2VyKC9eWyotPV1cXHMrKFteOl0rKTooXFxTKylcXHMrXFxbKC4rKV0kLywgKHJlc3VsdCwgW2xvY2FsLCByZW1vdGUsIHR5cGVdKSA9PiB7XG4gICAgICAgIHJlc3VsdC5wdXNoZWQucHVzaChwdXNoUmVzdWx0UHVzaGVkSXRlbShsb2NhbCwgcmVtb3RlLCB0eXBlKSk7XG4gICAgfSksXG4gICAgbmV3IHV0aWxzXzEuTGluZVBhcnNlcigvXkJyYW5jaCAnKFteJ10rKScgc2V0IHVwIHRvIHRyYWNrIHJlbW90ZSBicmFuY2ggJyhbXiddKyknIGZyb20gJyhbXiddKyknLywgKHJlc3VsdCwgW2xvY2FsLCByZW1vdGUsIHJlbW90ZU5hbWVdKSA9PiB7XG4gICAgICAgIHJlc3VsdC5icmFuY2ggPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIChyZXN1bHQuYnJhbmNoIHx8IHt9KSksIHsgbG9jYWwsXG4gICAgICAgICAgICByZW1vdGUsXG4gICAgICAgICAgICByZW1vdGVOYW1lIH0pO1xuICAgIH0pLFxuICAgIG5ldyB1dGlsc18xLkxpbmVQYXJzZXIoL14oW146XSspOihcXFMrKVxccysoW2EtejAtOV0rKVxcLlxcLihbYS16MC05XSspJC8sIChyZXN1bHQsIFtsb2NhbCwgcmVtb3RlLCBmcm9tLCB0b10pID0+IHtcbiAgICAgICAgcmVzdWx0LnVwZGF0ZSA9IHtcbiAgICAgICAgICAgIGhlYWQ6IHtcbiAgICAgICAgICAgICAgICBsb2NhbCxcbiAgICAgICAgICAgICAgICByZW1vdGUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaGFzaDoge1xuICAgICAgICAgICAgICAgIGZyb20sXG4gICAgICAgICAgICAgICAgdG8sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH0pLFxuXTtcbmNvbnN0IHBhcnNlUHVzaFJlc3VsdCA9IChzdGRPdXQsIHN0ZEVycikgPT4ge1xuICAgIGNvbnN0IHB1c2hEZXRhaWwgPSBleHBvcnRzLnBhcnNlUHVzaERldGFpbChzdGRPdXQsIHN0ZEVycik7XG4gICAgY29uc3QgcmVzcG9uc2VEZXRhaWwgPSBwYXJzZV9yZW1vdGVfbWVzc2FnZXNfMS5wYXJzZVJlbW90ZU1lc3NhZ2VzKHN0ZE91dCwgc3RkRXJyKTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwdXNoRGV0YWlsKSwgcmVzcG9uc2VEZXRhaWwpO1xufTtcbmV4cG9ydHMucGFyc2VQdXNoUmVzdWx0ID0gcGFyc2VQdXNoUmVzdWx0O1xuY29uc3QgcGFyc2VQdXNoRGV0YWlsID0gKHN0ZE91dCwgc3RkRXJyKSA9PiB7XG4gICAgcmV0dXJuIHV0aWxzXzEucGFyc2VTdHJpbmdSZXNwb25zZSh7IHB1c2hlZDogW10gfSwgcGFyc2Vycywgc3RkT3V0LCBzdGRFcnIpO1xufTtcbmV4cG9ydHMucGFyc2VQdXNoRGV0YWlsID0gcGFyc2VQdXNoRGV0YWlsO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGFyc2UtcHVzaC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucHVzaFRhc2sgPSBleHBvcnRzLnB1c2hUYWdzVGFzayA9IHZvaWQgMDtcbmNvbnN0IHBhcnNlX3B1c2hfMSA9IHJlcXVpcmUoXCIuLi9wYXJzZXJzL3BhcnNlLXB1c2hcIik7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xuZnVuY3Rpb24gcHVzaFRhZ3NUYXNrKHJlZiA9IHt9LCBjdXN0b21BcmdzKSB7XG4gICAgdXRpbHNfMS5hcHBlbmQoY3VzdG9tQXJncywgJy0tdGFncycpO1xuICAgIHJldHVybiBwdXNoVGFzayhyZWYsIGN1c3RvbUFyZ3MpO1xufVxuZXhwb3J0cy5wdXNoVGFnc1Rhc2sgPSBwdXNoVGFnc1Rhc2s7XG5mdW5jdGlvbiBwdXNoVGFzayhyZWYgPSB7fSwgY3VzdG9tQXJncykge1xuICAgIGNvbnN0IGNvbW1hbmRzID0gWydwdXNoJywgLi4uY3VzdG9tQXJnc107XG4gICAgaWYgKHJlZi5icmFuY2gpIHtcbiAgICAgICAgY29tbWFuZHMuc3BsaWNlKDEsIDAsIHJlZi5icmFuY2gpO1xuICAgIH1cbiAgICBpZiAocmVmLnJlbW90ZSkge1xuICAgICAgICBjb21tYW5kcy5zcGxpY2UoMSwgMCwgcmVmLnJlbW90ZSk7XG4gICAgfVxuICAgIHV0aWxzXzEucmVtb3ZlKGNvbW1hbmRzLCAnLXYnKTtcbiAgICB1dGlsc18xLmFwcGVuZChjb21tYW5kcywgJy0tdmVyYm9zZScpO1xuICAgIHV0aWxzXzEuYXBwZW5kKGNvbW1hbmRzLCAnLS1wb3JjZWxhaW4nKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kcyxcbiAgICAgICAgZm9ybWF0OiAndXRmLTgnLFxuICAgICAgICBwYXJzZXI6IHBhcnNlX3B1c2hfMS5wYXJzZVB1c2hSZXN1bHQsXG4gICAgfTtcbn1cbmV4cG9ydHMucHVzaFRhc2sgPSBwdXNoVGFzaztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXB1c2guanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNpbXBsZUdpdEFwaSA9IHZvaWQgMDtcbmNvbnN0IHRhc2tfY2FsbGJhY2tfMSA9IHJlcXVpcmUoXCIuL3Rhc2stY2FsbGJhY2tcIik7XG5jb25zdCBwdXNoXzEgPSByZXF1aXJlKFwiLi90YXNrcy9wdXNoXCIpO1xuY29uc3QgdGFza18xID0gcmVxdWlyZShcIi4vdGFza3MvdGFza1wiKTtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi91dGlsc1wiKTtcbmNsYXNzIFNpbXBsZUdpdEFwaSB7XG4gICAgY29uc3RydWN0b3IoX2V4ZWN1dG9yKSB7XG4gICAgICAgIHRoaXMuX2V4ZWN1dG9yID0gX2V4ZWN1dG9yO1xuICAgIH1cbiAgICBfcnVuVGFzayh0YXNrLCB0aGVuKSB7XG4gICAgICAgIGNvbnN0IGNoYWluID0gdGhpcy5fZXhlY3V0b3IuY2hhaW4oKTtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IGNoYWluLnB1c2godGFzayk7XG4gICAgICAgIGlmICh0aGVuKSB7XG4gICAgICAgICAgICB0YXNrX2NhbGxiYWNrXzEudGFza0NhbGxiYWNrKHRhc2ssIHByb21pc2UsIHRoZW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPYmplY3QuY3JlYXRlKHRoaXMsIHtcbiAgICAgICAgICAgIHRoZW46IHsgdmFsdWU6IHByb21pc2UudGhlbi5iaW5kKHByb21pc2UpIH0sXG4gICAgICAgICAgICBjYXRjaDogeyB2YWx1ZTogcHJvbWlzZS5jYXRjaC5iaW5kKHByb21pc2UpIH0sXG4gICAgICAgICAgICBfZXhlY3V0b3I6IHsgdmFsdWU6IGNoYWluIH0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhZGQoZmlsZXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3J1blRhc2sodGFza18xLnN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soWydhZGQnLCAuLi51dGlsc18xLmFzQXJyYXkoZmlsZXMpXSksIHV0aWxzXzEudHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cykpO1xuICAgIH1cbiAgICBwdXNoKCkge1xuICAgICAgICBjb25zdCB0YXNrID0gcHVzaF8xLnB1c2hUYXNrKHtcbiAgICAgICAgICAgIHJlbW90ZTogdXRpbHNfMS5maWx0ZXJUeXBlKGFyZ3VtZW50c1swXSwgdXRpbHNfMS5maWx0ZXJTdHJpbmcpLFxuICAgICAgICAgICAgYnJhbmNoOiB1dGlsc18xLmZpbHRlclR5cGUoYXJndW1lbnRzWzFdLCB1dGlsc18xLmZpbHRlclN0cmluZyksXG4gICAgICAgIH0sIHV0aWxzXzEuZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cykpO1xuICAgICAgICByZXR1cm4gdGhpcy5fcnVuVGFzayh0YXNrLCB1dGlsc18xLnRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpKTtcbiAgICB9XG59XG5leHBvcnRzLlNpbXBsZUdpdEFwaSA9IFNpbXBsZUdpdEFwaTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNpbXBsZS1naXQtYXBpLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5jcmVhdGVEZWZlcnJlZCA9IGV4cG9ydHMuZGVmZXJyZWQgPSB2b2lkIDA7XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgYERlZmVycmVkUHJvbWlzZWBcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gaW1wb3J0IHtkZWZlcnJlZH0gZnJvbSAnQGt3c2l0ZXMvcHJvbWlzZS1kZWZlcnJlZGA7XG4gYGBgXG4gKi9cbmZ1bmN0aW9uIGRlZmVycmVkKCkge1xuICAgIGxldCBkb25lO1xuICAgIGxldCBmYWlsO1xuICAgIGxldCBzdGF0dXMgPSAncGVuZGluZyc7XG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChfZG9uZSwgX2ZhaWwpID0+IHtcbiAgICAgICAgZG9uZSA9IF9kb25lO1xuICAgICAgICBmYWlsID0gX2ZhaWw7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcHJvbWlzZSxcbiAgICAgICAgZG9uZShyZXN1bHQpIHtcbiAgICAgICAgICAgIGlmIChzdGF0dXMgPT09ICdwZW5kaW5nJykge1xuICAgICAgICAgICAgICAgIHN0YXR1cyA9ICdyZXNvbHZlZCc7XG4gICAgICAgICAgICAgICAgZG9uZShyZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBmYWlsKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoc3RhdHVzID09PSAncGVuZGluZycpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMgPSAncmVqZWN0ZWQnO1xuICAgICAgICAgICAgICAgIGZhaWwoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBnZXQgZnVsZmlsbGVkKCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXR1cyAhPT0gJ3BlbmRpbmcnO1xuICAgICAgICB9LFxuICAgICAgICBnZXQgc3RhdHVzKCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXR1cztcbiAgICAgICAgfSxcbiAgICB9O1xufVxuZXhwb3J0cy5kZWZlcnJlZCA9IGRlZmVycmVkO1xuLyoqXG4gKiBBbGlhcyBvZiB0aGUgZXhwb3J0ZWQgYGRlZmVycmVkYCBmdW5jdGlvbiwgdG8gaGVscCBjb25zdW1lcnMgd2FudGluZyB0byB1c2UgYGRlZmVycmVkYCBhcyB0aGVcbiAqIGxvY2FsIHZhcmlhYmxlIG5hbWUgcmF0aGVyIHRoYW4gdGhlIGZhY3RvcnkgaW1wb3J0IG5hbWUsIHdpdGhvdXQgbmVlZGluZyB0byByZW5hbWUgb24gaW1wb3J0LlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiBpbXBvcnQge2NyZWF0ZURlZmVycmVkfSBmcm9tICdAa3dzaXRlcy9wcm9taXNlLWRlZmVycmVkYDtcbiBgYGBcbiAqL1xuZXhwb3J0cy5jcmVhdGVEZWZlcnJlZCA9IGRlZmVycmVkO1xuLyoqXG4gKiBEZWZhdWx0IGV4cG9ydCBhbGxvd3MgdXNlIGFzOlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiBpbXBvcnQgZGVmZXJyZWQgZnJvbSAnQGt3c2l0ZXMvcHJvbWlzZS1kZWZlcnJlZGA7XG4gYGBgXG4gKi9cbmV4cG9ydHMuZGVmYXVsdCA9IGRlZmVycmVkO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNjaGVkdWxlciA9IHZvaWQgMDtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5jb25zdCBwcm9taXNlX2RlZmVycmVkXzEgPSByZXF1aXJlKFwiQGt3c2l0ZXMvcHJvbWlzZS1kZWZlcnJlZFwiKTtcbmNvbnN0IGdpdF9sb2dnZXJfMSA9IHJlcXVpcmUoXCIuLi9naXQtbG9nZ2VyXCIpO1xuY29uc3QgY3JlYXRlU2NoZWR1bGVkVGFzayA9ICgoKSA9PiB7XG4gICAgbGV0IGlkID0gMDtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBpZCsrO1xuICAgICAgICBjb25zdCB7IHByb21pc2UsIGRvbmUgfSA9IHByb21pc2VfZGVmZXJyZWRfMS5jcmVhdGVEZWZlcnJlZCgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcHJvbWlzZSxcbiAgICAgICAgICAgIGRvbmUsXG4gICAgICAgICAgICBpZCxcbiAgICAgICAgfTtcbiAgICB9O1xufSkoKTtcbmNsYXNzIFNjaGVkdWxlciB7XG4gICAgY29uc3RydWN0b3IoY29uY3VycmVuY3kgPSAyKSB7XG4gICAgICAgIHRoaXMuY29uY3VycmVuY3kgPSBjb25jdXJyZW5jeTtcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBnaXRfbG9nZ2VyXzEuY3JlYXRlTG9nZ2VyKCcnLCAnc2NoZWR1bGVyJyk7XG4gICAgICAgIHRoaXMucGVuZGluZyA9IFtdO1xuICAgICAgICB0aGlzLnJ1bm5pbmcgPSBbXTtcbiAgICAgICAgdGhpcy5sb2dnZXIoYENvbnN0cnVjdGVkLCBjb25jdXJyZW5jeT0lc2AsIGNvbmN1cnJlbmN5KTtcbiAgICB9XG4gICAgc2NoZWR1bGUoKSB7XG4gICAgICAgIGlmICghdGhpcy5wZW5kaW5nLmxlbmd0aCB8fCB0aGlzLnJ1bm5pbmcubGVuZ3RoID49IHRoaXMuY29uY3VycmVuY3kpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyKGBTY2hlZHVsZSBhdHRlbXB0IGlnbm9yZWQsIHBlbmRpbmc9JXMgcnVubmluZz0lcyBjb25jdXJyZW5jeT0lc2AsIHRoaXMucGVuZGluZy5sZW5ndGgsIHRoaXMucnVubmluZy5sZW5ndGgsIHRoaXMuY29uY3VycmVuY3kpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhc2sgPSB1dGlsc18xLmFwcGVuZCh0aGlzLnJ1bm5pbmcsIHRoaXMucGVuZGluZy5zaGlmdCgpKTtcbiAgICAgICAgdGhpcy5sb2dnZXIoYEF0dGVtcHRpbmcgaWQ9JXNgLCB0YXNrLmlkKTtcbiAgICAgICAgdGFzay5kb25lKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyKGBDb21wbGV0aW5nIGlkPWAsIHRhc2suaWQpO1xuICAgICAgICAgICAgdXRpbHNfMS5yZW1vdmUodGhpcy5ydW5uaW5nLCB0YXNrKTtcbiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG5leHQoKSB7XG4gICAgICAgIGNvbnN0IHsgcHJvbWlzZSwgaWQgfSA9IHV0aWxzXzEuYXBwZW5kKHRoaXMucGVuZGluZywgY3JlYXRlU2NoZWR1bGVkVGFzaygpKTtcbiAgICAgICAgdGhpcy5sb2dnZXIoYFNjaGVkdWxpbmcgaWQ9JXNgLCBpZCk7XG4gICAgICAgIHRoaXMuc2NoZWR1bGUoKTtcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxufVxuZXhwb3J0cy5TY2hlZHVsZXIgPSBTY2hlZHVsZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zY2hlZHVsZXIuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmFwcGx5UGF0Y2hUYXNrID0gdm9pZCAwO1xuY29uc3QgdGFza18xID0gcmVxdWlyZShcIi4vdGFza1wiKTtcbmZ1bmN0aW9uIGFwcGx5UGF0Y2hUYXNrKHBhdGNoZXMsIGN1c3RvbUFyZ3MpIHtcbiAgICByZXR1cm4gdGFza18xLnN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soWydhcHBseScsIC4uLmN1c3RvbUFyZ3MsIC4uLnBhdGNoZXNdKTtcbn1cbmV4cG9ydHMuYXBwbHlQYXRjaFRhc2sgPSBhcHBseVBhdGNoVGFzaztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFwcGx5LXBhdGNoLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5pc1NpbmdsZUJyYW5jaERlbGV0ZUZhaWx1cmUgPSBleHBvcnRzLmJyYW5jaERlbGV0aW9uRmFpbHVyZSA9IGV4cG9ydHMuYnJhbmNoRGVsZXRpb25TdWNjZXNzID0gZXhwb3J0cy5CcmFuY2hEZWxldGlvbkJhdGNoID0gdm9pZCAwO1xuY2xhc3MgQnJhbmNoRGVsZXRpb25CYXRjaCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYWxsID0gW107XG4gICAgICAgIHRoaXMuYnJhbmNoZXMgPSB7fTtcbiAgICAgICAgdGhpcy5lcnJvcnMgPSBbXTtcbiAgICB9XG4gICAgZ2V0IHN1Y2Nlc3MoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5lcnJvcnMubGVuZ3RoO1xuICAgIH1cbn1cbmV4cG9ydHMuQnJhbmNoRGVsZXRpb25CYXRjaCA9IEJyYW5jaERlbGV0aW9uQmF0Y2g7XG5mdW5jdGlvbiBicmFuY2hEZWxldGlvblN1Y2Nlc3MoYnJhbmNoLCBoYXNoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYnJhbmNoLCBoYXNoLCBzdWNjZXNzOiB0cnVlLFxuICAgIH07XG59XG5leHBvcnRzLmJyYW5jaERlbGV0aW9uU3VjY2VzcyA9IGJyYW5jaERlbGV0aW9uU3VjY2VzcztcbmZ1bmN0aW9uIGJyYW5jaERlbGV0aW9uRmFpbHVyZShicmFuY2gpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBicmFuY2gsIGhhc2g6IG51bGwsIHN1Y2Nlc3M6IGZhbHNlLFxuICAgIH07XG59XG5leHBvcnRzLmJyYW5jaERlbGV0aW9uRmFpbHVyZSA9IGJyYW5jaERlbGV0aW9uRmFpbHVyZTtcbmZ1bmN0aW9uIGlzU2luZ2xlQnJhbmNoRGVsZXRlRmFpbHVyZSh0ZXN0KSB7XG4gICAgcmV0dXJuIHRlc3Quc3VjY2Vzcztcbn1cbmV4cG9ydHMuaXNTaW5nbGVCcmFuY2hEZWxldGVGYWlsdXJlID0gaXNTaW5nbGVCcmFuY2hEZWxldGVGYWlsdXJlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QnJhbmNoRGVsZXRlU3VtbWFyeS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuaGFzQnJhbmNoRGVsZXRpb25FcnJvciA9IGV4cG9ydHMucGFyc2VCcmFuY2hEZWxldGlvbnMgPSB2b2lkIDA7XG5jb25zdCBCcmFuY2hEZWxldGVTdW1tYXJ5XzEgPSByZXF1aXJlKFwiLi4vcmVzcG9uc2VzL0JyYW5jaERlbGV0ZVN1bW1hcnlcIik7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xuY29uc3QgZGVsZXRlU3VjY2Vzc1JlZ2V4ID0gLyhcXFMrKVxccytcXChcXFMrXFxzKFteKV0rKVxcKS87XG5jb25zdCBkZWxldGVFcnJvclJlZ2V4ID0gL15lcnJvclteJ10rJyhbXiddKyknL207XG5jb25zdCBwYXJzZXJzID0gW1xuICAgIG5ldyB1dGlsc18xLkxpbmVQYXJzZXIoZGVsZXRlU3VjY2Vzc1JlZ2V4LCAocmVzdWx0LCBbYnJhbmNoLCBoYXNoXSkgPT4ge1xuICAgICAgICBjb25zdCBkZWxldGlvbiA9IEJyYW5jaERlbGV0ZVN1bW1hcnlfMS5icmFuY2hEZWxldGlvblN1Y2Nlc3MoYnJhbmNoLCBoYXNoKTtcbiAgICAgICAgcmVzdWx0LmFsbC5wdXNoKGRlbGV0aW9uKTtcbiAgICAgICAgcmVzdWx0LmJyYW5jaGVzW2JyYW5jaF0gPSBkZWxldGlvbjtcbiAgICB9KSxcbiAgICBuZXcgdXRpbHNfMS5MaW5lUGFyc2VyKGRlbGV0ZUVycm9yUmVnZXgsIChyZXN1bHQsIFticmFuY2hdKSA9PiB7XG4gICAgICAgIGNvbnN0IGRlbGV0aW9uID0gQnJhbmNoRGVsZXRlU3VtbWFyeV8xLmJyYW5jaERlbGV0aW9uRmFpbHVyZShicmFuY2gpO1xuICAgICAgICByZXN1bHQuZXJyb3JzLnB1c2goZGVsZXRpb24pO1xuICAgICAgICByZXN1bHQuYWxsLnB1c2goZGVsZXRpb24pO1xuICAgICAgICByZXN1bHQuYnJhbmNoZXNbYnJhbmNoXSA9IGRlbGV0aW9uO1xuICAgIH0pLFxuXTtcbmNvbnN0IHBhcnNlQnJhbmNoRGVsZXRpb25zID0gKHN0ZE91dCwgc3RkRXJyKSA9PiB7XG4gICAgcmV0dXJuIHV0aWxzXzEucGFyc2VTdHJpbmdSZXNwb25zZShuZXcgQnJhbmNoRGVsZXRlU3VtbWFyeV8xLkJyYW5jaERlbGV0aW9uQmF0Y2goKSwgcGFyc2Vycywgc3RkT3V0LCBzdGRFcnIpO1xufTtcbmV4cG9ydHMucGFyc2VCcmFuY2hEZWxldGlvbnMgPSBwYXJzZUJyYW5jaERlbGV0aW9ucztcbmZ1bmN0aW9uIGhhc0JyYW5jaERlbGV0aW9uRXJyb3IoZGF0YSwgcHJvY2Vzc0V4aXRDb2RlKSB7XG4gICAgcmV0dXJuIHByb2Nlc3NFeGl0Q29kZSA9PT0gdXRpbHNfMS5FeGl0Q29kZXMuRVJST1IgJiYgZGVsZXRlRXJyb3JSZWdleC50ZXN0KGRhdGEpO1xufVxuZXhwb3J0cy5oYXNCcmFuY2hEZWxldGlvbkVycm9yID0gaGFzQnJhbmNoRGVsZXRpb25FcnJvcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBhcnNlLWJyYW5jaC1kZWxldGUuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkJyYW5jaFN1bW1hcnlSZXN1bHQgPSB2b2lkIDA7XG5jbGFzcyBCcmFuY2hTdW1tYXJ5UmVzdWx0IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5hbGwgPSBbXTtcbiAgICAgICAgdGhpcy5icmFuY2hlcyA9IHt9O1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSAnJztcbiAgICAgICAgdGhpcy5kZXRhY2hlZCA9IGZhbHNlO1xuICAgIH1cbiAgICBwdXNoKGN1cnJlbnQsIGRldGFjaGVkLCBuYW1lLCBjb21taXQsIGxhYmVsKSB7XG4gICAgICAgIGlmIChjdXJyZW50KSB7XG4gICAgICAgICAgICB0aGlzLmRldGFjaGVkID0gZGV0YWNoZWQ7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSBuYW1lO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWxsLnB1c2gobmFtZSk7XG4gICAgICAgIHRoaXMuYnJhbmNoZXNbbmFtZV0gPSB7XG4gICAgICAgICAgICBjdXJyZW50OiBjdXJyZW50LFxuICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgIGNvbW1pdDogY29tbWl0LFxuICAgICAgICAgICAgbGFiZWw6IGxhYmVsXG4gICAgICAgIH07XG4gICAgfVxufVxuZXhwb3J0cy5CcmFuY2hTdW1tYXJ5UmVzdWx0ID0gQnJhbmNoU3VtbWFyeVJlc3VsdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJyYW5jaFN1bW1hcnkuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnBhcnNlQnJhbmNoU3VtbWFyeSA9IHZvaWQgMDtcbmNvbnN0IEJyYW5jaFN1bW1hcnlfMSA9IHJlcXVpcmUoXCIuLi9yZXNwb25zZXMvQnJhbmNoU3VtbWFyeVwiKTtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5jb25zdCBwYXJzZXJzID0gW1xuICAgIG5ldyB1dGlsc18xLkxpbmVQYXJzZXIoL14oXFwqXFxzKT9cXCgoPzpIRUFEICk/ZGV0YWNoZWQgKD86ZnJvbXxhdCkgKFxcUyspXFwpXFxzKyhbYS16MC05XSspXFxzKC4qKSQvLCAocmVzdWx0LCBbY3VycmVudCwgbmFtZSwgY29tbWl0LCBsYWJlbF0pID0+IHtcbiAgICAgICAgcmVzdWx0LnB1c2goISFjdXJyZW50LCB0cnVlLCBuYW1lLCBjb21taXQsIGxhYmVsKTtcbiAgICB9KSxcbiAgICBuZXcgdXRpbHNfMS5MaW5lUGFyc2VyKC9eKFxcKlxccyk/KFxcUyspXFxzKyhbYS16MC05XSspXFxzKC4qKSQvcywgKHJlc3VsdCwgW2N1cnJlbnQsIG5hbWUsIGNvbW1pdCwgbGFiZWxdKSA9PiB7XG4gICAgICAgIHJlc3VsdC5wdXNoKCEhY3VycmVudCwgZmFsc2UsIG5hbWUsIGNvbW1pdCwgbGFiZWwpO1xuICAgIH0pXG5dO1xuZnVuY3Rpb24gcGFyc2VCcmFuY2hTdW1tYXJ5KHN0ZE91dCkge1xuICAgIHJldHVybiB1dGlsc18xLnBhcnNlU3RyaW5nUmVzcG9uc2UobmV3IEJyYW5jaFN1bW1hcnlfMS5CcmFuY2hTdW1tYXJ5UmVzdWx0KCksIHBhcnNlcnMsIHN0ZE91dCk7XG59XG5leHBvcnRzLnBhcnNlQnJhbmNoU3VtbWFyeSA9IHBhcnNlQnJhbmNoU3VtbWFyeTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBhcnNlLWJyYW5jaC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGVsZXRlQnJhbmNoVGFzayA9IGV4cG9ydHMuZGVsZXRlQnJhbmNoZXNUYXNrID0gZXhwb3J0cy5icmFuY2hMb2NhbFRhc2sgPSBleHBvcnRzLmJyYW5jaFRhc2sgPSBleHBvcnRzLmNvbnRhaW5zRGVsZXRlQnJhbmNoQ29tbWFuZCA9IHZvaWQgMDtcbmNvbnN0IGdpdF9yZXNwb25zZV9lcnJvcl8xID0gcmVxdWlyZShcIi4uL2Vycm9ycy9naXQtcmVzcG9uc2UtZXJyb3JcIik7XG5jb25zdCBwYXJzZV9icmFuY2hfZGVsZXRlXzEgPSByZXF1aXJlKFwiLi4vcGFyc2Vycy9wYXJzZS1icmFuY2gtZGVsZXRlXCIpO1xuY29uc3QgcGFyc2VfYnJhbmNoXzEgPSByZXF1aXJlKFwiLi4vcGFyc2Vycy9wYXJzZS1icmFuY2hcIik7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xuZnVuY3Rpb24gY29udGFpbnNEZWxldGVCcmFuY2hDb21tYW5kKGNvbW1hbmRzKSB7XG4gICAgY29uc3QgZGVsZXRlQ29tbWFuZHMgPSBbJy1kJywgJy1EJywgJy0tZGVsZXRlJ107XG4gICAgcmV0dXJuIGNvbW1hbmRzLnNvbWUoY29tbWFuZCA9PiBkZWxldGVDb21tYW5kcy5pbmNsdWRlcyhjb21tYW5kKSk7XG59XG5leHBvcnRzLmNvbnRhaW5zRGVsZXRlQnJhbmNoQ29tbWFuZCA9IGNvbnRhaW5zRGVsZXRlQnJhbmNoQ29tbWFuZDtcbmZ1bmN0aW9uIGJyYW5jaFRhc2soY3VzdG9tQXJncykge1xuICAgIGNvbnN0IGlzRGVsZXRlID0gY29udGFpbnNEZWxldGVCcmFuY2hDb21tYW5kKGN1c3RvbUFyZ3MpO1xuICAgIGNvbnN0IGNvbW1hbmRzID0gWydicmFuY2gnLCAuLi5jdXN0b21BcmdzXTtcbiAgICBpZiAoY29tbWFuZHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvbW1hbmRzLnB1c2goJy1hJyk7XG4gICAgfVxuICAgIGlmICghY29tbWFuZHMuaW5jbHVkZXMoJy12JykpIHtcbiAgICAgICAgY29tbWFuZHMuc3BsaWNlKDEsIDAsICctdicpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBmb3JtYXQ6ICd1dGYtOCcsXG4gICAgICAgIGNvbW1hbmRzLFxuICAgICAgICBwYXJzZXIoc3RkT3V0LCBzdGRFcnIpIHtcbiAgICAgICAgICAgIGlmIChpc0RlbGV0ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZV9icmFuY2hfZGVsZXRlXzEucGFyc2VCcmFuY2hEZWxldGlvbnMoc3RkT3V0LCBzdGRFcnIpLmFsbFswXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwYXJzZV9icmFuY2hfMS5wYXJzZUJyYW5jaFN1bW1hcnkoc3RkT3V0KTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuZXhwb3J0cy5icmFuY2hUYXNrID0gYnJhbmNoVGFzaztcbmZ1bmN0aW9uIGJyYW5jaExvY2FsVGFzaygpIHtcbiAgICBjb25zdCBwYXJzZXIgPSBwYXJzZV9icmFuY2hfMS5wYXJzZUJyYW5jaFN1bW1hcnk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZm9ybWF0OiAndXRmLTgnLFxuICAgICAgICBjb21tYW5kczogWydicmFuY2gnLCAnLXYnXSxcbiAgICAgICAgcGFyc2VyLFxuICAgIH07XG59XG5leHBvcnRzLmJyYW5jaExvY2FsVGFzayA9IGJyYW5jaExvY2FsVGFzaztcbmZ1bmN0aW9uIGRlbGV0ZUJyYW5jaGVzVGFzayhicmFuY2hlcywgZm9yY2VEZWxldGUgPSBmYWxzZSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGZvcm1hdDogJ3V0Zi04JyxcbiAgICAgICAgY29tbWFuZHM6IFsnYnJhbmNoJywgJy12JywgZm9yY2VEZWxldGUgPyAnLUQnIDogJy1kJywgLi4uYnJhbmNoZXNdLFxuICAgICAgICBwYXJzZXIoc3RkT3V0LCBzdGRFcnIpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZV9icmFuY2hfZGVsZXRlXzEucGFyc2VCcmFuY2hEZWxldGlvbnMoc3RkT3V0LCBzdGRFcnIpO1xuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yKHsgZXhpdENvZGUsIHN0ZE91dCB9LCBlcnJvciwgZG9uZSwgZmFpbCkge1xuICAgICAgICAgICAgaWYgKCFwYXJzZV9icmFuY2hfZGVsZXRlXzEuaGFzQnJhbmNoRGVsZXRpb25FcnJvcihTdHJpbmcoZXJyb3IpLCBleGl0Q29kZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkb25lKHN0ZE91dCk7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbmV4cG9ydHMuZGVsZXRlQnJhbmNoZXNUYXNrID0gZGVsZXRlQnJhbmNoZXNUYXNrO1xuZnVuY3Rpb24gZGVsZXRlQnJhbmNoVGFzayhicmFuY2gsIGZvcmNlRGVsZXRlID0gZmFsc2UpIHtcbiAgICBjb25zdCB0YXNrID0ge1xuICAgICAgICBmb3JtYXQ6ICd1dGYtOCcsXG4gICAgICAgIGNvbW1hbmRzOiBbJ2JyYW5jaCcsICctdicsIGZvcmNlRGVsZXRlID8gJy1EJyA6ICctZCcsIGJyYW5jaF0sXG4gICAgICAgIHBhcnNlcihzdGRPdXQsIHN0ZEVycikge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlX2JyYW5jaF9kZWxldGVfMS5wYXJzZUJyYW5jaERlbGV0aW9ucyhzdGRPdXQsIHN0ZEVycikuYnJhbmNoZXNbYnJhbmNoXTtcbiAgICAgICAgfSxcbiAgICAgICAgb25FcnJvcih7IGV4aXRDb2RlLCBzdGRFcnIsIHN0ZE91dCB9LCBlcnJvciwgXywgZmFpbCkge1xuICAgICAgICAgICAgaWYgKCFwYXJzZV9icmFuY2hfZGVsZXRlXzEuaGFzQnJhbmNoRGVsZXRpb25FcnJvcihTdHJpbmcoZXJyb3IpLCBleGl0Q29kZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgZ2l0X3Jlc3BvbnNlX2Vycm9yXzEuR2l0UmVzcG9uc2VFcnJvcih0YXNrLnBhcnNlcih1dGlsc18xLmJ1ZmZlclRvU3RyaW5nKHN0ZE91dCksIHV0aWxzXzEuYnVmZmVyVG9TdHJpbmcoc3RkRXJyKSksIFN0cmluZyhlcnJvcikpO1xuICAgICAgICB9LFxuICAgIH07XG4gICAgcmV0dXJuIHRhc2s7XG59XG5leHBvcnRzLmRlbGV0ZUJyYW5jaFRhc2sgPSBkZWxldGVCcmFuY2hUYXNrO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YnJhbmNoLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wYXJzZUNoZWNrSWdub3JlID0gdm9pZCAwO1xuLyoqXG4gKiBQYXJzZXIgZm9yIHRoZSBgY2hlY2staWdub3JlYCBjb21tYW5kIC0gcmV0dXJucyBlYWNoIGZpbGUgYXMgYSBzdHJpbmcgYXJyYXlcbiAqL1xuY29uc3QgcGFyc2VDaGVja0lnbm9yZSA9ICh0ZXh0KSA9PiB7XG4gICAgcmV0dXJuIHRleHQuc3BsaXQoL1xcbi9nKVxuICAgICAgICAubWFwKGxpbmUgPT4gbGluZS50cmltKCkpXG4gICAgICAgIC5maWx0ZXIoZmlsZSA9PiAhIWZpbGUpO1xufTtcbmV4cG9ydHMucGFyc2VDaGVja0lnbm9yZSA9IHBhcnNlQ2hlY2tJZ25vcmU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DaGVja0lnbm9yZS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY2hlY2tJZ25vcmVUYXNrID0gdm9pZCAwO1xuY29uc3QgQ2hlY2tJZ25vcmVfMSA9IHJlcXVpcmUoXCIuLi9yZXNwb25zZXMvQ2hlY2tJZ25vcmVcIik7XG5mdW5jdGlvbiBjaGVja0lnbm9yZVRhc2socGF0aHMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kczogWydjaGVjay1pZ25vcmUnLCAuLi5wYXRoc10sXG4gICAgICAgIGZvcm1hdDogJ3V0Zi04JyxcbiAgICAgICAgcGFyc2VyOiBDaGVja0lnbm9yZV8xLnBhcnNlQ2hlY2tJZ25vcmUsXG4gICAgfTtcbn1cbmV4cG9ydHMuY2hlY2tJZ25vcmVUYXNrID0gY2hlY2tJZ25vcmVUYXNrO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2hlY2staWdub3JlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5jbG9uZU1pcnJvclRhc2sgPSBleHBvcnRzLmNsb25lVGFzayA9IHZvaWQgMDtcbmNvbnN0IHRhc2tfMSA9IHJlcXVpcmUoXCIuL3Rhc2tcIik7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xuZnVuY3Rpb24gY2xvbmVUYXNrKHJlcG8sIGRpcmVjdG9yeSwgY3VzdG9tQXJncykge1xuICAgIGNvbnN0IGNvbW1hbmRzID0gWydjbG9uZScsIC4uLmN1c3RvbUFyZ3NdO1xuICAgIGlmICh0eXBlb2YgcmVwbyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29tbWFuZHMucHVzaChyZXBvKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkaXJlY3RvcnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbW1hbmRzLnB1c2goZGlyZWN0b3J5KTtcbiAgICB9XG4gICAgcmV0dXJuIHRhc2tfMS5zdHJhaWdodFRocm91Z2hTdHJpbmdUYXNrKGNvbW1hbmRzKTtcbn1cbmV4cG9ydHMuY2xvbmVUYXNrID0gY2xvbmVUYXNrO1xuZnVuY3Rpb24gY2xvbmVNaXJyb3JUYXNrKHJlcG8sIGRpcmVjdG9yeSwgY3VzdG9tQXJncykge1xuICAgIHV0aWxzXzEuYXBwZW5kKGN1c3RvbUFyZ3MsICctLW1pcnJvcicpO1xuICAgIHJldHVybiBjbG9uZVRhc2socmVwbywgZGlyZWN0b3J5LCBjdXN0b21BcmdzKTtcbn1cbmV4cG9ydHMuY2xvbmVNaXJyb3JUYXNrID0gY2xvbmVNaXJyb3JUYXNrO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2xvbmUuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNvbmZpZ0xpc3RQYXJzZXIgPSBleHBvcnRzLkNvbmZpZ0xpc3QgPSB2b2lkIDA7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xuY2xhc3MgQ29uZmlnTGlzdCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZmlsZXMgPSBbXTtcbiAgICAgICAgdGhpcy52YWx1ZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIH1cbiAgICBnZXQgYWxsKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2FsbCkge1xuICAgICAgICAgICAgdGhpcy5fYWxsID0gdGhpcy5maWxlcy5yZWR1Y2UoKGFsbCwgZmlsZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGFsbCwgdGhpcy52YWx1ZXNbZmlsZV0pO1xuICAgICAgICAgICAgfSwge30pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9hbGw7XG4gICAgfVxuICAgIGFkZEZpbGUoZmlsZSkge1xuICAgICAgICBpZiAoIShmaWxlIGluIHRoaXMudmFsdWVzKSkge1xuICAgICAgICAgICAgY29uc3QgbGF0ZXN0ID0gdXRpbHNfMS5sYXN0KHRoaXMuZmlsZXMpO1xuICAgICAgICAgICAgdGhpcy52YWx1ZXNbZmlsZV0gPSBsYXRlc3QgPyBPYmplY3QuY3JlYXRlKHRoaXMudmFsdWVzW2xhdGVzdF0pIDoge307XG4gICAgICAgICAgICB0aGlzLmZpbGVzLnB1c2goZmlsZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVzW2ZpbGVdO1xuICAgIH1cbiAgICBhZGRWYWx1ZShmaWxlLCBrZXksIHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuYWRkRmlsZShmaWxlKTtcbiAgICAgICAgaWYgKCF2YWx1ZXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgdmFsdWVzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlc1trZXldKSkge1xuICAgICAgICAgICAgdmFsdWVzW2tleV0ucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZXNba2V5XSA9IFt2YWx1ZXNba2V5XSwgdmFsdWVdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2FsbCA9IHVuZGVmaW5lZDtcbiAgICB9XG59XG5leHBvcnRzLkNvbmZpZ0xpc3QgPSBDb25maWdMaXN0O1xuZnVuY3Rpb24gY29uZmlnTGlzdFBhcnNlcih0ZXh0KSB7XG4gICAgY29uc3QgY29uZmlnID0gbmV3IENvbmZpZ0xpc3QoKTtcbiAgICBjb25zdCBsaW5lcyA9IHRleHQuc3BsaXQoJ1xcMCcpO1xuICAgIGZvciAobGV0IGkgPSAwLCBtYXggPSBsaW5lcy5sZW5ndGggLSAxOyBpIDwgbWF4Oykge1xuICAgICAgICBjb25zdCBmaWxlID0gY29uZmlnRmlsZVBhdGgobGluZXNbaSsrXSk7XG4gICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IHV0aWxzXzEuc3BsaXRPbihsaW5lc1tpKytdLCAnXFxuJyk7XG4gICAgICAgIGNvbmZpZy5hZGRWYWx1ZShmaWxlLCBrZXksIHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZztcbn1cbmV4cG9ydHMuY29uZmlnTGlzdFBhcnNlciA9IGNvbmZpZ0xpc3RQYXJzZXI7XG5mdW5jdGlvbiBjb25maWdGaWxlUGF0aChmaWxlUGF0aCkge1xuICAgIHJldHVybiBmaWxlUGF0aC5yZXBsYWNlKC9eKGZpbGUpOi8sICcnKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbmZpZ0xpc3QuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmxpc3RDb25maWdUYXNrID0gZXhwb3J0cy5hZGRDb25maWdUYXNrID0gdm9pZCAwO1xuY29uc3QgQ29uZmlnTGlzdF8xID0gcmVxdWlyZShcIi4uL3Jlc3BvbnNlcy9Db25maWdMaXN0XCIpO1xuZnVuY3Rpb24gYWRkQ29uZmlnVGFzayhrZXksIHZhbHVlLCBhcHBlbmQgPSBmYWxzZSkge1xuICAgIGNvbnN0IGNvbW1hbmRzID0gWydjb25maWcnLCAnLS1sb2NhbCddO1xuICAgIGlmIChhcHBlbmQpIHtcbiAgICAgICAgY29tbWFuZHMucHVzaCgnLS1hZGQnKTtcbiAgICB9XG4gICAgY29tbWFuZHMucHVzaChrZXksIHZhbHVlKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kcyxcbiAgICAgICAgZm9ybWF0OiAndXRmLTgnLFxuICAgICAgICBwYXJzZXIodGV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgICAgIH1cbiAgICB9O1xufVxuZXhwb3J0cy5hZGRDb25maWdUYXNrID0gYWRkQ29uZmlnVGFzaztcbmZ1bmN0aW9uIGxpc3RDb25maWdUYXNrKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGNvbW1hbmRzOiBbJ2NvbmZpZycsICctLWxpc3QnLCAnLS1zaG93LW9yaWdpbicsICctLW51bGwnXSxcbiAgICAgICAgZm9ybWF0OiAndXRmLTgnLFxuICAgICAgICBwYXJzZXIodGV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIENvbmZpZ0xpc3RfMS5jb25maWdMaXN0UGFyc2VyKHRleHQpO1xuICAgICAgICB9LFxuICAgIH07XG59XG5leHBvcnRzLmxpc3RDb25maWdUYXNrID0gbGlzdENvbmZpZ1Rhc2s7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25maWcuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnBhcnNlQ29tbWl0UmVzdWx0ID0gdm9pZCAwO1xuY29uc3QgdXRpbHNfMSA9IHJlcXVpcmUoXCIuLi91dGlsc1wiKTtcbmNvbnN0IHBhcnNlcnMgPSBbXG4gICAgbmV3IHV0aWxzXzEuTGluZVBhcnNlcigvXFxbKFteXFxzXSspKCBcXChbXildK1xcKSk/IChbXlxcXV0rKS8sIChyZXN1bHQsIFticmFuY2gsIHJvb3QsIGNvbW1pdF0pID0+IHtcbiAgICAgICAgcmVzdWx0LmJyYW5jaCA9IGJyYW5jaDtcbiAgICAgICAgcmVzdWx0LmNvbW1pdCA9IGNvbW1pdDtcbiAgICAgICAgcmVzdWx0LnJvb3QgPSAhIXJvb3Q7XG4gICAgfSksXG4gICAgbmV3IHV0aWxzXzEuTGluZVBhcnNlcigvXFxzKkF1dGhvcjpcXHMoLispL2ksIChyZXN1bHQsIFthdXRob3JdKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gYXV0aG9yLnNwbGl0KCc8Jyk7XG4gICAgICAgIGNvbnN0IGVtYWlsID0gcGFydHMucG9wKCk7XG4gICAgICAgIGlmICghZW1haWwgfHwgIWVtYWlsLmluY2x1ZGVzKCdAJykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQuYXV0aG9yID0ge1xuICAgICAgICAgICAgZW1haWw6IGVtYWlsLnN1YnN0cigwLCBlbWFpbC5sZW5ndGggLSAxKSxcbiAgICAgICAgICAgIG5hbWU6IHBhcnRzLmpvaW4oJzwnKS50cmltKClcbiAgICAgICAgfTtcbiAgICB9KSxcbiAgICBuZXcgdXRpbHNfMS5MaW5lUGFyc2VyKC8oXFxkKylbXixdKig/OixcXHMqKFxcZCspW14sXSopKD86LFxccyooXFxkKykpL2csIChyZXN1bHQsIFtjaGFuZ2VzLCBpbnNlcnRpb25zLCBkZWxldGlvbnNdKSA9PiB7XG4gICAgICAgIHJlc3VsdC5zdW1tYXJ5LmNoYW5nZXMgPSBwYXJzZUludChjaGFuZ2VzLCAxMCkgfHwgMDtcbiAgICAgICAgcmVzdWx0LnN1bW1hcnkuaW5zZXJ0aW9ucyA9IHBhcnNlSW50KGluc2VydGlvbnMsIDEwKSB8fCAwO1xuICAgICAgICByZXN1bHQuc3VtbWFyeS5kZWxldGlvbnMgPSBwYXJzZUludChkZWxldGlvbnMsIDEwKSB8fCAwO1xuICAgIH0pLFxuICAgIG5ldyB1dGlsc18xLkxpbmVQYXJzZXIoL14oXFxkKylbXixdKig/OixcXHMqKFxcZCspW14oXStcXCgoWystXSkpPy8sIChyZXN1bHQsIFtjaGFuZ2VzLCBsaW5lcywgZGlyZWN0aW9uXSkgPT4ge1xuICAgICAgICByZXN1bHQuc3VtbWFyeS5jaGFuZ2VzID0gcGFyc2VJbnQoY2hhbmdlcywgMTApIHx8IDA7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gcGFyc2VJbnQobGluZXMsIDEwKSB8fCAwO1xuICAgICAgICBpZiAoZGlyZWN0aW9uID09PSAnLScpIHtcbiAgICAgICAgICAgIHJlc3VsdC5zdW1tYXJ5LmRlbGV0aW9ucyA9IGNvdW50O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gJysnKSB7XG4gICAgICAgICAgICByZXN1bHQuc3VtbWFyeS5pbnNlcnRpb25zID0gY291bnQ7XG4gICAgICAgIH1cbiAgICB9KSxcbl07XG5mdW5jdGlvbiBwYXJzZUNvbW1pdFJlc3VsdChzdGRPdXQpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgIGF1dGhvcjogbnVsbCxcbiAgICAgICAgYnJhbmNoOiAnJyxcbiAgICAgICAgY29tbWl0OiAnJyxcbiAgICAgICAgcm9vdDogZmFsc2UsXG4gICAgICAgIHN1bW1hcnk6IHtcbiAgICAgICAgICAgIGNoYW5nZXM6IDAsXG4gICAgICAgICAgICBpbnNlcnRpb25zOiAwLFxuICAgICAgICAgICAgZGVsZXRpb25zOiAwLFxuICAgICAgICB9LFxuICAgIH07XG4gICAgcmV0dXJuIHV0aWxzXzEucGFyc2VTdHJpbmdSZXNwb25zZShyZXN1bHQsIHBhcnNlcnMsIHN0ZE91dCk7XG59XG5leHBvcnRzLnBhcnNlQ29tbWl0UmVzdWx0ID0gcGFyc2VDb21taXRSZXN1bHQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXJzZS1jb21taXQuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNvbW1pdFRhc2sgPSB2b2lkIDA7XG5jb25zdCBwYXJzZV9jb21taXRfMSA9IHJlcXVpcmUoXCIuLi9wYXJzZXJzL3BhcnNlLWNvbW1pdFwiKTtcbmZ1bmN0aW9uIGNvbW1pdFRhc2sobWVzc2FnZSwgZmlsZXMsIGN1c3RvbUFyZ3MpIHtcbiAgICBjb25zdCBjb21tYW5kcyA9IFsnY29tbWl0J107XG4gICAgbWVzc2FnZS5mb3JFYWNoKChtKSA9PiBjb21tYW5kcy5wdXNoKCctbScsIG0pKTtcbiAgICBjb21tYW5kcy5wdXNoKC4uLmZpbGVzLCAuLi5jdXN0b21BcmdzKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kcyxcbiAgICAgICAgZm9ybWF0OiAndXRmLTgnLFxuICAgICAgICBwYXJzZXI6IHBhcnNlX2NvbW1pdF8xLnBhcnNlQ29tbWl0UmVzdWx0LFxuICAgIH07XG59XG5leHBvcnRzLmNvbW1pdFRhc2sgPSBjb21taXRUYXNrO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29tbWl0LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5EaWZmU3VtbWFyeSA9IHZvaWQgMDtcbi8qKipcbiAqIFRoZSBEaWZmU3VtbWFyeSBpcyByZXR1cm5lZCBhcyBhIHJlc3BvbnNlIHRvIGdldHRpbmcgYGdpdCgpLnN0YXR1cygpYFxuICovXG5jbGFzcyBEaWZmU3VtbWFyeSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuY2hhbmdlZCA9IDA7XG4gICAgICAgIHRoaXMuZGVsZXRpb25zID0gMDtcbiAgICAgICAgdGhpcy5pbnNlcnRpb25zID0gMDtcbiAgICAgICAgdGhpcy5maWxlcyA9IFtdO1xuICAgIH1cbn1cbmV4cG9ydHMuRGlmZlN1bW1hcnkgPSBEaWZmU3VtbWFyeTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURpZmZTdW1tYXJ5LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wYXJzZURpZmZSZXN1bHQgPSB2b2lkIDA7XG5jb25zdCBEaWZmU3VtbWFyeV8xID0gcmVxdWlyZShcIi4uL3Jlc3BvbnNlcy9EaWZmU3VtbWFyeVwiKTtcbmZ1bmN0aW9uIHBhcnNlRGlmZlJlc3VsdChzdGRPdXQpIHtcbiAgICBjb25zdCBsaW5lcyA9IHN0ZE91dC50cmltKCkuc3BsaXQoJ1xcbicpO1xuICAgIGNvbnN0IHN0YXR1cyA9IG5ldyBEaWZmU3VtbWFyeV8xLkRpZmZTdW1tYXJ5KCk7XG4gICAgcmVhZFN1bW1hcnlMaW5lKHN0YXR1cywgbGluZXMucG9wKCkpO1xuICAgIGZvciAobGV0IGkgPSAwLCBtYXggPSBsaW5lcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykge1xuICAgICAgICBjb25zdCBsaW5lID0gbGluZXNbaV07XG4gICAgICAgIHRleHRGaWxlQ2hhbmdlKGxpbmUsIHN0YXR1cykgfHwgYmluYXJ5RmlsZUNoYW5nZShsaW5lLCBzdGF0dXMpO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdHVzO1xufVxuZXhwb3J0cy5wYXJzZURpZmZSZXN1bHQgPSBwYXJzZURpZmZSZXN1bHQ7XG5mdW5jdGlvbiByZWFkU3VtbWFyeUxpbmUoc3RhdHVzLCBzdW1tYXJ5KSB7XG4gICAgKHN1bW1hcnkgfHwgJycpXG4gICAgICAgIC50cmltKClcbiAgICAgICAgLnNwbGl0KCcsICcpXG4gICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uICh0ZXh0KSB7XG4gICAgICAgIGNvbnN0IHN1bW1hcnkgPSAvKFxcZCspXFxzKFthLXpdKykvLmV4ZWModGV4dCk7XG4gICAgICAgIGlmICghc3VtbWFyeSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHN1bW1hcnlUeXBlKHN0YXR1cywgc3VtbWFyeVsyXSwgcGFyc2VJbnQoc3VtbWFyeVsxXSwgMTApKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIHN1bW1hcnlUeXBlKHN0YXR1cywga2V5LCB2YWx1ZSkge1xuICAgIGNvbnN0IG1hdGNoID0gKC8oW2Etel0rPylzP1xcYi8uZXhlYyhrZXkpKTtcbiAgICBpZiAoIW1hdGNoIHx8ICFzdGF0dXNVcGRhdGVbbWF0Y2hbMV1dKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3RhdHVzVXBkYXRlW21hdGNoWzFdXShzdGF0dXMsIHZhbHVlKTtcbn1cbmNvbnN0IHN0YXR1c1VwZGF0ZSA9IHtcbiAgICBmaWxlKHN0YXR1cywgdmFsdWUpIHtcbiAgICAgICAgc3RhdHVzLmNoYW5nZWQgPSB2YWx1ZTtcbiAgICB9LFxuICAgIGRlbGV0aW9uKHN0YXR1cywgdmFsdWUpIHtcbiAgICAgICAgc3RhdHVzLmRlbGV0aW9ucyA9IHZhbHVlO1xuICAgIH0sXG4gICAgaW5zZXJ0aW9uKHN0YXR1cywgdmFsdWUpIHtcbiAgICAgICAgc3RhdHVzLmluc2VydGlvbnMgPSB2YWx1ZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gdGV4dEZpbGVDaGFuZ2UoaW5wdXQsIHsgZmlsZXMgfSkge1xuICAgIGNvbnN0IGxpbmUgPSBpbnB1dC50cmltKCkubWF0Y2goL14oLispXFxzK1xcfFxccysoXFxkKykoXFxzK1srXFwtXSspPyQvKTtcbiAgICBpZiAobGluZSkge1xuICAgICAgICB2YXIgYWx0ZXJhdGlvbnMgPSAobGluZVszXSB8fCAnJykudHJpbSgpO1xuICAgICAgICBmaWxlcy5wdXNoKHtcbiAgICAgICAgICAgIGZpbGU6IGxpbmVbMV0udHJpbSgpLFxuICAgICAgICAgICAgY2hhbmdlczogcGFyc2VJbnQobGluZVsyXSwgMTApLFxuICAgICAgICAgICAgaW5zZXJ0aW9uczogYWx0ZXJhdGlvbnMucmVwbGFjZSgvLS9nLCAnJykubGVuZ3RoLFxuICAgICAgICAgICAgZGVsZXRpb25zOiBhbHRlcmF0aW9ucy5yZXBsYWNlKC9cXCsvZywgJycpLmxlbmd0aCxcbiAgICAgICAgICAgIGJpbmFyeTogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBiaW5hcnlGaWxlQ2hhbmdlKGlucHV0LCB7IGZpbGVzIH0pIHtcbiAgICBjb25zdCBsaW5lID0gaW5wdXQubWF0Y2goL14oLispIFxcfFxccytCaW4gKFswLTkuXSspIC0+IChbMC05Ll0rKSAoW2Etel0rKSQvKTtcbiAgICBpZiAobGluZSkge1xuICAgICAgICBmaWxlcy5wdXNoKHtcbiAgICAgICAgICAgIGZpbGU6IGxpbmVbMV0udHJpbSgpLFxuICAgICAgICAgICAgYmVmb3JlOiArbGluZVsyXSxcbiAgICAgICAgICAgIGFmdGVyOiArbGluZVszXSxcbiAgICAgICAgICAgIGJpbmFyeTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBhcnNlLWRpZmYtc3VtbWFyeS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGlmZlN1bW1hcnlUYXNrID0gdm9pZCAwO1xuY29uc3QgcGFyc2VfZGlmZl9zdW1tYXJ5XzEgPSByZXF1aXJlKFwiLi4vcGFyc2Vycy9wYXJzZS1kaWZmLXN1bW1hcnlcIik7XG5mdW5jdGlvbiBkaWZmU3VtbWFyeVRhc2soY3VzdG9tQXJncykge1xuICAgIHJldHVybiB7XG4gICAgICAgIGNvbW1hbmRzOiBbJ2RpZmYnLCAnLS1zdGF0PTQwOTYnLCAuLi5jdXN0b21BcmdzXSxcbiAgICAgICAgZm9ybWF0OiAndXRmLTgnLFxuICAgICAgICBwYXJzZXIoc3RkT3V0KSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VfZGlmZl9zdW1tYXJ5XzEucGFyc2VEaWZmUmVzdWx0KHN0ZE91dCk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuZXhwb3J0cy5kaWZmU3VtbWFyeVRhc2sgPSBkaWZmU3VtbWFyeVRhc2s7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaWZmLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wYXJzZUZldGNoUmVzdWx0ID0gdm9pZCAwO1xuY29uc3QgdXRpbHNfMSA9IHJlcXVpcmUoXCIuLi91dGlsc1wiKTtcbmNvbnN0IHBhcnNlcnMgPSBbXG4gICAgbmV3IHV0aWxzXzEuTGluZVBhcnNlcigvRnJvbSAoLispJC8sIChyZXN1bHQsIFtyZW1vdGVdKSA9PiB7XG4gICAgICAgIHJlc3VsdC5yZW1vdGUgPSByZW1vdGU7XG4gICAgfSksXG4gICAgbmV3IHV0aWxzXzEuTGluZVBhcnNlcigvXFwqIFxcW25ldyBicmFuY2hdXFxzKyhcXFMrKVxccyotPiAoLispJC8sIChyZXN1bHQsIFtuYW1lLCB0cmFja2luZ10pID0+IHtcbiAgICAgICAgcmVzdWx0LmJyYW5jaGVzLnB1c2goe1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHRyYWNraW5nLFxuICAgICAgICB9KTtcbiAgICB9KSxcbiAgICBuZXcgdXRpbHNfMS5MaW5lUGFyc2VyKC9cXCogXFxbbmV3IHRhZ11cXHMrKFxcUyspXFxzKi0+ICguKykkLywgKHJlc3VsdCwgW25hbWUsIHRyYWNraW5nXSkgPT4ge1xuICAgICAgICByZXN1bHQudGFncy5wdXNoKHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICB0cmFja2luZyxcbiAgICAgICAgfSk7XG4gICAgfSlcbl07XG5mdW5jdGlvbiBwYXJzZUZldGNoUmVzdWx0KHN0ZE91dCwgc3RkRXJyKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICByYXc6IHN0ZE91dCxcbiAgICAgICAgcmVtb3RlOiBudWxsLFxuICAgICAgICBicmFuY2hlczogW10sXG4gICAgICAgIHRhZ3M6IFtdLFxuICAgIH07XG4gICAgcmV0dXJuIHV0aWxzXzEucGFyc2VTdHJpbmdSZXNwb25zZShyZXN1bHQsIHBhcnNlcnMsIHN0ZE91dCwgc3RkRXJyKTtcbn1cbmV4cG9ydHMucGFyc2VGZXRjaFJlc3VsdCA9IHBhcnNlRmV0Y2hSZXN1bHQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXJzZS1mZXRjaC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZmV0Y2hUYXNrID0gdm9pZCAwO1xuY29uc3QgcGFyc2VfZmV0Y2hfMSA9IHJlcXVpcmUoXCIuLi9wYXJzZXJzL3BhcnNlLWZldGNoXCIpO1xuZnVuY3Rpb24gZmV0Y2hUYXNrKHJlbW90ZSwgYnJhbmNoLCBjdXN0b21BcmdzKSB7XG4gICAgY29uc3QgY29tbWFuZHMgPSBbJ2ZldGNoJywgLi4uY3VzdG9tQXJnc107XG4gICAgaWYgKHJlbW90ZSAmJiBicmFuY2gpIHtcbiAgICAgICAgY29tbWFuZHMucHVzaChyZW1vdGUsIGJyYW5jaCk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGNvbW1hbmRzLFxuICAgICAgICBmb3JtYXQ6ICd1dGYtOCcsXG4gICAgICAgIHBhcnNlcjogcGFyc2VfZmV0Y2hfMS5wYXJzZUZldGNoUmVzdWx0LFxuICAgIH07XG59XG5leHBvcnRzLmZldGNoVGFzayA9IGZldGNoVGFzaztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZldGNoLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5oYXNoT2JqZWN0VGFzayA9IHZvaWQgMDtcbmNvbnN0IHRhc2tfMSA9IHJlcXVpcmUoXCIuL3Rhc2tcIik7XG4vKipcbiAqIFRhc2sgdXNlZCBieSBgZ2l0Lmhhc2hPYmplY3RgXG4gKi9cbmZ1bmN0aW9uIGhhc2hPYmplY3RUYXNrKGZpbGVQYXRoLCB3cml0ZSkge1xuICAgIGNvbnN0IGNvbW1hbmRzID0gWydoYXNoLW9iamVjdCcsIGZpbGVQYXRoXTtcbiAgICBpZiAod3JpdGUpIHtcbiAgICAgICAgY29tbWFuZHMucHVzaCgnLXcnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhc2tfMS5zdHJhaWdodFRocm91Z2hTdHJpbmdUYXNrKGNvbW1hbmRzLCB0cnVlKTtcbn1cbmV4cG9ydHMuaGFzaE9iamVjdFRhc2sgPSBoYXNoT2JqZWN0VGFzaztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhhc2gtb2JqZWN0LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wYXJzZUluaXQgPSBleHBvcnRzLkluaXRTdW1tYXJ5ID0gdm9pZCAwO1xuY2xhc3MgSW5pdFN1bW1hcnkge1xuICAgIGNvbnN0cnVjdG9yKGJhcmUsIHBhdGgsIGV4aXN0aW5nLCBnaXREaXIpIHtcbiAgICAgICAgdGhpcy5iYXJlID0gYmFyZTtcbiAgICAgICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICAgICAgdGhpcy5leGlzdGluZyA9IGV4aXN0aW5nO1xuICAgICAgICB0aGlzLmdpdERpciA9IGdpdERpcjtcbiAgICB9XG59XG5leHBvcnRzLkluaXRTdW1tYXJ5ID0gSW5pdFN1bW1hcnk7XG5jb25zdCBpbml0UmVzcG9uc2VSZWdleCA9IC9eSW5pdC4rIHJlcG9zaXRvcnkgaW4gKC4rKSQvO1xuY29uc3QgcmVJbml0UmVzcG9uc2VSZWdleCA9IC9eUmVpbi4rIGluICguKykkLztcbmZ1bmN0aW9uIHBhcnNlSW5pdChiYXJlLCBwYXRoLCB0ZXh0KSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBTdHJpbmcodGV4dCkudHJpbSgpO1xuICAgIGxldCByZXN1bHQ7XG4gICAgaWYgKChyZXN1bHQgPSBpbml0UmVzcG9uc2VSZWdleC5leGVjKHJlc3BvbnNlKSkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbml0U3VtbWFyeShiYXJlLCBwYXRoLCBmYWxzZSwgcmVzdWx0WzFdKTtcbiAgICB9XG4gICAgaWYgKChyZXN1bHQgPSByZUluaXRSZXNwb25zZVJlZ2V4LmV4ZWMocmVzcG9uc2UpKSkge1xuICAgICAgICByZXR1cm4gbmV3IEluaXRTdW1tYXJ5KGJhcmUsIHBhdGgsIHRydWUsIHJlc3VsdFsxXSk7XG4gICAgfVxuICAgIGxldCBnaXREaXIgPSAnJztcbiAgICBjb25zdCB0b2tlbnMgPSByZXNwb25zZS5zcGxpdCgnICcpO1xuICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5zLnNoaWZ0KCk7XG4gICAgICAgIGlmICh0b2tlbiA9PT0gJ2luJykge1xuICAgICAgICAgICAgZ2l0RGlyID0gdG9rZW5zLmpvaW4oJyAnKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgSW5pdFN1bW1hcnkoYmFyZSwgcGF0aCwgL15yZS9pLnRlc3QocmVzcG9uc2UpLCBnaXREaXIpO1xufVxuZXhwb3J0cy5wYXJzZUluaXQgPSBwYXJzZUluaXQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Jbml0U3VtbWFyeS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuaW5pdFRhc2sgPSB2b2lkIDA7XG5jb25zdCBJbml0U3VtbWFyeV8xID0gcmVxdWlyZShcIi4uL3Jlc3BvbnNlcy9Jbml0U3VtbWFyeVwiKTtcbmNvbnN0IGJhcmVDb21tYW5kID0gJy0tYmFyZSc7XG5mdW5jdGlvbiBoYXNCYXJlQ29tbWFuZChjb21tYW5kKSB7XG4gICAgcmV0dXJuIGNvbW1hbmQuaW5jbHVkZXMoYmFyZUNvbW1hbmQpO1xufVxuZnVuY3Rpb24gaW5pdFRhc2soYmFyZSA9IGZhbHNlLCBwYXRoLCBjdXN0b21BcmdzKSB7XG4gICAgY29uc3QgY29tbWFuZHMgPSBbJ2luaXQnLCAuLi5jdXN0b21BcmdzXTtcbiAgICBpZiAoYmFyZSAmJiAhaGFzQmFyZUNvbW1hbmQoY29tbWFuZHMpKSB7XG4gICAgICAgIGNvbW1hbmRzLnNwbGljZSgxLCAwLCBiYXJlQ29tbWFuZCk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGNvbW1hbmRzLFxuICAgICAgICBmb3JtYXQ6ICd1dGYtOCcsXG4gICAgICAgIHBhcnNlcih0ZXh0KSB7XG4gICAgICAgICAgICByZXR1cm4gSW5pdFN1bW1hcnlfMS5wYXJzZUluaXQoY29tbWFuZHMuaW5jbHVkZXMoJy0tYmFyZScpLCBwYXRoLCB0ZXh0KTtcbiAgICAgICAgfVxuICAgIH07XG59XG5leHBvcnRzLmluaXRUYXNrID0gaW5pdFRhc2s7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbml0LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5jcmVhdGVMaXN0TG9nU3VtbWFyeVBhcnNlciA9IGV4cG9ydHMuU1BMSVRURVIgPSBleHBvcnRzLkNPTU1JVF9CT1VOREFSWSA9IGV4cG9ydHMuU1RBUlRfQk9VTkRBUlkgPSB2b2lkIDA7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xuY29uc3QgcGFyc2VfZGlmZl9zdW1tYXJ5XzEgPSByZXF1aXJlKFwiLi9wYXJzZS1kaWZmLXN1bW1hcnlcIik7XG5leHBvcnRzLlNUQVJUX0JPVU5EQVJZID0gJ8Oyw7LDssOyw7LDsiAnO1xuZXhwb3J0cy5DT01NSVRfQk9VTkRBUlkgPSAnIMOyw7InO1xuZXhwb3J0cy5TUExJVFRFUiA9ICcgw7IgJztcbmNvbnN0IGRlZmF1bHRGaWVsZE5hbWVzID0gWydoYXNoJywgJ2RhdGUnLCAnbWVzc2FnZScsICdyZWZzJywgJ2F1dGhvcl9uYW1lJywgJ2F1dGhvcl9lbWFpbCddO1xuZnVuY3Rpb24gbGluZUJ1aWxkZXIodG9rZW5zLCBmaWVsZHMpIHtcbiAgICByZXR1cm4gZmllbGRzLnJlZHVjZSgobGluZSwgZmllbGQsIGluZGV4KSA9PiB7XG4gICAgICAgIGxpbmVbZmllbGRdID0gdG9rZW5zW2luZGV4XSB8fCAnJztcbiAgICAgICAgcmV0dXJuIGxpbmU7XG4gICAgfSwgT2JqZWN0LmNyZWF0ZSh7IGRpZmY6IG51bGwgfSkpO1xufVxuZnVuY3Rpb24gY3JlYXRlTGlzdExvZ1N1bW1hcnlQYXJzZXIoc3BsaXR0ZXIgPSBleHBvcnRzLlNQTElUVEVSLCBmaWVsZHMgPSBkZWZhdWx0RmllbGROYW1lcykge1xuICAgIHJldHVybiBmdW5jdGlvbiAoc3RkT3V0KSB7XG4gICAgICAgIGNvbnN0IGFsbCA9IHV0aWxzXzEudG9MaW5lc1dpdGhDb250ZW50KHN0ZE91dCwgdHJ1ZSwgZXhwb3J0cy5TVEFSVF9CT1VOREFSWSlcbiAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmVEZXRhaWwgPSBpdGVtLnRyaW0oKS5zcGxpdChleHBvcnRzLkNPTU1JVF9CT1VOREFSWSk7XG4gICAgICAgICAgICBjb25zdCBsaXN0TG9nTGluZSA9IGxpbmVCdWlsZGVyKGxpbmVEZXRhaWxbMF0udHJpbSgpLnNwbGl0KHNwbGl0dGVyKSwgZmllbGRzKTtcbiAgICAgICAgICAgIGlmIChsaW5lRGV0YWlsLmxlbmd0aCA+IDEgJiYgISFsaW5lRGV0YWlsWzFdLnRyaW0oKSkge1xuICAgICAgICAgICAgICAgIGxpc3RMb2dMaW5lLmRpZmYgPSBwYXJzZV9kaWZmX3N1bW1hcnlfMS5wYXJzZURpZmZSZXN1bHQobGluZURldGFpbFsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbGlzdExvZ0xpbmU7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYWxsLFxuICAgICAgICAgICAgbGF0ZXN0OiBhbGwubGVuZ3RoICYmIGFsbFswXSB8fCBudWxsLFxuICAgICAgICAgICAgdG90YWw6IGFsbC5sZW5ndGgsXG4gICAgICAgIH07XG4gICAgfTtcbn1cbmV4cG9ydHMuY3JlYXRlTGlzdExvZ1N1bW1hcnlQYXJzZXIgPSBjcmVhdGVMaXN0TG9nU3VtbWFyeVBhcnNlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBhcnNlLWxpc3QtbG9nLXN1bW1hcnkuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmxvZ1Rhc2sgPSBleHBvcnRzLnBhcnNlTG9nT3B0aW9ucyA9IHZvaWQgMDtcbmNvbnN0IHBhcnNlX2xpc3RfbG9nX3N1bW1hcnlfMSA9IHJlcXVpcmUoXCIuLi9wYXJzZXJzL3BhcnNlLWxpc3QtbG9nLXN1bW1hcnlcIik7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xudmFyIGV4Y2x1ZGVPcHRpb25zO1xuKGZ1bmN0aW9uIChleGNsdWRlT3B0aW9ucykge1xuICAgIGV4Y2x1ZGVPcHRpb25zW2V4Y2x1ZGVPcHRpb25zW1wiLS1wcmV0dHlcIl0gPSAwXSA9IFwiLS1wcmV0dHlcIjtcbiAgICBleGNsdWRlT3B0aW9uc1tleGNsdWRlT3B0aW9uc1tcIm1heC1jb3VudFwiXSA9IDFdID0gXCJtYXgtY291bnRcIjtcbiAgICBleGNsdWRlT3B0aW9uc1tleGNsdWRlT3B0aW9uc1tcIm1heENvdW50XCJdID0gMl0gPSBcIm1heENvdW50XCI7XG4gICAgZXhjbHVkZU9wdGlvbnNbZXhjbHVkZU9wdGlvbnNbXCJuXCJdID0gM10gPSBcIm5cIjtcbiAgICBleGNsdWRlT3B0aW9uc1tleGNsdWRlT3B0aW9uc1tcImZpbGVcIl0gPSA0XSA9IFwiZmlsZVwiO1xuICAgIGV4Y2x1ZGVPcHRpb25zW2V4Y2x1ZGVPcHRpb25zW1wiZm9ybWF0XCJdID0gNV0gPSBcImZvcm1hdFwiO1xuICAgIGV4Y2x1ZGVPcHRpb25zW2V4Y2x1ZGVPcHRpb25zW1wiZnJvbVwiXSA9IDZdID0gXCJmcm9tXCI7XG4gICAgZXhjbHVkZU9wdGlvbnNbZXhjbHVkZU9wdGlvbnNbXCJ0b1wiXSA9IDddID0gXCJ0b1wiO1xuICAgIGV4Y2x1ZGVPcHRpb25zW2V4Y2x1ZGVPcHRpb25zW1wic3BsaXR0ZXJcIl0gPSA4XSA9IFwic3BsaXR0ZXJcIjtcbiAgICBleGNsdWRlT3B0aW9uc1tleGNsdWRlT3B0aW9uc1tcInN5bW1ldHJpY1wiXSA9IDldID0gXCJzeW1tZXRyaWNcIjtcbiAgICBleGNsdWRlT3B0aW9uc1tleGNsdWRlT3B0aW9uc1tcIm11bHRpTGluZVwiXSA9IDEwXSA9IFwibXVsdGlMaW5lXCI7XG4gICAgZXhjbHVkZU9wdGlvbnNbZXhjbHVkZU9wdGlvbnNbXCJzdHJpY3REYXRlXCJdID0gMTFdID0gXCJzdHJpY3REYXRlXCI7XG59KShleGNsdWRlT3B0aW9ucyB8fCAoZXhjbHVkZU9wdGlvbnMgPSB7fSkpO1xuZnVuY3Rpb24gcHJldHR5Rm9ybWF0KGZvcm1hdCwgc3BsaXR0ZXIpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBbXTtcbiAgICBjb25zdCBmb3JtYXRTdHIgPSBbXTtcbiAgICBPYmplY3Qua2V5cyhmb3JtYXQpLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgIGZpZWxkcy5wdXNoKGZpZWxkKTtcbiAgICAgICAgZm9ybWF0U3RyLnB1c2goU3RyaW5nKGZvcm1hdFtmaWVsZF0pKTtcbiAgICB9KTtcbiAgICByZXR1cm4gW1xuICAgICAgICBmaWVsZHMsIGZvcm1hdFN0ci5qb2luKHNwbGl0dGVyKVxuICAgIF07XG59XG5mdW5jdGlvbiB1c2VyT3B0aW9ucyhpbnB1dCkge1xuICAgIGNvbnN0IG91dHB1dCA9IE9iamVjdC5hc3NpZ24oe30sIGlucHV0KTtcbiAgICBPYmplY3Qua2V5cyhpbnB1dCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBpZiAoa2V5IGluIGV4Y2x1ZGVPcHRpb25zKSB7XG4gICAgICAgICAgICBkZWxldGUgb3V0cHV0W2tleV07XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gb3V0cHV0O1xufVxuZnVuY3Rpb24gcGFyc2VMb2dPcHRpb25zKG9wdCA9IHt9LCBjdXN0b21BcmdzID0gW10pIHtcbiAgICBjb25zdCBzcGxpdHRlciA9IG9wdC5zcGxpdHRlciB8fCBwYXJzZV9saXN0X2xvZ19zdW1tYXJ5XzEuU1BMSVRURVI7XG4gICAgY29uc3QgZm9ybWF0ID0gb3B0LmZvcm1hdCB8fCB7XG4gICAgICAgIGhhc2g6ICclSCcsXG4gICAgICAgIGRhdGU6IG9wdC5zdHJpY3REYXRlID09PSBmYWxzZSA/ICclYWknIDogJyVhSScsXG4gICAgICAgIG1lc3NhZ2U6ICclcycsXG4gICAgICAgIHJlZnM6ICclRCcsXG4gICAgICAgIGJvZHk6IG9wdC5tdWx0aUxpbmUgPyAnJUInIDogJyViJyxcbiAgICAgICAgYXV0aG9yX25hbWU6ICclYU4nLFxuICAgICAgICBhdXRob3JfZW1haWw6ICclYWUnXG4gICAgfTtcbiAgICBjb25zdCBbZmllbGRzLCBmb3JtYXRTdHJdID0gcHJldHR5Rm9ybWF0KGZvcm1hdCwgc3BsaXR0ZXIpO1xuICAgIGNvbnN0IHN1ZmZpeCA9IFtdO1xuICAgIGNvbnN0IGNvbW1hbmQgPSBbXG4gICAgICAgIGAtLXByZXR0eT1mb3JtYXQ6JHtwYXJzZV9saXN0X2xvZ19zdW1tYXJ5XzEuU1RBUlRfQk9VTkRBUll9JHtmb3JtYXRTdHJ9JHtwYXJzZV9saXN0X2xvZ19zdW1tYXJ5XzEuQ09NTUlUX0JPVU5EQVJZfWAsXG4gICAgICAgIC4uLmN1c3RvbUFyZ3MsXG4gICAgXTtcbiAgICBjb25zdCBtYXhDb3VudCA9IG9wdC5uIHx8IG9wdFsnbWF4LWNvdW50J10gfHwgb3B0Lm1heENvdW50O1xuICAgIGlmIChtYXhDb3VudCkge1xuICAgICAgICBjb21tYW5kLnB1c2goYC0tbWF4LWNvdW50PSR7bWF4Q291bnR9YCk7XG4gICAgfVxuICAgIGlmIChvcHQuZnJvbSAmJiBvcHQudG8pIHtcbiAgICAgICAgY29uc3QgcmFuZ2VPcGVyYXRvciA9IChvcHQuc3ltbWV0cmljICE9PSBmYWxzZSkgPyAnLi4uJyA6ICcuLic7XG4gICAgICAgIHN1ZmZpeC5wdXNoKGAke29wdC5mcm9tfSR7cmFuZ2VPcGVyYXRvcn0ke29wdC50b31gKTtcbiAgICB9XG4gICAgaWYgKG9wdC5maWxlKSB7XG4gICAgICAgIHN1ZmZpeC5wdXNoKCctLWZvbGxvdycsIG9wdC5maWxlKTtcbiAgICB9XG4gICAgdXRpbHNfMS5hcHBlbmRUYXNrT3B0aW9ucyh1c2VyT3B0aW9ucyhvcHQpLCBjb21tYW5kKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBmaWVsZHMsXG4gICAgICAgIHNwbGl0dGVyLFxuICAgICAgICBjb21tYW5kczogW1xuICAgICAgICAgICAgLi4uY29tbWFuZCxcbiAgICAgICAgICAgIC4uLnN1ZmZpeCxcbiAgICAgICAgXSxcbiAgICB9O1xufVxuZXhwb3J0cy5wYXJzZUxvZ09wdGlvbnMgPSBwYXJzZUxvZ09wdGlvbnM7XG5mdW5jdGlvbiBsb2dUYXNrKHNwbGl0dGVyLCBmaWVsZHMsIGN1c3RvbUFyZ3MpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kczogWydsb2cnLCAuLi5jdXN0b21BcmdzXSxcbiAgICAgICAgZm9ybWF0OiAndXRmLTgnLFxuICAgICAgICBwYXJzZXI6IHBhcnNlX2xpc3RfbG9nX3N1bW1hcnlfMS5jcmVhdGVMaXN0TG9nU3VtbWFyeVBhcnNlcihzcGxpdHRlciwgZmllbGRzKSxcbiAgICB9O1xufVxuZXhwb3J0cy5sb2dUYXNrID0gbG9nVGFzaztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxvZy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuTWVyZ2VTdW1tYXJ5RGV0YWlsID0gZXhwb3J0cy5NZXJnZVN1bW1hcnlDb25mbGljdCA9IHZvaWQgMDtcbmNsYXNzIE1lcmdlU3VtbWFyeUNvbmZsaWN0IHtcbiAgICBjb25zdHJ1Y3RvcihyZWFzb24sIGZpbGUgPSBudWxsLCBtZXRhKSB7XG4gICAgICAgIHRoaXMucmVhc29uID0gcmVhc29uO1xuICAgICAgICB0aGlzLmZpbGUgPSBmaWxlO1xuICAgICAgICB0aGlzLm1ldGEgPSBtZXRhO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuZmlsZX06JHt0aGlzLnJlYXNvbn1gO1xuICAgIH1cbn1cbmV4cG9ydHMuTWVyZ2VTdW1tYXJ5Q29uZmxpY3QgPSBNZXJnZVN1bW1hcnlDb25mbGljdDtcbmNsYXNzIE1lcmdlU3VtbWFyeURldGFpbCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuY29uZmxpY3RzID0gW107XG4gICAgICAgIHRoaXMubWVyZ2VzID0gW107XG4gICAgICAgIHRoaXMucmVzdWx0ID0gJ3N1Y2Nlc3MnO1xuICAgIH1cbiAgICBnZXQgZmFpbGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25mbGljdHMubGVuZ3RoID4gMDtcbiAgICB9XG4gICAgZ2V0IHJlYXNvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzdWx0O1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgaWYgKHRoaXMuY29uZmxpY3RzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGBDT05GTElDVFM6ICR7dGhpcy5jb25mbGljdHMuam9pbignLCAnKX1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnT0snO1xuICAgIH1cbn1cbmV4cG9ydHMuTWVyZ2VTdW1tYXJ5RGV0YWlsID0gTWVyZ2VTdW1tYXJ5RGV0YWlsO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWVyZ2VTdW1tYXJ5LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5QdWxsU3VtbWFyeSA9IHZvaWQgMDtcbmNsYXNzIFB1bGxTdW1tYXJ5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5yZW1vdGVNZXNzYWdlcyA9IHtcbiAgICAgICAgICAgIGFsbDogW10sXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuY3JlYXRlZCA9IFtdO1xuICAgICAgICB0aGlzLmRlbGV0ZWQgPSBbXTtcbiAgICAgICAgdGhpcy5maWxlcyA9IFtdO1xuICAgICAgICB0aGlzLmRlbGV0aW9ucyA9IHt9O1xuICAgICAgICB0aGlzLmluc2VydGlvbnMgPSB7fTtcbiAgICAgICAgdGhpcy5zdW1tYXJ5ID0ge1xuICAgICAgICAgICAgY2hhbmdlczogMCxcbiAgICAgICAgICAgIGRlbGV0aW9uczogMCxcbiAgICAgICAgICAgIGluc2VydGlvbnM6IDAsXG4gICAgICAgIH07XG4gICAgfVxufVxuZXhwb3J0cy5QdWxsU3VtbWFyeSA9IFB1bGxTdW1tYXJ5O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHVsbFN1bW1hcnkuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnBhcnNlUHVsbFJlc3VsdCA9IGV4cG9ydHMucGFyc2VQdWxsRGV0YWlsID0gdm9pZCAwO1xuY29uc3QgUHVsbFN1bW1hcnlfMSA9IHJlcXVpcmUoXCIuLi9yZXNwb25zZXMvUHVsbFN1bW1hcnlcIik7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xuY29uc3QgcGFyc2VfcmVtb3RlX21lc3NhZ2VzXzEgPSByZXF1aXJlKFwiLi9wYXJzZS1yZW1vdGUtbWVzc2FnZXNcIik7XG5jb25zdCBGSUxFX1VQREFURV9SRUdFWCA9IC9eXFxzKiguKz8pXFxzK1xcfFxccytcXGQrXFxzKihcXCsqKSgtKikvO1xuY29uc3QgU1VNTUFSWV9SRUdFWCA9IC8oXFxkKylcXEQrKChcXGQrKVxcRCtcXChcXCtcXCkpPyhcXEQrKFxcZCspXFxEK1xcKC1cXCkpPy87XG5jb25zdCBBQ1RJT05fUkVHRVggPSAvXihjcmVhdGV8ZGVsZXRlKSBtb2RlIFxcZCsgKC4rKS87XG5jb25zdCBwYXJzZXJzID0gW1xuICAgIG5ldyB1dGlsc18xLkxpbmVQYXJzZXIoRklMRV9VUERBVEVfUkVHRVgsIChyZXN1bHQsIFtmaWxlLCBpbnNlcnRpb25zLCBkZWxldGlvbnNdKSA9PiB7XG4gICAgICAgIHJlc3VsdC5maWxlcy5wdXNoKGZpbGUpO1xuICAgICAgICBpZiAoaW5zZXJ0aW9ucykge1xuICAgICAgICAgICAgcmVzdWx0Lmluc2VydGlvbnNbZmlsZV0gPSBpbnNlcnRpb25zLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVsZXRpb25zKSB7XG4gICAgICAgICAgICByZXN1bHQuZGVsZXRpb25zW2ZpbGVdID0gZGVsZXRpb25zLmxlbmd0aDtcbiAgICAgICAgfVxuICAgIH0pLFxuICAgIG5ldyB1dGlsc18xLkxpbmVQYXJzZXIoU1VNTUFSWV9SRUdFWCwgKHJlc3VsdCwgW2NoYW5nZXMsICwgaW5zZXJ0aW9ucywgLCBkZWxldGlvbnNdKSA9PiB7XG4gICAgICAgIGlmIChpbnNlcnRpb25zICE9PSB1bmRlZmluZWQgfHwgZGVsZXRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5zdW1tYXJ5LmNoYW5nZXMgPSArY2hhbmdlcyB8fCAwO1xuICAgICAgICAgICAgcmVzdWx0LnN1bW1hcnkuaW5zZXJ0aW9ucyA9ICtpbnNlcnRpb25zIHx8IDA7XG4gICAgICAgICAgICByZXN1bHQuc3VtbWFyeS5kZWxldGlvbnMgPSArZGVsZXRpb25zIHx8IDA7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSksXG4gICAgbmV3IHV0aWxzXzEuTGluZVBhcnNlcihBQ1RJT05fUkVHRVgsIChyZXN1bHQsIFthY3Rpb24sIGZpbGVdKSA9PiB7XG4gICAgICAgIHV0aWxzXzEuYXBwZW5kKHJlc3VsdC5maWxlcywgZmlsZSk7XG4gICAgICAgIHV0aWxzXzEuYXBwZW5kKChhY3Rpb24gPT09ICdjcmVhdGUnKSA/IHJlc3VsdC5jcmVhdGVkIDogcmVzdWx0LmRlbGV0ZWQsIGZpbGUpO1xuICAgIH0pLFxuXTtcbmNvbnN0IHBhcnNlUHVsbERldGFpbCA9IChzdGRPdXQsIHN0ZEVycikgPT4ge1xuICAgIHJldHVybiB1dGlsc18xLnBhcnNlU3RyaW5nUmVzcG9uc2UobmV3IFB1bGxTdW1tYXJ5XzEuUHVsbFN1bW1hcnkoKSwgcGFyc2Vycywgc3RkT3V0LCBzdGRFcnIpO1xufTtcbmV4cG9ydHMucGFyc2VQdWxsRGV0YWlsID0gcGFyc2VQdWxsRGV0YWlsO1xuY29uc3QgcGFyc2VQdWxsUmVzdWx0ID0gKHN0ZE91dCwgc3RkRXJyKSA9PiB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IFB1bGxTdW1tYXJ5XzEuUHVsbFN1bW1hcnkoKSwgZXhwb3J0cy5wYXJzZVB1bGxEZXRhaWwoc3RkT3V0LCBzdGRFcnIpLCBwYXJzZV9yZW1vdGVfbWVzc2FnZXNfMS5wYXJzZVJlbW90ZU1lc3NhZ2VzKHN0ZE91dCwgc3RkRXJyKSk7XG59O1xuZXhwb3J0cy5wYXJzZVB1bGxSZXN1bHQgPSBwYXJzZVB1bGxSZXN1bHQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXJzZS1wdWxsLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wYXJzZU1lcmdlRGV0YWlsID0gZXhwb3J0cy5wYXJzZU1lcmdlUmVzdWx0ID0gdm9pZCAwO1xuY29uc3QgTWVyZ2VTdW1tYXJ5XzEgPSByZXF1aXJlKFwiLi4vcmVzcG9uc2VzL01lcmdlU3VtbWFyeVwiKTtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5jb25zdCBwYXJzZV9wdWxsXzEgPSByZXF1aXJlKFwiLi9wYXJzZS1wdWxsXCIpO1xuY29uc3QgcGFyc2VycyA9IFtcbiAgICBuZXcgdXRpbHNfMS5MaW5lUGFyc2VyKC9eQXV0by1tZXJnaW5nXFxzKyguKykkLywgKHN1bW1hcnksIFthdXRvTWVyZ2VdKSA9PiB7XG4gICAgICAgIHN1bW1hcnkubWVyZ2VzLnB1c2goYXV0b01lcmdlKTtcbiAgICB9KSxcbiAgICBuZXcgdXRpbHNfMS5MaW5lUGFyc2VyKC9eQ09ORkxJQ1RcXHMrXFwoKC4rKVxcKTogTWVyZ2UgY29uZmxpY3QgaW4gKC4rKSQvLCAoc3VtbWFyeSwgW3JlYXNvbiwgZmlsZV0pID0+IHtcbiAgICAgICAgc3VtbWFyeS5jb25mbGljdHMucHVzaChuZXcgTWVyZ2VTdW1tYXJ5XzEuTWVyZ2VTdW1tYXJ5Q29uZmxpY3QocmVhc29uLCBmaWxlKSk7XG4gICAgfSksXG4gICAgbmV3IHV0aWxzXzEuTGluZVBhcnNlcigvXkNPTkZMSUNUXFxzK1xcKCguK1xcL2RlbGV0ZSlcXCk6ICguKykgZGVsZXRlZCBpbiAoLispIGFuZC8sIChzdW1tYXJ5LCBbcmVhc29uLCBmaWxlLCBkZWxldGVSZWZdKSA9PiB7XG4gICAgICAgIHN1bW1hcnkuY29uZmxpY3RzLnB1c2gobmV3IE1lcmdlU3VtbWFyeV8xLk1lcmdlU3VtbWFyeUNvbmZsaWN0KHJlYXNvbiwgZmlsZSwgeyBkZWxldGVSZWYgfSkpO1xuICAgIH0pLFxuICAgIG5ldyB1dGlsc18xLkxpbmVQYXJzZXIoL15DT05GTElDVFxccytcXCgoLispXFwpOi8sIChzdW1tYXJ5LCBbcmVhc29uXSkgPT4ge1xuICAgICAgICBzdW1tYXJ5LmNvbmZsaWN0cy5wdXNoKG5ldyBNZXJnZVN1bW1hcnlfMS5NZXJnZVN1bW1hcnlDb25mbGljdChyZWFzb24sIG51bGwpKTtcbiAgICB9KSxcbiAgICBuZXcgdXRpbHNfMS5MaW5lUGFyc2VyKC9eQXV0b21hdGljIG1lcmdlIGZhaWxlZDtcXHMrKC4rKSQvLCAoc3VtbWFyeSwgW3Jlc3VsdF0pID0+IHtcbiAgICAgICAgc3VtbWFyeS5yZXN1bHQgPSByZXN1bHQ7XG4gICAgfSksXG5dO1xuLyoqXG4gKiBQYXJzZSB0aGUgY29tcGxldGUgcmVzcG9uc2UgZnJvbSBgZ2l0Lm1lcmdlYFxuICovXG5jb25zdCBwYXJzZU1lcmdlUmVzdWx0ID0gKHN0ZE91dCwgc3RkRXJyKSA9PiB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oZXhwb3J0cy5wYXJzZU1lcmdlRGV0YWlsKHN0ZE91dCwgc3RkRXJyKSwgcGFyc2VfcHVsbF8xLnBhcnNlUHVsbFJlc3VsdChzdGRPdXQsIHN0ZEVycikpO1xufTtcbmV4cG9ydHMucGFyc2VNZXJnZVJlc3VsdCA9IHBhcnNlTWVyZ2VSZXN1bHQ7XG4vKipcbiAqIFBhcnNlIHRoZSBtZXJnZSBzcGVjaWZpYyBkZXRhaWwgKGllOiBub3QgdGhlIGNvbnRlbnQgYWxzbyBhdmFpbGFibGUgaW4gdGhlIHB1bGwgZGV0YWlsKSBmcm9tIGBnaXQubW5lcmdlYFxuICogQHBhcmFtIHN0ZE91dFxuICovXG5jb25zdCBwYXJzZU1lcmdlRGV0YWlsID0gKHN0ZE91dCkgPT4ge1xuICAgIHJldHVybiB1dGlsc18xLnBhcnNlU3RyaW5nUmVzcG9uc2UobmV3IE1lcmdlU3VtbWFyeV8xLk1lcmdlU3VtbWFyeURldGFpbCgpLCBwYXJzZXJzLCBzdGRPdXQpO1xufTtcbmV4cG9ydHMucGFyc2VNZXJnZURldGFpbCA9IHBhcnNlTWVyZ2VEZXRhaWw7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXJzZS1tZXJnZS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMubWVyZ2VUYXNrID0gdm9pZCAwO1xuY29uc3QgZ2l0X3Jlc3BvbnNlX2Vycm9yXzEgPSByZXF1aXJlKFwiLi4vZXJyb3JzL2dpdC1yZXNwb25zZS1lcnJvclwiKTtcbmNvbnN0IHBhcnNlX21lcmdlXzEgPSByZXF1aXJlKFwiLi4vcGFyc2Vycy9wYXJzZS1tZXJnZVwiKTtcbmNvbnN0IHRhc2tfMSA9IHJlcXVpcmUoXCIuL3Rhc2tcIik7XG5mdW5jdGlvbiBtZXJnZVRhc2soY3VzdG9tQXJncykge1xuICAgIGlmICghY3VzdG9tQXJncy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHRhc2tfMS5jb25maWd1cmF0aW9uRXJyb3JUYXNrKCdHaXQubWVyZ2UgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIG9wdGlvbicpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kczogWydtZXJnZScsIC4uLmN1c3RvbUFyZ3NdLFxuICAgICAgICBmb3JtYXQ6ICd1dGYtOCcsXG4gICAgICAgIHBhcnNlcihzdGRPdXQsIHN0ZEVycikge1xuICAgICAgICAgICAgY29uc3QgbWVyZ2UgPSBwYXJzZV9tZXJnZV8xLnBhcnNlTWVyZ2VSZXN1bHQoc3RkT3V0LCBzdGRFcnIpO1xuICAgICAgICAgICAgaWYgKG1lcmdlLmZhaWxlZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBnaXRfcmVzcG9uc2VfZXJyb3JfMS5HaXRSZXNwb25zZUVycm9yKG1lcmdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtZXJnZTtcbiAgICAgICAgfVxuICAgIH07XG59XG5leHBvcnRzLm1lcmdlVGFzayA9IG1lcmdlVGFzaztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1lcmdlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wYXJzZU1vdmVSZXN1bHQgPSB2b2lkIDA7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xuY29uc3QgcGFyc2VycyA9IFtcbiAgICBuZXcgdXRpbHNfMS5MaW5lUGFyc2VyKC9eUmVuYW1pbmcgKC4rKSB0byAoLispJC8sIChyZXN1bHQsIFtmcm9tLCB0b10pID0+IHtcbiAgICAgICAgcmVzdWx0Lm1vdmVzLnB1c2goeyBmcm9tLCB0byB9KTtcbiAgICB9KSxcbl07XG5mdW5jdGlvbiBwYXJzZU1vdmVSZXN1bHQoc3RkT3V0KSB7XG4gICAgcmV0dXJuIHV0aWxzXzEucGFyc2VTdHJpbmdSZXNwb25zZSh7IG1vdmVzOiBbXSB9LCBwYXJzZXJzLCBzdGRPdXQpO1xufVxuZXhwb3J0cy5wYXJzZU1vdmVSZXN1bHQgPSBwYXJzZU1vdmVSZXN1bHQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXJzZS1tb3ZlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5tb3ZlVGFzayA9IHZvaWQgMDtcbmNvbnN0IHBhcnNlX21vdmVfMSA9IHJlcXVpcmUoXCIuLi9wYXJzZXJzL3BhcnNlLW1vdmVcIik7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xuZnVuY3Rpb24gbW92ZVRhc2soZnJvbSwgdG8pIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kczogWydtdicsICctdicsIC4uLnV0aWxzXzEuYXNBcnJheShmcm9tKSwgdG9dLFxuICAgICAgICBmb3JtYXQ6ICd1dGYtOCcsXG4gICAgICAgIHBhcnNlcjogcGFyc2VfbW92ZV8xLnBhcnNlTW92ZVJlc3VsdCxcbiAgICB9O1xufVxuZXhwb3J0cy5tb3ZlVGFzayA9IG1vdmVUYXNrO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bW92ZS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucHVsbFRhc2sgPSB2b2lkIDA7XG5jb25zdCBwYXJzZV9wdWxsXzEgPSByZXF1aXJlKFwiLi4vcGFyc2Vycy9wYXJzZS1wdWxsXCIpO1xuZnVuY3Rpb24gcHVsbFRhc2socmVtb3RlLCBicmFuY2gsIGN1c3RvbUFyZ3MpIHtcbiAgICBjb25zdCBjb21tYW5kcyA9IFsncHVsbCcsIC4uLmN1c3RvbUFyZ3NdO1xuICAgIGlmIChyZW1vdGUgJiYgYnJhbmNoKSB7XG4gICAgICAgIGNvbW1hbmRzLnNwbGljZSgxLCAwLCByZW1vdGUsIGJyYW5jaCk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGNvbW1hbmRzLFxuICAgICAgICBmb3JtYXQ6ICd1dGYtOCcsXG4gICAgICAgIHBhcnNlcihzdGRPdXQsIHN0ZEVycikge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlX3B1bGxfMS5wYXJzZVB1bGxSZXN1bHQoc3RkT3V0LCBzdGRFcnIpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmV4cG9ydHMucHVsbFRhc2sgPSBwdWxsVGFzaztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXB1bGwuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnBhcnNlR2V0UmVtb3Rlc1ZlcmJvc2UgPSBleHBvcnRzLnBhcnNlR2V0UmVtb3RlcyA9IHZvaWQgMDtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5mdW5jdGlvbiBwYXJzZUdldFJlbW90ZXModGV4dCkge1xuICAgIGNvbnN0IHJlbW90ZXMgPSB7fTtcbiAgICBmb3JFYWNoKHRleHQsIChbbmFtZV0pID0+IHJlbW90ZXNbbmFtZV0gPSB7IG5hbWUgfSk7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMocmVtb3Rlcyk7XG59XG5leHBvcnRzLnBhcnNlR2V0UmVtb3RlcyA9IHBhcnNlR2V0UmVtb3RlcztcbmZ1bmN0aW9uIHBhcnNlR2V0UmVtb3Rlc1ZlcmJvc2UodGV4dCkge1xuICAgIGNvbnN0IHJlbW90ZXMgPSB7fTtcbiAgICBmb3JFYWNoKHRleHQsIChbbmFtZSwgdXJsLCBwdXJwb3NlXSkgPT4ge1xuICAgICAgICBpZiAoIXJlbW90ZXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgICAgIHJlbW90ZXNbbmFtZV0gPSB7XG4gICAgICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgICAgICByZWZzOiB7IGZldGNoOiAnJywgcHVzaDogJycgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHB1cnBvc2UgJiYgdXJsKSB7XG4gICAgICAgICAgICByZW1vdGVzW25hbWVdLnJlZnNbcHVycG9zZS5yZXBsYWNlKC9bXmEtel0vZywgJycpXSA9IHVybDtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHJlbW90ZXMpO1xufVxuZXhwb3J0cy5wYXJzZUdldFJlbW90ZXNWZXJib3NlID0gcGFyc2VHZXRSZW1vdGVzVmVyYm9zZTtcbmZ1bmN0aW9uIGZvckVhY2godGV4dCwgaGFuZGxlcikge1xuICAgIHV0aWxzXzEuZm9yRWFjaExpbmVXaXRoQ29udGVudCh0ZXh0LCAobGluZSkgPT4gaGFuZGxlcihsaW5lLnNwbGl0KC9cXHMrLykpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUdldFJlbW90ZVN1bW1hcnkuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnJlbW92ZVJlbW90ZVRhc2sgPSBleHBvcnRzLnJlbW90ZVRhc2sgPSBleHBvcnRzLmxpc3RSZW1vdGVzVGFzayA9IGV4cG9ydHMuZ2V0UmVtb3Rlc1Rhc2sgPSBleHBvcnRzLmFkZFJlbW90ZVRhc2sgPSB2b2lkIDA7XG5jb25zdCBHZXRSZW1vdGVTdW1tYXJ5XzEgPSByZXF1aXJlKFwiLi4vcmVzcG9uc2VzL0dldFJlbW90ZVN1bW1hcnlcIik7XG5jb25zdCB0YXNrXzEgPSByZXF1aXJlKFwiLi90YXNrXCIpO1xuZnVuY3Rpb24gYWRkUmVtb3RlVGFzayhyZW1vdGVOYW1lLCByZW1vdGVSZXBvLCBjdXN0b21BcmdzID0gW10pIHtcbiAgICByZXR1cm4gdGFza18xLnN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soWydyZW1vdGUnLCAnYWRkJywgLi4uY3VzdG9tQXJncywgcmVtb3RlTmFtZSwgcmVtb3RlUmVwb10pO1xufVxuZXhwb3J0cy5hZGRSZW1vdGVUYXNrID0gYWRkUmVtb3RlVGFzaztcbmZ1bmN0aW9uIGdldFJlbW90ZXNUYXNrKHZlcmJvc2UpIHtcbiAgICBjb25zdCBjb21tYW5kcyA9IFsncmVtb3RlJ107XG4gICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgY29tbWFuZHMucHVzaCgnLXYnKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29tbWFuZHMsXG4gICAgICAgIGZvcm1hdDogJ3V0Zi04JyxcbiAgICAgICAgcGFyc2VyOiB2ZXJib3NlID8gR2V0UmVtb3RlU3VtbWFyeV8xLnBhcnNlR2V0UmVtb3Rlc1ZlcmJvc2UgOiBHZXRSZW1vdGVTdW1tYXJ5XzEucGFyc2VHZXRSZW1vdGVzLFxuICAgIH07XG59XG5leHBvcnRzLmdldFJlbW90ZXNUYXNrID0gZ2V0UmVtb3Rlc1Rhc2s7XG5mdW5jdGlvbiBsaXN0UmVtb3Rlc1Rhc2soY3VzdG9tQXJncyA9IFtdKSB7XG4gICAgY29uc3QgY29tbWFuZHMgPSBbLi4uY3VzdG9tQXJnc107XG4gICAgaWYgKGNvbW1hbmRzWzBdICE9PSAnbHMtcmVtb3RlJykge1xuICAgICAgICBjb21tYW5kcy51bnNoaWZ0KCdscy1yZW1vdGUnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhc2tfMS5zdHJhaWdodFRocm91Z2hTdHJpbmdUYXNrKGNvbW1hbmRzKTtcbn1cbmV4cG9ydHMubGlzdFJlbW90ZXNUYXNrID0gbGlzdFJlbW90ZXNUYXNrO1xuZnVuY3Rpb24gcmVtb3RlVGFzayhjdXN0b21BcmdzID0gW10pIHtcbiAgICBjb25zdCBjb21tYW5kcyA9IFsuLi5jdXN0b21BcmdzXTtcbiAgICBpZiAoY29tbWFuZHNbMF0gIT09ICdyZW1vdGUnKSB7XG4gICAgICAgIGNvbW1hbmRzLnVuc2hpZnQoJ3JlbW90ZScpO1xuICAgIH1cbiAgICByZXR1cm4gdGFza18xLnN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soY29tbWFuZHMpO1xufVxuZXhwb3J0cy5yZW1vdGVUYXNrID0gcmVtb3RlVGFzaztcbmZ1bmN0aW9uIHJlbW92ZVJlbW90ZVRhc2socmVtb3RlTmFtZSkge1xuICAgIHJldHVybiB0YXNrXzEuc3RyYWlnaHRUaHJvdWdoU3RyaW5nVGFzayhbJ3JlbW90ZScsICdyZW1vdmUnLCByZW1vdGVOYW1lXSk7XG59XG5leHBvcnRzLnJlbW92ZVJlbW90ZVRhc2sgPSByZW1vdmVSZW1vdGVUYXNrO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVtb3RlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5zdGFzaExpc3RUYXNrID0gdm9pZCAwO1xuY29uc3QgcGFyc2VfbGlzdF9sb2dfc3VtbWFyeV8xID0gcmVxdWlyZShcIi4uL3BhcnNlcnMvcGFyc2UtbGlzdC1sb2ctc3VtbWFyeVwiKTtcbmNvbnN0IGxvZ18xID0gcmVxdWlyZShcIi4vbG9nXCIpO1xuZnVuY3Rpb24gc3Rhc2hMaXN0VGFzayhvcHQgPSB7fSwgY3VzdG9tQXJncykge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBsb2dfMS5wYXJzZUxvZ09wdGlvbnMob3B0KTtcbiAgICBjb25zdCBwYXJzZXIgPSBwYXJzZV9saXN0X2xvZ19zdW1tYXJ5XzEuY3JlYXRlTGlzdExvZ1N1bW1hcnlQYXJzZXIob3B0aW9ucy5zcGxpdHRlciwgb3B0aW9ucy5maWVsZHMpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGNvbW1hbmRzOiBbJ3N0YXNoJywgJ2xpc3QnLCAuLi5vcHRpb25zLmNvbW1hbmRzLCAuLi5jdXN0b21BcmdzXSxcbiAgICAgICAgZm9ybWF0OiAndXRmLTgnLFxuICAgICAgICBwYXJzZXIsXG4gICAgfTtcbn1cbmV4cG9ydHMuc3Rhc2hMaXN0VGFzayA9IHN0YXNoTGlzdFRhc2s7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdGFzaC1saXN0LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5GaWxlU3RhdHVzU3VtbWFyeSA9IGV4cG9ydHMuZnJvbVBhdGhSZWdleCA9IHZvaWQgMDtcbmV4cG9ydHMuZnJvbVBhdGhSZWdleCA9IC9eKC4rKSAtPiAoLispJC87XG5jbGFzcyBGaWxlU3RhdHVzU3VtbWFyeSB7XG4gICAgY29uc3RydWN0b3IocGF0aCwgaW5kZXgsIHdvcmtpbmdfZGlyKSB7XG4gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy53b3JraW5nX2RpciA9IHdvcmtpbmdfZGlyO1xuICAgICAgICBpZiAoJ1InID09PSAoaW5kZXggKyB3b3JraW5nX2RpcikpIHtcbiAgICAgICAgICAgIGNvbnN0IGRldGFpbCA9IGV4cG9ydHMuZnJvbVBhdGhSZWdleC5leGVjKHBhdGgpIHx8IFtudWxsLCBwYXRoLCBwYXRoXTtcbiAgICAgICAgICAgIHRoaXMuZnJvbSA9IGRldGFpbFsxXSB8fCAnJztcbiAgICAgICAgICAgIHRoaXMucGF0aCA9IGRldGFpbFsyXSB8fCAnJztcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuRmlsZVN0YXR1c1N1bW1hcnkgPSBGaWxlU3RhdHVzU3VtbWFyeTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZpbGVTdGF0dXNTdW1tYXJ5LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wYXJzZVN0YXR1c1N1bW1hcnkgPSBleHBvcnRzLlN0YXR1c1N1bW1hcnkgPSB2b2lkIDA7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xuY29uc3QgRmlsZVN0YXR1c1N1bW1hcnlfMSA9IHJlcXVpcmUoXCIuL0ZpbGVTdGF0dXNTdW1tYXJ5XCIpO1xuLyoqXG4gKiBUaGUgU3RhdHVzU3VtbWFyeSBpcyByZXR1cm5lZCBhcyBhIHJlc3BvbnNlIHRvIGdldHRpbmcgYGdpdCgpLnN0YXR1cygpYFxuICovXG5jbGFzcyBTdGF0dXNTdW1tYXJ5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5ub3RfYWRkZWQgPSBbXTtcbiAgICAgICAgdGhpcy5jb25mbGljdGVkID0gW107XG4gICAgICAgIHRoaXMuY3JlYXRlZCA9IFtdO1xuICAgICAgICB0aGlzLmRlbGV0ZWQgPSBbXTtcbiAgICAgICAgdGhpcy5tb2RpZmllZCA9IFtdO1xuICAgICAgICB0aGlzLnJlbmFtZWQgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFsbCBmaWxlcyByZXByZXNlbnRlZCBhcyBhbiBhcnJheSBvZiBvYmplY3RzIGNvbnRhaW5pbmcgdGhlIGBwYXRoYCBhbmQgc3RhdHVzIGluIGBpbmRleGAgYW5kXG4gICAgICAgICAqIGluIHRoZSBgd29ya2luZ19kaXJgLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5maWxlcyA9IFtdO1xuICAgICAgICB0aGlzLnN0YWdlZCA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogTnVtYmVyIG9mIGNvbW1pdHMgYWhlYWQgb2YgdGhlIHRyYWNrZWQgYnJhbmNoXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmFoZWFkID0gMDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqTnVtYmVyIG9mIGNvbW1pdHMgYmVoaW5kIHRoZSB0cmFja2VkIGJyYW5jaFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5iZWhpbmQgPSAwO1xuICAgICAgICAvKipcbiAgICAgICAgICogTmFtZSBvZiB0aGUgY3VycmVudCBicmFuY2hcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY3VycmVudCA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBOYW1lIG9mIHRoZSBicmFuY2ggYmVpbmcgdHJhY2tlZFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50cmFja2luZyA9IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgd2hldGhlciB0aGlzIFN0YXR1c1N1bW1hcnkgcmVwcmVzZW50cyBhIGNsZWFuIHdvcmtpbmcgYnJhbmNoLlxuICAgICAqL1xuICAgIGlzQ2xlYW4oKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5maWxlcy5sZW5ndGg7XG4gICAgfVxufVxuZXhwb3J0cy5TdGF0dXNTdW1tYXJ5ID0gU3RhdHVzU3VtbWFyeTtcbnZhciBQb3JjZWxhaW5GaWxlU3RhdHVzO1xuKGZ1bmN0aW9uIChQb3JjZWxhaW5GaWxlU3RhdHVzKSB7XG4gICAgUG9yY2VsYWluRmlsZVN0YXR1c1tcIkFEREVEXCJdID0gXCJBXCI7XG4gICAgUG9yY2VsYWluRmlsZVN0YXR1c1tcIkRFTEVURURcIl0gPSBcIkRcIjtcbiAgICBQb3JjZWxhaW5GaWxlU3RhdHVzW1wiTU9ESUZJRURcIl0gPSBcIk1cIjtcbiAgICBQb3JjZWxhaW5GaWxlU3RhdHVzW1wiUkVOQU1FRFwiXSA9IFwiUlwiO1xuICAgIFBvcmNlbGFpbkZpbGVTdGF0dXNbXCJDT1BJRURcIl0gPSBcIkNcIjtcbiAgICBQb3JjZWxhaW5GaWxlU3RhdHVzW1wiVU5NRVJHRURcIl0gPSBcIlVcIjtcbiAgICBQb3JjZWxhaW5GaWxlU3RhdHVzW1wiVU5UUkFDS0VEXCJdID0gXCI/XCI7XG4gICAgUG9yY2VsYWluRmlsZVN0YXR1c1tcIklHTk9SRURcIl0gPSBcIiFcIjtcbiAgICBQb3JjZWxhaW5GaWxlU3RhdHVzW1wiTk9ORVwiXSA9IFwiIFwiO1xufSkoUG9yY2VsYWluRmlsZVN0YXR1cyB8fCAoUG9yY2VsYWluRmlsZVN0YXR1cyA9IHt9KSk7XG5mdW5jdGlvbiByZW5hbWVkRmlsZShsaW5lKSB7XG4gICAgY29uc3QgZGV0YWlsID0gL14oLispIC0+ICguKykkLy5leGVjKGxpbmUpO1xuICAgIGlmICghZGV0YWlsKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmcm9tOiBsaW5lLCB0bzogbGluZVxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBmcm9tOiBTdHJpbmcoZGV0YWlsWzFdKSxcbiAgICAgICAgdG86IFN0cmluZyhkZXRhaWxbMl0pLFxuICAgIH07XG59XG5mdW5jdGlvbiBwYXJzZXIoaW5kZXhYLCBpbmRleFksIGhhbmRsZXIpIHtcbiAgICByZXR1cm4gW2Ake2luZGV4WH0ke2luZGV4WX1gLCBoYW5kbGVyXTtcbn1cbmZ1bmN0aW9uIGNvbmZsaWN0cyhpbmRleFgsIC4uLmluZGV4WSkge1xuICAgIHJldHVybiBpbmRleFkubWFwKHkgPT4gcGFyc2VyKGluZGV4WCwgeSwgKHJlc3VsdCwgZmlsZSkgPT4gdXRpbHNfMS5hcHBlbmQocmVzdWx0LmNvbmZsaWN0ZWQsIGZpbGUpKSk7XG59XG5jb25zdCBwYXJzZXJzID0gbmV3IE1hcChbXG4gICAgcGFyc2VyKFBvcmNlbGFpbkZpbGVTdGF0dXMuTk9ORSwgUG9yY2VsYWluRmlsZVN0YXR1cy5BRERFRCwgKHJlc3VsdCwgZmlsZSkgPT4gdXRpbHNfMS5hcHBlbmQocmVzdWx0LmNyZWF0ZWQsIGZpbGUpKSxcbiAgICBwYXJzZXIoUG9yY2VsYWluRmlsZVN0YXR1cy5OT05FLCBQb3JjZWxhaW5GaWxlU3RhdHVzLkRFTEVURUQsIChyZXN1bHQsIGZpbGUpID0+IHV0aWxzXzEuYXBwZW5kKHJlc3VsdC5kZWxldGVkLCBmaWxlKSksXG4gICAgcGFyc2VyKFBvcmNlbGFpbkZpbGVTdGF0dXMuTk9ORSwgUG9yY2VsYWluRmlsZVN0YXR1cy5NT0RJRklFRCwgKHJlc3VsdCwgZmlsZSkgPT4gdXRpbHNfMS5hcHBlbmQocmVzdWx0Lm1vZGlmaWVkLCBmaWxlKSksXG4gICAgcGFyc2VyKFBvcmNlbGFpbkZpbGVTdGF0dXMuQURERUQsIFBvcmNlbGFpbkZpbGVTdGF0dXMuTk9ORSwgKHJlc3VsdCwgZmlsZSkgPT4gdXRpbHNfMS5hcHBlbmQocmVzdWx0LmNyZWF0ZWQsIGZpbGUpICYmIHV0aWxzXzEuYXBwZW5kKHJlc3VsdC5zdGFnZWQsIGZpbGUpKSxcbiAgICBwYXJzZXIoUG9yY2VsYWluRmlsZVN0YXR1cy5BRERFRCwgUG9yY2VsYWluRmlsZVN0YXR1cy5NT0RJRklFRCwgKHJlc3VsdCwgZmlsZSkgPT4gdXRpbHNfMS5hcHBlbmQocmVzdWx0LmNyZWF0ZWQsIGZpbGUpICYmIHV0aWxzXzEuYXBwZW5kKHJlc3VsdC5zdGFnZWQsIGZpbGUpICYmIHV0aWxzXzEuYXBwZW5kKHJlc3VsdC5tb2RpZmllZCwgZmlsZSkpLFxuICAgIHBhcnNlcihQb3JjZWxhaW5GaWxlU3RhdHVzLkRFTEVURUQsIFBvcmNlbGFpbkZpbGVTdGF0dXMuTk9ORSwgKHJlc3VsdCwgZmlsZSkgPT4gdXRpbHNfMS5hcHBlbmQocmVzdWx0LmRlbGV0ZWQsIGZpbGUpICYmIHV0aWxzXzEuYXBwZW5kKHJlc3VsdC5zdGFnZWQsIGZpbGUpKSxcbiAgICBwYXJzZXIoUG9yY2VsYWluRmlsZVN0YXR1cy5NT0RJRklFRCwgUG9yY2VsYWluRmlsZVN0YXR1cy5OT05FLCAocmVzdWx0LCBmaWxlKSA9PiB1dGlsc18xLmFwcGVuZChyZXN1bHQubW9kaWZpZWQsIGZpbGUpICYmIHV0aWxzXzEuYXBwZW5kKHJlc3VsdC5zdGFnZWQsIGZpbGUpKSxcbiAgICBwYXJzZXIoUG9yY2VsYWluRmlsZVN0YXR1cy5NT0RJRklFRCwgUG9yY2VsYWluRmlsZVN0YXR1cy5NT0RJRklFRCwgKHJlc3VsdCwgZmlsZSkgPT4gdXRpbHNfMS5hcHBlbmQocmVzdWx0Lm1vZGlmaWVkLCBmaWxlKSAmJiB1dGlsc18xLmFwcGVuZChyZXN1bHQuc3RhZ2VkLCBmaWxlKSksXG4gICAgcGFyc2VyKFBvcmNlbGFpbkZpbGVTdGF0dXMuUkVOQU1FRCwgUG9yY2VsYWluRmlsZVN0YXR1cy5OT05FLCAocmVzdWx0LCBmaWxlKSA9PiB7XG4gICAgICAgIHV0aWxzXzEuYXBwZW5kKHJlc3VsdC5yZW5hbWVkLCByZW5hbWVkRmlsZShmaWxlKSk7XG4gICAgfSksXG4gICAgcGFyc2VyKFBvcmNlbGFpbkZpbGVTdGF0dXMuUkVOQU1FRCwgUG9yY2VsYWluRmlsZVN0YXR1cy5NT0RJRklFRCwgKHJlc3VsdCwgZmlsZSkgPT4ge1xuICAgICAgICBjb25zdCByZW5hbWVkID0gcmVuYW1lZEZpbGUoZmlsZSk7XG4gICAgICAgIHV0aWxzXzEuYXBwZW5kKHJlc3VsdC5yZW5hbWVkLCByZW5hbWVkKTtcbiAgICAgICAgdXRpbHNfMS5hcHBlbmQocmVzdWx0Lm1vZGlmaWVkLCByZW5hbWVkLnRvKTtcbiAgICB9KSxcbiAgICBwYXJzZXIoUG9yY2VsYWluRmlsZVN0YXR1cy5VTlRSQUNLRUQsIFBvcmNlbGFpbkZpbGVTdGF0dXMuVU5UUkFDS0VELCAocmVzdWx0LCBmaWxlKSA9PiB1dGlsc18xLmFwcGVuZChyZXN1bHQubm90X2FkZGVkLCBmaWxlKSksXG4gICAgLi4uY29uZmxpY3RzKFBvcmNlbGFpbkZpbGVTdGF0dXMuQURERUQsIFBvcmNlbGFpbkZpbGVTdGF0dXMuQURERUQsIFBvcmNlbGFpbkZpbGVTdGF0dXMuVU5NRVJHRUQpLFxuICAgIC4uLmNvbmZsaWN0cyhQb3JjZWxhaW5GaWxlU3RhdHVzLkRFTEVURUQsIFBvcmNlbGFpbkZpbGVTdGF0dXMuREVMRVRFRCwgUG9yY2VsYWluRmlsZVN0YXR1cy5VTk1FUkdFRCksXG4gICAgLi4uY29uZmxpY3RzKFBvcmNlbGFpbkZpbGVTdGF0dXMuVU5NRVJHRUQsIFBvcmNlbGFpbkZpbGVTdGF0dXMuQURERUQsIFBvcmNlbGFpbkZpbGVTdGF0dXMuREVMRVRFRCwgUG9yY2VsYWluRmlsZVN0YXR1cy5VTk1FUkdFRCksXG4gICAgWycjIycsIChyZXN1bHQsIGxpbmUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFoZWFkUmVnID0gL2FoZWFkIChcXGQrKS87XG4gICAgICAgICAgICBjb25zdCBiZWhpbmRSZWcgPSAvYmVoaW5kIChcXGQrKS87XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50UmVnID0gL14oLis/KD89KD86XFwuezN9fFxcc3wkKSkpLztcbiAgICAgICAgICAgIGNvbnN0IHRyYWNraW5nUmVnID0gL1xcLnszfShcXFMqKS87XG4gICAgICAgICAgICBjb25zdCBvbkVtcHR5QnJhbmNoUmVnID0gL1xcc29uXFxzKFtcXFNdKykkLztcbiAgICAgICAgICAgIGxldCByZWdleFJlc3VsdDtcbiAgICAgICAgICAgIHJlZ2V4UmVzdWx0ID0gYWhlYWRSZWcuZXhlYyhsaW5lKTtcbiAgICAgICAgICAgIHJlc3VsdC5haGVhZCA9IHJlZ2V4UmVzdWx0ICYmICtyZWdleFJlc3VsdFsxXSB8fCAwO1xuICAgICAgICAgICAgcmVnZXhSZXN1bHQgPSBiZWhpbmRSZWcuZXhlYyhsaW5lKTtcbiAgICAgICAgICAgIHJlc3VsdC5iZWhpbmQgPSByZWdleFJlc3VsdCAmJiArcmVnZXhSZXN1bHRbMV0gfHwgMDtcbiAgICAgICAgICAgIHJlZ2V4UmVzdWx0ID0gY3VycmVudFJlZy5leGVjKGxpbmUpO1xuICAgICAgICAgICAgcmVzdWx0LmN1cnJlbnQgPSByZWdleFJlc3VsdCAmJiByZWdleFJlc3VsdFsxXTtcbiAgICAgICAgICAgIHJlZ2V4UmVzdWx0ID0gdHJhY2tpbmdSZWcuZXhlYyhsaW5lKTtcbiAgICAgICAgICAgIHJlc3VsdC50cmFja2luZyA9IHJlZ2V4UmVzdWx0ICYmIHJlZ2V4UmVzdWx0WzFdO1xuICAgICAgICAgICAgcmVnZXhSZXN1bHQgPSBvbkVtcHR5QnJhbmNoUmVnLmV4ZWMobGluZSk7XG4gICAgICAgICAgICByZXN1bHQuY3VycmVudCA9IHJlZ2V4UmVzdWx0ICYmIHJlZ2V4UmVzdWx0WzFdIHx8IHJlc3VsdC5jdXJyZW50O1xuICAgICAgICB9XVxuXSk7XG5jb25zdCBwYXJzZVN0YXR1c1N1bW1hcnkgPSBmdW5jdGlvbiAodGV4dCkge1xuICAgIGNvbnN0IGxpbmVzID0gdGV4dC50cmltKCkuc3BsaXQoJ1xcbicpO1xuICAgIGNvbnN0IHN0YXR1cyA9IG5ldyBTdGF0dXNTdW1tYXJ5KCk7XG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSBsaW5lcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgc3BsaXRMaW5lKHN0YXR1cywgbGluZXNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdHVzO1xufTtcbmV4cG9ydHMucGFyc2VTdGF0dXNTdW1tYXJ5ID0gcGFyc2VTdGF0dXNTdW1tYXJ5O1xuZnVuY3Rpb24gc3BsaXRMaW5lKHJlc3VsdCwgbGluZVN0cikge1xuICAgIGNvbnN0IHRyaW1tZWQgPSBsaW5lU3RyLnRyaW0oKTtcbiAgICBzd2l0Y2ggKCcgJykge1xuICAgICAgICBjYXNlIHRyaW1tZWQuY2hhckF0KDIpOlxuICAgICAgICAgICAgcmV0dXJuIGRhdGEodHJpbW1lZC5jaGFyQXQoMCksIHRyaW1tZWQuY2hhckF0KDEpLCB0cmltbWVkLnN1YnN0cigzKSk7XG4gICAgICAgIGNhc2UgdHJpbW1lZC5jaGFyQXQoMSk6XG4gICAgICAgICAgICByZXR1cm4gZGF0YShQb3JjZWxhaW5GaWxlU3RhdHVzLk5PTkUsIHRyaW1tZWQuY2hhckF0KDApLCB0cmltbWVkLnN1YnN0cigyKSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRhdGEoaW5kZXgsIHdvcmtpbmdEaXIsIHBhdGgpIHtcbiAgICAgICAgY29uc3QgcmF3ID0gYCR7aW5kZXh9JHt3b3JraW5nRGlyfWA7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBwYXJzZXJzLmdldChyYXcpO1xuICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgICAgaGFuZGxlcihyZXN1bHQsIHBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyYXcgIT09ICcjIycpIHtcbiAgICAgICAgICAgIHJlc3VsdC5maWxlcy5wdXNoKG5ldyBGaWxlU3RhdHVzU3VtbWFyeV8xLkZpbGVTdGF0dXNTdW1tYXJ5KHBhdGgsIGluZGV4LCB3b3JraW5nRGlyKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdGF0dXNTdW1tYXJ5LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5zdGF0dXNUYXNrID0gdm9pZCAwO1xuY29uc3QgU3RhdHVzU3VtbWFyeV8xID0gcmVxdWlyZShcIi4uL3Jlc3BvbnNlcy9TdGF0dXNTdW1tYXJ5XCIpO1xuZnVuY3Rpb24gc3RhdHVzVGFzayhjdXN0b21BcmdzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZm9ybWF0OiAndXRmLTgnLFxuICAgICAgICBjb21tYW5kczogWydzdGF0dXMnLCAnLS1wb3JjZWxhaW4nLCAnLWInLCAnLXUnLCAuLi5jdXN0b21BcmdzXSxcbiAgICAgICAgcGFyc2VyKHRleHQpIHtcbiAgICAgICAgICAgIHJldHVybiBTdGF0dXNTdW1tYXJ5XzEucGFyc2VTdGF0dXNTdW1tYXJ5KHRleHQpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmV4cG9ydHMuc3RhdHVzVGFzayA9IHN0YXR1c1Rhc2s7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdGF0dXMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnVwZGF0ZVN1Yk1vZHVsZVRhc2sgPSBleHBvcnRzLnN1Yk1vZHVsZVRhc2sgPSBleHBvcnRzLmluaXRTdWJNb2R1bGVUYXNrID0gZXhwb3J0cy5hZGRTdWJNb2R1bGVUYXNrID0gdm9pZCAwO1xuY29uc3QgdGFza18xID0gcmVxdWlyZShcIi4vdGFza1wiKTtcbmZ1bmN0aW9uIGFkZFN1Yk1vZHVsZVRhc2socmVwbywgcGF0aCkge1xuICAgIHJldHVybiBzdWJNb2R1bGVUYXNrKFsnYWRkJywgcmVwbywgcGF0aF0pO1xufVxuZXhwb3J0cy5hZGRTdWJNb2R1bGVUYXNrID0gYWRkU3ViTW9kdWxlVGFzaztcbmZ1bmN0aW9uIGluaXRTdWJNb2R1bGVUYXNrKGN1c3RvbUFyZ3MpIHtcbiAgICByZXR1cm4gc3ViTW9kdWxlVGFzayhbJ2luaXQnLCAuLi5jdXN0b21BcmdzXSk7XG59XG5leHBvcnRzLmluaXRTdWJNb2R1bGVUYXNrID0gaW5pdFN1Yk1vZHVsZVRhc2s7XG5mdW5jdGlvbiBzdWJNb2R1bGVUYXNrKGN1c3RvbUFyZ3MpIHtcbiAgICBjb25zdCBjb21tYW5kcyA9IFsuLi5jdXN0b21BcmdzXTtcbiAgICBpZiAoY29tbWFuZHNbMF0gIT09ICdzdWJtb2R1bGUnKSB7XG4gICAgICAgIGNvbW1hbmRzLnVuc2hpZnQoJ3N1Ym1vZHVsZScpO1xuICAgIH1cbiAgICByZXR1cm4gdGFza18xLnN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soY29tbWFuZHMpO1xufVxuZXhwb3J0cy5zdWJNb2R1bGVUYXNrID0gc3ViTW9kdWxlVGFzaztcbmZ1bmN0aW9uIHVwZGF0ZVN1Yk1vZHVsZVRhc2soY3VzdG9tQXJncykge1xuICAgIHJldHVybiBzdWJNb2R1bGVUYXNrKFsndXBkYXRlJywgLi4uY3VzdG9tQXJnc10pO1xufVxuZXhwb3J0cy51cGRhdGVTdWJNb2R1bGVUYXNrID0gdXBkYXRlU3ViTW9kdWxlVGFzaztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN1Yi1tb2R1bGUuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnBhcnNlVGFnTGlzdCA9IGV4cG9ydHMuVGFnTGlzdCA9IHZvaWQgMDtcbmNsYXNzIFRhZ0xpc3Qge1xuICAgIGNvbnN0cnVjdG9yKGFsbCwgbGF0ZXN0KSB7XG4gICAgICAgIHRoaXMuYWxsID0gYWxsO1xuICAgICAgICB0aGlzLmxhdGVzdCA9IGxhdGVzdDtcbiAgICB9XG59XG5leHBvcnRzLlRhZ0xpc3QgPSBUYWdMaXN0O1xuY29uc3QgcGFyc2VUYWdMaXN0ID0gZnVuY3Rpb24gKGRhdGEsIGN1c3RvbVNvcnQgPSBmYWxzZSkge1xuICAgIGNvbnN0IHRhZ3MgPSBkYXRhXG4gICAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgICAgLm1hcCh0cmltbWVkKVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGlmICghY3VzdG9tU29ydCkge1xuICAgICAgICB0YWdzLnNvcnQoZnVuY3Rpb24gKHRhZ0EsIHRhZ0IpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnRzQSA9IHRhZ0Euc3BsaXQoJy4nKTtcbiAgICAgICAgICAgIGNvbnN0IHBhcnRzQiA9IHRhZ0Iuc3BsaXQoJy4nKTtcbiAgICAgICAgICAgIGlmIChwYXJ0c0EubGVuZ3RoID09PSAxIHx8IHBhcnRzQi5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2luZ2xlU29ydGVkKHRvTnVtYmVyKHBhcnRzQVswXSksIHRvTnVtYmVyKHBhcnRzQlswXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBNYXRoLm1heChwYXJ0c0EubGVuZ3RoLCBwYXJ0c0IubGVuZ3RoKTsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpZmYgPSBzb3J0ZWQodG9OdW1iZXIocGFydHNBW2ldKSwgdG9OdW1iZXIocGFydHNCW2ldKSk7XG4gICAgICAgICAgICAgICAgaWYgKGRpZmYpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRpZmY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBsYXRlc3QgPSBjdXN0b21Tb3J0ID8gdGFnc1swXSA6IFsuLi50YWdzXS5yZXZlcnNlKCkuZmluZCgodGFnKSA9PiB0YWcuaW5kZXhPZignLicpID49IDApO1xuICAgIHJldHVybiBuZXcgVGFnTGlzdCh0YWdzLCBsYXRlc3QpO1xufTtcbmV4cG9ydHMucGFyc2VUYWdMaXN0ID0gcGFyc2VUYWdMaXN0O1xuZnVuY3Rpb24gc2luZ2xlU29ydGVkKGEsIGIpIHtcbiAgICBjb25zdCBhSXNOdW0gPSBpc05hTihhKTtcbiAgICBjb25zdCBiSXNOdW0gPSBpc05hTihiKTtcbiAgICBpZiAoYUlzTnVtICE9PSBiSXNOdW0pIHtcbiAgICAgICAgcmV0dXJuIGFJc051bSA/IDEgOiAtMTtcbiAgICB9XG4gICAgcmV0dXJuIGFJc051bSA/IHNvcnRlZChhLCBiKSA6IDA7XG59XG5mdW5jdGlvbiBzb3J0ZWQoYSwgYikge1xuICAgIHJldHVybiBhID09PSBiID8gMCA6IGEgPiBiID8gMSA6IC0xO1xufVxuZnVuY3Rpb24gdHJpbW1lZChpbnB1dCkge1xuICAgIHJldHVybiBpbnB1dC50cmltKCk7XG59XG5mdW5jdGlvbiB0b051bWJlcihpbnB1dCkge1xuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUludChpbnB1dC5yZXBsYWNlKC9eXFxEKy9nLCAnJyksIDEwKSB8fCAwO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRhZ0xpc3QuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmFkZEFubm90YXRlZFRhZ1Rhc2sgPSBleHBvcnRzLmFkZFRhZ1Rhc2sgPSBleHBvcnRzLnRhZ0xpc3RUYXNrID0gdm9pZCAwO1xuY29uc3QgVGFnTGlzdF8xID0gcmVxdWlyZShcIi4uL3Jlc3BvbnNlcy9UYWdMaXN0XCIpO1xuLyoqXG4gKiBUYXNrIHVzZWQgYnkgYGdpdC50YWdzYFxuICovXG5mdW5jdGlvbiB0YWdMaXN0VGFzayhjdXN0b21BcmdzID0gW10pIHtcbiAgICBjb25zdCBoYXNDdXN0b21Tb3J0ID0gY3VzdG9tQXJncy5zb21lKChvcHRpb24pID0+IC9eLS1zb3J0PS8udGVzdChvcHRpb24pKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBmb3JtYXQ6ICd1dGYtOCcsXG4gICAgICAgIGNvbW1hbmRzOiBbJ3RhZycsICctbCcsIC4uLmN1c3RvbUFyZ3NdLFxuICAgICAgICBwYXJzZXIodGV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIFRhZ0xpc3RfMS5wYXJzZVRhZ0xpc3QodGV4dCwgaGFzQ3VzdG9tU29ydCk7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbmV4cG9ydHMudGFnTGlzdFRhc2sgPSB0YWdMaXN0VGFzaztcbi8qKlxuICogVGFzayB1c2VkIGJ5IGBnaXQuYWRkVGFnYFxuICovXG5mdW5jdGlvbiBhZGRUYWdUYXNrKG5hbWUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBmb3JtYXQ6ICd1dGYtOCcsXG4gICAgICAgIGNvbW1hbmRzOiBbJ3RhZycsIG5hbWVdLFxuICAgICAgICBwYXJzZXIoKSB7XG4gICAgICAgICAgICByZXR1cm4geyBuYW1lIH07XG4gICAgICAgIH1cbiAgICB9O1xufVxuZXhwb3J0cy5hZGRUYWdUYXNrID0gYWRkVGFnVGFzaztcbi8qKlxuICogVGFzayB1c2VkIGJ5IGBnaXQuYWRkVGFnYFxuICovXG5mdW5jdGlvbiBhZGRBbm5vdGF0ZWRUYWdUYXNrKG5hbWUsIHRhZ01lc3NhZ2UpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBmb3JtYXQ6ICd1dGYtOCcsXG4gICAgICAgIGNvbW1hbmRzOiBbJ3RhZycsICctYScsICctbScsIHRhZ01lc3NhZ2UsIG5hbWVdLFxuICAgICAgICBwYXJzZXIoKSB7XG4gICAgICAgICAgICByZXR1cm4geyBuYW1lIH07XG4gICAgICAgIH1cbiAgICB9O1xufVxuZXhwb3J0cy5hZGRBbm5vdGF0ZWRUYWdUYXNrID0gYWRkQW5ub3RhdGVkVGFnVGFzaztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRhZy5qcy5tYXAiLCJjb25zdCB7R2l0RXhlY3V0b3J9ID0gcmVxdWlyZSgnLi9saWIvcnVubmVycy9naXQtZXhlY3V0b3InKTtcbmNvbnN0IHtTaW1wbGVHaXRBcGl9ID0gcmVxdWlyZSgnLi9saWIvc2ltcGxlLWdpdC1hcGknKTtcblxuY29uc3Qge1NjaGVkdWxlcn0gPSByZXF1aXJlKCcuL2xpYi9ydW5uZXJzL3NjaGVkdWxlcicpO1xuY29uc3Qge0dpdExvZ2dlcn0gPSByZXF1aXJlKCcuL2xpYi9naXQtbG9nZ2VyJyk7XG5jb25zdCB7YWRob2NFeGVjVGFzaywgY29uZmlndXJhdGlvbkVycm9yVGFza30gPSByZXF1aXJlKCcuL2xpYi90YXNrcy90YXNrJyk7XG5jb25zdCB7XG4gICBOT09QLFxuICAgYXNBcnJheSxcbiAgIGZpbHRlckFycmF5LFxuICAgZmlsdGVyUHJpbWl0aXZlcyxcbiAgIGZpbHRlclN0cmluZyxcbiAgIGZpbHRlclN0cmluZ09yU3RyaW5nQXJyYXksXG4gICBmaWx0ZXJUeXBlLFxuICAgZm9sZGVyRXhpc3RzLFxuICAgZ2V0VHJhaWxpbmdPcHRpb25zLFxuICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50LFxuICAgdHJhaWxpbmdPcHRpb25zQXJndW1lbnRcbn0gPSByZXF1aXJlKCcuL2xpYi91dGlscycpO1xuY29uc3Qge2FwcGx5UGF0Y2hUYXNrfSA9IHJlcXVpcmUoJy4vbGliL3Rhc2tzL2FwcGx5LXBhdGNoJylcbmNvbnN0IHticmFuY2hUYXNrLCBicmFuY2hMb2NhbFRhc2ssIGRlbGV0ZUJyYW5jaGVzVGFzaywgZGVsZXRlQnJhbmNoVGFza30gPSByZXF1aXJlKCcuL2xpYi90YXNrcy9icmFuY2gnKTtcbmNvbnN0IHtjaGVja0lnbm9yZVRhc2t9ID0gcmVxdWlyZSgnLi9saWIvdGFza3MvY2hlY2staWdub3JlJyk7XG5jb25zdCB7Y2hlY2tJc1JlcG9UYXNrfSA9IHJlcXVpcmUoJy4vbGliL3Rhc2tzL2NoZWNrLWlzLXJlcG8nKTtcbmNvbnN0IHtjbG9uZVRhc2ssIGNsb25lTWlycm9yVGFza30gPSByZXF1aXJlKCcuL2xpYi90YXNrcy9jbG9uZScpO1xuY29uc3Qge2FkZENvbmZpZ1Rhc2ssIGxpc3RDb25maWdUYXNrfSA9IHJlcXVpcmUoJy4vbGliL3Rhc2tzL2NvbmZpZycpO1xuY29uc3Qge2NsZWFuV2l0aE9wdGlvbnNUYXNrLCBpc0NsZWFuT3B0aW9uc0FycmF5fSA9IHJlcXVpcmUoJy4vbGliL3Rhc2tzL2NsZWFuJyk7XG5jb25zdCB7Y29tbWl0VGFza30gPSByZXF1aXJlKCcuL2xpYi90YXNrcy9jb21taXQnKTtcbmNvbnN0IHtkaWZmU3VtbWFyeVRhc2t9ID0gcmVxdWlyZSgnLi9saWIvdGFza3MvZGlmZicpO1xuY29uc3Qge2ZldGNoVGFza30gPSByZXF1aXJlKCcuL2xpYi90YXNrcy9mZXRjaCcpO1xuY29uc3Qge2hhc2hPYmplY3RUYXNrfSA9IHJlcXVpcmUoJy4vbGliL3Rhc2tzL2hhc2gtb2JqZWN0Jyk7XG5jb25zdCB7aW5pdFRhc2t9ID0gcmVxdWlyZSgnLi9saWIvdGFza3MvaW5pdCcpO1xuY29uc3Qge2xvZ1Rhc2ssIHBhcnNlTG9nT3B0aW9uc30gPSByZXF1aXJlKCcuL2xpYi90YXNrcy9sb2cnKTtcbmNvbnN0IHttZXJnZVRhc2t9ID0gcmVxdWlyZSgnLi9saWIvdGFza3MvbWVyZ2UnKTtcbmNvbnN0IHttb3ZlVGFza30gPSByZXF1aXJlKFwiLi9saWIvdGFza3MvbW92ZVwiKTtcbmNvbnN0IHtwdWxsVGFza30gPSByZXF1aXJlKCcuL2xpYi90YXNrcy9wdWxsJyk7XG5jb25zdCB7cHVzaFRhZ3NUYXNrfSA9IHJlcXVpcmUoJy4vbGliL3Rhc2tzL3B1c2gnKTtcbmNvbnN0IHthZGRSZW1vdGVUYXNrLCBnZXRSZW1vdGVzVGFzaywgbGlzdFJlbW90ZXNUYXNrLCByZW1vdGVUYXNrLCByZW1vdmVSZW1vdGVUYXNrfSA9IHJlcXVpcmUoJy4vbGliL3Rhc2tzL3JlbW90ZScpO1xuY29uc3Qge2dldFJlc2V0TW9kZSwgcmVzZXRUYXNrfSA9IHJlcXVpcmUoJy4vbGliL3Rhc2tzL3Jlc2V0Jyk7XG5jb25zdCB7c3Rhc2hMaXN0VGFza30gPSByZXF1aXJlKCcuL2xpYi90YXNrcy9zdGFzaC1saXN0Jyk7XG5jb25zdCB7c3RhdHVzVGFza30gPSByZXF1aXJlKCcuL2xpYi90YXNrcy9zdGF0dXMnKTtcbmNvbnN0IHthZGRTdWJNb2R1bGVUYXNrLCBpbml0U3ViTW9kdWxlVGFzaywgc3ViTW9kdWxlVGFzaywgdXBkYXRlU3ViTW9kdWxlVGFza30gPSByZXF1aXJlKCcuL2xpYi90YXNrcy9zdWItbW9kdWxlJyk7XG5jb25zdCB7YWRkQW5ub3RhdGVkVGFnVGFzaywgYWRkVGFnVGFzaywgdGFnTGlzdFRhc2t9ID0gcmVxdWlyZSgnLi9saWIvdGFza3MvdGFnJyk7XG5jb25zdCB7c3RyYWlnaHRUaHJvdWdoQnVmZmVyVGFzaywgc3RyYWlnaHRUaHJvdWdoU3RyaW5nVGFza30gPSByZXF1aXJlKCcuL2xpYi90YXNrcy90YXNrJyk7XG5cbmZ1bmN0aW9uIEdpdCAob3B0aW9ucywgcGx1Z2lucykge1xuICAgdGhpcy5fZXhlY3V0b3IgPSBuZXcgR2l0RXhlY3V0b3IoXG4gICAgICBvcHRpb25zLmJpbmFyeSwgb3B0aW9ucy5iYXNlRGlyLFxuICAgICAgbmV3IFNjaGVkdWxlcihvcHRpb25zLm1heENvbmN1cnJlbnRQcm9jZXNzZXMpLCBwbHVnaW5zLFxuICAgKTtcbiAgIHRoaXMuX2xvZ2dlciA9IG5ldyBHaXRMb2dnZXIoKTtcbn1cblxuKEdpdC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFNpbXBsZUdpdEFwaS5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IEdpdDtcblxuLyoqXG4gKiBMb2dnaW5nIHV0aWxpdHkgZm9yIHByaW50aW5nIG91dCBpbmZvIG9yIGVycm9yIG1lc3NhZ2VzIHRvIHRoZSB1c2VyXG4gKiBAdHlwZSB7R2l0TG9nZ2VyfVxuICogQHByaXZhdGVcbiAqL1xuR2l0LnByb3RvdHlwZS5fbG9nZ2VyID0gbnVsbDtcblxuLyoqXG4gKiBTZXRzIHRoZSBwYXRoIHRvIGEgY3VzdG9tIGdpdCBiaW5hcnksIHNob3VsZCBlaXRoZXIgYmUgYGdpdGAgd2hlbiB0aGVyZSBpcyBhbiBpbnN0YWxsYXRpb24gb2YgZ2l0IGF2YWlsYWJsZSBvblxuICogdGhlIHN5c3RlbSBwYXRoLCBvciBhIGZ1bGx5IHF1YWxpZmllZCBwYXRoIHRvIHRoZSBleGVjdXRhYmxlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21tYW5kXG4gKiBAcmV0dXJucyB7R2l0fVxuICovXG5HaXQucHJvdG90eXBlLmN1c3RvbUJpbmFyeSA9IGZ1bmN0aW9uIChjb21tYW5kKSB7XG4gICB0aGlzLl9leGVjdXRvci5iaW5hcnkgPSBjb21tYW5kO1xuICAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldHMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgZm9yIHRoZSBzcGF3bmVkIGNoaWxkIHByb2Nlc3MsIGVpdGhlciBzdXBwbHkgYm90aCBhIG5hbWUgYW5kIHZhbHVlIGFzIHN0cmluZ3Mgb3JcbiAqIGEgc2luZ2xlIG9iamVjdCB0byBlbnRpcmVseSByZXBsYWNlIHRoZSBjdXJyZW50IGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xPYmplY3R9IG5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdmFsdWVdXG4gKiBAcmV0dXJucyB7R2l0fVxuICovXG5HaXQucHJvdG90eXBlLmVudiA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIG5hbWUgPT09ICdvYmplY3QnKSB7XG4gICAgICB0aGlzLl9leGVjdXRvci5lbnYgPSBuYW1lO1xuICAgfSBlbHNlIHtcbiAgICAgICh0aGlzLl9leGVjdXRvci5lbnYgPSB0aGlzLl9leGVjdXRvci5lbnYgfHwge30pW25hbWVdID0gdmFsdWU7XG4gICB9XG5cbiAgIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXRzIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBvZiB0aGUgc3Vic2VxdWVudCBjb21tYW5kcy5cbiAqL1xuR2l0LnByb3RvdHlwZS5jd2QgPSBmdW5jdGlvbiAod29ya2luZ0RpcmVjdG9yeSkge1xuICAgY29uc3QgdGFzayA9ICh0eXBlb2Ygd29ya2luZ0RpcmVjdG9yeSAhPT0gJ3N0cmluZycpXG4gICAgICA/IGNvbmZpZ3VyYXRpb25FcnJvclRhc2soJ0dpdC5jd2Q6IHdvcmtpbmdEaXJlY3RvcnkgbXVzdCBiZSBzdXBwbGllZCBhcyBhIHN0cmluZycpXG4gICAgICA6IGFkaG9jRXhlY1Rhc2soKCkgPT4ge1xuICAgICAgICAgaWYgKCFmb2xkZXJFeGlzdHMod29ya2luZ0RpcmVjdG9yeSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgR2l0LmN3ZDogY2Fubm90IGNoYW5nZSB0byBub24tZGlyZWN0b3J5IFwiJHsgd29ya2luZ0RpcmVjdG9yeSB9XCJgKTtcbiAgICAgICAgIH1cblxuICAgICAgICAgcmV0dXJuICh0aGlzLl9leGVjdXRvci5jd2QgPSB3b3JraW5nRGlyZWN0b3J5KTtcbiAgICAgIH0pO1xuXG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayh0YXNrLCB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSB8fCBOT09QKTtcbn07XG5cbi8qKlxuICogU2V0cyBhIGhhbmRsZXIgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW5ldmVyIGEgbmV3IGNoaWxkIHByb2Nlc3MgaXMgY3JlYXRlZCwgdGhlIGhhbmRsZXIgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWRcbiAqIHdpdGggdGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQgYmVpbmcgcnVuIGFuZCB0aGUgc3Rkb3V0ICYgc3RkZXJyIHN0cmVhbXMgdXNlZCBieSB0aGUgQ2hpbGRQcm9jZXNzLlxuICpcbiAqIEBleGFtcGxlXG4gKiByZXF1aXJlKCdzaW1wbGUtZ2l0JylcbiAqICAgIC5vdXRwdXRIYW5kbGVyKGZ1bmN0aW9uIChjb21tYW5kLCBzdGRvdXQsIHN0ZGVycikge1xuICogICAgICAgc3Rkb3V0LnBpcGUocHJvY2Vzcy5zdGRvdXQpO1xuICogICAgfSlcbiAqICAgIC5jaGVja291dCgnaHR0cHM6Ly9naXRodWIuY29tL3VzZXIvcmVwby5naXQnKTtcbiAqXG4gKiBAc2VlIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvY2hpbGRfcHJvY2Vzcy5odG1sI2NoaWxkX3Byb2Nlc3NfY2xhc3NfY2hpbGRwcm9jZXNzXG4gKiBAc2VlIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvc3RyZWFtLmh0bWwjc3RyZWFtX2NsYXNzX3N0cmVhbV9yZWFkYWJsZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gb3V0cHV0SGFuZGxlclxuICogQHJldHVybnMge0dpdH1cbiAqL1xuR2l0LnByb3RvdHlwZS5vdXRwdXRIYW5kbGVyID0gZnVuY3Rpb24gKG91dHB1dEhhbmRsZXIpIHtcbiAgIHRoaXMuX2V4ZWN1dG9yLm91dHB1dEhhbmRsZXIgPSBvdXRwdXRIYW5kbGVyO1xuICAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEluaXRpYWxpemUgYSBnaXQgcmVwb1xuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW2JhcmU9ZmFsc2VdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbdGhlbl1cbiAqL1xuR2l0LnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKGJhcmUsIHRoZW4pIHtcbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgaW5pdFRhc2soYmFyZSA9PT0gdHJ1ZSwgdGhpcy5fZXhlY3V0b3IuY3dkLCBnZXRUcmFpbGluZ09wdGlvbnMoYXJndW1lbnRzKSksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSxcbiAgICk7XG59O1xuXG4vKipcbiAqIENoZWNrIHRoZSBzdGF0dXMgb2YgdGhlIGxvY2FsIHJlcG9cbiAqL1xuR2l0LnByb3RvdHlwZS5zdGF0dXMgPSBmdW5jdGlvbiAoKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIHN0YXR1c1Rhc2soZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cykpLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyksXG4gICApO1xufTtcblxuLyoqXG4gKiBMaXN0IHRoZSBzdGFzaChzKSBvZiB0aGUgbG9jYWwgcmVwb1xuICovXG5HaXQucHJvdG90eXBlLnN0YXNoTGlzdCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIHN0YXNoTGlzdFRhc2soXG4gICAgICAgICB0cmFpbGluZ09wdGlvbnNBcmd1bWVudChhcmd1bWVudHMpIHx8IHt9LFxuICAgICAgICAgZmlsdGVyQXJyYXkob3B0aW9ucykgJiYgb3B0aW9ucyB8fCBbXVxuICAgICAgKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpLFxuICAgKTtcbn07XG5cbi8qKlxuICogU3Rhc2ggdGhlIGxvY2FsIHJlcG9cbiAqXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheX0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbdGhlbl1cbiAqL1xuR2l0LnByb3RvdHlwZS5zdGFzaCA9IGZ1bmN0aW9uIChvcHRpb25zLCB0aGVuKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIHN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soWydzdGFzaCcsIC4uLmdldFRyYWlsaW5nT3B0aW9ucyhhcmd1bWVudHMpXSksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSxcbiAgICk7XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVDbG9uZVRhc2sgKGFwaSwgdGFzaywgcmVwb1BhdGgsIGxvY2FsUGF0aCkge1xuICAgaWYgKHR5cGVvZiByZXBvUGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBjb25maWd1cmF0aW9uRXJyb3JUYXNrKGBnaXQuJHsgYXBpIH0oKSByZXF1aXJlcyBhIHN0cmluZyAncmVwb1BhdGgnYCk7XG4gICB9XG5cbiAgIHJldHVybiB0YXNrKHJlcG9QYXRoLCBmaWx0ZXJUeXBlKGxvY2FsUGF0aCwgZmlsdGVyU3RyaW5nKSwgZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cykpO1xufVxuXG5cbi8qKlxuICogQ2xvbmUgYSBnaXQgcmVwb1xuICovXG5HaXQucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICBjcmVhdGVDbG9uZVRhc2soJ2Nsb25lJywgY2xvbmVUYXNrLCAuLi5hcmd1bWVudHMpLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyksXG4gICApO1xufTtcblxuLyoqXG4gKiBNaXJyb3IgYSBnaXQgcmVwb1xuICovXG5HaXQucHJvdG90eXBlLm1pcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgY3JlYXRlQ2xvbmVUYXNrKCdtaXJyb3InLCBjbG9uZU1pcnJvclRhc2ssIC4uLmFyZ3VtZW50cyksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSxcbiAgICk7XG59O1xuXG4vKipcbiAqIE1vdmVzIG9uZSBvciBtb3JlIGZpbGVzIHRvIGEgbmV3IGRlc3RpbmF0aW9uLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9naXQtc2NtLmNvbS9kb2NzL2dpdC1tdlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBmcm9tXG4gKiBAcGFyYW0ge3N0cmluZ30gdG9cbiAqL1xuR2l0LnByb3RvdHlwZS5tdiA9IGZ1bmN0aW9uIChmcm9tLCB0bykge1xuICAgcmV0dXJuIHRoaXMuX3J1blRhc2sobW92ZVRhc2soZnJvbSwgdG8pLCB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSk7XG59O1xuXG4vKipcbiAqIEludGVybmFsbHkgdXNlcyBwdWxsIGFuZCB0YWdzIHRvIGdldCB0aGUgbGlzdCBvZiB0YWdzIHRoZW4gY2hlY2tzIG91dCB0aGUgbGF0ZXN0IHRhZy5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbdGhlbl1cbiAqL1xuR2l0LnByb3RvdHlwZS5jaGVja291dExhdGVzdFRhZyA9IGZ1bmN0aW9uICh0aGVuKSB7XG4gICB2YXIgZ2l0ID0gdGhpcztcbiAgIHJldHVybiB0aGlzLnB1bGwoZnVuY3Rpb24gKCkge1xuICAgICAgZ2l0LnRhZ3MoZnVuY3Rpb24gKGVyciwgdGFncykge1xuICAgICAgICAgZ2l0LmNoZWNrb3V0KHRhZ3MubGF0ZXN0LCB0aGVuKTtcbiAgICAgIH0pO1xuICAgfSk7XG59O1xuXG4vKipcbiAqIENvbW1pdHMgY2hhbmdlcyBpbiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSAtIHdoZW4gc3BlY2lmaWMgZmlsZSBwYXRocyBhcmUgc3VwcGxpZWQsIG9ubHkgY2hhbmdlcyBvbiB0aG9zZVxuICogZmlsZXMgd2lsbCBiZSBjb21taXR0ZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IG1lc3NhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBbZmlsZXNdXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbdGhlbl1cbiAqL1xuR2l0LnByb3RvdHlwZS5jb21taXQgPSBmdW5jdGlvbiAobWVzc2FnZSwgZmlsZXMsIG9wdGlvbnMsIHRoZW4pIHtcbiAgIGNvbnN0IG5leHQgPSB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKTtcbiAgIGNvbnN0IG1lc3NhZ2VzID0gW107XG5cbiAgIGlmIChmaWx0ZXJTdHJpbmdPclN0cmluZ0FycmF5KG1lc3NhZ2UpKSB7XG4gICAgICBtZXNzYWdlcy5wdXNoKC4uLmFzQXJyYXkobWVzc2FnZSkpO1xuICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2Fybignc2ltcGxlLWdpdCBkZXByZWNhdGlvbiBub3RpY2U6IGdpdC5jb21taXQ6IHJlcXVpcmVzIHRoZSBjb21taXQgbWVzc2FnZSB0byBiZSBzdXBwbGllZCBhcyBhIHN0cmluZy9zdHJpbmdbXSwgdGhpcyB3aWxsIGJlIGFuIGVycm9yIGluIHZlcnNpb24gMycpO1xuICAgfVxuXG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIGNvbW1pdFRhc2soXG4gICAgICAgICBtZXNzYWdlcyxcbiAgICAgICAgIGFzQXJyYXkoZmlsdGVyVHlwZShmaWxlcywgZmlsdGVyU3RyaW5nT3JTdHJpbmdBcnJheSwgW10pKSxcbiAgICAgICAgIFsuLi5maWx0ZXJUeXBlKG9wdGlvbnMsIGZpbHRlckFycmF5LCBbXSksIC4uLmdldFRyYWlsaW5nT3B0aW9ucyhhcmd1bWVudHMsIDAsIHRydWUpXVxuICAgICAgKSxcbiAgICAgIG5leHRcbiAgICk7XG59O1xuXG4vKipcbiAqIFB1bGwgdGhlIHVwZGF0ZWQgY29udGVudHMgb2YgdGhlIGN1cnJlbnQgcmVwb1xuICovXG5HaXQucHJvdG90eXBlLnB1bGwgPSBmdW5jdGlvbiAocmVtb3RlLCBicmFuY2gsIG9wdGlvbnMsIHRoZW4pIHtcbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgcHVsbFRhc2soZmlsdGVyVHlwZShyZW1vdGUsIGZpbHRlclN0cmluZyksIGZpbHRlclR5cGUoYnJhbmNoLCBmaWx0ZXJTdHJpbmcpLCBnZXRUcmFpbGluZ09wdGlvbnMoYXJndW1lbnRzKSksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSxcbiAgICk7XG59O1xuXG4vKipcbiAqIEZldGNoIHRoZSB1cGRhdGVkIGNvbnRlbnRzIG9mIHRoZSBjdXJyZW50IHJlcG8uXG4gKlxuICogQGV4YW1wbGVcbiAqICAgLmZldGNoKCd1cHN0cmVhbScsICdtYXN0ZXInKSAvLyBmZXRjaGVzIGZyb20gbWFzdGVyIG9uIHJlbW90ZSBuYW1lZCB1cHN0cmVhbVxuICogICAuZmV0Y2goZnVuY3Rpb24gKCkge30pIC8vIHJ1bnMgZmV0Y2ggYWdhaW5zdCBkZWZhdWx0IHJlbW90ZSBhbmQgYnJhbmNoIGFuZCBjYWxscyBmdW5jdGlvblxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbcmVtb3RlXVxuICogQHBhcmFtIHtzdHJpbmd9IFticmFuY2hdXG4gKi9cbkdpdC5wcm90b3R5cGUuZmV0Y2ggPSBmdW5jdGlvbiAocmVtb3RlLCBicmFuY2gpIHtcbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgZmV0Y2hUYXNrKGZpbHRlclR5cGUocmVtb3RlLCBmaWx0ZXJTdHJpbmcpLCBmaWx0ZXJUeXBlKGJyYW5jaCwgZmlsdGVyU3RyaW5nKSwgZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cykpLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyksXG4gICApO1xufTtcblxuLyoqXG4gKiBEaXNhYmxlcy9lbmFibGVzIHRoZSB1c2Ugb2YgdGhlIGNvbnNvbGUgZm9yIHByaW50aW5nIHdhcm5pbmdzIGFuZCBlcnJvcnMsIGJ5IGRlZmF1bHQgbWVzc2FnZXMgYXJlIG5vdCBzaG93biBpblxuICogYSBwcm9kdWN0aW9uIGVudmlyb25tZW50LlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gc2lsZW5jZVxuICogQHJldHVybnMge0dpdH1cbiAqL1xuR2l0LnByb3RvdHlwZS5zaWxlbnQgPSBmdW5jdGlvbiAoc2lsZW5jZSkge1xuICAgY29uc29sZS53YXJuKCdzaW1wbGUtZ2l0IGRlcHJlY2F0aW9uIG5vdGljZTogZ2l0LnNpbGVudDogbG9nZ2luZyBzaG91bGQgYmUgY29uZmlndXJlZCB1c2luZyB0aGUgYGRlYnVnYCBsaWJyYXJ5IC8gYERFQlVHYCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdGhpcyB3aWxsIGJlIGFuIGVycm9yIGluIHZlcnNpb24gMycpO1xuICAgdGhpcy5fbG9nZ2VyLnNpbGVudCghIXNpbGVuY2UpO1xuICAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIExpc3QgYWxsIHRhZ3MuIFdoZW4gdXNpbmcgZ2l0IDIuNy4wIG9yIGFib3ZlLCBpbmNsdWRlIGFuIG9wdGlvbnMgb2JqZWN0IHdpdGggYFwiLS1zb3J0XCI6IFwicHJvcGVydHktbmFtZVwiYCB0b1xuICogc29ydCB0aGUgdGFncyBieSB0aGF0IHByb3BlcnR5IGluc3RlYWQgb2YgdXNpbmcgdGhlIGRlZmF1bHQgc2VtYW50aWMgdmVyc2lvbmluZyBzb3J0LlxuICpcbiAqIE5vdGUsIHN1cHBseWluZyB0aGlzIG9wdGlvbiB3aGVuIGl0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgeW91ciBHaXQgdmVyc2lvbiB3aWxsIGNhdXNlIHRoZSBvcGVyYXRpb24gdG8gZmFpbC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbdGhlbl1cbiAqL1xuR2l0LnByb3RvdHlwZS50YWdzID0gZnVuY3Rpb24gKG9wdGlvbnMsIHRoZW4pIHtcbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgdGFnTGlzdFRhc2soZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cykpLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyksXG4gICApO1xufTtcblxuLyoqXG4gKiBSZWJhc2VzIHRoZSBjdXJyZW50IHdvcmtpbmcgY29weS4gT3B0aW9ucyBjYW4gYmUgc3VwcGxpZWQgZWl0aGVyIGFzIGFuIGFycmF5IG9mIHN0cmluZyBwYXJhbWV0ZXJzXG4gKiB0byBiZSBzZW50IHRvIHRoZSBgZ2l0IHJlYmFzZWAgY29tbWFuZCwgb3IgYSBzdGFuZGFyZCBvcHRpb25zIG9iamVjdC5cbiAqL1xuR2l0LnByb3RvdHlwZS5yZWJhc2UgPSBmdW5jdGlvbiAoKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIHN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soWydyZWJhc2UnLCAuLi5nZXRUcmFpbGluZ09wdGlvbnMoYXJndW1lbnRzKV0pLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cylcbiAgICk7XG59O1xuXG4vKipcbiAqIFJlc2V0IGEgcmVwb1xuICovXG5HaXQucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKG1vZGUpIHtcbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgcmVzZXRUYXNrKGdldFJlc2V0TW9kZShtb2RlKSwgZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cykpLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyksXG4gICApO1xufTtcblxuLyoqXG4gKiBSZXZlcnQgb25lIG9yIG1vcmUgY29tbWl0cyBpbiB0aGUgbG9jYWwgd29ya2luZyBjb3B5XG4gKi9cbkdpdC5wcm90b3R5cGUucmV2ZXJ0ID0gZnVuY3Rpb24gKGNvbW1pdCkge1xuICAgY29uc3QgbmV4dCA9IHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpO1xuXG4gICBpZiAodHlwZW9mIGNvbW1pdCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgICAgY29uZmlndXJhdGlvbkVycm9yVGFzaygnQ29tbWl0IG11c3QgYmUgYSBzdHJpbmcnKSxcbiAgICAgICAgIG5leHQsXG4gICAgICApO1xuICAgfVxuXG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIHN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soWydyZXZlcnQnLCAuLi5nZXRUcmFpbGluZ09wdGlvbnMoYXJndW1lbnRzLCAwLCB0cnVlKSwgY29tbWl0XSksXG4gICAgICBuZXh0XG4gICApO1xufTtcblxuLyoqXG4gKiBBZGQgYSBsaWdodHdlaWdodCB0YWcgdG8gdGhlIGhlYWQgb2YgdGhlIGN1cnJlbnQgYnJhbmNoXG4gKi9cbkdpdC5wcm90b3R5cGUuYWRkVGFnID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgIGNvbnN0IHRhc2sgPSAodHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKVxuICAgICAgPyBhZGRUYWdUYXNrKG5hbWUpXG4gICAgICA6IGNvbmZpZ3VyYXRpb25FcnJvclRhc2soJ0dpdC5hZGRUYWcgcmVxdWlyZXMgYSB0YWcgbmFtZScpO1xuXG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayh0YXNrLCB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSk7XG59O1xuXG4vKipcbiAqIEFkZCBhbiBhbm5vdGF0ZWQgdGFnIHRvIHRoZSBoZWFkIG9mIHRoZSBjdXJyZW50IGJyYW5jaFxuICovXG5HaXQucHJvdG90eXBlLmFkZEFubm90YXRlZFRhZyA9IGZ1bmN0aW9uICh0YWdOYW1lLCB0YWdNZXNzYWdlKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIGFkZEFubm90YXRlZFRhZ1Rhc2sodGFnTmFtZSwgdGFnTWVzc2FnZSksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSxcbiAgICk7XG59O1xuXG4vKipcbiAqIENoZWNrIG91dCBhIHRhZyBvciByZXZpc2lvbiwgYW55IG51bWJlciBvZiBhZGRpdGlvbmFsIGFyZ3VtZW50cyBjYW4gYmUgcGFzc2VkIHRvIHRoZSBgZ2l0IGNoZWNrb3V0YCBjb21tYW5kXG4gKiBieSBzdXBwbHlpbmcgZWl0aGVyIGEgc3RyaW5nIG9yIGFycmF5IG9mIHN0cmluZ3MgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LlxuICovXG5HaXQucHJvdG90eXBlLmNoZWNrb3V0ID0gZnVuY3Rpb24gKCkge1xuICAgY29uc3QgY29tbWFuZHMgPSBbJ2NoZWNrb3V0JywgLi4uZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cywgdHJ1ZSldO1xuICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICBzdHJhaWdodFRocm91Z2hTdHJpbmdUYXNrKGNvbW1hbmRzKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpLFxuICAgKTtcbn07XG5cbi8qKlxuICogQ2hlY2sgb3V0IGEgcmVtb3RlIGJyYW5jaFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBicmFuY2hOYW1lIG5hbWUgb2YgYnJhbmNoXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RhcnRQb2ludCAoZS5nIG9yaWdpbi9kZXZlbG9wbWVudClcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFt0aGVuXVxuICovXG5HaXQucHJvdG90eXBlLmNoZWNrb3V0QnJhbmNoID0gZnVuY3Rpb24gKGJyYW5jaE5hbWUsIHN0YXJ0UG9pbnQsIHRoZW4pIHtcbiAgIHJldHVybiB0aGlzLmNoZWNrb3V0KFsnLWInLCBicmFuY2hOYW1lLCBzdGFydFBvaW50XSwgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cykpO1xufTtcblxuLyoqXG4gKiBDaGVjayBvdXQgYSBsb2NhbCBicmFuY2hcbiAqL1xuR2l0LnByb3RvdHlwZS5jaGVja291dExvY2FsQnJhbmNoID0gZnVuY3Rpb24gKGJyYW5jaE5hbWUsIHRoZW4pIHtcbiAgIHJldHVybiB0aGlzLmNoZWNrb3V0KFsnLWInLCBicmFuY2hOYW1lXSwgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cykpO1xufTtcblxuLyoqXG4gKiBEZWxldGUgYSBsb2NhbCBicmFuY2hcbiAqL1xuR2l0LnByb3RvdHlwZS5kZWxldGVMb2NhbEJyYW5jaCA9IGZ1bmN0aW9uIChicmFuY2hOYW1lLCBmb3JjZURlbGV0ZSwgdGhlbikge1xuICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICBkZWxldGVCcmFuY2hUYXNrKGJyYW5jaE5hbWUsIHR5cGVvZiBmb3JjZURlbGV0ZSA9PT0gXCJib29sZWFuXCIgPyBmb3JjZURlbGV0ZSA6IGZhbHNlKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpLFxuICAgKTtcbn07XG5cbi8qKlxuICogRGVsZXRlIG9uZSBvciBtb3JlIGxvY2FsIGJyYW5jaGVzXG4gKi9cbkdpdC5wcm90b3R5cGUuZGVsZXRlTG9jYWxCcmFuY2hlcyA9IGZ1bmN0aW9uIChicmFuY2hOYW1lcywgZm9yY2VEZWxldGUsIHRoZW4pIHtcbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgZGVsZXRlQnJhbmNoZXNUYXNrKGJyYW5jaE5hbWVzLCB0eXBlb2YgZm9yY2VEZWxldGUgPT09IFwiYm9vbGVhblwiID8gZm9yY2VEZWxldGUgOiBmYWxzZSksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSxcbiAgICk7XG59O1xuXG4vKipcbiAqIExpc3QgYWxsIGJyYW5jaGVzXG4gKlxuICogQHBhcmFtIHtPYmplY3QgfCBzdHJpbmdbXX0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbdGhlbl1cbiAqL1xuR2l0LnByb3RvdHlwZS5icmFuY2ggPSBmdW5jdGlvbiAob3B0aW9ucywgdGhlbikge1xuICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICBicmFuY2hUYXNrKGdldFRyYWlsaW5nT3B0aW9ucyhhcmd1bWVudHMpKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpLFxuICAgKTtcbn07XG5cbi8qKlxuICogUmV0dXJuIGxpc3Qgb2YgbG9jYWwgYnJhbmNoZXNcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbdGhlbl1cbiAqL1xuR2l0LnByb3RvdHlwZS5icmFuY2hMb2NhbCA9IGZ1bmN0aW9uICh0aGVuKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIGJyYW5jaExvY2FsVGFzaygpLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyksXG4gICApO1xufTtcblxuLyoqXG4gKiBBZGQgY29uZmlnIHRvIGxvY2FsIGdpdCBpbnN0YW5jZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgY29uZmlndXJhdGlvbiBrZXkgKGUuZyB1c2VyLm5hbWUpXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgZm9yIHRoZSBnaXZlbiBrZXkgKGUuZyB5b3VyIG5hbWUpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthcHBlbmQ9ZmFsc2VdIG9wdGlvbmFsbHkgYXBwZW5kIHRoZSBrZXkvdmFsdWUgcGFpciAoZXF1aXZhbGVudCBvZiBwYXNzaW5nIGAtLWFkZGAgb3B0aW9uKS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFt0aGVuXVxuICovXG5HaXQucHJvdG90eXBlLmFkZENvbmZpZyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlLCBhcHBlbmQsIHRoZW4pIHtcbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgYWRkQ29uZmlnVGFzayhrZXksIHZhbHVlLCB0eXBlb2YgYXBwZW5kID09PSBcImJvb2xlYW5cIiA/IGFwcGVuZCA6IGZhbHNlKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpLFxuICAgKTtcbn07XG5cbkdpdC5wcm90b3R5cGUubGlzdENvbmZpZyA9IGZ1bmN0aW9uICgpIHtcbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKGxpc3RDb25maWdUYXNrKCksIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpKTtcbn07XG5cbi8qKlxuICogRXhlY3V0ZXMgYW55IGNvbW1hbmQgYWdhaW5zdCB0aGUgZ2l0IGJpbmFyeS5cbiAqL1xuR2l0LnByb3RvdHlwZS5yYXcgPSBmdW5jdGlvbiAoY29tbWFuZHMpIHtcbiAgIGNvbnN0IGNyZWF0ZVJlc3RDb21tYW5kcyA9ICFBcnJheS5pc0FycmF5KGNvbW1hbmRzKTtcbiAgIGNvbnN0IGNvbW1hbmQgPSBbXS5zbGljZS5jYWxsKGNyZWF0ZVJlc3RDb21tYW5kcyA/IGFyZ3VtZW50cyA6IGNvbW1hbmRzLCAwKTtcblxuICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21tYW5kLmxlbmd0aCAmJiBjcmVhdGVSZXN0Q29tbWFuZHM7IGkrKykge1xuICAgICAgaWYgKCFmaWx0ZXJQcmltaXRpdmVzKGNvbW1hbmRbaV0pKSB7XG4gICAgICAgICBjb21tYW5kLnNwbGljZShpLCBjb21tYW5kLmxlbmd0aCAtIGkpO1xuICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICB9XG5cbiAgIGNvbW1hbmQucHVzaChcbiAgICAgIC4uLmdldFRyYWlsaW5nT3B0aW9ucyhhcmd1bWVudHMsIDAsIHRydWUpLFxuICAgKTtcblxuICAgdmFyIG5leHQgPSB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKTtcblxuICAgaWYgKCFjb21tYW5kLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICAgICBjb25maWd1cmF0aW9uRXJyb3JUYXNrKCdSYXc6IG11c3Qgc3VwcGx5IG9uZSBvciBtb3JlIGNvbW1hbmQgdG8gZXhlY3V0ZScpLFxuICAgICAgICAgbmV4dCxcbiAgICAgICk7XG4gICB9XG5cbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKHN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soY29tbWFuZCksIG5leHQpO1xufTtcblxuR2l0LnByb3RvdHlwZS5zdWJtb2R1bGVBZGQgPSBmdW5jdGlvbiAocmVwbywgcGF0aCwgdGhlbikge1xuICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICBhZGRTdWJNb2R1bGVUYXNrKHJlcG8sIHBhdGgpLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyksXG4gICApO1xufTtcblxuR2l0LnByb3RvdHlwZS5zdWJtb2R1bGVVcGRhdGUgPSBmdW5jdGlvbiAoYXJncywgdGhlbikge1xuICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICB1cGRhdGVTdWJNb2R1bGVUYXNrKGdldFRyYWlsaW5nT3B0aW9ucyhhcmd1bWVudHMsIHRydWUpKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpLFxuICAgKTtcbn07XG5cbkdpdC5wcm90b3R5cGUuc3VibW9kdWxlSW5pdCA9IGZ1bmN0aW9uIChhcmdzLCB0aGVuKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIGluaXRTdWJNb2R1bGVUYXNrKGdldFRyYWlsaW5nT3B0aW9ucyhhcmd1bWVudHMsIHRydWUpKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpLFxuICAgKTtcbn07XG5cbkdpdC5wcm90b3R5cGUuc3ViTW9kdWxlID0gZnVuY3Rpb24gKG9wdGlvbnMsIHRoZW4pIHtcbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgc3ViTW9kdWxlVGFzayhnZXRUcmFpbGluZ09wdGlvbnMoYXJndW1lbnRzKSksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSxcbiAgICk7XG59O1xuXG5HaXQucHJvdG90eXBlLmxpc3RSZW1vdGUgPSBmdW5jdGlvbiAoKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIGxpc3RSZW1vdGVzVGFzayhnZXRUcmFpbGluZ09wdGlvbnMoYXJndW1lbnRzKSksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSxcbiAgICk7XG59O1xuXG4vKipcbiAqIEFkZHMgYSByZW1vdGUgdG8gdGhlIGxpc3Qgb2YgcmVtb3Rlcy5cbiAqL1xuR2l0LnByb3RvdHlwZS5hZGRSZW1vdGUgPSBmdW5jdGlvbiAocmVtb3RlTmFtZSwgcmVtb3RlUmVwbywgdGhlbikge1xuICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICBhZGRSZW1vdGVUYXNrKHJlbW90ZU5hbWUsIHJlbW90ZVJlcG8sIGdldFRyYWlsaW5nT3B0aW9ucyhhcmd1bWVudHMpKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpLFxuICAgKTtcbn07XG5cbi8qKlxuICogUmVtb3ZlcyBhbiBlbnRyeSBieSBuYW1lIGZyb20gdGhlIGxpc3Qgb2YgcmVtb3Rlcy5cbiAqL1xuR2l0LnByb3RvdHlwZS5yZW1vdmVSZW1vdGUgPSBmdW5jdGlvbiAocmVtb3RlTmFtZSwgdGhlbikge1xuICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICByZW1vdmVSZW1vdGVUYXNrKHJlbW90ZU5hbWUpLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyksXG4gICApO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBjdXJyZW50bHkgYXZhaWxhYmxlIHJlbW90ZXMsIHNldHRpbmcgdGhlIG9wdGlvbmFsIHZlcmJvc2UgYXJndW1lbnQgdG8gdHJ1ZSBpbmNsdWRlcyBhZGRpdGlvbmFsXG4gKiBkZXRhaWwgb24gdGhlIHJlbW90ZXMgdGhlbXNlbHZlcy5cbiAqL1xuR2l0LnByb3RvdHlwZS5nZXRSZW1vdGVzID0gZnVuY3Rpb24gKHZlcmJvc2UsIHRoZW4pIHtcbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgZ2V0UmVtb3Rlc1Rhc2sodmVyYm9zZSA9PT0gdHJ1ZSksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSxcbiAgICk7XG59O1xuXG4vKipcbiAqIENvbXB1dGUgb2JqZWN0IElEIGZyb20gYSBmaWxlXG4gKi9cbkdpdC5wcm90b3R5cGUuaGFzaE9iamVjdCA9IGZ1bmN0aW9uIChwYXRoLCB3cml0ZSkge1xuICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICBoYXNoT2JqZWN0VGFzayhwYXRoLCB3cml0ZSA9PT0gdHJ1ZSksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSxcbiAgICk7XG59O1xuXG4vKipcbiAqIENhbGwgYW55IGBnaXQgcmVtb3RlYCBmdW5jdGlvbiB3aXRoIGFyZ3VtZW50cyBwYXNzZWQgYXMgYW4gYXJyYXkgb2Ygc3RyaW5ncy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBvcHRpb25zXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbdGhlbl1cbiAqL1xuR2l0LnByb3RvdHlwZS5yZW1vdGUgPSBmdW5jdGlvbiAob3B0aW9ucywgdGhlbikge1xuICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICByZW1vdGVUYXNrKGdldFRyYWlsaW5nT3B0aW9ucyhhcmd1bWVudHMpKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpLFxuICAgKTtcbn07XG5cbi8qKlxuICogTWVyZ2VzIGZyb20gb25lIGJyYW5jaCB0byBhbm90aGVyLCBlcXVpdmFsZW50IHRvIHJ1bm5pbmcgYGdpdCBtZXJnZSAke2Zyb219ICRbdG99YCwgdGhlIGBvcHRpb25zYCBhcmd1bWVudCBjYW5cbiAqIGVpdGhlciBiZSBhbiBhcnJheSBvZiBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUgY29tbWFuZCBvciBudWxsIC8gb21pdHRlZCB0byBiZSBpZ25vcmVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmcm9tXG4gKiBAcGFyYW0ge3N0cmluZ30gdG9cbiAqL1xuR2l0LnByb3RvdHlwZS5tZXJnZUZyb21UbyA9IGZ1bmN0aW9uIChmcm9tLCB0bykge1xuICAgaWYgKCEoZmlsdGVyU3RyaW5nKGZyb20pICYmIGZpbHRlclN0cmluZyh0bykpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcnVuVGFzayhjb25maWd1cmF0aW9uRXJyb3JUYXNrKFxuICAgICAgICAgYEdpdC5tZXJnZUZyb21UbyByZXF1aXJlcyB0aGF0IHRoZSAnZnJvbScgYW5kICd0bycgYXJndW1lbnRzIGFyZSBzdXBwbGllZCBhcyBzdHJpbmdzYFxuICAgICAgKSk7XG4gICB9XG5cbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgbWVyZ2VUYXNrKFtmcm9tLCB0bywgLi4uZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cyldKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMsIGZhbHNlKSxcbiAgICk7XG59O1xuXG4vKipcbiAqIFJ1bnMgYSBtZXJnZSwgYG9wdGlvbnNgIGNhbiBiZSBlaXRoZXIgYW4gYXJyYXkgb2YgYXJndW1lbnRzXG4gKiBzdXBwb3J0ZWQgYnkgdGhlIFtgZ2l0IG1lcmdlYF0oaHR0cHM6Ly9naXQtc2NtLmNvbS9kb2NzL2dpdC1tZXJnZSlcbiAqIG9yIGFuIG9wdGlvbnMgb2JqZWN0LlxuICpcbiAqIENvbmZsaWN0cyBkdXJpbmcgdGhlIG1lcmdlIHJlc3VsdCBpbiBhbiBlcnJvciByZXNwb25zZSxcbiAqIHRoZSByZXNwb25zZSB0eXBlIHdoZXRoZXIgaXQgd2FzIGFuIGVycm9yIG9yIHN1Y2Nlc3Mgd2lsbCBiZSBhIE1lcmdlU3VtbWFyeSBpbnN0YW5jZS5cbiAqIFdoZW4gc3VjY2Vzc2Z1bCwgdGhlIE1lcmdlU3VtbWFyeSBoYXMgYWxsIGRldGFpbCBmcm9tIGEgdGhlIFB1bGxTdW1tYXJ5XG4gKlxuICogQHBhcmFtIHtPYmplY3QgfCBzdHJpbmdbXX0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbdGhlbl1cbiAqIEByZXR1cm5zIHsqfVxuICpcbiAqIEBzZWUgLi9yZXNwb25zZXMvTWVyZ2VTdW1tYXJ5LmpzXG4gKiBAc2VlIC4vcmVzcG9uc2VzL1B1bGxTdW1tYXJ5LmpzXG4gKi9cbkdpdC5wcm90b3R5cGUubWVyZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIG1lcmdlVGFzayhnZXRUcmFpbGluZ09wdGlvbnMoYXJndW1lbnRzKSksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSxcbiAgICk7XG59O1xuXG4vKipcbiAqIENhbGwgYW55IGBnaXQgdGFnYCBmdW5jdGlvbiB3aXRoIGFyZ3VtZW50cyBwYXNzZWQgYXMgYW4gYXJyYXkgb2Ygc3RyaW5ncy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBvcHRpb25zXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbdGhlbl1cbiAqL1xuR2l0LnByb3RvdHlwZS50YWcgPSBmdW5jdGlvbiAob3B0aW9ucywgdGhlbikge1xuICAgY29uc3QgY29tbWFuZCA9IGdldFRyYWlsaW5nT3B0aW9ucyhhcmd1bWVudHMpO1xuXG4gICBpZiAoY29tbWFuZFswXSAhPT0gJ3RhZycpIHtcbiAgICAgIGNvbW1hbmQudW5zaGlmdCgndGFnJyk7XG4gICB9XG5cbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgc3RyYWlnaHRUaHJvdWdoU3RyaW5nVGFzayhjb21tYW5kKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpXG4gICApO1xufTtcblxuLyoqXG4gKiBVcGRhdGVzIHJlcG9zaXRvcnkgc2VydmVyIGluZm9cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbdGhlbl1cbiAqL1xuR2l0LnByb3RvdHlwZS51cGRhdGVTZXJ2ZXJJbmZvID0gZnVuY3Rpb24gKHRoZW4pIHtcbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgc3RyYWlnaHRUaHJvdWdoU3RyaW5nVGFzayhbJ3VwZGF0ZS1zZXJ2ZXItaW5mbyddKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpLFxuICAgKTtcbn07XG5cbi8qKlxuICogUHVzaGVzIHRoZSBjdXJyZW50IHRhZyBjaGFuZ2VzIHRvIGEgcmVtb3RlIHdoaWNoIGNhbiBiZSBlaXRoZXIgYSBVUkwgb3IgbmFtZWQgcmVtb3RlLiBXaGVuIG5vdCBzcGVjaWZpZWQgdXNlcyB0aGVcbiAqIGRlZmF1bHQgY29uZmlndXJlZCByZW1vdGUgc3BlYy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW3JlbW90ZV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFt0aGVuXVxuICovXG5HaXQucHJvdG90eXBlLnB1c2hUYWdzID0gZnVuY3Rpb24gKHJlbW90ZSwgdGhlbikge1xuICAgY29uc3QgdGFzayA9IHB1c2hUYWdzVGFzayh7cmVtb3RlOiBmaWx0ZXJUeXBlKHJlbW90ZSwgZmlsdGVyU3RyaW5nKX0sIGdldFRyYWlsaW5nT3B0aW9ucyhhcmd1bWVudHMpKTtcblxuICAgcmV0dXJuIHRoaXMuX3J1blRhc2sodGFzaywgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cykpO1xufTtcblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBuYW1lZCBmaWxlcyBmcm9tIHNvdXJjZSBjb250cm9sLlxuICovXG5HaXQucHJvdG90eXBlLnJtID0gZnVuY3Rpb24gKGZpbGVzKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIHN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soWydybScsICctZicsIC4uLmFzQXJyYXkoZmlsZXMpXSksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKVxuICAgKTtcbn07XG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgbmFtZWQgZmlsZXMgZnJvbSBzb3VyY2UgY29udHJvbCBidXQga2VlcHMgdGhlbSBvbiBkaXNrIHJhdGhlciB0aGFuIGRlbGV0aW5nIHRoZW0gZW50aXJlbHkuIFRvXG4gKiBjb21wbGV0ZWx5IHJlbW92ZSB0aGUgZmlsZXMsIHVzZSBgcm1gLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBmaWxlc1xuICovXG5HaXQucHJvdG90eXBlLnJtS2VlcExvY2FsID0gZnVuY3Rpb24gKGZpbGVzKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIHN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soWydybScsICctLWNhY2hlZCcsIC4uLmFzQXJyYXkoZmlsZXMpXSksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKVxuICAgKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIGxpc3Qgb2Ygb2JqZWN0cyBpbiBhIHRyZWUgYmFzZWQgb24gY29tbWl0IGhhc2guIFBhc3NpbmcgaW4gYW4gb2JqZWN0IGhhc2ggcmV0dXJucyB0aGUgb2JqZWN0J3MgY29udGVudCxcbiAqIHNpemUsIGFuZCB0eXBlLlxuICpcbiAqIFBhc3NpbmcgXCItcFwiIHdpbGwgaW5zdHJ1Y3QgY2F0LWZpbGUgdG8gZGV0ZXJtaW5lIHRoZSBvYmplY3QgdHlwZSwgYW5kIGRpc3BsYXkgaXRzIGZvcm1hdHRlZCBjb250ZW50cy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFt0aGVuXVxuICovXG5HaXQucHJvdG90eXBlLmNhdEZpbGUgPSBmdW5jdGlvbiAob3B0aW9ucywgdGhlbikge1xuICAgcmV0dXJuIHRoaXMuX2NhdEZpbGUoJ3V0Zi04JywgYXJndW1lbnRzKTtcbn07XG5cbkdpdC5wcm90b3R5cGUuYmluYXJ5Q2F0RmlsZSA9IGZ1bmN0aW9uICgpIHtcbiAgIHJldHVybiB0aGlzLl9jYXRGaWxlKCdidWZmZXInLCBhcmd1bWVudHMpO1xufTtcblxuR2l0LnByb3RvdHlwZS5fY2F0RmlsZSA9IGZ1bmN0aW9uIChmb3JtYXQsIGFyZ3MpIHtcbiAgIHZhciBoYW5kbGVyID0gdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3MpO1xuICAgdmFyIGNvbW1hbmQgPSBbJ2NhdC1maWxlJ107XG4gICB2YXIgb3B0aW9ucyA9IGFyZ3NbMF07XG5cbiAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgICAgY29uZmlndXJhdGlvbkVycm9yVGFzaygnR2l0LmNhdEZpbGU6IG9wdGlvbnMgbXVzdCBiZSBzdXBwbGllZCBhcyBhbiBhcnJheSBvZiBzdHJpbmdzJyksXG4gICAgICAgICBoYW5kbGVyLFxuICAgICAgKTtcbiAgIH1cblxuICAgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9ucykpIHtcbiAgICAgIGNvbW1hbmQucHVzaC5hcHBseShjb21tYW5kLCBvcHRpb25zKTtcbiAgIH1cblxuICAgY29uc3QgdGFzayA9IGZvcm1hdCA9PT0gJ2J1ZmZlcidcbiAgICAgID8gc3RyYWlnaHRUaHJvdWdoQnVmZmVyVGFzayhjb21tYW5kKVxuICAgICAgOiBzdHJhaWdodFRocm91Z2hTdHJpbmdUYXNrKGNvbW1hbmQpO1xuXG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayh0YXNrLCBoYW5kbGVyKTtcbn07XG5cbkdpdC5wcm90b3R5cGUuZGlmZiA9IGZ1bmN0aW9uIChvcHRpb25zLCB0aGVuKSB7XG4gICBjb25zdCBjb21tYW5kID0gWydkaWZmJywgLi4uZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cyldO1xuXG4gICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb21tYW5kLnNwbGljZSgxLCAwLCBvcHRpb25zKTtcbiAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdHaXQjZGlmZjogc3VwcGx5aW5nIG9wdGlvbnMgYXMgYSBzaW5nbGUgc3RyaW5nIGlzIG5vdyBkZXByZWNhdGVkLCBzd2l0Y2ggdG8gYW4gYXJyYXkgb2Ygc3RyaW5ncycpO1xuICAgfVxuXG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIHN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soY29tbWFuZCksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSxcbiAgICk7XG59O1xuXG5HaXQucHJvdG90eXBlLmRpZmZTdW1tYXJ5ID0gZnVuY3Rpb24gKCkge1xuICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICBkaWZmU3VtbWFyeVRhc2soZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cywgMSkpLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyksXG4gICApO1xufTtcblxuR2l0LnByb3RvdHlwZS5hcHBseVBhdGNoID0gZnVuY3Rpb24gKHBhdGNoZXMpIHtcbiAgIGNvbnN0IHRhc2sgPSAhZmlsdGVyU3RyaW5nT3JTdHJpbmdBcnJheShwYXRjaGVzKVxuICAgICAgPyBjb25maWd1cmF0aW9uRXJyb3JUYXNrKGBnaXQuYXBwbHlQYXRjaCByZXF1aXJlcyBvbmUgb3IgbW9yZSBzdHJpbmcgcGF0Y2hlcyBhcyB0aGUgZmlyc3QgYXJndW1lbnRgKVxuICAgICAgOiBhcHBseVBhdGNoVGFzayhhc0FycmF5KHBhdGNoZXMpLCBnZXRUcmFpbGluZ09wdGlvbnMoW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKSk7XG5cbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgdGFzayxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpLFxuICAgKTtcbn1cblxuR2l0LnByb3RvdHlwZS5yZXZwYXJzZSA9IGZ1bmN0aW9uICgpIHtcbiAgIGNvbnN0IGNvbW1hbmRzID0gWydyZXYtcGFyc2UnLCAuLi5nZXRUcmFpbGluZ09wdGlvbnMoYXJndW1lbnRzLCB0cnVlKV07XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIHN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soY29tbWFuZHMsIHRydWUpLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyksXG4gICApO1xufTtcblxuLyoqXG4gKiBTaG93IHZhcmlvdXMgdHlwZXMgb2Ygb2JqZWN0cywgZm9yIGV4YW1wbGUgdGhlIGZpbGUgYXQgYSBjZXJ0YWluIGNvbW1pdFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nW119IFtvcHRpb25zXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3RoZW5dXG4gKi9cbkdpdC5wcm90b3R5cGUuc2hvdyA9IGZ1bmN0aW9uIChvcHRpb25zLCB0aGVuKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIHN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soWydzaG93JywgLi4uZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cywgMSldKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpXG4gICApO1xufTtcblxuLyoqXG4gKi9cbkdpdC5wcm90b3R5cGUuY2xlYW4gPSBmdW5jdGlvbiAobW9kZSwgb3B0aW9ucywgdGhlbikge1xuICAgY29uc3QgdXNpbmdDbGVhbk9wdGlvbnNBcnJheSA9IGlzQ2xlYW5PcHRpb25zQXJyYXkobW9kZSk7XG4gICBjb25zdCBjbGVhbk1vZGUgPSB1c2luZ0NsZWFuT3B0aW9uc0FycmF5ICYmIG1vZGUuam9pbignJykgfHwgZmlsdGVyVHlwZShtb2RlLCBmaWx0ZXJTdHJpbmcpIHx8ICcnO1xuICAgY29uc3QgY3VzdG9tQXJncyA9IGdldFRyYWlsaW5nT3B0aW9ucyhbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgdXNpbmdDbGVhbk9wdGlvbnNBcnJheSA/IDEgOiAwKSk7XG5cbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgY2xlYW5XaXRoT3B0aW9uc1Rhc2soY2xlYW5Nb2RlLCBjdXN0b21BcmdzKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpLFxuICAgKTtcbn07XG5cbi8qKlxuICogQ2FsbCBhIHNpbXBsZSBmdW5jdGlvbiBhdCB0aGUgbmV4dCBzdGVwIGluIHRoZSBjaGFpbi5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFt0aGVuXVxuICovXG5HaXQucHJvdG90eXBlLmV4ZWMgPSBmdW5jdGlvbiAodGhlbikge1xuICAgY29uc3QgdGFzayA9IHtcbiAgICAgIGNvbW1hbmRzOiBbXSxcbiAgICAgIGZvcm1hdDogJ3V0Zi04JyxcbiAgICAgIHBhcnNlciAoKSB7XG4gICAgICAgICBpZiAodHlwZW9mIHRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoZW4oKTtcbiAgICAgICAgIH1cbiAgICAgIH1cbiAgIH07XG5cbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKHRhc2spO1xufTtcblxuLyoqXG4gKiBTaG93IGNvbW1pdCBsb2dzIGZyb20gYEhFQURgIHRvIHRoZSBmaXJzdCBjb21taXQuXG4gKiBJZiBwcm92aWRlZCBiZXR3ZWVuIGBvcHRpb25zLmZyb21gIGFuZCBgb3B0aW9ucy50b2AgdGFncyBvciBicmFuY2guXG4gKlxuICogQWRkaXRpb25hbGx5IHlvdSBjYW4gcHJvdmlkZSBvcHRpb25zLmZpbGUsIHdoaWNoIGlzIHRoZSBwYXRoIHRvIGEgZmlsZSBpbiB5b3VyIHJlcG9zaXRvcnkuIFRoZW4gb25seSB0aGlzIGZpbGUgd2lsbCBiZSBjb25zaWRlcmVkLlxuICpcbiAqIFRvIHVzZSBhIGN1c3RvbSBzcGxpdHRlciBpbiB0aGUgbG9nIGZvcm1hdCwgc2V0IGBvcHRpb25zLnNwbGl0dGVyYCB0byBiZSB0aGUgc3RyaW5nIHRoZSBsb2cgc2hvdWxkIGJlIHNwbGl0IG9uLlxuICpcbiAqIE9wdGlvbnMgY2FuIGFsc28gYmUgc3VwcGxpZWQgYXMgYSBzdGFuZGFyZCBvcHRpb25zIG9iamVjdCBmb3IgYWRkaW5nIGN1c3RvbSBwcm9wZXJ0aWVzIHN1cHBvcnRlZCBieSB0aGUgZ2l0IGxvZyBjb21tYW5kLlxuICogRm9yIGFueSBvdGhlciBzZXQgb2Ygb3B0aW9ucywgc3VwcGx5IG9wdGlvbnMgYXMgYW4gYXJyYXkgb2Ygc3RyaW5ncyB0byBiZSBhcHBlbmRlZCB0byB0aGUgZ2l0IGxvZyBjb21tYW5kLlxuICovXG5HaXQucHJvdG90eXBlLmxvZyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICBjb25zdCBuZXh0ID0gdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyk7XG5cbiAgIGlmIChmaWx0ZXJTdHJpbmcoYXJndW1lbnRzWzBdKSAmJiBmaWx0ZXJTdHJpbmcoYXJndW1lbnRzWzFdKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICAgICBjb25maWd1cmF0aW9uRXJyb3JUYXNrKGBnaXQubG9nKHN0cmluZywgc3RyaW5nKSBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCBnaXQubG9nKHsgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nIH0pYCksXG4gICAgICAgICBuZXh0XG4gICAgICApO1xuICAgfVxuXG4gICBjb25zdCBwYXJzZWRPcHRpb25zID0gcGFyc2VMb2dPcHRpb25zKFxuICAgICAgdHJhaWxpbmdPcHRpb25zQXJndW1lbnQoYXJndW1lbnRzKSB8fCB7fSxcbiAgICAgIGZpbHRlckFycmF5KG9wdGlvbnMpICYmIG9wdGlvbnMgfHwgW11cbiAgICk7XG5cbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgbG9nVGFzayhwYXJzZWRPcHRpb25zLnNwbGl0dGVyLCBwYXJzZWRPcHRpb25zLmZpZWxkcywgcGFyc2VkT3B0aW9ucy5jb21tYW5kcyksXG4gICAgICBuZXh0LFxuICAgKVxufTtcblxuLyoqXG4gKiBDbGVhcnMgdGhlIHF1ZXVlIG9mIHBlbmRpbmcgY29tbWFuZHMgYW5kIHJldHVybnMgdGhlIHdyYXBwZXIgaW5zdGFuY2UgZm9yIGNoYWluaW5nLlxuICpcbiAqIEByZXR1cm5zIHtHaXR9XG4gKi9cbkdpdC5wcm90b3R5cGUuY2xlYXJRdWV1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgIC8vIFRPRE86XG4gICAvLyB0aGlzLl9leGVjdXRvci5jbGVhcigpO1xuICAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGEgcGF0aG5hbWUgb3IgcGF0aG5hbWVzIGFyZSBleGNsdWRlZCBieSAuZ2l0aWdub3JlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IHBhdGhuYW1lc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gW3RoZW5dXG4gKi9cbkdpdC5wcm90b3R5cGUuY2hlY2tJZ25vcmUgPSBmdW5jdGlvbiAocGF0aG5hbWVzLCB0aGVuKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIGNoZWNrSWdub3JlVGFzayhhc0FycmF5KChmaWx0ZXJUeXBlKHBhdGhuYW1lcywgZmlsdGVyU3RyaW5nT3JTdHJpbmdBcnJheSwgW10pKSkpLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyksXG4gICApO1xufTtcblxuR2l0LnByb3RvdHlwZS5jaGVja0lzUmVwbyA9IGZ1bmN0aW9uIChjaGVja1R5cGUsIHRoZW4pIHtcbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgY2hlY2tJc1JlcG9UYXNrKGZpbHRlclR5cGUoY2hlY2tUeXBlLCBmaWx0ZXJTdHJpbmcpKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpLFxuICAgKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gR2l0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdpdEluc3RhbmNlRmFjdG9yeSA9IGV4cG9ydHMuZ2l0RXhwb3J0RmFjdG9yeSA9IGV4cG9ydHMuZXNNb2R1bGVGYWN0b3J5ID0gdm9pZCAwO1xuY29uc3QgYXBpXzEgPSByZXF1aXJlKFwiLi9hcGlcIik7XG5jb25zdCBwbHVnaW5zXzEgPSByZXF1aXJlKFwiLi9wbHVnaW5zXCIpO1xuY29uc3QgdXRpbHNfMSA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpO1xuY29uc3QgR2l0ID0gcmVxdWlyZSgnLi4vZ2l0Jyk7XG4vKipcbiAqIEFkZHMgdGhlIG5lY2Vzc2FyeSBwcm9wZXJ0aWVzIHRvIHRoZSBzdXBwbGllZCBvYmplY3QgdG8gZW5hYmxlIGl0IGZvciB1c2UgYXNcbiAqIHRoZSBkZWZhdWx0IGV4cG9ydCBvZiBhIG1vZHVsZS5cbiAqXG4gKiBFZzogYG1vZHVsZS5leHBvcnRzID0gZXNNb2R1bGVGYWN0b3J5KHsgc29tZXRoaW5nICgpIHt9IH0pYFxuICovXG5mdW5jdGlvbiBlc01vZHVsZUZhY3RvcnkoZGVmYXVsdEV4cG9ydCkge1xuICAgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhkZWZhdWx0RXhwb3J0LCB7XG4gICAgICAgIF9fZXNNb2R1bGU6IHsgdmFsdWU6IHRydWUgfSxcbiAgICAgICAgZGVmYXVsdDogeyB2YWx1ZTogZGVmYXVsdEV4cG9ydCB9LFxuICAgIH0pO1xufVxuZXhwb3J0cy5lc01vZHVsZUZhY3RvcnkgPSBlc01vZHVsZUZhY3Rvcnk7XG5mdW5jdGlvbiBnaXRFeHBvcnRGYWN0b3J5KGZhY3RvcnksIGV4dHJhKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIGZhY3RvcnkuYXBwbHkobnVsbCwgYXJncyk7XG4gICAgfSwgYXBpXzEuZGVmYXVsdCwgZXh0cmEgfHwge30pO1xufVxuZXhwb3J0cy5naXRFeHBvcnRGYWN0b3J5ID0gZ2l0RXhwb3J0RmFjdG9yeTtcbmZ1bmN0aW9uIGdpdEluc3RhbmNlRmFjdG9yeShiYXNlRGlyLCBvcHRpb25zKSB7XG4gICAgY29uc3QgcGx1Z2lucyA9IG5ldyBwbHVnaW5zXzEuUGx1Z2luU3RvcmUoKTtcbiAgICBjb25zdCBjb25maWcgPSB1dGlsc18xLmNyZWF0ZUluc3RhbmNlQ29uZmlnKGJhc2VEaXIgJiYgKHR5cGVvZiBiYXNlRGlyID09PSAnc3RyaW5nJyA/IHsgYmFzZURpciB9IDogYmFzZURpcikgfHwge30sIG9wdGlvbnMpO1xuICAgIGlmICghdXRpbHNfMS5mb2xkZXJFeGlzdHMoY29uZmlnLmJhc2VEaXIpKSB7XG4gICAgICAgIHRocm93IG5ldyBhcGlfMS5kZWZhdWx0LkdpdENvbnN0cnVjdEVycm9yKGNvbmZpZywgYENhbm5vdCB1c2Ugc2ltcGxlLWdpdCBvbiBhIGRpcmVjdG9yeSB0aGF0IGRvZXMgbm90IGV4aXN0YCk7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KGNvbmZpZy5jb25maWcpKSB7XG4gICAgICAgIHBsdWdpbnMuYWRkKHBsdWdpbnNfMS5jb21tYW5kQ29uZmlnUHJlZml4aW5nUGx1Z2luKGNvbmZpZy5jb25maWcpKTtcbiAgICB9XG4gICAgY29uZmlnLnByb2dyZXNzICYmIHBsdWdpbnMuYWRkKHBsdWdpbnNfMS5wcm9ncmVzc01vbml0b3JQbHVnaW4oY29uZmlnLnByb2dyZXNzKSk7XG4gICAgY29uZmlnLnRpbWVvdXQgJiYgcGx1Z2lucy5hZGQocGx1Z2luc18xLnRpbWVvdXRQbHVnaW4oY29uZmlnLnRpbWVvdXQpKTtcbiAgICBwbHVnaW5zLmFkZChwbHVnaW5zXzEuZXJyb3JEZXRlY3Rpb25QbHVnaW4ocGx1Z2luc18xLmVycm9yRGV0ZWN0aW9uSGFuZGxlcih0cnVlKSkpO1xuICAgIGNvbmZpZy5lcnJvcnMgJiYgcGx1Z2lucy5hZGQocGx1Z2luc18xLmVycm9yRGV0ZWN0aW9uUGx1Z2luKGNvbmZpZy5lcnJvcnMpKTtcbiAgICByZXR1cm4gbmV3IEdpdChjb25maWcsIHBsdWdpbnMpO1xufVxuZXhwb3J0cy5naXRJbnN0YW5jZUZhY3RvcnkgPSBnaXRJbnN0YW5jZUZhY3Rvcnk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1naXQtZmFjdG9yeS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2l0UCA9IHZvaWQgMDtcbmNvbnN0IGdpdF9yZXNwb25zZV9lcnJvcl8xID0gcmVxdWlyZShcIi4uL2Vycm9ycy9naXQtcmVzcG9uc2UtZXJyb3JcIik7XG5jb25zdCBnaXRfZmFjdG9yeV8xID0gcmVxdWlyZShcIi4uL2dpdC1mYWN0b3J5XCIpO1xuY29uc3QgZnVuY3Rpb25OYW1lc0J1aWxkZXJBcGkgPSBbXG4gICAgJ2N1c3RvbUJpbmFyeScsICdlbnYnLCAnb3V0cHV0SGFuZGxlcicsICdzaWxlbnQnLFxuXTtcbmNvbnN0IGZ1bmN0aW9uTmFtZXNQcm9taXNlQXBpID0gW1xuICAgICdhZGQnLFxuICAgICdhZGRBbm5vdGF0ZWRUYWcnLFxuICAgICdhZGRDb25maWcnLFxuICAgICdhZGRSZW1vdGUnLFxuICAgICdhZGRUYWcnLFxuICAgICdhcHBseVBhdGNoJyxcbiAgICAnYmluYXJ5Q2F0RmlsZScsXG4gICAgJ2JyYW5jaCcsXG4gICAgJ2JyYW5jaExvY2FsJyxcbiAgICAnY2F0RmlsZScsXG4gICAgJ2NoZWNrSWdub3JlJyxcbiAgICAnY2hlY2tJc1JlcG8nLFxuICAgICdjaGVja291dCcsXG4gICAgJ2NoZWNrb3V0QnJhbmNoJyxcbiAgICAnY2hlY2tvdXRMYXRlc3RUYWcnLFxuICAgICdjaGVja291dExvY2FsQnJhbmNoJyxcbiAgICAnY2xlYW4nLFxuICAgICdjbG9uZScsXG4gICAgJ2NvbW1pdCcsXG4gICAgJ2N3ZCcsXG4gICAgJ2RlbGV0ZUxvY2FsQnJhbmNoJyxcbiAgICAnZGVsZXRlTG9jYWxCcmFuY2hlcycsXG4gICAgJ2RpZmYnLFxuICAgICdkaWZmU3VtbWFyeScsXG4gICAgJ2V4ZWMnLFxuICAgICdmZXRjaCcsXG4gICAgJ2dldFJlbW90ZXMnLFxuICAgICdpbml0JyxcbiAgICAnbGlzdENvbmZpZycsXG4gICAgJ2xpc3RSZW1vdGUnLFxuICAgICdsb2cnLFxuICAgICdtZXJnZScsXG4gICAgJ21lcmdlRnJvbVRvJyxcbiAgICAnbWlycm9yJyxcbiAgICAnbXYnLFxuICAgICdwdWxsJyxcbiAgICAncHVzaCcsXG4gICAgJ3B1c2hUYWdzJyxcbiAgICAncmF3JyxcbiAgICAncmViYXNlJyxcbiAgICAncmVtb3RlJyxcbiAgICAncmVtb3ZlUmVtb3RlJyxcbiAgICAncmVzZXQnLFxuICAgICdyZXZlcnQnLFxuICAgICdyZXZwYXJzZScsXG4gICAgJ3JtJyxcbiAgICAncm1LZWVwTG9jYWwnLFxuICAgICdzaG93JyxcbiAgICAnc3Rhc2gnLFxuICAgICdzdGFzaExpc3QnLFxuICAgICdzdGF0dXMnLFxuICAgICdzdWJNb2R1bGUnLFxuICAgICdzdWJtb2R1bGVBZGQnLFxuICAgICdzdWJtb2R1bGVJbml0JyxcbiAgICAnc3VibW9kdWxlVXBkYXRlJyxcbiAgICAndGFnJyxcbiAgICAndGFncycsXG4gICAgJ3VwZGF0ZVNlcnZlckluZm8nXG5dO1xuZnVuY3Rpb24gZ2l0UCguLi5hcmdzKSB7XG4gICAgbGV0IGdpdDtcbiAgICBsZXQgY2hhaW4gPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB0cnkge1xuICAgICAgICBnaXQgPSBnaXRfZmFjdG9yeV8xLmdpdEluc3RhbmNlRmFjdG9yeSguLi5hcmdzKTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgY2hhaW4gPSBQcm9taXNlLnJlamVjdChlKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gYnVpbGRlclJldHVybigpIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VBcGk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNoYWluUmV0dXJuKCkge1xuICAgICAgICByZXR1cm4gY2hhaW47XG4gICAgfVxuICAgIGNvbnN0IHByb21pc2VBcGkgPSBbLi4uZnVuY3Rpb25OYW1lc0J1aWxkZXJBcGksIC4uLmZ1bmN0aW9uTmFtZXNQcm9taXNlQXBpXS5yZWR1Y2UoKGFwaSwgbmFtZSkgPT4ge1xuICAgICAgICBjb25zdCBpc0FzeW5jID0gZnVuY3Rpb25OYW1lc1Byb21pc2VBcGkuaW5jbHVkZXMobmFtZSk7XG4gICAgICAgIGNvbnN0IHZhbGlkID0gaXNBc3luYyA/IGFzeW5jV3JhcHBlcihuYW1lLCBnaXQpIDogc3luY1dyYXBwZXIobmFtZSwgZ2l0LCBhcGkpO1xuICAgICAgICBjb25zdCBhbHRlcm5hdGl2ZSA9IGlzQXN5bmMgPyBjaGFpblJldHVybiA6IGJ1aWxkZXJSZXR1cm47XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhcGksIG5hbWUsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHZhbHVlOiBnaXQgPyB2YWxpZCA6IGFsdGVybmF0aXZlLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LCB7fSk7XG4gICAgcmV0dXJuIHByb21pc2VBcGk7XG4gICAgZnVuY3Rpb24gYXN5bmNXcmFwcGVyKGZuLCBnaXQpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGFyZ3NbYXJncy5sZW5ndGhdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUHJvbWlzZSBpbnRlcmZhY2UgcmVxdWlyZXMgdGhhdCBoYW5kbGVycyBhcmUgbm90IHN1cHBsaWVkIGlubGluZSwgJyArXG4gICAgICAgICAgICAgICAgICAgICd0cmFpbGluZyBmdW5jdGlvbiBub3QgYWxsb3dlZCBpbiBjYWxsIHRvICcgKyBmbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY2hhaW4udGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FsbGJhY2sgPSAoZXJyLCByZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KHRvRXJyb3IoZXJyKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGFyZ3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgICAgIGdpdFtmbl0uYXBwbHkoZ2l0LCBhcmdzKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBmdW5jdGlvbiBzeW5jV3JhcHBlcihmbiwgZ2l0LCBhcGkpIHtcbiAgICAgICAgcmV0dXJuICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICBnaXRbZm5dKC4uLmFyZ3MpO1xuICAgICAgICAgICAgcmV0dXJuIGFwaTtcbiAgICAgICAgfTtcbiAgICB9XG59XG5leHBvcnRzLmdpdFAgPSBnaXRQO1xuZnVuY3Rpb24gdG9FcnJvcihlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFcnJvcihlcnJvcik7XG4gICAgfVxuICAgIHJldHVybiBuZXcgZ2l0X3Jlc3BvbnNlX2Vycm9yXzEuR2l0UmVzcG9uc2VFcnJvcihlcnJvcik7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wcm9taXNlLXdyYXBwZWQuanMubWFwIiwiXG5jb25zdCB7Z2l0UH0gPSByZXF1aXJlKCcuL2xpYi9ydW5uZXJzL3Byb21pc2Utd3JhcHBlZCcpO1xuY29uc3Qge2VzTW9kdWxlRmFjdG9yeSwgZ2l0SW5zdGFuY2VGYWN0b3J5LCBnaXRFeHBvcnRGYWN0b3J5fSA9IHJlcXVpcmUoJy4vbGliL2dpdC1mYWN0b3J5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZXNNb2R1bGVGYWN0b3J5KFxuICAgZ2l0RXhwb3J0RmFjdG9yeShnaXRJbnN0YW5jZUZhY3RvcnksIHtnaXRQfSlcbik7XG4iLCJpbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgRmlsZVN5c3RlbUFkYXB0ZXIsIEZ1enp5U3VnZ2VzdE1vZGFsLCBOb3RpY2UsIFBsdWdpbiwgUGx1Z2luU2V0dGluZ1RhYiwgU2V0dGluZywgU3VnZ2VzdE1vZGFsLCBURmlsZSB9IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IHNpbXBsZUdpdCwgeyBGaWxlU3RhdHVzUmVzdWx0LCBTaW1wbGVHaXQgfSBmcm9tIFwic2ltcGxlLWdpdFwiO1xuXG5lbnVtIFBsdWdpblN0YXRlIHtcbiAgICBpZGxlLFxuICAgIHN0YXR1cyxcbiAgICBwdWxsLFxuICAgIGFkZCxcbiAgICBjb21taXQsXG4gICAgcHVzaCxcbiAgICBjb25mbGljdGVkLFxufVxuaW50ZXJmYWNlIE9ic2lkaWFuR2l0U2V0dGluZ3Mge1xuICAgIGNvbW1pdE1lc3NhZ2U6IHN0cmluZztcbiAgICBjb21taXREYXRlRm9ybWF0OiBzdHJpbmc7XG4gICAgYXV0b1NhdmVJbnRlcnZhbDogbnVtYmVyO1xuICAgIGF1dG9QdWxsSW50ZXJ2YWw6IG51bWJlcjtcbiAgICBhdXRvUHVsbE9uQm9vdDogYm9vbGVhbjtcbiAgICBkaXNhYmxlUHVzaDogYm9vbGVhbjtcbiAgICBwdWxsQmVmb3JlUHVzaDogYm9vbGVhbjtcbiAgICBkaXNhYmxlUG9wdXBzOiBib29sZWFuO1xuICAgIGxpc3RDaGFuZ2VkRmlsZXNJbk1lc3NhZ2VCb2R5OiBib29sZWFuO1xuICAgIHNob3dTdGF0dXNCYXI6IGJvb2xlYW47XG59XG5jb25zdCBERUZBVUxUX1NFVFRJTkdTOiBPYnNpZGlhbkdpdFNldHRpbmdzID0ge1xuICAgIGNvbW1pdE1lc3NhZ2U6IFwidmF1bHQgYmFja3VwOiB7e2RhdGV9fVwiLFxuICAgIGNvbW1pdERhdGVGb3JtYXQ6IFwiWVlZWS1NTS1ERCBISDptbTpzc1wiLFxuICAgIGF1dG9TYXZlSW50ZXJ2YWw6IDAsXG4gICAgYXV0b1B1bGxJbnRlcnZhbDogMCxcbiAgICBhdXRvUHVsbE9uQm9vdDogZmFsc2UsXG4gICAgZGlzYWJsZVB1c2g6IGZhbHNlLFxuICAgIHB1bGxCZWZvcmVQdXNoOiB0cnVlLFxuICAgIGRpc2FibGVQb3B1cHM6IGZhbHNlLFxuICAgIGxpc3RDaGFuZ2VkRmlsZXNJbk1lc3NhZ2VCb2R5OiBmYWxzZSxcbiAgICBzaG93U3RhdHVzQmFyOiB0cnVlLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgT2JzaWRpYW5HaXQgZXh0ZW5kcyBQbHVnaW4ge1xuICAgIGdpdDogU2ltcGxlR2l0O1xuICAgIHNldHRpbmdzOiBPYnNpZGlhbkdpdFNldHRpbmdzO1xuICAgIHN0YXR1c0JhcjogU3RhdHVzQmFyO1xuICAgIHN0YXRlOiBQbHVnaW5TdGF0ZTtcbiAgICB0aW1lb3V0SURCYWNrdXA6IG51bWJlcjtcbiAgICB0aW1lb3V0SURQdWxsOiBudW1iZXI7XG4gICAgbGFzdFVwZGF0ZTogbnVtYmVyO1xuICAgIGdpdFJlYWR5ID0gZmFsc2U7XG4gICAgcHJvbWlzZVF1ZXVlOiBQcm9taXNlUXVldWUgPSBuZXcgUHJvbWlzZVF1ZXVlKCk7XG4gICAgY29uZmxpY3RPdXRwdXRGaWxlID0gXCJjb25mbGljdC1maWxlcy1vYnNpZGlhbi1naXQubWRcIjtcblxuICAgIHNldFN0YXRlKHN0YXRlOiBQbHVnaW5TdGF0ZSkge1xuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgICAgIHRoaXMuc3RhdHVzQmFyPy5kaXNwbGF5KCk7XG4gICAgfVxuXG4gICAgYXN5bmMgb25sb2FkKCkge1xuICAgICAgICBjb25zb2xlLmxvZygnbG9hZGluZyAnICsgdGhpcy5tYW5pZmVzdC5uYW1lICsgXCIgcGx1Z2luXCIpO1xuICAgICAgICBhd2FpdCB0aGlzLmxvYWRTZXR0aW5ncygpO1xuXG4gICAgICAgIHRoaXMuYWRkU2V0dGluZ1RhYihuZXcgT2JzaWRpYW5HaXRTZXR0aW5nc1RhYih0aGlzLmFwcCwgdGhpcykpO1xuXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogXCJwdWxsXCIsXG4gICAgICAgICAgICBuYW1lOiBcIlB1bGwgZnJvbSByZW1vdGUgcmVwb3NpdG9yeVwiLFxuICAgICAgICAgICAgY2FsbGJhY2s6ICgpID0+IHRoaXMucHJvbWlzZVF1ZXVlLmFkZFRhc2soKCkgPT4gdGhpcy5wdWxsQ2hhbmdlc0Zyb21SZW1vdGUoKSksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogXCJwdXNoXCIsXG4gICAgICAgICAgICBuYW1lOiBcIkNvbW1pdCAqYWxsKiBjaGFuZ2VzIGFuZCBwdXNoIHRvIHJlbW90ZSByZXBvc2l0b3J5XCIsXG4gICAgICAgICAgICBjYWxsYmFjazogKCkgPT4gdGhpcy5wcm9taXNlUXVldWUuYWRkVGFzaygoKSA9PiB0aGlzLmNyZWF0ZUJhY2t1cChmYWxzZSkpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogXCJjb21taXQtcHVzaC1zcGVjaWZpZWQtbWVzc2FnZVwiLFxuICAgICAgICAgICAgbmFtZTogXCJDb21taXQgYW5kIHB1c2ggYWxsIGNoYW5nZXMgd2l0aCBzcGVjaWZpZWQgbWVzc2FnZVwiLFxuICAgICAgICAgICAgY2FsbGJhY2s6ICgpID0+IG5ldyBDdXN0b21NZXNzYWdlTW9kYWwodGhpcykub3BlbigpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogXCJsaXN0LWNoYW5nZWQtZmlsZXNcIixcbiAgICAgICAgICAgIG5hbWU6IFwiTGlzdCBjaGFuZ2VkIGZpbGVzXCIsXG4gICAgICAgICAgICBjYWxsYmFjazogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHRoaXMuZ2l0LnN0YXR1cygpO1xuICAgICAgICAgICAgICAgIG5ldyBDaGFuZ2VkRmlsZXNNb2RhbCh0aGlzLCBzdGF0dXMuZmlsZXMpLm9wZW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzLnNob3dTdGF0dXNCYXIpIHtcbiAgICAgICAgICAgIC8vIGluaXQgc3RhdHVzQmFyXG4gICAgICAgICAgICBsZXQgc3RhdHVzQmFyRWwgPSB0aGlzLmFkZFN0YXR1c0Jhckl0ZW0oKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzQmFyID0gbmV3IFN0YXR1c0JhcihzdGF0dXNCYXJFbCwgdGhpcyk7XG4gICAgICAgICAgICB0aGlzLnJlZ2lzdGVySW50ZXJ2YWwoXG4gICAgICAgICAgICAgICAgd2luZG93LnNldEludGVydmFsKCgpID0+IHRoaXMuc3RhdHVzQmFyLmRpc3BsYXkoKSwgMTAwMClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYXBwLndvcmtzcGFjZS5sYXlvdXRSZWFkeSkge1xuICAgICAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFwcC53b3Jrc3BhY2Uub24oXCJsYXlvdXQtcmVhZHlcIiwgKCkgPT4gdGhpcy5pbml0KCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgb251bmxvYWQoKSB7XG4gICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy50aW1lb3V0SURCYWNrdXApO1xuICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dElEUHVsbCk7XG4gICAgICAgIGNvbnNvbGUubG9nKCd1bmxvYWRpbmcgJyArIHRoaXMubWFuaWZlc3QubmFtZSArIFwiIHBsdWdpblwiKTtcbiAgICB9XG4gICAgYXN5bmMgbG9hZFNldHRpbmdzKCkge1xuICAgICAgICB0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9TRVRUSU5HUywgYXdhaXQgdGhpcy5sb2FkRGF0YSgpKTtcbiAgICB9XG4gICAgYXN5bmMgc2F2ZVNldHRpbmdzKCkge1xuICAgICAgICBhd2FpdCB0aGlzLnNhdmVEYXRhKHRoaXMuc2V0dGluZ3MpO1xuICAgIH1cblxuICAgIGFzeW5jIHNhdmVMYXN0QXV0byhkYXRlOiBEYXRlLCBtb2RlOiBcImJhY2t1cFwiIHwgXCJwdWxsXCIpIHtcbiAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBcIi5vYnNpZGlhbi1naXQtZGF0YVwiO1xuICAgICAgICBsZXQgZGF0YSA9IFwiXFxuXCI7XG4gICAgICAgIGlmIChhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLmV4aXN0cyhmaWxlTmFtZSkpIHtcbiAgICAgICAgICAgIGRhdGEgPSBhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLnJlYWQoZmlsZU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxpbmVzID0gZGF0YS5zcGxpdChcIlxcblwiKTtcbiAgICAgICAgaWYgKG1vZGUgPT09IFwiYmFja3VwXCIpIHtcbiAgICAgICAgICAgIGxpbmVzWzBdID0gZGF0ZS50b1N0cmluZygpO1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT09IFwicHVsbFwiKSB7XG4gICAgICAgICAgICBsaW5lc1sxXSA9IGRhdGUudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIud3JpdGUoZmlsZU5hbWUsIGxpbmVzLmpvaW4oXCJcXG5cIikpO1xuICAgIH1cblxuICAgIGFzeW5jIGxvYWRMYXN0QXV0bygpOiBQcm9taXNlPHsgXCJiYWNrdXBcIjogRGF0ZSwgXCJwdWxsXCI6IERhdGU7IH0+IHtcbiAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBcIi5vYnNpZGlhbi1naXQtZGF0YVwiO1xuICAgICAgICBsZXQgZGF0YSA9IFwiXFxuXCI7XG4gICAgICAgIGlmIChhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLmV4aXN0cyhmaWxlTmFtZSkpIHtcbiAgICAgICAgICAgIGRhdGEgPSBhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLnJlYWQoZmlsZU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxpbmVzID0gZGF0YS5zcGxpdChcIlxcblwiKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIFwiYmFja3VwXCI6IG5ldyBEYXRlKGxpbmVzWzBdKSxcbiAgICAgICAgICAgIFwicHVsbFwiOiBuZXcgRGF0ZShsaW5lc1sxXSlcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBhc3luYyBpbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMuaXNHaXRJbnN0YWxsZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5RXJyb3IoXCJDYW5ub3QgcnVuIGdpdCBjb21tYW5kXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBhZGFwdGVyID0gdGhpcy5hcHAudmF1bHQuYWRhcHRlciBhcyBGaWxlU3lzdGVtQWRhcHRlcjtcbiAgICAgICAgICAgIGNvbnN0IHBhdGggPSBhZGFwdGVyLmdldEJhc2VQYXRoKCk7XG5cbiAgICAgICAgICAgIHRoaXMuZ2l0ID0gc2ltcGxlR2l0KHBhdGgpO1xuXG4gICAgICAgICAgICBjb25zdCBpc1ZhbGlkUmVwbyA9IGF3YWl0IHRoaXMuZ2l0LmNoZWNrSXNSZXBvKCk7XG5cbiAgICAgICAgICAgIGlmICghaXNWYWxpZFJlcG8pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlFcnJvcihcIlZhbGlkIGdpdCByZXBvc2l0b3J5IG5vdCBmb3VuZC5cIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZ2l0UmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoUGx1Z2luU3RhdGUuaWRsZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5hdXRvUHVsbE9uQm9vdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb21pc2VRdWV1ZS5hZGRUYXNrKCgpID0+IHRoaXMucHVsbENoYW5nZXNGcm9tUmVtb3RlKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0QXV0b3MgPSBhd2FpdCB0aGlzLmxvYWRMYXN0QXV0bygpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MuYXV0b1NhdmVJbnRlcnZhbCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaWZmID0gdGhpcy5zZXR0aW5ncy5hdXRvU2F2ZUludGVydmFsIC0gKE1hdGgucm91bmQoKChub3cuZ2V0VGltZSgpIC0gbGFzdEF1dG9zLmJhY2t1cC5nZXRUaW1lKCkpIC8gMTAwMCkgLyA2MCkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0QXV0b0JhY2t1cChkaWZmIDw9IDAgPyAwIDogZGlmZik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNldHRpbmdzLmF1dG9QdWxsSW50ZXJ2YWwgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlmZiA9IHRoaXMuc2V0dGluZ3MuYXV0b1B1bGxJbnRlcnZhbCAtIChNYXRoLnJvdW5kKCgobm93LmdldFRpbWUoKSAtIGxhc3RBdXRvcy5wdWxsLmdldFRpbWUoKSkgLyAxMDAwKSAvIDYwKSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRBdXRvUHVsbChkaWZmIDw9IDAgPyAwIDogZGlmZik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlFcnJvcihlcnJvcik7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHB1bGxDaGFuZ2VzRnJvbVJlbW90ZSgpOiBQcm9taXNlPHZvaWQ+IHtcblxuICAgICAgICBpZiAoIXRoaXMuZ2l0UmVhZHkpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmdpdFJlYWR5KSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgZmlsZXNVcGRhdGVkID0gYXdhaXQgdGhpcy5wdWxsKCk7XG4gICAgICAgIGlmIChmaWxlc1VwZGF0ZWQgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlNZXNzYWdlKGBQdWxsZWQgbmV3IGNoYW5nZXMuICR7ZmlsZXNVcGRhdGVkfSBmaWxlcyB1cGRhdGVkYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlNZXNzYWdlKFwiRXZlcnl0aGluZyBpcyB1cC10by1kYXRlXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgdGhpcy5naXQuc3RhdHVzKCk7XG4gICAgICAgIGlmIChzdGF0dXMuY29uZmxpY3RlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlFcnJvcihgWW91IGhhdmUgJHtzdGF0dXMuY29uZmxpY3RlZC5sZW5ndGh9IGNvbmZsaWN0IGZpbGVzYCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxhc3RVcGRhdGUgPSBEYXRlLm5vdygpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKFBsdWdpblN0YXRlLmlkbGUpO1xuICAgIH1cblxuICAgIGFzeW5jIGNyZWF0ZUJhY2t1cChmcm9tQXV0b0JhY2t1cDogYm9vbGVhbiwgY29tbWl0TWVzc2FnZT86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMuZ2l0UmVhZHkpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5naXRSZWFkeSkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoUGx1Z2luU3RhdGUuc3RhdHVzKTtcbiAgICAgICAgbGV0IHN0YXR1cyA9IGF3YWl0IHRoaXMuZ2l0LnN0YXR1cygpO1xuXG5cbiAgICAgICAgaWYgKCFmcm9tQXV0b0JhY2t1cCkge1xuICAgICAgICAgICAgY29uc3QgZmlsZSA9IHRoaXMuYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aCh0aGlzLmNvbmZsaWN0T3V0cHV0RmlsZSk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFwcC52YXVsdC5kZWxldGUoZmlsZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBmb3IgY29uZmxpY3QgZmlsZXMgb24gYXV0byBiYWNrdXBcbiAgICAgICAgaWYgKGZyb21BdXRvQmFja3VwICYmIHN0YXR1cy5jb25mbGljdGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoUGx1Z2luU3RhdGUuaWRsZSk7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlFcnJvcihgRGlkIG5vdCBjb21taXQsIGJlY2F1c2UgeW91IGhhdmUgJHtzdGF0dXMuY29uZmxpY3RlZC5sZW5ndGh9IGNvbmZsaWN0IGZpbGVzLiBQbGVhc2UgcmVzb2x2ZSB0aGVtIGFuZCBjb21taXQgcGVyIGNvbW1hbmQuYCk7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUNvbmZsaWN0KHN0YXR1cy5jb25mbGljdGVkKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNoYW5nZWRGaWxlcyA9IChhd2FpdCB0aGlzLmdpdC5zdGF0dXMoKSkuZmlsZXM7XG5cbiAgICAgICAgaWYgKGNoYW5nZWRGaWxlcy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRkKCk7XG4gICAgICAgICAgICBzdGF0dXMgPSBhd2FpdCB0aGlzLmdpdC5zdGF0dXMoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY29tbWl0KGNvbW1pdE1lc3NhZ2UpO1xuXG4gICAgICAgICAgICB0aGlzLmxhc3RVcGRhdGUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5TWVzc2FnZShgQ29tbWl0dGVkICR7c3RhdHVzLnN0YWdlZC5sZW5ndGh9IGZpbGVzYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlNZXNzYWdlKFwiTm8gY2hhbmdlcyB0byBjb21taXRcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZ3MuZGlzYWJsZVB1c2gpIHtcbiAgICAgICAgICAgIGNvbnN0IHRyYWNraW5nQnJhbmNoID0gc3RhdHVzLnRyYWNraW5nO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudEJyYW5jaCA9IHN0YXR1cy5jdXJyZW50O1xuXG4gICAgICAgICAgICBpZiAoIXRyYWNraW5nQnJhbmNoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5RXJyb3IoXCJEaWQgbm90IHB1c2guIE5vIHVwc3RyZWFtIGJyYW5jaCBpcyBzZXQhIFNlZSBSRUFETUUgZm9yIGluc3RydWN0aW9uc1wiLCAxMDAwMCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZShQbHVnaW5TdGF0ZS5pZGxlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJlbW90ZUNoYW5nZWRGaWxlcyA9IChhd2FpdCB0aGlzLmdpdC5kaWZmU3VtbWFyeShbY3VycmVudEJyYW5jaCwgdHJhY2tpbmdCcmFuY2hdKSkuY2hhbmdlZDtcblxuICAgICAgICAgICAgLy8gUHJldmVudCBwbHVnaW4gdG8gcHVsbC9wdXNoIGF0IGV2ZXJ5IGNhbGwgb2YgY3JlYXRlQmFja3VwLiBPbmx5IGlmIHVucHVzaGVkIGNvbW1pdHMgYXJlIHByZXNlbnRcbiAgICAgICAgICAgIGlmIChyZW1vdGVDaGFuZ2VkRmlsZXMgPiAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MucHVsbEJlZm9yZVB1c2gpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHVsbGVkRmlsZXNMZW5ndGggPSBhd2FpdCB0aGlzLnB1bGwoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHB1bGxlZEZpbGVzTGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5TWVzc2FnZShgUHVsbGVkICR7cHVsbGVkRmlsZXNMZW5ndGh9IGZpbGVzIGZyb20gcmVtb3RlYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBSZWZyZXNoIGJlY2F1c2Ugb2YgcHVsbFxuICAgICAgICAgICAgICAgIHN0YXR1cyA9IGF3YWl0IHRoaXMuZ2l0LnN0YXR1cygpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cy5jb25mbGljdGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5RXJyb3IoYENhbm5vdCBwdXNoLiBZb3UgaGF2ZSAke3N0YXR1cy5jb25mbGljdGVkLmxlbmd0aH0gY29uZmxpY3QgZmlsZXNgKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVDb25mbGljdChzdGF0dXMuY29uZmxpY3RlZCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZW1vdGVDaGFuZ2VkRmlsZXMgPSAoYXdhaXQgdGhpcy5naXQuZGlmZlN1bW1hcnkoW2N1cnJlbnRCcmFuY2gsIHRyYWNraW5nQnJhbmNoXSkpLmNoYW5nZWQ7XG5cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wdXNoKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheU1lc3NhZ2UoYFB1c2hlZCAke3JlbW90ZUNoYW5nZWRGaWxlc30gZmlsZXMgdG8gcmVtb3RlYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlNZXNzYWdlKFwiTm8gY2hhbmdlcyB0byBwdXNoXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoUGx1Z2luU3RhdGUuaWRsZSk7XG4gICAgfVxuXG5cbiAgICAvLyByZWdpb246IG1haW4gbWV0aG9kc1xuXG4gICAgaXNHaXRJbnN0YWxsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9zdGV2ZXVreC9naXQtanMvaXNzdWVzLzQwMlxuICAgICAgICBjb25zdCBjb21tYW5kID0gc3Bhd25TeW5jKCdnaXQnLCBbJy0tdmVyc2lvbiddLCB7XG4gICAgICAgICAgICBzdGRpbzogJ2lnbm9yZSdcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGNvbW1hbmQuZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoY29tbWFuZC5lcnJvcik7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgYXN5bmMgYWRkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKFBsdWdpblN0YXRlLmFkZCk7XG4gICAgICAgIGF3YWl0IHRoaXMuZ2l0LmFkZChcbiAgICAgICAgICAgIFwiLi8qXCIsXG4gICAgICAgICAgICAoZXJyOiBFcnJvciB8IG51bGwpID0+XG4gICAgICAgICAgICAgICAgZXJyICYmIHRoaXMuZGlzcGxheUVycm9yKGBDYW5ub3QgYWRkIGZpbGVzOiAke2Vyci5tZXNzYWdlfWApXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgYXN5bmMgY29tbWl0KG1lc3NhZ2U/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShQbHVnaW5TdGF0ZS5jb21taXQpO1xuICAgICAgICBsZXQgY29tbWl0TWVzc2FnZTogc3RyaW5nIHwgc3RyaW5nW10gPSBtZXNzYWdlID8/IGF3YWl0IHRoaXMuZm9ybWF0Q29tbWl0TWVzc2FnZSh0aGlzLnNldHRpbmdzLmNvbW1pdE1lc3NhZ2UpO1xuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5saXN0Q2hhbmdlZEZpbGVzSW5NZXNzYWdlQm9keSkge1xuICAgICAgICAgICAgY29tbWl0TWVzc2FnZSA9IFtjb21taXRNZXNzYWdlLCBcIkFmZmVjdGVkIGZpbGVzOlwiLCAoYXdhaXQgdGhpcy5naXQuc3RhdHVzKCkpLnN0YWdlZC5qb2luKFwiXFxuXCIpXTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmdpdC5jb21taXQoY29tbWl0TWVzc2FnZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgcHVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShQbHVnaW5TdGF0ZS5wdXNoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5naXQuZW52KHsgLi4ucHJvY2Vzcy5lbnYsIFwiT0JTSURJQU5fR0lUXCI6IDEgfSkucHVzaChcbiAgICAgICAgICAgIChlcnI6IEVycm9yIHwgbnVsbCkgPT4ge1xuICAgICAgICAgICAgICAgIGVyciAmJiB0aGlzLmRpc3BsYXlFcnJvcihgUHVzaCBmYWlsZWQgJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLmxhc3RVcGRhdGUgPSBEYXRlLm5vdygpO1xuICAgIH1cblxuICAgIGFzeW5jIHB1bGwoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShQbHVnaW5TdGF0ZS5wdWxsKTtcbiAgICAgICAgY29uc3QgcHVsbFJlc3VsdCA9IGF3YWl0IHRoaXMuZ2l0LnB1bGwoW1wiLS1uby1yZWJhc2VcIl0sXG4gICAgICAgICAgICBhc3luYyAoZXJyOiBFcnJvciB8IG51bGwpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheUVycm9yKGBQdWxsIGZhaWxlZCAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCB0aGlzLmdpdC5zdGF0dXMoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cy5jb25mbGljdGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQ29uZmxpY3Qoc3RhdHVzLmNvbmZsaWN0ZWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmxhc3RVcGRhdGUgPSBEYXRlLm5vdygpO1xuICAgICAgICByZXR1cm4gcHVsbFJlc3VsdC5maWxlcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgLy8gZW5kcmVnaW9uOiBtYWluIG1ldGhvZHNcblxuICAgIHN0YXJ0QXV0b0JhY2t1cChtaW51dGVzPzogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMudGltZW91dElEQmFja3VwID0gd2luZG93LnNldFRpbWVvdXQoXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9taXNlUXVldWUuYWRkVGFzaygoKSA9PiB0aGlzLmNyZWF0ZUJhY2t1cCh0cnVlKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlTGFzdEF1dG8obmV3IERhdGUoKSwgXCJiYWNrdXBcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0QXV0b0JhY2t1cCgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChtaW51dGVzID8/IHRoaXMuc2V0dGluZ3MuYXV0b1NhdmVJbnRlcnZhbCkgKiA2MDAwMFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHN0YXJ0QXV0b1B1bGwobWludXRlcz86IG51bWJlcikge1xuICAgICAgICB0aGlzLnRpbWVvdXRJRFB1bGwgPSB3aW5kb3cuc2V0VGltZW91dChcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb21pc2VRdWV1ZS5hZGRUYXNrKCgpID0+IHRoaXMucHVsbENoYW5nZXNGcm9tUmVtb3RlKCkpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2F2ZUxhc3RBdXRvKG5ldyBEYXRlKCksIFwicHVsbFwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRBdXRvUHVsbCgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChtaW51dGVzID8/IHRoaXMuc2V0dGluZ3MuYXV0b1B1bGxJbnRlcnZhbCkgKiA2MDAwMFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGNsZWFyQXV0b0JhY2t1cCgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMudGltZW91dElEQmFja3VwKSB7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dElEQmFja3VwKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjbGVhckF1dG9QdWxsKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy50aW1lb3V0SURQdWxsKSB7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dElEUHVsbCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgYXN5bmMgaGFuZGxlQ29uZmxpY3QoY29uZmxpY3RlZDogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShQbHVnaW5TdGF0ZS5jb25mbGljdGVkKTtcbiAgICAgICAgY29uc3QgbGluZXMgPSBbXG4gICAgICAgICAgICBcIiMgQ29uZmxpY3QgZmlsZXNcIixcbiAgICAgICAgICAgIFwiUGxlYXNlIHJlc29sdmUgdGhlbSBhbmQgY29tbWl0IHBlciBjb21tYW5kIChUaGlzIGZpbGUgd2lsbCBiZSBkZWxldGVkIGJlZm9yZSB0aGUgY29tbWl0KS5cIixcbiAgICAgICAgICAgIC4uLmNvbmZsaWN0ZWQubWFwKGUgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGUgPSB0aGlzLmFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgoZSk7XG4gICAgICAgICAgICAgICAgaWYgKGZpbGUgaW5zdGFuY2VvZiBURmlsZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsaW5rID0gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5maWxlVG9MaW5rdGV4dChmaWxlLCBcIi9cIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgLSBbWyR7bGlua31dXWA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAtIE5vdCBhIGZpbGU6ICR7ZX1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIF07XG4gICAgICAgIHRoaXMud3JpdGVBbmRPcGVuRmlsZShsaW5lcy5qb2luKFwiXFxuXCIpKTtcbiAgICB9XG5cbiAgICBhc3luYyB3cml0ZUFuZE9wZW5GaWxlKHRleHQ6IHN0cmluZykge1xuICAgICAgICBhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLndyaXRlKHRoaXMuY29uZmxpY3RPdXRwdXRGaWxlLCB0ZXh0KTtcblxuICAgICAgICBsZXQgZmlsZUlzQWxyZWFkeU9wZW5lZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFwcC53b3Jrc3BhY2UuaXRlcmF0ZUFsbExlYXZlcyhsZWFmID0+IHtcbiAgICAgICAgICAgIGlmIChsZWFmLmdldERpc3BsYXlUZXh0KCkgIT0gXCJcIiAmJiB0aGlzLmNvbmZsaWN0T3V0cHV0RmlsZS5zdGFydHNXaXRoKGxlYWYuZ2V0RGlzcGxheVRleHQoKSkpIHtcbiAgICAgICAgICAgICAgICBmaWxlSXNBbHJlYWR5T3BlbmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghZmlsZUlzQWxyZWFkeU9wZW5lZCkge1xuICAgICAgICAgICAgdGhpcy5hcHAud29ya3NwYWNlLm9wZW5MaW5rVGV4dCh0aGlzLmNvbmZsaWN0T3V0cHV0RmlsZSwgXCIvXCIsIHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gcmVnaW9uOiBkaXNwbGF5aW5nIC8gZm9ybWF0dGluZyBtZXNzYWdlc1xuICAgIGRpc3BsYXlNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZywgdGltZW91dDogbnVtYmVyID0gNCAqIDEwMDApOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdGF0dXNCYXI/LmRpc3BsYXlNZXNzYWdlKG1lc3NhZ2UudG9Mb3dlckNhc2UoKSwgdGltZW91dCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnNldHRpbmdzLmRpc2FibGVQb3B1cHMpIHtcbiAgICAgICAgICAgIG5ldyBOb3RpY2UobWVzc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZyhgZ2l0IG9ic2lkaWFuIG1lc3NhZ2U6ICR7bWVzc2FnZX1gKTtcbiAgICB9XG4gICAgZGlzcGxheUVycm9yKG1lc3NhZ2U6IHN0cmluZywgdGltZW91dDogbnVtYmVyID0gMCk6IHZvaWQge1xuICAgICAgICBuZXcgTm90aWNlKG1lc3NhZ2UpO1xuICAgICAgICBjb25zb2xlLmxvZyhgZ2l0IG9ic2lkaWFuIGVycm9yOiAke21lc3NhZ2V9YCk7XG4gICAgICAgIHRoaXMuc3RhdHVzQmFyPy5kaXNwbGF5TWVzc2FnZShtZXNzYWdlLnRvTG93ZXJDYXNlKCksIHRpbWVvdXQpO1xuICAgIH1cblxuICAgIGFzeW5jIGZvcm1hdENvbW1pdE1lc3NhZ2UodGVtcGxhdGU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGlmICh0ZW1wbGF0ZS5pbmNsdWRlcyhcInt7bnVtRmlsZXN9fVwiKSkge1xuICAgICAgICAgICAgbGV0IHN0YXR1cyA9IGF3YWl0IHRoaXMuZ2l0LnN0YXR1cygpO1xuICAgICAgICAgICAgbGV0IG51bUZpbGVzID0gc3RhdHVzLmZpbGVzLmxlbmd0aDtcbiAgICAgICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUucmVwbGFjZShcInt7bnVtRmlsZXN9fVwiLCBTdHJpbmcobnVtRmlsZXMpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0ZW1wbGF0ZS5pbmNsdWRlcyhcInt7ZmlsZXN9fVwiKSkge1xuICAgICAgICAgICAgbGV0IHN0YXR1cyA9IGF3YWl0IHRoaXMuZ2l0LnN0YXR1cygpO1xuXG4gICAgICAgICAgICBsZXQgY2hhbmdlc2V0OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdOyB9ID0ge307XG4gICAgICAgICAgICBzdGF0dXMuZmlsZXMuZm9yRWFjaCgodmFsdWU6IEZpbGVTdGF0dXNSZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUuaW5kZXggaW4gY2hhbmdlc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZXNldFt2YWx1ZS5pbmRleF0ucHVzaCh2YWx1ZS5wYXRoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzZXRbdmFsdWUuaW5kZXhdID0gW3ZhbHVlLnBhdGhdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBsZXQgY2h1bmtzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBbYWN0aW9uLCBmaWxlc10gb2YgT2JqZWN0LmVudHJpZXMoY2hhbmdlc2V0KSkge1xuICAgICAgICAgICAgICAgIGNodW5rcy5wdXNoKGFjdGlvbiArIFwiIFwiICsgZmlsZXMuam9pbihcIiBcIikpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgZmlsZXMgPSBjaHVua3Muam9pbihcIiwgXCIpO1xuXG4gICAgICAgICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLnJlcGxhY2UoXCJ7e2ZpbGVzfX1cIiwgZmlsZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG1vbWVudCA9ICh3aW5kb3cgYXMgYW55KS5tb21lbnQ7XG4gICAgICAgIHJldHVybiB0ZW1wbGF0ZS5yZXBsYWNlKFxuICAgICAgICAgICAgXCJ7e2RhdGV9fVwiLFxuICAgICAgICAgICAgbW9tZW50KCkuZm9ybWF0KHRoaXMuc2V0dGluZ3MuY29tbWl0RGF0ZUZvcm1hdClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBlbmRyZWdpb246IGRpc3BsYXlpbmcgLyBmb3JtYXR0aW5nIHN0dWZmXG59XG5cblxuY2xhc3MgT2JzaWRpYW5HaXRTZXR0aW5nc1RhYiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xuICAgIGRpc3BsYXkoKTogdm9pZCB7XG4gICAgICAgIGxldCB7IGNvbnRhaW5lckVsIH0gPSB0aGlzO1xuICAgICAgICBjb25zdCBwbHVnaW46IE9ic2lkaWFuR2l0ID0gKHRoaXMgYXMgYW55KS5wbHVnaW47XG5cbiAgICAgICAgY29udGFpbmVyRWwuZW1wdHkoKTtcbiAgICAgICAgY29udGFpbmVyRWwuY3JlYXRlRWwoXCJoMlwiLCB7IHRleHQ6IFwiR2l0IEJhY2t1cCBzZXR0aW5nc1wiIH0pO1xuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoXCJWYXVsdCBiYWNrdXAgaW50ZXJ2YWwgKG1pbnV0ZXMpXCIpXG4gICAgICAgICAgICAuc2V0RGVzYyhcbiAgICAgICAgICAgICAgICBcIkNvbW1pdCBhbmQgcHVzaCBjaGFuZ2VzIGV2ZXJ5IFggbWludXRlcy4gVG8gZGlzYWJsZSBhdXRvbWF0aWMgYmFja3VwLCBzcGVjaWZ5IG5lZ2F0aXZlIHZhbHVlIG9yIHplcm8gKGRlZmF1bHQpXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5hZGRUZXh0KCh0ZXh0KSA9PlxuICAgICAgICAgICAgICAgIHRleHRcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKFN0cmluZyhwbHVnaW4uc2V0dGluZ3MuYXV0b1NhdmVJbnRlcnZhbCkpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4oTnVtYmVyKHZhbHVlKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2V0dGluZ3MuYXV0b1NhdmVJbnRlcnZhbCA9IE51bWJlcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBsdWdpbi5zZXR0aW5ncy5hdXRvU2F2ZUludGVydmFsID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uY2xlYXJBdXRvQmFja3VwKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zdGFydEF1dG9CYWNrdXAocGx1Z2luLnNldHRpbmdzLmF1dG9TYXZlSW50ZXJ2YWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm90aWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYEF1dG9tYXRpYyBiYWNrdXAgZW5hYmxlZCEgRXZlcnkgJHtwbHVnaW4uc2V0dGluZ3MuYXV0b1NhdmVJbnRlcnZhbH0gbWludXRlcy5gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNldHRpbmdzLmF1dG9TYXZlSW50ZXJ2YWwgPD0gMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4udGltZW91dElEQmFja3VwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5jbGVhckF1dG9CYWNrdXAoKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vdGljZShcIkF1dG9tYXRpYyBiYWNrdXAgZGlzYWJsZWQhXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vdGljZShcIlBsZWFzZSBzcGVjaWZ5IGEgdmFsaWQgbnVtYmVyLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoXCJBdXRvIHB1bGwgaW50ZXJ2YWwgKG1pbnV0ZXMpXCIpXG4gICAgICAgICAgICAuc2V0RGVzYyhcbiAgICAgICAgICAgICAgICBcIlB1bGwgY2hhbmdlcyBldmVyeSBYIG1pbnV0ZXMuIFRvIGRpc2FibGUgYXV0b21hdGljIHB1bGwsIHNwZWNpZnkgbmVnYXRpdmUgdmFsdWUgb3IgemVybyAoZGVmYXVsdClcIlxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmFkZFRleHQoKHRleHQpID0+XG4gICAgICAgICAgICAgICAgdGV4dFxuICAgICAgICAgICAgICAgICAgICAuc2V0VmFsdWUoU3RyaW5nKHBsdWdpbi5zZXR0aW5ncy5hdXRvUHVsbEludGVydmFsKSlcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihOdW1iZXIodmFsdWUpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zZXR0aW5ncy5hdXRvUHVsbEludGVydmFsID0gTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGx1Z2luLnNldHRpbmdzLmF1dG9QdWxsSW50ZXJ2YWwgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5jbGVhckF1dG9QdWxsKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zdGFydEF1dG9QdWxsKHBsdWdpbi5zZXR0aW5ncy5hdXRvUHVsbEludGVydmFsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vdGljZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBBdXRvbWF0aWMgcHVsbCBlbmFibGVkISBFdmVyeSAke3BsdWdpbi5zZXR0aW5ncy5hdXRvUHVsbEludGVydmFsfSBtaW51dGVzLmBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2V0dGluZ3MuYXV0b1B1bGxJbnRlcnZhbCA8PSAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi50aW1lb3V0SURQdWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5jbGVhckF1dG9QdWxsKCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb3RpY2UoXCJBdXRvbWF0aWMgcHVsbCBkaXNhYmxlZCFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm90aWNlKFwiUGxlYXNlIHNwZWNpZnkgYSB2YWxpZCBudW1iZXIuXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKFwiQ29tbWl0IG1lc3NhZ2VcIilcbiAgICAgICAgICAgIC5zZXREZXNjKFxuICAgICAgICAgICAgICAgIFwiU3BlY2lmeSBjdXN0b20gY29tbWl0IG1lc3NhZ2UuIEF2YWlsYWJsZSBwbGFjZWhvbGRlcnM6IHt7ZGF0ZX19XCIgK1xuICAgICAgICAgICAgICAgIFwiIChzZWUgYmVsb3cpIGFuZCB7e251bUZpbGVzfX0gKG51bWJlciBvZiBjaGFuZ2VkIGZpbGVzIGluIHRoZSBjb21taXQpXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5hZGRUZXh0KCh0ZXh0KSA9PlxuICAgICAgICAgICAgICAgIHRleHRcbiAgICAgICAgICAgICAgICAgICAgLnNldFBsYWNlaG9sZGVyKFwidmF1bHQgYmFja3VwXCIpXG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zZXR0aW5ncy5jb21taXRNZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBwbHVnaW4uc2V0dGluZ3MuY29tbWl0TWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJcIlxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zZXR0aW5ncy5jb21taXRNZXNzYWdlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoXCJ7e2RhdGV9fSBwbGFjZWhvbGRlciBmb3JtYXRcIilcbiAgICAgICAgICAgIC5zZXREZXNjKCdTcGVjaWZ5IGN1c3RvbSBkYXRlIGZvcm1hdC4gRS5nLiBcIllZWVktTU0tREQgSEg6bW06c3NcIicpXG4gICAgICAgICAgICAuYWRkVGV4dCgodGV4dCkgPT5cbiAgICAgICAgICAgICAgICB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIC5zZXRQbGFjZWhvbGRlcihwbHVnaW4uc2V0dGluZ3MuY29tbWl0RGF0ZUZvcm1hdClcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHBsdWdpbi5zZXR0aW5ncy5jb21taXREYXRlRm9ybWF0KVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2V0dGluZ3MuY29tbWl0RGF0ZUZvcm1hdCA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKFwiUHJldmlldyBjb21taXQgbWVzc2FnZVwiKVxuICAgICAgICAgICAgLmFkZEJ1dHRvbigoYnV0dG9uKSA9PlxuICAgICAgICAgICAgICAgIGJ1dHRvbi5zZXRCdXR0b25UZXh0KFwiUHJldmlld1wiKS5vbkNsaWNrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbW1pdE1lc3NhZ2VQcmV2aWV3ID0gYXdhaXQgcGx1Z2luLmZvcm1hdENvbW1pdE1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2V0dGluZ3MuY29tbWl0TWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBuZXcgTm90aWNlKGAke2NvbW1pdE1lc3NhZ2VQcmV2aWV3fWApO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoXCJMaXN0IGZpbGVuYW1lcyBhZmZlY3RlZCBieSBjb21taXQgaW4gdGhlIGNvbW1pdCBib2R5XCIpXG4gICAgICAgICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XG4gICAgICAgICAgICAgICAgdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZShwbHVnaW4uc2V0dGluZ3MubGlzdENoYW5nZWRGaWxlc0luTWVzc2FnZUJvZHkpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zZXR0aW5ncy5saXN0Q2hhbmdlZEZpbGVzSW5NZXNzYWdlQm9keSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKFwiQ3VycmVudCBicmFuY2hcIilcbiAgICAgICAgICAgIC5zZXREZXNjKFwiU3dpdGNoIHRvIGEgZGlmZmVyZW50IGJyYW5jaFwiKVxuICAgICAgICAgICAgLmFkZERyb3Bkb3duKGFzeW5jIChkcm9wZG93bikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJyYW5jaEluZm8gPSBhd2FpdCBwbHVnaW4uZ2l0LmJyYW5jaExvY2FsKCk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBicmFuY2ggb2YgYnJhbmNoSW5mby5hbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgZHJvcGRvd24uYWRkT3B0aW9uKGJyYW5jaCwgYnJhbmNoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZHJvcGRvd24uc2V0VmFsdWUoYnJhbmNoSW5mby5jdXJyZW50KTtcbiAgICAgICAgICAgICAgICBkcm9wZG93bi5vbkNoYW5nZShhc3luYyAob3B0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHBsdWdpbi5naXQuY2hlY2tvdXQoXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jIChlcnI6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm90aWNlKGVyci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvcGRvd24uc2V0VmFsdWUoYnJhbmNoSW5mby5jdXJyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm90aWNlKGBDaGVja2VkIG91dCB0byAke29wdGlvbn1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKFwiUHVsbCB1cGRhdGVzIG9uIHN0YXJ0dXBcIilcbiAgICAgICAgICAgIC5zZXREZXNjKFwiQXV0b21hdGljYWxseSBwdWxsIHVwZGF0ZXMgd2hlbiBPYnNpZGlhbiBzdGFydHNcIilcbiAgICAgICAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cbiAgICAgICAgICAgICAgICB0b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHBsdWdpbi5zZXR0aW5ncy5hdXRvUHVsbE9uQm9vdClcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNldHRpbmdzLmF1dG9QdWxsT25Cb290ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoXCJEaXNhYmxlIHB1c2hcIilcbiAgICAgICAgICAgIC5zZXREZXNjKFwiRG8gbm90IHB1c2ggY2hhbmdlcyB0byB0aGUgcmVtb3RlIHJlcG9zaXRvcnlcIilcbiAgICAgICAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cbiAgICAgICAgICAgICAgICB0b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHBsdWdpbi5zZXR0aW5ncy5kaXNhYmxlUHVzaClcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNldHRpbmdzLmRpc2FibGVQdXNoID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoXCJQdWxsIGNoYW5nZXMgYmVmb3JlIHB1c2hcIilcbiAgICAgICAgICAgIC5zZXREZXNjKFwiQ29tbWl0IC0+IHB1bGwgLT4gcHVzaCAoT25seSBpZiBwdXNoaW5nIGlzIGVuYWJsZWQpXCIpXG4gICAgICAgICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XG4gICAgICAgICAgICAgICAgdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZShwbHVnaW4uc2V0dGluZ3MucHVsbEJlZm9yZVB1c2gpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zZXR0aW5ncy5wdWxsQmVmb3JlUHVzaCA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKFwiRGlzYWJsZSBub3RpZmljYXRpb25zXCIpXG4gICAgICAgICAgICAuc2V0RGVzYyhcbiAgICAgICAgICAgICAgICBcIkRpc2FibGUgbm90aWZpY2F0aW9ucyBmb3IgZ2l0IG9wZXJhdGlvbnMgdG8gbWluaW1pemUgZGlzdHJhY3Rpb24gKHJlZmVyIHRvIHN0YXR1cyBiYXIgZm9yIHVwZGF0ZXMpXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cbiAgICAgICAgICAgICAgICB0b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHBsdWdpbi5zZXR0aW5ncy5kaXNhYmxlUG9wdXBzKVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2V0dGluZ3MuZGlzYWJsZVBvcHVwcyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKFwiU2hvdyBzdGF0dXMgYmFyXCIpXG4gICAgICAgICAgICAuc2V0RGVzYyhcIk9ic2lkaWFuIG11c3QgYmUgcmVzdGFydGVkIGZvciB0aGUgY2hhbmdlcyB0byB0YWtlIGFmZmVjdFwiKVxuICAgICAgICAgICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxuICAgICAgICAgICAgICAgIHRvZ2dsZVxuICAgICAgICAgICAgICAgICAgICAuc2V0VmFsdWUocGx1Z2luLnNldHRpbmdzLnNob3dTdGF0dXNCYXIpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zZXR0aW5ncy5zaG93U3RhdHVzQmFyID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgIH1cbn1cblxuaW50ZXJmYWNlIFN0YXR1c0Jhck1lc3NhZ2Uge1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICB0aW1lb3V0OiBudW1iZXI7XG59XG5cbmNsYXNzIFN0YXR1c0JhciB7XG4gICAgcHVibGljIG1lc3NhZ2VzOiBTdGF0dXNCYXJNZXNzYWdlW10gPSBbXTtcbiAgICBwdWJsaWMgY3VycmVudE1lc3NhZ2U6IFN0YXR1c0Jhck1lc3NhZ2U7XG4gICAgcHVibGljIGxhc3RNZXNzYWdlVGltZXN0YW1wOiBudW1iZXI7XG5cbiAgICBwcml2YXRlIHN0YXR1c0JhckVsOiBIVE1MRWxlbWVudDtcbiAgICBwcml2YXRlIHBsdWdpbjogT2JzaWRpYW5HaXQ7XG5cbiAgICBjb25zdHJ1Y3RvcihzdGF0dXNCYXJFbDogSFRNTEVsZW1lbnQsIHBsdWdpbjogT2JzaWRpYW5HaXQpIHtcbiAgICAgICAgdGhpcy5zdGF0dXNCYXJFbCA9IHN0YXR1c0JhckVsO1xuICAgICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGlzcGxheU1lc3NhZ2UobWVzc2FnZTogc3RyaW5nLCB0aW1lb3V0OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5tZXNzYWdlcy5wdXNoKHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBnaXQ6ICR7bWVzc2FnZS5zbGljZSgwLCAxMDApfWAsXG4gICAgICAgICAgICB0aW1lb3V0OiB0aW1lb3V0LFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kaXNwbGF5KCk7XG4gICAgfVxuXG4gICAgcHVibGljIGRpc3BsYXkoKSB7XG4gICAgICAgIGlmICh0aGlzLm1lc3NhZ2VzLmxlbmd0aCA+IDAgJiYgIXRoaXMuY3VycmVudE1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudE1lc3NhZ2UgPSB0aGlzLm1lc3NhZ2VzLnNoaWZ0KCk7XG4gICAgICAgICAgICB0aGlzLnN0YXR1c0JhckVsLnNldFRleHQodGhpcy5jdXJyZW50TWVzc2FnZS5tZXNzYWdlKTtcbiAgICAgICAgICAgIHRoaXMubGFzdE1lc3NhZ2VUaW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudE1lc3NhZ2UpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VBZ2UgPSBEYXRlLm5vdygpIC0gdGhpcy5sYXN0TWVzc2FnZVRpbWVzdGFtcDtcbiAgICAgICAgICAgIGlmIChtZXNzYWdlQWdlID49IHRoaXMuY3VycmVudE1lc3NhZ2UudGltZW91dCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE1lc3NhZ2UgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdE1lc3NhZ2VUaW1lc3RhbXAgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5U3RhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZGlzcGxheVN0YXRlKCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMucGx1Z2luLnN0YXRlKSB7XG4gICAgICAgICAgICBjYXNlIFBsdWdpblN0YXRlLmlkbGU6XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5RnJvbU5vdyh0aGlzLnBsdWdpbi5sYXN0VXBkYXRlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUGx1Z2luU3RhdGUuc3RhdHVzOlxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzQmFyRWwuc2V0VGV4dChcImdpdDogY2hlY2tpbmcgcmVwbyBzdGF0dXMuLlwiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUGx1Z2luU3RhdGUuYWRkOlxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzQmFyRWwuc2V0VGV4dChcImdpdDogYWRkaW5nIGZpbGVzIHRvIHJlcG8uLlwiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUGx1Z2luU3RhdGUuY29tbWl0OlxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzQmFyRWwuc2V0VGV4dChcImdpdDogY29tbWl0dGluZyBjaGFuZ2VzLi5cIik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBsdWdpblN0YXRlLnB1c2g6XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0dXNCYXJFbC5zZXRUZXh0KFwiZ2l0OiBwdXNoaW5nIGNoYW5nZXMuLlwiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUGx1Z2luU3RhdGUucHVsbDpcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c0JhckVsLnNldFRleHQoXCJnaXQ6IHB1bGxpbmcgY2hhbmdlcy4uXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQbHVnaW5TdGF0ZS5jb25mbGljdGVkOlxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzQmFyRWwuc2V0VGV4dChcImdpdDogeW91IGhhdmUgY29uZmxpY3QgZmlsZXMuLlwiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0dXNCYXJFbC5zZXRUZXh0KFwiZ2l0OiBmYWlsZWQgb24gaW5pdGlhbGl6YXRpb24hXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkaXNwbGF5RnJvbU5vdyh0aW1lc3RhbXA6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodGltZXN0YW1wKSB7XG4gICAgICAgICAgICBsZXQgbW9tZW50ID0gKHdpbmRvdyBhcyBhbnkpLm1vbWVudDtcbiAgICAgICAgICAgIGxldCBmcm9tTm93ID0gbW9tZW50KHRpbWVzdGFtcCkuZnJvbU5vdygpO1xuICAgICAgICAgICAgdGhpcy5zdGF0dXNCYXJFbC5zZXRUZXh0KGBnaXQ6IGxhc3QgdXBkYXRlICR7ZnJvbU5vd30uLmApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdGF0dXNCYXJFbC5zZXRUZXh0KGBnaXQ6IHJlYWR5YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBDdXN0b21NZXNzYWdlTW9kYWwgZXh0ZW5kcyBTdWdnZXN0TW9kYWw8c3RyaW5nPiB7XG4gICAgcGx1Z2luOiBPYnNpZGlhbkdpdDtcblxuICAgIGNvbnN0cnVjdG9yKHBsdWdpbjogT2JzaWRpYW5HaXQpIHtcbiAgICAgICAgc3VwZXIocGx1Z2luLmFwcCk7XG4gICAgICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xuICAgICAgICB0aGlzLnNldFBsYWNlaG9sZGVyKFwiVHlwZSB5b3VyIG1lc3NhZ2UgYW5kIHNlbGVjdCBvcHRpb25hbCB0aGUgdmVyc2lvbiB3aXRoIHRoZSBhZGRlZCBkYXRlLlwiKTtcbiAgICB9XG5cblxuICAgIGdldFN1Z2dlc3Rpb25zKHF1ZXJ5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgICAgIGNvbnN0IGRhdGUgPSAod2luZG93IGFzIGFueSkubW9tZW50KCkuZm9ybWF0KHRoaXMucGx1Z2luLnNldHRpbmdzLmNvbW1pdERhdGVGb3JtYXQpO1xuICAgICAgICBpZiAocXVlcnkgPT0gXCJcIikgcXVlcnkgPSBcIi4uLlwiO1xuICAgICAgICByZXR1cm4gW3F1ZXJ5LCBgJHtkYXRlfTogJHtxdWVyeX1gLCBgJHtxdWVyeX06ICR7ZGF0ZX1gXTtcbiAgICB9XG5cbiAgICByZW5kZXJTdWdnZXN0aW9uKHZhbHVlOiBzdHJpbmcsIGVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgICBlbC5pbm5lclRleHQgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBvbkNob29zZVN1Z2dlc3Rpb24oaXRlbTogc3RyaW5nLCBfOiBNb3VzZUV2ZW50IHwgS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBsdWdpbi5wcm9taXNlUXVldWUuYWRkVGFzaygoKSA9PiB0aGlzLnBsdWdpbi5jcmVhdGVCYWNrdXAoZmFsc2UsIGl0ZW0pKTtcbiAgICB9XG5cbn1cbmNsYXNzIENoYW5nZWRGaWxlc01vZGFsIGV4dGVuZHMgRnV6enlTdWdnZXN0TW9kYWw8RmlsZVN0YXR1c1Jlc3VsdD4ge1xuICAgIHBsdWdpbjogT2JzaWRpYW5HaXQ7XG4gICAgY2hhbmdlZEZpbGVzOiBGaWxlU3RhdHVzUmVzdWx0W107XG5cbiAgICBjb25zdHJ1Y3RvcihwbHVnaW46IE9ic2lkaWFuR2l0LCBjaGFuZ2VkRmlsZXM6IEZpbGVTdGF0dXNSZXN1bHRbXSkge1xuICAgICAgICBzdXBlcihwbHVnaW4uYXBwKTtcbiAgICAgICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XG4gICAgICAgIHRoaXMuY2hhbmdlZEZpbGVzID0gY2hhbmdlZEZpbGVzO1xuICAgICAgICB0aGlzLnNldFBsYWNlaG9sZGVyKFwiTm90IHN1cHBvcnRlZCBmaWxlcyB3aWxsIGJlIG9wZW5lZCBieSBkZWZhdWx0IGFwcCFcIik7XG4gICAgfVxuXG4gICAgZ2V0SXRlbXMoKTogRmlsZVN0YXR1c1Jlc3VsdFtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hhbmdlZEZpbGVzO1xuICAgIH1cblxuICAgIGdldEl0ZW1UZXh0KGl0ZW06IEZpbGVTdGF0dXNSZXN1bHQpOiBzdHJpbmcge1xuICAgICAgICBpZiAoaXRlbS5pbmRleCA9PSBcIj9cIiAmJiBpdGVtLndvcmtpbmdfZGlyID09IFwiP1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gYFVudHJhY2tlZCB8ICR7aXRlbS5wYXRofWA7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgd29ya2luZ19kaXIgPSBcIlwiO1xuICAgICAgICBsZXQgaW5kZXggPSBcIlwiO1xuXG4gICAgICAgIGlmIChpdGVtLndvcmtpbmdfZGlyICE9IFwiIFwiKSB3b3JraW5nX2RpciA9IGBXb3JraW5nIGRpcjogJHtpdGVtLndvcmtpbmdfZGlyfSBgO1xuICAgICAgICBpZiAoaXRlbS5pbmRleCAhPSBcIiBcIikgaW5kZXggPSBgSW5kZXg6ICR7aXRlbS5pbmRleH1gO1xuXG4gICAgICAgIHJldHVybiBgJHt3b3JraW5nX2Rpcn0ke2luZGV4fSB8ICR7aXRlbS5wYXRofWA7XG4gICAgfVxuXG4gICAgb25DaG9vc2VJdGVtKGl0ZW06IEZpbGVTdGF0dXNSZXN1bHQsIF86IE1vdXNlRXZlbnQgfCBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnBsdWdpbi5hcHAubWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChpdGVtLnBhdGgsIFwiXCIpID09IG51bGwpIHtcbiAgICAgICAgICAgICh0aGlzLmFwcCBhcyBhbnkpLm9wZW5XaXRoRGVmYXVsdEFwcChpdGVtLnBhdGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4uYXBwLndvcmtzcGFjZS5vcGVuTGlua1RleHQoaXRlbS5wYXRoLCBcIi9cIik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIFByb21pc2VRdWV1ZSB7XG4gICAgdGFza3M6ICgoKSA9PiBQcm9taXNlPGFueT4pW10gPSBbXTtcblxuICAgIGFkZFRhc2sodGFzazogKCkgPT4gUHJvbWlzZTxhbnk+KSB7XG4gICAgICAgIHRoaXMudGFza3MucHVzaCh0YXNrKTtcbiAgICAgICAgaWYgKHRoaXMudGFza3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVRhc2soKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBoYW5kbGVUYXNrKCkge1xuICAgICAgICBpZiAodGhpcy50YXNrcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnRhc2tzWzBdKCkuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy50YXNrcy5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlVGFzaygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59Il0sIm5hbWVzIjpbImdpdF9lcnJvcl8xIiwicmVxdWlyZSQkMCIsIm9zIiwidHR5IiwidXRpbCIsInJlcXVpcmUkJDEiLCJ0aGlzIiwiZnNfMSIsImZpbGVfZXhpc3RzXzEiLCJ1dGlsXzEiLCJhcmd1bWVudF9maWx0ZXJzXzEiLCJyZXF1aXJlJCQyIiwicmVxdWlyZSQkMyIsInJlcXVpcmUkJDQiLCJyZXF1aXJlJCQ1IiwicmVxdWlyZSQkNiIsInJlcXVpcmUkJDciLCJ1dGlsc18xIiwidGFza19jb25maWd1cmF0aW9uX2Vycm9yXzEiLCJ0YXNrXzEiLCJDbGVhblN1bW1hcnlfMSIsImNoZWNrX2lzX3JlcG9fMSIsImNsZWFuXzEiLCJnaXRfY29uc3RydWN0X2Vycm9yXzEiLCJnaXRfcGx1Z2luX2Vycm9yXzEiLCJnaXRfcmVzcG9uc2VfZXJyb3JfMSIsInJlc2V0XzEiLCJkZWJ1Z18xIiwiZ2l0X2xvZ2dlcl8xIiwidGFza3NfcGVuZGluZ19xdWV1ZV8xIiwidGFzayIsImdpdEVycm9yIiwiY2hpbGRfcHJvY2Vzc18xIiwiZ2l0X2V4ZWN1dG9yX2NoYWluXzEiLCJwYXJzZV9yZW1vdGVfb2JqZWN0c18xIiwicGFyc2VfcmVtb3RlX21lc3NhZ2VzXzEiLCJwYXJzZV9wdXNoXzEiLCJ0YXNrX2NhbGxiYWNrXzEiLCJwdXNoXzEiLCJwcm9taXNlX2RlZmVycmVkXzEiLCJCcmFuY2hEZWxldGVTdW1tYXJ5XzEiLCJCcmFuY2hTdW1tYXJ5XzEiLCJwYXJzZV9icmFuY2hfZGVsZXRlXzEiLCJwYXJzZV9icmFuY2hfMSIsIkNoZWNrSWdub3JlXzEiLCJwYXJzZV9jb21taXRfMSIsInBhcnNlX2RpZmZfc3VtbWFyeV8xIiwicGFyc2VfZmV0Y2hfMSIsInBhcnNlX2xpc3RfbG9nX3N1bW1hcnlfMSIsIk1lcmdlU3VtbWFyeV8xIiwicGFyc2VfcHVsbF8xIiwicGFyc2VfbWVyZ2VfMSIsInBhcnNlX21vdmVfMSIsIkdldFJlbW90ZVN1bW1hcnlfMSIsImxvZ18xIiwicmVxdWlyZSQkOCIsInJlcXVpcmUkJDkiLCJyZXF1aXJlJCQxMCIsInJlcXVpcmUkJDExIiwicmVxdWlyZSQkMTIiLCJyZXF1aXJlJCQxMyIsInJlcXVpcmUkJDE0IiwicmVxdWlyZSQkMTUiLCJyZXF1aXJlJCQxNiIsInJlcXVpcmUkJDE3IiwicmVxdWlyZSQkMTgiLCJyZXF1aXJlJCQxOSIsInJlcXVpcmUkJDIwIiwicmVxdWlyZSQkMjEiLCJyZXF1aXJlJCQyMiIsInJlcXVpcmUkJDIzIiwicmVxdWlyZSQkMjQiLCJyZXF1aXJlJCQyNSIsInJlcXVpcmUkJDI2IiwicmVxdWlyZSQkMjciLCJyZXF1aXJlJCQyOCIsInBsdWdpbnMiLCJwbHVnaW5zXzEiLCJHaXQiLCJnaXRfZmFjdG9yeV8xIiwic2ltcGxlR2l0Iiwic3Bhd25TeW5jIiwiVEZpbGUiLCJOb3RpY2UiLCJQbHVnaW4iLCJTZXR0aW5nIiwiUGx1Z2luU2V0dGluZ1RhYiIsIlN1Z2dlc3RNb2RhbCIsIkZ1enp5U3VnZ2VzdE1vZGFsIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxhQUFhLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ25DLElBQUksYUFBYSxHQUFHLE1BQU0sQ0FBQyxjQUFjO0FBQ3pDLFNBQVMsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLFlBQVksS0FBSyxJQUFJLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNwRixRQUFRLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxF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QUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtBQUN0RyxRQUFRLFNBQVMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRTtBQUN0SCxRQUFRLElBQUksQ0FBQyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxVQUFVLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUM5RSxLQUFLLENBQUMsQ0FBQztBQUNQLENBQUM7QUFDRDtBQUNPLFNBQVMsV0FBVyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUU7QUFDM0MsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3JILElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLE9BQU8sTUFBTSxLQUFLLFVBQVUsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLFdBQVcsRUFBRSxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDN0osSUFBSSxTQUFTLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLFVBQVUsQ0FBQyxFQUFFLEVBQUUsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUN0RSxJQUFJLFNBQVMsSUFBSSxDQUFDLEVBQUUsRUFBRTtBQUN0QixRQUFRLElBQUksQ0FBQyxFQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsaUNBQWlDLENBQUMsQ0FBQztBQUN0RSxRQUFRLE9BQU8sQ0FBQyxFQUFFLElBQUk7QUFDdEIsWUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN6SyxZQUFZLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDcEQsWUFBWSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDekIsZ0JBQWdCLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLE1BQU07QUFDOUMsZ0JBQWdCLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUN4RSxnQkFBZ0IsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztBQUNqRSxnQkFBZ0IsS0FBSyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsU0FBUztBQUNqRSxnQkFBZ0I7QUFDaEIsb0JBQW9CLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUU7QUFDaEksb0JBQW9CLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVB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RUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNwQyxHQUFHO0FBQ0gsRUFBRSxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUU7QUFDbEIsSUFBSSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNwQyxHQUFHO0FBQ0gsRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDbkIsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsT0FBTyxDQUFDLEVBQUUsRUFBRTtBQUNyQixFQUFFLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDM0IsRUFBRSxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUU7QUFDbEIsSUFBSSxPQUFPLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN2QyxHQUFHO0FBQ0gsRUFBRSxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUU7QUFDbEIsSUFBSSxPQUFPLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN4QyxHQUFHO0FBQ0gsRUFBRSxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUU7QUFDbEIsSUFBSSxPQUFPLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUMxQyxHQUFHO0FBQ0gsRUFBRSxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUU7QUFDbEIsSUFBSSxPQUFPLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUMxQyxHQUFHO0FBQ0gsRUFBRSxPQUFPLEVBQUUsR0FBRyxLQUFLLENBQUM7QUFDcEIsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLE1BQU0s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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLEdBQUc7QUFDakIsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDcEM7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLENBQUMsTUFBTSxhQUFhLEdBQUdILGVBQXlCLENBQUM7QUFDakQ7QUFDQSxDQUFDLElBQUksYUFBYSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sSUFBSSxhQUFhLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRTtBQUMxRSxFQUFFLGNBQWMsR0FBRztBQUNuQixHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEdBQUc7QUFDTixHQUFHLEdBQUc7QUFDTixHQUFHLEdBQUc7QUFDTixHQUFHLEdBQUc7QUFDTixHQUFHLEdBQUc7QUFDTixHQUFHLEdBQUc7QUFDTixHQUFHLEdBQUc7QUFDTixHQUFHLEdBQUc7QUFDTixHQUFHLEdBQUc7QUFDTixHQUFH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SSxNQUFNLENBQUMsbUJBQW1CLENBQUMsS0FBSyxFQUFFLG1CQUFtQixDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxJQUFJLEtBQUtBLEtBQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSUEsS0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzlKLElBQUksTUFBTSxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxLQUFLQSxLQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUlBLEtBQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSUEsS0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzNNLElBQUksTUFBTSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxLQUFLQSxLQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUlBLEtBQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNoSyxJQUFJLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsbUJBQW1CLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFLElBQUksS0FBS0EsS0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJQSxLQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDbEssSUFBSSxNQUFNLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLG1C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 diff --git a/.obsidian/plugins/obsidian-git/manifest.json b/.obsidian/plugins/obsidian-git/manifest.json deleted file mode 100644 index 7ce8ace69..000000000 --- a/.obsidian/plugins/obsidian-git/manifest.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "id": "obsidian-git", - "name": "Obsidian Git", - "description": "Backup your vault with git.", - "isDesktopOnly": true, - "js": "main.js", - "version": "1.9.2" -} diff --git a/.obsidian/plugins/obsidian-journey-plugin/data.json b/.obsidian/plugins/obsidian-journey-plugin/data.json deleted file mode 100644 index c47fb5bdf..000000000 --- a/.obsidian/plugins/obsidian-journey-plugin/data.json +++ /dev/null @@ -1 +0,0 @@ -{"useForwardLinks":true,"useBackLinks":true,"useTags":true,"skipMOCs":false,"MOCMaxLinks":30,"enableHighContrast":false,"skipFolders":"","enableLinks":false,"enableTransclusion":false} \ No newline at end of file diff --git a/.obsidian/plugins/obsidian-journey-plugin/main.js b/.obsidian/plugins/obsidian-journey-plugin/main.js deleted file mode 100644 index 7827e69d1..000000000 --- a/.obsidian/plugins/obsidian-journey-plugin/main.js +++ /dev/null @@ -1,6833 +0,0 @@ -'use strict'; - -var obsidian = require('obsidian'); - -/*! ***************************************************************************** -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -***************************************************************************** */ -/* global Reflect, Promise */ - -var extendStatics = function(d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); -}; - -function __extends(d, b) { - if (typeof b !== "function" && b !== null) - throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -} - -function __awaiter(thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -} - -function __generator(thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -} - -var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; - -function createCommonjsModule(fn, basedir, module) { - return module = { - path: basedir, - exports: {}, - require: function (path, base) { - return commonjsRequire(path, (base === undefined || base === null) ? module.path : base); - } - }, fn(module, module.exports), module.exports; -} - -function commonjsRequire () { - throw new Error('Dynamic requires are not currently supported by @rollup/plugin-commonjs'); -} - -/** - * Removes all key-value entries from the list cache. - * - * @private - * @name clear - * @memberOf ListCache - */ -function listCacheClear() { - this.__data__ = []; - this.size = 0; -} - -var _listCacheClear = listCacheClear; - -/** - * Performs a - * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) - * comparison between two values to determine if they are equivalent. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to compare. - * @param {*} other The other value to compare. - * @returns {boolean} Returns `true` if the values are equivalent, else `false`. - * @example - * - * var object = { 'a': 1 }; - * var other = { 'a': 1 }; - * - * _.eq(object, object); - * // => true - * - * _.eq(object, other); - * // => false - * - * _.eq('a', 'a'); - * // => true - * - * _.eq('a', Object('a')); - * // => false - * - * _.eq(NaN, NaN); - * // => true - */ -function eq(value, other) { - return value === other || (value !== value && other !== other); -} - -var eq_1 = eq; - -/** - * Gets the index at which the `key` is found in `array` of key-value pairs. - * - * @private - * @param {Array} array The array to inspect. - * @param {*} key The key to search for. - * @returns {number} Returns the index of the matched value, else `-1`. - */ -function assocIndexOf(array, key) { - var length = array.length; - while (length--) { - if (eq_1(array[length][0], key)) { - return length; - } - } - return -1; -} - -var _assocIndexOf = assocIndexOf; - -/** Used for built-in method references. */ -var arrayProto = Array.prototype; - -/** Built-in value references. */ -var splice = arrayProto.splice; - -/** - * Removes `key` and its value from the list cache. - * - * @private - * @name delete - * @memberOf ListCache - * @param {string} key The key of the value to remove. - * @returns {boolean} Returns `true` if the entry was removed, else `false`. - */ -function listCacheDelete(key) { - var data = this.__data__, - index = _assocIndexOf(data, key); - - if (index < 0) { - return false; - } - var lastIndex = data.length - 1; - if (index == lastIndex) { - data.pop(); - } else { - splice.call(data, index, 1); - } - --this.size; - return true; -} - -var _listCacheDelete = listCacheDelete; - -/** - * Gets the list cache value for `key`. - * - * @private - * @name get - * @memberOf ListCache - * @param {string} key The key of the value to get. - * @returns {*} Returns the entry value. - */ -function listCacheGet(key) { - var data = this.__data__, - index = _assocIndexOf(data, key); - - return index < 0 ? undefined : data[index][1]; -} - -var _listCacheGet = listCacheGet; - -/** - * Checks if a list cache value for `key` exists. - * - * @private - * @name has - * @memberOf ListCache - * @param {string} key The key of the entry to check. - * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. - */ -function listCacheHas(key) { - return _assocIndexOf(this.__data__, key) > -1; -} - -var _listCacheHas = listCacheHas; - -/** - * Sets the list cache `key` to `value`. - * - * @private - * @name set - * @memberOf ListCache - * @param {string} key The key of the value to set. - * @param {*} value The value to set. - * @returns {Object} Returns the list cache instance. - */ -function listCacheSet(key, value) { - var data = this.__data__, - index = _assocIndexOf(data, key); - - if (index < 0) { - ++this.size; - data.push([key, value]); - } else { - data[index][1] = value; - } - return this; -} - -var _listCacheSet = listCacheSet; - -/** - * Creates an list cache object. - * - * @private - * @constructor - * @param {Array} [entries] The key-value pairs to cache. - */ -function ListCache(entries) { - var index = -1, - length = entries == null ? 0 : entries.length; - - this.clear(); - while (++index < length) { - var entry = entries[index]; - this.set(entry[0], entry[1]); - } -} - -// Add methods to `ListCache`. -ListCache.prototype.clear = _listCacheClear; -ListCache.prototype['delete'] = _listCacheDelete; -ListCache.prototype.get = _listCacheGet; -ListCache.prototype.has = _listCacheHas; -ListCache.prototype.set = _listCacheSet; - -var _ListCache = ListCache; - -/** - * Removes all key-value entries from the stack. - * - * @private - * @name clear - * @memberOf Stack - */ -function stackClear() { - this.__data__ = new _ListCache; - this.size = 0; -} - -var _stackClear = stackClear; - -/** - * Removes `key` and its value from the stack. - * - * @private - * @name delete - * @memberOf Stack - * @param {string} key The key of the value to remove. - * @returns {boolean} Returns `true` if the entry was removed, else `false`. - */ -function stackDelete(key) { - var data = this.__data__, - result = data['delete'](key); - - this.size = data.size; - return result; -} - -var _stackDelete = stackDelete; - -/** - * Gets the stack value for `key`. - * - * @private - * @name get - * @memberOf Stack - * @param {string} key The key of the value to get. - * @returns {*} Returns the entry value. - */ -function stackGet(key) { - return this.__data__.get(key); -} - -var _stackGet = stackGet; - -/** - * Checks if a stack value for `key` exists. - * - * @private - * @name has - * @memberOf Stack - * @param {string} key The key of the entry to check. - * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. - */ -function stackHas(key) { - return this.__data__.has(key); -} - -var _stackHas = stackHas; - -/** Detect free variable `global` from Node.js. */ -var freeGlobal = typeof commonjsGlobal == 'object' && commonjsGlobal && commonjsGlobal.Object === Object && commonjsGlobal; - -var _freeGlobal = freeGlobal; - -/** Detect free variable `self`. */ -var freeSelf = typeof self == 'object' && self && self.Object === Object && self; - -/** Used as a reference to the global object. */ -var root = _freeGlobal || freeSelf || Function('return this')(); - -var _root = root; - -/** Built-in value references. */ -var Symbol$1 = _root.Symbol; - -var _Symbol = Symbol$1; - -/** Used for built-in method references. */ -var objectProto = Object.prototype; - -/** Used to check objects for own properties. */ -var hasOwnProperty = objectProto.hasOwnProperty; - -/** - * Used to resolve the - * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) - * of values. - */ -var nativeObjectToString = objectProto.toString; - -/** Built-in value references. */ -var symToStringTag = _Symbol ? _Symbol.toStringTag : undefined; - -/** - * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. - * - * @private - * @param {*} value The value to query. - * @returns {string} Returns the raw `toStringTag`. - */ -function getRawTag(value) { - var isOwn = hasOwnProperty.call(value, symToStringTag), - tag = value[symToStringTag]; - - try { - value[symToStringTag] = undefined; - var unmasked = true; - } catch (e) {} - - var result = nativeObjectToString.call(value); - if (unmasked) { - if (isOwn) { - value[symToStringTag] = tag; - } else { - delete value[symToStringTag]; - } - } - return result; -} - -var _getRawTag = getRawTag; - -/** Used for built-in method references. */ -var objectProto$1 = Object.prototype; - -/** - * Used to resolve the - * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) - * of values. - */ -var nativeObjectToString$1 = objectProto$1.toString; - -/** - * Converts `value` to a string using `Object.prototype.toString`. - * - * @private - * @param {*} value The value to convert. - * @returns {string} Returns the converted string. - */ -function objectToString(value) { - return nativeObjectToString$1.call(value); -} - -var _objectToString = objectToString; - -/** `Object#toString` result references. */ -var nullTag = '[object Null]', - undefinedTag = '[object Undefined]'; - -/** Built-in value references. */ -var symToStringTag$1 = _Symbol ? _Symbol.toStringTag : undefined; - -/** - * The base implementation of `getTag` without fallbacks for buggy environments. - * - * @private - * @param {*} value The value to query. - * @returns {string} Returns the `toStringTag`. - */ -function baseGetTag(value) { - if (value == null) { - return value === undefined ? undefinedTag : nullTag; - } - return (symToStringTag$1 && symToStringTag$1 in Object(value)) - ? _getRawTag(value) - : _objectToString(value); -} - -var _baseGetTag = baseGetTag; - -/** - * Checks if `value` is the - * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) - * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an object, else `false`. - * @example - * - * _.isObject({}); - * // => true - * - * _.isObject([1, 2, 3]); - * // => true - * - * _.isObject(_.noop); - * // => true - * - * _.isObject(null); - * // => false - */ -function isObject(value) { - var type = typeof value; - return value != null && (type == 'object' || type == 'function'); -} - -var isObject_1 = isObject; - -/** `Object#toString` result references. */ -var asyncTag = '[object AsyncFunction]', - funcTag = '[object Function]', - genTag = '[object GeneratorFunction]', - proxyTag = '[object Proxy]'; - -/** - * Checks if `value` is classified as a `Function` object. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a function, else `false`. - * @example - * - * _.isFunction(_); - * // => true - * - * _.isFunction(/abc/); - * // => false - */ -function isFunction(value) { - if (!isObject_1(value)) { - return false; - } - // The use of `Object#toString` avoids issues with the `typeof` operator - // in Safari 9 which returns 'object' for typed arrays and other constructors. - var tag = _baseGetTag(value); - return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; -} - -var isFunction_1 = isFunction; - -/** Used to detect overreaching core-js shims. */ -var coreJsData = _root['__core-js_shared__']; - -var _coreJsData = coreJsData; - -/** Used to detect methods masquerading as native. */ -var maskSrcKey = (function() { - var uid = /[^.]+$/.exec(_coreJsData && _coreJsData.keys && _coreJsData.keys.IE_PROTO || ''); - return uid ? ('Symbol(src)_1.' + uid) : ''; -}()); - -/** - * Checks if `func` has its source masked. - * - * @private - * @param {Function} func The function to check. - * @returns {boolean} Returns `true` if `func` is masked, else `false`. - */ -function isMasked(func) { - return !!maskSrcKey && (maskSrcKey in func); -} - -var _isMasked = isMasked; - -/** Used for built-in method references. */ -var funcProto = Function.prototype; - -/** Used to resolve the decompiled source of functions. */ -var funcToString = funcProto.toString; - -/** - * Converts `func` to its source code. - * - * @private - * @param {Function} func The function to convert. - * @returns {string} Returns the source code. - */ -function toSource(func) { - if (func != null) { - try { - return funcToString.call(func); - } catch (e) {} - try { - return (func + ''); - } catch (e) {} - } - return ''; -} - -var _toSource = toSource; - -/** - * Used to match `RegExp` - * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). - */ -var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; - -/** Used to detect host constructors (Safari). */ -var reIsHostCtor = /^\[object .+?Constructor\]$/; - -/** Used for built-in method references. */ -var funcProto$1 = Function.prototype, - objectProto$2 = Object.prototype; - -/** Used to resolve the decompiled source of functions. */ -var funcToString$1 = funcProto$1.toString; - -/** Used to check objects for own properties. */ -var hasOwnProperty$1 = objectProto$2.hasOwnProperty; - -/** Used to detect if a method is native. */ -var reIsNative = RegExp('^' + - funcToString$1.call(hasOwnProperty$1).replace(reRegExpChar, '\\$&') - .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' -); - -/** - * The base implementation of `_.isNative` without bad shim checks. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a native function, - * else `false`. - */ -function baseIsNative(value) { - if (!isObject_1(value) || _isMasked(value)) { - return false; - } - var pattern = isFunction_1(value) ? reIsNative : reIsHostCtor; - return pattern.test(_toSource(value)); -} - -var _baseIsNative = baseIsNative; - -/** - * Gets the value at `key` of `object`. - * - * @private - * @param {Object} [object] The object to query. - * @param {string} key The key of the property to get. - * @returns {*} Returns the property value. - */ -function getValue(object, key) { - return object == null ? undefined : object[key]; -} - -var _getValue = getValue; - -/** - * Gets the native function at `key` of `object`. - * - * @private - * @param {Object} object The object to query. - * @param {string} key The key of the method to get. - * @returns {*} Returns the function if it's native, else `undefined`. - */ -function getNative(object, key) { - var value = _getValue(object, key); - return _baseIsNative(value) ? value : undefined; -} - -var _getNative = getNative; - -/* Built-in method references that are verified to be native. */ -var Map = _getNative(_root, 'Map'); - -var _Map = Map; - -/* Built-in method references that are verified to be native. */ -var nativeCreate = _getNative(Object, 'create'); - -var _nativeCreate = nativeCreate; - -/** - * Removes all key-value entries from the hash. - * - * @private - * @name clear - * @memberOf Hash - */ -function hashClear() { - this.__data__ = _nativeCreate ? _nativeCreate(null) : {}; - this.size = 0; -} - -var _hashClear = hashClear; - -/** - * Removes `key` and its value from the hash. - * - * @private - * @name delete - * @memberOf Hash - * @param {Object} hash The hash to modify. - * @param {string} key The key of the value to remove. - * @returns {boolean} Returns `true` if the entry was removed, else `false`. - */ -function hashDelete(key) { - var result = this.has(key) && delete this.__data__[key]; - this.size -= result ? 1 : 0; - return result; -} - -var _hashDelete = hashDelete; - -/** Used to stand-in for `undefined` hash values. */ -var HASH_UNDEFINED = '__lodash_hash_undefined__'; - -/** Used for built-in method references. */ -var objectProto$3 = Object.prototype; - -/** Used to check objects for own properties. */ -var hasOwnProperty$2 = objectProto$3.hasOwnProperty; - -/** - * Gets the hash value for `key`. - * - * @private - * @name get - * @memberOf Hash - * @param {string} key The key of the value to get. - * @returns {*} Returns the entry value. - */ -function hashGet(key) { - var data = this.__data__; - if (_nativeCreate) { - var result = data[key]; - return result === HASH_UNDEFINED ? undefined : result; - } - return hasOwnProperty$2.call(data, key) ? data[key] : undefined; -} - -var _hashGet = hashGet; - -/** Used for built-in method references. */ -var objectProto$4 = Object.prototype; - -/** Used to check objects for own properties. */ -var hasOwnProperty$3 = objectProto$4.hasOwnProperty; - -/** - * Checks if a hash value for `key` exists. - * - * @private - * @name has - * @memberOf Hash - * @param {string} key The key of the entry to check. - * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. - */ -function hashHas(key) { - var data = this.__data__; - return _nativeCreate ? (data[key] !== undefined) : hasOwnProperty$3.call(data, key); -} - -var _hashHas = hashHas; - -/** Used to stand-in for `undefined` hash values. */ -var HASH_UNDEFINED$1 = '__lodash_hash_undefined__'; - -/** - * Sets the hash `key` to `value`. - * - * @private - * @name set - * @memberOf Hash - * @param {string} key The key of the value to set. - * @param {*} value The value to set. - * @returns {Object} Returns the hash instance. - */ -function hashSet(key, value) { - var data = this.__data__; - this.size += this.has(key) ? 0 : 1; - data[key] = (_nativeCreate && value === undefined) ? HASH_UNDEFINED$1 : value; - return this; -} - -var _hashSet = hashSet; - -/** - * Creates a hash object. - * - * @private - * @constructor - * @param {Array} [entries] The key-value pairs to cache. - */ -function Hash(entries) { - var index = -1, - length = entries == null ? 0 : entries.length; - - this.clear(); - while (++index < length) { - var entry = entries[index]; - this.set(entry[0], entry[1]); - } -} - -// Add methods to `Hash`. -Hash.prototype.clear = _hashClear; -Hash.prototype['delete'] = _hashDelete; -Hash.prototype.get = _hashGet; -Hash.prototype.has = _hashHas; -Hash.prototype.set = _hashSet; - -var _Hash = Hash; - -/** - * Removes all key-value entries from the map. - * - * @private - * @name clear - * @memberOf MapCache - */ -function mapCacheClear() { - this.size = 0; - this.__data__ = { - 'hash': new _Hash, - 'map': new (_Map || _ListCache), - 'string': new _Hash - }; -} - -var _mapCacheClear = mapCacheClear; - -/** - * Checks if `value` is suitable for use as unique object key. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is suitable, else `false`. - */ -function isKeyable(value) { - var type = typeof value; - return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') - ? (value !== '__proto__') - : (value === null); -} - -var _isKeyable = isKeyable; - -/** - * Gets the data for `map`. - * - * @private - * @param {Object} map The map to query. - * @param {string} key The reference key. - * @returns {*} Returns the map data. - */ -function getMapData(map, key) { - var data = map.__data__; - return _isKeyable(key) - ? data[typeof key == 'string' ? 'string' : 'hash'] - : data.map; -} - -var _getMapData = getMapData; - -/** - * Removes `key` and its value from the map. - * - * @private - * @name delete - * @memberOf MapCache - * @param {string} key The key of the value to remove. - * @returns {boolean} Returns `true` if the entry was removed, else `false`. - */ -function mapCacheDelete(key) { - var result = _getMapData(this, key)['delete'](key); - this.size -= result ? 1 : 0; - return result; -} - -var _mapCacheDelete = mapCacheDelete; - -/** - * Gets the map value for `key`. - * - * @private - * @name get - * @memberOf MapCache - * @param {string} key The key of the value to get. - * @returns {*} Returns the entry value. - */ -function mapCacheGet(key) { - return _getMapData(this, key).get(key); -} - -var _mapCacheGet = mapCacheGet; - -/** - * Checks if a map value for `key` exists. - * - * @private - * @name has - * @memberOf MapCache - * @param {string} key The key of the entry to check. - * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. - */ -function mapCacheHas(key) { - return _getMapData(this, key).has(key); -} - -var _mapCacheHas = mapCacheHas; - -/** - * Sets the map `key` to `value`. - * - * @private - * @name set - * @memberOf MapCache - * @param {string} key The key of the value to set. - * @param {*} value The value to set. - * @returns {Object} Returns the map cache instance. - */ -function mapCacheSet(key, value) { - var data = _getMapData(this, key), - size = data.size; - - data.set(key, value); - this.size += data.size == size ? 0 : 1; - return this; -} - -var _mapCacheSet = mapCacheSet; - -/** - * Creates a map cache object to store key-value pairs. - * - * @private - * @constructor - * @param {Array} [entries] The key-value pairs to cache. - */ -function MapCache(entries) { - var index = -1, - length = entries == null ? 0 : entries.length; - - this.clear(); - while (++index < length) { - var entry = entries[index]; - this.set(entry[0], entry[1]); - } -} - -// Add methods to `MapCache`. -MapCache.prototype.clear = _mapCacheClear; -MapCache.prototype['delete'] = _mapCacheDelete; -MapCache.prototype.get = _mapCacheGet; -MapCache.prototype.has = _mapCacheHas; -MapCache.prototype.set = _mapCacheSet; - -var _MapCache = MapCache; - -/** Used as the size to enable large array optimizations. */ -var LARGE_ARRAY_SIZE = 200; - -/** - * Sets the stack `key` to `value`. - * - * @private - * @name set - * @memberOf Stack - * @param {string} key The key of the value to set. - * @param {*} value The value to set. - * @returns {Object} Returns the stack cache instance. - */ -function stackSet(key, value) { - var data = this.__data__; - if (data instanceof _ListCache) { - var pairs = data.__data__; - if (!_Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) { - pairs.push([key, value]); - this.size = ++data.size; - return this; - } - data = this.__data__ = new _MapCache(pairs); - } - data.set(key, value); - this.size = data.size; - return this; -} - -var _stackSet = stackSet; - -/** - * Creates a stack cache object to store key-value pairs. - * - * @private - * @constructor - * @param {Array} [entries] The key-value pairs to cache. - */ -function Stack(entries) { - var data = this.__data__ = new _ListCache(entries); - this.size = data.size; -} - -// Add methods to `Stack`. -Stack.prototype.clear = _stackClear; -Stack.prototype['delete'] = _stackDelete; -Stack.prototype.get = _stackGet; -Stack.prototype.has = _stackHas; -Stack.prototype.set = _stackSet; - -var _Stack = Stack; - -/** - * A specialized version of `_.forEach` for arrays without support for - * iteratee shorthands. - * - * @private - * @param {Array} [array] The array to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Array} Returns `array`. - */ -function arrayEach(array, iteratee) { - var index = -1, - length = array == null ? 0 : array.length; - - while (++index < length) { - if (iteratee(array[index], index, array) === false) { - break; - } - } - return array; -} - -var _arrayEach = arrayEach; - -var defineProperty = (function() { - try { - var func = _getNative(Object, 'defineProperty'); - func({}, '', {}); - return func; - } catch (e) {} -}()); - -var _defineProperty = defineProperty; - -/** - * The base implementation of `assignValue` and `assignMergeValue` without - * value checks. - * - * @private - * @param {Object} object The object to modify. - * @param {string} key The key of the property to assign. - * @param {*} value The value to assign. - */ -function baseAssignValue(object, key, value) { - if (key == '__proto__' && _defineProperty) { - _defineProperty(object, key, { - 'configurable': true, - 'enumerable': true, - 'value': value, - 'writable': true - }); - } else { - object[key] = value; - } -} - -var _baseAssignValue = baseAssignValue; - -/** Used for built-in method references. */ -var objectProto$5 = Object.prototype; - -/** Used to check objects for own properties. */ -var hasOwnProperty$4 = objectProto$5.hasOwnProperty; - -/** - * Assigns `value` to `key` of `object` if the existing value is not equivalent - * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) - * for equality comparisons. - * - * @private - * @param {Object} object The object to modify. - * @param {string} key The key of the property to assign. - * @param {*} value The value to assign. - */ -function assignValue(object, key, value) { - var objValue = object[key]; - if (!(hasOwnProperty$4.call(object, key) && eq_1(objValue, value)) || - (value === undefined && !(key in object))) { - _baseAssignValue(object, key, value); - } -} - -var _assignValue = assignValue; - -/** - * Copies properties of `source` to `object`. - * - * @private - * @param {Object} source The object to copy properties from. - * @param {Array} props The property identifiers to copy. - * @param {Object} [object={}] The object to copy properties to. - * @param {Function} [customizer] The function to customize copied values. - * @returns {Object} Returns `object`. - */ -function copyObject(source, props, object, customizer) { - var isNew = !object; - object || (object = {}); - - var index = -1, - length = props.length; - - while (++index < length) { - var key = props[index]; - - var newValue = customizer - ? customizer(object[key], source[key], key, object, source) - : undefined; - - if (newValue === undefined) { - newValue = source[key]; - } - if (isNew) { - _baseAssignValue(object, key, newValue); - } else { - _assignValue(object, key, newValue); - } - } - return object; -} - -var _copyObject = copyObject; - -/** - * The base implementation of `_.times` without support for iteratee shorthands - * or max array length checks. - * - * @private - * @param {number} n The number of times to invoke `iteratee`. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Array} Returns the array of results. - */ -function baseTimes(n, iteratee) { - var index = -1, - result = Array(n); - - while (++index < n) { - result[index] = iteratee(index); - } - return result; -} - -var _baseTimes = baseTimes; - -/** - * Checks if `value` is object-like. A value is object-like if it's not `null` - * and has a `typeof` result of "object". - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is object-like, else `false`. - * @example - * - * _.isObjectLike({}); - * // => true - * - * _.isObjectLike([1, 2, 3]); - * // => true - * - * _.isObjectLike(_.noop); - * // => false - * - * _.isObjectLike(null); - * // => false - */ -function isObjectLike(value) { - return value != null && typeof value == 'object'; -} - -var isObjectLike_1 = isObjectLike; - -/** `Object#toString` result references. */ -var argsTag = '[object Arguments]'; - -/** - * The base implementation of `_.isArguments`. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an `arguments` object, - */ -function baseIsArguments(value) { - return isObjectLike_1(value) && _baseGetTag(value) == argsTag; -} - -var _baseIsArguments = baseIsArguments; - -/** Used for built-in method references. */ -var objectProto$6 = Object.prototype; - -/** Used to check objects for own properties. */ -var hasOwnProperty$5 = objectProto$6.hasOwnProperty; - -/** Built-in value references. */ -var propertyIsEnumerable = objectProto$6.propertyIsEnumerable; - -/** - * Checks if `value` is likely an `arguments` object. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an `arguments` object, - * else `false`. - * @example - * - * _.isArguments(function() { return arguments; }()); - * // => true - * - * _.isArguments([1, 2, 3]); - * // => false - */ -var isArguments = _baseIsArguments(function() { return arguments; }()) ? _baseIsArguments : function(value) { - return isObjectLike_1(value) && hasOwnProperty$5.call(value, 'callee') && - !propertyIsEnumerable.call(value, 'callee'); -}; - -var isArguments_1 = isArguments; - -/** - * Checks if `value` is classified as an `Array` object. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an array, else `false`. - * @example - * - * _.isArray([1, 2, 3]); - * // => true - * - * _.isArray(document.body.children); - * // => false - * - * _.isArray('abc'); - * // => false - * - * _.isArray(_.noop); - * // => false - */ -var isArray = Array.isArray; - -var isArray_1 = isArray; - -/** - * This method returns `false`. - * - * @static - * @memberOf _ - * @since 4.13.0 - * @category Util - * @returns {boolean} Returns `false`. - * @example - * - * _.times(2, _.stubFalse); - * // => [false, false] - */ -function stubFalse() { - return false; -} - -var stubFalse_1 = stubFalse; - -var isBuffer_1 = createCommonjsModule(function (module, exports) { -/** Detect free variable `exports`. */ -var freeExports = exports && !exports.nodeType && exports; - -/** Detect free variable `module`. */ -var freeModule = freeExports && 'object' == 'object' && module && !module.nodeType && module; - -/** Detect the popular CommonJS extension `module.exports`. */ -var moduleExports = freeModule && freeModule.exports === freeExports; - -/** Built-in value references. */ -var Buffer = moduleExports ? _root.Buffer : undefined; - -/* Built-in method references for those with the same name as other `lodash` methods. */ -var nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined; - -/** - * Checks if `value` is a buffer. - * - * @static - * @memberOf _ - * @since 4.3.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a buffer, else `false`. - * @example - * - * _.isBuffer(new Buffer(2)); - * // => true - * - * _.isBuffer(new Uint8Array(2)); - * // => false - */ -var isBuffer = nativeIsBuffer || stubFalse_1; - -module.exports = isBuffer; -}); - -/** Used as references for various `Number` constants. */ -var MAX_SAFE_INTEGER = 9007199254740991; - -/** Used to detect unsigned integer values. */ -var reIsUint = /^(?:0|[1-9]\d*)$/; - -/** - * Checks if `value` is a valid array-like index. - * - * @private - * @param {*} value The value to check. - * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. - * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. - */ -function isIndex(value, length) { - var type = typeof value; - length = length == null ? MAX_SAFE_INTEGER : length; - - return !!length && - (type == 'number' || - (type != 'symbol' && reIsUint.test(value))) && - (value > -1 && value % 1 == 0 && value < length); -} - -var _isIndex = isIndex; - -/** Used as references for various `Number` constants. */ -var MAX_SAFE_INTEGER$1 = 9007199254740991; - -/** - * Checks if `value` is a valid array-like length. - * - * **Note:** This method is loosely based on - * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. - * @example - * - * _.isLength(3); - * // => true - * - * _.isLength(Number.MIN_VALUE); - * // => false - * - * _.isLength(Infinity); - * // => false - * - * _.isLength('3'); - * // => false - */ -function isLength(value) { - return typeof value == 'number' && - value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER$1; -} - -var isLength_1 = isLength; - -/** `Object#toString` result references. */ -var argsTag$1 = '[object Arguments]', - arrayTag = '[object Array]', - boolTag = '[object Boolean]', - dateTag = '[object Date]', - errorTag = '[object Error]', - funcTag$1 = '[object Function]', - mapTag = '[object Map]', - numberTag = '[object Number]', - objectTag = '[object Object]', - regexpTag = '[object RegExp]', - setTag = '[object Set]', - stringTag = '[object String]', - weakMapTag = '[object WeakMap]'; - -var arrayBufferTag = '[object ArrayBuffer]', - dataViewTag = '[object DataView]', - float32Tag = '[object Float32Array]', - float64Tag = '[object Float64Array]', - int8Tag = '[object Int8Array]', - int16Tag = '[object Int16Array]', - int32Tag = '[object Int32Array]', - uint8Tag = '[object Uint8Array]', - uint8ClampedTag = '[object Uint8ClampedArray]', - uint16Tag = '[object Uint16Array]', - uint32Tag = '[object Uint32Array]'; - -/** Used to identify `toStringTag` values of typed arrays. */ -var typedArrayTags = {}; -typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = -typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = -typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = -typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = -typedArrayTags[uint32Tag] = true; -typedArrayTags[argsTag$1] = typedArrayTags[arrayTag] = -typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = -typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = -typedArrayTags[errorTag] = typedArrayTags[funcTag$1] = -typedArrayTags[mapTag] = typedArrayTags[numberTag] = -typedArrayTags[objectTag] = typedArrayTags[regexpTag] = -typedArrayTags[setTag] = typedArrayTags[stringTag] = -typedArrayTags[weakMapTag] = false; - -/** - * The base implementation of `_.isTypedArray` without Node.js optimizations. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. - */ -function baseIsTypedArray(value) { - return isObjectLike_1(value) && - isLength_1(value.length) && !!typedArrayTags[_baseGetTag(value)]; -} - -var _baseIsTypedArray = baseIsTypedArray; - -/** - * The base implementation of `_.unary` without support for storing metadata. - * - * @private - * @param {Function} func The function to cap arguments for. - * @returns {Function} Returns the new capped function. - */ -function baseUnary(func) { - return function(value) { - return func(value); - }; -} - -var _baseUnary = baseUnary; - -var _nodeUtil = createCommonjsModule(function (module, exports) { -/** Detect free variable `exports`. */ -var freeExports = exports && !exports.nodeType && exports; - -/** Detect free variable `module`. */ -var freeModule = freeExports && 'object' == 'object' && module && !module.nodeType && module; - -/** Detect the popular CommonJS extension `module.exports`. */ -var moduleExports = freeModule && freeModule.exports === freeExports; - -/** Detect free variable `process` from Node.js. */ -var freeProcess = moduleExports && _freeGlobal.process; - -/** Used to access faster Node.js helpers. */ -var nodeUtil = (function() { - try { - // Use `util.types` for Node.js 10+. - var types = freeModule && freeModule.require && freeModule.require('util').types; - - if (types) { - return types; - } - - // Legacy `process.binding('util')` for Node.js < 10. - return freeProcess && freeProcess.binding && freeProcess.binding('util'); - } catch (e) {} -}()); - -module.exports = nodeUtil; -}); - -/* Node.js helper references. */ -var nodeIsTypedArray = _nodeUtil && _nodeUtil.isTypedArray; - -/** - * Checks if `value` is classified as a typed array. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. - * @example - * - * _.isTypedArray(new Uint8Array); - * // => true - * - * _.isTypedArray([]); - * // => false - */ -var isTypedArray = nodeIsTypedArray ? _baseUnary(nodeIsTypedArray) : _baseIsTypedArray; - -var isTypedArray_1 = isTypedArray; - -/** Used for built-in method references. */ -var objectProto$7 = Object.prototype; - -/** Used to check objects for own properties. */ -var hasOwnProperty$6 = objectProto$7.hasOwnProperty; - -/** - * Creates an array of the enumerable property names of the array-like `value`. - * - * @private - * @param {*} value The value to query. - * @param {boolean} inherited Specify returning inherited property names. - * @returns {Array} Returns the array of property names. - */ -function arrayLikeKeys(value, inherited) { - var isArr = isArray_1(value), - isArg = !isArr && isArguments_1(value), - isBuff = !isArr && !isArg && isBuffer_1(value), - isType = !isArr && !isArg && !isBuff && isTypedArray_1(value), - skipIndexes = isArr || isArg || isBuff || isType, - result = skipIndexes ? _baseTimes(value.length, String) : [], - length = result.length; - - for (var key in value) { - if ((inherited || hasOwnProperty$6.call(value, key)) && - !(skipIndexes && ( - // Safari 9 has enumerable `arguments.length` in strict mode. - key == 'length' || - // Node.js 0.10 has enumerable non-index properties on buffers. - (isBuff && (key == 'offset' || key == 'parent')) || - // PhantomJS 2 has enumerable non-index properties on typed arrays. - (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) || - // Skip index properties. - _isIndex(key, length) - ))) { - result.push(key); - } - } - return result; -} - -var _arrayLikeKeys = arrayLikeKeys; - -/** Used for built-in method references. */ -var objectProto$8 = Object.prototype; - -/** - * Checks if `value` is likely a prototype object. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a prototype, else `false`. - */ -function isPrototype(value) { - var Ctor = value && value.constructor, - proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto$8; - - return value === proto; -} - -var _isPrototype = isPrototype; - -/** - * Creates a unary function that invokes `func` with its argument transformed. - * - * @private - * @param {Function} func The function to wrap. - * @param {Function} transform The argument transform. - * @returns {Function} Returns the new function. - */ -function overArg(func, transform) { - return function(arg) { - return func(transform(arg)); - }; -} - -var _overArg = overArg; - -/* Built-in method references for those with the same name as other `lodash` methods. */ -var nativeKeys = _overArg(Object.keys, Object); - -var _nativeKeys = nativeKeys; - -/** Used for built-in method references. */ -var objectProto$9 = Object.prototype; - -/** Used to check objects for own properties. */ -var hasOwnProperty$7 = objectProto$9.hasOwnProperty; - -/** - * The base implementation of `_.keys` which doesn't treat sparse arrays as dense. - * - * @private - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property names. - */ -function baseKeys(object) { - if (!_isPrototype(object)) { - return _nativeKeys(object); - } - var result = []; - for (var key in Object(object)) { - if (hasOwnProperty$7.call(object, key) && key != 'constructor') { - result.push(key); - } - } - return result; -} - -var _baseKeys = baseKeys; - -/** - * Checks if `value` is array-like. A value is considered array-like if it's - * not a function and has a `value.length` that's an integer greater than or - * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is array-like, else `false`. - * @example - * - * _.isArrayLike([1, 2, 3]); - * // => true - * - * _.isArrayLike(document.body.children); - * // => true - * - * _.isArrayLike('abc'); - * // => true - * - * _.isArrayLike(_.noop); - * // => false - */ -function isArrayLike(value) { - return value != null && isLength_1(value.length) && !isFunction_1(value); -} - -var isArrayLike_1 = isArrayLike; - -/** - * Creates an array of the own enumerable property names of `object`. - * - * **Note:** Non-object values are coerced to objects. See the - * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) - * for more details. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Object - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property names. - * @example - * - * function Foo() { - * this.a = 1; - * this.b = 2; - * } - * - * Foo.prototype.c = 3; - * - * _.keys(new Foo); - * // => ['a', 'b'] (iteration order is not guaranteed) - * - * _.keys('hi'); - * // => ['0', '1'] - */ -function keys(object) { - return isArrayLike_1(object) ? _arrayLikeKeys(object) : _baseKeys(object); -} - -var keys_1 = keys; - -/** - * The base implementation of `_.assign` without support for multiple sources - * or `customizer` functions. - * - * @private - * @param {Object} object The destination object. - * @param {Object} source The source object. - * @returns {Object} Returns `object`. - */ -function baseAssign(object, source) { - return object && _copyObject(source, keys_1(source), object); -} - -var _baseAssign = baseAssign; - -/** - * This function is like - * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) - * except that it includes inherited enumerable properties. - * - * @private - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property names. - */ -function nativeKeysIn(object) { - var result = []; - if (object != null) { - for (var key in Object(object)) { - result.push(key); - } - } - return result; -} - -var _nativeKeysIn = nativeKeysIn; - -/** Used for built-in method references. */ -var objectProto$a = Object.prototype; - -/** Used to check objects for own properties. */ -var hasOwnProperty$8 = objectProto$a.hasOwnProperty; - -/** - * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense. - * - * @private - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property names. - */ -function baseKeysIn(object) { - if (!isObject_1(object)) { - return _nativeKeysIn(object); - } - var isProto = _isPrototype(object), - result = []; - - for (var key in object) { - if (!(key == 'constructor' && (isProto || !hasOwnProperty$8.call(object, key)))) { - result.push(key); - } - } - return result; -} - -var _baseKeysIn = baseKeysIn; - -/** - * Creates an array of the own and inherited enumerable property names of `object`. - * - * **Note:** Non-object values are coerced to objects. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Object - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property names. - * @example - * - * function Foo() { - * this.a = 1; - * this.b = 2; - * } - * - * Foo.prototype.c = 3; - * - * _.keysIn(new Foo); - * // => ['a', 'b', 'c'] (iteration order is not guaranteed) - */ -function keysIn(object) { - return isArrayLike_1(object) ? _arrayLikeKeys(object, true) : _baseKeysIn(object); -} - -var keysIn_1 = keysIn; - -/** - * The base implementation of `_.assignIn` without support for multiple sources - * or `customizer` functions. - * - * @private - * @param {Object} object The destination object. - * @param {Object} source The source object. - * @returns {Object} Returns `object`. - */ -function baseAssignIn(object, source) { - return object && _copyObject(source, keysIn_1(source), object); -} - -var _baseAssignIn = baseAssignIn; - -var _cloneBuffer = createCommonjsModule(function (module, exports) { -/** Detect free variable `exports`. */ -var freeExports = exports && !exports.nodeType && exports; - -/** Detect free variable `module`. */ -var freeModule = freeExports && 'object' == 'object' && module && !module.nodeType && module; - -/** Detect the popular CommonJS extension `module.exports`. */ -var moduleExports = freeModule && freeModule.exports === freeExports; - -/** Built-in value references. */ -var Buffer = moduleExports ? _root.Buffer : undefined, - allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined; - -/** - * Creates a clone of `buffer`. - * - * @private - * @param {Buffer} buffer The buffer to clone. - * @param {boolean} [isDeep] Specify a deep clone. - * @returns {Buffer} Returns the cloned buffer. - */ -function cloneBuffer(buffer, isDeep) { - if (isDeep) { - return buffer.slice(); - } - var length = buffer.length, - result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length); - - buffer.copy(result); - return result; -} - -module.exports = cloneBuffer; -}); - -/** - * Copies the values of `source` to `array`. - * - * @private - * @param {Array} source The array to copy values from. - * @param {Array} [array=[]] The array to copy values to. - * @returns {Array} Returns `array`. - */ -function copyArray(source, array) { - var index = -1, - length = source.length; - - array || (array = Array(length)); - while (++index < length) { - array[index] = source[index]; - } - return array; -} - -var _copyArray = copyArray; - -/** - * A specialized version of `_.filter` for arrays without support for - * iteratee shorthands. - * - * @private - * @param {Array} [array] The array to iterate over. - * @param {Function} predicate The function invoked per iteration. - * @returns {Array} Returns the new filtered array. - */ -function arrayFilter(array, predicate) { - var index = -1, - length = array == null ? 0 : array.length, - resIndex = 0, - result = []; - - while (++index < length) { - var value = array[index]; - if (predicate(value, index, array)) { - result[resIndex++] = value; - } - } - return result; -} - -var _arrayFilter = arrayFilter; - -/** - * This method returns a new empty array. - * - * @static - * @memberOf _ - * @since 4.13.0 - * @category Util - * @returns {Array} Returns the new empty array. - * @example - * - * var arrays = _.times(2, _.stubArray); - * - * console.log(arrays); - * // => [[], []] - * - * console.log(arrays[0] === arrays[1]); - * // => false - */ -function stubArray() { - return []; -} - -var stubArray_1 = stubArray; - -/** Used for built-in method references. */ -var objectProto$b = Object.prototype; - -/** Built-in value references. */ -var propertyIsEnumerable$1 = objectProto$b.propertyIsEnumerable; - -/* Built-in method references for those with the same name as other `lodash` methods. */ -var nativeGetSymbols = Object.getOwnPropertySymbols; - -/** - * Creates an array of the own enumerable symbols of `object`. - * - * @private - * @param {Object} object The object to query. - * @returns {Array} Returns the array of symbols. - */ -var getSymbols = !nativeGetSymbols ? stubArray_1 : function(object) { - if (object == null) { - return []; - } - object = Object(object); - return _arrayFilter(nativeGetSymbols(object), function(symbol) { - return propertyIsEnumerable$1.call(object, symbol); - }); -}; - -var _getSymbols = getSymbols; - -/** - * Copies own symbols of `source` to `object`. - * - * @private - * @param {Object} source The object to copy symbols from. - * @param {Object} [object={}] The object to copy symbols to. - * @returns {Object} Returns `object`. - */ -function copySymbols(source, object) { - return _copyObject(source, _getSymbols(source), object); -} - -var _copySymbols = copySymbols; - -/** - * Appends the elements of `values` to `array`. - * - * @private - * @param {Array} array The array to modify. - * @param {Array} values The values to append. - * @returns {Array} Returns `array`. - */ -function arrayPush(array, values) { - var index = -1, - length = values.length, - offset = array.length; - - while (++index < length) { - array[offset + index] = values[index]; - } - return array; -} - -var _arrayPush = arrayPush; - -/** Built-in value references. */ -var getPrototype = _overArg(Object.getPrototypeOf, Object); - -var _getPrototype = getPrototype; - -/* Built-in method references for those with the same name as other `lodash` methods. */ -var nativeGetSymbols$1 = Object.getOwnPropertySymbols; - -/** - * Creates an array of the own and inherited enumerable symbols of `object`. - * - * @private - * @param {Object} object The object to query. - * @returns {Array} Returns the array of symbols. - */ -var getSymbolsIn = !nativeGetSymbols$1 ? stubArray_1 : function(object) { - var result = []; - while (object) { - _arrayPush(result, _getSymbols(object)); - object = _getPrototype(object); - } - return result; -}; - -var _getSymbolsIn = getSymbolsIn; - -/** - * Copies own and inherited symbols of `source` to `object`. - * - * @private - * @param {Object} source The object to copy symbols from. - * @param {Object} [object={}] The object to copy symbols to. - * @returns {Object} Returns `object`. - */ -function copySymbolsIn(source, object) { - return _copyObject(source, _getSymbolsIn(source), object); -} - -var _copySymbolsIn = copySymbolsIn; - -/** - * The base implementation of `getAllKeys` and `getAllKeysIn` which uses - * `keysFunc` and `symbolsFunc` to get the enumerable property names and - * symbols of `object`. - * - * @private - * @param {Object} object The object to query. - * @param {Function} keysFunc The function to get the keys of `object`. - * @param {Function} symbolsFunc The function to get the symbols of `object`. - * @returns {Array} Returns the array of property names and symbols. - */ -function baseGetAllKeys(object, keysFunc, symbolsFunc) { - var result = keysFunc(object); - return isArray_1(object) ? result : _arrayPush(result, symbolsFunc(object)); -} - -var _baseGetAllKeys = baseGetAllKeys; - -/** - * Creates an array of own enumerable property names and symbols of `object`. - * - * @private - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property names and symbols. - */ -function getAllKeys(object) { - return _baseGetAllKeys(object, keys_1, _getSymbols); -} - -var _getAllKeys = getAllKeys; - -/** - * Creates an array of own and inherited enumerable property names and - * symbols of `object`. - * - * @private - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property names and symbols. - */ -function getAllKeysIn(object) { - return _baseGetAllKeys(object, keysIn_1, _getSymbolsIn); -} - -var _getAllKeysIn = getAllKeysIn; - -/* Built-in method references that are verified to be native. */ -var DataView = _getNative(_root, 'DataView'); - -var _DataView = DataView; - -/* Built-in method references that are verified to be native. */ -var Promise$1 = _getNative(_root, 'Promise'); - -var _Promise = Promise$1; - -/* Built-in method references that are verified to be native. */ -var Set = _getNative(_root, 'Set'); - -var _Set = Set; - -/* Built-in method references that are verified to be native. */ -var WeakMap = _getNative(_root, 'WeakMap'); - -var _WeakMap = WeakMap; - -/** `Object#toString` result references. */ -var mapTag$1 = '[object Map]', - objectTag$1 = '[object Object]', - promiseTag = '[object Promise]', - setTag$1 = '[object Set]', - weakMapTag$1 = '[object WeakMap]'; - -var dataViewTag$1 = '[object DataView]'; - -/** Used to detect maps, sets, and weakmaps. */ -var dataViewCtorString = _toSource(_DataView), - mapCtorString = _toSource(_Map), - promiseCtorString = _toSource(_Promise), - setCtorString = _toSource(_Set), - weakMapCtorString = _toSource(_WeakMap); - -/** - * Gets the `toStringTag` of `value`. - * - * @private - * @param {*} value The value to query. - * @returns {string} Returns the `toStringTag`. - */ -var getTag = _baseGetTag; - -// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6. -if ((_DataView && getTag(new _DataView(new ArrayBuffer(1))) != dataViewTag$1) || - (_Map && getTag(new _Map) != mapTag$1) || - (_Promise && getTag(_Promise.resolve()) != promiseTag) || - (_Set && getTag(new _Set) != setTag$1) || - (_WeakMap && getTag(new _WeakMap) != weakMapTag$1)) { - getTag = function(value) { - var result = _baseGetTag(value), - Ctor = result == objectTag$1 ? value.constructor : undefined, - ctorString = Ctor ? _toSource(Ctor) : ''; - - if (ctorString) { - switch (ctorString) { - case dataViewCtorString: return dataViewTag$1; - case mapCtorString: return mapTag$1; - case promiseCtorString: return promiseTag; - case setCtorString: return setTag$1; - case weakMapCtorString: return weakMapTag$1; - } - } - return result; - }; -} - -var _getTag = getTag; - -/** Used for built-in method references. */ -var objectProto$c = Object.prototype; - -/** Used to check objects for own properties. */ -var hasOwnProperty$9 = objectProto$c.hasOwnProperty; - -/** - * Initializes an array clone. - * - * @private - * @param {Array} array The array to clone. - * @returns {Array} Returns the initialized clone. - */ -function initCloneArray(array) { - var length = array.length, - result = new array.constructor(length); - - // Add properties assigned by `RegExp#exec`. - if (length && typeof array[0] == 'string' && hasOwnProperty$9.call(array, 'index')) { - result.index = array.index; - result.input = array.input; - } - return result; -} - -var _initCloneArray = initCloneArray; - -/** Built-in value references. */ -var Uint8Array = _root.Uint8Array; - -var _Uint8Array = Uint8Array; - -/** - * Creates a clone of `arrayBuffer`. - * - * @private - * @param {ArrayBuffer} arrayBuffer The array buffer to clone. - * @returns {ArrayBuffer} Returns the cloned array buffer. - */ -function cloneArrayBuffer(arrayBuffer) { - var result = new arrayBuffer.constructor(arrayBuffer.byteLength); - new _Uint8Array(result).set(new _Uint8Array(arrayBuffer)); - return result; -} - -var _cloneArrayBuffer = cloneArrayBuffer; - -/** - * Creates a clone of `dataView`. - * - * @private - * @param {Object} dataView The data view to clone. - * @param {boolean} [isDeep] Specify a deep clone. - * @returns {Object} Returns the cloned data view. - */ -function cloneDataView(dataView, isDeep) { - var buffer = isDeep ? _cloneArrayBuffer(dataView.buffer) : dataView.buffer; - return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength); -} - -var _cloneDataView = cloneDataView; - -/** Used to match `RegExp` flags from their coerced string values. */ -var reFlags = /\w*$/; - -/** - * Creates a clone of `regexp`. - * - * @private - * @param {Object} regexp The regexp to clone. - * @returns {Object} Returns the cloned regexp. - */ -function cloneRegExp(regexp) { - var result = new regexp.constructor(regexp.source, reFlags.exec(regexp)); - result.lastIndex = regexp.lastIndex; - return result; -} - -var _cloneRegExp = cloneRegExp; - -/** Used to convert symbols to primitives and strings. */ -var symbolProto = _Symbol ? _Symbol.prototype : undefined, - symbolValueOf = symbolProto ? symbolProto.valueOf : undefined; - -/** - * Creates a clone of the `symbol` object. - * - * @private - * @param {Object} symbol The symbol object to clone. - * @returns {Object} Returns the cloned symbol object. - */ -function cloneSymbol(symbol) { - return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {}; -} - -var _cloneSymbol = cloneSymbol; - -/** - * Creates a clone of `typedArray`. - * - * @private - * @param {Object} typedArray The typed array to clone. - * @param {boolean} [isDeep] Specify a deep clone. - * @returns {Object} Returns the cloned typed array. - */ -function cloneTypedArray(typedArray, isDeep) { - var buffer = isDeep ? _cloneArrayBuffer(typedArray.buffer) : typedArray.buffer; - return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length); -} - -var _cloneTypedArray = cloneTypedArray; - -/** `Object#toString` result references. */ -var boolTag$1 = '[object Boolean]', - dateTag$1 = '[object Date]', - mapTag$2 = '[object Map]', - numberTag$1 = '[object Number]', - regexpTag$1 = '[object RegExp]', - setTag$2 = '[object Set]', - stringTag$1 = '[object String]', - symbolTag = '[object Symbol]'; - -var arrayBufferTag$1 = '[object ArrayBuffer]', - dataViewTag$2 = '[object DataView]', - float32Tag$1 = '[object Float32Array]', - float64Tag$1 = '[object Float64Array]', - int8Tag$1 = '[object Int8Array]', - int16Tag$1 = '[object Int16Array]', - int32Tag$1 = '[object Int32Array]', - uint8Tag$1 = '[object Uint8Array]', - uint8ClampedTag$1 = '[object Uint8ClampedArray]', - uint16Tag$1 = '[object Uint16Array]', - uint32Tag$1 = '[object Uint32Array]'; - -/** - * Initializes an object clone based on its `toStringTag`. - * - * **Note:** This function only supports cloning values with tags of - * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`. - * - * @private - * @param {Object} object The object to clone. - * @param {string} tag The `toStringTag` of the object to clone. - * @param {boolean} [isDeep] Specify a deep clone. - * @returns {Object} Returns the initialized clone. - */ -function initCloneByTag(object, tag, isDeep) { - var Ctor = object.constructor; - switch (tag) { - case arrayBufferTag$1: - return _cloneArrayBuffer(object); - - case boolTag$1: - case dateTag$1: - return new Ctor(+object); - - case dataViewTag$2: - return _cloneDataView(object, isDeep); - - case float32Tag$1: case float64Tag$1: - case int8Tag$1: case int16Tag$1: case int32Tag$1: - case uint8Tag$1: case uint8ClampedTag$1: case uint16Tag$1: case uint32Tag$1: - return _cloneTypedArray(object, isDeep); - - case mapTag$2: - return new Ctor; - - case numberTag$1: - case stringTag$1: - return new Ctor(object); - - case regexpTag$1: - return _cloneRegExp(object); - - case setTag$2: - return new Ctor; - - case symbolTag: - return _cloneSymbol(object); - } -} - -var _initCloneByTag = initCloneByTag; - -/** Built-in value references. */ -var objectCreate = Object.create; - -/** - * The base implementation of `_.create` without support for assigning - * properties to the created object. - * - * @private - * @param {Object} proto The object to inherit from. - * @returns {Object} Returns the new object. - */ -var baseCreate = (function() { - function object() {} - return function(proto) { - if (!isObject_1(proto)) { - return {}; - } - if (objectCreate) { - return objectCreate(proto); - } - object.prototype = proto; - var result = new object; - object.prototype = undefined; - return result; - }; -}()); - -var _baseCreate = baseCreate; - -/** - * Initializes an object clone. - * - * @private - * @param {Object} object The object to clone. - * @returns {Object} Returns the initialized clone. - */ -function initCloneObject(object) { - return (typeof object.constructor == 'function' && !_isPrototype(object)) - ? _baseCreate(_getPrototype(object)) - : {}; -} - -var _initCloneObject = initCloneObject; - -/** `Object#toString` result references. */ -var mapTag$3 = '[object Map]'; - -/** - * The base implementation of `_.isMap` without Node.js optimizations. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a map, else `false`. - */ -function baseIsMap(value) { - return isObjectLike_1(value) && _getTag(value) == mapTag$3; -} - -var _baseIsMap = baseIsMap; - -/* Node.js helper references. */ -var nodeIsMap = _nodeUtil && _nodeUtil.isMap; - -/** - * Checks if `value` is classified as a `Map` object. - * - * @static - * @memberOf _ - * @since 4.3.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a map, else `false`. - * @example - * - * _.isMap(new Map); - * // => true - * - * _.isMap(new WeakMap); - * // => false - */ -var isMap = nodeIsMap ? _baseUnary(nodeIsMap) : _baseIsMap; - -var isMap_1 = isMap; - -/** `Object#toString` result references. */ -var setTag$3 = '[object Set]'; - -/** - * The base implementation of `_.isSet` without Node.js optimizations. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a set, else `false`. - */ -function baseIsSet(value) { - return isObjectLike_1(value) && _getTag(value) == setTag$3; -} - -var _baseIsSet = baseIsSet; - -/* Node.js helper references. */ -var nodeIsSet = _nodeUtil && _nodeUtil.isSet; - -/** - * Checks if `value` is classified as a `Set` object. - * - * @static - * @memberOf _ - * @since 4.3.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a set, else `false`. - * @example - * - * _.isSet(new Set); - * // => true - * - * _.isSet(new WeakSet); - * // => false - */ -var isSet = nodeIsSet ? _baseUnary(nodeIsSet) : _baseIsSet; - -var isSet_1 = isSet; - -/** Used to compose bitmasks for cloning. */ -var CLONE_DEEP_FLAG = 1, - CLONE_FLAT_FLAG = 2, - CLONE_SYMBOLS_FLAG = 4; - -/** `Object#toString` result references. */ -var argsTag$2 = '[object Arguments]', - arrayTag$1 = '[object Array]', - boolTag$2 = '[object Boolean]', - dateTag$2 = '[object Date]', - errorTag$1 = '[object Error]', - funcTag$2 = '[object Function]', - genTag$1 = '[object GeneratorFunction]', - mapTag$4 = '[object Map]', - numberTag$2 = '[object Number]', - objectTag$2 = '[object Object]', - regexpTag$2 = '[object RegExp]', - setTag$4 = '[object Set]', - stringTag$2 = '[object String]', - symbolTag$1 = '[object Symbol]', - weakMapTag$2 = '[object WeakMap]'; - -var arrayBufferTag$2 = '[object ArrayBuffer]', - dataViewTag$3 = '[object DataView]', - float32Tag$2 = '[object Float32Array]', - float64Tag$2 = '[object Float64Array]', - int8Tag$2 = '[object Int8Array]', - int16Tag$2 = '[object Int16Array]', - int32Tag$2 = '[object Int32Array]', - uint8Tag$2 = '[object Uint8Array]', - uint8ClampedTag$2 = '[object Uint8ClampedArray]', - uint16Tag$2 = '[object Uint16Array]', - uint32Tag$2 = '[object Uint32Array]'; - -/** Used to identify `toStringTag` values supported by `_.clone`. */ -var cloneableTags = {}; -cloneableTags[argsTag$2] = cloneableTags[arrayTag$1] = -cloneableTags[arrayBufferTag$2] = cloneableTags[dataViewTag$3] = -cloneableTags[boolTag$2] = cloneableTags[dateTag$2] = -cloneableTags[float32Tag$2] = cloneableTags[float64Tag$2] = -cloneableTags[int8Tag$2] = cloneableTags[int16Tag$2] = -cloneableTags[int32Tag$2] = cloneableTags[mapTag$4] = -cloneableTags[numberTag$2] = cloneableTags[objectTag$2] = -cloneableTags[regexpTag$2] = cloneableTags[setTag$4] = -cloneableTags[stringTag$2] = cloneableTags[symbolTag$1] = -cloneableTags[uint8Tag$2] = cloneableTags[uint8ClampedTag$2] = -cloneableTags[uint16Tag$2] = cloneableTags[uint32Tag$2] = true; -cloneableTags[errorTag$1] = cloneableTags[funcTag$2] = -cloneableTags[weakMapTag$2] = false; - -/** - * The base implementation of `_.clone` and `_.cloneDeep` which tracks - * traversed objects. - * - * @private - * @param {*} value The value to clone. - * @param {boolean} bitmask The bitmask flags. - * 1 - Deep clone - * 2 - Flatten inherited properties - * 4 - Clone symbols - * @param {Function} [customizer] The function to customize cloning. - * @param {string} [key] The key of `value`. - * @param {Object} [object] The parent object of `value`. - * @param {Object} [stack] Tracks traversed objects and their clone counterparts. - * @returns {*} Returns the cloned value. - */ -function baseClone(value, bitmask, customizer, key, object, stack) { - var result, - isDeep = bitmask & CLONE_DEEP_FLAG, - isFlat = bitmask & CLONE_FLAT_FLAG, - isFull = bitmask & CLONE_SYMBOLS_FLAG; - - if (customizer) { - result = object ? customizer(value, key, object, stack) : customizer(value); - } - if (result !== undefined) { - return result; - } - if (!isObject_1(value)) { - return value; - } - var isArr = isArray_1(value); - if (isArr) { - result = _initCloneArray(value); - if (!isDeep) { - return _copyArray(value, result); - } - } else { - var tag = _getTag(value), - isFunc = tag == funcTag$2 || tag == genTag$1; - - if (isBuffer_1(value)) { - return _cloneBuffer(value, isDeep); - } - if (tag == objectTag$2 || tag == argsTag$2 || (isFunc && !object)) { - result = (isFlat || isFunc) ? {} : _initCloneObject(value); - if (!isDeep) { - return isFlat - ? _copySymbolsIn(value, _baseAssignIn(result, value)) - : _copySymbols(value, _baseAssign(result, value)); - } - } else { - if (!cloneableTags[tag]) { - return object ? value : {}; - } - result = _initCloneByTag(value, tag, isDeep); - } - } - // Check for circular references and return its corresponding clone. - stack || (stack = new _Stack); - var stacked = stack.get(value); - if (stacked) { - return stacked; - } - stack.set(value, result); - - if (isSet_1(value)) { - value.forEach(function(subValue) { - result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack)); - }); - } else if (isMap_1(value)) { - value.forEach(function(subValue, key) { - result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack)); - }); - } - - var keysFunc = isFull - ? (isFlat ? _getAllKeysIn : _getAllKeys) - : (isFlat ? keysIn_1 : keys_1); - - var props = isArr ? undefined : keysFunc(value); - _arrayEach(props || value, function(subValue, key) { - if (props) { - key = subValue; - subValue = value[key]; - } - // Recursively populate clone (susceptible to call stack limits). - _assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack)); - }); - return result; -} - -var _baseClone = baseClone; - -/** Used to compose bitmasks for cloning. */ -var CLONE_SYMBOLS_FLAG$1 = 4; - -/** - * Creates a shallow clone of `value`. - * - * **Note:** This method is loosely based on the - * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm) - * and supports cloning arrays, array buffers, booleans, date objects, maps, - * numbers, `Object` objects, regexes, sets, strings, symbols, and typed - * arrays. The own enumerable properties of `arguments` objects are cloned - * as plain objects. An empty object is returned for uncloneable values such - * as error objects, functions, DOM nodes, and WeakMaps. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to clone. - * @returns {*} Returns the cloned value. - * @see _.cloneDeep - * @example - * - * var objects = [{ 'a': 1 }, { 'b': 2 }]; - * - * var shallow = _.clone(objects); - * console.log(shallow[0] === objects[0]); - * // => true - */ -function clone(value) { - return _baseClone(value, CLONE_SYMBOLS_FLAG$1); -} - -var clone_1 = clone; - -/** - * Creates a function that returns `value`. - * - * @static - * @memberOf _ - * @since 2.4.0 - * @category Util - * @param {*} value The value to return from the new function. - * @returns {Function} Returns the new constant function. - * @example - * - * var objects = _.times(2, _.constant({ 'a': 1 })); - * - * console.log(objects); - * // => [{ 'a': 1 }, { 'a': 1 }] - * - * console.log(objects[0] === objects[1]); - * // => true - */ -function constant(value) { - return function() { - return value; - }; -} - -var constant_1 = constant; - -/** - * Creates a base function for methods like `_.forIn` and `_.forOwn`. - * - * @private - * @param {boolean} [fromRight] Specify iterating from right to left. - * @returns {Function} Returns the new base function. - */ -function createBaseFor(fromRight) { - return function(object, iteratee, keysFunc) { - var index = -1, - iterable = Object(object), - props = keysFunc(object), - length = props.length; - - while (length--) { - var key = props[fromRight ? length : ++index]; - if (iteratee(iterable[key], key, iterable) === false) { - break; - } - } - return object; - }; -} - -var _createBaseFor = createBaseFor; - -/** - * The base implementation of `baseForOwn` which iterates over `object` - * properties returned by `keysFunc` and invokes `iteratee` for each property. - * Iteratee functions may exit iteration early by explicitly returning `false`. - * - * @private - * @param {Object} object The object to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @param {Function} keysFunc The function to get the keys of `object`. - * @returns {Object} Returns `object`. - */ -var baseFor = _createBaseFor(); - -var _baseFor = baseFor; - -/** - * The base implementation of `_.forOwn` without support for iteratee shorthands. - * - * @private - * @param {Object} object The object to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Object} Returns `object`. - */ -function baseForOwn(object, iteratee) { - return object && _baseFor(object, iteratee, keys_1); -} - -var _baseForOwn = baseForOwn; - -/** - * Creates a `baseEach` or `baseEachRight` function. - * - * @private - * @param {Function} eachFunc The function to iterate over a collection. - * @param {boolean} [fromRight] Specify iterating from right to left. - * @returns {Function} Returns the new base function. - */ -function createBaseEach(eachFunc, fromRight) { - return function(collection, iteratee) { - if (collection == null) { - return collection; - } - if (!isArrayLike_1(collection)) { - return eachFunc(collection, iteratee); - } - var length = collection.length, - index = fromRight ? length : -1, - iterable = Object(collection); - - while ((fromRight ? index-- : ++index < length)) { - if (iteratee(iterable[index], index, iterable) === false) { - break; - } - } - return collection; - }; -} - -var _createBaseEach = createBaseEach; - -/** - * The base implementation of `_.forEach` without support for iteratee shorthands. - * - * @private - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Array|Object} Returns `collection`. - */ -var baseEach = _createBaseEach(_baseForOwn); - -var _baseEach = baseEach; - -/** - * This method returns the first argument it receives. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Util - * @param {*} value Any value. - * @returns {*} Returns `value`. - * @example - * - * var object = { 'a': 1 }; - * - * console.log(_.identity(object) === object); - * // => true - */ -function identity(value) { - return value; -} - -var identity_1 = identity; - -/** - * Casts `value` to `identity` if it's not a function. - * - * @private - * @param {*} value The value to inspect. - * @returns {Function} Returns cast function. - */ -function castFunction(value) { - return typeof value == 'function' ? value : identity_1; -} - -var _castFunction = castFunction; - -/** - * Iterates over elements of `collection` and invokes `iteratee` for each element. - * The iteratee is invoked with three arguments: (value, index|key, collection). - * Iteratee functions may exit iteration early by explicitly returning `false`. - * - * **Note:** As with other "Collections" methods, objects with a "length" - * property are iterated like arrays. To avoid this behavior use `_.forIn` - * or `_.forOwn` for object iteration. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @alias each - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @returns {Array|Object} Returns `collection`. - * @see _.forEachRight - * @example - * - * _.forEach([1, 2], function(value) { - * console.log(value); - * }); - * // => Logs `1` then `2`. - * - * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) { - * console.log(key); - * }); - * // => Logs 'a' then 'b' (iteration order is not guaranteed). - */ -function forEach(collection, iteratee) { - var func = isArray_1(collection) ? _arrayEach : _baseEach; - return func(collection, _castFunction(iteratee)); -} - -var forEach_1 = forEach; - -var each = forEach_1; - -/** - * The base implementation of `_.filter` without support for iteratee shorthands. - * - * @private - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} predicate The function invoked per iteration. - * @returns {Array} Returns the new filtered array. - */ -function baseFilter(collection, predicate) { - var result = []; - _baseEach(collection, function(value, index, collection) { - if (predicate(value, index, collection)) { - result.push(value); - } - }); - return result; -} - -var _baseFilter = baseFilter; - -/** Used to stand-in for `undefined` hash values. */ -var HASH_UNDEFINED$2 = '__lodash_hash_undefined__'; - -/** - * Adds `value` to the array cache. - * - * @private - * @name add - * @memberOf SetCache - * @alias push - * @param {*} value The value to cache. - * @returns {Object} Returns the cache instance. - */ -function setCacheAdd(value) { - this.__data__.set(value, HASH_UNDEFINED$2); - return this; -} - -var _setCacheAdd = setCacheAdd; - -/** - * Checks if `value` is in the array cache. - * - * @private - * @name has - * @memberOf SetCache - * @param {*} value The value to search for. - * @returns {number} Returns `true` if `value` is found, else `false`. - */ -function setCacheHas(value) { - return this.__data__.has(value); -} - -var _setCacheHas = setCacheHas; - -/** - * - * Creates an array cache object to store unique values. - * - * @private - * @constructor - * @param {Array} [values] The values to cache. - */ -function SetCache(values) { - var index = -1, - length = values == null ? 0 : values.length; - - this.__data__ = new _MapCache; - while (++index < length) { - this.add(values[index]); - } -} - -// Add methods to `SetCache`. -SetCache.prototype.add = SetCache.prototype.push = _setCacheAdd; -SetCache.prototype.has = _setCacheHas; - -var _SetCache = SetCache; - -/** - * A specialized version of `_.some` for arrays without support for iteratee - * shorthands. - * - * @private - * @param {Array} [array] The array to iterate over. - * @param {Function} predicate The function invoked per iteration. - * @returns {boolean} Returns `true` if any element passes the predicate check, - * else `false`. - */ -function arraySome(array, predicate) { - var index = -1, - length = array == null ? 0 : array.length; - - while (++index < length) { - if (predicate(array[index], index, array)) { - return true; - } - } - return false; -} - -var _arraySome = arraySome; - -/** - * Checks if a `cache` value for `key` exists. - * - * @private - * @param {Object} cache The cache to query. - * @param {string} key The key of the entry to check. - * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. - */ -function cacheHas(cache, key) { - return cache.has(key); -} - -var _cacheHas = cacheHas; - -/** Used to compose bitmasks for value comparisons. */ -var COMPARE_PARTIAL_FLAG = 1, - COMPARE_UNORDERED_FLAG = 2; - -/** - * A specialized version of `baseIsEqualDeep` for arrays with support for - * partial deep comparisons. - * - * @private - * @param {Array} array The array to compare. - * @param {Array} other The other array to compare. - * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. - * @param {Function} customizer The function to customize comparisons. - * @param {Function} equalFunc The function to determine equivalents of values. - * @param {Object} stack Tracks traversed `array` and `other` objects. - * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. - */ -function equalArrays(array, other, bitmask, customizer, equalFunc, stack) { - var isPartial = bitmask & COMPARE_PARTIAL_FLAG, - arrLength = array.length, - othLength = other.length; - - if (arrLength != othLength && !(isPartial && othLength > arrLength)) { - return false; - } - // Check that cyclic values are equal. - var arrStacked = stack.get(array); - var othStacked = stack.get(other); - if (arrStacked && othStacked) { - return arrStacked == other && othStacked == array; - } - var index = -1, - result = true, - seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new _SetCache : undefined; - - stack.set(array, other); - stack.set(other, array); - - // Ignore non-index properties. - while (++index < arrLength) { - var arrValue = array[index], - othValue = other[index]; - - if (customizer) { - var compared = isPartial - ? customizer(othValue, arrValue, index, other, array, stack) - : customizer(arrValue, othValue, index, array, other, stack); - } - if (compared !== undefined) { - if (compared) { - continue; - } - result = false; - break; - } - // Recursively compare arrays (susceptible to call stack limits). - if (seen) { - if (!_arraySome(other, function(othValue, othIndex) { - if (!_cacheHas(seen, othIndex) && - (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) { - return seen.push(othIndex); - } - })) { - result = false; - break; - } - } else if (!( - arrValue === othValue || - equalFunc(arrValue, othValue, bitmask, customizer, stack) - )) { - result = false; - break; - } - } - stack['delete'](array); - stack['delete'](other); - return result; -} - -var _equalArrays = equalArrays; - -/** - * Converts `map` to its key-value pairs. - * - * @private - * @param {Object} map The map to convert. - * @returns {Array} Returns the key-value pairs. - */ -function mapToArray(map) { - var index = -1, - result = Array(map.size); - - map.forEach(function(value, key) { - result[++index] = [key, value]; - }); - return result; -} - -var _mapToArray = mapToArray; - -/** - * Converts `set` to an array of its values. - * - * @private - * @param {Object} set The set to convert. - * @returns {Array} Returns the values. - */ -function setToArray(set) { - var index = -1, - result = Array(set.size); - - set.forEach(function(value) { - result[++index] = value; - }); - return result; -} - -var _setToArray = setToArray; - -/** Used to compose bitmasks for value comparisons. */ -var COMPARE_PARTIAL_FLAG$1 = 1, - COMPARE_UNORDERED_FLAG$1 = 2; - -/** `Object#toString` result references. */ -var boolTag$3 = '[object Boolean]', - dateTag$3 = '[object Date]', - errorTag$2 = '[object Error]', - mapTag$5 = '[object Map]', - numberTag$3 = '[object Number]', - regexpTag$3 = '[object RegExp]', - setTag$5 = '[object Set]', - stringTag$3 = '[object String]', - symbolTag$2 = '[object Symbol]'; - -var arrayBufferTag$3 = '[object ArrayBuffer]', - dataViewTag$4 = '[object DataView]'; - -/** Used to convert symbols to primitives and strings. */ -var symbolProto$1 = _Symbol ? _Symbol.prototype : undefined, - symbolValueOf$1 = symbolProto$1 ? symbolProto$1.valueOf : undefined; - -/** - * A specialized version of `baseIsEqualDeep` for comparing objects of - * the same `toStringTag`. - * - * **Note:** This function only supports comparing values with tags of - * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. - * - * @private - * @param {Object} object The object to compare. - * @param {Object} other The other object to compare. - * @param {string} tag The `toStringTag` of the objects to compare. - * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. - * @param {Function} customizer The function to customize comparisons. - * @param {Function} equalFunc The function to determine equivalents of values. - * @param {Object} stack Tracks traversed `object` and `other` objects. - * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. - */ -function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) { - switch (tag) { - case dataViewTag$4: - if ((object.byteLength != other.byteLength) || - (object.byteOffset != other.byteOffset)) { - return false; - } - object = object.buffer; - other = other.buffer; - - case arrayBufferTag$3: - if ((object.byteLength != other.byteLength) || - !equalFunc(new _Uint8Array(object), new _Uint8Array(other))) { - return false; - } - return true; - - case boolTag$3: - case dateTag$3: - case numberTag$3: - // Coerce booleans to `1` or `0` and dates to milliseconds. - // Invalid dates are coerced to `NaN`. - return eq_1(+object, +other); - - case errorTag$2: - return object.name == other.name && object.message == other.message; - - case regexpTag$3: - case stringTag$3: - // Coerce regexes to strings and treat strings, primitives and objects, - // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring - // for more details. - return object == (other + ''); - - case mapTag$5: - var convert = _mapToArray; - - case setTag$5: - var isPartial = bitmask & COMPARE_PARTIAL_FLAG$1; - convert || (convert = _setToArray); - - if (object.size != other.size && !isPartial) { - return false; - } - // Assume cyclic values are equal. - var stacked = stack.get(object); - if (stacked) { - return stacked == other; - } - bitmask |= COMPARE_UNORDERED_FLAG$1; - - // Recursively compare objects (susceptible to call stack limits). - stack.set(object, other); - var result = _equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack); - stack['delete'](object); - return result; - - case symbolTag$2: - if (symbolValueOf$1) { - return symbolValueOf$1.call(object) == symbolValueOf$1.call(other); - } - } - return false; -} - -var _equalByTag = equalByTag; - -/** Used to compose bitmasks for value comparisons. */ -var COMPARE_PARTIAL_FLAG$2 = 1; - -/** Used for built-in method references. */ -var objectProto$d = Object.prototype; - -/** Used to check objects for own properties. */ -var hasOwnProperty$a = objectProto$d.hasOwnProperty; - -/** - * A specialized version of `baseIsEqualDeep` for objects with support for - * partial deep comparisons. - * - * @private - * @param {Object} object The object to compare. - * @param {Object} other The other object to compare. - * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. - * @param {Function} customizer The function to customize comparisons. - * @param {Function} equalFunc The function to determine equivalents of values. - * @param {Object} stack Tracks traversed `object` and `other` objects. - * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. - */ -function equalObjects(object, other, bitmask, customizer, equalFunc, stack) { - var isPartial = bitmask & COMPARE_PARTIAL_FLAG$2, - objProps = _getAllKeys(object), - objLength = objProps.length, - othProps = _getAllKeys(other), - othLength = othProps.length; - - if (objLength != othLength && !isPartial) { - return false; - } - var index = objLength; - while (index--) { - var key = objProps[index]; - if (!(isPartial ? key in other : hasOwnProperty$a.call(other, key))) { - return false; - } - } - // Check that cyclic values are equal. - var objStacked = stack.get(object); - var othStacked = stack.get(other); - if (objStacked && othStacked) { - return objStacked == other && othStacked == object; - } - var result = true; - stack.set(object, other); - stack.set(other, object); - - var skipCtor = isPartial; - while (++index < objLength) { - key = objProps[index]; - var objValue = object[key], - othValue = other[key]; - - if (customizer) { - var compared = isPartial - ? customizer(othValue, objValue, key, other, object, stack) - : customizer(objValue, othValue, key, object, other, stack); - } - // Recursively compare objects (susceptible to call stack limits). - if (!(compared === undefined - ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack)) - : compared - )) { - result = false; - break; - } - skipCtor || (skipCtor = key == 'constructor'); - } - if (result && !skipCtor) { - var objCtor = object.constructor, - othCtor = other.constructor; - - // Non `Object` object instances with different constructors are not equal. - if (objCtor != othCtor && - ('constructor' in object && 'constructor' in other) && - !(typeof objCtor == 'function' && objCtor instanceof objCtor && - typeof othCtor == 'function' && othCtor instanceof othCtor)) { - result = false; - } - } - stack['delete'](object); - stack['delete'](other); - return result; -} - -var _equalObjects = equalObjects; - -/** Used to compose bitmasks for value comparisons. */ -var COMPARE_PARTIAL_FLAG$3 = 1; - -/** `Object#toString` result references. */ -var argsTag$3 = '[object Arguments]', - arrayTag$2 = '[object Array]', - objectTag$3 = '[object Object]'; - -/** Used for built-in method references. */ -var objectProto$e = Object.prototype; - -/** Used to check objects for own properties. */ -var hasOwnProperty$b = objectProto$e.hasOwnProperty; - -/** - * A specialized version of `baseIsEqual` for arrays and objects which performs - * deep comparisons and tracks traversed objects enabling objects with circular - * references to be compared. - * - * @private - * @param {Object} object The object to compare. - * @param {Object} other The other object to compare. - * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. - * @param {Function} customizer The function to customize comparisons. - * @param {Function} equalFunc The function to determine equivalents of values. - * @param {Object} [stack] Tracks traversed `object` and `other` objects. - * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. - */ -function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) { - var objIsArr = isArray_1(object), - othIsArr = isArray_1(other), - objTag = objIsArr ? arrayTag$2 : _getTag(object), - othTag = othIsArr ? arrayTag$2 : _getTag(other); - - objTag = objTag == argsTag$3 ? objectTag$3 : objTag; - othTag = othTag == argsTag$3 ? objectTag$3 : othTag; - - var objIsObj = objTag == objectTag$3, - othIsObj = othTag == objectTag$3, - isSameTag = objTag == othTag; - - if (isSameTag && isBuffer_1(object)) { - if (!isBuffer_1(other)) { - return false; - } - objIsArr = true; - objIsObj = false; - } - if (isSameTag && !objIsObj) { - stack || (stack = new _Stack); - return (objIsArr || isTypedArray_1(object)) - ? _equalArrays(object, other, bitmask, customizer, equalFunc, stack) - : _equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack); - } - if (!(bitmask & COMPARE_PARTIAL_FLAG$3)) { - var objIsWrapped = objIsObj && hasOwnProperty$b.call(object, '__wrapped__'), - othIsWrapped = othIsObj && hasOwnProperty$b.call(other, '__wrapped__'); - - if (objIsWrapped || othIsWrapped) { - var objUnwrapped = objIsWrapped ? object.value() : object, - othUnwrapped = othIsWrapped ? other.value() : other; - - stack || (stack = new _Stack); - return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack); - } - } - if (!isSameTag) { - return false; - } - stack || (stack = new _Stack); - return _equalObjects(object, other, bitmask, customizer, equalFunc, stack); -} - -var _baseIsEqualDeep = baseIsEqualDeep; - -/** - * The base implementation of `_.isEqual` which supports partial comparisons - * and tracks traversed objects. - * - * @private - * @param {*} value The value to compare. - * @param {*} other The other value to compare. - * @param {boolean} bitmask The bitmask flags. - * 1 - Unordered comparison - * 2 - Partial comparison - * @param {Function} [customizer] The function to customize comparisons. - * @param {Object} [stack] Tracks traversed `value` and `other` objects. - * @returns {boolean} Returns `true` if the values are equivalent, else `false`. - */ -function baseIsEqual(value, other, bitmask, customizer, stack) { - if (value === other) { - return true; - } - if (value == null || other == null || (!isObjectLike_1(value) && !isObjectLike_1(other))) { - return value !== value && other !== other; - } - return _baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack); -} - -var _baseIsEqual = baseIsEqual; - -/** Used to compose bitmasks for value comparisons. */ -var COMPARE_PARTIAL_FLAG$4 = 1, - COMPARE_UNORDERED_FLAG$2 = 2; - -/** - * The base implementation of `_.isMatch` without support for iteratee shorthands. - * - * @private - * @param {Object} object The object to inspect. - * @param {Object} source The object of property values to match. - * @param {Array} matchData The property names, values, and compare flags to match. - * @param {Function} [customizer] The function to customize comparisons. - * @returns {boolean} Returns `true` if `object` is a match, else `false`. - */ -function baseIsMatch(object, source, matchData, customizer) { - var index = matchData.length, - length = index, - noCustomizer = !customizer; - - if (object == null) { - return !length; - } - object = Object(object); - while (index--) { - var data = matchData[index]; - if ((noCustomizer && data[2]) - ? data[1] !== object[data[0]] - : !(data[0] in object) - ) { - return false; - } - } - while (++index < length) { - data = matchData[index]; - var key = data[0], - objValue = object[key], - srcValue = data[1]; - - if (noCustomizer && data[2]) { - if (objValue === undefined && !(key in object)) { - return false; - } - } else { - var stack = new _Stack; - if (customizer) { - var result = customizer(objValue, srcValue, key, object, source, stack); - } - if (!(result === undefined - ? _baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG$4 | COMPARE_UNORDERED_FLAG$2, customizer, stack) - : result - )) { - return false; - } - } - } - return true; -} - -var _baseIsMatch = baseIsMatch; - -/** - * Checks if `value` is suitable for strict equality comparisons, i.e. `===`. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` if suitable for strict - * equality comparisons, else `false`. - */ -function isStrictComparable(value) { - return value === value && !isObject_1(value); -} - -var _isStrictComparable = isStrictComparable; - -/** - * Gets the property names, values, and compare flags of `object`. - * - * @private - * @param {Object} object The object to query. - * @returns {Array} Returns the match data of `object`. - */ -function getMatchData(object) { - var result = keys_1(object), - length = result.length; - - while (length--) { - var key = result[length], - value = object[key]; - - result[length] = [key, value, _isStrictComparable(value)]; - } - return result; -} - -var _getMatchData = getMatchData; - -/** - * A specialized version of `matchesProperty` for source values suitable - * for strict equality comparisons, i.e. `===`. - * - * @private - * @param {string} key The key of the property to get. - * @param {*} srcValue The value to match. - * @returns {Function} Returns the new spec function. - */ -function matchesStrictComparable(key, srcValue) { - return function(object) { - if (object == null) { - return false; - } - return object[key] === srcValue && - (srcValue !== undefined || (key in Object(object))); - }; -} - -var _matchesStrictComparable = matchesStrictComparable; - -/** - * The base implementation of `_.matches` which doesn't clone `source`. - * - * @private - * @param {Object} source The object of property values to match. - * @returns {Function} Returns the new spec function. - */ -function baseMatches(source) { - var matchData = _getMatchData(source); - if (matchData.length == 1 && matchData[0][2]) { - return _matchesStrictComparable(matchData[0][0], matchData[0][1]); - } - return function(object) { - return object === source || _baseIsMatch(object, source, matchData); - }; -} - -var _baseMatches = baseMatches; - -/** `Object#toString` result references. */ -var symbolTag$3 = '[object Symbol]'; - -/** - * Checks if `value` is classified as a `Symbol` primitive or object. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. - * @example - * - * _.isSymbol(Symbol.iterator); - * // => true - * - * _.isSymbol('abc'); - * // => false - */ -function isSymbol(value) { - return typeof value == 'symbol' || - (isObjectLike_1(value) && _baseGetTag(value) == symbolTag$3); -} - -var isSymbol_1 = isSymbol; - -/** Used to match property names within property paths. */ -var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, - reIsPlainProp = /^\w*$/; - -/** - * Checks if `value` is a property name and not a property path. - * - * @private - * @param {*} value The value to check. - * @param {Object} [object] The object to query keys on. - * @returns {boolean} Returns `true` if `value` is a property name, else `false`. - */ -function isKey(value, object) { - if (isArray_1(value)) { - return false; - } - var type = typeof value; - if (type == 'number' || type == 'symbol' || type == 'boolean' || - value == null || isSymbol_1(value)) { - return true; - } - return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || - (object != null && value in Object(object)); -} - -var _isKey = isKey; - -/** Error message constants. */ -var FUNC_ERROR_TEXT = 'Expected a function'; - -/** - * Creates a function that memoizes the result of `func`. If `resolver` is - * provided, it determines the cache key for storing the result based on the - * arguments provided to the memoized function. By default, the first argument - * provided to the memoized function is used as the map cache key. The `func` - * is invoked with the `this` binding of the memoized function. - * - * **Note:** The cache is exposed as the `cache` property on the memoized - * function. Its creation may be customized by replacing the `_.memoize.Cache` - * constructor with one whose instances implement the - * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object) - * method interface of `clear`, `delete`, `get`, `has`, and `set`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Function - * @param {Function} func The function to have its output memoized. - * @param {Function} [resolver] The function to resolve the cache key. - * @returns {Function} Returns the new memoized function. - * @example - * - * var object = { 'a': 1, 'b': 2 }; - * var other = { 'c': 3, 'd': 4 }; - * - * var values = _.memoize(_.values); - * values(object); - * // => [1, 2] - * - * values(other); - * // => [3, 4] - * - * object.a = 2; - * values(object); - * // => [1, 2] - * - * // Modify the result cache. - * values.cache.set(object, ['a', 'b']); - * values(object); - * // => ['a', 'b'] - * - * // Replace `_.memoize.Cache`. - * _.memoize.Cache = WeakMap; - */ -function memoize(func, resolver) { - if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) { - throw new TypeError(FUNC_ERROR_TEXT); - } - var memoized = function() { - var args = arguments, - key = resolver ? resolver.apply(this, args) : args[0], - cache = memoized.cache; - - if (cache.has(key)) { - return cache.get(key); - } - var result = func.apply(this, args); - memoized.cache = cache.set(key, result) || cache; - return result; - }; - memoized.cache = new (memoize.Cache || _MapCache); - return memoized; -} - -// Expose `MapCache`. -memoize.Cache = _MapCache; - -var memoize_1 = memoize; - -/** Used as the maximum memoize cache size. */ -var MAX_MEMOIZE_SIZE = 500; - -/** - * A specialized version of `_.memoize` which clears the memoized function's - * cache when it exceeds `MAX_MEMOIZE_SIZE`. - * - * @private - * @param {Function} func The function to have its output memoized. - * @returns {Function} Returns the new memoized function. - */ -function memoizeCapped(func) { - var result = memoize_1(func, function(key) { - if (cache.size === MAX_MEMOIZE_SIZE) { - cache.clear(); - } - return key; - }); - - var cache = result.cache; - return result; -} - -var _memoizeCapped = memoizeCapped; - -/** Used to match property names within property paths. */ -var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; - -/** Used to match backslashes in property paths. */ -var reEscapeChar = /\\(\\)?/g; - -/** - * Converts `string` to a property path array. - * - * @private - * @param {string} string The string to convert. - * @returns {Array} Returns the property path array. - */ -var stringToPath = _memoizeCapped(function(string) { - var result = []; - if (string.charCodeAt(0) === 46 /* . */) { - result.push(''); - } - string.replace(rePropName, function(match, number, quote, subString) { - result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match)); - }); - return result; -}); - -var _stringToPath = stringToPath; - -/** - * A specialized version of `_.map` for arrays without support for iteratee - * shorthands. - * - * @private - * @param {Array} [array] The array to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Array} Returns the new mapped array. - */ -function arrayMap(array, iteratee) { - var index = -1, - length = array == null ? 0 : array.length, - result = Array(length); - - while (++index < length) { - result[index] = iteratee(array[index], index, array); - } - return result; -} - -var _arrayMap = arrayMap; - -/** Used as references for various `Number` constants. */ -var INFINITY = 1 / 0; - -/** Used to convert symbols to primitives and strings. */ -var symbolProto$2 = _Symbol ? _Symbol.prototype : undefined, - symbolToString = symbolProto$2 ? symbolProto$2.toString : undefined; - -/** - * The base implementation of `_.toString` which doesn't convert nullish - * values to empty strings. - * - * @private - * @param {*} value The value to process. - * @returns {string} Returns the string. - */ -function baseToString(value) { - // Exit early for strings to avoid a performance hit in some environments. - if (typeof value == 'string') { - return value; - } - if (isArray_1(value)) { - // Recursively convert values (susceptible to call stack limits). - return _arrayMap(value, baseToString) + ''; - } - if (isSymbol_1(value)) { - return symbolToString ? symbolToString.call(value) : ''; - } - var result = (value + ''); - return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; -} - -var _baseToString = baseToString; - -/** - * Converts `value` to a string. An empty string is returned for `null` - * and `undefined` values. The sign of `-0` is preserved. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to convert. - * @returns {string} Returns the converted string. - * @example - * - * _.toString(null); - * // => '' - * - * _.toString(-0); - * // => '-0' - * - * _.toString([1, 2, 3]); - * // => '1,2,3' - */ -function toString(value) { - return value == null ? '' : _baseToString(value); -} - -var toString_1 = toString; - -/** - * Casts `value` to a path array if it's not one. - * - * @private - * @param {*} value The value to inspect. - * @param {Object} [object] The object to query keys on. - * @returns {Array} Returns the cast property path array. - */ -function castPath(value, object) { - if (isArray_1(value)) { - return value; - } - return _isKey(value, object) ? [value] : _stringToPath(toString_1(value)); -} - -var _castPath = castPath; - -/** Used as references for various `Number` constants. */ -var INFINITY$1 = 1 / 0; - -/** - * Converts `value` to a string key if it's not a string or symbol. - * - * @private - * @param {*} value The value to inspect. - * @returns {string|symbol} Returns the key. - */ -function toKey(value) { - if (typeof value == 'string' || isSymbol_1(value)) { - return value; - } - var result = (value + ''); - return (result == '0' && (1 / value) == -INFINITY$1) ? '-0' : result; -} - -var _toKey = toKey; - -/** - * The base implementation of `_.get` without support for default values. - * - * @private - * @param {Object} object The object to query. - * @param {Array|string} path The path of the property to get. - * @returns {*} Returns the resolved value. - */ -function baseGet(object, path) { - path = _castPath(path, object); - - var index = 0, - length = path.length; - - while (object != null && index < length) { - object = object[_toKey(path[index++])]; - } - return (index && index == length) ? object : undefined; -} - -var _baseGet = baseGet; - -/** - * Gets the value at `path` of `object`. If the resolved value is - * `undefined`, the `defaultValue` is returned in its place. - * - * @static - * @memberOf _ - * @since 3.7.0 - * @category Object - * @param {Object} object The object to query. - * @param {Array|string} path The path of the property to get. - * @param {*} [defaultValue] The value returned for `undefined` resolved values. - * @returns {*} Returns the resolved value. - * @example - * - * var object = { 'a': [{ 'b': { 'c': 3 } }] }; - * - * _.get(object, 'a[0].b.c'); - * // => 3 - * - * _.get(object, ['a', '0', 'b', 'c']); - * // => 3 - * - * _.get(object, 'a.b.c', 'default'); - * // => 'default' - */ -function get(object, path, defaultValue) { - var result = object == null ? undefined : _baseGet(object, path); - return result === undefined ? defaultValue : result; -} - -var get_1 = get; - -/** - * The base implementation of `_.hasIn` without support for deep paths. - * - * @private - * @param {Object} [object] The object to query. - * @param {Array|string} key The key to check. - * @returns {boolean} Returns `true` if `key` exists, else `false`. - */ -function baseHasIn(object, key) { - return object != null && key in Object(object); -} - -var _baseHasIn = baseHasIn; - -/** - * Checks if `path` exists on `object`. - * - * @private - * @param {Object} object The object to query. - * @param {Array|string} path The path to check. - * @param {Function} hasFunc The function to check properties. - * @returns {boolean} Returns `true` if `path` exists, else `false`. - */ -function hasPath(object, path, hasFunc) { - path = _castPath(path, object); - - var index = -1, - length = path.length, - result = false; - - while (++index < length) { - var key = _toKey(path[index]); - if (!(result = object != null && hasFunc(object, key))) { - break; - } - object = object[key]; - } - if (result || ++index != length) { - return result; - } - length = object == null ? 0 : object.length; - return !!length && isLength_1(length) && _isIndex(key, length) && - (isArray_1(object) || isArguments_1(object)); -} - -var _hasPath = hasPath; - -/** - * Checks if `path` is a direct or inherited property of `object`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Object - * @param {Object} object The object to query. - * @param {Array|string} path The path to check. - * @returns {boolean} Returns `true` if `path` exists, else `false`. - * @example - * - * var object = _.create({ 'a': _.create({ 'b': 2 }) }); - * - * _.hasIn(object, 'a'); - * // => true - * - * _.hasIn(object, 'a.b'); - * // => true - * - * _.hasIn(object, ['a', 'b']); - * // => true - * - * _.hasIn(object, 'b'); - * // => false - */ -function hasIn(object, path) { - return object != null && _hasPath(object, path, _baseHasIn); -} - -var hasIn_1 = hasIn; - -/** Used to compose bitmasks for value comparisons. */ -var COMPARE_PARTIAL_FLAG$5 = 1, - COMPARE_UNORDERED_FLAG$3 = 2; - -/** - * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`. - * - * @private - * @param {string} path The path of the property to get. - * @param {*} srcValue The value to match. - * @returns {Function} Returns the new spec function. - */ -function baseMatchesProperty(path, srcValue) { - if (_isKey(path) && _isStrictComparable(srcValue)) { - return _matchesStrictComparable(_toKey(path), srcValue); - } - return function(object) { - var objValue = get_1(object, path); - return (objValue === undefined && objValue === srcValue) - ? hasIn_1(object, path) - : _baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG$5 | COMPARE_UNORDERED_FLAG$3); - }; -} - -var _baseMatchesProperty = baseMatchesProperty; - -/** - * The base implementation of `_.property` without support for deep paths. - * - * @private - * @param {string} key The key of the property to get. - * @returns {Function} Returns the new accessor function. - */ -function baseProperty(key) { - return function(object) { - return object == null ? undefined : object[key]; - }; -} - -var _baseProperty = baseProperty; - -/** - * A specialized version of `baseProperty` which supports deep paths. - * - * @private - * @param {Array|string} path The path of the property to get. - * @returns {Function} Returns the new accessor function. - */ -function basePropertyDeep(path) { - return function(object) { - return _baseGet(object, path); - }; -} - -var _basePropertyDeep = basePropertyDeep; - -/** - * Creates a function that returns the value at `path` of a given object. - * - * @static - * @memberOf _ - * @since 2.4.0 - * @category Util - * @param {Array|string} path The path of the property to get. - * @returns {Function} Returns the new accessor function. - * @example - * - * var objects = [ - * { 'a': { 'b': 2 } }, - * { 'a': { 'b': 1 } } - * ]; - * - * _.map(objects, _.property('a.b')); - * // => [2, 1] - * - * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b'); - * // => [1, 2] - */ -function property(path) { - return _isKey(path) ? _baseProperty(_toKey(path)) : _basePropertyDeep(path); -} - -var property_1 = property; - -/** - * The base implementation of `_.iteratee`. - * - * @private - * @param {*} [value=_.identity] The value to convert to an iteratee. - * @returns {Function} Returns the iteratee. - */ -function baseIteratee(value) { - // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9. - // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details. - if (typeof value == 'function') { - return value; - } - if (value == null) { - return identity_1; - } - if (typeof value == 'object') { - return isArray_1(value) - ? _baseMatchesProperty(value[0], value[1]) - : _baseMatches(value); - } - return property_1(value); -} - -var _baseIteratee = baseIteratee; - -/** - * Iterates over elements of `collection`, returning an array of all elements - * `predicate` returns truthy for. The predicate is invoked with three - * arguments: (value, index|key, collection). - * - * **Note:** Unlike `_.remove`, this method returns a new array. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [predicate=_.identity] The function invoked per iteration. - * @returns {Array} Returns the new filtered array. - * @see _.reject - * @example - * - * var users = [ - * { 'user': 'barney', 'age': 36, 'active': true }, - * { 'user': 'fred', 'age': 40, 'active': false } - * ]; - * - * _.filter(users, function(o) { return !o.active; }); - * // => objects for ['fred'] - * - * // The `_.matches` iteratee shorthand. - * _.filter(users, { 'age': 36, 'active': true }); - * // => objects for ['barney'] - * - * // The `_.matchesProperty` iteratee shorthand. - * _.filter(users, ['active', false]); - * // => objects for ['fred'] - * - * // The `_.property` iteratee shorthand. - * _.filter(users, 'active'); - * // => objects for ['barney'] - * - * // Combining several predicates using `_.overEvery` or `_.overSome`. - * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]])); - * // => objects for ['fred', 'barney'] - */ -function filter(collection, predicate) { - var func = isArray_1(collection) ? _arrayFilter : _baseFilter; - return func(collection, _baseIteratee(predicate)); -} - -var filter_1 = filter; - -/** Used for built-in method references. */ -var objectProto$f = Object.prototype; - -/** Used to check objects for own properties. */ -var hasOwnProperty$c = objectProto$f.hasOwnProperty; - -/** - * The base implementation of `_.has` without support for deep paths. - * - * @private - * @param {Object} [object] The object to query. - * @param {Array|string} key The key to check. - * @returns {boolean} Returns `true` if `key` exists, else `false`. - */ -function baseHas(object, key) { - return object != null && hasOwnProperty$c.call(object, key); -} - -var _baseHas = baseHas; - -/** - * Checks if `path` is a direct property of `object`. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Object - * @param {Object} object The object to query. - * @param {Array|string} path The path to check. - * @returns {boolean} Returns `true` if `path` exists, else `false`. - * @example - * - * var object = { 'a': { 'b': 2 } }; - * var other = _.create({ 'a': _.create({ 'b': 2 }) }); - * - * _.has(object, 'a'); - * // => true - * - * _.has(object, 'a.b'); - * // => true - * - * _.has(object, ['a', 'b']); - * // => true - * - * _.has(other, 'a'); - * // => false - */ -function has(object, path) { - return object != null && _hasPath(object, path, _baseHas); -} - -var has_1 = has; - -/** `Object#toString` result references. */ -var mapTag$6 = '[object Map]', - setTag$6 = '[object Set]'; - -/** Used for built-in method references. */ -var objectProto$g = Object.prototype; - -/** Used to check objects for own properties. */ -var hasOwnProperty$d = objectProto$g.hasOwnProperty; - -/** - * Checks if `value` is an empty object, collection, map, or set. - * - * Objects are considered empty if they have no own enumerable string keyed - * properties. - * - * Array-like values such as `arguments` objects, arrays, buffers, strings, or - * jQuery-like collections are considered empty if they have a `length` of `0`. - * Similarly, maps and sets are considered empty if they have a `size` of `0`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is empty, else `false`. - * @example - * - * _.isEmpty(null); - * // => true - * - * _.isEmpty(true); - * // => true - * - * _.isEmpty(1); - * // => true - * - * _.isEmpty([1, 2, 3]); - * // => false - * - * _.isEmpty({ 'a': 1 }); - * // => false - */ -function isEmpty(value) { - if (value == null) { - return true; - } - if (isArrayLike_1(value) && - (isArray_1(value) || typeof value == 'string' || typeof value.splice == 'function' || - isBuffer_1(value) || isTypedArray_1(value) || isArguments_1(value))) { - return !value.length; - } - var tag = _getTag(value); - if (tag == mapTag$6 || tag == setTag$6) { - return !value.size; - } - if (_isPrototype(value)) { - return !_baseKeys(value).length; - } - for (var key in value) { - if (hasOwnProperty$d.call(value, key)) { - return false; - } - } - return true; -} - -var isEmpty_1 = isEmpty; - -/** - * Checks if `value` is `undefined`. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`. - * @example - * - * _.isUndefined(void 0); - * // => true - * - * _.isUndefined(null); - * // => false - */ -function isUndefined(value) { - return value === undefined; -} - -var isUndefined_1 = isUndefined; - -/** - * The base implementation of `_.map` without support for iteratee shorthands. - * - * @private - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Array} Returns the new mapped array. - */ -function baseMap(collection, iteratee) { - var index = -1, - result = isArrayLike_1(collection) ? Array(collection.length) : []; - - _baseEach(collection, function(value, key, collection) { - result[++index] = iteratee(value, key, collection); - }); - return result; -} - -var _baseMap = baseMap; - -/** - * Creates an array of values by running each element in `collection` thru - * `iteratee`. The iteratee is invoked with three arguments: - * (value, index|key, collection). - * - * Many lodash methods are guarded to work as iteratees for methods like - * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`. - * - * The guarded methods are: - * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`, - * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`, - * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`, - * `template`, `trim`, `trimEnd`, `trimStart`, and `words` - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @returns {Array} Returns the new mapped array. - * @example - * - * function square(n) { - * return n * n; - * } - * - * _.map([4, 8], square); - * // => [16, 64] - * - * _.map({ 'a': 4, 'b': 8 }, square); - * // => [16, 64] (iteration order is not guaranteed) - * - * var users = [ - * { 'user': 'barney' }, - * { 'user': 'fred' } - * ]; - * - * // The `_.property` iteratee shorthand. - * _.map(users, 'user'); - * // => ['barney', 'fred'] - */ -function map(collection, iteratee) { - var func = isArray_1(collection) ? _arrayMap : _baseMap; - return func(collection, _baseIteratee(iteratee)); -} - -var map_1 = map; - -/** - * A specialized version of `_.reduce` for arrays without support for - * iteratee shorthands. - * - * @private - * @param {Array} [array] The array to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @param {*} [accumulator] The initial value. - * @param {boolean} [initAccum] Specify using the first element of `array` as - * the initial value. - * @returns {*} Returns the accumulated value. - */ -function arrayReduce(array, iteratee, accumulator, initAccum) { - var index = -1, - length = array == null ? 0 : array.length; - - if (initAccum && length) { - accumulator = array[++index]; - } - while (++index < length) { - accumulator = iteratee(accumulator, array[index], index, array); - } - return accumulator; -} - -var _arrayReduce = arrayReduce; - -/** - * The base implementation of `_.reduce` and `_.reduceRight`, without support - * for iteratee shorthands, which iterates over `collection` using `eachFunc`. - * - * @private - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @param {*} accumulator The initial value. - * @param {boolean} initAccum Specify using the first or last element of - * `collection` as the initial value. - * @param {Function} eachFunc The function to iterate over `collection`. - * @returns {*} Returns the accumulated value. - */ -function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) { - eachFunc(collection, function(value, index, collection) { - accumulator = initAccum - ? (initAccum = false, value) - : iteratee(accumulator, value, index, collection); - }); - return accumulator; -} - -var _baseReduce = baseReduce; - -/** - * Reduces `collection` to a value which is the accumulated result of running - * each element in `collection` thru `iteratee`, where each successive - * invocation is supplied the return value of the previous. If `accumulator` - * is not given, the first element of `collection` is used as the initial - * value. The iteratee is invoked with four arguments: - * (accumulator, value, index|key, collection). - * - * Many lodash methods are guarded to work as iteratees for methods like - * `_.reduce`, `_.reduceRight`, and `_.transform`. - * - * The guarded methods are: - * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`, - * and `sortBy` - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @param {*} [accumulator] The initial value. - * @returns {*} Returns the accumulated value. - * @see _.reduceRight - * @example - * - * _.reduce([1, 2], function(sum, n) { - * return sum + n; - * }, 0); - * // => 3 - * - * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) { - * (result[value] || (result[value] = [])).push(key); - * return result; - * }, {}); - * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed) - */ -function reduce(collection, iteratee, accumulator) { - var func = isArray_1(collection) ? _arrayReduce : _baseReduce, - initAccum = arguments.length < 3; - - return func(collection, _baseIteratee(iteratee), accumulator, initAccum, _baseEach); -} - -var reduce_1 = reduce; - -/** `Object#toString` result references. */ -var stringTag$4 = '[object String]'; - -/** - * Checks if `value` is classified as a `String` primitive or object. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a string, else `false`. - * @example - * - * _.isString('abc'); - * // => true - * - * _.isString(1); - * // => false - */ -function isString(value) { - return typeof value == 'string' || - (!isArray_1(value) && isObjectLike_1(value) && _baseGetTag(value) == stringTag$4); -} - -var isString_1 = isString; - -/** - * Gets the size of an ASCII `string`. - * - * @private - * @param {string} string The string inspect. - * @returns {number} Returns the string size. - */ -var asciiSize = _baseProperty('length'); - -var _asciiSize = asciiSize; - -/** Used to compose unicode character classes. */ -var rsAstralRange = '\\ud800-\\udfff', - rsComboMarksRange = '\\u0300-\\u036f', - reComboHalfMarksRange = '\\ufe20-\\ufe2f', - rsComboSymbolsRange = '\\u20d0-\\u20ff', - rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, - rsVarRange = '\\ufe0e\\ufe0f'; - -/** Used to compose unicode capture groups. */ -var rsZWJ = '\\u200d'; - -/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */ -var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']'); - -/** - * Checks if `string` contains Unicode symbols. - * - * @private - * @param {string} string The string to inspect. - * @returns {boolean} Returns `true` if a symbol is found, else `false`. - */ -function hasUnicode(string) { - return reHasUnicode.test(string); -} - -var _hasUnicode = hasUnicode; - -/** Used to compose unicode character classes. */ -var rsAstralRange$1 = '\\ud800-\\udfff', - rsComboMarksRange$1 = '\\u0300-\\u036f', - reComboHalfMarksRange$1 = '\\ufe20-\\ufe2f', - rsComboSymbolsRange$1 = '\\u20d0-\\u20ff', - rsComboRange$1 = rsComboMarksRange$1 + reComboHalfMarksRange$1 + rsComboSymbolsRange$1, - rsVarRange$1 = '\\ufe0e\\ufe0f'; - -/** Used to compose unicode capture groups. */ -var rsAstral = '[' + rsAstralRange$1 + ']', - rsCombo = '[' + rsComboRange$1 + ']', - rsFitz = '\\ud83c[\\udffb-\\udfff]', - rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')', - rsNonAstral = '[^' + rsAstralRange$1 + ']', - rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}', - rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]', - rsZWJ$1 = '\\u200d'; - -/** Used to compose unicode regexes. */ -var reOptMod = rsModifier + '?', - rsOptVar = '[' + rsVarRange$1 + ']?', - rsOptJoin = '(?:' + rsZWJ$1 + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*', - rsSeq = rsOptVar + reOptMod + rsOptJoin, - rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')'; - -/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */ -var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g'); - -/** - * Gets the size of a Unicode `string`. - * - * @private - * @param {string} string The string inspect. - * @returns {number} Returns the string size. - */ -function unicodeSize(string) { - var result = reUnicode.lastIndex = 0; - while (reUnicode.test(string)) { - ++result; - } - return result; -} - -var _unicodeSize = unicodeSize; - -/** - * Gets the number of symbols in `string`. - * - * @private - * @param {string} string The string to inspect. - * @returns {number} Returns the string size. - */ -function stringSize(string) { - return _hasUnicode(string) - ? _unicodeSize(string) - : _asciiSize(string); -} - -var _stringSize = stringSize; - -/** `Object#toString` result references. */ -var mapTag$7 = '[object Map]', - setTag$7 = '[object Set]'; - -/** - * Gets the size of `collection` by returning its length for array-like - * values or the number of own enumerable string keyed properties for objects. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object|string} collection The collection to inspect. - * @returns {number} Returns the collection size. - * @example - * - * _.size([1, 2, 3]); - * // => 3 - * - * _.size({ 'a': 1, 'b': 2 }); - * // => 2 - * - * _.size('pebbles'); - * // => 7 - */ -function size(collection) { - if (collection == null) { - return 0; - } - if (isArrayLike_1(collection)) { - return isString_1(collection) ? _stringSize(collection) : collection.length; - } - var tag = _getTag(collection); - if (tag == mapTag$7 || tag == setTag$7) { - return collection.size; - } - return _baseKeys(collection).length; -} - -var size_1 = size; - -/** - * An alternative to `_.reduce`; this method transforms `object` to a new - * `accumulator` object which is the result of running each of its own - * enumerable string keyed properties thru `iteratee`, with each invocation - * potentially mutating the `accumulator` object. If `accumulator` is not - * provided, a new object with the same `[[Prototype]]` will be used. The - * iteratee is invoked with four arguments: (accumulator, value, key, object). - * Iteratee functions may exit iteration early by explicitly returning `false`. - * - * @static - * @memberOf _ - * @since 1.3.0 - * @category Object - * @param {Object} object The object to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @param {*} [accumulator] The custom accumulator value. - * @returns {*} Returns the accumulated value. - * @example - * - * _.transform([2, 3, 4], function(result, n) { - * result.push(n *= n); - * return n % 2 == 0; - * }, []); - * // => [4, 9] - * - * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) { - * (result[value] || (result[value] = [])).push(key); - * }, {}); - * // => { '1': ['a', 'c'], '2': ['b'] } - */ -function transform(object, iteratee, accumulator) { - var isArr = isArray_1(object), - isArrLike = isArr || isBuffer_1(object) || isTypedArray_1(object); - - iteratee = _baseIteratee(iteratee); - if (accumulator == null) { - var Ctor = object && object.constructor; - if (isArrLike) { - accumulator = isArr ? new Ctor : []; - } - else if (isObject_1(object)) { - accumulator = isFunction_1(Ctor) ? _baseCreate(_getPrototype(object)) : {}; - } - else { - accumulator = {}; - } - } - (isArrLike ? _arrayEach : _baseForOwn)(object, function(value, index, object) { - return iteratee(accumulator, value, index, object); - }); - return accumulator; -} - -var transform_1 = transform; - -/** Built-in value references. */ -var spreadableSymbol = _Symbol ? _Symbol.isConcatSpreadable : undefined; - -/** - * Checks if `value` is a flattenable `arguments` object or array. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is flattenable, else `false`. - */ -function isFlattenable(value) { - return isArray_1(value) || isArguments_1(value) || - !!(spreadableSymbol && value && value[spreadableSymbol]); -} - -var _isFlattenable = isFlattenable; - -/** - * The base implementation of `_.flatten` with support for restricting flattening. - * - * @private - * @param {Array} array The array to flatten. - * @param {number} depth The maximum recursion depth. - * @param {boolean} [predicate=isFlattenable] The function invoked per iteration. - * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks. - * @param {Array} [result=[]] The initial result value. - * @returns {Array} Returns the new flattened array. - */ -function baseFlatten(array, depth, predicate, isStrict, result) { - var index = -1, - length = array.length; - - predicate || (predicate = _isFlattenable); - result || (result = []); - - while (++index < length) { - var value = array[index]; - if (depth > 0 && predicate(value)) { - if (depth > 1) { - // Recursively flatten arrays (susceptible to call stack limits). - baseFlatten(value, depth - 1, predicate, isStrict, result); - } else { - _arrayPush(result, value); - } - } else if (!isStrict) { - result[result.length] = value; - } - } - return result; -} - -var _baseFlatten = baseFlatten; - -/** - * A faster alternative to `Function#apply`, this function invokes `func` - * with the `this` binding of `thisArg` and the arguments of `args`. - * - * @private - * @param {Function} func The function to invoke. - * @param {*} thisArg The `this` binding of `func`. - * @param {Array} args The arguments to invoke `func` with. - * @returns {*} Returns the result of `func`. - */ -function apply(func, thisArg, args) { - switch (args.length) { - case 0: return func.call(thisArg); - case 1: return func.call(thisArg, args[0]); - case 2: return func.call(thisArg, args[0], args[1]); - case 3: return func.call(thisArg, args[0], args[1], args[2]); - } - return func.apply(thisArg, args); -} - -var _apply = apply; - -/* Built-in method references for those with the same name as other `lodash` methods. */ -var nativeMax = Math.max; - -/** - * A specialized version of `baseRest` which transforms the rest array. - * - * @private - * @param {Function} func The function to apply a rest parameter to. - * @param {number} [start=func.length-1] The start position of the rest parameter. - * @param {Function} transform The rest array transform. - * @returns {Function} Returns the new function. - */ -function overRest(func, start, transform) { - start = nativeMax(start === undefined ? (func.length - 1) : start, 0); - return function() { - var args = arguments, - index = -1, - length = nativeMax(args.length - start, 0), - array = Array(length); - - while (++index < length) { - array[index] = args[start + index]; - } - index = -1; - var otherArgs = Array(start + 1); - while (++index < start) { - otherArgs[index] = args[index]; - } - otherArgs[start] = transform(array); - return _apply(func, this, otherArgs); - }; -} - -var _overRest = overRest; - -/** - * The base implementation of `setToString` without support for hot loop shorting. - * - * @private - * @param {Function} func The function to modify. - * @param {Function} string The `toString` result. - * @returns {Function} Returns `func`. - */ -var baseSetToString = !_defineProperty ? identity_1 : function(func, string) { - return _defineProperty(func, 'toString', { - 'configurable': true, - 'enumerable': false, - 'value': constant_1(string), - 'writable': true - }); -}; - -var _baseSetToString = baseSetToString; - -/** Used to detect hot functions by number of calls within a span of milliseconds. */ -var HOT_COUNT = 800, - HOT_SPAN = 16; - -/* Built-in method references for those with the same name as other `lodash` methods. */ -var nativeNow = Date.now; - -/** - * Creates a function that'll short out and invoke `identity` instead - * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN` - * milliseconds. - * - * @private - * @param {Function} func The function to restrict. - * @returns {Function} Returns the new shortable function. - */ -function shortOut(func) { - var count = 0, - lastCalled = 0; - - return function() { - var stamp = nativeNow(), - remaining = HOT_SPAN - (stamp - lastCalled); - - lastCalled = stamp; - if (remaining > 0) { - if (++count >= HOT_COUNT) { - return arguments[0]; - } - } else { - count = 0; - } - return func.apply(undefined, arguments); - }; -} - -var _shortOut = shortOut; - -/** - * Sets the `toString` method of `func` to return `string`. - * - * @private - * @param {Function} func The function to modify. - * @param {Function} string The `toString` result. - * @returns {Function} Returns `func`. - */ -var setToString = _shortOut(_baseSetToString); - -var _setToString = setToString; - -/** - * The base implementation of `_.rest` which doesn't validate or coerce arguments. - * - * @private - * @param {Function} func The function to apply a rest parameter to. - * @param {number} [start=func.length-1] The start position of the rest parameter. - * @returns {Function} Returns the new function. - */ -function baseRest(func, start) { - return _setToString(_overRest(func, start, identity_1), func + ''); -} - -var _baseRest = baseRest; - -/** - * The base implementation of `_.findIndex` and `_.findLastIndex` without - * support for iteratee shorthands. - * - * @private - * @param {Array} array The array to inspect. - * @param {Function} predicate The function invoked per iteration. - * @param {number} fromIndex The index to search from. - * @param {boolean} [fromRight] Specify iterating from right to left. - * @returns {number} Returns the index of the matched value, else `-1`. - */ -function baseFindIndex(array, predicate, fromIndex, fromRight) { - var length = array.length, - index = fromIndex + (fromRight ? 1 : -1); - - while ((fromRight ? index-- : ++index < length)) { - if (predicate(array[index], index, array)) { - return index; - } - } - return -1; -} - -var _baseFindIndex = baseFindIndex; - -/** - * The base implementation of `_.isNaN` without support for number objects. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. - */ -function baseIsNaN(value) { - return value !== value; -} - -var _baseIsNaN = baseIsNaN; - -/** - * A specialized version of `_.indexOf` which performs strict equality - * comparisons of values, i.e. `===`. - * - * @private - * @param {Array} array The array to inspect. - * @param {*} value The value to search for. - * @param {number} fromIndex The index to search from. - * @returns {number} Returns the index of the matched value, else `-1`. - */ -function strictIndexOf(array, value, fromIndex) { - var index = fromIndex - 1, - length = array.length; - - while (++index < length) { - if (array[index] === value) { - return index; - } - } - return -1; -} - -var _strictIndexOf = strictIndexOf; - -/** - * The base implementation of `_.indexOf` without `fromIndex` bounds checks. - * - * @private - * @param {Array} array The array to inspect. - * @param {*} value The value to search for. - * @param {number} fromIndex The index to search from. - * @returns {number} Returns the index of the matched value, else `-1`. - */ -function baseIndexOf(array, value, fromIndex) { - return value === value - ? _strictIndexOf(array, value, fromIndex) - : _baseFindIndex(array, _baseIsNaN, fromIndex); -} - -var _baseIndexOf = baseIndexOf; - -/** - * A specialized version of `_.includes` for arrays without support for - * specifying an index to search from. - * - * @private - * @param {Array} [array] The array to inspect. - * @param {*} target The value to search for. - * @returns {boolean} Returns `true` if `target` is found, else `false`. - */ -function arrayIncludes(array, value) { - var length = array == null ? 0 : array.length; - return !!length && _baseIndexOf(array, value, 0) > -1; -} - -var _arrayIncludes = arrayIncludes; - -/** - * This function is like `arrayIncludes` except that it accepts a comparator. - * - * @private - * @param {Array} [array] The array to inspect. - * @param {*} target The value to search for. - * @param {Function} comparator The comparator invoked per element. - * @returns {boolean} Returns `true` if `target` is found, else `false`. - */ -function arrayIncludesWith(array, value, comparator) { - var index = -1, - length = array == null ? 0 : array.length; - - while (++index < length) { - if (comparator(value, array[index])) { - return true; - } - } - return false; -} - -var _arrayIncludesWith = arrayIncludesWith; - -/** - * This method returns `undefined`. - * - * @static - * @memberOf _ - * @since 2.3.0 - * @category Util - * @example - * - * _.times(2, _.noop); - * // => [undefined, undefined] - */ -function noop() { - // No operation performed. -} - -var noop_1 = noop; - -/** Used as references for various `Number` constants. */ -var INFINITY$2 = 1 / 0; - -/** - * Creates a set object of `values`. - * - * @private - * @param {Array} values The values to add to the set. - * @returns {Object} Returns the new set. - */ -var createSet = !(_Set && (1 / _setToArray(new _Set([,-0]))[1]) == INFINITY$2) ? noop_1 : function(values) { - return new _Set(values); -}; - -var _createSet = createSet; - -/** Used as the size to enable large array optimizations. */ -var LARGE_ARRAY_SIZE$1 = 200; - -/** - * The base implementation of `_.uniqBy` without support for iteratee shorthands. - * - * @private - * @param {Array} array The array to inspect. - * @param {Function} [iteratee] The iteratee invoked per element. - * @param {Function} [comparator] The comparator invoked per element. - * @returns {Array} Returns the new duplicate free array. - */ -function baseUniq(array, iteratee, comparator) { - var index = -1, - includes = _arrayIncludes, - length = array.length, - isCommon = true, - result = [], - seen = result; - - if (comparator) { - isCommon = false; - includes = _arrayIncludesWith; - } - else if (length >= LARGE_ARRAY_SIZE$1) { - var set = iteratee ? null : _createSet(array); - if (set) { - return _setToArray(set); - } - isCommon = false; - includes = _cacheHas; - seen = new _SetCache; - } - else { - seen = iteratee ? [] : result; - } - outer: - while (++index < length) { - var value = array[index], - computed = iteratee ? iteratee(value) : value; - - value = (comparator || value !== 0) ? value : 0; - if (isCommon && computed === computed) { - var seenIndex = seen.length; - while (seenIndex--) { - if (seen[seenIndex] === computed) { - continue outer; - } - } - if (iteratee) { - seen.push(computed); - } - result.push(value); - } - else if (!includes(seen, computed, comparator)) { - if (seen !== result) { - seen.push(computed); - } - result.push(value); - } - } - return result; -} - -var _baseUniq = baseUniq; - -/** - * This method is like `_.isArrayLike` except that it also checks if `value` - * is an object. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an array-like object, - * else `false`. - * @example - * - * _.isArrayLikeObject([1, 2, 3]); - * // => true - * - * _.isArrayLikeObject(document.body.children); - * // => true - * - * _.isArrayLikeObject('abc'); - * // => false - * - * _.isArrayLikeObject(_.noop); - * // => false - */ -function isArrayLikeObject(value) { - return isObjectLike_1(value) && isArrayLike_1(value); -} - -var isArrayLikeObject_1 = isArrayLikeObject; - -/** - * Creates an array of unique values, in order, from all given arrays using - * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) - * for equality comparisons. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Array - * @param {...Array} [arrays] The arrays to inspect. - * @returns {Array} Returns the new array of combined values. - * @example - * - * _.union([2], [1, 2]); - * // => [2, 1] - */ -var union = _baseRest(function(arrays) { - return _baseUniq(_baseFlatten(arrays, 1, isArrayLikeObject_1, true)); -}); - -var union_1 = union; - -/** - * The base implementation of `_.values` and `_.valuesIn` which creates an - * array of `object` property values corresponding to the property names - * of `props`. - * - * @private - * @param {Object} object The object to query. - * @param {Array} props The property names to get values for. - * @returns {Object} Returns the array of property values. - */ -function baseValues(object, props) { - return _arrayMap(props, function(key) { - return object[key]; - }); -} - -var _baseValues = baseValues; - -/** - * Creates an array of the own enumerable string keyed property values of `object`. - * - * **Note:** Non-object values are coerced to objects. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Object - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property values. - * @example - * - * function Foo() { - * this.a = 1; - * this.b = 2; - * } - * - * Foo.prototype.c = 3; - * - * _.values(new Foo); - * // => [1, 2] (iteration order is not guaranteed) - * - * _.values('hi'); - * // => ['h', 'i'] - */ -function values(object) { - return object == null ? [] : _baseValues(object, keys_1(object)); -} - -var values_1 = values; - -/* global window */ - -var lodash; - -if (typeof commonjsRequire === "function") { - try { - lodash = { - clone: clone_1, - constant: constant_1, - each: each, - filter: filter_1, - has: has_1, - isArray: isArray_1, - isEmpty: isEmpty_1, - isFunction: isFunction_1, - isUndefined: isUndefined_1, - keys: keys_1, - map: map_1, - reduce: reduce_1, - size: size_1, - transform: transform_1, - union: union_1, - values: values_1 - }; - } catch (e) { - // continue regardless of error - } -} - -if (!lodash) { - lodash = window._; -} - -var lodash_1 = lodash; - -var graph = Graph; - -var DEFAULT_EDGE_NAME = "\x00"; -var GRAPH_NODE = "\x00"; -var EDGE_KEY_DELIM = "\x01"; - -// Implementation notes: -// -// * Node id query functions should return string ids for the nodes -// * Edge id query functions should return an "edgeObj", edge object, that is -// composed of enough information to uniquely identify an edge: {v, w, name}. -// * Internally we use an "edgeId", a stringified form of the edgeObj, to -// reference edges. This is because we need a performant way to look these -// edges up and, object properties, which have string keys, are the closest -// we're going to get to a performant hashtable in JavaScript. - -function Graph(opts) { - this._isDirected = lodash_1.has(opts, "directed") ? opts.directed : true; - this._isMultigraph = lodash_1.has(opts, "multigraph") ? opts.multigraph : false; - this._isCompound = lodash_1.has(opts, "compound") ? opts.compound : false; - - // Label for the graph itself - this._label = undefined; - - // Defaults to be set when creating a new node - this._defaultNodeLabelFn = lodash_1.constant(undefined); - - // Defaults to be set when creating a new edge - this._defaultEdgeLabelFn = lodash_1.constant(undefined); - - // v -> label - this._nodes = {}; - - if (this._isCompound) { - // v -> parent - this._parent = {}; - - // v -> children - this._children = {}; - this._children[GRAPH_NODE] = {}; - } - - // v -> edgeObj - this._in = {}; - - // u -> v -> Number - this._preds = {}; - - // v -> edgeObj - this._out = {}; - - // v -> w -> Number - this._sucs = {}; - - // e -> edgeObj - this._edgeObjs = {}; - - // e -> label - this._edgeLabels = {}; -} - -/* Number of nodes in the graph. Should only be changed by the implementation. */ -Graph.prototype._nodeCount = 0; - -/* Number of edges in the graph. Should only be changed by the implementation. */ -Graph.prototype._edgeCount = 0; - - -/* === Graph functions ========= */ - -Graph.prototype.isDirected = function() { - return this._isDirected; -}; - -Graph.prototype.isMultigraph = function() { - return this._isMultigraph; -}; - -Graph.prototype.isCompound = function() { - return this._isCompound; -}; - -Graph.prototype.setGraph = function(label) { - this._label = label; - return this; -}; - -Graph.prototype.graph = function() { - return this._label; -}; - - -/* === Node functions ========== */ - -Graph.prototype.setDefaultNodeLabel = function(newDefault) { - if (!lodash_1.isFunction(newDefault)) { - newDefault = lodash_1.constant(newDefault); - } - this._defaultNodeLabelFn = newDefault; - return this; -}; - -Graph.prototype.nodeCount = function() { - return this._nodeCount; -}; - -Graph.prototype.nodes = function() { - return lodash_1.keys(this._nodes); -}; - -Graph.prototype.sources = function() { - var self = this; - return lodash_1.filter(this.nodes(), function(v) { - return lodash_1.isEmpty(self._in[v]); - }); -}; - -Graph.prototype.sinks = function() { - var self = this; - return lodash_1.filter(this.nodes(), function(v) { - return lodash_1.isEmpty(self._out[v]); - }); -}; - -Graph.prototype.setNodes = function(vs, value) { - var args = arguments; - var self = this; - lodash_1.each(vs, function(v) { - if (args.length > 1) { - self.setNode(v, value); - } else { - self.setNode(v); - } - }); - return this; -}; - -Graph.prototype.setNode = function(v, value) { - if (lodash_1.has(this._nodes, v)) { - if (arguments.length > 1) { - this._nodes[v] = value; - } - return this; - } - - this._nodes[v] = arguments.length > 1 ? value : this._defaultNodeLabelFn(v); - if (this._isCompound) { - this._parent[v] = GRAPH_NODE; - this._children[v] = {}; - this._children[GRAPH_NODE][v] = true; - } - this._in[v] = {}; - this._preds[v] = {}; - this._out[v] = {}; - this._sucs[v] = {}; - ++this._nodeCount; - return this; -}; - -Graph.prototype.node = function(v) { - return this._nodes[v]; -}; - -Graph.prototype.hasNode = function(v) { - return lodash_1.has(this._nodes, v); -}; - -Graph.prototype.removeNode = function(v) { - var self = this; - if (lodash_1.has(this._nodes, v)) { - var removeEdge = function(e) { self.removeEdge(self._edgeObjs[e]); }; - delete this._nodes[v]; - if (this._isCompound) { - this._removeFromParentsChildList(v); - delete this._parent[v]; - lodash_1.each(this.children(v), function(child) { - self.setParent(child); - }); - delete this._children[v]; - } - lodash_1.each(lodash_1.keys(this._in[v]), removeEdge); - delete this._in[v]; - delete this._preds[v]; - lodash_1.each(lodash_1.keys(this._out[v]), removeEdge); - delete this._out[v]; - delete this._sucs[v]; - --this._nodeCount; - } - return this; -}; - -Graph.prototype.setParent = function(v, parent) { - if (!this._isCompound) { - throw new Error("Cannot set parent in a non-compound graph"); - } - - if (lodash_1.isUndefined(parent)) { - parent = GRAPH_NODE; - } else { - // Coerce parent to string - parent += ""; - for (var ancestor = parent; - !lodash_1.isUndefined(ancestor); - ancestor = this.parent(ancestor)) { - if (ancestor === v) { - throw new Error("Setting " + parent+ " as parent of " + v + - " would create a cycle"); - } - } - - this.setNode(parent); - } - - this.setNode(v); - this._removeFromParentsChildList(v); - this._parent[v] = parent; - this._children[parent][v] = true; - return this; -}; - -Graph.prototype._removeFromParentsChildList = function(v) { - delete this._children[this._parent[v]][v]; -}; - -Graph.prototype.parent = function(v) { - if (this._isCompound) { - var parent = this._parent[v]; - if (parent !== GRAPH_NODE) { - return parent; - } - } -}; - -Graph.prototype.children = function(v) { - if (lodash_1.isUndefined(v)) { - v = GRAPH_NODE; - } - - if (this._isCompound) { - var children = this._children[v]; - if (children) { - return lodash_1.keys(children); - } - } else if (v === GRAPH_NODE) { - return this.nodes(); - } else if (this.hasNode(v)) { - return []; - } -}; - -Graph.prototype.predecessors = function(v) { - var predsV = this._preds[v]; - if (predsV) { - return lodash_1.keys(predsV); - } -}; - -Graph.prototype.successors = function(v) { - var sucsV = this._sucs[v]; - if (sucsV) { - return lodash_1.keys(sucsV); - } -}; - -Graph.prototype.neighbors = function(v) { - var preds = this.predecessors(v); - if (preds) { - return lodash_1.union(preds, this.successors(v)); - } -}; - -Graph.prototype.isLeaf = function (v) { - var neighbors; - if (this.isDirected()) { - neighbors = this.successors(v); - } else { - neighbors = this.neighbors(v); - } - return neighbors.length === 0; -}; - -Graph.prototype.filterNodes = function(filter) { - var copy = new this.constructor({ - directed: this._isDirected, - multigraph: this._isMultigraph, - compound: this._isCompound - }); - - copy.setGraph(this.graph()); - - var self = this; - lodash_1.each(this._nodes, function(value, v) { - if (filter(v)) { - copy.setNode(v, value); - } - }); - - lodash_1.each(this._edgeObjs, function(e) { - if (copy.hasNode(e.v) && copy.hasNode(e.w)) { - copy.setEdge(e, self.edge(e)); - } - }); - - var parents = {}; - function findParent(v) { - var parent = self.parent(v); - if (parent === undefined || copy.hasNode(parent)) { - parents[v] = parent; - return parent; - } else if (parent in parents) { - return parents[parent]; - } else { - return findParent(parent); - } - } - - if (this._isCompound) { - lodash_1.each(copy.nodes(), function(v) { - copy.setParent(v, findParent(v)); - }); - } - - return copy; -}; - -/* === Edge functions ========== */ - -Graph.prototype.setDefaultEdgeLabel = function(newDefault) { - if (!lodash_1.isFunction(newDefault)) { - newDefault = lodash_1.constant(newDefault); - } - this._defaultEdgeLabelFn = newDefault; - return this; -}; - -Graph.prototype.edgeCount = function() { - return this._edgeCount; -}; - -Graph.prototype.edges = function() { - return lodash_1.values(this._edgeObjs); -}; - -Graph.prototype.setPath = function(vs, value) { - var self = this; - var args = arguments; - lodash_1.reduce(vs, function(v, w) { - if (args.length > 1) { - self.setEdge(v, w, value); - } else { - self.setEdge(v, w); - } - return w; - }); - return this; -}; - -/* - * setEdge(v, w, [value, [name]]) - * setEdge({ v, w, [name] }, [value]) - */ -Graph.prototype.setEdge = function() { - var v, w, name, value; - var valueSpecified = false; - var arg0 = arguments[0]; - - if (typeof arg0 === "object" && arg0 !== null && "v" in arg0) { - v = arg0.v; - w = arg0.w; - name = arg0.name; - if (arguments.length === 2) { - value = arguments[1]; - valueSpecified = true; - } - } else { - v = arg0; - w = arguments[1]; - name = arguments[3]; - if (arguments.length > 2) { - value = arguments[2]; - valueSpecified = true; - } - } - - v = "" + v; - w = "" + w; - if (!lodash_1.isUndefined(name)) { - name = "" + name; - } - - var e = edgeArgsToId(this._isDirected, v, w, name); - if (lodash_1.has(this._edgeLabels, e)) { - if (valueSpecified) { - this._edgeLabels[e] = value; - } - return this; - } - - if (!lodash_1.isUndefined(name) && !this._isMultigraph) { - throw new Error("Cannot set a named edge when isMultigraph = false"); - } - - // It didn't exist, so we need to create it. - // First ensure the nodes exist. - this.setNode(v); - this.setNode(w); - - this._edgeLabels[e] = valueSpecified ? value : this._defaultEdgeLabelFn(v, w, name); - - var edgeObj = edgeArgsToObj(this._isDirected, v, w, name); - // Ensure we add undirected edges in a consistent way. - v = edgeObj.v; - w = edgeObj.w; - - Object.freeze(edgeObj); - this._edgeObjs[e] = edgeObj; - incrementOrInitEntry(this._preds[w], v); - incrementOrInitEntry(this._sucs[v], w); - this._in[w][e] = edgeObj; - this._out[v][e] = edgeObj; - this._edgeCount++; - return this; -}; - -Graph.prototype.edge = function(v, w, name) { - var e = (arguments.length === 1 - ? edgeObjToId(this._isDirected, arguments[0]) - : edgeArgsToId(this._isDirected, v, w, name)); - return this._edgeLabels[e]; -}; - -Graph.prototype.hasEdge = function(v, w, name) { - var e = (arguments.length === 1 - ? edgeObjToId(this._isDirected, arguments[0]) - : edgeArgsToId(this._isDirected, v, w, name)); - return lodash_1.has(this._edgeLabels, e); -}; - -Graph.prototype.removeEdge = function(v, w, name) { - var e = (arguments.length === 1 - ? edgeObjToId(this._isDirected, arguments[0]) - : edgeArgsToId(this._isDirected, v, w, name)); - var edge = this._edgeObjs[e]; - if (edge) { - v = edge.v; - w = edge.w; - delete this._edgeLabels[e]; - delete this._edgeObjs[e]; - decrementOrRemoveEntry(this._preds[w], v); - decrementOrRemoveEntry(this._sucs[v], w); - delete this._in[w][e]; - delete this._out[v][e]; - this._edgeCount--; - } - return this; -}; - -Graph.prototype.inEdges = function(v, u) { - var inV = this._in[v]; - if (inV) { - var edges = lodash_1.values(inV); - if (!u) { - return edges; - } - return lodash_1.filter(edges, function(edge) { return edge.v === u; }); - } -}; - -Graph.prototype.outEdges = function(v, w) { - var outV = this._out[v]; - if (outV) { - var edges = lodash_1.values(outV); - if (!w) { - return edges; - } - return lodash_1.filter(edges, function(edge) { return edge.w === w; }); - } -}; - -Graph.prototype.nodeEdges = function(v, w) { - var inEdges = this.inEdges(v, w); - if (inEdges) { - return inEdges.concat(this.outEdges(v, w)); - } -}; - -function incrementOrInitEntry(map, k) { - if (map[k]) { - map[k]++; - } else { - map[k] = 1; - } -} - -function decrementOrRemoveEntry(map, k) { - if (!--map[k]) { delete map[k]; } -} - -function edgeArgsToId(isDirected, v_, w_, name) { - var v = "" + v_; - var w = "" + w_; - if (!isDirected && v > w) { - var tmp = v; - v = w; - w = tmp; - } - return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM + - (lodash_1.isUndefined(name) ? DEFAULT_EDGE_NAME : name); -} - -function edgeArgsToObj(isDirected, v_, w_, name) { - var v = "" + v_; - var w = "" + w_; - if (!isDirected && v > w) { - var tmp = v; - v = w; - w = tmp; - } - var edgeObj = { v: v, w: w }; - if (name) { - edgeObj.name = name; - } - return edgeObj; -} - -function edgeObjToId(isDirected, edgeObj) { - return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name); -} - -var version = '2.1.8'; - -// Includes only the "core" of graphlib -var lib = { - Graph: graph, - version: version -}; - -var json = { - write: write, - read: read -}; - -function write(g) { - var json = { - options: { - directed: g.isDirected(), - multigraph: g.isMultigraph(), - compound: g.isCompound() - }, - nodes: writeNodes(g), - edges: writeEdges(g) - }; - if (!lodash_1.isUndefined(g.graph())) { - json.value = lodash_1.clone(g.graph()); - } - return json; -} - -function writeNodes(g) { - return lodash_1.map(g.nodes(), function(v) { - var nodeValue = g.node(v); - var parent = g.parent(v); - var node = { v: v }; - if (!lodash_1.isUndefined(nodeValue)) { - node.value = nodeValue; - } - if (!lodash_1.isUndefined(parent)) { - node.parent = parent; - } - return node; - }); -} - -function writeEdges(g) { - return lodash_1.map(g.edges(), function(e) { - var edgeValue = g.edge(e); - var edge = { v: e.v, w: e.w }; - if (!lodash_1.isUndefined(e.name)) { - edge.name = e.name; - } - if (!lodash_1.isUndefined(edgeValue)) { - edge.value = edgeValue; - } - return edge; - }); -} - -function read(json) { - var g = new graph(json.options).setGraph(json.value); - lodash_1.each(json.nodes, function(entry) { - g.setNode(entry.v, entry.value); - if (entry.parent) { - g.setParent(entry.v, entry.parent); - } - }); - lodash_1.each(json.edges, function(entry) { - g.setEdge({ v: entry.v, w: entry.w, name: entry.name }, entry.value); - }); - return g; -} - -var components_1 = components; - -function components(g) { - var visited = {}; - var cmpts = []; - var cmpt; - - function dfs(v) { - if (lodash_1.has(visited, v)) return; - visited[v] = true; - cmpt.push(v); - lodash_1.each(g.successors(v), dfs); - lodash_1.each(g.predecessors(v), dfs); - } - - lodash_1.each(g.nodes(), function(v) { - cmpt = []; - dfs(v); - if (cmpt.length) { - cmpts.push(cmpt); - } - }); - - return cmpts; -} - -var priorityQueue = PriorityQueue; - -/** - * A min-priority queue data structure. This algorithm is derived from Cormen, - * et al., "Introduction to Algorithms". The basic idea of a min-priority - * queue is that you can efficiently (in O(1) time) get the smallest key in - * the queue. Adding and removing elements takes O(log n) time. A key can - * have its priority decreased in O(log n) time. - */ -function PriorityQueue() { - this._arr = []; - this._keyIndices = {}; -} - -/** - * Returns the number of elements in the queue. Takes `O(1)` time. - */ -PriorityQueue.prototype.size = function() { - return this._arr.length; -}; - -/** - * Returns the keys that are in the queue. Takes `O(n)` time. - */ -PriorityQueue.prototype.keys = function() { - return this._arr.map(function(x) { return x.key; }); -}; - -/** - * Returns `true` if **key** is in the queue and `false` if not. - */ -PriorityQueue.prototype.has = function(key) { - return lodash_1.has(this._keyIndices, key); -}; - -/** - * Returns the priority for **key**. If **key** is not present in the queue - * then this function returns `undefined`. Takes `O(1)` time. - * - * @param {Object} key - */ -PriorityQueue.prototype.priority = function(key) { - var index = this._keyIndices[key]; - if (index !== undefined) { - return this._arr[index].priority; - } -}; - -/** - * Returns the key for the minimum element in this queue. If the queue is - * empty this function throws an Error. Takes `O(1)` time. - */ -PriorityQueue.prototype.min = function() { - if (this.size() === 0) { - throw new Error("Queue underflow"); - } - return this._arr[0].key; -}; - -/** - * Inserts a new key into the priority queue. If the key already exists in - * the queue this function returns `false`; otherwise it will return `true`. - * Takes `O(n)` time. - * - * @param {Object} key the key to add - * @param {Number} priority the initial priority for the key - */ -PriorityQueue.prototype.add = function(key, priority) { - var keyIndices = this._keyIndices; - key = String(key); - if (!lodash_1.has(keyIndices, key)) { - var arr = this._arr; - var index = arr.length; - keyIndices[key] = index; - arr.push({key: key, priority: priority}); - this._decrease(index); - return true; - } - return false; -}; - -/** - * Removes and returns the smallest key in the queue. Takes `O(log n)` time. - */ -PriorityQueue.prototype.removeMin = function() { - this._swap(0, this._arr.length - 1); - var min = this._arr.pop(); - delete this._keyIndices[min.key]; - this._heapify(0); - return min.key; -}; - -/** - * Decreases the priority for **key** to **priority**. If the new priority is - * greater than the previous priority, this function will throw an Error. - * - * @param {Object} key the key for which to raise priority - * @param {Number} priority the new priority for the key - */ -PriorityQueue.prototype.decrease = function(key, priority) { - var index = this._keyIndices[key]; - if (priority > this._arr[index].priority) { - throw new Error("New priority is greater than current priority. " + - "Key: " + key + " Old: " + this._arr[index].priority + " New: " + priority); - } - this._arr[index].priority = priority; - this._decrease(index); -}; - -PriorityQueue.prototype._heapify = function(i) { - var arr = this._arr; - var l = 2 * i; - var r = l + 1; - var largest = i; - if (l < arr.length) { - largest = arr[l].priority < arr[largest].priority ? l : largest; - if (r < arr.length) { - largest = arr[r].priority < arr[largest].priority ? r : largest; - } - if (largest !== i) { - this._swap(i, largest); - this._heapify(largest); - } - } -}; - -PriorityQueue.prototype._decrease = function(index) { - var arr = this._arr; - var priority = arr[index].priority; - var parent; - while (index !== 0) { - parent = index >> 1; - if (arr[parent].priority < priority) { - break; - } - this._swap(index, parent); - index = parent; - } -}; - -PriorityQueue.prototype._swap = function(i, j) { - var arr = this._arr; - var keyIndices = this._keyIndices; - var origArrI = arr[i]; - var origArrJ = arr[j]; - arr[i] = origArrJ; - arr[j] = origArrI; - keyIndices[origArrJ.key] = i; - keyIndices[origArrI.key] = j; -}; - -var dijkstra_1 = dijkstra; - -var DEFAULT_WEIGHT_FUNC = lodash_1.constant(1); - -function dijkstra(g, source, weightFn, edgeFn) { - return runDijkstra(g, String(source), - weightFn || DEFAULT_WEIGHT_FUNC, - edgeFn || function(v) { return g.outEdges(v); }); -} - -function runDijkstra(g, source, weightFn, edgeFn) { - var results = {}; - var pq = new priorityQueue(); - var v, vEntry; - - var updateNeighbors = function(edge) { - var w = edge.v !== v ? edge.v : edge.w; - var wEntry = results[w]; - var weight = weightFn(edge); - var distance = vEntry.distance + weight; - - if (weight < 0) { - throw new Error("dijkstra does not allow negative edge weights. " + - "Bad edge: " + edge + " Weight: " + weight); - } - - if (distance < wEntry.distance) { - wEntry.distance = distance; - wEntry.predecessor = v; - pq.decrease(w, distance); - } - }; - - g.nodes().forEach(function(v) { - var distance = v === source ? 0 : Number.POSITIVE_INFINITY; - results[v] = { distance: distance }; - pq.add(v, distance); - }); - - while (pq.size() > 0) { - v = pq.removeMin(); - vEntry = results[v]; - if (vEntry.distance === Number.POSITIVE_INFINITY) { - break; - } - - edgeFn(v).forEach(updateNeighbors); - } - - return results; -} - -var dijkstraAll_1 = dijkstraAll; - -function dijkstraAll(g, weightFunc, edgeFunc) { - return lodash_1.transform(g.nodes(), function(acc, v) { - acc[v] = dijkstra_1(g, v, weightFunc, edgeFunc); - }, {}); -} - -var tarjan_1 = tarjan; - -function tarjan(g) { - var index = 0; - var stack = []; - var visited = {}; // node id -> { onStack, lowlink, index } - var results = []; - - function dfs(v) { - var entry = visited[v] = { - onStack: true, - lowlink: index, - index: index++ - }; - stack.push(v); - - g.successors(v).forEach(function(w) { - if (!lodash_1.has(visited, w)) { - dfs(w); - entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink); - } else if (visited[w].onStack) { - entry.lowlink = Math.min(entry.lowlink, visited[w].index); - } - }); - - if (entry.lowlink === entry.index) { - var cmpt = []; - var w; - do { - w = stack.pop(); - visited[w].onStack = false; - cmpt.push(w); - } while (v !== w); - results.push(cmpt); - } - } - - g.nodes().forEach(function(v) { - if (!lodash_1.has(visited, v)) { - dfs(v); - } - }); - - return results; -} - -var findCycles_1 = findCycles; - -function findCycles(g) { - return lodash_1.filter(tarjan_1(g), function(cmpt) { - return cmpt.length > 1 || (cmpt.length === 1 && g.hasEdge(cmpt[0], cmpt[0])); - }); -} - -var floydWarshall_1 = floydWarshall; - -var DEFAULT_WEIGHT_FUNC$1 = lodash_1.constant(1); - -function floydWarshall(g, weightFn, edgeFn) { - return runFloydWarshall(g, - weightFn || DEFAULT_WEIGHT_FUNC$1, - edgeFn || function(v) { return g.outEdges(v); }); -} - -function runFloydWarshall(g, weightFn, edgeFn) { - var results = {}; - var nodes = g.nodes(); - - nodes.forEach(function(v) { - results[v] = {}; - results[v][v] = { distance: 0 }; - nodes.forEach(function(w) { - if (v !== w) { - results[v][w] = { distance: Number.POSITIVE_INFINITY }; - } - }); - edgeFn(v).forEach(function(edge) { - var w = edge.v === v ? edge.w : edge.v; - var d = weightFn(edge); - results[v][w] = { distance: d, predecessor: v }; - }); - }); - - nodes.forEach(function(k) { - var rowK = results[k]; - nodes.forEach(function(i) { - var rowI = results[i]; - nodes.forEach(function(j) { - var ik = rowI[k]; - var kj = rowK[j]; - var ij = rowI[j]; - var altDistance = ik.distance + kj.distance; - if (altDistance < ij.distance) { - ij.distance = altDistance; - ij.predecessor = kj.predecessor; - } - }); - }); - }); - - return results; -} - -var topsort_1 = topsort; -topsort.CycleException = CycleException; - -function topsort(g) { - var visited = {}; - var stack = {}; - var results = []; - - function visit(node) { - if (lodash_1.has(stack, node)) { - throw new CycleException(); - } - - if (!lodash_1.has(visited, node)) { - stack[node] = true; - visited[node] = true; - lodash_1.each(g.predecessors(node), visit); - delete stack[node]; - results.push(node); - } - } - - lodash_1.each(g.sinks(), visit); - - if (lodash_1.size(visited) !== g.nodeCount()) { - throw new CycleException(); - } - - return results; -} - -function CycleException() {} -CycleException.prototype = new Error(); // must be an instance of Error to pass testing - -var isAcyclic_1 = isAcyclic; - -function isAcyclic(g) { - try { - topsort_1(g); - } catch (e) { - if (e instanceof topsort_1.CycleException) { - return false; - } - throw e; - } - return true; -} - -var dfs_1 = dfs; - -/* - * A helper that preforms a pre- or post-order traversal on the input graph - * and returns the nodes in the order they were visited. If the graph is - * undirected then this algorithm will navigate using neighbors. If the graph - * is directed then this algorithm will navigate using successors. - * - * Order must be one of "pre" or "post". - */ -function dfs(g, vs, order) { - if (!lodash_1.isArray(vs)) { - vs = [vs]; - } - - var navigation = (g.isDirected() ? g.successors : g.neighbors).bind(g); - - var acc = []; - var visited = {}; - lodash_1.each(vs, function(v) { - if (!g.hasNode(v)) { - throw new Error("Graph does not have node: " + v); - } - - doDfs(g, v, order === "post", visited, navigation, acc); - }); - return acc; -} - -function doDfs(g, v, postorder, visited, navigation, acc) { - if (!lodash_1.has(visited, v)) { - visited[v] = true; - - if (!postorder) { acc.push(v); } - lodash_1.each(navigation(v), function(w) { - doDfs(g, w, postorder, visited, navigation, acc); - }); - if (postorder) { acc.push(v); } - } -} - -var postorder_1 = postorder; - -function postorder(g, vs) { - return dfs_1(g, vs, "post"); -} - -var preorder_1 = preorder; - -function preorder(g, vs) { - return dfs_1(g, vs, "pre"); -} - -var prim_1 = prim; - -function prim(g, weightFunc) { - var result = new graph(); - var parents = {}; - var pq = new priorityQueue(); - var v; - - function updateNeighbors(edge) { - var w = edge.v === v ? edge.w : edge.v; - var pri = pq.priority(w); - if (pri !== undefined) { - var edgeWeight = weightFunc(edge); - if (edgeWeight < pri) { - parents[w] = v; - pq.decrease(w, edgeWeight); - } - } - } - - if (g.nodeCount() === 0) { - return result; - } - - lodash_1.each(g.nodes(), function(v) { - pq.add(v, Number.POSITIVE_INFINITY); - result.setNode(v); - }); - - // Start from an arbitrary node - pq.decrease(g.nodes()[0], 0); - - var init = false; - while (pq.size() > 0) { - v = pq.removeMin(); - if (lodash_1.has(parents, v)) { - result.setEdge(v, parents[v]); - } else if (init) { - throw new Error("Input graph is not connected: " + g); - } else { - init = true; - } - - g.nodeEdges(v).forEach(updateNeighbors); - } - - return result; -} - -var alg = { - components: components_1, - dijkstra: dijkstra_1, - dijkstraAll: dijkstraAll_1, - findCycles: findCycles_1, - floydWarshall: floydWarshall_1, - isAcyclic: isAcyclic_1, - postorder: postorder_1, - preorder: preorder_1, - prim: prim_1, - tarjan: tarjan_1, - topsort: topsort_1 -}; - -/** - * Copyright (c) 2014, Chris Pettitt - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * 3. Neither the name of the copyright holder nor the names of its contributors - * may be used to endorse or promote products derived from this software without - * specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - - -var graphlib = { - Graph: lib.Graph, - json: json, - alg: alg, - version: lib.version -}; - -obsidian.addIcon('journey', '\n' + - '\n' + - '\n' + - '\n' + - '\n' + - '\n' + - '\n' + - '\n' + - '\n' + - ''); -var JourneyPlugin = /** @class */ (function (_super) { - __extends(JourneyPlugin, _super); - function JourneyPlugin() { - return _super !== null && _super.apply(this, arguments) || this; - } - JourneyPlugin.prototype.onload = function () { - return __awaiter(this, void 0, void 0, function () { - var _this = this; - return __generator(this, function (_a) { - this.loadSettings(); - this.addSettingTab(new JourneyPluginSettingsTab(this.app, this)); - this.addRibbonIcon('journey', 'Find Journey', function () { - _this.startSearch(); - }); - return [2 /*return*/]; - }); - }); - }; - JourneyPlugin.prototype.findShortestPath = function (start, end) { - return __awaiter(this, void 0, void 0, function () { - var startBasename, endBasename, resolvedLinks, g, _a, _b, _i, key, filePath, nodeBasename, clean, i, valueMap, outboundLinkCounter, linkKey, linkKey, target, targetClean, clean, i, text, result, ts, i, tag, searchResult, finalList, step; - return __generator(this, function (_c) { - switch (_c.label) { - case 0: - startBasename = start; - endBasename = end; - resolvedLinks = this.app.metadataCache.resolvedLinks; - g = new graphlib.Graph({}); - _a = []; - for (_b in resolvedLinks) - _a.push(_b); - _i = 0; - _c.label = 1; - case 1: - if (!(_i < _a.length)) return [3 /*break*/, 4]; - key = _a[_i]; - filePath = key; - nodeBasename = filePath // filePath.replace(".md", ""); - ; - // skipping/excluding node creation based on folders - if (this.settings.skipFoldersList().length > 0) { - clean = true; - for (i = 0; i <= this.settings.skipFoldersList().length; i++) { - if (nodeBasename.contains(this.settings.skipFoldersList()[i])) { - // console.log("Skipping adding " + nodeBasename + " as node"); - clean = false; - } - } - // skip this loop - if (!clean) { - return [3 /*break*/, 3]; - } - } - g.setNode(nodeBasename); - valueMap = resolvedLinks[key]; - outboundLinkCounter = 0; - if (this.settings.skipMOCs) { - for (linkKey in valueMap) { - outboundLinkCounter++; - } - } - if (!this.settings.skipMOCs || !(outboundLinkCounter > this.settings.MOCMaxLinks)) { - // look at each link - for (linkKey in valueMap) { - target = linkKey; - targetClean = target; - // exclude/skip folders forward/backward link - if (this.settings.skipFoldersList().length > 0) { - clean = true; - for (i = 0; i <= this.settings.skipFoldersList().length; i++) { - if (targetClean.contains(this.settings.skipFoldersList()[i])) { - clean = false; - } - } - if (!clean) { - continue; - } - } - if (this.settings.useForwardLinks) { - // console.log(" Adding FORWARDLINK edge " + nodeBasename + " -> " + target); - g.setEdge(nodeBasename, targetClean); - } - // allow backlinks - if (this.settings.useBackLinks) { - // console.log(" Adding BACKLINK edge " + target + " -> " + nodeBasename); - g.setEdge(targetClean, nodeBasename); - } - } - } - if (!this.settings.useTags) return [3 /*break*/, 3]; - return [4 /*yield*/, this.app.vault.adapter.read(filePath)]; - case 2: - text = _c.sent(); - result = text.matchAll(/\#[\w|äÄöÖüÜß\/\-\_]+/gmi); - ts = Array.from(result); - for (i = 0; i < ts.length; i++) { - tag = String(ts[i]); - // @ts-ignore - tag = tag.trim(); - if (!g.hasNode(tag)) { - // console.log("Adding Tag node" + tag) - g.setNode(tag); - } - if (!g.hasEdge(nodeBasename, tag)) { - // console.log("Adding edge " + nodeBasename + " -> " + tag); - g.setEdge(nodeBasename, tag); - } - if (!g.hasEdge(tag, nodeBasename)) { - // console.log("Adding edge " + tag + " -> " + nodeBasename); - g.setEdge(tag, nodeBasename); - } - } - _c.label = 3; - case 3: - _i++; - return [3 /*break*/, 1]; - case 4: - searchResult = graphlib.alg.dijkstra(g, startBasename); - finalList = new Array(); - // console.log(searchResult); - if (searchResult[endBasename] !== undefined && searchResult[endBasename].distance !== Infinity) { - step = searchResult[endBasename]; - finalList.push(endBasename); - while (step.distance != 0) { - finalList.push(step.predecessor); - step = searchResult[step.predecessor]; - } - } - this.searchModal.close(); - this.searchModal = new SearchModal(this.app, this); - this.resultsModal = new ResultsModal(this.app, this); - this.resultsModal.results = finalList; - this.resultsModal.startBasename = startBasename; - this.resultsModal.endBasename = endBasename; - this.resultsModal.open(); - return [2 /*return*/]; - } - }); - }); - }; - JourneyPlugin.prototype.startSearch = function () { - this.searchModal = new SearchModal(this.app, this); - this.searchModal.open(); - }; - JourneyPlugin.prototype.loadSettings = function () { - var _this = this; - this.settings = new JourneyPluginSettings(); - (function () { return __awaiter(_this, void 0, void 0, function () { - var loadedSettings; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: return [4 /*yield*/, this.loadData()]; - case 1: - loadedSettings = _a.sent(); - if (loadedSettings) { - this.settings.useForwardLinks = loadedSettings.useForwardLinks; - this.settings.useBackLinks = loadedSettings.useBackLinks; - this.settings.useTags = loadedSettings.useTags; - this.settings.skipMOCs = loadedSettings.skipMOCs; - this.settings.MOCMaxLinks = loadedSettings.MOCMaxLinks; - this.settings.enableHighContrast = loadedSettings.enableHighContrast; - this.settings.skipFolders = loadedSettings.skipFolders; - this.settings.enableLinks = loadedSettings.enableLinks; - this.settings.enableTransclusion = loadedSettings.enableTransclusion; - } - else { - this.saveData(this.settings); - } - return [2 /*return*/]; - } - }); - }); })(); - }; - return JourneyPlugin; -}(obsidian.Plugin)); -var SearchModal = /** @class */ (function (_super) { - __extends(SearchModal, _super); - function SearchModal(app, plugin) { - var _this = _super.call(this, app) || this; - _this.plugin = plugin; - return _this; - } - SearchModal.prototype.onOpen = function () { - var contentEl = this.contentEl; - contentEl.createEl("h2", { text: "Find the Story Between Two Notes" }); - this.formDiv = contentEl.createDiv({ cls: 'journey-search-form' }); - this.setupFileList(); - this.addStartSearchComponent(); - this.addEndSearchComponent(); - this.addSearchButton(contentEl); - this.addLuckyButton(); - this.addSearchSettingsDisplay(); - }; - SearchModal.prototype.findRandomNoteBasename = function () { - // console.log(this.filePathList); - var rand = Math.floor(Math.random() * this.filePathList.length) + 1; - return this.filePathList[rand]; - }; - SearchModal.prototype.setupFileList = function () { - var resolvedLinks = this.app.metadataCache.resolvedLinks; - this.filePathList = []; - // console.log(this.plugin.settings.skipFoldersList()); - for (var key in resolvedLinks) { - var filePath = key; - // exclude folders if set - if (this.plugin.settings.skipFoldersList().length > 0) { - var clean = true; - for (var i = 0; i < this.plugin.settings.skipFoldersList().length; i++) { - if (filePath.contains(this.plugin.settings.skipFoldersList()[i])) { - clean = false; - // console.log("Skipping adding " + filePath + " as search option because " + this.plugin.settings.skipFoldersList()[i]); - } - } - // if it's still clean... - if (clean) { - this.filePathList.push(filePath); - } - } - else { - this.filePathList.push(filePath); - } - } - }; - SearchModal.prototype.addSearchSettingsDisplay = function () { - // add showing which settings are on - this.formDiv.createEl("br"); - var via = "Settings: "; - if (this.plugin.settings.useForwardLinks) { - via += "✔ Forwardlinks "; - } - if (this.plugin.settings.useBackLinks) { - via += "✔ Backlinks "; - } - if (this.plugin.settings.useTags) { - via += "✔ Tags"; - } - var avoid = ""; - if (this.plugin.settings.skipMOCs) { - avoid = "✔ Avoid notes with " + this.plugin.settings.MOCMaxLinks + " or more links "; - } - var visual = ""; - if (this.plugin.settings.enableHighContrast) { - visual = "✔ High-Contrast "; - } - var excludeSkip = ""; - if (this.plugin.settings.skipFoldersList().length > 0) { - excludeSkip = "✔ Skipping " + this.plugin.settings.skipFolders + " "; - } - this.formDiv.createEl("p", { text: via + " " + avoid + " " + visual + " " + excludeSkip, cls: 'discovery-settings' }); - }; - SearchModal.prototype.addLuckyButton = function () { - var lucky = this.formDiv.createEl('p', { cls: 'journey-search-lucky', text: 'I feel lucky' }); - var luckyFunction = (function () { - this.searchStart.setValue(this.findRandomNoteBasename()); - this.searchEnd.setValue(this.findRandomNoteBasename()); - }).bind(this); - lucky.onclick = luckyFunction; - }; - SearchModal.prototype.addSearchButton = function (contentEl) { - var button = this.formDiv.createEl('input', { - type: 'submit', - cls: 'journey-input-button', - value: 'Find Journey' - }); - var searchFunction = (function () { - contentEl.replaceWith(contentEl.createEl("h2", { text: "Searching..." })); - this.plugin.findShortestPath(this.searchStart.getValue(), this.searchEnd.getValue()); - }).bind(this); - button.onclick = searchFunction; - }; - SearchModal.prototype.addEndSearchComponent = function () { - var _this = this; - this.searchEnd = new obsidian.TextComponent(this.formDiv); - this.searchEnd.setPlaceholder("Your Ending Note Title"); - var autocompleteResultEnd = this.formDiv.createDiv({ cls: 'journey-search-autocomplete-results-container hide-me' }); - this.searchEnd.onChange(function (value) { - _this.autocomplete(value, autocompleteResultEnd, _this.searchEnd); - }); - }; - SearchModal.prototype.addStartSearchComponent = function () { - var _this = this; - this.searchStart = new obsidian.TextComponent(this.formDiv); - this.searchStart.setPlaceholder("Your Starting Note Title"); - var autocompleteResultStart = this.formDiv.createDiv({ cls: 'journey-search-autocomplete-results-container hide-me' }); - this.searchStart.onChange(function (value) { - _this.autocomplete(value, autocompleteResultStart, _this.searchStart); - }); - }; - SearchModal.prototype.autocomplete = function (value, autocompleteResult, targetElement) { - autocompleteResult.innerHTML = ""; - var autocompleteResultContent = createDiv({ cls: 'journey-search-autocomplete-results-content' }); - autocompleteResult.appendChild(autocompleteResultContent); - // console.log("Searching for:" + value); - if (!(value.length > 3)) { - autocompleteResult.addClass("hide-me"); - return; - } - // console.log("Here are the files for auto-complete:"); - // console.log(this.filePathList); - var searchResults = []; - for (var i = 0; i < this.filePathList.length; i++) { - if (this.filePathList[i].toUpperCase().includes(value.toUpperCase())) { - // console.log("Found: " + this.markdownFiles[i].basename); - searchResults.push(this.filePathList[i]); - } - } - var limit = searchResults.length; - if (limit > 5) { - limit = 5; - } - autocompleteResultContent.innerHTML = ""; - var _loop_1 = function () { - var li = createDiv({ text: searchResults[i], cls: 'journey-search-autocomplete-results-content-item' }); - li.addEventListener("click", function () { - var text = li.getText(); - targetElement.setValue(text); - autocompleteResult.removeClass("show-me"); - autocompleteResult.addClass("hide-me"); - }.bind(this_1)); - autocompleteResultContent.appendChild(li); - }; - var this_1 = this; - for (var i = 0; i < limit; i++) { - _loop_1(); - } - autocompleteResult.removeClass("hide-me"); - autocompleteResult.addClass("show-me"); - }; - SearchModal.prototype.onClose = function () { - var contentEl = this.contentEl; - contentEl.empty(); - }; - return SearchModal; -}(obsidian.Modal)); -var ResultsModal = /** @class */ (function (_super) { - __extends(ResultsModal, _super); - function ResultsModal(app, plugin) { - var _this = _super.call(this, app) || this; - _this.plugin = plugin; - return _this; - } - ResultsModal.prototype.onOpen = function () { - // console.log(this.results); - var contentEl = this.contentEl; - var anotherSearch = contentEl.createEl("p", { text: "Start another search", cls: 'journey-result-list-reset-link' }); - var boundFunctionAnotherSearch = (function () { - this.close(); - this.plugin.startSearch(); - }).bind(this); - anotherSearch.onclick = boundFunctionAnotherSearch; - if (this.results.length <= 0) { - var noSearchResult = createDiv(); - noSearchResult.appendChild(createEl("h2", { text: "No Journey Found between " + this.startBasename + " and " + this.endBasename })); - noSearchResult.appendChild(createEl("p", { text: "Here are some possible reasons why:" })); - var explanationList = createEl('ul'); - if (!this.plugin.settings.useForwardLinks) { - explanationList.createEl('li', { text: 'You currently have forward-links disabled in your settings' }); - } - if (!this.plugin.settings.useBackLinks) { - explanationList.createEl('li', { text: 'You currently have back-links disabled in your settings' }); - } - if (!this.plugin.settings.useTags) { - explanationList.createEl('li', { text: 'You currently have tags disabled in your settings' }); - } - if (this.plugin.settings.skipMOCs) { - explanationList.createEl('li', { text: 'You currently have skipping MOCs with more than ' + this.plugin.settings.MOCMaxLinks + ' outbound links enabled' }); - } - if (this.plugin.settings.skipFolders) { - explanationList.createEl('li', { text: 'You currently have skipping folders enabled' }); - } - explanationList.createEl('li', { text: 'The two notes may not be in the same network.' }); - noSearchResult.appendChild(explanationList); - noSearchResult.appendChild(anotherSearch); - contentEl.replaceWith(noSearchResult); - } - else { - var listClass = 'journey-result-list'; - if (this.plugin.settings.enableHighContrast) { - listClass = 'journey-result-list-high-contrast'; - } - var list = createDiv({ cls: listClass }); - var reversedResults = this.results.reverse(); - for (var i = 0; i < reversedResults.length; i++) { - var text = reversedResults[i]; - var cls = "journey-result-list-item-note"; - if (i == 0) - cls = "journey-result-list-item-start"; - if (i == reversedResults.length - 1) - cls = "journey-result-list-item-end"; - if (text.match(/^\#\w+/)) - cls = "journey-result-list-item-tag"; - list.appendChild(createDiv({ text: text, cls: cls })); - } - contentEl.appendChild(list); - var button = contentEl.createEl('input', { type: 'submit', cls: 'journey-input-button', value: 'Copy to Clipboard' }); - var boundFunctionButton = (function () { - this.saveToClipboard(); - }).bind(this); - button.onclick = boundFunctionButton; - contentEl.appendChild(contentEl.createEl("hr")); - contentEl.appendChild(button); - contentEl.appendChild(anotherSearch); - } - }; - ResultsModal.prototype.onClose = function () { - var contentEl = this.contentEl; - contentEl.empty(); - }; - ResultsModal.prototype.saveToClipboard = function () { - if (this.results.length > 0) { - navigator.clipboard.writeText(this.createClipboardContent()); - new obsidian.Notice("Journey copied to clipboard!"); - } - }; - ResultsModal.prototype.createClipboardContent = function () { - var result = "## The Journey Between " + this.results.first().replace(".md", "") + " and " + this.results.last().replace(".md", "") + "\n"; - for (var i = 0; i < this.results.length; i++) { - var noteTitle = this.results[i].replace(".md", ""); - if (this.plugin.settings.enableLinks && !(noteTitle.startsWith("#"))) { - noteTitle = "[[" + noteTitle + "]]"; - } - if (this.plugin.settings.enableLinks && this.plugin.settings.enableTransclusion) { - if (!(noteTitle.startsWith("#"))) { - result += "!" + noteTitle + "\n"; - } - else { - result += noteTitle + "\n"; - } - } - else { - result += "- " + noteTitle + "\n"; - } - } - return result; - }; - return ResultsModal; -}(obsidian.Modal)); -var JourneyPluginSettings = /** @class */ (function () { - function JourneyPluginSettings() { - this.useForwardLinks = true; - this.useBackLinks = true; - this.useTags = true; - this.skipMOCs = false; - this.MOCMaxLinks = 30; - this.enableHighContrast = false; - this.skipFolders = ""; - this.enableLinks = false; - this.enableTransclusion = false; - } - JourneyPluginSettings.prototype.skipFoldersList = function () { - if (this.skipFolders == undefined || this.skipFolders == "") - return []; - return this.skipFolders.split(",").map(function (item) { - return item.trim(); - }); - }; - return JourneyPluginSettings; -}()); -var JourneyPluginSettingsTab = /** @class */ (function (_super) { - __extends(JourneyPluginSettingsTab, _super); - function JourneyPluginSettingsTab(app, plugin) { - var _this = _super.call(this, app, plugin) || this; - _this.plugin = plugin; - return _this; - } - JourneyPluginSettingsTab.prototype.display = function () { - var _this = this; - var containerEl = this.containerEl; - containerEl.empty(); - containerEl.createEl("h2", { text: "Journey Plugin Settings" }); - new obsidian.Setting(containerEl) - .setName("Use Forward-links") - .setDesc("If set, allows to travel using forward-links. If you have a graph like this: A -> B -> C and you ask about the story between A and C, it will give you 'A, B, C' since A forward-links to B and B forward-links to C") - .addToggle(function (toggle) { - return toggle.setValue(_this.plugin.settings.useForwardLinks).onChange(function (value) { - _this.plugin.settings.useForwardLinks = value; - _this.plugin.saveData(_this.plugin.settings); - }); - }); - new obsidian.Setting(containerEl) - .setName("Use Back-links") - .setDesc("If set, allows to travel using back-links. If you have a graph like this: A -> B -> C and you ask about the story between C and A, it will give you 'C, B, A' since C has a back-link from B and B has a back-link from A") - .addToggle(function (toggle) { - return toggle.setValue(_this.plugin.settings.useBackLinks).onChange(function (value) { - _this.plugin.settings.useBackLinks = value; - _this.plugin.saveData(_this.plugin.settings); - }); - }); - containerEl.createEl("h3", { text: "Include Tags" }); - new obsidian.Setting(containerEl) - .setName("Use Tags") - .setDesc("If set, allows to travel using tags. ") - .addToggle(function (toggle) { - return toggle.setValue(_this.plugin.settings.useTags).onChange(function (value) { - _this.plugin.settings.useTags = value; - _this.plugin.saveData(_this.plugin.settings); - }); - }); - containerEl.createEl("h3", { text: "Avoid traveling via certain notes and folders" }); - new obsidian.Setting(containerEl) - .setName("Take the scenic route") - .setDesc("If set, will skip 'hub' notes with too many links (MOCs). Configure exactly how many links make a MOC below.") - .addToggle(function (toggle) { - return toggle.setValue(_this.plugin.settings.skipMOCs).onChange(function (value) { - _this.plugin.settings.skipMOCs = value; - _this.plugin.saveData(_this.plugin.settings); - }); - }); - new obsidian.Setting(containerEl) - .setName("How many links make a MOC?") - .setDesc("Configure at which point to skip a note because it contains too many out-bound links. Applies only if 'Take the scenic route' above is set.") - .addSlider(function (toggle) { - return toggle.setValue(_this.plugin.settings.MOCMaxLinks).onChange(function (value) { - _this.MOCMaxLinksCounter.setText("Max link count: " + String(value)); - _this.plugin.settings.MOCMaxLinks = value; - _this.plugin.saveData(_this.plugin.settings); - }); - }); - this.MOCMaxLinksCounter = containerEl.createDiv({ cls: 'moc-max-links-counter', text: "Max link count: " + this.plugin.settings.MOCMaxLinks }); - new obsidian.Setting(containerEl) - .setName("Exclude folders") - .setDesc("If set, will note include notes from the specified folders in your search. Please use comma to deliminate several folders") - .addText(function (text) { - return text - .setPlaceholder("Daily Notes/, Attachments/") - .setValue(_this.plugin.settings.skipFolders) - .onChange(function (value) { - _this.plugin.settings.skipFolders = value; - _this.plugin.saveData(_this.plugin.settings); - }); - }); - containerEl.createEl("h3", { text: "Clipboard Settings" }); - new obsidian.Setting(containerEl) - .setName("Enable Automatic Linking") - .setDesc("If set, will turn titles in the list into links to their respective note") - .addToggle(function (toggle) { - return toggle.setValue(_this.plugin.settings.enableLinks).onChange(function (value) { - _this.plugin.settings.enableLinks = value; - _this.plugin.saveData(_this.plugin.settings); - }); - }); - new obsidian.Setting(containerEl) - .setName("Enable Automatic Transclusion") - .setDesc("If set, will automatically create transcluding links for you ('![[note]]' instead of '- [[note]]')") - .addToggle(function (toggle) { - return toggle.setValue(_this.plugin.settings.enableTransclusion).onChange(function (value) { - _this.plugin.settings.enableTransclusion = value; - _this.plugin.saveData(_this.plugin.settings); - }); - }); - containerEl.createEl("h3", { text: "Accessibility Settings" }); - new obsidian.Setting(containerEl) - .setName("Enable High Contrast") - .setDesc("If set, will increase the contrast to make the result-list easier to read.") - .addToggle(function (toggle) { - return toggle.setValue(_this.plugin.settings.enableHighContrast).onChange(function (value) { - _this.plugin.settings.enableHighContrast = value; - _this.plugin.saveData(_this.plugin.settings); - }); - }); - }; - return JourneyPluginSettingsTab; -}(obsidian.PluginSettingTab)); - -module.exports = JourneyPlugin; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2xpc3RDYWNoZUNsZWFyLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9lcS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Fzc29jSW5kZXhPZi5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2xpc3RDYWNoZURlbGV0ZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2xpc3RDYWNoZUdldC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2xpc3RDYWNoZUhhcy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2xpc3RDYWNoZVNldC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX0xpc3RDYWNoZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0YWNrQ2xlYXIuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19zdGFja0RlbGV0ZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0YWNrR2V0LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RhY2tIYXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19mcmVlR2xvYmFsLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fcm9vdC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX1N5bWJvbC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFJhd1RhZy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX29iamVjdFRvU3RyaW5nLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUdldFRhZy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaXNPYmplY3QuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL2lzRnVuY3Rpb24uanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19jb3JlSnNEYXRhLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9faXNNYXNrZWQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL190b1NvdXJjZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc05hdGl2ZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFZhbHVlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0TmF0aXZlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fTWFwLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fbmF0aXZlQ3JlYXRlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzaENsZWFyLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzaERlbGV0ZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hHZXQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19oYXNoSGFzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzaFNldC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX0hhc2guanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19tYXBDYWNoZUNsZWFyLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9faXNLZXlhYmxlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0TWFwRGF0YS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcENhY2hlRGVsZXRlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwQ2FjaGVHZXQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19tYXBDYWNoZUhhcy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcENhY2hlU2V0LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fTWFwQ2FjaGUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19zdGFja1NldC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX1N0YWNrLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlFYWNoLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fZGVmaW5lUHJvcGVydHkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlQXNzaWduVmFsdWUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19hc3NpZ25WYWx1ZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2NvcHlPYmplY3QuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVGltZXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL2lzT2JqZWN0TGlrZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc0FyZ3VtZW50cy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcmd1bWVudHMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL2lzQXJyYXkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL3N0dWJGYWxzZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaXNCdWZmZXIuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19pc0luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9pc0xlbmd0aC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc1R5cGVkQXJyYXkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVW5hcnkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19ub2RlVXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaXNUeXBlZEFycmF5LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlMaWtlS2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzUHJvdG90eXBlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fb3ZlckFyZy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX25hdGl2ZUtleXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlS2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcnJheUxpa2UuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL2tleXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlQXNzaWduLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fbmF0aXZlS2V5c0luLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUtleXNJbi5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gva2V5c0luLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUFzc2lnbkluLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fY2xvbmVCdWZmZXIuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19jb3B5QXJyYXkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheUZpbHRlci5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvc3R1YkFycmF5LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0U3ltYm9scy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2NvcHlTeW1ib2xzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlQdXNoLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0UHJvdG90eXBlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0U3ltYm9sc0luLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fY29weVN5bWJvbHNJbi5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VHZXRBbGxLZXlzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0QWxsS2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldEFsbEtleXNJbi5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX0RhdGFWaWV3LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fUHJvbWlzZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX1NldC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX1dlYWtNYXAuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19nZXRUYWcuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19pbml0Q2xvbmVBcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX1VpbnQ4QXJyYXkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19jbG9uZUFycmF5QnVmZmVyLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fY2xvbmVEYXRhVmlldy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nsb25lUmVnRXhwLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fY2xvbmVTeW1ib2wuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19jbG9uZVR5cGVkQXJyYXkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19pbml0Q2xvbmVCeVRhZy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VDcmVhdGUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19pbml0Q2xvbmVPYmplY3QuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNNYXAuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL2lzTWFwLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzU2V0LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9pc1NldC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VDbG9uZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvY2xvbmUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL2NvbnN0YW50LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fY3JlYXRlQmFzZUZvci5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VGb3IuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRm9yT3duLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fY3JlYXRlQmFzZUVhY2guanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRWFjaC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaWRlbnRpdHkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19jYXN0RnVuY3Rpb24uanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL2ZvckVhY2guanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL2VhY2guanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRmlsdGVyLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fc2V0Q2FjaGVBZGQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19zZXRDYWNoZUhhcy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX1NldENhY2hlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlTb21lLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fY2FjaGVIYXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19lcXVhbEFycmF5cy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcFRvQXJyYXkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19zZXRUb0FycmF5LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fZXF1YWxCeVRhZy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2VxdWFsT2JqZWN0cy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc0VxdWFsRGVlcC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc0VxdWFsLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzTWF0Y2guanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19pc1N0cmljdENvbXBhcmFibGUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19nZXRNYXRjaERhdGEuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19tYXRjaGVzU3RyaWN0Q29tcGFyYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VNYXRjaGVzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9pc1N5bWJvbC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzS2V5LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9tZW1vaXplLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fbWVtb2l6ZUNhcHBlZC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0cmluZ1RvUGF0aC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5TWFwLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVRvU3RyaW5nLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC90b1N0cmluZy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nhc3RQYXRoLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fdG9LZXkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlR2V0LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9nZXQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSGFzSW4uanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19oYXNQYXRoLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9oYXNJbi5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VNYXRjaGVzUHJvcGVydHkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlUHJvcGVydHkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlUHJvcGVydHlEZWVwLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9wcm9wZXJ0eS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJdGVyYXRlZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvZmlsdGVyLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUhhcy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaGFzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9pc0VtcHR5LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9pc1VuZGVmaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VNYXAuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL21hcC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5UmVkdWNlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVJlZHVjZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvcmVkdWNlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9pc1N0cmluZy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2FzY2lpU2l6ZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc1VuaWNvZGUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL191bmljb2RlU2l6ZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0cmluZ1NpemUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL3NpemUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL3RyYW5zZm9ybS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzRmxhdHRlbmFibGUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRmxhdHRlbi5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2FwcGx5LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fb3ZlclJlc3QuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlU2V0VG9TdHJpbmcuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19zaG9ydE91dC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3NldFRvU3RyaW5nLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVJlc3QuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRmluZEluZGV4LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzTmFOLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RyaWN0SW5kZXhPZi5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJbmRleE9mLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlJbmNsdWRlcy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5SW5jbHVkZXNXaXRoLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9ub29wLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fY3JlYXRlU2V0LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVVuaXEuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL2lzQXJyYXlMaWtlT2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC91bmlvbi5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VWYWx1ZXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL3ZhbHVlcy5qcyIsIm5vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvbG9kYXNoLmpzIiwibm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9ncmFwaC5qcyIsIm5vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvdmVyc2lvbi5qcyIsIm5vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2pzb24uanMiLCJub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9jb21wb25lbnRzLmpzIiwibm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9kYXRhL3ByaW9yaXR5LXF1ZXVlLmpzIiwibm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvZGlqa3N0cmEuanMiLCJub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9kaWprc3RyYS1hbGwuanMiLCJub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy90YXJqYW4uanMiLCJub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9maW5kLWN5Y2xlcy5qcyIsIm5vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvYWxnL2Zsb3lkLXdhcnNoYWxsLmpzIiwibm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvdG9wc29ydC5qcyIsIm5vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvYWxnL2lzLWFjeWNsaWMuanMiLCJub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9kZnMuanMiLCJub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9wb3N0b3JkZXIuanMiLCJub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9wcmVvcmRlci5qcyIsIm5vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvYWxnL3ByaW0uanMiLCJub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9ncmFwaGxpYi9pbmRleC5qcyIsInNyYy9tYWluLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XHJcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgb1trMl0gPSBtW2tdO1xyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xyXG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xyXG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XHJcbiAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXHJcbiAgICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXHJcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xyXG4gICAgcmV0dXJuIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tKSB7XHJcbiAgICBmb3IgKHZhciBpID0gMCwgaWwgPSBmcm9tLmxlbmd0aCwgaiA9IHRvLmxlbmd0aDsgaSA8IGlsOyBpKyssIGorKylcclxuICAgICAgICB0b1tqXSA9IGZyb21baV07XHJcbiAgICByZXR1cm4gdG87XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcclxufSkgOiBmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcclxuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHByaXZhdGVNYXApIHtcclxuICAgIGlmICghcHJpdmF0ZU1hcC5oYXMocmVjZWl2ZXIpKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImF0dGVtcHRlZCB0byBnZXQgcHJpdmF0ZSBmaWVsZCBvbiBub24taW5zdGFuY2VcIik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcHJpdmF0ZU1hcC5nZXQocmVjZWl2ZXIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgcHJpdmF0ZU1hcCwgdmFsdWUpIHtcclxuICAgIGlmICghcHJpdmF0ZU1hcC5oYXMocmVjZWl2ZXIpKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImF0dGVtcHRlZCB0byBzZXQgcHJpdmF0ZSBmaWVsZCBvbiBub24taW5zdGFuY2VcIik7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlTWFwLnNldChyZWNlaXZlciwgdmFsdWUpO1xyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG59XHJcbiIsIi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgbGlzdCBjYWNoZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlQ2xlYXIoKSB7XG4gIHRoaXMuX19kYXRhX18gPSBbXTtcbiAgdGhpcy5zaXplID0gMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0Q2FjaGVDbGVhcjtcbiIsIi8qKlxuICogUGVyZm9ybXMgYVxuICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAqIGNvbXBhcmlzb24gYmV0d2VlbiB0d28gdmFsdWVzIHRvIGRldGVybWluZSBpZiB0aGV5IGFyZSBlcXVpdmFsZW50LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICogdmFyIG90aGVyID0geyAnYSc6IDEgfTtcbiAqXG4gKiBfLmVxKG9iamVjdCwgb2JqZWN0KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmVxKG9iamVjdCwgb3RoZXIpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmVxKCdhJywgJ2EnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmVxKCdhJywgT2JqZWN0KCdhJykpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmVxKE5hTiwgTmFOKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gZXEodmFsdWUsIG90aGVyKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gb3RoZXIgfHwgKHZhbHVlICE9PSB2YWx1ZSAmJiBvdGhlciAhPT0gb3RoZXIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGVxO1xuIiwidmFyIGVxID0gcmVxdWlyZSgnLi9lcScpO1xuXG4vKipcbiAqIEdldHMgdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBga2V5YCBpcyBmb3VuZCBpbiBgYXJyYXlgIG9mIGtleS12YWx1ZSBwYWlycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IGtleSBUaGUga2V5IHRvIHNlYXJjaCBmb3IuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICovXG5mdW5jdGlvbiBhc3NvY0luZGV4T2YoYXJyYXksIGtleSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICBpZiAoZXEoYXJyYXlbbGVuZ3RoXVswXSwga2V5KSkge1xuICAgICAgcmV0dXJuIGxlbmd0aDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFzc29jSW5kZXhPZjtcbiIsInZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlKCcuL19hc3NvY0luZGV4T2YnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHNwbGljZSA9IGFycmF5UHJvdG8uc3BsaWNlO1xuXG4vKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBsaXN0IGNhY2hlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBkZWxldGVcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVEZWxldGUoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgaWYgKGluZGV4IDwgMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgbGFzdEluZGV4ID0gZGF0YS5sZW5ndGggLSAxO1xuICBpZiAoaW5kZXggPT0gbGFzdEluZGV4KSB7XG4gICAgZGF0YS5wb3AoKTtcbiAgfSBlbHNlIHtcbiAgICBzcGxpY2UuY2FsbChkYXRhLCBpbmRleCwgMSk7XG4gIH1cbiAgLS10aGlzLnNpemU7XG4gIHJldHVybiB0cnVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RDYWNoZURlbGV0ZTtcbiIsInZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlKCcuL19hc3NvY0luZGV4T2YnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlR2V0KGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gIHJldHVybiBpbmRleCA8IDAgPyB1bmRlZmluZWQgOiBkYXRhW2luZGV4XVsxXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0Q2FjaGVHZXQ7XG4iLCJ2YXIgYXNzb2NJbmRleE9mID0gcmVxdWlyZSgnLi9fYXNzb2NJbmRleE9mJyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgbGlzdCBjYWNoZSB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVIYXMoa2V5KSB7XG4gIHJldHVybiBhc3NvY0luZGV4T2YodGhpcy5fX2RhdGFfXywga2V5KSA+IC0xO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RDYWNoZUhhcztcbiIsInZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlKCcuL19hc3NvY0luZGV4T2YnKTtcblxuLyoqXG4gKiBTZXRzIHRoZSBsaXN0IGNhY2hlIGBrZXlgIHRvIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIHNldFxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBsaXN0IGNhY2hlIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVTZXQoa2V5LCB2YWx1ZSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gIGlmIChpbmRleCA8IDApIHtcbiAgICArK3RoaXMuc2l6ZTtcbiAgICBkYXRhLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgfSBlbHNlIHtcbiAgICBkYXRhW2luZGV4XVsxXSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RDYWNoZVNldDtcbiIsInZhciBsaXN0Q2FjaGVDbGVhciA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZUNsZWFyJyksXG4gICAgbGlzdENhY2hlRGVsZXRlID0gcmVxdWlyZSgnLi9fbGlzdENhY2hlRGVsZXRlJyksXG4gICAgbGlzdENhY2hlR2V0ID0gcmVxdWlyZSgnLi9fbGlzdENhY2hlR2V0JyksXG4gICAgbGlzdENhY2hlSGFzID0gcmVxdWlyZSgnLi9fbGlzdENhY2hlSGFzJyksXG4gICAgbGlzdENhY2hlU2V0ID0gcmVxdWlyZSgnLi9fbGlzdENhY2hlU2V0Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBsaXN0IGNhY2hlIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gTGlzdENhY2hlKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgdGhpcy5jbGVhcigpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYExpc3RDYWNoZWAuXG5MaXN0Q2FjaGUucHJvdG90eXBlLmNsZWFyID0gbGlzdENhY2hlQ2xlYXI7XG5MaXN0Q2FjaGUucHJvdG90eXBlWydkZWxldGUnXSA9IGxpc3RDYWNoZURlbGV0ZTtcbkxpc3RDYWNoZS5wcm90b3R5cGUuZ2V0ID0gbGlzdENhY2hlR2V0O1xuTGlzdENhY2hlLnByb3RvdHlwZS5oYXMgPSBsaXN0Q2FjaGVIYXM7XG5MaXN0Q2FjaGUucHJvdG90eXBlLnNldCA9IGxpc3RDYWNoZVNldDtcblxubW9kdWxlLmV4cG9ydHMgPSBMaXN0Q2FjaGU7XG4iLCJ2YXIgTGlzdENhY2hlID0gcmVxdWlyZSgnLi9fTGlzdENhY2hlJyk7XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgc3RhY2suXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsZWFyXG4gKiBAbWVtYmVyT2YgU3RhY2tcbiAqL1xuZnVuY3Rpb24gc3RhY2tDbGVhcigpIHtcbiAgdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGU7XG4gIHRoaXMuc2l6ZSA9IDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RhY2tDbGVhcjtcbiIsIi8qKlxuICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIHN0YWNrLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBkZWxldGVcbiAqIEBtZW1iZXJPZiBTdGFja1xuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIHN0YWNrRGVsZXRlKGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICByZXN1bHQgPSBkYXRhWydkZWxldGUnXShrZXkpO1xuXG4gIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdGFja0RlbGV0ZTtcbiIsIi8qKlxuICogR2V0cyB0aGUgc3RhY2sgdmFsdWUgZm9yIGBrZXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBnZXRcbiAqIEBtZW1iZXJPZiBTdGFja1xuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHN0YWNrR2V0KGtleSkge1xuICByZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQoa2V5KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdGFja0dldDtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGEgc3RhY2sgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgU3RhY2tcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBzdGFja0hhcyhrZXkpIHtcbiAgcmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RhY2tIYXM7XG4iLCIvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCAmJiBnbG9iYWwuT2JqZWN0ID09PSBPYmplY3QgJiYgZ2xvYmFsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZyZWVHbG9iYWw7XG4iLCJ2YXIgZnJlZUdsb2JhbCA9IHJlcXVpcmUoJy4vX2ZyZWVHbG9iYWwnKTtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbnZhciBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmO1xuXG4vKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbnZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJvb3Q7XG4iLCJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgU3ltYm9sID0gcm9vdC5TeW1ib2w7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ltYm9sO1xuIiwidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgbmF0aXZlT2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3ltVG9TdHJpbmdUYWcgPSBTeW1ib2wgPyBTeW1ib2wudG9TdHJpbmdUYWcgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlR2V0VGFnYCB3aGljaCBpZ25vcmVzIGBTeW1ib2wudG9TdHJpbmdUYWdgIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSByYXcgYHRvU3RyaW5nVGFnYC5cbiAqL1xuZnVuY3Rpb24gZ2V0UmF3VGFnKHZhbHVlKSB7XG4gIHZhciBpc093biA9IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIHN5bVRvU3RyaW5nVGFnKSxcbiAgICAgIHRhZyA9IHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcblxuICB0cnkge1xuICAgIHZhbHVlW3N5bVRvU3RyaW5nVGFnXSA9IHVuZGVmaW5lZDtcbiAgICB2YXIgdW5tYXNrZWQgPSB0cnVlO1xuICB9IGNhdGNoIChlKSB7fVxuXG4gIHZhciByZXN1bHQgPSBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgaWYgKHVubWFza2VkKSB7XG4gICAgaWYgKGlzT3duKSB7XG4gICAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB0YWc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0UmF3VGFnO1xuIiwiLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZyB1c2luZyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gb2JqZWN0VG9TdHJpbmc7XG4iLCJ2YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fU3ltYm9sJyksXG4gICAgZ2V0UmF3VGFnID0gcmVxdWlyZSgnLi9fZ2V0UmF3VGFnJyksXG4gICAgb2JqZWN0VG9TdHJpbmcgPSByZXF1aXJlKCcuL19vYmplY3RUb1N0cmluZycpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbnVsbFRhZyA9ICdbb2JqZWN0IE51bGxdJyxcbiAgICB1bmRlZmluZWRUYWcgPSAnW29iamVjdCBVbmRlZmluZWRdJztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3ltVG9TdHJpbmdUYWcgPSBTeW1ib2wgPyBTeW1ib2wudG9TdHJpbmdUYWcgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGdldFRhZ2Agd2l0aG91dCBmYWxsYmFja3MgZm9yIGJ1Z2d5IGVudmlyb25tZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLlxuICovXG5mdW5jdGlvbiBiYXNlR2V0VGFnKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWRUYWcgOiBudWxsVGFnO1xuICB9XG4gIHJldHVybiAoc3ltVG9TdHJpbmdUYWcgJiYgc3ltVG9TdHJpbmdUYWcgaW4gT2JqZWN0KHZhbHVlKSlcbiAgICA/IGdldFJhd1RhZyh2YWx1ZSlcbiAgICA6IG9iamVjdFRvU3RyaW5nKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlR2V0VGFnO1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdCh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNPYmplY3Q7XG4iLCJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFzeW5jVGFnID0gJ1tvYmplY3QgQXN5bmNGdW5jdGlvbl0nLFxuICAgIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuICAgIGdlblRhZyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXScsXG4gICAgcHJveHlUYWcgPSAnW29iamVjdCBQcm94eV0nO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgRnVuY3Rpb25gIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGZ1bmN0aW9uLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNGdW5jdGlvbihfKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzRnVuY3Rpb24oL2FiYy8pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSkge1xuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvLyBUaGUgdXNlIG9mIGBPYmplY3QjdG9TdHJpbmdgIGF2b2lkcyBpc3N1ZXMgd2l0aCB0aGUgYHR5cGVvZmAgb3BlcmF0b3JcbiAgLy8gaW4gU2FmYXJpIDkgd2hpY2ggcmV0dXJucyAnb2JqZWN0JyBmb3IgdHlwZWQgYXJyYXlzIGFuZCBvdGhlciBjb25zdHJ1Y3RvcnMuXG4gIHZhciB0YWcgPSBiYXNlR2V0VGFnKHZhbHVlKTtcbiAgcmV0dXJuIHRhZyA9PSBmdW5jVGFnIHx8IHRhZyA9PSBnZW5UYWcgfHwgdGFnID09IGFzeW5jVGFnIHx8IHRhZyA9PSBwcm94eVRhZztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0Z1bmN0aW9uO1xuIiwidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBvdmVycmVhY2hpbmcgY29yZS1qcyBzaGltcy4gKi9cbnZhciBjb3JlSnNEYXRhID0gcm9vdFsnX19jb3JlLWpzX3NoYXJlZF9fJ107XG5cbm1vZHVsZS5leHBvcnRzID0gY29yZUpzRGF0YTtcbiIsInZhciBjb3JlSnNEYXRhID0gcmVxdWlyZSgnLi9fY29yZUpzRGF0YScpO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgbWV0aG9kcyBtYXNxdWVyYWRpbmcgYXMgbmF0aXZlLiAqL1xudmFyIG1hc2tTcmNLZXkgPSAoZnVuY3Rpb24oKSB7XG4gIHZhciB1aWQgPSAvW14uXSskLy5leGVjKGNvcmVKc0RhdGEgJiYgY29yZUpzRGF0YS5rZXlzICYmIGNvcmVKc0RhdGEua2V5cy5JRV9QUk9UTyB8fCAnJyk7XG4gIHJldHVybiB1aWQgPyAoJ1N5bWJvbChzcmMpXzEuJyArIHVpZCkgOiAnJztcbn0oKSk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBmdW5jYCBoYXMgaXRzIHNvdXJjZSBtYXNrZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBmdW5jYCBpcyBtYXNrZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNNYXNrZWQoZnVuYykge1xuICByZXR1cm4gISFtYXNrU3JjS2V5ICYmIChtYXNrU3JjS2V5IGluIGZ1bmMpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzTWFza2VkO1xuIiwiLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVjb21waWxlZCBzb3VyY2Ugb2YgZnVuY3Rpb25zLiAqL1xudmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBDb252ZXJ0cyBgZnVuY2AgdG8gaXRzIHNvdXJjZSBjb2RlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc291cmNlIGNvZGUuXG4gKi9cbmZ1bmN0aW9uIHRvU291cmNlKGZ1bmMpIHtcbiAgaWYgKGZ1bmMgIT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZnVuY1RvU3RyaW5nLmNhbGwoZnVuYyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIChmdW5jICsgJycpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRvU291cmNlO1xuIiwidmFyIGlzRnVuY3Rpb24gPSByZXF1aXJlKCcuL2lzRnVuY3Rpb24nKSxcbiAgICBpc01hc2tlZCA9IHJlcXVpcmUoJy4vX2lzTWFza2VkJyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0JyksXG4gICAgdG9Tb3VyY2UgPSByZXF1aXJlKCcuL190b1NvdXJjZScpO1xuXG4vKipcbiAqIFVzZWQgdG8gbWF0Y2ggYFJlZ0V4cGBcbiAqIFtzeW50YXggY2hhcmFjdGVyc10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcGF0dGVybnMpLlxuICovXG52YXIgcmVSZWdFeHBDaGFyID0gL1tcXFxcXiQuKis/KClbXFxde318XS9nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgaG9zdCBjb25zdHJ1Y3RvcnMgKFNhZmFyaSkuICovXG52YXIgcmVJc0hvc3RDdG9yID0gL15cXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXF0kLztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZSxcbiAgICBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi9cbnZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBpZiBhIG1ldGhvZCBpcyBuYXRpdmUuICovXG52YXIgcmVJc05hdGl2ZSA9IFJlZ0V4cCgnXicgK1xuICBmdW5jVG9TdHJpbmcuY2FsbChoYXNPd25Qcm9wZXJ0eSkucmVwbGFjZShyZVJlZ0V4cENoYXIsICdcXFxcJCYnKVxuICAucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXFxcXCgpfCBmb3IgLis/KD89XFxcXFxcXSkvZywgJyQxLio/JykgKyAnJCdcbik7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNOYXRpdmVgIHdpdGhvdXQgYmFkIHNoaW0gY2hlY2tzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbmF0aXZlIGZ1bmN0aW9uLFxuICogIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzTmF0aXZlKHZhbHVlKSB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpIHx8IGlzTWFza2VkKHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgcGF0dGVybiA9IGlzRnVuY3Rpb24odmFsdWUpID8gcmVJc05hdGl2ZSA6IHJlSXNIb3N0Q3RvcjtcbiAgcmV0dXJuIHBhdHRlcm4udGVzdCh0b1NvdXJjZSh2YWx1ZSkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc05hdGl2ZTtcbiIsIi8qKlxuICogR2V0cyB0aGUgdmFsdWUgYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGdldFZhbHVlKG9iamVjdCwga2V5KSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFZhbHVlO1xuIiwidmFyIGJhc2VJc05hdGl2ZSA9IHJlcXVpcmUoJy4vX2Jhc2VJc05hdGl2ZScpLFxuICAgIGdldFZhbHVlID0gcmVxdWlyZSgnLi9fZ2V0VmFsdWUnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBuYXRpdmUgZnVuY3Rpb24gYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgbWV0aG9kIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBpZiBpdCdzIG5hdGl2ZSwgZWxzZSBgdW5kZWZpbmVkYC5cbiAqL1xuZnVuY3Rpb24gZ2V0TmF0aXZlKG9iamVjdCwga2V5KSB7XG4gIHZhciB2YWx1ZSA9IGdldFZhbHVlKG9iamVjdCwga2V5KTtcbiAgcmV0dXJuIGJhc2VJc05hdGl2ZSh2YWx1ZSkgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXROYXRpdmU7XG4iLCJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyksXG4gICAgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIE1hcCA9IGdldE5hdGl2ZShyb290LCAnTWFwJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gTWFwO1xuIiwidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgbmF0aXZlQ3JlYXRlID0gZ2V0TmF0aXZlKE9iamVjdCwgJ2NyZWF0ZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5hdGl2ZUNyZWF0ZTtcbiIsInZhciBuYXRpdmVDcmVhdGUgPSByZXF1aXJlKCcuL19uYXRpdmVDcmVhdGUnKTtcblxuLyoqXG4gKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBoYXNoLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBjbGVhclxuICogQG1lbWJlck9mIEhhc2hcbiAqL1xuZnVuY3Rpb24gaGFzaENsZWFyKCkge1xuICB0aGlzLl9fZGF0YV9fID0gbmF0aXZlQ3JlYXRlID8gbmF0aXZlQ3JlYXRlKG51bGwpIDoge307XG4gIHRoaXMuc2l6ZSA9IDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzaENsZWFyO1xuIiwiLyoqXG4gKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgaGFzaC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZGVsZXRlXG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtPYmplY3R9IGhhc2ggVGhlIGhhc2ggdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGhhc2hEZWxldGUoa2V5KSB7XG4gIHZhciByZXN1bHQgPSB0aGlzLmhhcyhrZXkpICYmIGRlbGV0ZSB0aGlzLl9fZGF0YV9fW2tleV07XG4gIHRoaXMuc2l6ZSAtPSByZXN1bHQgPyAxIDogMDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNoRGVsZXRlO1xuIiwidmFyIG5hdGl2ZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX25hdGl2ZUNyZWF0ZScpO1xuXG4vKiogVXNlZCB0byBzdGFuZC1pbiBmb3IgYHVuZGVmaW5lZGAgaGFzaCB2YWx1ZXMuICovXG52YXIgSEFTSF9VTkRFRklORUQgPSAnX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogR2V0cyB0aGUgaGFzaCB2YWx1ZSBmb3IgYGtleWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGdldFxuICogQG1lbWJlck9mIEhhc2hcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBoYXNoR2V0KGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gIGlmIChuYXRpdmVDcmVhdGUpIHtcbiAgICB2YXIgcmVzdWx0ID0gZGF0YVtrZXldO1xuICAgIHJldHVybiByZXN1bHQgPT09IEhBU0hfVU5ERUZJTkVEID8gdW5kZWZpbmVkIDogcmVzdWx0O1xuICB9XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSkgPyBkYXRhW2tleV0gOiB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzaEdldDtcbiIsInZhciBuYXRpdmVDcmVhdGUgPSByZXF1aXJlKCcuL19uYXRpdmVDcmVhdGUnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBoYXNoIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIEhhc2hcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBoYXNoSGFzKGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gIHJldHVybiBuYXRpdmVDcmVhdGUgPyAoZGF0YVtrZXldICE9PSB1bmRlZmluZWQpIDogaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc2hIYXM7XG4iLCJ2YXIgbmF0aXZlQ3JlYXRlID0gcmVxdWlyZSgnLi9fbmF0aXZlQ3JlYXRlJyk7XG5cbi8qKiBVc2VkIHRvIHN0YW5kLWluIGZvciBgdW5kZWZpbmVkYCBoYXNoIHZhbHVlcy4gKi9cbnZhciBIQVNIX1VOREVGSU5FRCA9ICdfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fJztcblxuLyoqXG4gKiBTZXRzIHRoZSBoYXNoIGBrZXlgIHRvIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIHNldFxuICogQG1lbWJlck9mIEhhc2hcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaGFzaCBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gaGFzaFNldChrZXksIHZhbHVlKSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgdGhpcy5zaXplICs9IHRoaXMuaGFzKGtleSkgPyAwIDogMTtcbiAgZGF0YVtrZXldID0gKG5hdGl2ZUNyZWF0ZSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSA/IEhBU0hfVU5ERUZJTkVEIDogdmFsdWU7XG4gIHJldHVybiB0aGlzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc2hTZXQ7XG4iLCJ2YXIgaGFzaENsZWFyID0gcmVxdWlyZSgnLi9faGFzaENsZWFyJyksXG4gICAgaGFzaERlbGV0ZSA9IHJlcXVpcmUoJy4vX2hhc2hEZWxldGUnKSxcbiAgICBoYXNoR2V0ID0gcmVxdWlyZSgnLi9faGFzaEdldCcpLFxuICAgIGhhc2hIYXMgPSByZXF1aXJlKCcuL19oYXNoSGFzJyksXG4gICAgaGFzaFNldCA9IHJlcXVpcmUoJy4vX2hhc2hTZXQnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgaGFzaCBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIEhhc2goZW50cmllcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuICB0aGlzLmNsZWFyKCk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgfVxufVxuXG4vLyBBZGQgbWV0aG9kcyB0byBgSGFzaGAuXG5IYXNoLnByb3RvdHlwZS5jbGVhciA9IGhhc2hDbGVhcjtcbkhhc2gucHJvdG90eXBlWydkZWxldGUnXSA9IGhhc2hEZWxldGU7XG5IYXNoLnByb3RvdHlwZS5nZXQgPSBoYXNoR2V0O1xuSGFzaC5wcm90b3R5cGUuaGFzID0gaGFzaEhhcztcbkhhc2gucHJvdG90eXBlLnNldCA9IGhhc2hTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gSGFzaDtcbiIsInZhciBIYXNoID0gcmVxdWlyZSgnLi9fSGFzaCcpLFxuICAgIExpc3RDYWNoZSA9IHJlcXVpcmUoJy4vX0xpc3RDYWNoZScpLFxuICAgIE1hcCA9IHJlcXVpcmUoJy4vX01hcCcpO1xuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIG1hcC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICovXG5mdW5jdGlvbiBtYXBDYWNoZUNsZWFyKCkge1xuICB0aGlzLnNpemUgPSAwO1xuICB0aGlzLl9fZGF0YV9fID0ge1xuICAgICdoYXNoJzogbmV3IEhhc2gsXG4gICAgJ21hcCc6IG5ldyAoTWFwIHx8IExpc3RDYWNoZSksXG4gICAgJ3N0cmluZyc6IG5ldyBIYXNoXG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVDbGVhcjtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgc3VpdGFibGUgZm9yIHVzZSBhcyB1bmlxdWUgb2JqZWN0IGtleS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0tleWFibGUodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiAodHlwZSA9PSAnc3RyaW5nJyB8fCB0eXBlID09ICdudW1iZXInIHx8IHR5cGUgPT0gJ3N5bWJvbCcgfHwgdHlwZSA9PSAnYm9vbGVhbicpXG4gICAgPyAodmFsdWUgIT09ICdfX3Byb3RvX18nKVxuICAgIDogKHZhbHVlID09PSBudWxsKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0tleWFibGU7XG4iLCJ2YXIgaXNLZXlhYmxlID0gcmVxdWlyZSgnLi9faXNLZXlhYmxlJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgZGF0YSBmb3IgYG1hcGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBtYXAgVGhlIG1hcCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIHJlZmVyZW5jZSBrZXkuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWFwIGRhdGEuXG4gKi9cbmZ1bmN0aW9uIGdldE1hcERhdGEobWFwLCBrZXkpIHtcbiAgdmFyIGRhdGEgPSBtYXAuX19kYXRhX187XG4gIHJldHVybiBpc0tleWFibGUoa2V5KVxuICAgID8gZGF0YVt0eXBlb2Yga2V5ID09ICdzdHJpbmcnID8gJ3N0cmluZycgOiAnaGFzaCddXG4gICAgOiBkYXRhLm1hcDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRNYXBEYXRhO1xuIiwidmFyIGdldE1hcERhdGEgPSByZXF1aXJlKCcuL19nZXRNYXBEYXRhJyk7XG5cbi8qKlxuICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIG1hcC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZGVsZXRlXG4gKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBtYXBDYWNoZURlbGV0ZShrZXkpIHtcbiAgdmFyIHJlc3VsdCA9IGdldE1hcERhdGEodGhpcywga2V5KVsnZGVsZXRlJ10oa2V5KTtcbiAgdGhpcy5zaXplIC09IHJlc3VsdCA/IDEgOiAwO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hcENhY2hlRGVsZXRlO1xuIiwidmFyIGdldE1hcERhdGEgPSByZXF1aXJlKCcuL19nZXRNYXBEYXRhJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgbWFwIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBtYXBDYWNoZUdldChrZXkpIHtcbiAgcmV0dXJuIGdldE1hcERhdGEodGhpcywga2V5KS5nZXQoa2V5KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBDYWNoZUdldDtcbiIsInZhciBnZXRNYXBEYXRhID0gcmVxdWlyZSgnLi9fZ2V0TWFwRGF0YScpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIG1hcCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlSGFzKGtleSkge1xuICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmhhcyhrZXkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hcENhY2hlSGFzO1xuIiwidmFyIGdldE1hcERhdGEgPSByZXF1aXJlKCcuL19nZXRNYXBEYXRhJyk7XG5cbi8qKlxuICogU2V0cyB0aGUgbWFwIGBrZXlgIHRvIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIHNldFxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG1hcCBjYWNoZSBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVTZXQoa2V5LCB2YWx1ZSkge1xuICB2YXIgZGF0YSA9IGdldE1hcERhdGEodGhpcywga2V5KSxcbiAgICAgIHNpemUgPSBkYXRhLnNpemU7XG5cbiAgZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG4gIHRoaXMuc2l6ZSArPSBkYXRhLnNpemUgPT0gc2l6ZSA/IDAgOiAxO1xuICByZXR1cm4gdGhpcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBDYWNoZVNldDtcbiIsInZhciBtYXBDYWNoZUNsZWFyID0gcmVxdWlyZSgnLi9fbWFwQ2FjaGVDbGVhcicpLFxuICAgIG1hcENhY2hlRGVsZXRlID0gcmVxdWlyZSgnLi9fbWFwQ2FjaGVEZWxldGUnKSxcbiAgICBtYXBDYWNoZUdldCA9IHJlcXVpcmUoJy4vX21hcENhY2hlR2V0JyksXG4gICAgbWFwQ2FjaGVIYXMgPSByZXF1aXJlKCcuL19tYXBDYWNoZUhhcycpLFxuICAgIG1hcENhY2hlU2V0ID0gcmVxdWlyZSgnLi9fbWFwQ2FjaGVTZXQnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbWFwIGNhY2hlIG9iamVjdCB0byBzdG9yZSBrZXktdmFsdWUgcGFpcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIE1hcENhY2hlKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgdGhpcy5jbGVhcigpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYE1hcENhY2hlYC5cbk1hcENhY2hlLnByb3RvdHlwZS5jbGVhciA9IG1hcENhY2hlQ2xlYXI7XG5NYXBDYWNoZS5wcm90b3R5cGVbJ2RlbGV0ZSddID0gbWFwQ2FjaGVEZWxldGU7XG5NYXBDYWNoZS5wcm90b3R5cGUuZ2V0ID0gbWFwQ2FjaGVHZXQ7XG5NYXBDYWNoZS5wcm90b3R5cGUuaGFzID0gbWFwQ2FjaGVIYXM7XG5NYXBDYWNoZS5wcm90b3R5cGUuc2V0ID0gbWFwQ2FjaGVTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gTWFwQ2FjaGU7XG4iLCJ2YXIgTGlzdENhY2hlID0gcmVxdWlyZSgnLi9fTGlzdENhY2hlJyksXG4gICAgTWFwID0gcmVxdWlyZSgnLi9fTWFwJyksXG4gICAgTWFwQ2FjaGUgPSByZXF1aXJlKCcuL19NYXBDYWNoZScpO1xuXG4vKiogVXNlZCBhcyB0aGUgc2l6ZSB0byBlbmFibGUgbGFyZ2UgYXJyYXkgb3B0aW1pemF0aW9ucy4gKi9cbnZhciBMQVJHRV9BUlJBWV9TSVpFID0gMjAwO1xuXG4vKipcbiAqIFNldHMgdGhlIHN0YWNrIGBrZXlgIHRvIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIHNldFxuICogQG1lbWJlck9mIFN0YWNrXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIHN0YWNrIGNhY2hlIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBzdGFja1NldChrZXksIHZhbHVlKSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBMaXN0Q2FjaGUpIHtcbiAgICB2YXIgcGFpcnMgPSBkYXRhLl9fZGF0YV9fO1xuICAgIGlmICghTWFwIHx8IChwYWlycy5sZW5ndGggPCBMQVJHRV9BUlJBWV9TSVpFIC0gMSkpIHtcbiAgICAgIHBhaXJzLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgICAgIHRoaXMuc2l6ZSA9ICsrZGF0YS5zaXplO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGRhdGEgPSB0aGlzLl9fZGF0YV9fID0gbmV3IE1hcENhY2hlKHBhaXJzKTtcbiAgfVxuICBkYXRhLnNldChrZXksIHZhbHVlKTtcbiAgdGhpcy5zaXplID0gZGF0YS5zaXplO1xuICByZXR1cm4gdGhpcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdGFja1NldDtcbiIsInZhciBMaXN0Q2FjaGUgPSByZXF1aXJlKCcuL19MaXN0Q2FjaGUnKSxcbiAgICBzdGFja0NsZWFyID0gcmVxdWlyZSgnLi9fc3RhY2tDbGVhcicpLFxuICAgIHN0YWNrRGVsZXRlID0gcmVxdWlyZSgnLi9fc3RhY2tEZWxldGUnKSxcbiAgICBzdGFja0dldCA9IHJlcXVpcmUoJy4vX3N0YWNrR2V0JyksXG4gICAgc3RhY2tIYXMgPSByZXF1aXJlKCcuL19zdGFja0hhcycpLFxuICAgIHN0YWNrU2V0ID0gcmVxdWlyZSgnLi9fc3RhY2tTZXQnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgc3RhY2sgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIGtleS12YWx1ZSBwYWlycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gU3RhY2soZW50cmllcykge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18gPSBuZXcgTGlzdENhY2hlKGVudHJpZXMpO1xuICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBTdGFja2AuXG5TdGFjay5wcm90b3R5cGUuY2xlYXIgPSBzdGFja0NsZWFyO1xuU3RhY2sucHJvdG90eXBlWydkZWxldGUnXSA9IHN0YWNrRGVsZXRlO1xuU3RhY2sucHJvdG90eXBlLmdldCA9IHN0YWNrR2V0O1xuU3RhY2sucHJvdG90eXBlLmhhcyA9IHN0YWNrSGFzO1xuU3RhY2sucHJvdG90eXBlLnNldCA9IHN0YWNrU2V0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN0YWNrO1xuIiwiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZm9yRWFjaGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5RWFjaChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGlmIChpdGVyYXRlZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkgPT09IGZhbHNlKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5RWFjaDtcbiIsInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKTtcblxudmFyIGRlZmluZVByb3BlcnR5ID0gKGZ1bmN0aW9uKCkge1xuICB0cnkge1xuICAgIHZhciBmdW5jID0gZ2V0TmF0aXZlKE9iamVjdCwgJ2RlZmluZVByb3BlcnR5Jyk7XG4gICAgZnVuYyh7fSwgJycsIHt9KTtcbiAgICByZXR1cm4gZnVuYztcbiAgfSBjYXRjaCAoZSkge31cbn0oKSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZGVmaW5lUHJvcGVydHk7XG4iLCJ2YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL19kZWZpbmVQcm9wZXJ0eScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBhc3NpZ25WYWx1ZWAgYW5kIGBhc3NpZ25NZXJnZVZhbHVlYCB3aXRob3V0XG4gKiB2YWx1ZSBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAqL1xuZnVuY3Rpb24gYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5ID09ICdfX3Byb3RvX18nICYmIGRlZmluZVByb3BlcnR5KSB7XG4gICAgZGVmaW5lUHJvcGVydHkob2JqZWN0LCBrZXksIHtcbiAgICAgICdjb25maWd1cmFibGUnOiB0cnVlLFxuICAgICAgJ2VudW1lcmFibGUnOiB0cnVlLFxuICAgICAgJ3ZhbHVlJzogdmFsdWUsXG4gICAgICAnd3JpdGFibGUnOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VBc3NpZ25WYWx1ZTtcbiIsInZhciBiYXNlQXNzaWduVmFsdWUgPSByZXF1aXJlKCcuL19iYXNlQXNzaWduVmFsdWUnKSxcbiAgICBlcSA9IHJlcXVpcmUoJy4vZXEnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBBc3NpZ25zIGB2YWx1ZWAgdG8gYGtleWAgb2YgYG9iamVjdGAgaWYgdGhlIGV4aXN0aW5nIHZhbHVlIGlzIG5vdCBlcXVpdmFsZW50XG4gKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gKi9cbmZ1bmN0aW9uIGFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICB2YXIgb2JqVmFsdWUgPSBvYmplY3Rba2V5XTtcbiAgaWYgKCEoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYgZXEob2JqVmFsdWUsIHZhbHVlKSkgfHxcbiAgICAgICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpKSB7XG4gICAgYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhc3NpZ25WYWx1ZTtcbiIsInZhciBhc3NpZ25WYWx1ZSA9IHJlcXVpcmUoJy4vX2Fzc2lnblZhbHVlJyksXG4gICAgYmFzZUFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYmFzZUFzc2lnblZhbHVlJyk7XG5cbi8qKlxuICogQ29waWVzIHByb3BlcnRpZXMgb2YgYHNvdXJjZWAgdG8gYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbS5cbiAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycyB0byBjb3B5LlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIHRvLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29waWVkIHZhbHVlcy5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGNvcHlPYmplY3Qoc291cmNlLCBwcm9wcywgb2JqZWN0LCBjdXN0b21pemVyKSB7XG4gIHZhciBpc05ldyA9ICFvYmplY3Q7XG4gIG9iamVjdCB8fCAob2JqZWN0ID0ge30pO1xuXG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGtleSA9IHByb3BzW2luZGV4XTtcblxuICAgIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICAgID8gY3VzdG9taXplcihvYmplY3Rba2V5XSwgc291cmNlW2tleV0sIGtleSwgb2JqZWN0LCBzb3VyY2UpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBuZXdWYWx1ZSA9IHNvdXJjZVtrZXldO1xuICAgIH1cbiAgICBpZiAoaXNOZXcpIHtcbiAgICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqZWN0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcHlPYmplY3Q7XG4iLCIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRpbWVzYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHNcbiAqIG9yIG1heCBhcnJheSBsZW5ndGggY2hlY2tzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIGludm9rZSBgaXRlcmF0ZWVgLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcmVzdWx0cy5cbiAqL1xuZnVuY3Rpb24gYmFzZVRpbWVzKG4sIGl0ZXJhdGVlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobik7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBuKSB7XG4gICAgcmVzdWx0W2luZGV4XSA9IGl0ZXJhdGVlKGluZGV4KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VUaW1lcztcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzT2JqZWN0TGlrZTtcbiIsInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhcmdzVGFnID0gJ1tvYmplY3QgQXJndW1lbnRzXSc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNBcmd1bWVudHNgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGBhcmd1bWVudHNgIG9iamVjdCxcbiAqL1xuZnVuY3Rpb24gYmFzZUlzQXJndW1lbnRzKHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IGFyZ3NUYWc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzQXJndW1lbnRzO1xuIiwidmFyIGJhc2VJc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vX2Jhc2VJc0FyZ3VtZW50cycpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gb2JqZWN0UHJvdG8ucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGFuIGBhcmd1bWVudHNgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsXG4gKiAgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJndW1lbnRzKGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcmd1bWVudHMoWzEsIDIsIDNdKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0FyZ3VtZW50cyA9IGJhc2VJc0FyZ3VtZW50cyhmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA/IGJhc2VJc0FyZ3VtZW50cyA6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdjYWxsZWUnKSAmJlxuICAgICFwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHZhbHVlLCAnY2FsbGVlJyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQXJndW1lbnRzO1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGFuIGBBcnJheWAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5KCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5KF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNBcnJheTtcbiIsIi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyBgZmFsc2VgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMy4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50aW1lcygyLCBfLnN0dWJGYWxzZSk7XG4gKiAvLyA9PiBbZmFsc2UsIGZhbHNlXVxuICovXG5mdW5jdGlvbiBzdHViRmFsc2UoKSB7XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdHViRmFsc2U7XG4iLCJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKSxcbiAgICBzdHViRmFsc2UgPSByZXF1aXJlKCcuL3N0dWJGYWxzZScpO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGV4cG9ydHNgLiAqL1xudmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgJiYgZXhwb3J0cyAmJiAhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYG1vZHVsZWAuICovXG52YXIgZnJlZU1vZHVsZSA9IGZyZWVFeHBvcnRzICYmIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlICYmICFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlO1xuXG4vKiogRGV0ZWN0IHRoZSBwb3B1bGFyIENvbW1vbkpTIGV4dGVuc2lvbiBgbW9kdWxlLmV4cG9ydHNgLiAqL1xudmFyIG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHM7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIEJ1ZmZlciA9IG1vZHVsZUV4cG9ydHMgPyByb290LkJ1ZmZlciA6IHVuZGVmaW5lZDtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUlzQnVmZmVyID0gQnVmZmVyID8gQnVmZmVyLmlzQnVmZmVyIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgYnVmZmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4zLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgYnVmZmVyLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNCdWZmZXIobmV3IEJ1ZmZlcigyKSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0J1ZmZlcihuZXcgVWludDhBcnJheSgyKSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNCdWZmZXIgPSBuYXRpdmVJc0J1ZmZlciB8fCBzdHViRmFsc2U7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNCdWZmZXI7XG4iLCIvKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBNQVhfU0FGRV9JTlRFR0VSID0gOTAwNzE5OTI1NDc0MDk5MTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IHVuc2lnbmVkIGludGVnZXIgdmFsdWVzLiAqL1xudmFyIHJlSXNVaW50ID0gL14oPzowfFsxLTldXFxkKikkLztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgaW5kZXguXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9TUFYX1NBRkVfSU5URUdFUl0gVGhlIHVwcGVyIGJvdW5kcyBvZiBhIHZhbGlkIGluZGV4LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBpbmRleCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0luZGV4KHZhbHVlLCBsZW5ndGgpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIGxlbmd0aCA9IGxlbmd0aCA9PSBudWxsID8gTUFYX1NBRkVfSU5URUdFUiA6IGxlbmd0aDtcblxuICByZXR1cm4gISFsZW5ndGggJiZcbiAgICAodHlwZSA9PSAnbnVtYmVyJyB8fFxuICAgICAgKHR5cGUgIT0gJ3N5bWJvbCcgJiYgcmVJc1VpbnQudGVzdCh2YWx1ZSkpKSAmJlxuICAgICAgICAodmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8IGxlbmd0aCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNJbmRleDtcbiIsIi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgYXJyYXktbGlrZSBsZW5ndGguXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb25cbiAqIFtgVG9MZW5ndGhgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2xlbmd0aCkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBsZW5ndGgsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0xlbmd0aCgzKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzTGVuZ3RoKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzTGVuZ3RoKEluZmluaXR5KTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0xlbmd0aCgnMycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNMZW5ndGgodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyAmJlxuICAgIHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPD0gTUFYX1NBRkVfSU5URUdFUjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0xlbmd0aDtcbiIsInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGlzTGVuZ3RoID0gcmVxdWlyZSgnLi9pc0xlbmd0aCcpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhcmdzVGFnID0gJ1tvYmplY3QgQXJndW1lbnRzXScsXG4gICAgYXJyYXlUYWcgPSAnW29iamVjdCBBcnJheV0nLFxuICAgIGJvb2xUYWcgPSAnW29iamVjdCBCb29sZWFuXScsXG4gICAgZGF0ZVRhZyA9ICdbb2JqZWN0IERhdGVdJyxcbiAgICBlcnJvclRhZyA9ICdbb2JqZWN0IEVycm9yXScsXG4gICAgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsXG4gICAgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XScsXG4gICAgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXScsXG4gICAgd2Vha01hcFRhZyA9ICdbb2JqZWN0IFdlYWtNYXBdJztcblxudmFyIGFycmF5QnVmZmVyVGFnID0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJyxcbiAgICBkYXRhVmlld1RhZyA9ICdbb2JqZWN0IERhdGFWaWV3XScsXG4gICAgZmxvYXQzMlRhZyA9ICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nLFxuICAgIGZsb2F0NjRUYWcgPSAnW29iamVjdCBGbG9hdDY0QXJyYXldJyxcbiAgICBpbnQ4VGFnID0gJ1tvYmplY3QgSW50OEFycmF5XScsXG4gICAgaW50MTZUYWcgPSAnW29iamVjdCBJbnQxNkFycmF5XScsXG4gICAgaW50MzJUYWcgPSAnW29iamVjdCBJbnQzMkFycmF5XScsXG4gICAgdWludDhUYWcgPSAnW29iamVjdCBVaW50OEFycmF5XScsXG4gICAgdWludDhDbGFtcGVkVGFnID0gJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyxcbiAgICB1aW50MTZUYWcgPSAnW29iamVjdCBVaW50MTZBcnJheV0nLFxuICAgIHVpbnQzMlRhZyA9ICdbb2JqZWN0IFVpbnQzMkFycmF5XSc7XG5cbi8qKiBVc2VkIHRvIGlkZW50aWZ5IGB0b1N0cmluZ1RhZ2AgdmFsdWVzIG9mIHR5cGVkIGFycmF5cy4gKi9cbnZhciB0eXBlZEFycmF5VGFncyA9IHt9O1xudHlwZWRBcnJheVRhZ3NbZmxvYXQzMlRhZ10gPSB0eXBlZEFycmF5VGFnc1tmbG9hdDY0VGFnXSA9XG50eXBlZEFycmF5VGFnc1tpbnQ4VGFnXSA9IHR5cGVkQXJyYXlUYWdzW2ludDE2VGFnXSA9XG50eXBlZEFycmF5VGFnc1tpbnQzMlRhZ10gPSB0eXBlZEFycmF5VGFnc1t1aW50OFRhZ10gPVxudHlwZWRBcnJheVRhZ3NbdWludDhDbGFtcGVkVGFnXSA9IHR5cGVkQXJyYXlUYWdzW3VpbnQxNlRhZ10gPVxudHlwZWRBcnJheVRhZ3NbdWludDMyVGFnXSA9IHRydWU7XG50eXBlZEFycmF5VGFnc1thcmdzVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2FycmF5VGFnXSA9XG50eXBlZEFycmF5VGFnc1thcnJheUJ1ZmZlclRhZ10gPSB0eXBlZEFycmF5VGFnc1tib29sVGFnXSA9XG50eXBlZEFycmF5VGFnc1tkYXRhVmlld1RhZ10gPSB0eXBlZEFycmF5VGFnc1tkYXRlVGFnXSA9XG50eXBlZEFycmF5VGFnc1tlcnJvclRhZ10gPSB0eXBlZEFycmF5VGFnc1tmdW5jVGFnXSA9XG50eXBlZEFycmF5VGFnc1ttYXBUYWddID0gdHlwZWRBcnJheVRhZ3NbbnVtYmVyVGFnXSA9XG50eXBlZEFycmF5VGFnc1tvYmplY3RUYWddID0gdHlwZWRBcnJheVRhZ3NbcmVnZXhwVGFnXSA9XG50eXBlZEFycmF5VGFnc1tzZXRUYWddID0gdHlwZWRBcnJheVRhZ3Nbc3RyaW5nVGFnXSA9XG50eXBlZEFycmF5VGFnc1t3ZWFrTWFwVGFnXSA9IGZhbHNlO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzVHlwZWRBcnJheWAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB0eXBlZCBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNUeXBlZEFycmF5KHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmXG4gICAgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhIXR5cGVkQXJyYXlUYWdzW2Jhc2VHZXRUYWcodmFsdWUpXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNUeXBlZEFycmF5O1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51bmFyeWAgd2l0aG91dCBzdXBwb3J0IGZvciBzdG9yaW5nIG1ldGFkYXRhLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjYXAgYXJndW1lbnRzIGZvci5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNhcHBlZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZVVuYXJ5KGZ1bmMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIGZ1bmModmFsdWUpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VVbmFyeTtcbiIsInZhciBmcmVlR2xvYmFsID0gcmVxdWlyZSgnLi9fZnJlZUdsb2JhbCcpO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGV4cG9ydHNgLiAqL1xudmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgJiYgZXhwb3J0cyAmJiAhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYG1vZHVsZWAuICovXG52YXIgZnJlZU1vZHVsZSA9IGZyZWVFeHBvcnRzICYmIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlICYmICFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlO1xuXG4vKiogRGV0ZWN0IHRoZSBwb3B1bGFyIENvbW1vbkpTIGV4dGVuc2lvbiBgbW9kdWxlLmV4cG9ydHNgLiAqL1xudmFyIG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHM7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgcHJvY2Vzc2AgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVQcm9jZXNzID0gbW9kdWxlRXhwb3J0cyAmJiBmcmVlR2xvYmFsLnByb2Nlc3M7XG5cbi8qKiBVc2VkIHRvIGFjY2VzcyBmYXN0ZXIgTm9kZS5qcyBoZWxwZXJzLiAqL1xudmFyIG5vZGVVdGlsID0gKGZ1bmN0aW9uKCkge1xuICB0cnkge1xuICAgIC8vIFVzZSBgdXRpbC50eXBlc2AgZm9yIE5vZGUuanMgMTArLlxuICAgIHZhciB0eXBlcyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5yZXF1aXJlICYmIGZyZWVNb2R1bGUucmVxdWlyZSgndXRpbCcpLnR5cGVzO1xuXG4gICAgaWYgKHR5cGVzKSB7XG4gICAgICByZXR1cm4gdHlwZXM7XG4gICAgfVxuXG4gICAgLy8gTGVnYWN5IGBwcm9jZXNzLmJpbmRpbmcoJ3V0aWwnKWAgZm9yIE5vZGUuanMgPCAxMC5cbiAgICByZXR1cm4gZnJlZVByb2Nlc3MgJiYgZnJlZVByb2Nlc3MuYmluZGluZyAmJiBmcmVlUHJvY2Vzcy5iaW5kaW5nKCd1dGlsJyk7XG4gIH0gY2F0Y2ggKGUpIHt9XG59KCkpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5vZGVVdGlsO1xuIiwidmFyIGJhc2VJc1R5cGVkQXJyYXkgPSByZXF1aXJlKCcuL19iYXNlSXNUeXBlZEFycmF5JyksXG4gICAgYmFzZVVuYXJ5ID0gcmVxdWlyZSgnLi9fYmFzZVVuYXJ5JyksXG4gICAgbm9kZVV0aWwgPSByZXF1aXJlKCcuL19ub2RlVXRpbCcpO1xuXG4vKiBOb2RlLmpzIGhlbHBlciByZWZlcmVuY2VzLiAqL1xudmFyIG5vZGVJc1R5cGVkQXJyYXkgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc1R5cGVkQXJyYXk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIHR5cGVkIGFycmF5LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdHlwZWQgYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1R5cGVkQXJyYXkobmV3IFVpbnQ4QXJyYXkpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNUeXBlZEFycmF5KFtdKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc1R5cGVkQXJyYXkgPSBub2RlSXNUeXBlZEFycmF5ID8gYmFzZVVuYXJ5KG5vZGVJc1R5cGVkQXJyYXkpIDogYmFzZUlzVHlwZWRBcnJheTtcblxubW9kdWxlLmV4cG9ydHMgPSBpc1R5cGVkQXJyYXk7XG4iLCJ2YXIgYmFzZVRpbWVzID0gcmVxdWlyZSgnLi9fYmFzZVRpbWVzJyksXG4gICAgaXNBcmd1bWVudHMgPSByZXF1aXJlKCcuL2lzQXJndW1lbnRzJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzQnVmZmVyID0gcmVxdWlyZSgnLi9pc0J1ZmZlcicpLFxuICAgIGlzSW5kZXggPSByZXF1aXJlKCcuL19pc0luZGV4JyksXG4gICAgaXNUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9pc1R5cGVkQXJyYXknKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIHRoZSBhcnJheS1saWtlIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtib29sZWFufSBpbmhlcml0ZWQgU3BlY2lmeSByZXR1cm5pbmcgaW5oZXJpdGVkIHByb3BlcnR5IG5hbWVzLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gYXJyYXlMaWtlS2V5cyh2YWx1ZSwgaW5oZXJpdGVkKSB7XG4gIHZhciBpc0FyciA9IGlzQXJyYXkodmFsdWUpLFxuICAgICAgaXNBcmcgPSAhaXNBcnIgJiYgaXNBcmd1bWVudHModmFsdWUpLFxuICAgICAgaXNCdWZmID0gIWlzQXJyICYmICFpc0FyZyAmJiBpc0J1ZmZlcih2YWx1ZSksXG4gICAgICBpc1R5cGUgPSAhaXNBcnIgJiYgIWlzQXJnICYmICFpc0J1ZmYgJiYgaXNUeXBlZEFycmF5KHZhbHVlKSxcbiAgICAgIHNraXBJbmRleGVzID0gaXNBcnIgfHwgaXNBcmcgfHwgaXNCdWZmIHx8IGlzVHlwZSxcbiAgICAgIHJlc3VsdCA9IHNraXBJbmRleGVzID8gYmFzZVRpbWVzKHZhbHVlLmxlbmd0aCwgU3RyaW5nKSA6IFtdLFxuICAgICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDtcblxuICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICBpZiAoKGluaGVyaXRlZCB8fCBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrZXkpKSAmJlxuICAgICAgICAhKHNraXBJbmRleGVzICYmIChcbiAgICAgICAgICAgLy8gU2FmYXJpIDkgaGFzIGVudW1lcmFibGUgYGFyZ3VtZW50cy5sZW5ndGhgIGluIHN0cmljdCBtb2RlLlxuICAgICAgICAgICBrZXkgPT0gJ2xlbmd0aCcgfHxcbiAgICAgICAgICAgLy8gTm9kZS5qcyAwLjEwIGhhcyBlbnVtZXJhYmxlIG5vbi1pbmRleCBwcm9wZXJ0aWVzIG9uIGJ1ZmZlcnMuXG4gICAgICAgICAgIChpc0J1ZmYgJiYgKGtleSA9PSAnb2Zmc2V0JyB8fCBrZXkgPT0gJ3BhcmVudCcpKSB8fFxuICAgICAgICAgICAvLyBQaGFudG9tSlMgMiBoYXMgZW51bWVyYWJsZSBub24taW5kZXggcHJvcGVydGllcyBvbiB0eXBlZCBhcnJheXMuXG4gICAgICAgICAgIChpc1R5cGUgJiYgKGtleSA9PSAnYnVmZmVyJyB8fCBrZXkgPT0gJ2J5dGVMZW5ndGgnIHx8IGtleSA9PSAnYnl0ZU9mZnNldCcpKSB8fFxuICAgICAgICAgICAvLyBTa2lwIGluZGV4IHByb3BlcnRpZXMuXG4gICAgICAgICAgIGlzSW5kZXgoa2V5LCBsZW5ndGgpXG4gICAgICAgICkpKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5TGlrZUtleXM7XG4iLCIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhIHByb3RvdHlwZSBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwcm90b3R5cGUsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNQcm90b3R5cGUodmFsdWUpIHtcbiAgdmFyIEN0b3IgPSB2YWx1ZSAmJiB2YWx1ZS5jb25zdHJ1Y3RvcixcbiAgICAgIHByb3RvID0gKHR5cGVvZiBDdG9yID09ICdmdW5jdGlvbicgJiYgQ3Rvci5wcm90b3R5cGUpIHx8IG9iamVjdFByb3RvO1xuXG4gIHJldHVybiB2YWx1ZSA9PT0gcHJvdG87XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNQcm90b3R5cGU7XG4iLCIvKipcbiAqIENyZWF0ZXMgYSB1bmFyeSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggaXRzIGFyZ3VtZW50IHRyYW5zZm9ybWVkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIFRoZSBhcmd1bWVudCB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gb3ZlckFyZyhmdW5jLCB0cmFuc2Zvcm0pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiBmdW5jKHRyYW5zZm9ybShhcmcpKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvdmVyQXJnO1xuIiwidmFyIG92ZXJBcmcgPSByZXF1aXJlKCcuL19vdmVyQXJnJyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVLZXlzID0gb3ZlckFyZyhPYmplY3Qua2V5cywgT2JqZWN0KTtcblxubW9kdWxlLmV4cG9ydHMgPSBuYXRpdmVLZXlzO1xuIiwidmFyIGlzUHJvdG90eXBlID0gcmVxdWlyZSgnLi9faXNQcm90b3R5cGUnKSxcbiAgICBuYXRpdmVLZXlzID0gcmVxdWlyZSgnLi9fbmF0aXZlS2V5cycpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmtleXNgIHdoaWNoIGRvZXNuJ3QgdHJlYXQgc3BhcnNlIGFycmF5cyBhcyBkZW5zZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gYmFzZUtleXMob2JqZWN0KSB7XG4gIGlmICghaXNQcm90b3R5cGUob2JqZWN0KSkge1xuICAgIHJldHVybiBuYXRpdmVLZXlzKG9iamVjdCk7XG4gIH1cbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYga2V5ICE9ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUtleXM7XG4iLCJ2YXIgaXNGdW5jdGlvbiA9IHJlcXVpcmUoJy4vaXNGdW5jdGlvbicpLFxuICAgIGlzTGVuZ3RoID0gcmVxdWlyZSgnLi9pc0xlbmd0aCcpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UuIEEgdmFsdWUgaXMgY29uc2lkZXJlZCBhcnJheS1saWtlIGlmIGl0J3NcbiAqIG5vdCBhIGZ1bmN0aW9uIGFuZCBoYXMgYSBgdmFsdWUubGVuZ3RoYCB0aGF0J3MgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gb3JcbiAqIGVxdWFsIHRvIGAwYCBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUmAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKCdhYmMnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICFpc0Z1bmN0aW9uKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0FycmF5TGlrZTtcbiIsInZhciBhcnJheUxpa2VLZXlzID0gcmVxdWlyZSgnLi9fYXJyYXlMaWtlS2V5cycpLFxuICAgIGJhc2VLZXlzID0gcmVxdWlyZSgnLi9fYmFzZUtleXMnKSxcbiAgICBpc0FycmF5TGlrZSA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2UnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBgb2JqZWN0YC5cbiAqXG4gKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy4gU2VlIHRoZVxuICogW0VTIHNwZWNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5rZXlzKVxuICogZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLmtleXMobmV3IEZvbyk7XG4gKiAvLyA9PiBbJ2EnLCAnYiddIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gKlxuICogXy5rZXlzKCdoaScpO1xuICogLy8gPT4gWycwJywgJzEnXVxuICovXG5mdW5jdGlvbiBrZXlzKG9iamVjdCkge1xuICByZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KSA/IGFycmF5TGlrZUtleXMob2JqZWN0KSA6IGJhc2VLZXlzKG9iamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ga2V5cztcbiIsInZhciBjb3B5T2JqZWN0ID0gcmVxdWlyZSgnLi9fY29weU9iamVjdCcpLFxuICAgIGtleXMgPSByZXF1aXJlKCcuL2tleXMnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5hc3NpZ25gIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlc1xuICogb3IgYGN1c3RvbWl6ZXJgIGZ1bmN0aW9ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VBc3NpZ24ob2JqZWN0LCBzb3VyY2UpIHtcbiAgcmV0dXJuIG9iamVjdCAmJiBjb3B5T2JqZWN0KHNvdXJjZSwga2V5cyhzb3VyY2UpLCBvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VBc3NpZ247XG4iLCIvKipcbiAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZVxuICogW2BPYmplY3Qua2V5c2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5rZXlzKVxuICogZXhjZXB0IHRoYXQgaXQgaW5jbHVkZXMgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydGllcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gbmF0aXZlS2V5c0luKG9iamVjdCkge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIGlmIChvYmplY3QgIT0gbnVsbCkge1xuICAgIGZvciAodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuYXRpdmVLZXlzSW47XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0JyksXG4gICAgaXNQcm90b3R5cGUgPSByZXF1aXJlKCcuL19pc1Byb3RvdHlwZScpLFxuICAgIG5hdGl2ZUtleXNJbiA9IHJlcXVpcmUoJy4vX25hdGl2ZUtleXNJbicpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmtleXNJbmAgd2hpY2ggZG9lc24ndCB0cmVhdCBzcGFyc2UgYXJyYXlzIGFzIGRlbnNlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICovXG5mdW5jdGlvbiBiYXNlS2V5c0luKG9iamVjdCkge1xuICBpZiAoIWlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICByZXR1cm4gbmF0aXZlS2V5c0luKG9iamVjdCk7XG4gIH1cbiAgdmFyIGlzUHJvdG8gPSBpc1Byb3RvdHlwZShvYmplY3QpLFxuICAgICAgcmVzdWx0ID0gW107XG5cbiAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgIGlmICghKGtleSA9PSAnY29uc3RydWN0b3InICYmIChpc1Byb3RvIHx8ICFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkpKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VLZXlzSW47XG4iLCJ2YXIgYXJyYXlMaWtlS2V5cyA9IHJlcXVpcmUoJy4vX2FycmF5TGlrZUtleXMnKSxcbiAgICBiYXNlS2V5c0luID0gcmVxdWlyZSgnLi9fYmFzZUtleXNJbicpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgYG9iamVjdGAuXG4gKlxuICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy5rZXlzSW4obmV3IEZvbyk7XG4gKiAvLyA9PiBbJ2EnLCAnYicsICdjJ10gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAqL1xuZnVuY3Rpb24ga2V5c0luKG9iamVjdCkge1xuICByZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KSA/IGFycmF5TGlrZUtleXMob2JqZWN0LCB0cnVlKSA6IGJhc2VLZXlzSW4ob2JqZWN0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBrZXlzSW47XG4iLCJ2YXIgY29weU9iamVjdCA9IHJlcXVpcmUoJy4vX2NvcHlPYmplY3QnKSxcbiAgICBrZXlzSW4gPSByZXF1aXJlKCcuL2tleXNJbicpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmFzc2lnbkluYCB3aXRob3V0IHN1cHBvcnQgZm9yIG11bHRpcGxlIHNvdXJjZXNcbiAqIG9yIGBjdXN0b21pemVyYCBmdW5jdGlvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG5mdW5jdGlvbiBiYXNlQXNzaWduSW4ob2JqZWN0LCBzb3VyY2UpIHtcbiAgcmV0dXJuIG9iamVjdCAmJiBjb3B5T2JqZWN0KHNvdXJjZSwga2V5c0luKHNvdXJjZSksIG9iamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUFzc2lnbkluO1xuIiwidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZXhwb3J0c2AuICovXG52YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICYmICFleHBvcnRzLm5vZGVUeXBlICYmIGV4cG9ydHM7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYC4gKi9cbnZhciBmcmVlTW9kdWxlID0gZnJlZUV4cG9ydHMgJiYgdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiYgIW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7XG5cbi8qKiBEZXRlY3QgdGhlIHBvcHVsYXIgQ29tbW9uSlMgZXh0ZW5zaW9uIGBtb2R1bGUuZXhwb3J0c2AuICovXG52YXIgbW9kdWxlRXhwb3J0cyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5leHBvcnRzID09PSBmcmVlRXhwb3J0cztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgQnVmZmVyID0gbW9kdWxlRXhwb3J0cyA/IHJvb3QuQnVmZmVyIDogdW5kZWZpbmVkLFxuICAgIGFsbG9jVW5zYWZlID0gQnVmZmVyID8gQnVmZmVyLmFsbG9jVW5zYWZlIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjbG9uZSBvZiAgYGJ1ZmZlcmAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QnVmZmVyfSBidWZmZXIgVGhlIGJ1ZmZlciB0byBjbG9uZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gKiBAcmV0dXJucyB7QnVmZmVyfSBSZXR1cm5zIHRoZSBjbG9uZWQgYnVmZmVyLlxuICovXG5mdW5jdGlvbiBjbG9uZUJ1ZmZlcihidWZmZXIsIGlzRGVlcCkge1xuICBpZiAoaXNEZWVwKSB7XG4gICAgcmV0dXJuIGJ1ZmZlci5zbGljZSgpO1xuICB9XG4gIHZhciBsZW5ndGggPSBidWZmZXIubGVuZ3RoLFxuICAgICAgcmVzdWx0ID0gYWxsb2NVbnNhZmUgPyBhbGxvY1Vuc2FmZShsZW5ndGgpIDogbmV3IGJ1ZmZlci5jb25zdHJ1Y3RvcihsZW5ndGgpO1xuXG4gIGJ1ZmZlci5jb3B5KHJlc3VsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmVCdWZmZXI7XG4iLCIvKipcbiAqIENvcGllcyB0aGUgdmFsdWVzIG9mIGBzb3VyY2VgIHRvIGBhcnJheWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IHNvdXJjZSBUaGUgYXJyYXkgdG8gY29weSB2YWx1ZXMgZnJvbS5cbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheT1bXV0gVGhlIGFycmF5IHRvIGNvcHkgdmFsdWVzIHRvLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gKi9cbmZ1bmN0aW9uIGNvcHlBcnJheShzb3VyY2UsIGFycmF5KSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gc291cmNlLmxlbmd0aDtcblxuICBhcnJheSB8fCAoYXJyYXkgPSBBcnJheShsZW5ndGgpKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBhcnJheVtpbmRleF0gPSBzb3VyY2VbaW5kZXhdO1xuICB9XG4gIHJldHVybiBhcnJheTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb3B5QXJyYXk7XG4iLCIvKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5maWx0ZXJgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYXJyYXlGaWx0ZXIoYXJyYXksIHByZWRpY2F0ZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgcmVzdWx0ID0gW107XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlGaWx0ZXI7XG4iLCIvKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgZW1wdHkgYXJyYXkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjEzLjBcbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBlbXB0eSBhcnJheS5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIGFycmF5cyA9IF8udGltZXMoMiwgXy5zdHViQXJyYXkpO1xuICpcbiAqIGNvbnNvbGUubG9nKGFycmF5cyk7XG4gKiAvLyA9PiBbW10sIFtdXVxuICpcbiAqIGNvbnNvbGUubG9nKGFycmF5c1swXSA9PT0gYXJyYXlzWzFdKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIHN0dWJBcnJheSgpIHtcbiAgcmV0dXJuIFtdO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0dWJBcnJheTtcbiIsInZhciBhcnJheUZpbHRlciA9IHJlcXVpcmUoJy4vX2FycmF5RmlsdGVyJyksXG4gICAgc3R1YkFycmF5ID0gcmVxdWlyZSgnLi9zdHViQXJyYXknKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSBvYmplY3RQcm90by5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUdldFN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2Ygc3ltYm9scy5cbiAqL1xudmFyIGdldFN5bWJvbHMgPSAhbmF0aXZlR2V0U3ltYm9scyA/IHN0dWJBcnJheSA6IGZ1bmN0aW9uKG9iamVjdCkge1xuICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gIHJldHVybiBhcnJheUZpbHRlcihuYXRpdmVHZXRTeW1ib2xzKG9iamVjdCksIGZ1bmN0aW9uKHN5bWJvbCkge1xuICAgIHJldHVybiBwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKG9iamVjdCwgc3ltYm9sKTtcbiAgfSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFN5bWJvbHM7XG4iLCJ2YXIgY29weU9iamVjdCA9IHJlcXVpcmUoJy4vX2NvcHlPYmplY3QnKSxcbiAgICBnZXRTeW1ib2xzID0gcmVxdWlyZSgnLi9fZ2V0U3ltYm9scycpO1xuXG4vKipcbiAqIENvcGllcyBvd24gc3ltYm9scyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyBmcm9tLlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIHRvLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gY29weVN5bWJvbHMoc291cmNlLCBvYmplY3QpIHtcbiAgcmV0dXJuIGNvcHlPYmplY3Qoc291cmNlLCBnZXRTeW1ib2xzKHNvdXJjZSksIG9iamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29weVN5bWJvbHM7XG4iLCIvKipcbiAqIEFwcGVuZHMgdGhlIGVsZW1lbnRzIG9mIGB2YWx1ZXNgIHRvIGBhcnJheWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBhcHBlbmQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlQdXNoKGFycmF5LCB2YWx1ZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSB2YWx1ZXMubGVuZ3RoLFxuICAgICAgb2Zmc2V0ID0gYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgYXJyYXlbb2Zmc2V0ICsgaW5kZXhdID0gdmFsdWVzW2luZGV4XTtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlQdXNoO1xuIiwidmFyIG92ZXJBcmcgPSByZXF1aXJlKCcuL19vdmVyQXJnJyk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIGdldFByb3RvdHlwZSA9IG92ZXJBcmcoT2JqZWN0LmdldFByb3RvdHlwZU9mLCBPYmplY3QpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFByb3RvdHlwZTtcbiIsInZhciBhcnJheVB1c2ggPSByZXF1aXJlKCcuL19hcnJheVB1c2gnKSxcbiAgICBnZXRQcm90b3R5cGUgPSByZXF1aXJlKCcuL19nZXRQcm90b3R5cGUnKSxcbiAgICBnZXRTeW1ib2xzID0gcmVxdWlyZSgnLi9fZ2V0U3ltYm9scycpLFxuICAgIHN0dWJBcnJheSA9IHJlcXVpcmUoJy4vc3R1YkFycmF5Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVHZXRTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2Ygc3ltYm9scy5cbiAqL1xudmFyIGdldFN5bWJvbHNJbiA9ICFuYXRpdmVHZXRTeW1ib2xzID8gc3R1YkFycmF5IDogZnVuY3Rpb24ob2JqZWN0KSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgd2hpbGUgKG9iamVjdCkge1xuICAgIGFycmF5UHVzaChyZXN1bHQsIGdldFN5bWJvbHMob2JqZWN0KSk7XG4gICAgb2JqZWN0ID0gZ2V0UHJvdG90eXBlKG9iamVjdCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0U3ltYm9sc0luO1xuIiwidmFyIGNvcHlPYmplY3QgPSByZXF1aXJlKCcuL19jb3B5T2JqZWN0JyksXG4gICAgZ2V0U3ltYm9sc0luID0gcmVxdWlyZSgnLi9fZ2V0U3ltYm9sc0luJyk7XG5cbi8qKlxuICogQ29waWVzIG93biBhbmQgaW5oZXJpdGVkIHN5bWJvbHMgb2YgYHNvdXJjZWAgdG8gYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCB0byBjb3B5IHN5bWJvbHMgZnJvbS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyB0by5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGNvcHlTeW1ib2xzSW4oc291cmNlLCBvYmplY3QpIHtcbiAgcmV0dXJuIGNvcHlPYmplY3Qoc291cmNlLCBnZXRTeW1ib2xzSW4oc291cmNlKSwgb2JqZWN0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb3B5U3ltYm9sc0luO1xuIiwidmFyIGFycmF5UHVzaCA9IHJlcXVpcmUoJy4vX2FycmF5UHVzaCcpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgZ2V0QWxsS2V5c2AgYW5kIGBnZXRBbGxLZXlzSW5gIHdoaWNoIHVzZXNcbiAqIGBrZXlzRnVuY2AgYW5kIGBzeW1ib2xzRnVuY2AgdG8gZ2V0IHRoZSBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZFxuICogc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtGdW5jdGlvbn0ga2V5c0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUga2V5cyBvZiBgb2JqZWN0YC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHN5bWJvbHNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzLlxuICovXG5mdW5jdGlvbiBiYXNlR2V0QWxsS2V5cyhvYmplY3QsIGtleXNGdW5jLCBzeW1ib2xzRnVuYykge1xuICB2YXIgcmVzdWx0ID0ga2V5c0Z1bmMob2JqZWN0KTtcbiAgcmV0dXJuIGlzQXJyYXkob2JqZWN0KSA/IHJlc3VsdCA6IGFycmF5UHVzaChyZXN1bHQsIHN5bWJvbHNGdW5jKG9iamVjdCkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VHZXRBbGxLZXlzO1xuIiwidmFyIGJhc2VHZXRBbGxLZXlzID0gcmVxdWlyZSgnLi9fYmFzZUdldEFsbEtleXMnKSxcbiAgICBnZXRTeW1ib2xzID0gcmVxdWlyZSgnLi9fZ2V0U3ltYm9scycpLFxuICAgIGtleXMgPSByZXF1aXJlKCcuL2tleXMnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIG93biBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzLlxuICovXG5mdW5jdGlvbiBnZXRBbGxLZXlzKG9iamVjdCkge1xuICByZXR1cm4gYmFzZUdldEFsbEtleXMob2JqZWN0LCBrZXlzLCBnZXRTeW1ib2xzKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRBbGxLZXlzO1xuIiwidmFyIGJhc2VHZXRBbGxLZXlzID0gcmVxdWlyZSgnLi9fYmFzZUdldEFsbEtleXMnKSxcbiAgICBnZXRTeW1ib2xzSW4gPSByZXF1aXJlKCcuL19nZXRTeW1ib2xzSW4nKSxcbiAgICBrZXlzSW4gPSByZXF1aXJlKCcuL2tleXNJbicpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBhbmRcbiAqIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMuXG4gKi9cbmZ1bmN0aW9uIGdldEFsbEtleXNJbihvYmplY3QpIHtcbiAgcmV0dXJuIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5c0luLCBnZXRTeW1ib2xzSW4pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEFsbEtleXNJbjtcbiIsInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKSxcbiAgICByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgRGF0YVZpZXcgPSBnZXROYXRpdmUocm9vdCwgJ0RhdGFWaWV3Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gRGF0YVZpZXc7XG4iLCJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyksXG4gICAgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIFByb21pc2UgPSBnZXROYXRpdmUocm9vdCwgJ1Byb21pc2UnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBQcm9taXNlO1xuIiwidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpLFxuICAgIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBTZXQgPSBnZXROYXRpdmUocm9vdCwgJ1NldCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNldDtcbiIsInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKSxcbiAgICByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgV2Vha01hcCA9IGdldE5hdGl2ZShyb290LCAnV2Vha01hcCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFdlYWtNYXA7XG4iLCJ2YXIgRGF0YVZpZXcgPSByZXF1aXJlKCcuL19EYXRhVmlldycpLFxuICAgIE1hcCA9IHJlcXVpcmUoJy4vX01hcCcpLFxuICAgIFByb21pc2UgPSByZXF1aXJlKCcuL19Qcm9taXNlJyksXG4gICAgU2V0ID0gcmVxdWlyZSgnLi9fU2V0JyksXG4gICAgV2Vha01hcCA9IHJlcXVpcmUoJy4vX1dlYWtNYXAnKSxcbiAgICBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIHRvU291cmNlID0gcmVxdWlyZSgnLi9fdG9Tb3VyY2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nLFxuICAgIHByb21pc2VUYWcgPSAnW29iamVjdCBQcm9taXNlXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgd2Vha01hcFRhZyA9ICdbb2JqZWN0IFdlYWtNYXBdJztcblxudmFyIGRhdGFWaWV3VGFnID0gJ1tvYmplY3QgRGF0YVZpZXddJztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG1hcHMsIHNldHMsIGFuZCB3ZWFrbWFwcy4gKi9cbnZhciBkYXRhVmlld0N0b3JTdHJpbmcgPSB0b1NvdXJjZShEYXRhVmlldyksXG4gICAgbWFwQ3RvclN0cmluZyA9IHRvU291cmNlKE1hcCksXG4gICAgcHJvbWlzZUN0b3JTdHJpbmcgPSB0b1NvdXJjZShQcm9taXNlKSxcbiAgICBzZXRDdG9yU3RyaW5nID0gdG9Tb3VyY2UoU2V0KSxcbiAgICB3ZWFrTWFwQ3RvclN0cmluZyA9IHRvU291cmNlKFdlYWtNYXApO1xuXG4vKipcbiAqIEdldHMgdGhlIGB0b1N0cmluZ1RhZ2Agb2YgYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLlxuICovXG52YXIgZ2V0VGFnID0gYmFzZUdldFRhZztcblxuLy8gRmFsbGJhY2sgZm9yIGRhdGEgdmlld3MsIG1hcHMsIHNldHMsIGFuZCB3ZWFrIG1hcHMgaW4gSUUgMTEgYW5kIHByb21pc2VzIGluIE5vZGUuanMgPCA2LlxuaWYgKChEYXRhVmlldyAmJiBnZXRUYWcobmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcigxKSkpICE9IGRhdGFWaWV3VGFnKSB8fFxuICAgIChNYXAgJiYgZ2V0VGFnKG5ldyBNYXApICE9IG1hcFRhZykgfHxcbiAgICAoUHJvbWlzZSAmJiBnZXRUYWcoUHJvbWlzZS5yZXNvbHZlKCkpICE9IHByb21pc2VUYWcpIHx8XG4gICAgKFNldCAmJiBnZXRUYWcobmV3IFNldCkgIT0gc2V0VGFnKSB8fFxuICAgIChXZWFrTWFwICYmIGdldFRhZyhuZXcgV2Vha01hcCkgIT0gd2Vha01hcFRhZykpIHtcbiAgZ2V0VGFnID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICB2YXIgcmVzdWx0ID0gYmFzZUdldFRhZyh2YWx1ZSksXG4gICAgICAgIEN0b3IgPSByZXN1bHQgPT0gb2JqZWN0VGFnID8gdmFsdWUuY29uc3RydWN0b3IgOiB1bmRlZmluZWQsXG4gICAgICAgIGN0b3JTdHJpbmcgPSBDdG9yID8gdG9Tb3VyY2UoQ3RvcikgOiAnJztcblxuICAgIGlmIChjdG9yU3RyaW5nKSB7XG4gICAgICBzd2l0Y2ggKGN0b3JTdHJpbmcpIHtcbiAgICAgICAgY2FzZSBkYXRhVmlld0N0b3JTdHJpbmc6IHJldHVybiBkYXRhVmlld1RhZztcbiAgICAgICAgY2FzZSBtYXBDdG9yU3RyaW5nOiByZXR1cm4gbWFwVGFnO1xuICAgICAgICBjYXNlIHByb21pc2VDdG9yU3RyaW5nOiByZXR1cm4gcHJvbWlzZVRhZztcbiAgICAgICAgY2FzZSBzZXRDdG9yU3RyaW5nOiByZXR1cm4gc2V0VGFnO1xuICAgICAgICBjYXNlIHdlYWtNYXBDdG9yU3RyaW5nOiByZXR1cm4gd2Vha01hcFRhZztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRUYWc7XG4iLCIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIEluaXRpYWxpemVzIGFuIGFycmF5IGNsb25lLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY2xvbmUuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLlxuICovXG5mdW5jdGlvbiBpbml0Q2xvbmVBcnJheShhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgcmVzdWx0ID0gbmV3IGFycmF5LmNvbnN0cnVjdG9yKGxlbmd0aCk7XG5cbiAgLy8gQWRkIHByb3BlcnRpZXMgYXNzaWduZWQgYnkgYFJlZ0V4cCNleGVjYC5cbiAgaWYgKGxlbmd0aCAmJiB0eXBlb2YgYXJyYXlbMF0gPT0gJ3N0cmluZycgJiYgaGFzT3duUHJvcGVydHkuY2FsbChhcnJheSwgJ2luZGV4JykpIHtcbiAgICByZXN1bHQuaW5kZXggPSBhcnJheS5pbmRleDtcbiAgICByZXN1bHQuaW5wdXQgPSBhcnJheS5pbnB1dDtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGluaXRDbG9uZUFycmF5O1xuIiwidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIFVpbnQ4QXJyYXkgPSByb290LlVpbnQ4QXJyYXk7XG5cbm1vZHVsZS5leHBvcnRzID0gVWludDhBcnJheTtcbiIsInZhciBVaW50OEFycmF5ID0gcmVxdWlyZSgnLi9fVWludDhBcnJheScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgYXJyYXlCdWZmZXJgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5QnVmZmVyfSBhcnJheUJ1ZmZlciBUaGUgYXJyYXkgYnVmZmVyIHRvIGNsb25lLlxuICogQHJldHVybnMge0FycmF5QnVmZmVyfSBSZXR1cm5zIHRoZSBjbG9uZWQgYXJyYXkgYnVmZmVyLlxuICovXG5mdW5jdGlvbiBjbG9uZUFycmF5QnVmZmVyKGFycmF5QnVmZmVyKSB7XG4gIHZhciByZXN1bHQgPSBuZXcgYXJyYXlCdWZmZXIuY29uc3RydWN0b3IoYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCk7XG4gIG5ldyBVaW50OEFycmF5KHJlc3VsdCkuc2V0KG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmVBcnJheUJ1ZmZlcjtcbiIsInZhciBjbG9uZUFycmF5QnVmZmVyID0gcmVxdWlyZSgnLi9fY2xvbmVBcnJheUJ1ZmZlcicpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgZGF0YVZpZXdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YVZpZXcgVGhlIGRhdGEgdmlldyB0byBjbG9uZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgZGF0YSB2aWV3LlxuICovXG5mdW5jdGlvbiBjbG9uZURhdGFWaWV3KGRhdGFWaWV3LCBpc0RlZXApIHtcbiAgdmFyIGJ1ZmZlciA9IGlzRGVlcCA/IGNsb25lQXJyYXlCdWZmZXIoZGF0YVZpZXcuYnVmZmVyKSA6IGRhdGFWaWV3LmJ1ZmZlcjtcbiAgcmV0dXJuIG5ldyBkYXRhVmlldy5jb25zdHJ1Y3RvcihidWZmZXIsIGRhdGFWaWV3LmJ5dGVPZmZzZXQsIGRhdGFWaWV3LmJ5dGVMZW5ndGgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb25lRGF0YVZpZXc7XG4iLCIvKiogVXNlZCB0byBtYXRjaCBgUmVnRXhwYCBmbGFncyBmcm9tIHRoZWlyIGNvZXJjZWQgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUZsYWdzID0gL1xcdyokLztcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgYHJlZ2V4cGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSByZWdleHAgVGhlIHJlZ2V4cCB0byBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCByZWdleHAuXG4gKi9cbmZ1bmN0aW9uIGNsb25lUmVnRXhwKHJlZ2V4cCkge1xuICB2YXIgcmVzdWx0ID0gbmV3IHJlZ2V4cC5jb25zdHJ1Y3RvcihyZWdleHAuc291cmNlLCByZUZsYWdzLmV4ZWMocmVnZXhwKSk7XG4gIHJlc3VsdC5sYXN0SW5kZXggPSByZWdleHAubGFzdEluZGV4O1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb25lUmVnRXhwO1xuIiwidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpO1xuXG4vKiogVXNlZCB0byBjb252ZXJ0IHN5bWJvbHMgdG8gcHJpbWl0aXZlcyBhbmQgc3RyaW5ncy4gKi9cbnZhciBzeW1ib2xQcm90byA9IFN5bWJvbCA/IFN5bWJvbC5wcm90b3R5cGUgOiB1bmRlZmluZWQsXG4gICAgc3ltYm9sVmFsdWVPZiA9IHN5bWJvbFByb3RvID8gc3ltYm9sUHJvdG8udmFsdWVPZiA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgdGhlIGBzeW1ib2xgIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHN5bWJvbCBUaGUgc3ltYm9sIG9iamVjdCB0byBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCBzeW1ib2wgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBjbG9uZVN5bWJvbChzeW1ib2wpIHtcbiAgcmV0dXJuIHN5bWJvbFZhbHVlT2YgPyBPYmplY3Qoc3ltYm9sVmFsdWVPZi5jYWxsKHN5bWJvbCkpIDoge307XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmVTeW1ib2w7XG4iLCJ2YXIgY2xvbmVBcnJheUJ1ZmZlciA9IHJlcXVpcmUoJy4vX2Nsb25lQXJyYXlCdWZmZXInKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgYHR5cGVkQXJyYXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gdHlwZWRBcnJheSBUaGUgdHlwZWQgYXJyYXkgdG8gY2xvbmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIHR5cGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBjbG9uZVR5cGVkQXJyYXkodHlwZWRBcnJheSwgaXNEZWVwKSB7XG4gIHZhciBidWZmZXIgPSBpc0RlZXAgPyBjbG9uZUFycmF5QnVmZmVyKHR5cGVkQXJyYXkuYnVmZmVyKSA6IHR5cGVkQXJyYXkuYnVmZmVyO1xuICByZXR1cm4gbmV3IHR5cGVkQXJyYXkuY29uc3RydWN0b3IoYnVmZmVyLCB0eXBlZEFycmF5LmJ5dGVPZmZzZXQsIHR5cGVkQXJyYXkubGVuZ3RoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbG9uZVR5cGVkQXJyYXk7XG4iLCJ2YXIgY2xvbmVBcnJheUJ1ZmZlciA9IHJlcXVpcmUoJy4vX2Nsb25lQXJyYXlCdWZmZXInKSxcbiAgICBjbG9uZURhdGFWaWV3ID0gcmVxdWlyZSgnLi9fY2xvbmVEYXRhVmlldycpLFxuICAgIGNsb25lUmVnRXhwID0gcmVxdWlyZSgnLi9fY2xvbmVSZWdFeHAnKSxcbiAgICBjbG9uZVN5bWJvbCA9IHJlcXVpcmUoJy4vX2Nsb25lU3ltYm9sJyksXG4gICAgY2xvbmVUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9fY2xvbmVUeXBlZEFycmF5Jyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXG4gICAgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXScsXG4gICAgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbnZhciBhcnJheUJ1ZmZlclRhZyA9ICdbb2JqZWN0IEFycmF5QnVmZmVyXScsXG4gICAgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nLFxuICAgIGZsb2F0MzJUYWcgPSAnW29iamVjdCBGbG9hdDMyQXJyYXldJyxcbiAgICBmbG9hdDY0VGFnID0gJ1tvYmplY3QgRmxvYXQ2NEFycmF5XScsXG4gICAgaW50OFRhZyA9ICdbb2JqZWN0IEludDhBcnJheV0nLFxuICAgIGludDE2VGFnID0gJ1tvYmplY3QgSW50MTZBcnJheV0nLFxuICAgIGludDMyVGFnID0gJ1tvYmplY3QgSW50MzJBcnJheV0nLFxuICAgIHVpbnQ4VGFnID0gJ1tvYmplY3QgVWludDhBcnJheV0nLFxuICAgIHVpbnQ4Q2xhbXBlZFRhZyA9ICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScsXG4gICAgdWludDE2VGFnID0gJ1tvYmplY3QgVWludDE2QXJyYXldJyxcbiAgICB1aW50MzJUYWcgPSAnW29iamVjdCBVaW50MzJBcnJheV0nO1xuXG4vKipcbiAqIEluaXRpYWxpemVzIGFuIG9iamVjdCBjbG9uZSBiYXNlZCBvbiBpdHMgYHRvU3RyaW5nVGFnYC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBmdW5jdGlvbiBvbmx5IHN1cHBvcnRzIGNsb25pbmcgdmFsdWVzIHdpdGggdGFncyBvZlxuICogYEJvb2xlYW5gLCBgRGF0ZWAsIGBFcnJvcmAsIGBNYXBgLCBgTnVtYmVyYCwgYFJlZ0V4cGAsIGBTZXRgLCBvciBgU3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZyBUaGUgYHRvU3RyaW5nVGFnYCBvZiB0aGUgb2JqZWN0IHRvIGNsb25lLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLlxuICovXG5mdW5jdGlvbiBpbml0Q2xvbmVCeVRhZyhvYmplY3QsIHRhZywgaXNEZWVwKSB7XG4gIHZhciBDdG9yID0gb2JqZWN0LmNvbnN0cnVjdG9yO1xuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgYXJyYXlCdWZmZXJUYWc6XG4gICAgICByZXR1cm4gY2xvbmVBcnJheUJ1ZmZlcihvYmplY3QpO1xuXG4gICAgY2FzZSBib29sVGFnOlxuICAgIGNhc2UgZGF0ZVRhZzpcbiAgICAgIHJldHVybiBuZXcgQ3Rvcigrb2JqZWN0KTtcblxuICAgIGNhc2UgZGF0YVZpZXdUYWc6XG4gICAgICByZXR1cm4gY2xvbmVEYXRhVmlldyhvYmplY3QsIGlzRGVlcCk7XG5cbiAgICBjYXNlIGZsb2F0MzJUYWc6IGNhc2UgZmxvYXQ2NFRhZzpcbiAgICBjYXNlIGludDhUYWc6IGNhc2UgaW50MTZUYWc6IGNhc2UgaW50MzJUYWc6XG4gICAgY2FzZSB1aW50OFRhZzogY2FzZSB1aW50OENsYW1wZWRUYWc6IGNhc2UgdWludDE2VGFnOiBjYXNlIHVpbnQzMlRhZzpcbiAgICAgIHJldHVybiBjbG9uZVR5cGVkQXJyYXkob2JqZWN0LCBpc0RlZXApO1xuXG4gICAgY2FzZSBtYXBUYWc6XG4gICAgICByZXR1cm4gbmV3IEN0b3I7XG5cbiAgICBjYXNlIG51bWJlclRhZzpcbiAgICBjYXNlIHN0cmluZ1RhZzpcbiAgICAgIHJldHVybiBuZXcgQ3RvcihvYmplY3QpO1xuXG4gICAgY2FzZSByZWdleHBUYWc6XG4gICAgICByZXR1cm4gY2xvbmVSZWdFeHAob2JqZWN0KTtcblxuICAgIGNhc2Ugc2V0VGFnOlxuICAgICAgcmV0dXJuIG5ldyBDdG9yO1xuXG4gICAgY2FzZSBzeW1ib2xUYWc6XG4gICAgICByZXR1cm4gY2xvbmVTeW1ib2wob2JqZWN0KTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGluaXRDbG9uZUJ5VGFnO1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RDcmVhdGUgPSBPYmplY3QuY3JlYXRlO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNyZWF0ZWAgd2l0aG91dCBzdXBwb3J0IGZvciBhc3NpZ25pbmdcbiAqIHByb3BlcnRpZXMgdG8gdGhlIGNyZWF0ZWQgb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvdG8gVGhlIG9iamVjdCB0byBpbmhlcml0IGZyb20uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICovXG52YXIgYmFzZUNyZWF0ZSA9IChmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gb2JqZWN0KCkge31cbiAgcmV0dXJuIGZ1bmN0aW9uKHByb3RvKSB7XG4gICAgaWYgKCFpc09iamVjdChwcm90bykpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgaWYgKG9iamVjdENyZWF0ZSkge1xuICAgICAgcmV0dXJuIG9iamVjdENyZWF0ZShwcm90byk7XG4gICAgfVxuICAgIG9iamVjdC5wcm90b3R5cGUgPSBwcm90bztcbiAgICB2YXIgcmVzdWx0ID0gbmV3IG9iamVjdDtcbiAgICBvYmplY3QucHJvdG90eXBlID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59KCkpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VDcmVhdGU7XG4iLCJ2YXIgYmFzZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX2Jhc2VDcmVhdGUnKSxcbiAgICBnZXRQcm90b3R5cGUgPSByZXF1aXJlKCcuL19nZXRQcm90b3R5cGUnKSxcbiAgICBpc1Byb3RvdHlwZSA9IHJlcXVpcmUoJy4vX2lzUHJvdG90eXBlJyk7XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgYW4gb2JqZWN0IGNsb25lLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY2xvbmUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBpbml0aWFsaXplZCBjbG9uZS5cbiAqL1xuZnVuY3Rpb24gaW5pdENsb25lT2JqZWN0KG9iamVjdCkge1xuICByZXR1cm4gKHR5cGVvZiBvYmplY3QuY29uc3RydWN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNQcm90b3R5cGUob2JqZWN0KSlcbiAgICA/IGJhc2VDcmVhdGUoZ2V0UHJvdG90eXBlKG9iamVjdCkpXG4gICAgOiB7fTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpbml0Q2xvbmVPYmplY3Q7XG4iLCJ2YXIgZ2V0VGFnID0gcmVxdWlyZSgnLi9fZ2V0VGFnJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTWFwYCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG1hcCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNNYXAodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgZ2V0VGFnKHZhbHVlKSA9PSBtYXBUYWc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzTWFwO1xuIiwidmFyIGJhc2VJc01hcCA9IHJlcXVpcmUoJy4vX2Jhc2VJc01hcCcpLFxuICAgIGJhc2VVbmFyeSA9IHJlcXVpcmUoJy4vX2Jhc2VVbmFyeScpLFxuICAgIG5vZGVVdGlsID0gcmVxdWlyZSgnLi9fbm9kZVV0aWwnKTtcblxuLyogTm9kZS5qcyBoZWxwZXIgcmVmZXJlbmNlcy4gKi9cbnZhciBub2RlSXNNYXAgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc01hcDtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYE1hcGAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4zLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbWFwLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNNYXAobmV3IE1hcCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc01hcChuZXcgV2Vha01hcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNNYXAgPSBub2RlSXNNYXAgPyBiYXNlVW5hcnkobm9kZUlzTWFwKSA6IGJhc2VJc01hcDtcblxubW9kdWxlLmV4cG9ydHMgPSBpc01hcDtcbiIsInZhciBnZXRUYWcgPSByZXF1aXJlKCcuL19nZXRUYWcnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgc2V0VGFnID0gJ1tvYmplY3QgU2V0XSc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNTZXRgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc2V0LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc1NldCh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBnZXRUYWcodmFsdWUpID09IHNldFRhZztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNTZXQ7XG4iLCJ2YXIgYmFzZUlzU2V0ID0gcmVxdWlyZSgnLi9fYmFzZUlzU2V0JyksXG4gICAgYmFzZVVuYXJ5ID0gcmVxdWlyZSgnLi9fYmFzZVVuYXJ5JyksXG4gICAgbm9kZVV0aWwgPSByZXF1aXJlKCcuL19ub2RlVXRpbCcpO1xuXG4vKiBOb2RlLmpzIGhlbHBlciByZWZlcmVuY2VzLiAqL1xudmFyIG5vZGVJc1NldCA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzU2V0O1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU2V0YCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjMuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzZXQsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1NldChuZXcgU2V0KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU2V0KG5ldyBXZWFrU2V0KTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc1NldCA9IG5vZGVJc1NldCA/IGJhc2VVbmFyeShub2RlSXNTZXQpIDogYmFzZUlzU2V0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzU2V0O1xuIiwidmFyIFN0YWNrID0gcmVxdWlyZSgnLi9fU3RhY2snKSxcbiAgICBhcnJheUVhY2ggPSByZXF1aXJlKCcuL19hcnJheUVhY2gnKSxcbiAgICBhc3NpZ25WYWx1ZSA9IHJlcXVpcmUoJy4vX2Fzc2lnblZhbHVlJyksXG4gICAgYmFzZUFzc2lnbiA9IHJlcXVpcmUoJy4vX2Jhc2VBc3NpZ24nKSxcbiAgICBiYXNlQXNzaWduSW4gPSByZXF1aXJlKCcuL19iYXNlQXNzaWduSW4nKSxcbiAgICBjbG9uZUJ1ZmZlciA9IHJlcXVpcmUoJy4vX2Nsb25lQnVmZmVyJyksXG4gICAgY29weUFycmF5ID0gcmVxdWlyZSgnLi9fY29weUFycmF5JyksXG4gICAgY29weVN5bWJvbHMgPSByZXF1aXJlKCcuL19jb3B5U3ltYm9scycpLFxuICAgIGNvcHlTeW1ib2xzSW4gPSByZXF1aXJlKCcuL19jb3B5U3ltYm9sc0luJyksXG4gICAgZ2V0QWxsS2V5cyA9IHJlcXVpcmUoJy4vX2dldEFsbEtleXMnKSxcbiAgICBnZXRBbGxLZXlzSW4gPSByZXF1aXJlKCcuL19nZXRBbGxLZXlzSW4nKSxcbiAgICBnZXRUYWcgPSByZXF1aXJlKCcuL19nZXRUYWcnKSxcbiAgICBpbml0Q2xvbmVBcnJheSA9IHJlcXVpcmUoJy4vX2luaXRDbG9uZUFycmF5JyksXG4gICAgaW5pdENsb25lQnlUYWcgPSByZXF1aXJlKCcuL19pbml0Q2xvbmVCeVRhZycpLFxuICAgIGluaXRDbG9uZU9iamVjdCA9IHJlcXVpcmUoJy4vX2luaXRDbG9uZU9iamVjdCcpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc0J1ZmZlciA9IHJlcXVpcmUoJy4vaXNCdWZmZXInKSxcbiAgICBpc01hcCA9IHJlcXVpcmUoJy4vaXNNYXAnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICBpc1NldCA9IHJlcXVpcmUoJy4vaXNTZXQnKSxcbiAgICBrZXlzID0gcmVxdWlyZSgnLi9rZXlzJyksXG4gICAga2V5c0luID0gcmVxdWlyZSgnLi9rZXlzSW4nKTtcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgY2xvbmluZy4gKi9cbnZhciBDTE9ORV9ERUVQX0ZMQUcgPSAxLFxuICAgIENMT05FX0ZMQVRfRkxBRyA9IDIsXG4gICAgQ0xPTkVfU1lNQk9MU19GTEFHID0gNDtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICBhcnJheVRhZyA9ICdbb2JqZWN0IEFycmF5XScsXG4gICAgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJyxcbiAgICBkYXRlVGFnID0gJ1tvYmplY3QgRGF0ZV0nLFxuICAgIGVycm9yVGFnID0gJ1tvYmplY3QgRXJyb3JdJyxcbiAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICBnZW5UYWcgPSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nLFxuICAgIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgIG51bWJlclRhZyA9ICdbb2JqZWN0IE51bWJlcl0nLFxuICAgIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nLFxuICAgIHJlZ2V4cFRhZyA9ICdbb2JqZWN0IFJlZ0V4cF0nLFxuICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nLFxuICAgIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nLFxuICAgIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nLFxuICAgIHdlYWtNYXBUYWcgPSAnW29iamVjdCBXZWFrTWFwXSc7XG5cbnZhciBhcnJheUJ1ZmZlclRhZyA9ICdbb2JqZWN0IEFycmF5QnVmZmVyXScsXG4gICAgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nLFxuICAgIGZsb2F0MzJUYWcgPSAnW29iamVjdCBGbG9hdDMyQXJyYXldJyxcbiAgICBmbG9hdDY0VGFnID0gJ1tvYmplY3QgRmxvYXQ2NEFycmF5XScsXG4gICAgaW50OFRhZyA9ICdbb2JqZWN0IEludDhBcnJheV0nLFxuICAgIGludDE2VGFnID0gJ1tvYmplY3QgSW50MTZBcnJheV0nLFxuICAgIGludDMyVGFnID0gJ1tvYmplY3QgSW50MzJBcnJheV0nLFxuICAgIHVpbnQ4VGFnID0gJ1tvYmplY3QgVWludDhBcnJheV0nLFxuICAgIHVpbnQ4Q2xhbXBlZFRhZyA9ICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScsXG4gICAgdWludDE2VGFnID0gJ1tvYmplY3QgVWludDE2QXJyYXldJyxcbiAgICB1aW50MzJUYWcgPSAnW29iamVjdCBVaW50MzJBcnJheV0nO1xuXG4vKiogVXNlZCB0byBpZGVudGlmeSBgdG9TdHJpbmdUYWdgIHZhbHVlcyBzdXBwb3J0ZWQgYnkgYF8uY2xvbmVgLiAqL1xudmFyIGNsb25lYWJsZVRhZ3MgPSB7fTtcbmNsb25lYWJsZVRhZ3NbYXJnc1RhZ10gPSBjbG9uZWFibGVUYWdzW2FycmF5VGFnXSA9XG5jbG9uZWFibGVUYWdzW2FycmF5QnVmZmVyVGFnXSA9IGNsb25lYWJsZVRhZ3NbZGF0YVZpZXdUYWddID1cbmNsb25lYWJsZVRhZ3NbYm9vbFRhZ10gPSBjbG9uZWFibGVUYWdzW2RhdGVUYWddID1cbmNsb25lYWJsZVRhZ3NbZmxvYXQzMlRhZ10gPSBjbG9uZWFibGVUYWdzW2Zsb2F0NjRUYWddID1cbmNsb25lYWJsZVRhZ3NbaW50OFRhZ10gPSBjbG9uZWFibGVUYWdzW2ludDE2VGFnXSA9XG5jbG9uZWFibGVUYWdzW2ludDMyVGFnXSA9IGNsb25lYWJsZVRhZ3NbbWFwVGFnXSA9XG5jbG9uZWFibGVUYWdzW251bWJlclRhZ10gPSBjbG9uZWFibGVUYWdzW29iamVjdFRhZ10gPVxuY2xvbmVhYmxlVGFnc1tyZWdleHBUYWddID0gY2xvbmVhYmxlVGFnc1tzZXRUYWddID1cbmNsb25lYWJsZVRhZ3Nbc3RyaW5nVGFnXSA9IGNsb25lYWJsZVRhZ3Nbc3ltYm9sVGFnXSA9XG5jbG9uZWFibGVUYWdzW3VpbnQ4VGFnXSA9IGNsb25lYWJsZVRhZ3NbdWludDhDbGFtcGVkVGFnXSA9XG5jbG9uZWFibGVUYWdzW3VpbnQxNlRhZ10gPSBjbG9uZWFibGVUYWdzW3VpbnQzMlRhZ10gPSB0cnVlO1xuY2xvbmVhYmxlVGFnc1tlcnJvclRhZ10gPSBjbG9uZWFibGVUYWdzW2Z1bmNUYWddID1cbmNsb25lYWJsZVRhZ3Nbd2Vha01hcFRhZ10gPSBmYWxzZTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jbG9uZWAgYW5kIGBfLmNsb25lRGVlcGAgd2hpY2ggdHJhY2tzXG4gKiB0cmF2ZXJzZWQgb2JqZWN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2xvbmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuXG4gKiAgMSAtIERlZXAgY2xvbmVcbiAqICAyIC0gRmxhdHRlbiBpbmhlcml0ZWQgcHJvcGVydGllc1xuICogIDQgLSBDbG9uZSBzeW1ib2xzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nLlxuICogQHBhcmFtIHtzdHJpbmd9IFtrZXldIFRoZSBrZXkgb2YgYHZhbHVlYC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgcGFyZW50IG9iamVjdCBvZiBgdmFsdWVgLlxuICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzIGFuZCB0aGVpciBjbG9uZSBjb3VudGVycGFydHMuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgY2xvbmVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBiYXNlQ2xvbmUodmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGtleSwgb2JqZWN0LCBzdGFjaykge1xuICB2YXIgcmVzdWx0LFxuICAgICAgaXNEZWVwID0gYml0bWFzayAmIENMT05FX0RFRVBfRkxBRyxcbiAgICAgIGlzRmxhdCA9IGJpdG1hc2sgJiBDTE9ORV9GTEFUX0ZMQUcsXG4gICAgICBpc0Z1bGwgPSBiaXRtYXNrICYgQ0xPTkVfU1lNQk9MU19GTEFHO1xuXG4gIGlmIChjdXN0b21pemVyKSB7XG4gICAgcmVzdWx0ID0gb2JqZWN0ID8gY3VzdG9taXplcih2YWx1ZSwga2V5LCBvYmplY3QsIHN0YWNrKSA6IGN1c3RvbWl6ZXIodmFsdWUpO1xuICB9XG4gIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgdmFyIGlzQXJyID0gaXNBcnJheSh2YWx1ZSk7XG4gIGlmIChpc0Fycikge1xuICAgIHJlc3VsdCA9IGluaXRDbG9uZUFycmF5KHZhbHVlKTtcbiAgICBpZiAoIWlzRGVlcCkge1xuICAgICAgcmV0dXJuIGNvcHlBcnJheSh2YWx1ZSwgcmVzdWx0KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIHRhZyA9IGdldFRhZyh2YWx1ZSksXG4gICAgICAgIGlzRnVuYyA9IHRhZyA9PSBmdW5jVGFnIHx8IHRhZyA9PSBnZW5UYWc7XG5cbiAgICBpZiAoaXNCdWZmZXIodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY2xvbmVCdWZmZXIodmFsdWUsIGlzRGVlcCk7XG4gICAgfVxuICAgIGlmICh0YWcgPT0gb2JqZWN0VGFnIHx8IHRhZyA9PSBhcmdzVGFnIHx8IChpc0Z1bmMgJiYgIW9iamVjdCkpIHtcbiAgICAgIHJlc3VsdCA9IChpc0ZsYXQgfHwgaXNGdW5jKSA/IHt9IDogaW5pdENsb25lT2JqZWN0KHZhbHVlKTtcbiAgICAgIGlmICghaXNEZWVwKSB7XG4gICAgICAgIHJldHVybiBpc0ZsYXRcbiAgICAgICAgICA/IGNvcHlTeW1ib2xzSW4odmFsdWUsIGJhc2VBc3NpZ25JbihyZXN1bHQsIHZhbHVlKSlcbiAgICAgICAgICA6IGNvcHlTeW1ib2xzKHZhbHVlLCBiYXNlQXNzaWduKHJlc3VsdCwgdmFsdWUpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFjbG9uZWFibGVUYWdzW3RhZ10pIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdCA/IHZhbHVlIDoge307XG4gICAgICB9XG4gICAgICByZXN1bHQgPSBpbml0Q2xvbmVCeVRhZyh2YWx1ZSwgdGFnLCBpc0RlZXApO1xuICAgIH1cbiAgfVxuICAvLyBDaGVjayBmb3IgY2lyY3VsYXIgcmVmZXJlbmNlcyBhbmQgcmV0dXJuIGl0cyBjb3JyZXNwb25kaW5nIGNsb25lLlxuICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICB2YXIgc3RhY2tlZCA9IHN0YWNrLmdldCh2YWx1ZSk7XG4gIGlmIChzdGFja2VkKSB7XG4gICAgcmV0dXJuIHN0YWNrZWQ7XG4gIH1cbiAgc3RhY2suc2V0KHZhbHVlLCByZXN1bHQpO1xuXG4gIGlmIChpc1NldCh2YWx1ZSkpIHtcbiAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHN1YlZhbHVlKSB7XG4gICAgICByZXN1bHQuYWRkKGJhc2VDbG9uZShzdWJWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwgc3ViVmFsdWUsIHZhbHVlLCBzdGFjaykpO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKGlzTWFwKHZhbHVlKSkge1xuICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24oc3ViVmFsdWUsIGtleSkge1xuICAgICAgcmVzdWx0LnNldChrZXksIGJhc2VDbG9uZShzdWJWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwga2V5LCB2YWx1ZSwgc3RhY2spKTtcbiAgICB9KTtcbiAgfVxuXG4gIHZhciBrZXlzRnVuYyA9IGlzRnVsbFxuICAgID8gKGlzRmxhdCA/IGdldEFsbEtleXNJbiA6IGdldEFsbEtleXMpXG4gICAgOiAoaXNGbGF0ID8ga2V5c0luIDoga2V5cyk7XG5cbiAgdmFyIHByb3BzID0gaXNBcnIgPyB1bmRlZmluZWQgOiBrZXlzRnVuYyh2YWx1ZSk7XG4gIGFycmF5RWFjaChwcm9wcyB8fCB2YWx1ZSwgZnVuY3Rpb24oc3ViVmFsdWUsIGtleSkge1xuICAgIGlmIChwcm9wcykge1xuICAgICAga2V5ID0gc3ViVmFsdWU7XG4gICAgICBzdWJWYWx1ZSA9IHZhbHVlW2tleV07XG4gICAgfVxuICAgIC8vIFJlY3Vyc2l2ZWx5IHBvcHVsYXRlIGNsb25lIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgYXNzaWduVmFsdWUocmVzdWx0LCBrZXksIGJhc2VDbG9uZShzdWJWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwga2V5LCB2YWx1ZSwgc3RhY2spKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUNsb25lO1xuIiwidmFyIGJhc2VDbG9uZSA9IHJlcXVpcmUoJy4vX2Jhc2VDbG9uZScpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciBjbG9uaW5nLiAqL1xudmFyIENMT05FX1NZTUJPTFNfRkxBRyA9IDQ7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNoYWxsb3cgY2xvbmUgb2YgYHZhbHVlYC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvbiB0aGVcbiAqIFtzdHJ1Y3R1cmVkIGNsb25lIGFsZ29yaXRobV0oaHR0cHM6Ly9tZG4uaW8vU3RydWN0dXJlZF9jbG9uZV9hbGdvcml0aG0pXG4gKiBhbmQgc3VwcG9ydHMgY2xvbmluZyBhcnJheXMsIGFycmF5IGJ1ZmZlcnMsIGJvb2xlYW5zLCBkYXRlIG9iamVjdHMsIG1hcHMsXG4gKiBudW1iZXJzLCBgT2JqZWN0YCBvYmplY3RzLCByZWdleGVzLCBzZXRzLCBzdHJpbmdzLCBzeW1ib2xzLCBhbmQgdHlwZWRcbiAqIGFycmF5cy4gVGhlIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb2YgYGFyZ3VtZW50c2Agb2JqZWN0cyBhcmUgY2xvbmVkXG4gKiBhcyBwbGFpbiBvYmplY3RzLiBBbiBlbXB0eSBvYmplY3QgaXMgcmV0dXJuZWQgZm9yIHVuY2xvbmVhYmxlIHZhbHVlcyBzdWNoXG4gKiBhcyBlcnJvciBvYmplY3RzLCBmdW5jdGlvbnMsIERPTSBub2RlcywgYW5kIFdlYWtNYXBzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjbG9uZS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuXG4gKiBAc2VlIF8uY2xvbmVEZWVwXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3RzID0gW3sgJ2EnOiAxIH0sIHsgJ2InOiAyIH1dO1xuICpcbiAqIHZhciBzaGFsbG93ID0gXy5jbG9uZShvYmplY3RzKTtcbiAqIGNvbnNvbGUubG9nKHNoYWxsb3dbMF0gPT09IG9iamVjdHNbMF0pO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBjbG9uZSh2YWx1ZSkge1xuICByZXR1cm4gYmFzZUNsb25lKHZhbHVlLCBDTE9ORV9TWU1CT0xTX0ZMQUcpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb25lO1xuIiwiLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGB2YWx1ZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHJldHVybiBmcm9tIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb25zdGFudCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdHMgPSBfLnRpbWVzKDIsIF8uY29uc3RhbnQoeyAnYSc6IDEgfSkpO1xuICpcbiAqIGNvbnNvbGUubG9nKG9iamVjdHMpO1xuICogLy8gPT4gW3sgJ2EnOiAxIH0sIHsgJ2EnOiAxIH1dXG4gKlxuICogY29uc29sZS5sb2cob2JqZWN0c1swXSA9PT0gb2JqZWN0c1sxXSk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGNvbnN0YW50KHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29uc3RhbnQ7XG4iLCIvKipcbiAqIENyZWF0ZXMgYSBiYXNlIGZ1bmN0aW9uIGZvciBtZXRob2RzIGxpa2UgYF8uZm9ySW5gIGFuZCBgXy5mb3JPd25gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJhc2UgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJhc2VGb3IoZnJvbVJpZ2h0KSB7XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3QsIGl0ZXJhdGVlLCBrZXlzRnVuYykge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBpdGVyYWJsZSA9IE9iamVjdChvYmplY3QpLFxuICAgICAgICBwcm9wcyA9IGtleXNGdW5jKG9iamVjdCksXG4gICAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgdmFyIGtleSA9IHByb3BzW2Zyb21SaWdodCA/IGxlbmd0aCA6ICsraW5kZXhdO1xuICAgICAgaWYgKGl0ZXJhdGVlKGl0ZXJhYmxlW2tleV0sIGtleSwgaXRlcmFibGUpID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVCYXNlRm9yO1xuIiwidmFyIGNyZWF0ZUJhc2VGb3IgPSByZXF1aXJlKCcuL19jcmVhdGVCYXNlRm9yJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGJhc2VGb3JPd25gIHdoaWNoIGl0ZXJhdGVzIG92ZXIgYG9iamVjdGBcbiAqIHByb3BlcnRpZXMgcmV0dXJuZWQgYnkgYGtleXNGdW5jYCBhbmQgaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIHByb3BlcnR5LlxuICogSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYG9iamVjdGAuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG52YXIgYmFzZUZvciA9IGNyZWF0ZUJhc2VGb3IoKTtcblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlRm9yO1xuIiwidmFyIGJhc2VGb3IgPSByZXF1aXJlKCcuL19iYXNlRm9yJyksXG4gICAga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvck93bmAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VGb3JPd24ob2JqZWN0LCBpdGVyYXRlZSkge1xuICByZXR1cm4gb2JqZWN0ICYmIGJhc2VGb3Iob2JqZWN0LCBpdGVyYXRlZSwga2V5cyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUZvck93bjtcbiIsInZhciBpc0FycmF5TGlrZSA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2UnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgYGJhc2VFYWNoYCBvciBgYmFzZUVhY2hSaWdodGAgZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVhY2hGdW5jIFRoZSBmdW5jdGlvbiB0byBpdGVyYXRlIG92ZXIgYSBjb2xsZWN0aW9uLlxuICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBiYXNlIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVCYXNlRWFjaChlYWNoRnVuYywgZnJvbVJpZ2h0KSB7XG4gIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICAgIH1cbiAgICBpZiAoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKSB7XG4gICAgICByZXR1cm4gZWFjaEZ1bmMoY29sbGVjdGlvbiwgaXRlcmF0ZWUpO1xuICAgIH1cbiAgICB2YXIgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGgsXG4gICAgICAgIGluZGV4ID0gZnJvbVJpZ2h0ID8gbGVuZ3RoIDogLTEsXG4gICAgICAgIGl0ZXJhYmxlID0gT2JqZWN0KGNvbGxlY3Rpb24pO1xuXG4gICAgd2hpbGUgKChmcm9tUmlnaHQgPyBpbmRleC0tIDogKytpbmRleCA8IGxlbmd0aCkpIHtcbiAgICAgIGlmIChpdGVyYXRlZShpdGVyYWJsZVtpbmRleF0sIGluZGV4LCBpdGVyYWJsZSkgPT09IGZhbHNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVCYXNlRWFjaDtcbiIsInZhciBiYXNlRm9yT3duID0gcmVxdWlyZSgnLi9fYmFzZUZvck93bicpLFxuICAgIGNyZWF0ZUJhc2VFYWNoID0gcmVxdWlyZSgnLi9fY3JlYXRlQmFzZUVhY2gnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mb3JFYWNoYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIGBjb2xsZWN0aW9uYC5cbiAqL1xudmFyIGJhc2VFYWNoID0gY3JlYXRlQmFzZUVhY2goYmFzZUZvck93bik7XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUVhY2g7XG4iLCIvKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGZpcnN0IGFyZ3VtZW50IGl0IHJlY2VpdmVzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcGFyYW0geyp9IHZhbHVlIEFueSB2YWx1ZS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIGB2YWx1ZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICpcbiAqIGNvbnNvbGUubG9nKF8uaWRlbnRpdHkob2JqZWN0KSA9PT0gb2JqZWN0KTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaWRlbnRpdHkodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlkZW50aXR5O1xuIiwidmFyIGlkZW50aXR5ID0gcmVxdWlyZSgnLi9pZGVudGl0eScpO1xuXG4vKipcbiAqIENhc3RzIGB2YWx1ZWAgdG8gYGlkZW50aXR5YCBpZiBpdCdzIG5vdCBhIGZ1bmN0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGNhc3QgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNhc3RGdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdmdW5jdGlvbicgPyB2YWx1ZSA6IGlkZW50aXR5O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNhc3RGdW5jdGlvbjtcbiIsInZhciBhcnJheUVhY2ggPSByZXF1aXJlKCcuL19hcnJheUVhY2gnKSxcbiAgICBiYXNlRWFjaCA9IHJlcXVpcmUoJy4vX2Jhc2VFYWNoJyksXG4gICAgY2FzdEZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fY2FzdEZ1bmN0aW9uJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpO1xuXG4vKipcbiAqIEl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gIGFuZCBpbnZva2VzIGBpdGVyYXRlZWAgZm9yIGVhY2ggZWxlbWVudC5cbiAqIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gKiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gKlxuICogKipOb3RlOioqIEFzIHdpdGggb3RoZXIgXCJDb2xsZWN0aW9uc1wiIG1ldGhvZHMsIG9iamVjdHMgd2l0aCBhIFwibGVuZ3RoXCJcbiAqIHByb3BlcnR5IGFyZSBpdGVyYXRlZCBsaWtlIGFycmF5cy4gVG8gYXZvaWQgdGhpcyBiZWhhdmlvciB1c2UgYF8uZm9ySW5gXG4gKiBvciBgXy5mb3JPd25gIGZvciBvYmplY3QgaXRlcmF0aW9uLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBhbGlhcyBlYWNoXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIGBjb2xsZWN0aW9uYC5cbiAqIEBzZWUgXy5mb3JFYWNoUmlnaHRcbiAqIEBleGFtcGxlXG4gKlxuICogXy5mb3JFYWNoKFsxLCAyXSwgZnVuY3Rpb24odmFsdWUpIHtcbiAqICAgY29uc29sZS5sb2codmFsdWUpO1xuICogfSk7XG4gKiAvLyA9PiBMb2dzIGAxYCB0aGVuIGAyYC5cbiAqXG4gKiBfLmZvckVhY2goeyAnYSc6IDEsICdiJzogMiB9LCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gKiAgIGNvbnNvbGUubG9nKGtleSk7XG4gKiB9KTtcbiAqIC8vID0+IExvZ3MgJ2EnIHRoZW4gJ2InIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpLlxuICovXG5mdW5jdGlvbiBmb3JFYWNoKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RWFjaCA6IGJhc2VFYWNoO1xuICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBjYXN0RnVuY3Rpb24oaXRlcmF0ZWUpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmb3JFYWNoO1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2ZvckVhY2gnKTtcbiIsInZhciBiYXNlRWFjaCA9IHJlcXVpcmUoJy4vX2Jhc2VFYWNoJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmlsdGVyYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGJhc2VGaWx0ZXIoY29sbGVjdGlvbiwgcHJlZGljYXRlKSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pKSB7XG4gICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlRmlsdGVyO1xuIiwiLyoqIFVzZWQgdG8gc3RhbmQtaW4gZm9yIGB1bmRlZmluZWRgIGhhc2ggdmFsdWVzLiAqL1xudmFyIEhBU0hfVU5ERUZJTkVEID0gJ19fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18nO1xuXG4vKipcbiAqIEFkZHMgYHZhbHVlYCB0byB0aGUgYXJyYXkgY2FjaGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGFkZFxuICogQG1lbWJlck9mIFNldENhY2hlXG4gKiBAYWxpYXMgcHVzaFxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2FjaGUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjYWNoZSBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gc2V0Q2FjaGVBZGQodmFsdWUpIHtcbiAgdGhpcy5fX2RhdGFfXy5zZXQodmFsdWUsIEhBU0hfVU5ERUZJTkVEKTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2V0Q2FjaGVBZGQ7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGluIHRoZSBhcnJheSBjYWNoZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgU2V0Q2FjaGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIHNldENhY2hlSGFzKHZhbHVlKSB7XG4gIHJldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2V0Q2FjaGVIYXM7XG4iLCJ2YXIgTWFwQ2FjaGUgPSByZXF1aXJlKCcuL19NYXBDYWNoZScpLFxuICAgIHNldENhY2hlQWRkID0gcmVxdWlyZSgnLi9fc2V0Q2FjaGVBZGQnKSxcbiAgICBzZXRDYWNoZUhhcyA9IHJlcXVpcmUoJy4vX3NldENhY2hlSGFzJyk7XG5cbi8qKlxuICpcbiAqIENyZWF0ZXMgYW4gYXJyYXkgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIHVuaXF1ZSB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gU2V0Q2FjaGUodmFsdWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gdmFsdWVzID09IG51bGwgPyAwIDogdmFsdWVzLmxlbmd0aDtcblxuICB0aGlzLl9fZGF0YV9fID0gbmV3IE1hcENhY2hlO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHRoaXMuYWRkKHZhbHVlc1tpbmRleF0pO1xuICB9XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBTZXRDYWNoZWAuXG5TZXRDYWNoZS5wcm90b3R5cGUuYWRkID0gU2V0Q2FjaGUucHJvdG90eXBlLnB1c2ggPSBzZXRDYWNoZUFkZDtcblNldENhY2hlLnByb3RvdHlwZS5oYXMgPSBzZXRDYWNoZUhhcztcblxubW9kdWxlLmV4cG9ydHMgPSBTZXRDYWNoZTtcbiIsIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNvbWVgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZVxuICogc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGVsZW1lbnQgcGFzc2VzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gKiAgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBhcnJheVNvbWUoYXJyYXksIHByZWRpY2F0ZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaWYgKHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlTb21lO1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYSBgY2FjaGVgIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBjYWNoZSBUaGUgY2FjaGUgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gY2FjaGVIYXMoY2FjaGUsIGtleSkge1xuICByZXR1cm4gY2FjaGUuaGFzKGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2FjaGVIYXM7XG4iLCJ2YXIgU2V0Q2FjaGUgPSByZXF1aXJlKCcuL19TZXRDYWNoZScpLFxuICAgIGFycmF5U29tZSA9IHJlcXVpcmUoJy4vX2FycmF5U29tZScpLFxuICAgIGNhY2hlSGFzID0gcmVxdWlyZSgnLi9fY2FjaGVIYXMnKTtcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgdmFsdWUgY29tcGFyaXNvbnMuICovXG52YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgPSAxLFxuICAgIENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcgPSAyO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxEZWVwYCBmb3IgYXJyYXlzIHdpdGggc3VwcG9ydCBmb3JcbiAqIHBhcnRpYWwgZGVlcCBjb21wYXJpc29ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge0FycmF5fSBvdGhlciBUaGUgb3RoZXIgYXJyYXkgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICogQHBhcmFtIHtPYmplY3R9IHN0YWNrIFRyYWNrcyB0cmF2ZXJzZWQgYGFycmF5YCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBhcnJheXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gZXF1YWxBcnJheXMoYXJyYXksIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKSB7XG4gIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUcsXG4gICAgICBhcnJMZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICBvdGhMZW5ndGggPSBvdGhlci5sZW5ndGg7XG5cbiAgaWYgKGFyckxlbmd0aCAhPSBvdGhMZW5ndGggJiYgIShpc1BhcnRpYWwgJiYgb3RoTGVuZ3RoID4gYXJyTGVuZ3RoKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvLyBDaGVjayB0aGF0IGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLlxuICB2YXIgYXJyU3RhY2tlZCA9IHN0YWNrLmdldChhcnJheSk7XG4gIHZhciBvdGhTdGFja2VkID0gc3RhY2suZ2V0KG90aGVyKTtcbiAgaWYgKGFyclN0YWNrZWQgJiYgb3RoU3RhY2tlZCkge1xuICAgIHJldHVybiBhcnJTdGFja2VkID09IG90aGVyICYmIG90aFN0YWNrZWQgPT0gYXJyYXk7XG4gIH1cbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICByZXN1bHQgPSB0cnVlLFxuICAgICAgc2VlbiA9IChiaXRtYXNrICYgQ09NUEFSRV9VTk9SREVSRURfRkxBRykgPyBuZXcgU2V0Q2FjaGUgOiB1bmRlZmluZWQ7XG5cbiAgc3RhY2suc2V0KGFycmF5LCBvdGhlcik7XG4gIHN0YWNrLnNldChvdGhlciwgYXJyYXkpO1xuXG4gIC8vIElnbm9yZSBub24taW5kZXggcHJvcGVydGllcy5cbiAgd2hpbGUgKCsraW5kZXggPCBhcnJMZW5ndGgpIHtcbiAgICB2YXIgYXJyVmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgIG90aFZhbHVlID0gb3RoZXJbaW5kZXhdO1xuXG4gICAgaWYgKGN1c3RvbWl6ZXIpIHtcbiAgICAgIHZhciBjb21wYXJlZCA9IGlzUGFydGlhbFxuICAgICAgICA/IGN1c3RvbWl6ZXIob3RoVmFsdWUsIGFyclZhbHVlLCBpbmRleCwgb3RoZXIsIGFycmF5LCBzdGFjaylcbiAgICAgICAgOiBjdXN0b21pemVyKGFyclZhbHVlLCBvdGhWYWx1ZSwgaW5kZXgsIGFycmF5LCBvdGhlciwgc3RhY2spO1xuICAgIH1cbiAgICBpZiAoY29tcGFyZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGNvbXBhcmVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICBpZiAoc2Vlbikge1xuICAgICAgaWYgKCFhcnJheVNvbWUob3RoZXIsIGZ1bmN0aW9uKG90aFZhbHVlLCBvdGhJbmRleCkge1xuICAgICAgICAgICAgaWYgKCFjYWNoZUhhcyhzZWVuLCBvdGhJbmRleCkgJiZcbiAgICAgICAgICAgICAgICAoYXJyVmFsdWUgPT09IG90aFZhbHVlIHx8IGVxdWFsRnVuYyhhcnJWYWx1ZSwgb3RoVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHNlZW4ucHVzaChvdGhJbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkpIHtcbiAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIShcbiAgICAgICAgICBhcnJWYWx1ZSA9PT0gb3RoVmFsdWUgfHxcbiAgICAgICAgICAgIGVxdWFsRnVuYyhhcnJWYWx1ZSwgb3RoVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKVxuICAgICAgICApKSB7XG4gICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBzdGFja1snZGVsZXRlJ10oYXJyYXkpO1xuICBzdGFja1snZGVsZXRlJ10ob3RoZXIpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGVxdWFsQXJyYXlzO1xuIiwiLyoqXG4gKiBDb252ZXJ0cyBgbWFwYCB0byBpdHMga2V5LXZhbHVlIHBhaXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gbWFwIFRoZSBtYXAgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUga2V5LXZhbHVlIHBhaXJzLlxuICovXG5mdW5jdGlvbiBtYXBUb0FycmF5KG1hcCkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IEFycmF5KG1hcC5zaXplKTtcblxuICBtYXAuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgcmVzdWx0WysraW5kZXhdID0gW2tleSwgdmFsdWVdO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBUb0FycmF5O1xuIiwiLyoqXG4gKiBDb252ZXJ0cyBgc2V0YCB0byBhbiBhcnJheSBvZiBpdHMgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gc2V0IFRoZSBzZXQgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBzZXRUb0FycmF5KHNldCkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IEFycmF5KHNldC5zaXplKTtcblxuICBzZXQuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJlc3VsdFsrK2luZGV4XSA9IHZhbHVlO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzZXRUb0FycmF5O1xuIiwidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpLFxuICAgIFVpbnQ4QXJyYXkgPSByZXF1aXJlKCcuL19VaW50OEFycmF5JyksXG4gICAgZXEgPSByZXF1aXJlKCcuL2VxJyksXG4gICAgZXF1YWxBcnJheXMgPSByZXF1aXJlKCcuL19lcXVhbEFycmF5cycpLFxuICAgIG1hcFRvQXJyYXkgPSByZXF1aXJlKCcuL19tYXBUb0FycmF5JyksXG4gICAgc2V0VG9BcnJheSA9IHJlcXVpcmUoJy4vX3NldFRvQXJyYXknKTtcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgdmFsdWUgY29tcGFyaXNvbnMuICovXG52YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgPSAxLFxuICAgIENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcgPSAyO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJyxcbiAgICBkYXRlVGFnID0gJ1tvYmplY3QgRGF0ZV0nLFxuICAgIGVycm9yVGFnID0gJ1tvYmplY3QgRXJyb3JdJyxcbiAgICBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJyxcbiAgICByZWdleHBUYWcgPSAnW29iamVjdCBSZWdFeHBdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJyxcbiAgICBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJztcblxudmFyIGFycmF5QnVmZmVyVGFnID0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJyxcbiAgICBkYXRhVmlld1RhZyA9ICdbb2JqZWN0IERhdGFWaWV3XSc7XG5cbi8qKiBVc2VkIHRvIGNvbnZlcnQgc3ltYm9scyB0byBwcmltaXRpdmVzIGFuZCBzdHJpbmdzLiAqL1xudmFyIHN5bWJvbFByb3RvID0gU3ltYm9sID8gU3ltYm9sLnByb3RvdHlwZSA6IHVuZGVmaW5lZCxcbiAgICBzeW1ib2xWYWx1ZU9mID0gc3ltYm9sUHJvdG8gPyBzeW1ib2xQcm90by52YWx1ZU9mIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxEZWVwYCBmb3IgY29tcGFyaW5nIG9iamVjdHMgb2ZcbiAqIHRoZSBzYW1lIGB0b1N0cmluZ1RhZ2AuXG4gKlxuICogKipOb3RlOioqIFRoaXMgZnVuY3Rpb24gb25seSBzdXBwb3J0cyBjb21wYXJpbmcgdmFsdWVzIHdpdGggdGFncyBvZlxuICogYEJvb2xlYW5gLCBgRGF0ZWAsIGBFcnJvcmAsIGBOdW1iZXJgLCBgUmVnRXhwYCwgb3IgYFN0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgVGhlIGB0b1N0cmluZ1RhZ2Agb2YgdGhlIG9iamVjdHMgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICogQHBhcmFtIHtPYmplY3R9IHN0YWNrIFRyYWNrcyB0cmF2ZXJzZWQgYG9iamVjdGAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb2JqZWN0cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBlcXVhbEJ5VGFnKG9iamVjdCwgb3RoZXIsIHRhZywgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgZGF0YVZpZXdUYWc6XG4gICAgICBpZiAoKG9iamVjdC5ieXRlTGVuZ3RoICE9IG90aGVyLmJ5dGVMZW5ndGgpIHx8XG4gICAgICAgICAgKG9iamVjdC5ieXRlT2Zmc2V0ICE9IG90aGVyLmJ5dGVPZmZzZXQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIG9iamVjdCA9IG9iamVjdC5idWZmZXI7XG4gICAgICBvdGhlciA9IG90aGVyLmJ1ZmZlcjtcblxuICAgIGNhc2UgYXJyYXlCdWZmZXJUYWc6XG4gICAgICBpZiAoKG9iamVjdC5ieXRlTGVuZ3RoICE9IG90aGVyLmJ5dGVMZW5ndGgpIHx8XG4gICAgICAgICAgIWVxdWFsRnVuYyhuZXcgVWludDhBcnJheShvYmplY3QpLCBuZXcgVWludDhBcnJheShvdGhlcikpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgY2FzZSBib29sVGFnOlxuICAgIGNhc2UgZGF0ZVRhZzpcbiAgICBjYXNlIG51bWJlclRhZzpcbiAgICAgIC8vIENvZXJjZSBib29sZWFucyB0byBgMWAgb3IgYDBgIGFuZCBkYXRlcyB0byBtaWxsaXNlY29uZHMuXG4gICAgICAvLyBJbnZhbGlkIGRhdGVzIGFyZSBjb2VyY2VkIHRvIGBOYU5gLlxuICAgICAgcmV0dXJuIGVxKCtvYmplY3QsICtvdGhlcik7XG5cbiAgICBjYXNlIGVycm9yVGFnOlxuICAgICAgcmV0dXJuIG9iamVjdC5uYW1lID09IG90aGVyLm5hbWUgJiYgb2JqZWN0Lm1lc3NhZ2UgPT0gb3RoZXIubWVzc2FnZTtcblxuICAgIGNhc2UgcmVnZXhwVGFnOlxuICAgIGNhc2Ugc3RyaW5nVGFnOlxuICAgICAgLy8gQ29lcmNlIHJlZ2V4ZXMgdG8gc3RyaW5ncyBhbmQgdHJlYXQgc3RyaW5ncywgcHJpbWl0aXZlcyBhbmQgb2JqZWN0cyxcbiAgICAgIC8vIGFzIGVxdWFsLiBTZWUgaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXJlZ2V4cC5wcm90b3R5cGUudG9zdHJpbmdcbiAgICAgIC8vIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICByZXR1cm4gb2JqZWN0ID09IChvdGhlciArICcnKTtcblxuICAgIGNhc2UgbWFwVGFnOlxuICAgICAgdmFyIGNvbnZlcnQgPSBtYXBUb0FycmF5O1xuXG4gICAgY2FzZSBzZXRUYWc6XG4gICAgICB2YXIgaXNQYXJ0aWFsID0gYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHO1xuICAgICAgY29udmVydCB8fCAoY29udmVydCA9IHNldFRvQXJyYXkpO1xuXG4gICAgICBpZiAob2JqZWN0LnNpemUgIT0gb3RoZXIuc2l6ZSAmJiAhaXNQYXJ0aWFsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIEFzc3VtZSBjeWNsaWMgdmFsdWVzIGFyZSBlcXVhbC5cbiAgICAgIHZhciBzdGFja2VkID0gc3RhY2suZ2V0KG9iamVjdCk7XG4gICAgICBpZiAoc3RhY2tlZCkge1xuICAgICAgICByZXR1cm4gc3RhY2tlZCA9PSBvdGhlcjtcbiAgICAgIH1cbiAgICAgIGJpdG1hc2sgfD0gQ09NUEFSRV9VTk9SREVSRURfRkxBRztcblxuICAgICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBvYmplY3RzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICBzdGFjay5zZXQob2JqZWN0LCBvdGhlcik7XG4gICAgICB2YXIgcmVzdWx0ID0gZXF1YWxBcnJheXMoY29udmVydChvYmplY3QpLCBjb252ZXJ0KG90aGVyKSwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjayk7XG4gICAgICBzdGFja1snZGVsZXRlJ10ob2JqZWN0KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG5cbiAgICBjYXNlIHN5bWJvbFRhZzpcbiAgICAgIGlmIChzeW1ib2xWYWx1ZU9mKSB7XG4gICAgICAgIHJldHVybiBzeW1ib2xWYWx1ZU9mLmNhbGwob2JqZWN0KSA9PSBzeW1ib2xWYWx1ZU9mLmNhbGwob3RoZXIpO1xuICAgICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBlcXVhbEJ5VGFnO1xuIiwidmFyIGdldEFsbEtleXMgPSByZXF1aXJlKCcuL19nZXRBbGxLZXlzJyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xudmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIG9iamVjdHMgd2l0aCBzdXBwb3J0IGZvclxuICogcGFydGlhbCBkZWVwIGNvbXBhcmlzb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGFjayBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gZXF1YWxPYmplY3RzKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgdmFyIGlzUGFydGlhbCA9IGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRyxcbiAgICAgIG9ialByb3BzID0gZ2V0QWxsS2V5cyhvYmplY3QpLFxuICAgICAgb2JqTGVuZ3RoID0gb2JqUHJvcHMubGVuZ3RoLFxuICAgICAgb3RoUHJvcHMgPSBnZXRBbGxLZXlzKG90aGVyKSxcbiAgICAgIG90aExlbmd0aCA9IG90aFByb3BzLmxlbmd0aDtcblxuICBpZiAob2JqTGVuZ3RoICE9IG90aExlbmd0aCAmJiAhaXNQYXJ0aWFsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBpbmRleCA9IG9iakxlbmd0aDtcbiAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICB2YXIga2V5ID0gb2JqUHJvcHNbaW5kZXhdO1xuICAgIGlmICghKGlzUGFydGlhbCA/IGtleSBpbiBvdGhlciA6IGhhc093blByb3BlcnR5LmNhbGwob3RoZXIsIGtleSkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIC8vIENoZWNrIHRoYXQgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG4gIHZhciBvYmpTdGFja2VkID0gc3RhY2suZ2V0KG9iamVjdCk7XG4gIHZhciBvdGhTdGFja2VkID0gc3RhY2suZ2V0KG90aGVyKTtcbiAgaWYgKG9ialN0YWNrZWQgJiYgb3RoU3RhY2tlZCkge1xuICAgIHJldHVybiBvYmpTdGFja2VkID09IG90aGVyICYmIG90aFN0YWNrZWQgPT0gb2JqZWN0O1xuICB9XG4gIHZhciByZXN1bHQgPSB0cnVlO1xuICBzdGFjay5zZXQob2JqZWN0LCBvdGhlcik7XG4gIHN0YWNrLnNldChvdGhlciwgb2JqZWN0KTtcblxuICB2YXIgc2tpcEN0b3IgPSBpc1BhcnRpYWw7XG4gIHdoaWxlICgrK2luZGV4IDwgb2JqTGVuZ3RoKSB7XG4gICAga2V5ID0gb2JqUHJvcHNbaW5kZXhdO1xuICAgIHZhciBvYmpWYWx1ZSA9IG9iamVjdFtrZXldLFxuICAgICAgICBvdGhWYWx1ZSA9IG90aGVyW2tleV07XG5cbiAgICBpZiAoY3VzdG9taXplcikge1xuICAgICAgdmFyIGNvbXBhcmVkID0gaXNQYXJ0aWFsXG4gICAgICAgID8gY3VzdG9taXplcihvdGhWYWx1ZSwgb2JqVmFsdWUsIGtleSwgb3RoZXIsIG9iamVjdCwgc3RhY2spXG4gICAgICAgIDogY3VzdG9taXplcihvYmpWYWx1ZSwgb3RoVmFsdWUsIGtleSwgb2JqZWN0LCBvdGhlciwgc3RhY2spO1xuICAgIH1cbiAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIG9iamVjdHMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICBpZiAoIShjb21wYXJlZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyAob2JqVmFsdWUgPT09IG90aFZhbHVlIHx8IGVxdWFsRnVuYyhvYmpWYWx1ZSwgb3RoVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKSlcbiAgICAgICAgICA6IGNvbXBhcmVkXG4gICAgICAgICkpIHtcbiAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHNraXBDdG9yIHx8IChza2lwQ3RvciA9IGtleSA9PSAnY29uc3RydWN0b3InKTtcbiAgfVxuICBpZiAocmVzdWx0ICYmICFza2lwQ3Rvcikge1xuICAgIHZhciBvYmpDdG9yID0gb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICBvdGhDdG9yID0gb3RoZXIuY29uc3RydWN0b3I7XG5cbiAgICAvLyBOb24gYE9iamVjdGAgb2JqZWN0IGluc3RhbmNlcyB3aXRoIGRpZmZlcmVudCBjb25zdHJ1Y3RvcnMgYXJlIG5vdCBlcXVhbC5cbiAgICBpZiAob2JqQ3RvciAhPSBvdGhDdG9yICYmXG4gICAgICAgICgnY29uc3RydWN0b3InIGluIG9iamVjdCAmJiAnY29uc3RydWN0b3InIGluIG90aGVyKSAmJlxuICAgICAgICAhKHR5cGVvZiBvYmpDdG9yID09ICdmdW5jdGlvbicgJiYgb2JqQ3RvciBpbnN0YW5jZW9mIG9iakN0b3IgJiZcbiAgICAgICAgICB0eXBlb2Ygb3RoQ3RvciA9PSAnZnVuY3Rpb24nICYmIG90aEN0b3IgaW5zdGFuY2VvZiBvdGhDdG9yKSkge1xuICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIHN0YWNrWydkZWxldGUnXShvYmplY3QpO1xuICBzdGFja1snZGVsZXRlJ10ob3RoZXIpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGVxdWFsT2JqZWN0cztcbiIsInZhciBTdGFjayA9IHJlcXVpcmUoJy4vX1N0YWNrJyksXG4gICAgZXF1YWxBcnJheXMgPSByZXF1aXJlKCcuL19lcXVhbEFycmF5cycpLFxuICAgIGVxdWFsQnlUYWcgPSByZXF1aXJlKCcuL19lcXVhbEJ5VGFnJyksXG4gICAgZXF1YWxPYmplY3RzID0gcmVxdWlyZSgnLi9fZXF1YWxPYmplY3RzJyksXG4gICAgZ2V0VGFnID0gcmVxdWlyZSgnLi9fZ2V0VGFnJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzQnVmZmVyID0gcmVxdWlyZSgnLi9pc0J1ZmZlcicpLFxuICAgIGlzVHlwZWRBcnJheSA9IHJlcXVpcmUoJy4vaXNUeXBlZEFycmF5Jyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xudmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICBhcnJheVRhZyA9ICdbb2JqZWN0IEFycmF5XScsXG4gICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XSc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbGAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cyB3aGljaCBwZXJmb3Jtc1xuICogZGVlcCBjb21wYXJpc29ucyBhbmQgdHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzIGVuYWJsaW5nIG9iamVjdHMgd2l0aCBjaXJjdWxhclxuICogcmVmZXJlbmNlcyB0byBiZSBjb21wYXJlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzRXF1YWxEZWVwKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgdmFyIG9iaklzQXJyID0gaXNBcnJheShvYmplY3QpLFxuICAgICAgb3RoSXNBcnIgPSBpc0FycmF5KG90aGVyKSxcbiAgICAgIG9ialRhZyA9IG9iaklzQXJyID8gYXJyYXlUYWcgOiBnZXRUYWcob2JqZWN0KSxcbiAgICAgIG90aFRhZyA9IG90aElzQXJyID8gYXJyYXlUYWcgOiBnZXRUYWcob3RoZXIpO1xuXG4gIG9ialRhZyA9IG9ialRhZyA9PSBhcmdzVGFnID8gb2JqZWN0VGFnIDogb2JqVGFnO1xuICBvdGhUYWcgPSBvdGhUYWcgPT0gYXJnc1RhZyA/IG9iamVjdFRhZyA6IG90aFRhZztcblxuICB2YXIgb2JqSXNPYmogPSBvYmpUYWcgPT0gb2JqZWN0VGFnLFxuICAgICAgb3RoSXNPYmogPSBvdGhUYWcgPT0gb2JqZWN0VGFnLFxuICAgICAgaXNTYW1lVGFnID0gb2JqVGFnID09IG90aFRhZztcblxuICBpZiAoaXNTYW1lVGFnICYmIGlzQnVmZmVyKG9iamVjdCkpIHtcbiAgICBpZiAoIWlzQnVmZmVyKG90aGVyKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBvYmpJc0FyciA9IHRydWU7XG4gICAgb2JqSXNPYmogPSBmYWxzZTtcbiAgfVxuICBpZiAoaXNTYW1lVGFnICYmICFvYmpJc09iaikge1xuICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgcmV0dXJuIChvYmpJc0FyciB8fCBpc1R5cGVkQXJyYXkob2JqZWN0KSlcbiAgICAgID8gZXF1YWxBcnJheXMob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaylcbiAgICAgIDogZXF1YWxCeVRhZyhvYmplY3QsIG90aGVyLCBvYmpUYWcsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xuICB9XG4gIGlmICghKGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRykpIHtcbiAgICB2YXIgb2JqSXNXcmFwcGVkID0gb2JqSXNPYmogJiYgaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsICdfX3dyYXBwZWRfXycpLFxuICAgICAgICBvdGhJc1dyYXBwZWQgPSBvdGhJc09iaiAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG90aGVyLCAnX193cmFwcGVkX18nKTtcblxuICAgIGlmIChvYmpJc1dyYXBwZWQgfHwgb3RoSXNXcmFwcGVkKSB7XG4gICAgICB2YXIgb2JqVW53cmFwcGVkID0gb2JqSXNXcmFwcGVkID8gb2JqZWN0LnZhbHVlKCkgOiBvYmplY3QsXG4gICAgICAgICAgb3RoVW53cmFwcGVkID0gb3RoSXNXcmFwcGVkID8gb3RoZXIudmFsdWUoKSA6IG90aGVyO1xuXG4gICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgcmV0dXJuIGVxdWFsRnVuYyhvYmpVbndyYXBwZWQsIG90aFVud3JhcHBlZCwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spO1xuICAgIH1cbiAgfVxuICBpZiAoIWlzU2FtZVRhZykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICByZXR1cm4gZXF1YWxPYmplY3RzKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc0VxdWFsRGVlcDtcbiIsInZhciBiYXNlSXNFcXVhbERlZXAgPSByZXF1aXJlKCcuL19iYXNlSXNFcXVhbERlZXAnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzRXF1YWxgIHdoaWNoIHN1cHBvcnRzIHBhcnRpYWwgY29tcGFyaXNvbnNcbiAqIGFuZCB0cmFja3MgdHJhdmVyc2VkIG9iamVjdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHtib29sZWFufSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLlxuICogIDEgLSBVbm9yZGVyZWQgY29tcGFyaXNvblxuICogIDIgLSBQYXJ0aWFsIGNvbXBhcmlzb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBgdmFsdWVgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNFcXVhbCh2YWx1ZSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gIGlmICh2YWx1ZSA9PT0gb3RoZXIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAodmFsdWUgPT0gbnVsbCB8fCBvdGhlciA9PSBudWxsIHx8ICghaXNPYmplY3RMaWtlKHZhbHVlKSAmJiAhaXNPYmplY3RMaWtlKG90aGVyKSkpIHtcbiAgICByZXR1cm4gdmFsdWUgIT09IHZhbHVlICYmIG90aGVyICE9PSBvdGhlcjtcbiAgfVxuICByZXR1cm4gYmFzZUlzRXF1YWxEZWVwKHZhbHVlLCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgYmFzZUlzRXF1YWwsIHN0YWNrKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNFcXVhbDtcbiIsInZhciBTdGFjayA9IHJlcXVpcmUoJy4vX1N0YWNrJyksXG4gICAgYmFzZUlzRXF1YWwgPSByZXF1aXJlKCcuL19iYXNlSXNFcXVhbCcpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciB2YWx1ZSBjb21wYXJpc29ucy4gKi9cbnZhciBDT01QQVJFX1BBUlRJQUxfRkxBRyA9IDEsXG4gICAgQ09NUEFSRV9VTk9SREVSRURfRkxBRyA9IDI7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNNYXRjaGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSB2YWx1ZXMgdG8gbWF0Y2guXG4gKiBAcGFyYW0ge0FycmF5fSBtYXRjaERhdGEgVGhlIHByb3BlcnR5IG5hbWVzLCB2YWx1ZXMsIGFuZCBjb21wYXJlIGZsYWdzIHRvIG1hdGNoLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG9iamVjdGAgaXMgYSBtYXRjaCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNNYXRjaChvYmplY3QsIHNvdXJjZSwgbWF0Y2hEYXRhLCBjdXN0b21pemVyKSB7XG4gIHZhciBpbmRleCA9IG1hdGNoRGF0YS5sZW5ndGgsXG4gICAgICBsZW5ndGggPSBpbmRleCxcbiAgICAgIG5vQ3VzdG9taXplciA9ICFjdXN0b21pemVyO1xuXG4gIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgIHJldHVybiAhbGVuZ3RoO1xuICB9XG4gIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuICB3aGlsZSAoaW5kZXgtLSkge1xuICAgIHZhciBkYXRhID0gbWF0Y2hEYXRhW2luZGV4XTtcbiAgICBpZiAoKG5vQ3VzdG9taXplciAmJiBkYXRhWzJdKVxuICAgICAgICAgID8gZGF0YVsxXSAhPT0gb2JqZWN0W2RhdGFbMF1dXG4gICAgICAgICAgOiAhKGRhdGFbMF0gaW4gb2JqZWN0KVxuICAgICAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBkYXRhID0gbWF0Y2hEYXRhW2luZGV4XTtcbiAgICB2YXIga2V5ID0gZGF0YVswXSxcbiAgICAgICAgb2JqVmFsdWUgPSBvYmplY3Rba2V5XSxcbiAgICAgICAgc3JjVmFsdWUgPSBkYXRhWzFdO1xuXG4gICAgaWYgKG5vQ3VzdG9taXplciAmJiBkYXRhWzJdKSB7XG4gICAgICBpZiAob2JqVmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhKGtleSBpbiBvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHN0YWNrID0gbmV3IFN0YWNrO1xuICAgICAgaWYgKGN1c3RvbWl6ZXIpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlLCBrZXksIG9iamVjdCwgc291cmNlLCBzdGFjayk7XG4gICAgICB9XG4gICAgICBpZiAoIShyZXN1bHQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBiYXNlSXNFcXVhbChzcmNWYWx1ZSwgb2JqVmFsdWUsIENPTVBBUkVfUEFSVElBTF9GTEFHIHwgQ09NUEFSRV9VTk9SREVSRURfRkxBRywgY3VzdG9taXplciwgc3RhY2spXG4gICAgICAgICAgICA6IHJlc3VsdFxuICAgICAgICAgICkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNNYXRjaDtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSBmb3Igc3RyaWN0IGVxdWFsaXR5IGNvbXBhcmlzb25zLCBpLmUuIGA9PT1gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlmIHN1aXRhYmxlIGZvciBzdHJpY3RcbiAqICBlcXVhbGl0eSBjb21wYXJpc29ucywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc1N0cmljdENvbXBhcmFibGUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZSAmJiAhaXNPYmplY3QodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzU3RyaWN0Q29tcGFyYWJsZTtcbiIsInZhciBpc1N0cmljdENvbXBhcmFibGUgPSByZXF1aXJlKCcuL19pc1N0cmljdENvbXBhcmFibGUnKSxcbiAgICBrZXlzID0gcmVxdWlyZSgnLi9rZXlzJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgcHJvcGVydHkgbmFtZXMsIHZhbHVlcywgYW5kIGNvbXBhcmUgZmxhZ3Mgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbWF0Y2ggZGF0YSBvZiBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gZ2V0TWF0Y2hEYXRhKG9iamVjdCkge1xuICB2YXIgcmVzdWx0ID0ga2V5cyhvYmplY3QpLFxuICAgICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDtcblxuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICB2YXIga2V5ID0gcmVzdWx0W2xlbmd0aF0sXG4gICAgICAgIHZhbHVlID0gb2JqZWN0W2tleV07XG5cbiAgICByZXN1bHRbbGVuZ3RoXSA9IFtrZXksIHZhbHVlLCBpc1N0cmljdENvbXBhcmFibGUodmFsdWUpXTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldE1hdGNoRGF0YTtcbiIsIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBtYXRjaGVzUHJvcGVydHlgIGZvciBzb3VyY2UgdmFsdWVzIHN1aXRhYmxlXG4gKiBmb3Igc3RyaWN0IGVxdWFsaXR5IGNvbXBhcmlzb25zLCBpLmUuIGA9PT1gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHZhbHVlIHRvIG1hdGNoLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUoa2V5LCBzcmNWYWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBvYmplY3Rba2V5XSA9PT0gc3JjVmFsdWUgJiZcbiAgICAgIChzcmNWYWx1ZSAhPT0gdW5kZWZpbmVkIHx8IChrZXkgaW4gT2JqZWN0KG9iamVjdCkpKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZTtcbiIsInZhciBiYXNlSXNNYXRjaCA9IHJlcXVpcmUoJy4vX2Jhc2VJc01hdGNoJyksXG4gICAgZ2V0TWF0Y2hEYXRhID0gcmVxdWlyZSgnLi9fZ2V0TWF0Y2hEYXRhJyksXG4gICAgbWF0Y2hlc1N0cmljdENvbXBhcmFibGUgPSByZXF1aXJlKCcuL19tYXRjaGVzU3RyaWN0Q29tcGFyYWJsZScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1hdGNoZXNgIHdoaWNoIGRvZXNuJ3QgY2xvbmUgYHNvdXJjZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSB2YWx1ZXMgdG8gbWF0Y2guXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlTWF0Y2hlcyhzb3VyY2UpIHtcbiAgdmFyIG1hdGNoRGF0YSA9IGdldE1hdGNoRGF0YShzb3VyY2UpO1xuICBpZiAobWF0Y2hEYXRhLmxlbmd0aCA9PSAxICYmIG1hdGNoRGF0YVswXVsyXSkge1xuICAgIHJldHVybiBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZShtYXRjaERhdGFbMF1bMF0sIG1hdGNoRGF0YVswXVsxXSk7XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHJldHVybiBvYmplY3QgPT09IHNvdXJjZSB8fCBiYXNlSXNNYXRjaChvYmplY3QsIHNvdXJjZSwgbWF0Y2hEYXRhKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlTWF0Y2hlcztcbiIsInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN5bWJvbGAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN5bWJvbCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3ltYm9sKFN5bWJvbC5pdGVyYXRvcik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1N5bWJvbCgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8XG4gICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gc3ltYm9sVGFnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1N5bWJvbDtcbiIsInZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNTeW1ib2wgPSByZXF1aXJlKCcuL2lzU3ltYm9sJyk7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIHByb3BlcnR5IG5hbWVzIHdpdGhpbiBwcm9wZXJ0eSBwYXRocy4gKi9cbnZhciByZUlzRGVlcFByb3AgPSAvXFwufFxcWyg/OlteW1xcXV0qfChbXCInXSkoPzooPyFcXDEpW15cXFxcXXxcXFxcLikqP1xcMSlcXF0vLFxuICAgIHJlSXNQbGFpblByb3AgPSAvXlxcdyokLztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHByb3BlcnR5IG5hbWUgYW5kIG5vdCBhIHByb3BlcnR5IHBhdGguXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkga2V5cyBvbi5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcHJvcGVydHkgbmFtZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0tleSh2YWx1ZSwgb2JqZWN0KSB7XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgaWYgKHR5cGUgPT0gJ251bWJlcicgfHwgdHlwZSA9PSAnc3ltYm9sJyB8fCB0eXBlID09ICdib29sZWFuJyB8fFxuICAgICAgdmFsdWUgPT0gbnVsbCB8fCBpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gcmVJc1BsYWluUHJvcC50ZXN0KHZhbHVlKSB8fCAhcmVJc0RlZXBQcm9wLnRlc3QodmFsdWUpIHx8XG4gICAgKG9iamVjdCAhPSBudWxsICYmIHZhbHVlIGluIE9iamVjdChvYmplY3QpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0tleTtcbiIsInZhciBNYXBDYWNoZSA9IHJlcXVpcmUoJy4vX01hcENhY2hlJyk7XG5cbi8qKiBFcnJvciBtZXNzYWdlIGNvbnN0YW50cy4gKi9cbnZhciBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgbWVtb2l6ZXMgdGhlIHJlc3VsdCBvZiBgZnVuY2AuIElmIGByZXNvbHZlcmAgaXNcbiAqIHByb3ZpZGVkLCBpdCBkZXRlcm1pbmVzIHRoZSBjYWNoZSBrZXkgZm9yIHN0b3JpbmcgdGhlIHJlc3VsdCBiYXNlZCBvbiB0aGVcbiAqIGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24uIEJ5IGRlZmF1bHQsIHRoZSBmaXJzdCBhcmd1bWVudFxuICogcHJvdmlkZWQgdG8gdGhlIG1lbW9pemVkIGZ1bmN0aW9uIGlzIHVzZWQgYXMgdGhlIG1hcCBjYWNoZSBrZXkuIFRoZSBgZnVuY2BcbiAqIGlzIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlIG1lbW9pemVkIGZ1bmN0aW9uLlxuICpcbiAqICoqTm90ZToqKiBUaGUgY2FjaGUgaXMgZXhwb3NlZCBhcyB0aGUgYGNhY2hlYCBwcm9wZXJ0eSBvbiB0aGUgbWVtb2l6ZWRcbiAqIGZ1bmN0aW9uLiBJdHMgY3JlYXRpb24gbWF5IGJlIGN1c3RvbWl6ZWQgYnkgcmVwbGFjaW5nIHRoZSBgXy5tZW1vaXplLkNhY2hlYFxuICogY29uc3RydWN0b3Igd2l0aCBvbmUgd2hvc2UgaW5zdGFuY2VzIGltcGxlbWVudCB0aGVcbiAqIFtgTWFwYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcHJvcGVydGllcy1vZi10aGUtbWFwLXByb3RvdHlwZS1vYmplY3QpXG4gKiBtZXRob2QgaW50ZXJmYWNlIG9mIGBjbGVhcmAsIGBkZWxldGVgLCBgZ2V0YCwgYGhhc2AsIGFuZCBgc2V0YC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGhhdmUgaXRzIG91dHB1dCBtZW1vaXplZC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtyZXNvbHZlcl0gVGhlIGZ1bmN0aW9uIHRvIHJlc29sdmUgdGhlIGNhY2hlIGtleS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1lbW9pemVkIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogMiB9O1xuICogdmFyIG90aGVyID0geyAnYyc6IDMsICdkJzogNCB9O1xuICpcbiAqIHZhciB2YWx1ZXMgPSBfLm1lbW9pemUoXy52YWx1ZXMpO1xuICogdmFsdWVzKG9iamVjdCk7XG4gKiAvLyA9PiBbMSwgMl1cbiAqXG4gKiB2YWx1ZXMob3RoZXIpO1xuICogLy8gPT4gWzMsIDRdXG4gKlxuICogb2JqZWN0LmEgPSAyO1xuICogdmFsdWVzKG9iamVjdCk7XG4gKiAvLyA9PiBbMSwgMl1cbiAqXG4gKiAvLyBNb2RpZnkgdGhlIHJlc3VsdCBjYWNoZS5cbiAqIHZhbHVlcy5jYWNoZS5zZXQob2JqZWN0LCBbJ2EnLCAnYiddKTtcbiAqIHZhbHVlcyhvYmplY3QpO1xuICogLy8gPT4gWydhJywgJ2InXVxuICpcbiAqIC8vIFJlcGxhY2UgYF8ubWVtb2l6ZS5DYWNoZWAuXG4gKiBfLm1lbW9pemUuQ2FjaGUgPSBXZWFrTWFwO1xuICovXG5mdW5jdGlvbiBtZW1vaXplKGZ1bmMsIHJlc29sdmVyKSB7XG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nIHx8IChyZXNvbHZlciAhPSBudWxsICYmIHR5cGVvZiByZXNvbHZlciAhPSAnZnVuY3Rpb24nKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgfVxuICB2YXIgbWVtb2l6ZWQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAga2V5ID0gcmVzb2x2ZXIgPyByZXNvbHZlci5hcHBseSh0aGlzLCBhcmdzKSA6IGFyZ3NbMF0sXG4gICAgICAgIGNhY2hlID0gbWVtb2l6ZWQuY2FjaGU7XG5cbiAgICBpZiAoY2FjaGUuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybiBjYWNoZS5nZXQoa2V5KTtcbiAgICB9XG4gICAgdmFyIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpcywgYXJncyk7XG4gICAgbWVtb2l6ZWQuY2FjaGUgPSBjYWNoZS5zZXQoa2V5LCByZXN1bHQpIHx8IGNhY2hlO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIG1lbW9pemVkLmNhY2hlID0gbmV3IChtZW1vaXplLkNhY2hlIHx8IE1hcENhY2hlKTtcbiAgcmV0dXJuIG1lbW9pemVkO1xufVxuXG4vLyBFeHBvc2UgYE1hcENhY2hlYC5cbm1lbW9pemUuQ2FjaGUgPSBNYXBDYWNoZTtcblxubW9kdWxlLmV4cG9ydHMgPSBtZW1vaXplO1xuIiwidmFyIG1lbW9pemUgPSByZXF1aXJlKCcuL21lbW9pemUnKTtcblxuLyoqIFVzZWQgYXMgdGhlIG1heGltdW0gbWVtb2l6ZSBjYWNoZSBzaXplLiAqL1xudmFyIE1BWF9NRU1PSVpFX1NJWkUgPSA1MDA7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1lbW9pemVgIHdoaWNoIGNsZWFycyB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24nc1xuICogY2FjaGUgd2hlbiBpdCBleGNlZWRzIGBNQVhfTUVNT0laRV9TSVpFYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaGF2ZSBpdHMgb3V0cHV0IG1lbW9pemVkLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgbWVtb2l6ZWQgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG1lbW9pemVDYXBwZWQoZnVuYykge1xuICB2YXIgcmVzdWx0ID0gbWVtb2l6ZShmdW5jLCBmdW5jdGlvbihrZXkpIHtcbiAgICBpZiAoY2FjaGUuc2l6ZSA9PT0gTUFYX01FTU9JWkVfU0laRSkge1xuICAgICAgY2FjaGUuY2xlYXIoKTtcbiAgICB9XG4gICAgcmV0dXJuIGtleTtcbiAgfSk7XG5cbiAgdmFyIGNhY2hlID0gcmVzdWx0LmNhY2hlO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1lbW9pemVDYXBwZWQ7XG4iLCJ2YXIgbWVtb2l6ZUNhcHBlZCA9IHJlcXVpcmUoJy4vX21lbW9pemVDYXBwZWQnKTtcblxuLyoqIFVzZWQgdG8gbWF0Y2ggcHJvcGVydHkgbmFtZXMgd2l0aGluIHByb3BlcnR5IHBhdGhzLiAqL1xudmFyIHJlUHJvcE5hbWUgPSAvW14uW1xcXV0rfFxcWyg/OigtP1xcZCsoPzpcXC5cXGQrKT8pfChbXCInXSkoKD86KD8hXFwyKVteXFxcXF18XFxcXC4pKj8pXFwyKVxcXXwoPz0oPzpcXC58XFxbXFxdKSg/OlxcLnxcXFtcXF18JCkpL2c7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGJhY2tzbGFzaGVzIGluIHByb3BlcnR5IHBhdGhzLiAqL1xudmFyIHJlRXNjYXBlQ2hhciA9IC9cXFxcKFxcXFwpPy9nO1xuXG4vKipcbiAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIGEgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHByb3BlcnR5IHBhdGggYXJyYXkuXG4gKi9cbnZhciBzdHJpbmdUb1BhdGggPSBtZW1vaXplQ2FwcGVkKGZ1bmN0aW9uKHN0cmluZykge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIGlmIChzdHJpbmcuY2hhckNvZGVBdCgwKSA9PT0gNDYgLyogLiAqLykge1xuICAgIHJlc3VsdC5wdXNoKCcnKTtcbiAgfVxuICBzdHJpbmcucmVwbGFjZShyZVByb3BOYW1lLCBmdW5jdGlvbihtYXRjaCwgbnVtYmVyLCBxdW90ZSwgc3ViU3RyaW5nKSB7XG4gICAgcmVzdWx0LnB1c2gocXVvdGUgPyBzdWJTdHJpbmcucmVwbGFjZShyZUVzY2FwZUNoYXIsICckMScpIDogKG51bWJlciB8fCBtYXRjaCkpO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHN0cmluZ1RvUGF0aDtcbiIsIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1hcGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlXG4gKiBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBhcnJheU1hcChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlNYXA7XG4iLCJ2YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fU3ltYm9sJyksXG4gICAgYXJyYXlNYXAgPSByZXF1aXJlKCcuL19hcnJheU1hcCcpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc1N5bWJvbCA9IHJlcXVpcmUoJy4vaXNTeW1ib2wnKTtcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgSU5GSU5JVFkgPSAxIC8gMDtcblxuLyoqIFVzZWQgdG8gY29udmVydCBzeW1ib2xzIHRvIHByaW1pdGl2ZXMgYW5kIHN0cmluZ3MuICovXG52YXIgc3ltYm9sUHJvdG8gPSBTeW1ib2wgPyBTeW1ib2wucHJvdG90eXBlIDogdW5kZWZpbmVkLFxuICAgIHN5bWJvbFRvU3RyaW5nID0gc3ltYm9sUHJvdG8gPyBzeW1ib2xQcm90by50b1N0cmluZyA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50b1N0cmluZ2Agd2hpY2ggZG9lc24ndCBjb252ZXJ0IG51bGxpc2hcbiAqIHZhbHVlcyB0byBlbXB0eSBzdHJpbmdzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBiYXNlVG9TdHJpbmcodmFsdWUpIHtcbiAgLy8gRXhpdCBlYXJseSBmb3Igc3RyaW5ncyB0byBhdm9pZCBhIHBlcmZvcm1hbmNlIGhpdCBpbiBzb21lIGVudmlyb25tZW50cy5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAvLyBSZWN1cnNpdmVseSBjb252ZXJ0IHZhbHVlcyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgIHJldHVybiBhcnJheU1hcCh2YWx1ZSwgYmFzZVRvU3RyaW5nKSArICcnO1xuICB9XG4gIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gc3ltYm9sVG9TdHJpbmcgPyBzeW1ib2xUb1N0cmluZy5jYWxsKHZhbHVlKSA6ICcnO1xuICB9XG4gIHZhciByZXN1bHQgPSAodmFsdWUgKyAnJyk7XG4gIHJldHVybiAocmVzdWx0ID09ICcwJyAmJiAoMSAvIHZhbHVlKSA9PSAtSU5GSU5JVFkpID8gJy0wJyA6IHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVG9TdHJpbmc7XG4iLCJ2YXIgYmFzZVRvU3RyaW5nID0gcmVxdWlyZSgnLi9fYmFzZVRvU3RyaW5nJyk7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZy4gQW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGZvciBgbnVsbGBcbiAqIGFuZCBgdW5kZWZpbmVkYCB2YWx1ZXMuIFRoZSBzaWduIG9mIGAtMGAgaXMgcHJlc2VydmVkLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b1N0cmluZyhudWxsKTtcbiAqIC8vID0+ICcnXG4gKlxuICogXy50b1N0cmluZygtMCk7XG4gKiAvLyA9PiAnLTAnXG4gKlxuICogXy50b1N0cmluZyhbMSwgMiwgM10pO1xuICogLy8gPT4gJzEsMiwzJ1xuICovXG5mdW5jdGlvbiB0b1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICcnIDogYmFzZVRvU3RyaW5nKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b1N0cmluZztcbiIsInZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNLZXkgPSByZXF1aXJlKCcuL19pc0tleScpLFxuICAgIHN0cmluZ1RvUGF0aCA9IHJlcXVpcmUoJy4vX3N0cmluZ1RvUGF0aCcpLFxuICAgIHRvU3RyaW5nID0gcmVxdWlyZSgnLi90b1N0cmluZycpO1xuXG4vKipcbiAqIENhc3RzIGB2YWx1ZWAgdG8gYSBwYXRoIGFycmF5IGlmIGl0J3Mgbm90IG9uZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5IGtleXMgb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNhc3QgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gY2FzdFBhdGgodmFsdWUsIG9iamVjdCkge1xuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIGlzS2V5KHZhbHVlLCBvYmplY3QpID8gW3ZhbHVlXSA6IHN0cmluZ1RvUGF0aCh0b1N0cmluZyh2YWx1ZSkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNhc3RQYXRoO1xuIiwidmFyIGlzU3ltYm9sID0gcmVxdWlyZSgnLi9pc1N5bWJvbCcpO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBJTkZJTklUWSA9IDEgLyAwO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcga2V5IGlmIGl0J3Mgbm90IGEgc3RyaW5nIG9yIHN5bWJvbC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtzdHJpbmd8c3ltYm9sfSBSZXR1cm5zIHRoZSBrZXkuXG4gKi9cbmZ1bmN0aW9uIHRvS2V5KHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHwgaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHZhciByZXN1bHQgPSAodmFsdWUgKyAnJyk7XG4gIHJldHVybiAocmVzdWx0ID09ICcwJyAmJiAoMSAvIHZhbHVlKSA9PSAtSU5GSU5JVFkpID8gJy0wJyA6IHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b0tleTtcbiIsInZhciBjYXN0UGF0aCA9IHJlcXVpcmUoJy4vX2Nhc3RQYXRoJyksXG4gICAgdG9LZXkgPSByZXF1aXJlKCcuL190b0tleScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmdldGAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWZhdWx0IHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYmFzZUdldChvYmplY3QsIHBhdGgpIHtcbiAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG5cbiAgdmFyIGluZGV4ID0gMCxcbiAgICAgIGxlbmd0aCA9IHBhdGgubGVuZ3RoO1xuXG4gIHdoaWxlIChvYmplY3QgIT0gbnVsbCAmJiBpbmRleCA8IGxlbmd0aCkge1xuICAgIG9iamVjdCA9IG9iamVjdFt0b0tleShwYXRoW2luZGV4KytdKV07XG4gIH1cbiAgcmV0dXJuIChpbmRleCAmJiBpbmRleCA9PSBsZW5ndGgpID8gb2JqZWN0IDogdW5kZWZpbmVkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VHZXQ7XG4iLCJ2YXIgYmFzZUdldCA9IHJlcXVpcmUoJy4vX2Jhc2VHZXQnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSB2YWx1ZSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuIElmIHRoZSByZXNvbHZlZCB2YWx1ZSBpc1xuICogYHVuZGVmaW5lZGAsIHRoZSBgZGVmYXVsdFZhbHVlYCBpcyByZXR1cm5lZCBpbiBpdHMgcGxhY2UuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjcuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEBwYXJhbSB7Kn0gW2RlZmF1bHRWYWx1ZV0gVGhlIHZhbHVlIHJldHVybmVkIGZvciBgdW5kZWZpbmVkYCByZXNvbHZlZCB2YWx1ZXMuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogMyB9IH1dIH07XG4gKlxuICogXy5nZXQob2JqZWN0LCAnYVswXS5iLmMnKTtcbiAqIC8vID0+IDNcbiAqXG4gKiBfLmdldChvYmplY3QsIFsnYScsICcwJywgJ2InLCAnYyddKTtcbiAqIC8vID0+IDNcbiAqXG4gKiBfLmdldChvYmplY3QsICdhLmIuYycsICdkZWZhdWx0Jyk7XG4gKiAvLyA9PiAnZGVmYXVsdCdcbiAqL1xuZnVuY3Rpb24gZ2V0KG9iamVjdCwgcGF0aCwgZGVmYXVsdFZhbHVlKSB7XG4gIHZhciByZXN1bHQgPSBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IGJhc2VHZXQob2JqZWN0LCBwYXRoKTtcbiAgcmV0dXJuIHJlc3VsdCA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdFZhbHVlIDogcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldDtcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaGFzSW5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VIYXNJbihvYmplY3QsIGtleSkge1xuICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYga2V5IGluIE9iamVjdChvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VIYXNJbjtcbiIsInZhciBjYXN0UGF0aCA9IHJlcXVpcmUoJy4vX2Nhc3RQYXRoJyksXG4gICAgaXNBcmd1bWVudHMgPSByZXF1aXJlKCcuL2lzQXJndW1lbnRzJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzSW5kZXggPSByZXF1aXJlKCcuL19pc0luZGV4JyksXG4gICAgaXNMZW5ndGggPSByZXF1aXJlKCcuL2lzTGVuZ3RoJyksXG4gICAgdG9LZXkgPSByZXF1aXJlKCcuL190b0tleScpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgcGF0aGAgZXhpc3RzIG9uIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCB0byBjaGVjay5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGhhc0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGNoZWNrIHByb3BlcnRpZXMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBoYXNQYXRoKG9iamVjdCwgcGF0aCwgaGFzRnVuYykge1xuICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHBhdGgubGVuZ3RoLFxuICAgICAgcmVzdWx0ID0gZmFsc2U7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIga2V5ID0gdG9LZXkocGF0aFtpbmRleF0pO1xuICAgIGlmICghKHJlc3VsdCA9IG9iamVjdCAhPSBudWxsICYmIGhhc0Z1bmMob2JqZWN0LCBrZXkpKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIG9iamVjdCA9IG9iamVjdFtrZXldO1xuICB9XG4gIGlmIChyZXN1bHQgfHwgKytpbmRleCAhPSBsZW5ndGgpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGxlbmd0aCA9IG9iamVjdCA9PSBudWxsID8gMCA6IG9iamVjdC5sZW5ndGg7XG4gIHJldHVybiAhIWxlbmd0aCAmJiBpc0xlbmd0aChsZW5ndGgpICYmIGlzSW5kZXgoa2V5LCBsZW5ndGgpICYmXG4gICAgKGlzQXJyYXkob2JqZWN0KSB8fCBpc0FyZ3VtZW50cyhvYmplY3QpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNQYXRoO1xuIiwidmFyIGJhc2VIYXNJbiA9IHJlcXVpcmUoJy4vX2Jhc2VIYXNJbicpLFxuICAgIGhhc1BhdGggPSByZXF1aXJlKCcuL19oYXNQYXRoJyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBwYXRoYCBpcyBhIGRpcmVjdCBvciBpbmhlcml0ZWQgcHJvcGVydHkgb2YgYG9iamVjdGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0gXy5jcmVhdGUoeyAnYSc6IF8uY3JlYXRlKHsgJ2InOiAyIH0pIH0pO1xuICpcbiAqIF8uaGFzSW4ob2JqZWN0LCAnYScpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaGFzSW4ob2JqZWN0LCAnYS5iJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5oYXNJbihvYmplY3QsIFsnYScsICdiJ10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaGFzSW4ob2JqZWN0LCAnYicpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaGFzSW4ob2JqZWN0LCBwYXRoKSB7XG4gIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBoYXNQYXRoKG9iamVjdCwgcGF0aCwgYmFzZUhhc0luKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNJbjtcbiIsInZhciBiYXNlSXNFcXVhbCA9IHJlcXVpcmUoJy4vX2Jhc2VJc0VxdWFsJyksXG4gICAgZ2V0ID0gcmVxdWlyZSgnLi9nZXQnKSxcbiAgICBoYXNJbiA9IHJlcXVpcmUoJy4vaGFzSW4nKSxcbiAgICBpc0tleSA9IHJlcXVpcmUoJy4vX2lzS2V5JyksXG4gICAgaXNTdHJpY3RDb21wYXJhYmxlID0gcmVxdWlyZSgnLi9faXNTdHJpY3RDb21wYXJhYmxlJyksXG4gICAgbWF0Y2hlc1N0cmljdENvbXBhcmFibGUgPSByZXF1aXJlKCcuL19tYXRjaGVzU3RyaWN0Q29tcGFyYWJsZScpLFxuICAgIHRvS2V5ID0gcmVxdWlyZSgnLi9fdG9LZXknKTtcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgdmFsdWUgY29tcGFyaXNvbnMuICovXG52YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgPSAxLFxuICAgIENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcgPSAyO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1hdGNoZXNQcm9wZXJ0eWAgd2hpY2ggZG9lc24ndCBjbG9uZSBgc3JjVmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHBhcmFtIHsqfSBzcmNWYWx1ZSBUaGUgdmFsdWUgdG8gbWF0Y2guXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlTWF0Y2hlc1Byb3BlcnR5KHBhdGgsIHNyY1ZhbHVlKSB7XG4gIGlmIChpc0tleShwYXRoKSAmJiBpc1N0cmljdENvbXBhcmFibGUoc3JjVmFsdWUpKSB7XG4gICAgcmV0dXJuIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlKHRvS2V5KHBhdGgpLCBzcmNWYWx1ZSk7XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHZhciBvYmpWYWx1ZSA9IGdldChvYmplY3QsIHBhdGgpO1xuICAgIHJldHVybiAob2JqVmFsdWUgPT09IHVuZGVmaW5lZCAmJiBvYmpWYWx1ZSA9PT0gc3JjVmFsdWUpXG4gICAgICA/IGhhc0luKG9iamVjdCwgcGF0aClcbiAgICAgIDogYmFzZUlzRXF1YWwoc3JjVmFsdWUsIG9ialZhbHVlLCBDT01QQVJFX1BBUlRJQUxfRkxBRyB8IENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VNYXRjaGVzUHJvcGVydHk7XG4iLCIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnByb3BlcnR5YCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZXAgcGF0aHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGJhc2VQcm9wZXJ0eShrZXkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VQcm9wZXJ0eTtcbiIsInZhciBiYXNlR2V0ID0gcmVxdWlyZSgnLi9fYmFzZUdldCcpO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVByb3BlcnR5YCB3aGljaCBzdXBwb3J0cyBkZWVwIHBhdGhzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGJhc2VQcm9wZXJ0eURlZXAocGF0aCkge1xuICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgcmV0dXJuIGJhc2VHZXQob2JqZWN0LCBwYXRoKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlUHJvcGVydHlEZWVwO1xuIiwidmFyIGJhc2VQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX2Jhc2VQcm9wZXJ0eScpLFxuICAgIGJhc2VQcm9wZXJ0eURlZXAgPSByZXF1aXJlKCcuL19iYXNlUHJvcGVydHlEZWVwJyksXG4gICAgaXNLZXkgPSByZXF1aXJlKCcuL19pc0tleScpLFxuICAgIHRvS2V5ID0gcmVxdWlyZSgnLi9fdG9LZXknKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSB2YWx1ZSBhdCBgcGF0aGAgb2YgYSBnaXZlbiBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhY2Nlc3NvciBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdHMgPSBbXG4gKiAgIHsgJ2EnOiB7ICdiJzogMiB9IH0sXG4gKiAgIHsgJ2EnOiB7ICdiJzogMSB9IH1cbiAqIF07XG4gKlxuICogXy5tYXAob2JqZWN0cywgXy5wcm9wZXJ0eSgnYS5iJykpO1xuICogLy8gPT4gWzIsIDFdXG4gKlxuICogXy5tYXAoXy5zb3J0Qnkob2JqZWN0cywgXy5wcm9wZXJ0eShbJ2EnLCAnYiddKSksICdhLmInKTtcbiAqIC8vID0+IFsxLCAyXVxuICovXG5mdW5jdGlvbiBwcm9wZXJ0eShwYXRoKSB7XG4gIHJldHVybiBpc0tleShwYXRoKSA/IGJhc2VQcm9wZXJ0eSh0b0tleShwYXRoKSkgOiBiYXNlUHJvcGVydHlEZWVwKHBhdGgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHByb3BlcnR5O1xuIiwidmFyIGJhc2VNYXRjaGVzID0gcmVxdWlyZSgnLi9fYmFzZU1hdGNoZXMnKSxcbiAgICBiYXNlTWF0Y2hlc1Byb3BlcnR5ID0gcmVxdWlyZSgnLi9fYmFzZU1hdGNoZXNQcm9wZXJ0eScpLFxuICAgIGlkZW50aXR5ID0gcmVxdWlyZSgnLi9pZGVudGl0eScpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBwcm9wZXJ0eSA9IHJlcXVpcmUoJy4vcHJvcGVydHknKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pdGVyYXRlZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gW3ZhbHVlPV8uaWRlbnRpdHldIFRoZSB2YWx1ZSB0byBjb252ZXJ0IHRvIGFuIGl0ZXJhdGVlLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBpdGVyYXRlZS5cbiAqL1xuZnVuY3Rpb24gYmFzZUl0ZXJhdGVlKHZhbHVlKSB7XG4gIC8vIERvbid0IHN0b3JlIHRoZSBgdHlwZW9mYCByZXN1bHQgaW4gYSB2YXJpYWJsZSB0byBhdm9pZCBhIEpJVCBidWcgaW4gU2FmYXJpIDkuXG4gIC8vIFNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTU2MDM0IGZvciBtb3JlIGRldGFpbHMuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiBpZGVudGl0eTtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGlzQXJyYXkodmFsdWUpXG4gICAgICA/IGJhc2VNYXRjaGVzUHJvcGVydHkodmFsdWVbMF0sIHZhbHVlWzFdKVxuICAgICAgOiBiYXNlTWF0Y2hlcyh2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHByb3BlcnR5KHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXRlcmF0ZWU7XG4iLCJ2YXIgYXJyYXlGaWx0ZXIgPSByZXF1aXJlKCcuL19hcnJheUZpbHRlcicpLFxuICAgIGJhc2VGaWx0ZXIgPSByZXF1aXJlKCcuL19iYXNlRmlsdGVyJyksXG4gICAgYmFzZUl0ZXJhdGVlID0gcmVxdWlyZSgnLi9fYmFzZUl0ZXJhdGVlJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpO1xuXG4vKipcbiAqIEl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gLCByZXR1cm5pbmcgYW4gYXJyYXkgb2YgYWxsIGVsZW1lbnRzXG4gKiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHRocmVlXG4gKiBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAqXG4gKiAqKk5vdGU6KiogVW5saWtlIGBfLnJlbW92ZWAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LlxuICogQHNlZSBfLnJlamVjdFxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgdXNlcnMgPSBbXG4gKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9LFxuICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAqIF07XG4gKlxuICogXy5maWx0ZXIodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnXVxuICpcbiAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmZpbHRlcih1c2VycywgeyAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0pO1xuICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICpcbiAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uZmlsdGVyKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnXVxuICpcbiAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5maWx0ZXIodXNlcnMsICdhY3RpdmUnKTtcbiAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAqXG4gKiAvLyBDb21iaW5pbmcgc2V2ZXJhbCBwcmVkaWNhdGVzIHVzaW5nIGBfLm92ZXJFdmVyeWAgb3IgYF8ub3ZlclNvbWVgLlxuICogXy5maWx0ZXIodXNlcnMsIF8ub3ZlclNvbWUoW3sgJ2FnZSc6IDM2IH0sIFsnYWdlJywgNDBdXSkpO1xuICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJywgJ2Jhcm5leSddXG4gKi9cbmZ1bmN0aW9uIGZpbHRlcihjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlGaWx0ZXIgOiBiYXNlRmlsdGVyO1xuICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBiYXNlSXRlcmF0ZWUocHJlZGljYXRlLCAzKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZmlsdGVyO1xuIiwiLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5oYXNgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VIYXMob2JqZWN0LCBrZXkpIHtcbiAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VIYXM7XG4iLCJ2YXIgYmFzZUhhcyA9IHJlcXVpcmUoJy4vX2Jhc2VIYXMnKSxcbiAgICBoYXNQYXRoID0gcmVxdWlyZSgnLi9faGFzUGF0aCcpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgcGF0aGAgaXMgYSBkaXJlY3QgcHJvcGVydHkgb2YgYG9iamVjdGAuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IHsgJ2InOiAyIH0gfTtcbiAqIHZhciBvdGhlciA9IF8uY3JlYXRlKHsgJ2EnOiBfLmNyZWF0ZSh7ICdiJzogMiB9KSB9KTtcbiAqXG4gKiBfLmhhcyhvYmplY3QsICdhJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5oYXMob2JqZWN0LCAnYS5iJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5oYXMob2JqZWN0LCBbJ2EnLCAnYiddKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmhhcyhvdGhlciwgJ2EnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGhhcyhvYmplY3QsIHBhdGgpIHtcbiAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIGhhc1BhdGgob2JqZWN0LCBwYXRoLCBiYXNlSGFzKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXM7XG4iLCJ2YXIgYmFzZUtleXMgPSByZXF1aXJlKCcuL19iYXNlS2V5cycpLFxuICAgIGdldFRhZyA9IHJlcXVpcmUoJy4vX2dldFRhZycpLFxuICAgIGlzQXJndW1lbnRzID0gcmVxdWlyZSgnLi9pc0FyZ3VtZW50cycpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc0FycmF5TGlrZSA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2UnKSxcbiAgICBpc0J1ZmZlciA9IHJlcXVpcmUoJy4vaXNCdWZmZXInKSxcbiAgICBpc1Byb3RvdHlwZSA9IHJlcXVpcmUoJy4vX2lzUHJvdG90eXBlJyksXG4gICAgaXNUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9pc1R5cGVkQXJyYXknKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGVtcHR5IG9iamVjdCwgY29sbGVjdGlvbiwgbWFwLCBvciBzZXQuXG4gKlxuICogT2JqZWN0cyBhcmUgY29uc2lkZXJlZCBlbXB0eSBpZiB0aGV5IGhhdmUgbm8gb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkXG4gKiBwcm9wZXJ0aWVzLlxuICpcbiAqIEFycmF5LWxpa2UgdmFsdWVzIHN1Y2ggYXMgYGFyZ3VtZW50c2Agb2JqZWN0cywgYXJyYXlzLCBidWZmZXJzLCBzdHJpbmdzLCBvclxuICogalF1ZXJ5LWxpa2UgY29sbGVjdGlvbnMgYXJlIGNvbnNpZGVyZWQgZW1wdHkgaWYgdGhleSBoYXZlIGEgYGxlbmd0aGAgb2YgYDBgLlxuICogU2ltaWxhcmx5LCBtYXBzIGFuZCBzZXRzIGFyZSBjb25zaWRlcmVkIGVtcHR5IGlmIHRoZXkgaGF2ZSBhIGBzaXplYCBvZiBgMGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZW1wdHksIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0VtcHR5KG51bGwpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNFbXB0eSh0cnVlKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzRW1wdHkoMSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0VtcHR5KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNFbXB0eSh7ICdhJzogMSB9KTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRW1wdHkodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoaXNBcnJheUxpa2UodmFsdWUpICYmXG4gICAgICAoaXNBcnJheSh2YWx1ZSkgfHwgdHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZS5zcGxpY2UgPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICBpc0J1ZmZlcih2YWx1ZSkgfHwgaXNUeXBlZEFycmF5KHZhbHVlKSB8fCBpc0FyZ3VtZW50cyh2YWx1ZSkpKSB7XG4gICAgcmV0dXJuICF2YWx1ZS5sZW5ndGg7XG4gIH1cbiAgdmFyIHRhZyA9IGdldFRhZyh2YWx1ZSk7XG4gIGlmICh0YWcgPT0gbWFwVGFnIHx8IHRhZyA9PSBzZXRUYWcpIHtcbiAgICByZXR1cm4gIXZhbHVlLnNpemU7XG4gIH1cbiAgaWYgKGlzUHJvdG90eXBlKHZhbHVlKSkge1xuICAgIHJldHVybiAhYmFzZUtleXModmFsdWUpLmxlbmd0aDtcbiAgfVxuICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwga2V5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0VtcHR5O1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgdW5kZWZpbmVkYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgdW5kZWZpbmVkYCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzVW5kZWZpbmVkKHZvaWQgMCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1VuZGVmaW5lZChudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzVW5kZWZpbmVkO1xuIiwidmFyIGJhc2VFYWNoID0gcmVxdWlyZSgnLi9fYmFzZUVhY2gnKSxcbiAgICBpc0FycmF5TGlrZSA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2UnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXBgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYmFzZU1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IGlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pID8gQXJyYXkoY29sbGVjdGlvbi5sZW5ndGgpIDogW107XG5cbiAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGtleSwgY29sbGVjdGlvbikge1xuICAgIHJlc3VsdFsrK2luZGV4XSA9IGl0ZXJhdGVlKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlTWFwO1xuIiwidmFyIGFycmF5TWFwID0gcmVxdWlyZSgnLi9fYXJyYXlNYXAnKSxcbiAgICBiYXNlSXRlcmF0ZWUgPSByZXF1aXJlKCcuL19iYXNlSXRlcmF0ZWUnKSxcbiAgICBiYXNlTWFwID0gcmVxdWlyZSgnLi9fYmFzZU1hcCcpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHZhbHVlcyBieSBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAgdGhydVxuICogYGl0ZXJhdGVlYC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6XG4gKiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gKlxuICogTWFueSBsb2Rhc2ggbWV0aG9kcyBhcmUgZ3VhcmRlZCB0byB3b3JrIGFzIGl0ZXJhdGVlcyBmb3IgbWV0aG9kcyBsaWtlXG4gKiBgXy5ldmVyeWAsIGBfLmZpbHRlcmAsIGBfLm1hcGAsIGBfLm1hcFZhbHVlc2AsIGBfLnJlamVjdGAsIGFuZCBgXy5zb21lYC5cbiAqXG4gKiBUaGUgZ3VhcmRlZCBtZXRob2RzIGFyZTpcbiAqIGBhcnlgLCBgY2h1bmtgLCBgY3VycnlgLCBgY3VycnlSaWdodGAsIGBkcm9wYCwgYGRyb3BSaWdodGAsIGBldmVyeWAsXG4gKiBgZmlsbGAsIGBpbnZlcnRgLCBgcGFyc2VJbnRgLCBgcmFuZG9tYCwgYHJhbmdlYCwgYHJhbmdlUmlnaHRgLCBgcmVwZWF0YCxcbiAqIGBzYW1wbGVTaXplYCwgYHNsaWNlYCwgYHNvbWVgLCBgc29ydEJ5YCwgYHNwbGl0YCwgYHRha2VgLCBgdGFrZVJpZ2h0YCxcbiAqIGB0ZW1wbGF0ZWAsIGB0cmltYCwgYHRyaW1FbmRgLCBgdHJpbVN0YXJ0YCwgYW5kIGB3b3Jkc2BcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIHNxdWFyZShuKSB7XG4gKiAgIHJldHVybiBuICogbjtcbiAqIH1cbiAqXG4gKiBfLm1hcChbNCwgOF0sIHNxdWFyZSk7XG4gKiAvLyA9PiBbMTYsIDY0XVxuICpcbiAqIF8ubWFwKHsgJ2EnOiA0LCAnYic6IDggfSwgc3F1YXJlKTtcbiAqIC8vID0+IFsxNiwgNjRdIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gKlxuICogdmFyIHVzZXJzID0gW1xuICogICB7ICd1c2VyJzogJ2Jhcm5leScgfSxcbiAqICAgeyAndXNlcic6ICdmcmVkJyB9XG4gKiBdO1xuICpcbiAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5tYXAodXNlcnMsICd1c2VyJyk7XG4gKiAvLyA9PiBbJ2Jhcm5leScsICdmcmVkJ11cbiAqL1xuZnVuY3Rpb24gbWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5TWFwIDogYmFzZU1hcDtcbiAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgYmFzZUl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwO1xuIiwiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ucmVkdWNlYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpbml0QWNjdW1dIFNwZWNpZnkgdXNpbmcgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGFycmF5YCBhc1xuICogIHRoZSBpbml0aWFsIHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBhcnJheVJlZHVjZShhcnJheSwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0pIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICBpZiAoaW5pdEFjY3VtICYmIGxlbmd0aCkge1xuICAgIGFjY3VtdWxhdG9yID0gYXJyYXlbKytpbmRleF07XG4gIH1cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBhY2N1bXVsYXRvciA9IGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCBhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSk7XG4gIH1cbiAgcmV0dXJuIGFjY3VtdWxhdG9yO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5UmVkdWNlO1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yZWR1Y2VgIGFuZCBgXy5yZWR1Y2VSaWdodGAsIHdpdGhvdXQgc3VwcG9ydFxuICogZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMsIHdoaWNoIGl0ZXJhdGVzIG92ZXIgYGNvbGxlY3Rpb25gIHVzaW5nIGBlYWNoRnVuY2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0geyp9IGFjY3VtdWxhdG9yIFRoZSBpbml0aWFsIHZhbHVlLlxuICogQHBhcmFtIHtib29sZWFufSBpbml0QWNjdW0gU3BlY2lmeSB1c2luZyB0aGUgZmlyc3Qgb3IgbGFzdCBlbGVtZW50IG9mXG4gKiAgYGNvbGxlY3Rpb25gIGFzIHRoZSBpbml0aWFsIHZhbHVlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZWFjaEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBgY29sbGVjdGlvbmAuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGJhc2VSZWR1Y2UoY29sbGVjdGlvbiwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0sIGVhY2hGdW5jKSB7XG4gIGVhY2hGdW5jKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgIGFjY3VtdWxhdG9yID0gaW5pdEFjY3VtXG4gICAgICA/IChpbml0QWNjdW0gPSBmYWxzZSwgdmFsdWUpXG4gICAgICA6IGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pO1xuICB9KTtcbiAgcmV0dXJuIGFjY3VtdWxhdG9yO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VSZWR1Y2U7XG4iLCJ2YXIgYXJyYXlSZWR1Y2UgPSByZXF1aXJlKCcuL19hcnJheVJlZHVjZScpLFxuICAgIGJhc2VFYWNoID0gcmVxdWlyZSgnLi9fYmFzZUVhY2gnKSxcbiAgICBiYXNlSXRlcmF0ZWUgPSByZXF1aXJlKCcuL19iYXNlSXRlcmF0ZWUnKSxcbiAgICBiYXNlUmVkdWNlID0gcmVxdWlyZSgnLi9fYmFzZVJlZHVjZScpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKTtcblxuLyoqXG4gKiBSZWR1Y2VzIGBjb2xsZWN0aW9uYCB0byBhIHZhbHVlIHdoaWNoIGlzIHRoZSBhY2N1bXVsYXRlZCByZXN1bHQgb2YgcnVubmluZ1xuICogZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYCB0aHJ1IGBpdGVyYXRlZWAsIHdoZXJlIGVhY2ggc3VjY2Vzc2l2ZVxuICogaW52b2NhdGlvbiBpcyBzdXBwbGllZCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBwcmV2aW91cy4gSWYgYGFjY3VtdWxhdG9yYFxuICogaXMgbm90IGdpdmVuLCB0aGUgZmlyc3QgZWxlbWVudCBvZiBgY29sbGVjdGlvbmAgaXMgdXNlZCBhcyB0aGUgaW5pdGlhbFxuICogdmFsdWUuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggZm91ciBhcmd1bWVudHM6XG4gKiAoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICpcbiAqIE1hbnkgbG9kYXNoIG1ldGhvZHMgYXJlIGd1YXJkZWQgdG8gd29yayBhcyBpdGVyYXRlZXMgZm9yIG1ldGhvZHMgbGlrZVxuICogYF8ucmVkdWNlYCwgYF8ucmVkdWNlUmlnaHRgLCBhbmQgYF8udHJhbnNmb3JtYC5cbiAqXG4gKiBUaGUgZ3VhcmRlZCBtZXRob2RzIGFyZTpcbiAqIGBhc3NpZ25gLCBgZGVmYXVsdHNgLCBgZGVmYXVsdHNEZWVwYCwgYGluY2x1ZGVzYCwgYG1lcmdlYCwgYG9yZGVyQnlgLFxuICogYW5kIGBzb3J0QnlgXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBpbml0aWFsIHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICogQHNlZSBfLnJlZHVjZVJpZ2h0XG4gKiBAZXhhbXBsZVxuICpcbiAqIF8ucmVkdWNlKFsxLCAyXSwgZnVuY3Rpb24oc3VtLCBuKSB7XG4gKiAgIHJldHVybiBzdW0gKyBuO1xuICogfSwgMCk7XG4gKiAvLyA9PiAzXG4gKlxuICogXy5yZWR1Y2UoeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAxIH0sIGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICogICAocmVzdWx0W3ZhbHVlXSB8fCAocmVzdWx0W3ZhbHVlXSA9IFtdKSkucHVzaChrZXkpO1xuICogICByZXR1cm4gcmVzdWx0O1xuICogfSwge30pO1xuICogLy8gPT4geyAnMSc6IFsnYScsICdjJ10sICcyJzogWydiJ10gfSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICovXG5mdW5jdGlvbiByZWR1Y2UoY29sbGVjdGlvbiwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5UmVkdWNlIDogYmFzZVJlZHVjZSxcbiAgICAgIGluaXRBY2N1bSA9IGFyZ3VtZW50cy5sZW5ndGggPCAzO1xuXG4gIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGJhc2VJdGVyYXRlZShpdGVyYXRlZSwgNCksIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0sIGJhc2VFYWNoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZWR1Y2U7XG4iLCJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3RyaW5nYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3RyaW5nLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTdHJpbmcoJ2FiYycpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTdHJpbmcoMSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8XG4gICAgKCFpc0FycmF5KHZhbHVlKSAmJiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHN0cmluZ1RhZyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNTdHJpbmc7XG4iLCJ2YXIgYmFzZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fYmFzZVByb3BlcnR5Jyk7XG5cbi8qKlxuICogR2V0cyB0aGUgc2l6ZSBvZiBhbiBBU0NJSSBgc3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS5cbiAqL1xudmFyIGFzY2lpU2l6ZSA9IGJhc2VQcm9wZXJ0eSgnbGVuZ3RoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gYXNjaWlTaXplO1xuIiwiLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNoYXJhY3RlciBjbGFzc2VzLiAqL1xudmFyIHJzQXN0cmFsUmFuZ2UgPSAnXFxcXHVkODAwLVxcXFx1ZGZmZicsXG4gICAgcnNDb21ib01hcmtzUmFuZ2UgPSAnXFxcXHUwMzAwLVxcXFx1MDM2ZicsXG4gICAgcmVDb21ib0hhbGZNYXJrc1JhbmdlID0gJ1xcXFx1ZmUyMC1cXFxcdWZlMmYnLFxuICAgIHJzQ29tYm9TeW1ib2xzUmFuZ2UgPSAnXFxcXHUyMGQwLVxcXFx1MjBmZicsXG4gICAgcnNDb21ib1JhbmdlID0gcnNDb21ib01hcmtzUmFuZ2UgKyByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgKyByc0NvbWJvU3ltYm9sc1JhbmdlLFxuICAgIHJzVmFyUmFuZ2UgPSAnXFxcXHVmZTBlXFxcXHVmZTBmJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNhcHR1cmUgZ3JvdXBzLiAqL1xudmFyIHJzWldKID0gJ1xcXFx1MjAwZCc7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBzdHJpbmdzIHdpdGggW3plcm8td2lkdGggam9pbmVycyBvciBjb2RlIHBvaW50cyBmcm9tIHRoZSBhc3RyYWwgcGxhbmVzXShodHRwOi8vZWV2LmVlL2Jsb2cvMjAxNS8wOS8xMi9kYXJrLWNvcm5lcnMtb2YtdW5pY29kZS8pLiAqL1xudmFyIHJlSGFzVW5pY29kZSA9IFJlZ0V4cCgnWycgKyByc1pXSiArIHJzQXN0cmFsUmFuZ2UgICsgcnNDb21ib1JhbmdlICsgcnNWYXJSYW5nZSArICddJyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBzdHJpbmdgIGNvbnRhaW5zIFVuaWNvZGUgc3ltYm9scy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYSBzeW1ib2wgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaGFzVW5pY29kZShzdHJpbmcpIHtcbiAgcmV0dXJuIHJlSGFzVW5pY29kZS50ZXN0KHN0cmluZyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzVW5pY29kZTtcbiIsIi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjaGFyYWN0ZXIgY2xhc3Nlcy4gKi9cbnZhciByc0FzdHJhbFJhbmdlID0gJ1xcXFx1ZDgwMC1cXFxcdWRmZmYnLFxuICAgIHJzQ29tYm9NYXJrc1JhbmdlID0gJ1xcXFx1MDMwMC1cXFxcdTAzNmYnLFxuICAgIHJlQ29tYm9IYWxmTWFya3NSYW5nZSA9ICdcXFxcdWZlMjAtXFxcXHVmZTJmJyxcbiAgICByc0NvbWJvU3ltYm9sc1JhbmdlID0gJ1xcXFx1MjBkMC1cXFxcdTIwZmYnLFxuICAgIHJzQ29tYm9SYW5nZSA9IHJzQ29tYm9NYXJrc1JhbmdlICsgcmVDb21ib0hhbGZNYXJrc1JhbmdlICsgcnNDb21ib1N5bWJvbHNSYW5nZSxcbiAgICByc1ZhclJhbmdlID0gJ1xcXFx1ZmUwZVxcXFx1ZmUwZic7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjYXB0dXJlIGdyb3Vwcy4gKi9cbnZhciByc0FzdHJhbCA9ICdbJyArIHJzQXN0cmFsUmFuZ2UgKyAnXScsXG4gICAgcnNDb21ibyA9ICdbJyArIHJzQ29tYm9SYW5nZSArICddJyxcbiAgICByc0ZpdHogPSAnXFxcXHVkODNjW1xcXFx1ZGZmYi1cXFxcdWRmZmZdJyxcbiAgICByc01vZGlmaWVyID0gJyg/OicgKyByc0NvbWJvICsgJ3wnICsgcnNGaXR6ICsgJyknLFxuICAgIHJzTm9uQXN0cmFsID0gJ1teJyArIHJzQXN0cmFsUmFuZ2UgKyAnXScsXG4gICAgcnNSZWdpb25hbCA9ICcoPzpcXFxcdWQ4M2NbXFxcXHVkZGU2LVxcXFx1ZGRmZl0pezJ9JyxcbiAgICByc1N1cnJQYWlyID0gJ1tcXFxcdWQ4MDAtXFxcXHVkYmZmXVtcXFxcdWRjMDAtXFxcXHVkZmZmXScsXG4gICAgcnNaV0ogPSAnXFxcXHUyMDBkJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIHJlZ2V4ZXMuICovXG52YXIgcmVPcHRNb2QgPSByc01vZGlmaWVyICsgJz8nLFxuICAgIHJzT3B0VmFyID0gJ1snICsgcnNWYXJSYW5nZSArICddPycsXG4gICAgcnNPcHRKb2luID0gJyg/OicgKyByc1pXSiArICcoPzonICsgW3JzTm9uQXN0cmFsLCByc1JlZ2lvbmFsLCByc1N1cnJQYWlyXS5qb2luKCd8JykgKyAnKScgKyByc09wdFZhciArIHJlT3B0TW9kICsgJykqJyxcbiAgICByc1NlcSA9IHJzT3B0VmFyICsgcmVPcHRNb2QgKyByc09wdEpvaW4sXG4gICAgcnNTeW1ib2wgPSAnKD86JyArIFtyc05vbkFzdHJhbCArIHJzQ29tYm8gKyAnPycsIHJzQ29tYm8sIHJzUmVnaW9uYWwsIHJzU3VyclBhaXIsIHJzQXN0cmFsXS5qb2luKCd8JykgKyAnKSc7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIFtzdHJpbmcgc3ltYm9sc10oaHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtdW5pY29kZSkuICovXG52YXIgcmVVbmljb2RlID0gUmVnRXhwKHJzRml0eiArICcoPz0nICsgcnNGaXR6ICsgJyl8JyArIHJzU3ltYm9sICsgcnNTZXEsICdnJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgc2l6ZSBvZiBhIFVuaWNvZGUgYHN0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyBpbnNwZWN0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3RyaW5nIHNpemUuXG4gKi9cbmZ1bmN0aW9uIHVuaWNvZGVTaXplKHN0cmluZykge1xuICB2YXIgcmVzdWx0ID0gcmVVbmljb2RlLmxhc3RJbmRleCA9IDA7XG4gIHdoaWxlIChyZVVuaWNvZGUudGVzdChzdHJpbmcpKSB7XG4gICAgKytyZXN1bHQ7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB1bmljb2RlU2l6ZTtcbiIsInZhciBhc2NpaVNpemUgPSByZXF1aXJlKCcuL19hc2NpaVNpemUnKSxcbiAgICBoYXNVbmljb2RlID0gcmVxdWlyZSgnLi9faGFzVW5pY29kZScpLFxuICAgIHVuaWNvZGVTaXplID0gcmVxdWlyZSgnLi9fdW5pY29kZVNpemUnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBudW1iZXIgb2Ygc3ltYm9scyBpbiBgc3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS5cbiAqL1xuZnVuY3Rpb24gc3RyaW5nU2l6ZShzdHJpbmcpIHtcbiAgcmV0dXJuIGhhc1VuaWNvZGUoc3RyaW5nKVxuICAgID8gdW5pY29kZVNpemUoc3RyaW5nKVxuICAgIDogYXNjaWlTaXplKHN0cmluZyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RyaW5nU2l6ZTtcbiIsInZhciBiYXNlS2V5cyA9IHJlcXVpcmUoJy4vX2Jhc2VLZXlzJyksXG4gICAgZ2V0VGFnID0gcmVxdWlyZSgnLi9fZ2V0VGFnJyksXG4gICAgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyksXG4gICAgaXNTdHJpbmcgPSByZXF1aXJlKCcuL2lzU3RyaW5nJyksXG4gICAgc3RyaW5nU2l6ZSA9IHJlcXVpcmUoJy4vX3N0cmluZ1NpemUnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nO1xuXG4vKipcbiAqIEdldHMgdGhlIHNpemUgb2YgYGNvbGxlY3Rpb25gIGJ5IHJldHVybmluZyBpdHMgbGVuZ3RoIGZvciBhcnJheS1saWtlXG4gKiB2YWx1ZXMgb3IgdGhlIG51bWJlciBvZiBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBmb3Igb2JqZWN0cy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIHNpemUuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uc2l6ZShbMSwgMiwgM10pO1xuICogLy8gPT4gM1xuICpcbiAqIF8uc2l6ZSh7ICdhJzogMSwgJ2InOiAyIH0pO1xuICogLy8gPT4gMlxuICpcbiAqIF8uc2l6ZSgncGViYmxlcycpO1xuICogLy8gPT4gN1xuICovXG5mdW5jdGlvbiBzaXplKGNvbGxlY3Rpb24pIHtcbiAgaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGlmIChpc0FycmF5TGlrZShjb2xsZWN0aW9uKSkge1xuICAgIHJldHVybiBpc1N0cmluZyhjb2xsZWN0aW9uKSA/IHN0cmluZ1NpemUoY29sbGVjdGlvbikgOiBjb2xsZWN0aW9uLmxlbmd0aDtcbiAgfVxuICB2YXIgdGFnID0gZ2V0VGFnKGNvbGxlY3Rpb24pO1xuICBpZiAodGFnID09IG1hcFRhZyB8fCB0YWcgPT0gc2V0VGFnKSB7XG4gICAgcmV0dXJuIGNvbGxlY3Rpb24uc2l6ZTtcbiAgfVxuICByZXR1cm4gYmFzZUtleXMoY29sbGVjdGlvbikubGVuZ3RoO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNpemU7XG4iLCJ2YXIgYXJyYXlFYWNoID0gcmVxdWlyZSgnLi9fYXJyYXlFYWNoJyksXG4gICAgYmFzZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX2Jhc2VDcmVhdGUnKSxcbiAgICBiYXNlRm9yT3duID0gcmVxdWlyZSgnLi9fYmFzZUZvck93bicpLFxuICAgIGJhc2VJdGVyYXRlZSA9IHJlcXVpcmUoJy4vX2Jhc2VJdGVyYXRlZScpLFxuICAgIGdldFByb3RvdHlwZSA9IHJlcXVpcmUoJy4vX2dldFByb3RvdHlwZScpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc0J1ZmZlciA9IHJlcXVpcmUoJy4vaXNCdWZmZXInKSxcbiAgICBpc0Z1bmN0aW9uID0gcmVxdWlyZSgnLi9pc0Z1bmN0aW9uJyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0JyksXG4gICAgaXNUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9pc1R5cGVkQXJyYXknKTtcblxuLyoqXG4gKiBBbiBhbHRlcm5hdGl2ZSB0byBgXy5yZWR1Y2VgOyB0aGlzIG1ldGhvZCB0cmFuc2Zvcm1zIGBvYmplY3RgIHRvIGEgbmV3XG4gKiBgYWNjdW11bGF0b3JgIG9iamVjdCB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgZWFjaCBvZiBpdHMgb3duXG4gKiBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIHRocnUgYGl0ZXJhdGVlYCwgd2l0aCBlYWNoIGludm9jYXRpb25cbiAqIHBvdGVudGlhbGx5IG11dGF0aW5nIHRoZSBgYWNjdW11bGF0b3JgIG9iamVjdC4gSWYgYGFjY3VtdWxhdG9yYCBpcyBub3RcbiAqIHByb3ZpZGVkLCBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgc2FtZSBgW1tQcm90b3R5cGVdXWAgd2lsbCBiZSB1c2VkLiBUaGVcbiAqIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBmb3VyIGFyZ3VtZW50czogKGFjY3VtdWxhdG9yLCB2YWx1ZSwga2V5LCBvYmplY3QpLlxuICogSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMS4zLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgY3VzdG9tIGFjY3VtdWxhdG9yIHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRyYW5zZm9ybShbMiwgMywgNF0sIGZ1bmN0aW9uKHJlc3VsdCwgbikge1xuICogICByZXN1bHQucHVzaChuICo9IG4pO1xuICogICByZXR1cm4gbiAlIDIgPT0gMDtcbiAqIH0sIFtdKTtcbiAqIC8vID0+IFs0LCA5XVxuICpcbiAqIF8udHJhbnNmb3JtKHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMSB9LCBmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAqICAgKHJlc3VsdFt2YWx1ZV0gfHwgKHJlc3VsdFt2YWx1ZV0gPSBbXSkpLnB1c2goa2V5KTtcbiAqIH0sIHt9KTtcbiAqIC8vID0+IHsgJzEnOiBbJ2EnLCAnYyddLCAnMic6IFsnYiddIH1cbiAqL1xuZnVuY3Rpb24gdHJhbnNmb3JtKG9iamVjdCwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gIHZhciBpc0FyciA9IGlzQXJyYXkob2JqZWN0KSxcbiAgICAgIGlzQXJyTGlrZSA9IGlzQXJyIHx8IGlzQnVmZmVyKG9iamVjdCkgfHwgaXNUeXBlZEFycmF5KG9iamVjdCk7XG5cbiAgaXRlcmF0ZWUgPSBiYXNlSXRlcmF0ZWUoaXRlcmF0ZWUsIDQpO1xuICBpZiAoYWNjdW11bGF0b3IgPT0gbnVsbCkge1xuICAgIHZhciBDdG9yID0gb2JqZWN0ICYmIG9iamVjdC5jb25zdHJ1Y3RvcjtcbiAgICBpZiAoaXNBcnJMaWtlKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGlzQXJyID8gbmV3IEN0b3IgOiBbXTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNPYmplY3Qob2JqZWN0KSkge1xuICAgICAgYWNjdW11bGF0b3IgPSBpc0Z1bmN0aW9uKEN0b3IpID8gYmFzZUNyZWF0ZShnZXRQcm90b3R5cGUob2JqZWN0KSkgOiB7fTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBhY2N1bXVsYXRvciA9IHt9O1xuICAgIH1cbiAgfVxuICAoaXNBcnJMaWtlID8gYXJyYXlFYWNoIDogYmFzZUZvck93bikob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIG9iamVjdCkge1xuICAgIHJldHVybiBpdGVyYXRlZShhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4LCBvYmplY3QpO1xuICB9KTtcbiAgcmV0dXJuIGFjY3VtdWxhdG9yO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRyYW5zZm9ybTtcbiIsInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKSxcbiAgICBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5Jyk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHNwcmVhZGFibGVTeW1ib2wgPSBTeW1ib2wgPyBTeW1ib2wuaXNDb25jYXRTcHJlYWRhYmxlIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgZmxhdHRlbmFibGUgYGFyZ3VtZW50c2Agb2JqZWN0IG9yIGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZsYXR0ZW5hYmxlLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzRmxhdHRlbmFibGUodmFsdWUpIHtcbiAgcmV0dXJuIGlzQXJyYXkodmFsdWUpIHx8IGlzQXJndW1lbnRzKHZhbHVlKSB8fFxuICAgICEhKHNwcmVhZGFibGVTeW1ib2wgJiYgdmFsdWUgJiYgdmFsdWVbc3ByZWFkYWJsZVN5bWJvbF0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRmxhdHRlbmFibGU7XG4iLCJ2YXIgYXJyYXlQdXNoID0gcmVxdWlyZSgnLi9fYXJyYXlQdXNoJyksXG4gICAgaXNGbGF0dGVuYWJsZSA9IHJlcXVpcmUoJy4vX2lzRmxhdHRlbmFibGUnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mbGF0dGVuYCB3aXRoIHN1cHBvcnQgZm9yIHJlc3RyaWN0aW5nIGZsYXR0ZW5pbmcuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLlxuICogQHBhcmFtIHtudW1iZXJ9IGRlcHRoIFRoZSBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3ByZWRpY2F0ZT1pc0ZsYXR0ZW5hYmxlXSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNTdHJpY3RdIFJlc3RyaWN0IHRvIHZhbHVlcyB0aGF0IHBhc3MgYHByZWRpY2F0ZWAgY2hlY2tzLlxuICogQHBhcmFtIHtBcnJheX0gW3Jlc3VsdD1bXV0gVGhlIGluaXRpYWwgcmVzdWx0IHZhbHVlLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBiYXNlRmxhdHRlbihhcnJheSwgZGVwdGgsIHByZWRpY2F0ZSwgaXNTdHJpY3QsIHJlc3VsdCkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICBwcmVkaWNhdGUgfHwgKHByZWRpY2F0ZSA9IGlzRmxhdHRlbmFibGUpO1xuICByZXN1bHQgfHwgKHJlc3VsdCA9IFtdKTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICBpZiAoZGVwdGggPiAwICYmIHByZWRpY2F0ZSh2YWx1ZSkpIHtcbiAgICAgIGlmIChkZXB0aCA+IDEpIHtcbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgZmxhdHRlbiBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgYmFzZUZsYXR0ZW4odmFsdWUsIGRlcHRoIC0gMSwgcHJlZGljYXRlLCBpc1N0cmljdCwgcmVzdWx0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFycmF5UHVzaChyZXN1bHQsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFpc1N0cmljdCkge1xuICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUZsYXR0ZW47XG4iLCIvKipcbiAqIEEgZmFzdGVyIGFsdGVybmF0aXZlIHRvIGBGdW5jdGlvbiNhcHBseWAsIHRoaXMgZnVuY3Rpb24gaW52b2tlcyBgZnVuY2BcbiAqIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIGB0aGlzQXJnYCBhbmQgdGhlIGFyZ3VtZW50cyBvZiBgYXJnc2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS5cbiAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYGZ1bmNgLlxuICovXG5mdW5jdGlvbiBhcHBseShmdW5jLCB0aGlzQXJnLCBhcmdzKSB7XG4gIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICBjYXNlIDA6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZyk7XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0pO1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gIH1cbiAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXBwbHk7XG4iLCJ2YXIgYXBwbHkgPSByZXF1aXJlKCcuL19hcHBseScpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTWF4ID0gTWF0aC5tYXg7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlUmVzdGAgd2hpY2ggdHJhbnNmb3JtcyB0aGUgcmVzdCBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9ZnVuYy5sZW5ndGgtMV0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZm9ybSBUaGUgcmVzdCBhcnJheSB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gb3ZlclJlc3QoZnVuYywgc3RhcnQsIHRyYW5zZm9ybSkge1xuICBzdGFydCA9IG5hdGl2ZU1heChzdGFydCA9PT0gdW5kZWZpbmVkID8gKGZ1bmMubGVuZ3RoIC0gMSkgOiBzdGFydCwgMCk7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4KGFyZ3MubGVuZ3RoIC0gc3RhcnQsIDApLFxuICAgICAgICBhcnJheSA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgYXJyYXlbaW5kZXhdID0gYXJnc1tzdGFydCArIGluZGV4XTtcbiAgICB9XG4gICAgaW5kZXggPSAtMTtcbiAgICB2YXIgb3RoZXJBcmdzID0gQXJyYXkoc3RhcnQgKyAxKTtcbiAgICB3aGlsZSAoKytpbmRleCA8IHN0YXJ0KSB7XG4gICAgICBvdGhlckFyZ3NbaW5kZXhdID0gYXJnc1tpbmRleF07XG4gICAgfVxuICAgIG90aGVyQXJnc1tzdGFydF0gPSB0cmFuc2Zvcm0oYXJyYXkpO1xuICAgIHJldHVybiBhcHBseShmdW5jLCB0aGlzLCBvdGhlckFyZ3MpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG92ZXJSZXN0O1xuIiwidmFyIGNvbnN0YW50ID0gcmVxdWlyZSgnLi9jb25zdGFudCcpLFxuICAgIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fZGVmaW5lUHJvcGVydHknKSxcbiAgICBpZGVudGl0eSA9IHJlcXVpcmUoJy4vaWRlbnRpdHknKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgc2V0VG9TdHJpbmdgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaG90IGxvb3Agc2hvcnRpbmcuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHN0cmluZyBUaGUgYHRvU3RyaW5nYCByZXN1bHQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICovXG52YXIgYmFzZVNldFRvU3RyaW5nID0gIWRlZmluZVByb3BlcnR5ID8gaWRlbnRpdHkgOiBmdW5jdGlvbihmdW5jLCBzdHJpbmcpIHtcbiAgcmV0dXJuIGRlZmluZVByb3BlcnR5KGZ1bmMsICd0b1N0cmluZycsIHtcbiAgICAnY29uZmlndXJhYmxlJzogdHJ1ZSxcbiAgICAnZW51bWVyYWJsZSc6IGZhbHNlLFxuICAgICd2YWx1ZSc6IGNvbnN0YW50KHN0cmluZyksXG4gICAgJ3dyaXRhYmxlJzogdHJ1ZVxuICB9KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVNldFRvU3RyaW5nO1xuIiwiLyoqIFVzZWQgdG8gZGV0ZWN0IGhvdCBmdW5jdGlvbnMgYnkgbnVtYmVyIG9mIGNhbGxzIHdpdGhpbiBhIHNwYW4gb2YgbWlsbGlzZWNvbmRzLiAqL1xudmFyIEhPVF9DT1VOVCA9IDgwMCxcbiAgICBIT1RfU1BBTiA9IDE2O1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTm93ID0gRGF0ZS5ub3c7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQnbGwgc2hvcnQgb3V0IGFuZCBpbnZva2UgYGlkZW50aXR5YCBpbnN0ZWFkXG4gKiBvZiBgZnVuY2Agd2hlbiBpdCdzIGNhbGxlZCBgSE9UX0NPVU5UYCBvciBtb3JlIHRpbWVzIGluIGBIT1RfU1BBTmBcbiAqIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVzdHJpY3QuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzaG9ydGFibGUgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIHNob3J0T3V0KGZ1bmMpIHtcbiAgdmFyIGNvdW50ID0gMCxcbiAgICAgIGxhc3RDYWxsZWQgPSAwO1xuXG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RhbXAgPSBuYXRpdmVOb3coKSxcbiAgICAgICAgcmVtYWluaW5nID0gSE9UX1NQQU4gLSAoc3RhbXAgLSBsYXN0Q2FsbGVkKTtcblxuICAgIGxhc3RDYWxsZWQgPSBzdGFtcDtcbiAgICBpZiAocmVtYWluaW5nID4gMCkge1xuICAgICAgaWYgKCsrY291bnQgPj0gSE9UX0NPVU5UKSB7XG4gICAgICAgIHJldHVybiBhcmd1bWVudHNbMF07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvdW50ID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmMuYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNob3J0T3V0O1xuIiwidmFyIGJhc2VTZXRUb1N0cmluZyA9IHJlcXVpcmUoJy4vX2Jhc2VTZXRUb1N0cmluZycpLFxuICAgIHNob3J0T3V0ID0gcmVxdWlyZSgnLi9fc2hvcnRPdXQnKTtcblxuLyoqXG4gKiBTZXRzIHRoZSBgdG9TdHJpbmdgIG1ldGhvZCBvZiBgZnVuY2AgdG8gcmV0dXJuIGBzdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdHJpbmcgVGhlIGB0b1N0cmluZ2AgcmVzdWx0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBmdW5jYC5cbiAqL1xudmFyIHNldFRvU3RyaW5nID0gc2hvcnRPdXQoYmFzZVNldFRvU3RyaW5nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBzZXRUb1N0cmluZztcbiIsInZhciBpZGVudGl0eSA9IHJlcXVpcmUoJy4vaWRlbnRpdHknKSxcbiAgICBvdmVyUmVzdCA9IHJlcXVpcmUoJy4vX292ZXJSZXN0JyksXG4gICAgc2V0VG9TdHJpbmcgPSByZXF1aXJlKCcuL19zZXRUb1N0cmluZycpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJlc3RgIHdoaWNoIGRvZXNuJ3QgdmFsaWRhdGUgb3IgY29lcmNlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9ZnVuYy5sZW5ndGgtMV0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlUmVzdChmdW5jLCBzdGFydCkge1xuICByZXR1cm4gc2V0VG9TdHJpbmcob3ZlclJlc3QoZnVuYywgc3RhcnQsIGlkZW50aXR5KSwgZnVuYyArICcnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlUmVzdDtcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmluZEluZGV4YCBhbmQgYF8uZmluZExhc3RJbmRleGAgd2l0aG91dFxuICogc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICovXG5mdW5jdGlvbiBiYXNlRmluZEluZGV4KGFycmF5LCBwcmVkaWNhdGUsIGZyb21JbmRleCwgZnJvbVJpZ2h0KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICBpbmRleCA9IGZyb21JbmRleCArIChmcm9tUmlnaHQgPyAxIDogLTEpO1xuXG4gIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpKSB7XG4gICAgaWYgKHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VGaW5kSW5kZXg7XG4iLCIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTmFOYCB3aXRob3V0IHN1cHBvcnQgZm9yIG51bWJlciBvYmplY3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGBOYU5gLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc05hTih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IHZhbHVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc05hTjtcbiIsIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmluZGV4T2ZgIHdoaWNoIHBlcmZvcm1zIHN0cmljdCBlcXVhbGl0eVxuICogY29tcGFyaXNvbnMgb2YgdmFsdWVzLCBpLmUuIGA9PT1gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKi9cbmZ1bmN0aW9uIHN0cmljdEluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgdmFyIGluZGV4ID0gZnJvbUluZGV4IC0gMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGlmIChhcnJheVtpbmRleF0gPT09IHZhbHVlKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdHJpY3RJbmRleE9mO1xuIiwidmFyIGJhc2VGaW5kSW5kZXggPSByZXF1aXJlKCcuL19iYXNlRmluZEluZGV4JyksXG4gICAgYmFzZUlzTmFOID0gcmVxdWlyZSgnLi9fYmFzZUlzTmFOJyksXG4gICAgc3RyaWN0SW5kZXhPZiA9IHJlcXVpcmUoJy4vX3N0cmljdEluZGV4T2YnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pbmRleE9mYCB3aXRob3V0IGBmcm9tSW5kZXhgIGJvdW5kcyBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZVxuICAgID8gc3RyaWN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleClcbiAgICA6IGJhc2VGaW5kSW5kZXgoYXJyYXksIGJhc2VJc05hTiwgZnJvbUluZGV4KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSW5kZXhPZjtcbiIsInZhciBiYXNlSW5kZXhPZiA9IHJlcXVpcmUoJy4vX2Jhc2VJbmRleE9mJyk7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmluY2x1ZGVzYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAqIHNwZWNpZnlpbmcgYW4gaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IHRhcmdldCBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdGFyZ2V0YCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBhcnJheUluY2x1ZGVzKGFycmF5LCB2YWx1ZSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gIHJldHVybiAhIWxlbmd0aCAmJiBiYXNlSW5kZXhPZihhcnJheSwgdmFsdWUsIDApID4gLTE7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlJbmNsdWRlcztcbiIsIi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBhcnJheUluY2x1ZGVzYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGEgY29tcGFyYXRvci5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gdGFyZ2V0IFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyYXRvciBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB0YXJnZXRgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5SW5jbHVkZXNXaXRoKGFycmF5LCB2YWx1ZSwgY29tcGFyYXRvcikge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaWYgKGNvbXBhcmF0b3IodmFsdWUsIGFycmF5W2luZGV4XSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlJbmNsdWRlc1dpdGg7XG4iLCIvKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgYHVuZGVmaW5lZGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjMuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBleGFtcGxlXG4gKlxuICogXy50aW1lcygyLCBfLm5vb3ApO1xuICogLy8gPT4gW3VuZGVmaW5lZCwgdW5kZWZpbmVkXVxuICovXG5mdW5jdGlvbiBub29wKCkge1xuICAvLyBObyBvcGVyYXRpb24gcGVyZm9ybWVkLlxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5vb3A7XG4iLCJ2YXIgU2V0ID0gcmVxdWlyZSgnLi9fU2V0JyksXG4gICAgbm9vcCA9IHJlcXVpcmUoJy4vbm9vcCcpLFxuICAgIHNldFRvQXJyYXkgPSByZXF1aXJlKCcuL19zZXRUb0FycmF5Jyk7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDA7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNldCBvYmplY3Qgb2YgYHZhbHVlc2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGFkZCB0byB0aGUgc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IHNldC5cbiAqL1xudmFyIGNyZWF0ZVNldCA9ICEoU2V0ICYmICgxIC8gc2V0VG9BcnJheShuZXcgU2V0KFssLTBdKSlbMV0pID09IElORklOSVRZKSA/IG5vb3AgOiBmdW5jdGlvbih2YWx1ZXMpIHtcbiAgcmV0dXJuIG5ldyBTZXQodmFsdWVzKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlU2V0O1xuIiwidmFyIFNldENhY2hlID0gcmVxdWlyZSgnLi9fU2V0Q2FjaGUnKSxcbiAgICBhcnJheUluY2x1ZGVzID0gcmVxdWlyZSgnLi9fYXJyYXlJbmNsdWRlcycpLFxuICAgIGFycmF5SW5jbHVkZXNXaXRoID0gcmVxdWlyZSgnLi9fYXJyYXlJbmNsdWRlc1dpdGgnKSxcbiAgICBjYWNoZUhhcyA9IHJlcXVpcmUoJy4vX2NhY2hlSGFzJyksXG4gICAgY3JlYXRlU2V0ID0gcmVxdWlyZSgnLi9fY3JlYXRlU2V0JyksXG4gICAgc2V0VG9BcnJheSA9IHJlcXVpcmUoJy4vX3NldFRvQXJyYXknKTtcblxuLyoqIFVzZWQgYXMgdGhlIHNpemUgdG8gZW5hYmxlIGxhcmdlIGFycmF5IG9wdGltaXphdGlvbnMuICovXG52YXIgTEFSR0VfQVJSQVlfU0laRSA9IDIwMDtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51bmlxQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYmFzZVVuaXEoYXJyYXksIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgaW5jbHVkZXMgPSBhcnJheUluY2x1ZGVzLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgaXNDb21tb24gPSB0cnVlLFxuICAgICAgcmVzdWx0ID0gW10sXG4gICAgICBzZWVuID0gcmVzdWx0O1xuXG4gIGlmIChjb21wYXJhdG9yKSB7XG4gICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICBpbmNsdWRlcyA9IGFycmF5SW5jbHVkZXNXaXRoO1xuICB9XG4gIGVsc2UgaWYgKGxlbmd0aCA+PSBMQVJHRV9BUlJBWV9TSVpFKSB7XG4gICAgdmFyIHNldCA9IGl0ZXJhdGVlID8gbnVsbCA6IGNyZWF0ZVNldChhcnJheSk7XG4gICAgaWYgKHNldCkge1xuICAgICAgcmV0dXJuIHNldFRvQXJyYXkoc2V0KTtcbiAgICB9XG4gICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICBpbmNsdWRlcyA9IGNhY2hlSGFzO1xuICAgIHNlZW4gPSBuZXcgU2V0Q2FjaGU7XG4gIH1cbiAgZWxzZSB7XG4gICAgc2VlbiA9IGl0ZXJhdGVlID8gW10gOiByZXN1bHQ7XG4gIH1cbiAgb3V0ZXI6XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID8gaXRlcmF0ZWUodmFsdWUpIDogdmFsdWU7XG5cbiAgICB2YWx1ZSA9IChjb21wYXJhdG9yIHx8IHZhbHVlICE9PSAwKSA/IHZhbHVlIDogMDtcbiAgICBpZiAoaXNDb21tb24gJiYgY29tcHV0ZWQgPT09IGNvbXB1dGVkKSB7XG4gICAgICB2YXIgc2VlbkluZGV4ID0gc2Vlbi5sZW5ndGg7XG4gICAgICB3aGlsZSAoc2VlbkluZGV4LS0pIHtcbiAgICAgICAgaWYgKHNlZW5bc2VlbkluZGV4XSA9PT0gY29tcHV0ZWQpIHtcbiAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGl0ZXJhdGVlKSB7XG4gICAgICAgIHNlZW4ucHVzaChjb21wdXRlZCk7XG4gICAgICB9XG4gICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKCFpbmNsdWRlcyhzZWVuLCBjb21wdXRlZCwgY29tcGFyYXRvcikpIHtcbiAgICAgIGlmIChzZWVuICE9PSByZXN1bHQpIHtcbiAgICAgICAgc2Vlbi5wdXNoKGNvbXB1dGVkKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVW5pcTtcbiIsInZhciBpc0FycmF5TGlrZSA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2UnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaXNBcnJheUxpa2VgIGV4Y2VwdCB0aGF0IGl0IGFsc28gY2hlY2tzIGlmIGB2YWx1ZWBcbiAqIGlzIGFuIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheS1saWtlIG9iamVjdCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBpc0FycmF5TGlrZSh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNBcnJheUxpa2VPYmplY3Q7XG4iLCJ2YXIgYmFzZUZsYXR0ZW4gPSByZXF1aXJlKCcuL19iYXNlRmxhdHRlbicpLFxuICAgIGJhc2VSZXN0ID0gcmVxdWlyZSgnLi9fYmFzZVJlc3QnKSxcbiAgICBiYXNlVW5pcSA9IHJlcXVpcmUoJy4vX2Jhc2VVbmlxJyksXG4gICAgaXNBcnJheUxpa2VPYmplY3QgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlT2JqZWN0Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB1bmlxdWUgdmFsdWVzLCBpbiBvcmRlciwgZnJvbSBhbGwgZ2l2ZW4gYXJyYXlzIHVzaW5nXG4gKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBBcnJheVxuICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgY29tYmluZWQgdmFsdWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnVuaW9uKFsyXSwgWzEsIDJdKTtcbiAqIC8vID0+IFsyLCAxXVxuICovXG52YXIgdW5pb24gPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgcmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKGFycmF5cywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpKTtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHVuaW9uO1xuIiwidmFyIGFycmF5TWFwID0gcmVxdWlyZSgnLi9fYXJyYXlNYXAnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy52YWx1ZXNgIGFuZCBgXy52YWx1ZXNJbmAgd2hpY2ggY3JlYXRlcyBhblxuICogYXJyYXkgb2YgYG9iamVjdGAgcHJvcGVydHkgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb3BlcnR5IG5hbWVzXG4gKiBvZiBgcHJvcHNgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgbmFtZXMgdG8gZ2V0IHZhbHVlcyBmb3IuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VWYWx1ZXMob2JqZWN0LCBwcm9wcykge1xuICByZXR1cm4gYXJyYXlNYXAocHJvcHMsIGZ1bmN0aW9uKGtleSkge1xuICAgIHJldHVybiBvYmplY3Rba2V5XTtcbiAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVZhbHVlcztcbiIsInZhciBiYXNlVmFsdWVzID0gcmVxdWlyZSgnLi9fYmFzZVZhbHVlcycpLFxuICAgIGtleXMgPSByZXF1aXJlKCcuL2tleXMnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydHkgdmFsdWVzIG9mIGBvYmplY3RgLlxuICpcbiAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLnZhbHVlcyhuZXcgRm9vKTtcbiAqIC8vID0+IFsxLCAyXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICpcbiAqIF8udmFsdWVzKCdoaScpO1xuICogLy8gPT4gWydoJywgJ2knXVxuICovXG5mdW5jdGlvbiB2YWx1ZXMob2JqZWN0KSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IFtdIDogYmFzZVZhbHVlcyhvYmplY3QsIGtleXMob2JqZWN0KSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdmFsdWVzO1xuIiwiLyogZ2xvYmFsIHdpbmRvdyAqL1xuXG52YXIgbG9kYXNoO1xuXG5pZiAodHlwZW9mIHJlcXVpcmUgPT09IFwiZnVuY3Rpb25cIikge1xuICB0cnkge1xuICAgIGxvZGFzaCA9IHtcbiAgICAgIGNsb25lOiByZXF1aXJlKFwibG9kYXNoL2Nsb25lXCIpLFxuICAgICAgY29uc3RhbnQ6IHJlcXVpcmUoXCJsb2Rhc2gvY29uc3RhbnRcIiksXG4gICAgICBlYWNoOiByZXF1aXJlKFwibG9kYXNoL2VhY2hcIiksXG4gICAgICBmaWx0ZXI6IHJlcXVpcmUoXCJsb2Rhc2gvZmlsdGVyXCIpLFxuICAgICAgaGFzOiAgcmVxdWlyZShcImxvZGFzaC9oYXNcIiksXG4gICAgICBpc0FycmF5OiByZXF1aXJlKFwibG9kYXNoL2lzQXJyYXlcIiksXG4gICAgICBpc0VtcHR5OiByZXF1aXJlKFwibG9kYXNoL2lzRW1wdHlcIiksXG4gICAgICBpc0Z1bmN0aW9uOiByZXF1aXJlKFwibG9kYXNoL2lzRnVuY3Rpb25cIiksXG4gICAgICBpc1VuZGVmaW5lZDogcmVxdWlyZShcImxvZGFzaC9pc1VuZGVmaW5lZFwiKSxcbiAgICAgIGtleXM6IHJlcXVpcmUoXCJsb2Rhc2gva2V5c1wiKSxcbiAgICAgIG1hcDogcmVxdWlyZShcImxvZGFzaC9tYXBcIiksXG4gICAgICByZWR1Y2U6IHJlcXVpcmUoXCJsb2Rhc2gvcmVkdWNlXCIpLFxuICAgICAgc2l6ZTogcmVxdWlyZShcImxvZGFzaC9zaXplXCIpLFxuICAgICAgdHJhbnNmb3JtOiByZXF1aXJlKFwibG9kYXNoL3RyYW5zZm9ybVwiKSxcbiAgICAgIHVuaW9uOiByZXF1aXJlKFwibG9kYXNoL3VuaW9uXCIpLFxuICAgICAgdmFsdWVzOiByZXF1aXJlKFwibG9kYXNoL3ZhbHVlc1wiKVxuICAgIH07XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBjb250aW51ZSByZWdhcmRsZXNzIG9mIGVycm9yXG4gIH1cbn1cblxuaWYgKCFsb2Rhc2gpIHtcbiAgbG9kYXNoID0gd2luZG93Ll87XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbG9kYXNoO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEdyYXBoO1xuXG52YXIgREVGQVVMVF9FREdFX05BTUUgPSBcIlxceDAwXCI7XG52YXIgR1JBUEhfTk9ERSA9IFwiXFx4MDBcIjtcbnZhciBFREdFX0tFWV9ERUxJTSA9IFwiXFx4MDFcIjtcblxuLy8gSW1wbGVtZW50YXRpb24gbm90ZXM6XG4vL1xuLy8gICogTm9kZSBpZCBxdWVyeSBmdW5jdGlvbnMgc2hvdWxkIHJldHVybiBzdHJpbmcgaWRzIGZvciB0aGUgbm9kZXNcbi8vICAqIEVkZ2UgaWQgcXVlcnkgZnVuY3Rpb25zIHNob3VsZCByZXR1cm4gYW4gXCJlZGdlT2JqXCIsIGVkZ2Ugb2JqZWN0LCB0aGF0IGlzXG4vLyAgICBjb21wb3NlZCBvZiBlbm91Z2ggaW5mb3JtYXRpb24gdG8gdW5pcXVlbHkgaWRlbnRpZnkgYW4gZWRnZToge3YsIHcsIG5hbWV9LlxuLy8gICogSW50ZXJuYWxseSB3ZSB1c2UgYW4gXCJlZGdlSWRcIiwgYSBzdHJpbmdpZmllZCBmb3JtIG9mIHRoZSBlZGdlT2JqLCB0b1xuLy8gICAgcmVmZXJlbmNlIGVkZ2VzLiBUaGlzIGlzIGJlY2F1c2Ugd2UgbmVlZCBhIHBlcmZvcm1hbnQgd2F5IHRvIGxvb2sgdGhlc2Vcbi8vICAgIGVkZ2VzIHVwIGFuZCwgb2JqZWN0IHByb3BlcnRpZXMsIHdoaWNoIGhhdmUgc3RyaW5nIGtleXMsIGFyZSB0aGUgY2xvc2VzdFxuLy8gICAgd2UncmUgZ29pbmcgdG8gZ2V0IHRvIGEgcGVyZm9ybWFudCBoYXNodGFibGUgaW4gSmF2YVNjcmlwdC5cblxuZnVuY3Rpb24gR3JhcGgob3B0cykge1xuICB0aGlzLl9pc0RpcmVjdGVkID0gXy5oYXMob3B0cywgXCJkaXJlY3RlZFwiKSA/IG9wdHMuZGlyZWN0ZWQgOiB0cnVlO1xuICB0aGlzLl9pc011bHRpZ3JhcGggPSBfLmhhcyhvcHRzLCBcIm11bHRpZ3JhcGhcIikgPyBvcHRzLm11bHRpZ3JhcGggOiBmYWxzZTtcbiAgdGhpcy5faXNDb21wb3VuZCA9IF8uaGFzKG9wdHMsIFwiY29tcG91bmRcIikgPyBvcHRzLmNvbXBvdW5kIDogZmFsc2U7XG5cbiAgLy8gTGFiZWwgZm9yIHRoZSBncmFwaCBpdHNlbGZcbiAgdGhpcy5fbGFiZWwgPSB1bmRlZmluZWQ7XG5cbiAgLy8gRGVmYXVsdHMgdG8gYmUgc2V0IHdoZW4gY3JlYXRpbmcgYSBuZXcgbm9kZVxuICB0aGlzLl9kZWZhdWx0Tm9kZUxhYmVsRm4gPSBfLmNvbnN0YW50KHVuZGVmaW5lZCk7XG5cbiAgLy8gRGVmYXVsdHMgdG8gYmUgc2V0IHdoZW4gY3JlYXRpbmcgYSBuZXcgZWRnZVxuICB0aGlzLl9kZWZhdWx0RWRnZUxhYmVsRm4gPSBfLmNvbnN0YW50KHVuZGVmaW5lZCk7XG5cbiAgLy8gdiAtPiBsYWJlbFxuICB0aGlzLl9ub2RlcyA9IHt9O1xuXG4gIGlmICh0aGlzLl9pc0NvbXBvdW5kKSB7XG4gICAgLy8gdiAtPiBwYXJlbnRcbiAgICB0aGlzLl9wYXJlbnQgPSB7fTtcblxuICAgIC8vIHYgLT4gY2hpbGRyZW5cbiAgICB0aGlzLl9jaGlsZHJlbiA9IHt9O1xuICAgIHRoaXMuX2NoaWxkcmVuW0dSQVBIX05PREVdID0ge307XG4gIH1cblxuICAvLyB2IC0+IGVkZ2VPYmpcbiAgdGhpcy5faW4gPSB7fTtcblxuICAvLyB1IC0+IHYgLT4gTnVtYmVyXG4gIHRoaXMuX3ByZWRzID0ge307XG5cbiAgLy8gdiAtPiBlZGdlT2JqXG4gIHRoaXMuX291dCA9IHt9O1xuXG4gIC8vIHYgLT4gdyAtPiBOdW1iZXJcbiAgdGhpcy5fc3VjcyA9IHt9O1xuXG4gIC8vIGUgLT4gZWRnZU9ialxuICB0aGlzLl9lZGdlT2JqcyA9IHt9O1xuXG4gIC8vIGUgLT4gbGFiZWxcbiAgdGhpcy5fZWRnZUxhYmVscyA9IHt9O1xufVxuXG4vKiBOdW1iZXIgb2Ygbm9kZXMgaW4gdGhlIGdyYXBoLiBTaG91bGQgb25seSBiZSBjaGFuZ2VkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbi4gKi9cbkdyYXBoLnByb3RvdHlwZS5fbm9kZUNvdW50ID0gMDtcblxuLyogTnVtYmVyIG9mIGVkZ2VzIGluIHRoZSBncmFwaC4gU2hvdWxkIG9ubHkgYmUgY2hhbmdlZCBieSB0aGUgaW1wbGVtZW50YXRpb24uICovXG5HcmFwaC5wcm90b3R5cGUuX2VkZ2VDb3VudCA9IDA7XG5cblxuLyogPT09IEdyYXBoIGZ1bmN0aW9ucyA9PT09PT09PT0gKi9cblxuR3JhcGgucHJvdG90eXBlLmlzRGlyZWN0ZWQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuX2lzRGlyZWN0ZWQ7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuaXNNdWx0aWdyYXBoID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLl9pc011bHRpZ3JhcGg7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuaXNDb21wb3VuZCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5faXNDb21wb3VuZDtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5zZXRHcmFwaCA9IGZ1bmN0aW9uKGxhYmVsKSB7XG4gIHRoaXMuX2xhYmVsID0gbGFiZWw7XG4gIHJldHVybiB0aGlzO1xufTtcblxuR3JhcGgucHJvdG90eXBlLmdyYXBoID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLl9sYWJlbDtcbn07XG5cblxuLyogPT09IE5vZGUgZnVuY3Rpb25zID09PT09PT09PT0gKi9cblxuR3JhcGgucHJvdG90eXBlLnNldERlZmF1bHROb2RlTGFiZWwgPSBmdW5jdGlvbihuZXdEZWZhdWx0KSB7XG4gIGlmICghXy5pc0Z1bmN0aW9uKG5ld0RlZmF1bHQpKSB7XG4gICAgbmV3RGVmYXVsdCA9IF8uY29uc3RhbnQobmV3RGVmYXVsdCk7XG4gIH1cbiAgdGhpcy5fZGVmYXVsdE5vZGVMYWJlbEZuID0gbmV3RGVmYXVsdDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUubm9kZUNvdW50ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLl9ub2RlQ291bnQ7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUubm9kZXMgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIF8ua2V5cyh0aGlzLl9ub2Rlcyk7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuc291cmNlcyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHJldHVybiBfLmZpbHRlcih0aGlzLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICByZXR1cm4gXy5pc0VtcHR5KHNlbGYuX2luW3ZdKTtcbiAgfSk7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuc2lua3MgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICByZXR1cm4gXy5maWx0ZXIodGhpcy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgcmV0dXJuIF8uaXNFbXB0eShzZWxmLl9vdXRbdl0pO1xuICB9KTtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5zZXROb2RlcyA9IGZ1bmN0aW9uKHZzLCB2YWx1ZSkge1xuICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBfLmVhY2godnMsIGZ1bmN0aW9uKHYpIHtcbiAgICBpZiAoYXJncy5sZW5ndGggPiAxKSB7XG4gICAgICBzZWxmLnNldE5vZGUodiwgdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWxmLnNldE5vZGUodik7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuc2V0Tm9kZSA9IGZ1bmN0aW9uKHYsIHZhbHVlKSB7XG4gIGlmIChfLmhhcyh0aGlzLl9ub2RlcywgdikpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRoaXMuX25vZGVzW3ZdID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdGhpcy5fbm9kZXNbdl0gPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IHZhbHVlIDogdGhpcy5fZGVmYXVsdE5vZGVMYWJlbEZuKHYpO1xuICBpZiAodGhpcy5faXNDb21wb3VuZCkge1xuICAgIHRoaXMuX3BhcmVudFt2XSA9IEdSQVBIX05PREU7XG4gICAgdGhpcy5fY2hpbGRyZW5bdl0gPSB7fTtcbiAgICB0aGlzLl9jaGlsZHJlbltHUkFQSF9OT0RFXVt2XSA9IHRydWU7XG4gIH1cbiAgdGhpcy5faW5bdl0gPSB7fTtcbiAgdGhpcy5fcHJlZHNbdl0gPSB7fTtcbiAgdGhpcy5fb3V0W3ZdID0ge307XG4gIHRoaXMuX3N1Y3Nbdl0gPSB7fTtcbiAgKyt0aGlzLl9ub2RlQ291bnQ7XG4gIHJldHVybiB0aGlzO1xufTtcblxuR3JhcGgucHJvdG90eXBlLm5vZGUgPSBmdW5jdGlvbih2KSB7XG4gIHJldHVybiB0aGlzLl9ub2Rlc1t2XTtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5oYXNOb2RlID0gZnVuY3Rpb24odikge1xuICByZXR1cm4gXy5oYXModGhpcy5fbm9kZXMsIHYpO1xufTtcblxuR3JhcGgucHJvdG90eXBlLnJlbW92ZU5vZGUgPSAgZnVuY3Rpb24odikge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIGlmIChfLmhhcyh0aGlzLl9ub2RlcywgdikpIHtcbiAgICB2YXIgcmVtb3ZlRWRnZSA9IGZ1bmN0aW9uKGUpIHsgc2VsZi5yZW1vdmVFZGdlKHNlbGYuX2VkZ2VPYmpzW2VdKTsgfTtcbiAgICBkZWxldGUgdGhpcy5fbm9kZXNbdl07XG4gICAgaWYgKHRoaXMuX2lzQ29tcG91bmQpIHtcbiAgICAgIHRoaXMuX3JlbW92ZUZyb21QYXJlbnRzQ2hpbGRMaXN0KHYpO1xuICAgICAgZGVsZXRlIHRoaXMuX3BhcmVudFt2XTtcbiAgICAgIF8uZWFjaCh0aGlzLmNoaWxkcmVuKHYpLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgICBzZWxmLnNldFBhcmVudChjaGlsZCk7XG4gICAgICB9KTtcbiAgICAgIGRlbGV0ZSB0aGlzLl9jaGlsZHJlblt2XTtcbiAgICB9XG4gICAgXy5lYWNoKF8ua2V5cyh0aGlzLl9pblt2XSksIHJlbW92ZUVkZ2UpO1xuICAgIGRlbGV0ZSB0aGlzLl9pblt2XTtcbiAgICBkZWxldGUgdGhpcy5fcHJlZHNbdl07XG4gICAgXy5lYWNoKF8ua2V5cyh0aGlzLl9vdXRbdl0pLCByZW1vdmVFZGdlKTtcbiAgICBkZWxldGUgdGhpcy5fb3V0W3ZdO1xuICAgIGRlbGV0ZSB0aGlzLl9zdWNzW3ZdO1xuICAgIC0tdGhpcy5fbm9kZUNvdW50O1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuR3JhcGgucHJvdG90eXBlLnNldFBhcmVudCA9IGZ1bmN0aW9uKHYsIHBhcmVudCkge1xuICBpZiAoIXRoaXMuX2lzQ29tcG91bmQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3Qgc2V0IHBhcmVudCBpbiBhIG5vbi1jb21wb3VuZCBncmFwaFwiKTtcbiAgfVxuXG4gIGlmIChfLmlzVW5kZWZpbmVkKHBhcmVudCkpIHtcbiAgICBwYXJlbnQgPSBHUkFQSF9OT0RFO1xuICB9IGVsc2Uge1xuICAgIC8vIENvZXJjZSBwYXJlbnQgdG8gc3RyaW5nXG4gICAgcGFyZW50ICs9IFwiXCI7XG4gICAgZm9yICh2YXIgYW5jZXN0b3IgPSBwYXJlbnQ7XG4gICAgICAhXy5pc1VuZGVmaW5lZChhbmNlc3Rvcik7XG4gICAgICBhbmNlc3RvciA9IHRoaXMucGFyZW50KGFuY2VzdG9yKSkge1xuICAgICAgaWYgKGFuY2VzdG9yID09PSB2KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlNldHRpbmcgXCIgKyBwYXJlbnQrIFwiIGFzIHBhcmVudCBvZiBcIiArIHYgK1xuICAgICAgICAgICAgICAgICAgICAgICAgXCIgd291bGQgY3JlYXRlIGEgY3ljbGVcIik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zZXROb2RlKHBhcmVudCk7XG4gIH1cblxuICB0aGlzLnNldE5vZGUodik7XG4gIHRoaXMuX3JlbW92ZUZyb21QYXJlbnRzQ2hpbGRMaXN0KHYpO1xuICB0aGlzLl9wYXJlbnRbdl0gPSBwYXJlbnQ7XG4gIHRoaXMuX2NoaWxkcmVuW3BhcmVudF1bdl0gPSB0cnVlO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5fcmVtb3ZlRnJvbVBhcmVudHNDaGlsZExpc3QgPSBmdW5jdGlvbih2KSB7XG4gIGRlbGV0ZSB0aGlzLl9jaGlsZHJlblt0aGlzLl9wYXJlbnRbdl1dW3ZdO1xufTtcblxuR3JhcGgucHJvdG90eXBlLnBhcmVudCA9IGZ1bmN0aW9uKHYpIHtcbiAgaWYgKHRoaXMuX2lzQ29tcG91bmQpIHtcbiAgICB2YXIgcGFyZW50ID0gdGhpcy5fcGFyZW50W3ZdO1xuICAgIGlmIChwYXJlbnQgIT09IEdSQVBIX05PREUpIHtcbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfVxuICB9XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuY2hpbGRyZW4gPSBmdW5jdGlvbih2KSB7XG4gIGlmIChfLmlzVW5kZWZpbmVkKHYpKSB7XG4gICAgdiA9IEdSQVBIX05PREU7XG4gIH1cblxuICBpZiAodGhpcy5faXNDb21wb3VuZCkge1xuICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuX2NoaWxkcmVuW3ZdO1xuICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgcmV0dXJuIF8ua2V5cyhjaGlsZHJlbik7XG4gICAgfVxuICB9IGVsc2UgaWYgKHYgPT09IEdSQVBIX05PREUpIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlcygpO1xuICB9IGVsc2UgaWYgKHRoaXMuaGFzTm9kZSh2KSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxufTtcblxuR3JhcGgucHJvdG90eXBlLnByZWRlY2Vzc29ycyA9IGZ1bmN0aW9uKHYpIHtcbiAgdmFyIHByZWRzViA9IHRoaXMuX3ByZWRzW3ZdO1xuICBpZiAocHJlZHNWKSB7XG4gICAgcmV0dXJuIF8ua2V5cyhwcmVkc1YpO1xuICB9XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuc3VjY2Vzc29ycyA9IGZ1bmN0aW9uKHYpIHtcbiAgdmFyIHN1Y3NWID0gdGhpcy5fc3Vjc1t2XTtcbiAgaWYgKHN1Y3NWKSB7XG4gICAgcmV0dXJuIF8ua2V5cyhzdWNzVik7XG4gIH1cbn07XG5cbkdyYXBoLnByb3RvdHlwZS5uZWlnaGJvcnMgPSBmdW5jdGlvbih2KSB7XG4gIHZhciBwcmVkcyA9IHRoaXMucHJlZGVjZXNzb3JzKHYpO1xuICBpZiAocHJlZHMpIHtcbiAgICByZXR1cm4gXy51bmlvbihwcmVkcywgdGhpcy5zdWNjZXNzb3JzKHYpKTtcbiAgfVxufTtcblxuR3JhcGgucHJvdG90eXBlLmlzTGVhZiA9IGZ1bmN0aW9uICh2KSB7XG4gIHZhciBuZWlnaGJvcnM7XG4gIGlmICh0aGlzLmlzRGlyZWN0ZWQoKSkge1xuICAgIG5laWdoYm9ycyA9IHRoaXMuc3VjY2Vzc29ycyh2KTtcbiAgfSBlbHNlIHtcbiAgICBuZWlnaGJvcnMgPSB0aGlzLm5laWdoYm9ycyh2KTtcbiAgfVxuICByZXR1cm4gbmVpZ2hib3JzLmxlbmd0aCA9PT0gMDtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5maWx0ZXJOb2RlcyA9IGZ1bmN0aW9uKGZpbHRlcikge1xuICB2YXIgY29weSA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKHtcbiAgICBkaXJlY3RlZDogdGhpcy5faXNEaXJlY3RlZCxcbiAgICBtdWx0aWdyYXBoOiB0aGlzLl9pc011bHRpZ3JhcGgsXG4gICAgY29tcG91bmQ6IHRoaXMuX2lzQ29tcG91bmRcbiAgfSk7XG5cbiAgY29weS5zZXRHcmFwaCh0aGlzLmdyYXBoKCkpO1xuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgXy5lYWNoKHRoaXMuX25vZGVzLCBmdW5jdGlvbih2YWx1ZSwgdikge1xuICAgIGlmIChmaWx0ZXIodikpIHtcbiAgICAgIGNvcHkuc2V0Tm9kZSh2LCB2YWx1ZSk7XG4gICAgfVxuICB9KTtcblxuICBfLmVhY2godGhpcy5fZWRnZU9ianMsIGZ1bmN0aW9uKGUpIHtcbiAgICBpZiAoY29weS5oYXNOb2RlKGUudikgJiYgY29weS5oYXNOb2RlKGUudykpIHtcbiAgICAgIGNvcHkuc2V0RWRnZShlLCBzZWxmLmVkZ2UoZSkpO1xuICAgIH1cbiAgfSk7XG5cbiAgdmFyIHBhcmVudHMgPSB7fTtcbiAgZnVuY3Rpb24gZmluZFBhcmVudCh2KSB7XG4gICAgdmFyIHBhcmVudCA9IHNlbGYucGFyZW50KHYpO1xuICAgIGlmIChwYXJlbnQgPT09IHVuZGVmaW5lZCB8fCBjb3B5Lmhhc05vZGUocGFyZW50KSkge1xuICAgICAgcGFyZW50c1t2XSA9IHBhcmVudDtcbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfSBlbHNlIGlmIChwYXJlbnQgaW4gcGFyZW50cykge1xuICAgICAgcmV0dXJuIHBhcmVudHNbcGFyZW50XTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZpbmRQYXJlbnQocGFyZW50KTtcbiAgICB9XG4gIH1cblxuICBpZiAodGhpcy5faXNDb21wb3VuZCkge1xuICAgIF8uZWFjaChjb3B5Lm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICAgIGNvcHkuc2V0UGFyZW50KHYsIGZpbmRQYXJlbnQodikpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGNvcHk7XG59O1xuXG4vKiA9PT0gRWRnZSBmdW5jdGlvbnMgPT09PT09PT09PSAqL1xuXG5HcmFwaC5wcm90b3R5cGUuc2V0RGVmYXVsdEVkZ2VMYWJlbCA9IGZ1bmN0aW9uKG5ld0RlZmF1bHQpIHtcbiAgaWYgKCFfLmlzRnVuY3Rpb24obmV3RGVmYXVsdCkpIHtcbiAgICBuZXdEZWZhdWx0ID0gXy5jb25zdGFudChuZXdEZWZhdWx0KTtcbiAgfVxuICB0aGlzLl9kZWZhdWx0RWRnZUxhYmVsRm4gPSBuZXdEZWZhdWx0O1xuICByZXR1cm4gdGhpcztcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5lZGdlQ291bnQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuX2VkZ2VDb3VudDtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5lZGdlcyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gXy52YWx1ZXModGhpcy5fZWRnZU9ianMpO1xufTtcblxuR3JhcGgucHJvdG90eXBlLnNldFBhdGggPSBmdW5jdGlvbih2cywgdmFsdWUpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgXy5yZWR1Y2UodnMsIGZ1bmN0aW9uKHYsIHcpIHtcbiAgICBpZiAoYXJncy5sZW5ndGggPiAxKSB7XG4gICAgICBzZWxmLnNldEVkZ2UodiwgdywgdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWxmLnNldEVkZ2Uodiwgdyk7XG4gICAgfVxuICAgIHJldHVybiB3O1xuICB9KTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKlxuICogc2V0RWRnZSh2LCB3LCBbdmFsdWUsIFtuYW1lXV0pXG4gKiBzZXRFZGdlKHsgdiwgdywgW25hbWVdIH0sIFt2YWx1ZV0pXG4gKi9cbkdyYXBoLnByb3RvdHlwZS5zZXRFZGdlID0gZnVuY3Rpb24oKSB7XG4gIHZhciB2LCB3LCBuYW1lLCB2YWx1ZTtcbiAgdmFyIHZhbHVlU3BlY2lmaWVkID0gZmFsc2U7XG4gIHZhciBhcmcwID0gYXJndW1lbnRzWzBdO1xuXG4gIGlmICh0eXBlb2YgYXJnMCA9PT0gXCJvYmplY3RcIiAmJiBhcmcwICE9PSBudWxsICYmIFwidlwiIGluIGFyZzApIHtcbiAgICB2ID0gYXJnMC52O1xuICAgIHcgPSBhcmcwLnc7XG4gICAgbmFtZSA9IGFyZzAubmFtZTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgdmFsdWUgPSBhcmd1bWVudHNbMV07XG4gICAgICB2YWx1ZVNwZWNpZmllZCA9IHRydWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHYgPSBhcmcwO1xuICAgIHcgPSBhcmd1bWVudHNbMV07XG4gICAgbmFtZSA9IGFyZ3VtZW50c1szXTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDIpIHtcbiAgICAgIHZhbHVlID0gYXJndW1lbnRzWzJdO1xuICAgICAgdmFsdWVTcGVjaWZpZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHYgPSBcIlwiICsgdjtcbiAgdyA9IFwiXCIgKyB3O1xuICBpZiAoIV8uaXNVbmRlZmluZWQobmFtZSkpIHtcbiAgICBuYW1lID0gXCJcIiArIG5hbWU7XG4gIH1cblxuICB2YXIgZSA9IGVkZ2VBcmdzVG9JZCh0aGlzLl9pc0RpcmVjdGVkLCB2LCB3LCBuYW1lKTtcbiAgaWYgKF8uaGFzKHRoaXMuX2VkZ2VMYWJlbHMsIGUpKSB7XG4gICAgaWYgKHZhbHVlU3BlY2lmaWVkKSB7XG4gICAgICB0aGlzLl9lZGdlTGFiZWxzW2VdID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKG5hbWUpICYmICF0aGlzLl9pc011bHRpZ3JhcGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3Qgc2V0IGEgbmFtZWQgZWRnZSB3aGVuIGlzTXVsdGlncmFwaCA9IGZhbHNlXCIpO1xuICB9XG5cbiAgLy8gSXQgZGlkbid0IGV4aXN0LCBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSBpdC5cbiAgLy8gRmlyc3QgZW5zdXJlIHRoZSBub2RlcyBleGlzdC5cbiAgdGhpcy5zZXROb2RlKHYpO1xuICB0aGlzLnNldE5vZGUodyk7XG5cbiAgdGhpcy5fZWRnZUxhYmVsc1tlXSA9IHZhbHVlU3BlY2lmaWVkID8gdmFsdWUgOiB0aGlzLl9kZWZhdWx0RWRnZUxhYmVsRm4odiwgdywgbmFtZSk7XG5cbiAgdmFyIGVkZ2VPYmogPSBlZGdlQXJnc1RvT2JqKHRoaXMuX2lzRGlyZWN0ZWQsIHYsIHcsIG5hbWUpO1xuICAvLyBFbnN1cmUgd2UgYWRkIHVuZGlyZWN0ZWQgZWRnZXMgaW4gYSBjb25zaXN0ZW50IHdheS5cbiAgdiA9IGVkZ2VPYmoudjtcbiAgdyA9IGVkZ2VPYmoudztcblxuICBPYmplY3QuZnJlZXplKGVkZ2VPYmopO1xuICB0aGlzLl9lZGdlT2Jqc1tlXSA9IGVkZ2VPYmo7XG4gIGluY3JlbWVudE9ySW5pdEVudHJ5KHRoaXMuX3ByZWRzW3ddLCB2KTtcbiAgaW5jcmVtZW50T3JJbml0RW50cnkodGhpcy5fc3Vjc1t2XSwgdyk7XG4gIHRoaXMuX2luW3ddW2VdID0gZWRnZU9iajtcbiAgdGhpcy5fb3V0W3ZdW2VdID0gZWRnZU9iajtcbiAgdGhpcy5fZWRnZUNvdW50Kys7XG4gIHJldHVybiB0aGlzO1xufTtcblxuR3JhcGgucHJvdG90eXBlLmVkZ2UgPSBmdW5jdGlvbih2LCB3LCBuYW1lKSB7XG4gIHZhciBlID0gKGFyZ3VtZW50cy5sZW5ndGggPT09IDFcbiAgICA/IGVkZ2VPYmpUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsIGFyZ3VtZW50c1swXSlcbiAgICA6IGVkZ2VBcmdzVG9JZCh0aGlzLl9pc0RpcmVjdGVkLCB2LCB3LCBuYW1lKSk7XG4gIHJldHVybiB0aGlzLl9lZGdlTGFiZWxzW2VdO1xufTtcblxuR3JhcGgucHJvdG90eXBlLmhhc0VkZ2UgPSBmdW5jdGlvbih2LCB3LCBuYW1lKSB7XG4gIHZhciBlID0gKGFyZ3VtZW50cy5sZW5ndGggPT09IDFcbiAgICA/IGVkZ2VPYmpUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsIGFyZ3VtZW50c1swXSlcbiAgICA6IGVkZ2VBcmdzVG9JZCh0aGlzLl9pc0RpcmVjdGVkLCB2LCB3LCBuYW1lKSk7XG4gIHJldHVybiBfLmhhcyh0aGlzLl9lZGdlTGFiZWxzLCBlKTtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5yZW1vdmVFZGdlID0gZnVuY3Rpb24odiwgdywgbmFtZSkge1xuICB2YXIgZSA9IChhcmd1bWVudHMubGVuZ3RoID09PSAxXG4gICAgPyBlZGdlT2JqVG9JZCh0aGlzLl9pc0RpcmVjdGVkLCBhcmd1bWVudHNbMF0pXG4gICAgOiBlZGdlQXJnc1RvSWQodGhpcy5faXNEaXJlY3RlZCwgdiwgdywgbmFtZSkpO1xuICB2YXIgZWRnZSA9IHRoaXMuX2VkZ2VPYmpzW2VdO1xuICBpZiAoZWRnZSkge1xuICAgIHYgPSBlZGdlLnY7XG4gICAgdyA9IGVkZ2UudztcbiAgICBkZWxldGUgdGhpcy5fZWRnZUxhYmVsc1tlXTtcbiAgICBkZWxldGUgdGhpcy5fZWRnZU9ianNbZV07XG4gICAgZGVjcmVtZW50T3JSZW1vdmVFbnRyeSh0aGlzLl9wcmVkc1t3XSwgdik7XG4gICAgZGVjcmVtZW50T3JSZW1vdmVFbnRyeSh0aGlzLl9zdWNzW3ZdLCB3KTtcbiAgICBkZWxldGUgdGhpcy5faW5bd11bZV07XG4gICAgZGVsZXRlIHRoaXMuX291dFt2XVtlXTtcbiAgICB0aGlzLl9lZGdlQ291bnQtLTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5pbkVkZ2VzID0gZnVuY3Rpb24odiwgdSkge1xuICB2YXIgaW5WID0gdGhpcy5faW5bdl07XG4gIGlmIChpblYpIHtcbiAgICB2YXIgZWRnZXMgPSBfLnZhbHVlcyhpblYpO1xuICAgIGlmICghdSkge1xuICAgICAgcmV0dXJuIGVkZ2VzO1xuICAgIH1cbiAgICByZXR1cm4gXy5maWx0ZXIoZWRnZXMsIGZ1bmN0aW9uKGVkZ2UpIHsgcmV0dXJuIGVkZ2UudiA9PT0gdTsgfSk7XG4gIH1cbn07XG5cbkdyYXBoLnByb3RvdHlwZS5vdXRFZGdlcyA9IGZ1bmN0aW9uKHYsIHcpIHtcbiAgdmFyIG91dFYgPSB0aGlzLl9vdXRbdl07XG4gIGlmIChvdXRWKSB7XG4gICAgdmFyIGVkZ2VzID0gXy52YWx1ZXMob3V0Vik7XG4gICAgaWYgKCF3KSB7XG4gICAgICByZXR1cm4gZWRnZXM7XG4gICAgfVxuICAgIHJldHVybiBfLmZpbHRlcihlZGdlcywgZnVuY3Rpb24oZWRnZSkgeyByZXR1cm4gZWRnZS53ID09PSB3OyB9KTtcbiAgfVxufTtcblxuR3JhcGgucHJvdG90eXBlLm5vZGVFZGdlcyA9IGZ1bmN0aW9uKHYsIHcpIHtcbiAgdmFyIGluRWRnZXMgPSB0aGlzLmluRWRnZXModiwgdyk7XG4gIGlmIChpbkVkZ2VzKSB7XG4gICAgcmV0dXJuIGluRWRnZXMuY29uY2F0KHRoaXMub3V0RWRnZXModiwgdykpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBpbmNyZW1lbnRPckluaXRFbnRyeShtYXAsIGspIHtcbiAgaWYgKG1hcFtrXSkge1xuICAgIG1hcFtrXSsrO1xuICB9IGVsc2Uge1xuICAgIG1hcFtrXSA9IDE7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVjcmVtZW50T3JSZW1vdmVFbnRyeShtYXAsIGspIHtcbiAgaWYgKCEtLW1hcFtrXSkgeyBkZWxldGUgbWFwW2tdOyB9XG59XG5cbmZ1bmN0aW9uIGVkZ2VBcmdzVG9JZChpc0RpcmVjdGVkLCB2Xywgd18sIG5hbWUpIHtcbiAgdmFyIHYgPSBcIlwiICsgdl87XG4gIHZhciB3ID0gXCJcIiArIHdfO1xuICBpZiAoIWlzRGlyZWN0ZWQgJiYgdiA+IHcpIHtcbiAgICB2YXIgdG1wID0gdjtcbiAgICB2ID0gdztcbiAgICB3ID0gdG1wO1xuICB9XG4gIHJldHVybiB2ICsgRURHRV9LRVlfREVMSU0gKyB3ICsgRURHRV9LRVlfREVMSU0gK1xuICAgICAgICAgICAgIChfLmlzVW5kZWZpbmVkKG5hbWUpID8gREVGQVVMVF9FREdFX05BTUUgOiBuYW1lKTtcbn1cblxuZnVuY3Rpb24gZWRnZUFyZ3NUb09iaihpc0RpcmVjdGVkLCB2Xywgd18sIG5hbWUpIHtcbiAgdmFyIHYgPSBcIlwiICsgdl87XG4gIHZhciB3ID0gXCJcIiArIHdfO1xuICBpZiAoIWlzRGlyZWN0ZWQgJiYgdiA+IHcpIHtcbiAgICB2YXIgdG1wID0gdjtcbiAgICB2ID0gdztcbiAgICB3ID0gdG1wO1xuICB9XG4gIHZhciBlZGdlT2JqID0gIHsgdjogdiwgdzogdyB9O1xuICBpZiAobmFtZSkge1xuICAgIGVkZ2VPYmoubmFtZSA9IG5hbWU7XG4gIH1cbiAgcmV0dXJuIGVkZ2VPYmo7XG59XG5cbmZ1bmN0aW9uIGVkZ2VPYmpUb0lkKGlzRGlyZWN0ZWQsIGVkZ2VPYmopIHtcbiAgcmV0dXJuIGVkZ2VBcmdzVG9JZChpc0RpcmVjdGVkLCBlZGdlT2JqLnYsIGVkZ2VPYmoudywgZWRnZU9iai5uYW1lKTtcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gJzIuMS44JztcbiIsIi8vIEluY2x1ZGVzIG9ubHkgdGhlIFwiY29yZVwiIG9mIGdyYXBobGliXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgR3JhcGg6IHJlcXVpcmUoXCIuL2dyYXBoXCIpLFxuICB2ZXJzaW9uOiByZXF1aXJlKFwiLi92ZXJzaW9uXCIpXG59O1xuIiwidmFyIF8gPSByZXF1aXJlKFwiLi9sb2Rhc2hcIik7XG52YXIgR3JhcGggPSByZXF1aXJlKFwiLi9ncmFwaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHdyaXRlOiB3cml0ZSxcbiAgcmVhZDogcmVhZFxufTtcblxuZnVuY3Rpb24gd3JpdGUoZykge1xuICB2YXIganNvbiA9IHtcbiAgICBvcHRpb25zOiB7XG4gICAgICBkaXJlY3RlZDogZy5pc0RpcmVjdGVkKCksXG4gICAgICBtdWx0aWdyYXBoOiBnLmlzTXVsdGlncmFwaCgpLFxuICAgICAgY29tcG91bmQ6IGcuaXNDb21wb3VuZCgpXG4gICAgfSxcbiAgICBub2Rlczogd3JpdGVOb2RlcyhnKSxcbiAgICBlZGdlczogd3JpdGVFZGdlcyhnKVxuICB9O1xuICBpZiAoIV8uaXNVbmRlZmluZWQoZy5ncmFwaCgpKSkge1xuICAgIGpzb24udmFsdWUgPSBfLmNsb25lKGcuZ3JhcGgoKSk7XG4gIH1cbiAgcmV0dXJuIGpzb247XG59XG5cbmZ1bmN0aW9uIHdyaXRlTm9kZXMoZykge1xuICByZXR1cm4gXy5tYXAoZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIG5vZGVWYWx1ZSA9IGcubm9kZSh2KTtcbiAgICB2YXIgcGFyZW50ID0gZy5wYXJlbnQodik7XG4gICAgdmFyIG5vZGUgPSB7IHY6IHYgfTtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQobm9kZVZhbHVlKSkge1xuICAgICAgbm9kZS52YWx1ZSA9IG5vZGVWYWx1ZTtcbiAgICB9XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmVudCkpIHtcbiAgICAgIG5vZGUucGFyZW50ID0gcGFyZW50O1xuICAgIH1cbiAgICByZXR1cm4gbm9kZTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlRWRnZXMoZykge1xuICByZXR1cm4gXy5tYXAoZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGVkZ2VWYWx1ZSA9IGcuZWRnZShlKTtcbiAgICB2YXIgZWRnZSA9IHsgdjogZS52LCB3OiBlLncgfTtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZS5uYW1lKSkge1xuICAgICAgZWRnZS5uYW1lID0gZS5uYW1lO1xuICAgIH1cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZWRnZVZhbHVlKSkge1xuICAgICAgZWRnZS52YWx1ZSA9IGVkZ2VWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGVkZ2U7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZWFkKGpzb24pIHtcbiAgdmFyIGcgPSBuZXcgR3JhcGgoanNvbi5vcHRpb25zKS5zZXRHcmFwaChqc29uLnZhbHVlKTtcbiAgXy5lYWNoKGpzb24ubm9kZXMsIGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgZy5zZXROb2RlKGVudHJ5LnYsIGVudHJ5LnZhbHVlKTtcbiAgICBpZiAoZW50cnkucGFyZW50KSB7XG4gICAgICBnLnNldFBhcmVudChlbnRyeS52LCBlbnRyeS5wYXJlbnQpO1xuICAgIH1cbiAgfSk7XG4gIF8uZWFjaChqc29uLmVkZ2VzLCBmdW5jdGlvbihlbnRyeSkge1xuICAgIGcuc2V0RWRnZSh7IHY6IGVudHJ5LnYsIHc6IGVudHJ5LncsIG5hbWU6IGVudHJ5Lm5hbWUgfSwgZW50cnkudmFsdWUpO1xuICB9KTtcbiAgcmV0dXJuIGc7XG59XG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gY29tcG9uZW50cztcblxuZnVuY3Rpb24gY29tcG9uZW50cyhnKSB7XG4gIHZhciB2aXNpdGVkID0ge307XG4gIHZhciBjbXB0cyA9IFtdO1xuICB2YXIgY21wdDtcblxuICBmdW5jdGlvbiBkZnModikge1xuICAgIGlmIChfLmhhcyh2aXNpdGVkLCB2KSkgcmV0dXJuO1xuICAgIHZpc2l0ZWRbdl0gPSB0cnVlO1xuICAgIGNtcHQucHVzaCh2KTtcbiAgICBfLmVhY2goZy5zdWNjZXNzb3JzKHYpLCBkZnMpO1xuICAgIF8uZWFjaChnLnByZWRlY2Vzc29ycyh2KSwgZGZzKTtcbiAgfVxuXG4gIF8uZWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICBjbXB0ID0gW107XG4gICAgZGZzKHYpO1xuICAgIGlmIChjbXB0Lmxlbmd0aCkge1xuICAgICAgY21wdHMucHVzaChjbXB0KTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBjbXB0cztcbn1cbiIsInZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBQcmlvcml0eVF1ZXVlO1xuXG4vKipcbiAqIEEgbWluLXByaW9yaXR5IHF1ZXVlIGRhdGEgc3RydWN0dXJlLiBUaGlzIGFsZ29yaXRobSBpcyBkZXJpdmVkIGZyb20gQ29ybWVuLFxuICogZXQgYWwuLCBcIkludHJvZHVjdGlvbiB0byBBbGdvcml0aG1zXCIuIFRoZSBiYXNpYyBpZGVhIG9mIGEgbWluLXByaW9yaXR5XG4gKiBxdWV1ZSBpcyB0aGF0IHlvdSBjYW4gZWZmaWNpZW50bHkgKGluIE8oMSkgdGltZSkgZ2V0IHRoZSBzbWFsbGVzdCBrZXkgaW5cbiAqIHRoZSBxdWV1ZS4gQWRkaW5nIGFuZCByZW1vdmluZyBlbGVtZW50cyB0YWtlcyBPKGxvZyBuKSB0aW1lLiBBIGtleSBjYW5cbiAqIGhhdmUgaXRzIHByaW9yaXR5IGRlY3JlYXNlZCBpbiBPKGxvZyBuKSB0aW1lLlxuICovXG5mdW5jdGlvbiBQcmlvcml0eVF1ZXVlKCkge1xuICB0aGlzLl9hcnIgPSBbXTtcbiAgdGhpcy5fa2V5SW5kaWNlcyA9IHt9O1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgcXVldWUuIFRha2VzIGBPKDEpYCB0aW1lLlxuICovXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLl9hcnIubGVuZ3RoO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBrZXlzIHRoYXQgYXJlIGluIHRoZSBxdWV1ZS4gVGFrZXMgYE8obilgIHRpbWUuXG4gKi9cblByaW9yaXR5UXVldWUucHJvdG90eXBlLmtleXMgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuX2Fyci5tYXAoZnVuY3Rpb24oeCkgeyByZXR1cm4geC5rZXk7IH0pO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiAqKmtleSoqIGlzIGluIHRoZSBxdWV1ZSBhbmQgYGZhbHNlYCBpZiBub3QuXG4gKi9cblByaW9yaXR5UXVldWUucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uKGtleSkge1xuICByZXR1cm4gXy5oYXModGhpcy5fa2V5SW5kaWNlcywga2V5KTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcHJpb3JpdHkgZm9yICoqa2V5KiouIElmICoqa2V5KiogaXMgbm90IHByZXNlbnQgaW4gdGhlIHF1ZXVlXG4gKiB0aGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBgdW5kZWZpbmVkYC4gVGFrZXMgYE8oMSlgIHRpbWUuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGtleVxuICovXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5wcmlvcml0eSA9IGZ1bmN0aW9uKGtleSkge1xuICB2YXIgaW5kZXggPSB0aGlzLl9rZXlJbmRpY2VzW2tleV07XG4gIGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FycltpbmRleF0ucHJpb3JpdHk7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUga2V5IGZvciB0aGUgbWluaW11bSBlbGVtZW50IGluIHRoaXMgcXVldWUuIElmIHRoZSBxdWV1ZSBpc1xuICogZW1wdHkgdGhpcyBmdW5jdGlvbiB0aHJvd3MgYW4gRXJyb3IuIFRha2VzIGBPKDEpYCB0aW1lLlxuICovXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5taW4gPSBmdW5jdGlvbigpIHtcbiAgaWYgKHRoaXMuc2l6ZSgpID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiUXVldWUgdW5kZXJmbG93XCIpO1xuICB9XG4gIHJldHVybiB0aGlzLl9hcnJbMF0ua2V5O1xufTtcblxuLyoqXG4gKiBJbnNlcnRzIGEgbmV3IGtleSBpbnRvIHRoZSBwcmlvcml0eSBxdWV1ZS4gSWYgdGhlIGtleSBhbHJlYWR5IGV4aXN0cyBpblxuICogdGhlIHF1ZXVlIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBgZmFsc2VgOyBvdGhlcndpc2UgaXQgd2lsbCByZXR1cm4gYHRydWVgLlxuICogVGFrZXMgYE8obilgIHRpbWUuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGtleSB0aGUga2V5IHRvIGFkZFxuICogQHBhcmFtIHtOdW1iZXJ9IHByaW9yaXR5IHRoZSBpbml0aWFsIHByaW9yaXR5IGZvciB0aGUga2V5XG4gKi9cblByaW9yaXR5UXVldWUucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKGtleSwgcHJpb3JpdHkpIHtcbiAgdmFyIGtleUluZGljZXMgPSB0aGlzLl9rZXlJbmRpY2VzO1xuICBrZXkgPSBTdHJpbmcoa2V5KTtcbiAgaWYgKCFfLmhhcyhrZXlJbmRpY2VzLCBrZXkpKSB7XG4gICAgdmFyIGFyciA9IHRoaXMuX2FycjtcbiAgICB2YXIgaW5kZXggPSBhcnIubGVuZ3RoO1xuICAgIGtleUluZGljZXNba2V5XSA9IGluZGV4O1xuICAgIGFyci5wdXNoKHtrZXk6IGtleSwgcHJpb3JpdHk6IHByaW9yaXR5fSk7XG4gICAgdGhpcy5fZGVjcmVhc2UoaW5kZXgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogUmVtb3ZlcyBhbmQgcmV0dXJucyB0aGUgc21hbGxlc3Qga2V5IGluIHRoZSBxdWV1ZS4gVGFrZXMgYE8obG9nIG4pYCB0aW1lLlxuICovXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5yZW1vdmVNaW4gPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fc3dhcCgwLCB0aGlzLl9hcnIubGVuZ3RoIC0gMSk7XG4gIHZhciBtaW4gPSB0aGlzLl9hcnIucG9wKCk7XG4gIGRlbGV0ZSB0aGlzLl9rZXlJbmRpY2VzW21pbi5rZXldO1xuICB0aGlzLl9oZWFwaWZ5KDApO1xuICByZXR1cm4gbWluLmtleTtcbn07XG5cbi8qKlxuICogRGVjcmVhc2VzIHRoZSBwcmlvcml0eSBmb3IgKiprZXkqKiB0byAqKnByaW9yaXR5KiouIElmIHRoZSBuZXcgcHJpb3JpdHkgaXNcbiAqIGdyZWF0ZXIgdGhhbiB0aGUgcHJldmlvdXMgcHJpb3JpdHksIHRoaXMgZnVuY3Rpb24gd2lsbCB0aHJvdyBhbiBFcnJvci5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0ga2V5IHRoZSBrZXkgZm9yIHdoaWNoIHRvIHJhaXNlIHByaW9yaXR5XG4gKiBAcGFyYW0ge051bWJlcn0gcHJpb3JpdHkgdGhlIG5ldyBwcmlvcml0eSBmb3IgdGhlIGtleVxuICovXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5kZWNyZWFzZSA9IGZ1bmN0aW9uKGtleSwgcHJpb3JpdHkpIHtcbiAgdmFyIGluZGV4ID0gdGhpcy5fa2V5SW5kaWNlc1trZXldO1xuICBpZiAocHJpb3JpdHkgPiB0aGlzLl9hcnJbaW5kZXhdLnByaW9yaXR5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTmV3IHByaW9yaXR5IGlzIGdyZWF0ZXIgdGhhbiBjdXJyZW50IHByaW9yaXR5LiBcIiArXG4gICAgICAgIFwiS2V5OiBcIiArIGtleSArIFwiIE9sZDogXCIgKyB0aGlzLl9hcnJbaW5kZXhdLnByaW9yaXR5ICsgXCIgTmV3OiBcIiArIHByaW9yaXR5KTtcbiAgfVxuICB0aGlzLl9hcnJbaW5kZXhdLnByaW9yaXR5ID0gcHJpb3JpdHk7XG4gIHRoaXMuX2RlY3JlYXNlKGluZGV4KTtcbn07XG5cblByaW9yaXR5UXVldWUucHJvdG90eXBlLl9oZWFwaWZ5ID0gZnVuY3Rpb24oaSkge1xuICB2YXIgYXJyID0gdGhpcy5fYXJyO1xuICB2YXIgbCA9IDIgKiBpO1xuICB2YXIgciA9IGwgKyAxO1xuICB2YXIgbGFyZ2VzdCA9IGk7XG4gIGlmIChsIDwgYXJyLmxlbmd0aCkge1xuICAgIGxhcmdlc3QgPSBhcnJbbF0ucHJpb3JpdHkgPCBhcnJbbGFyZ2VzdF0ucHJpb3JpdHkgPyBsIDogbGFyZ2VzdDtcbiAgICBpZiAociA8IGFyci5sZW5ndGgpIHtcbiAgICAgIGxhcmdlc3QgPSBhcnJbcl0ucHJpb3JpdHkgPCBhcnJbbGFyZ2VzdF0ucHJpb3JpdHkgPyByIDogbGFyZ2VzdDtcbiAgICB9XG4gICAgaWYgKGxhcmdlc3QgIT09IGkpIHtcbiAgICAgIHRoaXMuX3N3YXAoaSwgbGFyZ2VzdCk7XG4gICAgICB0aGlzLl9oZWFwaWZ5KGxhcmdlc3QpO1xuICAgIH1cbiAgfVxufTtcblxuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuX2RlY3JlYXNlID0gZnVuY3Rpb24oaW5kZXgpIHtcbiAgdmFyIGFyciA9IHRoaXMuX2FycjtcbiAgdmFyIHByaW9yaXR5ID0gYXJyW2luZGV4XS5wcmlvcml0eTtcbiAgdmFyIHBhcmVudDtcbiAgd2hpbGUgKGluZGV4ICE9PSAwKSB7XG4gICAgcGFyZW50ID0gaW5kZXggPj4gMTtcbiAgICBpZiAoYXJyW3BhcmVudF0ucHJpb3JpdHkgPCBwcmlvcml0eSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHRoaXMuX3N3YXAoaW5kZXgsIHBhcmVudCk7XG4gICAgaW5kZXggPSBwYXJlbnQ7XG4gIH1cbn07XG5cblByaW9yaXR5UXVldWUucHJvdG90eXBlLl9zd2FwID0gZnVuY3Rpb24oaSwgaikge1xuICB2YXIgYXJyID0gdGhpcy5fYXJyO1xuICB2YXIga2V5SW5kaWNlcyA9IHRoaXMuX2tleUluZGljZXM7XG4gIHZhciBvcmlnQXJySSA9IGFycltpXTtcbiAgdmFyIG9yaWdBcnJKID0gYXJyW2pdO1xuICBhcnJbaV0gPSBvcmlnQXJySjtcbiAgYXJyW2pdID0gb3JpZ0Fyckk7XG4gIGtleUluZGljZXNbb3JpZ0Fyckoua2V5XSA9IGk7XG4gIGtleUluZGljZXNbb3JpZ0Fyckkua2V5XSA9IGo7XG59O1xuIiwidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIFByaW9yaXR5UXVldWUgPSByZXF1aXJlKFwiLi4vZGF0YS9wcmlvcml0eS1xdWV1ZVwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBkaWprc3RyYTtcblxudmFyIERFRkFVTFRfV0VJR0hUX0ZVTkMgPSBfLmNvbnN0YW50KDEpO1xuXG5mdW5jdGlvbiBkaWprc3RyYShnLCBzb3VyY2UsIHdlaWdodEZuLCBlZGdlRm4pIHtcbiAgcmV0dXJuIHJ1bkRpamtzdHJhKGcsIFN0cmluZyhzb3VyY2UpLFxuICAgIHdlaWdodEZuIHx8IERFRkFVTFRfV0VJR0hUX0ZVTkMsXG4gICAgZWRnZUZuIHx8IGZ1bmN0aW9uKHYpIHsgcmV0dXJuIGcub3V0RWRnZXModik7IH0pO1xufVxuXG5mdW5jdGlvbiBydW5EaWprc3RyYShnLCBzb3VyY2UsIHdlaWdodEZuLCBlZGdlRm4pIHtcbiAgdmFyIHJlc3VsdHMgPSB7fTtcbiAgdmFyIHBxID0gbmV3IFByaW9yaXR5UXVldWUoKTtcbiAgdmFyIHYsIHZFbnRyeTtcblxuICB2YXIgdXBkYXRlTmVpZ2hib3JzID0gZnVuY3Rpb24oZWRnZSkge1xuICAgIHZhciB3ID0gZWRnZS52ICE9PSB2ID8gZWRnZS52IDogZWRnZS53O1xuICAgIHZhciB3RW50cnkgPSByZXN1bHRzW3ddO1xuICAgIHZhciB3ZWlnaHQgPSB3ZWlnaHRGbihlZGdlKTtcbiAgICB2YXIgZGlzdGFuY2UgPSB2RW50cnkuZGlzdGFuY2UgKyB3ZWlnaHQ7XG5cbiAgICBpZiAod2VpZ2h0IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZGlqa3N0cmEgZG9lcyBub3QgYWxsb3cgbmVnYXRpdmUgZWRnZSB3ZWlnaHRzLiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgXCJCYWQgZWRnZTogXCIgKyBlZGdlICsgXCIgV2VpZ2h0OiBcIiArIHdlaWdodCk7XG4gICAgfVxuXG4gICAgaWYgKGRpc3RhbmNlIDwgd0VudHJ5LmRpc3RhbmNlKSB7XG4gICAgICB3RW50cnkuZGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgIHdFbnRyeS5wcmVkZWNlc3NvciA9IHY7XG4gICAgICBwcS5kZWNyZWFzZSh3LCBkaXN0YW5jZSk7XG4gICAgfVxuICB9O1xuXG4gIGcubm9kZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgZGlzdGFuY2UgPSB2ID09PSBzb3VyY2UgPyAwIDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgIHJlc3VsdHNbdl0gPSB7IGRpc3RhbmNlOiBkaXN0YW5jZSB9O1xuICAgIHBxLmFkZCh2LCBkaXN0YW5jZSk7XG4gIH0pO1xuXG4gIHdoaWxlIChwcS5zaXplKCkgPiAwKSB7XG4gICAgdiA9IHBxLnJlbW92ZU1pbigpO1xuICAgIHZFbnRyeSA9IHJlc3VsdHNbdl07XG4gICAgaWYgKHZFbnRyeS5kaXN0YW5jZSA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBlZGdlRm4odikuZm9yRWFjaCh1cGRhdGVOZWlnaGJvcnMpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdHM7XG59XG4iLCJ2YXIgZGlqa3N0cmEgPSByZXF1aXJlKFwiLi9kaWprc3RyYVwiKTtcbnZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBkaWprc3RyYUFsbDtcblxuZnVuY3Rpb24gZGlqa3N0cmFBbGwoZywgd2VpZ2h0RnVuYywgZWRnZUZ1bmMpIHtcbiAgcmV0dXJuIF8udHJhbnNmb3JtKGcubm9kZXMoKSwgZnVuY3Rpb24oYWNjLCB2KSB7XG4gICAgYWNjW3ZdID0gZGlqa3N0cmEoZywgdiwgd2VpZ2h0RnVuYywgZWRnZUZ1bmMpO1xuICB9LCB7fSk7XG59XG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gdGFyamFuO1xuXG5mdW5jdGlvbiB0YXJqYW4oZykge1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgc3RhY2sgPSBbXTtcbiAgdmFyIHZpc2l0ZWQgPSB7fTsgLy8gbm9kZSBpZCAtPiB7IG9uU3RhY2ssIGxvd2xpbmssIGluZGV4IH1cbiAgdmFyIHJlc3VsdHMgPSBbXTtcblxuICBmdW5jdGlvbiBkZnModikge1xuICAgIHZhciBlbnRyeSA9IHZpc2l0ZWRbdl0gPSB7XG4gICAgICBvblN0YWNrOiB0cnVlLFxuICAgICAgbG93bGluazogaW5kZXgsXG4gICAgICBpbmRleDogaW5kZXgrK1xuICAgIH07XG4gICAgc3RhY2sucHVzaCh2KTtcblxuICAgIGcuc3VjY2Vzc29ycyh2KS5mb3JFYWNoKGZ1bmN0aW9uKHcpIHtcbiAgICAgIGlmICghXy5oYXModmlzaXRlZCwgdykpIHtcbiAgICAgICAgZGZzKHcpO1xuICAgICAgICBlbnRyeS5sb3dsaW5rID0gTWF0aC5taW4oZW50cnkubG93bGluaywgdmlzaXRlZFt3XS5sb3dsaW5rKTtcbiAgICAgIH0gZWxzZSBpZiAodmlzaXRlZFt3XS5vblN0YWNrKSB7XG4gICAgICAgIGVudHJ5Lmxvd2xpbmsgPSBNYXRoLm1pbihlbnRyeS5sb3dsaW5rLCB2aXNpdGVkW3ddLmluZGV4KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChlbnRyeS5sb3dsaW5rID09PSBlbnRyeS5pbmRleCkge1xuICAgICAgdmFyIGNtcHQgPSBbXTtcbiAgICAgIHZhciB3O1xuICAgICAgZG8ge1xuICAgICAgICB3ID0gc3RhY2sucG9wKCk7XG4gICAgICAgIHZpc2l0ZWRbd10ub25TdGFjayA9IGZhbHNlO1xuICAgICAgICBjbXB0LnB1c2godyk7XG4gICAgICB9IHdoaWxlICh2ICE9PSB3KTtcbiAgICAgIHJlc3VsdHMucHVzaChjbXB0KTtcbiAgICB9XG4gIH1cblxuICBnLm5vZGVzKCkuZm9yRWFjaChmdW5jdGlvbih2KSB7XG4gICAgaWYgKCFfLmhhcyh2aXNpdGVkLCB2KSkge1xuICAgICAgZGZzKHYpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHJlc3VsdHM7XG59XG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG52YXIgdGFyamFuID0gcmVxdWlyZShcIi4vdGFyamFuXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZpbmRDeWNsZXM7XG5cbmZ1bmN0aW9uIGZpbmRDeWNsZXMoZykge1xuICByZXR1cm4gXy5maWx0ZXIodGFyamFuKGcpLCBmdW5jdGlvbihjbXB0KSB7XG4gICAgcmV0dXJuIGNtcHQubGVuZ3RoID4gMSB8fCAoY21wdC5sZW5ndGggPT09IDEgJiYgZy5oYXNFZGdlKGNtcHRbMF0sIGNtcHRbMF0pKTtcbiAgfSk7XG59XG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gZmxveWRXYXJzaGFsbDtcblxudmFyIERFRkFVTFRfV0VJR0hUX0ZVTkMgPSBfLmNvbnN0YW50KDEpO1xuXG5mdW5jdGlvbiBmbG95ZFdhcnNoYWxsKGcsIHdlaWdodEZuLCBlZGdlRm4pIHtcbiAgcmV0dXJuIHJ1bkZsb3lkV2Fyc2hhbGwoZyxcbiAgICB3ZWlnaHRGbiB8fCBERUZBVUxUX1dFSUdIVF9GVU5DLFxuICAgIGVkZ2VGbiB8fCBmdW5jdGlvbih2KSB7IHJldHVybiBnLm91dEVkZ2VzKHYpOyB9KTtcbn1cblxuZnVuY3Rpb24gcnVuRmxveWRXYXJzaGFsbChnLCB3ZWlnaHRGbiwgZWRnZUZuKSB7XG4gIHZhciByZXN1bHRzID0ge307XG4gIHZhciBub2RlcyA9IGcubm9kZXMoKTtcblxuICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKHYpIHtcbiAgICByZXN1bHRzW3ZdID0ge307XG4gICAgcmVzdWx0c1t2XVt2XSA9IHsgZGlzdGFuY2U6IDAgfTtcbiAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKHcpIHtcbiAgICAgIGlmICh2ICE9PSB3KSB7XG4gICAgICAgIHJlc3VsdHNbdl1bd10gPSB7IGRpc3RhbmNlOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgfTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBlZGdlRm4odikuZm9yRWFjaChmdW5jdGlvbihlZGdlKSB7XG4gICAgICB2YXIgdyA9IGVkZ2UudiA9PT0gdiA/IGVkZ2UudyA6IGVkZ2UudjtcbiAgICAgIHZhciBkID0gd2VpZ2h0Rm4oZWRnZSk7XG4gICAgICByZXN1bHRzW3ZdW3ddID0geyBkaXN0YW5jZTogZCwgcHJlZGVjZXNzb3I6IHYgfTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbihrKSB7XG4gICAgdmFyIHJvd0sgPSByZXN1bHRzW2tdO1xuICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24oaSkge1xuICAgICAgdmFyIHJvd0kgPSByZXN1bHRzW2ldO1xuICAgICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbihqKSB7XG4gICAgICAgIHZhciBpayA9IHJvd0lba107XG4gICAgICAgIHZhciBraiA9IHJvd0tbal07XG4gICAgICAgIHZhciBpaiA9IHJvd0lbal07XG4gICAgICAgIHZhciBhbHREaXN0YW5jZSA9IGlrLmRpc3RhbmNlICsga2ouZGlzdGFuY2U7XG4gICAgICAgIGlmIChhbHREaXN0YW5jZSA8IGlqLmRpc3RhbmNlKSB7XG4gICAgICAgICAgaWouZGlzdGFuY2UgPSBhbHREaXN0YW5jZTtcbiAgICAgICAgICBpai5wcmVkZWNlc3NvciA9IGtqLnByZWRlY2Vzc29yO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHJlc3VsdHM7XG59XG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gdG9wc29ydDtcbnRvcHNvcnQuQ3ljbGVFeGNlcHRpb24gPSBDeWNsZUV4Y2VwdGlvbjtcblxuZnVuY3Rpb24gdG9wc29ydChnKSB7XG4gIHZhciB2aXNpdGVkID0ge307XG4gIHZhciBzdGFjayA9IHt9O1xuICB2YXIgcmVzdWx0cyA9IFtdO1xuXG4gIGZ1bmN0aW9uIHZpc2l0KG5vZGUpIHtcbiAgICBpZiAoXy5oYXMoc3RhY2ssIG5vZGUpKSB7XG4gICAgICB0aHJvdyBuZXcgQ3ljbGVFeGNlcHRpb24oKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaGFzKHZpc2l0ZWQsIG5vZGUpKSB7XG4gICAgICBzdGFja1tub2RlXSA9IHRydWU7XG4gICAgICB2aXNpdGVkW25vZGVdID0gdHJ1ZTtcbiAgICAgIF8uZWFjaChnLnByZWRlY2Vzc29ycyhub2RlKSwgdmlzaXQpO1xuICAgICAgZGVsZXRlIHN0YWNrW25vZGVdO1xuICAgICAgcmVzdWx0cy5wdXNoKG5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIF8uZWFjaChnLnNpbmtzKCksIHZpc2l0KTtcblxuICBpZiAoXy5zaXplKHZpc2l0ZWQpICE9PSBnLm5vZGVDb3VudCgpKSB7XG4gICAgdGhyb3cgbmV3IEN5Y2xlRXhjZXB0aW9uKCk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0cztcbn1cblxuZnVuY3Rpb24gQ3ljbGVFeGNlcHRpb24oKSB7fVxuQ3ljbGVFeGNlcHRpb24ucHJvdG90eXBlID0gbmV3IEVycm9yKCk7IC8vIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgRXJyb3IgdG8gcGFzcyB0ZXN0aW5nIiwidmFyIHRvcHNvcnQgPSByZXF1aXJlKFwiLi90b3Bzb3J0XCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQWN5Y2xpYztcblxuZnVuY3Rpb24gaXNBY3ljbGljKGcpIHtcbiAgdHJ5IHtcbiAgICB0b3Bzb3J0KGcpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKGUgaW5zdGFuY2VvZiB0b3Bzb3J0LkN5Y2xlRXhjZXB0aW9uKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRocm93IGU7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gZGZzO1xuXG4vKlxuICogQSBoZWxwZXIgdGhhdCBwcmVmb3JtcyBhIHByZS0gb3IgcG9zdC1vcmRlciB0cmF2ZXJzYWwgb24gdGhlIGlucHV0IGdyYXBoXG4gKiBhbmQgcmV0dXJucyB0aGUgbm9kZXMgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSB2aXNpdGVkLiBJZiB0aGUgZ3JhcGggaXNcbiAqIHVuZGlyZWN0ZWQgdGhlbiB0aGlzIGFsZ29yaXRobSB3aWxsIG5hdmlnYXRlIHVzaW5nIG5laWdoYm9ycy4gSWYgdGhlIGdyYXBoXG4gKiBpcyBkaXJlY3RlZCB0aGVuIHRoaXMgYWxnb3JpdGhtIHdpbGwgbmF2aWdhdGUgdXNpbmcgc3VjY2Vzc29ycy5cbiAqXG4gKiBPcmRlciBtdXN0IGJlIG9uZSBvZiBcInByZVwiIG9yIFwicG9zdFwiLlxuICovXG5mdW5jdGlvbiBkZnMoZywgdnMsIG9yZGVyKSB7XG4gIGlmICghXy5pc0FycmF5KHZzKSkge1xuICAgIHZzID0gW3ZzXTtcbiAgfVxuXG4gIHZhciBuYXZpZ2F0aW9uID0gKGcuaXNEaXJlY3RlZCgpID8gZy5zdWNjZXNzb3JzIDogZy5uZWlnaGJvcnMpLmJpbmQoZyk7XG5cbiAgdmFyIGFjYyA9IFtdO1xuICB2YXIgdmlzaXRlZCA9IHt9O1xuICBfLmVhY2godnMsIGZ1bmN0aW9uKHYpIHtcbiAgICBpZiAoIWcuaGFzTm9kZSh2KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR3JhcGggZG9lcyBub3QgaGF2ZSBub2RlOiBcIiArIHYpO1xuICAgIH1cblxuICAgIGRvRGZzKGcsIHYsIG9yZGVyID09PSBcInBvc3RcIiwgdmlzaXRlZCwgbmF2aWdhdGlvbiwgYWNjKTtcbiAgfSk7XG4gIHJldHVybiBhY2M7XG59XG5cbmZ1bmN0aW9uIGRvRGZzKGcsIHYsIHBvc3RvcmRlciwgdmlzaXRlZCwgbmF2aWdhdGlvbiwgYWNjKSB7XG4gIGlmICghXy5oYXModmlzaXRlZCwgdikpIHtcbiAgICB2aXNpdGVkW3ZdID0gdHJ1ZTtcblxuICAgIGlmICghcG9zdG9yZGVyKSB7IGFjYy5wdXNoKHYpOyB9XG4gICAgXy5lYWNoKG5hdmlnYXRpb24odiksIGZ1bmN0aW9uKHcpIHtcbiAgICAgIGRvRGZzKGcsIHcsIHBvc3RvcmRlciwgdmlzaXRlZCwgbmF2aWdhdGlvbiwgYWNjKTtcbiAgICB9KTtcbiAgICBpZiAocG9zdG9yZGVyKSB7IGFjYy5wdXNoKHYpOyB9XG4gIH1cbn1cbiIsInZhciBkZnMgPSByZXF1aXJlKFwiLi9kZnNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gcG9zdG9yZGVyO1xuXG5mdW5jdGlvbiBwb3N0b3JkZXIoZywgdnMpIHtcbiAgcmV0dXJuIGRmcyhnLCB2cywgXCJwb3N0XCIpO1xufVxuIiwidmFyIGRmcyA9IHJlcXVpcmUoXCIuL2Rmc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwcmVvcmRlcjtcblxuZnVuY3Rpb24gcHJlb3JkZXIoZywgdnMpIHtcbiAgcmV0dXJuIGRmcyhnLCB2cywgXCJwcmVcIik7XG59XG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG52YXIgR3JhcGggPSByZXF1aXJlKFwiLi4vZ3JhcGhcIik7XG52YXIgUHJpb3JpdHlRdWV1ZSA9IHJlcXVpcmUoXCIuLi9kYXRhL3ByaW9yaXR5LXF1ZXVlXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHByaW07XG5cbmZ1bmN0aW9uIHByaW0oZywgd2VpZ2h0RnVuYykge1xuICB2YXIgcmVzdWx0ID0gbmV3IEdyYXBoKCk7XG4gIHZhciBwYXJlbnRzID0ge307XG4gIHZhciBwcSA9IG5ldyBQcmlvcml0eVF1ZXVlKCk7XG4gIHZhciB2O1xuXG4gIGZ1bmN0aW9uIHVwZGF0ZU5laWdoYm9ycyhlZGdlKSB7XG4gICAgdmFyIHcgPSBlZGdlLnYgPT09IHYgPyBlZGdlLncgOiBlZGdlLnY7XG4gICAgdmFyIHByaSA9IHBxLnByaW9yaXR5KHcpO1xuICAgIGlmIChwcmkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIGVkZ2VXZWlnaHQgPSB3ZWlnaHRGdW5jKGVkZ2UpO1xuICAgICAgaWYgKGVkZ2VXZWlnaHQgPCBwcmkpIHtcbiAgICAgICAgcGFyZW50c1t3XSA9IHY7XG4gICAgICAgIHBxLmRlY3JlYXNlKHcsIGVkZ2VXZWlnaHQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChnLm5vZGVDb3VudCgpID09PSAwKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIF8uZWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICBwcS5hZGQodiwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtcbiAgICByZXN1bHQuc2V0Tm9kZSh2KTtcbiAgfSk7XG5cbiAgLy8gU3RhcnQgZnJvbSBhbiBhcmJpdHJhcnkgbm9kZVxuICBwcS5kZWNyZWFzZShnLm5vZGVzKClbMF0sIDApO1xuXG4gIHZhciBpbml0ID0gZmFsc2U7XG4gIHdoaWxlIChwcS5zaXplKCkgPiAwKSB7XG4gICAgdiA9IHBxLnJlbW92ZU1pbigpO1xuICAgIGlmIChfLmhhcyhwYXJlbnRzLCB2KSkge1xuICAgICAgcmVzdWx0LnNldEVkZ2UodiwgcGFyZW50c1t2XSk7XG4gICAgfSBlbHNlIGlmIChpbml0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnB1dCBncmFwaCBpcyBub3QgY29ubmVjdGVkOiBcIiArIGcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbml0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBnLm5vZGVFZGdlcyh2KS5mb3JFYWNoKHVwZGF0ZU5laWdoYm9ycyk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gIGNvbXBvbmVudHM6IHJlcXVpcmUoXCIuL2NvbXBvbmVudHNcIiksXG4gIGRpamtzdHJhOiByZXF1aXJlKFwiLi9kaWprc3RyYVwiKSxcbiAgZGlqa3N0cmFBbGw6IHJlcXVpcmUoXCIuL2RpamtzdHJhLWFsbFwiKSxcbiAgZmluZEN5Y2xlczogcmVxdWlyZShcIi4vZmluZC1jeWNsZXNcIiksXG4gIGZsb3lkV2Fyc2hhbGw6IHJlcXVpcmUoXCIuL2Zsb3lkLXdhcnNoYWxsXCIpLFxuICBpc0FjeWNsaWM6IHJlcXVpcmUoXCIuL2lzLWFjeWNsaWNcIiksXG4gIHBvc3RvcmRlcjogcmVxdWlyZShcIi4vcG9zdG9yZGVyXCIpLFxuICBwcmVvcmRlcjogcmVxdWlyZShcIi4vcHJlb3JkZXJcIiksXG4gIHByaW06IHJlcXVpcmUoXCIuL3ByaW1cIiksXG4gIHRhcmphbjogcmVxdWlyZShcIi4vdGFyamFuXCIpLFxuICB0b3Bzb3J0OiByZXF1aXJlKFwiLi90b3Bzb3J0XCIpXG59O1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQsIENocmlzIFBldHRpdHRcbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbiAqXG4gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiAqIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICpcbiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAqIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cbiAqIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICpcbiAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXIgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4gKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dFxuICogc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiIEFORFxuICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcbiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEVcbiAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMXG4gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUlxuICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVJcbiAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksXG4gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRVxuICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuXG52YXIgbGliID0gcmVxdWlyZShcIi4vbGliXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgR3JhcGg6IGxpYi5HcmFwaCxcbiAganNvbjogcmVxdWlyZShcIi4vbGliL2pzb25cIiksXG4gIGFsZzogcmVxdWlyZShcIi4vbGliL2FsZ1wiKSxcbiAgdmVyc2lvbjogbGliLnZlcnNpb25cbn07XG4iLCJpbXBvcnQge1xyXG5cdGFkZEljb24sXHJcblx0QXBwLFxyXG5cdERyb3Bkb3duQ29tcG9uZW50LFxyXG5cdE1vZGFsLFxyXG5cdE5vdGljZSxcclxuXHRQbHVnaW4sXHJcblx0UGx1Z2luU2V0dGluZ1RhYixcclxuXHRTZWFyY2hDb21wb25lbnQsXHJcblx0U2V0dGluZywgVGV4dENvbXBvbmVudFxyXG59IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IHsgR3JhcGggfSBmcm9tICdncmFwaGxpYic7XHJcbmltcG9ydCAqIGFzIGdyYXBobGliIGZyb20gXCJncmFwaGxpYlwiO1xyXG5pbXBvcnQge2tNYXhMZW5ndGh9IGZyb20gXCJidWZmZXJcIjtcclxuXHJcbmFkZEljb24oJ2pvdXJuZXknLCAnPHN2ZyB3aWR0aD1cIjEwMFwiIGhlaWdodD1cIjEwMFwiIHZpZXdCb3g9XCIwIDAgMTAwIDEwMFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxcbicgK1xyXG5cdCc8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwKVwiPlxcbicgK1xyXG5cdCc8cGF0aCBkPVwiTTUwIDkyLjc1QzQ0LjAwMDQgODcuNjMyNiAzOC40Mzk0IDgyLjAyMjMgMzMuMzc1IDc1Ljk3NzhDMjUuNzc1IDY2LjkwMDUgMTYuNzUgNTMuMzgyIDE2Ljc1IDQwLjVDMTYuNzQzMyAyNy4wNDU5IDI0Ljg0NTIgMTQuOTEzNyAzNy4yNzUxIDkuNzY0NjlDNDkuNzA1IDQuNjE1NzMgNjQuMDEyOCA3LjQ2NDk1IDczLjUyMiAxNi45ODI4Qzc5Ljc3NTIgMjMuMjA4MiA4My4yNzgxIDMxLjY3NjQgODMuMjUwMiA0MC41QzgzLjI1MDIgNTMuMzgyIDc0LjIyNSA2Ni45MDA1IDY2LjYyNSA3NS45Nzc4QzYxLjU2MDYgODIuMDIyMyA1NS45OTk2IDg3LjYzMjYgNTAgOTIuNzVaTTUwIDE2Ljc1MDFDMzYuODg5OCAxNi43NjU4IDI2LjI2NTcgMjcuMzg5OCAyNi4yNSA0MC41QzI2LjI1IDQ2LjAzODUgMjguNzUzMyA1NS42Mjg4IDQwLjY2NjMgNjkuODgzNUM0My42MDI0IDczLjM4OTMgNDYuNzE3OCA3Ni43NDA5IDUwIDc5LjkyNUM1My4yODI1IDc2Ljc0NDcgNTYuMzk5NCA3My4zOTc5IDU5LjMzODUgNjkuODk3OEM3MS4yNDY4IDU1LjYyNCA3My43NSA0Ni4wMzM4IDczLjc1IDQwLjVDNzMuNzM0MyAyNy4zODk4IDYzLjExMDMgMTYuNzY1OCA1MCAxNi43NTAxWk01MCA1NC43NUM0Mi4xMyA1NC43NSAzNS43NSA0OC4zNzAxIDM1Ljc1IDQwLjVDMzUuNzUgMzIuNjMgNDIuMTMgMjYuMjUwMSA1MCAyNi4yNTAxQzU3Ljg3MDEgMjYuMjUwMSA2NC4yNSAzMi42MyA2NC4yNSA0MC41QzY0LjI1IDQ0LjI3OTQgNjIuNzQ4NyA0Ny45MDM5IDYwLjA3NjMgNTAuNTc2M0M1Ny40MDM5IDUzLjI0ODcgNTMuNzc5NCA1NC43NSA1MCA1NC43NVpcIiBmaWxsPVwiIzc3Nzc3N1wiLz5cXG4nICtcclxuXHQnPC9nPlxcbicgK1xyXG5cdCc8ZGVmcz5cXG4nICtcclxuXHQnPGNsaXBQYXRoIGlkPVwiY2xpcDBcIj5cXG4nICtcclxuXHQnPHJlY3Qgd2lkdGg9XCIxMDBcIiBoZWlnaHQ9XCIxMDBcIiBmaWxsPVwid2hpdGVcIi8+XFxuJyArXHJcblx0JzwvY2xpcFBhdGg+XFxuJyArXHJcblx0JzwvZGVmcz5cXG4nICtcclxuXHQnPC9zdmc+Jyk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBKb3VybmV5UGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcclxuXHRwcml2YXRlIHNlYXJjaE1vZGFsOiBTZWFyY2hNb2RhbDtcclxuXHRwcml2YXRlIHJlc3VsdHNNb2RhbDogUmVzdWx0c01vZGFsO1xyXG5cdHB1YmxpYyBzZXR0aW5nczogSm91cm5leVBsdWdpblNldHRpbmdzO1xyXG5cclxuXHRhc3luYyBvbmxvYWQoKSB7XHJcblx0XHR0aGlzLmxvYWRTZXR0aW5ncygpO1xyXG5cdFx0dGhpcy5hZGRTZXR0aW5nVGFiKG5ldyBKb3VybmV5UGx1Z2luU2V0dGluZ3NUYWIodGhpcy5hcHAsIHRoaXMpKTtcclxuXHJcblx0XHR0aGlzLmFkZFJpYmJvbkljb24oJ2pvdXJuZXknLCAnRmluZCBKb3VybmV5JywgKCkgPT4ge1xyXG5cdFx0XHR0aGlzLnN0YXJ0U2VhcmNoKCk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBhc3luYyBmaW5kU2hvcnRlc3RQYXRoKHN0YXJ0OiBzdHJpbmcsIGVuZDogc3RyaW5nKSB7XHJcblxyXG5cdFx0Y29uc3Qgc3RhcnRCYXNlbmFtZSA9IHN0YXJ0O1xyXG5cdFx0Y29uc3QgZW5kQmFzZW5hbWUgPSBlbmQ7XHJcblxyXG5cdFx0Ly8gY29uc29sZS5sb2coXCJTZWFyY2hpbmcgZm9yIGpvdXJuZXkgYmV0d2VlbiBcIiArIHN0YXJ0QmFzZW5hbWUgKyBcIiBhbmQgXCIgKyBlbmRCYXNlbmFtZSk7XHJcblxyXG5cdFx0bGV0IHJlc29sdmVkTGlua3MgPSB0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLnJlc29sdmVkTGlua3M7XHJcblxyXG5cdFx0Ly8gY29uZmlndXJlIGRpcmVjdGVkIHRydWUvZmFsc2VcclxuXHRcdHZhciBnID0gbmV3IEdyYXBoKHsgfSk7XHJcblxyXG5cdFx0Zm9yIChsZXQga2V5IGluIHJlc29sdmVkTGlua3MpIHtcclxuXHRcdFx0bGV0IGZpbGVQYXRoID0ga2V5O1xyXG5cdFx0XHRsZXQgbm9kZUJhc2VuYW1lID0gZmlsZVBhdGggLy8gZmlsZVBhdGgucmVwbGFjZShcIi5tZFwiLCBcIlwiKTtcclxuXHJcblx0XHRcdC8vIHNraXBwaW5nL2V4Y2x1ZGluZyBub2RlIGNyZWF0aW9uIGJhc2VkIG9uIGZvbGRlcnNcclxuXHRcdFx0aWYodGhpcy5zZXR0aW5ncy5za2lwRm9sZGVyc0xpc3QoKS5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0dmFyIGNsZWFuID0gdHJ1ZTtcclxuXHRcdFx0XHRmb3IodmFyIGkgPSAwOyBpIDw9IHRoaXMuc2V0dGluZ3Muc2tpcEZvbGRlcnNMaXN0KCkubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRcdGlmKG5vZGVCYXNlbmFtZS5jb250YWlucyh0aGlzLnNldHRpbmdzLnNraXBGb2xkZXJzTGlzdCgpW2ldKSkge1xyXG5cdFx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZyhcIlNraXBwaW5nIGFkZGluZyBcIiArIG5vZGVCYXNlbmFtZSArIFwiIGFzIG5vZGVcIik7XHJcblx0XHRcdFx0XHRcdGNsZWFuID0gZmFsc2U7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBza2lwIHRoaXMgbG9vcFxyXG5cdFx0XHRcdGlmKCFjbGVhbikge1xyXG5cdFx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRnLnNldE5vZGUobm9kZUJhc2VuYW1lKTtcclxuXHRcdFx0Ly8gY29uc29sZS5sb2coXCJDcmVhdGluZyBub2RlIFwiICsgbm9kZUJhc2VuYW1lKTtcclxuXHJcblx0XHRcdGxldCB2YWx1ZU1hcCA9IHJlc29sdmVkTGlua3Nba2V5XTtcclxuXHJcblx0XHRcdGxldCBvdXRib3VuZExpbmtDb3VudGVyID0gMDtcclxuXHRcdFx0aWYodGhpcy5zZXR0aW5ncy5za2lwTU9Dcykge1xyXG5cdFx0XHRcdGZvcihsZXQgbGlua0tleSBpbiB2YWx1ZU1hcCkge1xyXG5cdFx0XHRcdFx0b3V0Ym91bmRMaW5rQ291bnRlcisrO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYoIXRoaXMuc2V0dGluZ3Muc2tpcE1PQ3MgfHwgIShvdXRib3VuZExpbmtDb3VudGVyID4gdGhpcy5zZXR0aW5ncy5NT0NNYXhMaW5rcykpIHtcclxuXHRcdFx0XHQvLyBsb29rIGF0IGVhY2ggbGlua1xyXG5cdFx0XHRcdGZvcihsZXQgbGlua0tleSBpbiB2YWx1ZU1hcCkge1xyXG5cdFx0XHRcdFx0bGV0IHRhcmdldCA9IGxpbmtLZXk7XHJcblx0XHRcdFx0XHRsZXQgdGFyZ2V0Q2xlYW4gPSB0YXJnZXRcclxuXHJcblx0XHRcdFx0XHQvLyBleGNsdWRlL3NraXAgZm9sZGVycyBmb3J3YXJkL2JhY2t3YXJkIGxpbmtcclxuXHRcdFx0XHRcdGlmKHRoaXMuc2V0dGluZ3Muc2tpcEZvbGRlcnNMaXN0KCkubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdFx0XHR2YXIgY2xlYW4gPSB0cnVlO1xyXG5cdFx0XHRcdFx0XHRmb3IodmFyIGkgPSAwOyBpIDw9IHRoaXMuc2V0dGluZ3Muc2tpcEZvbGRlcnNMaXN0KCkubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRcdFx0XHRpZih0YXJnZXRDbGVhbi5jb250YWlucyh0aGlzLnNldHRpbmdzLnNraXBGb2xkZXJzTGlzdCgpW2ldKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0Y2xlYW4gPSBmYWxzZTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGlmKCFjbGVhbikge1xyXG5cdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYodGhpcy5zZXR0aW5ncy51c2VGb3J3YXJkTGlua3MpIHtcclxuXHRcdFx0XHRcdFx0Ly8gY29uc29sZS5sb2coXCIgICAgIEFkZGluZyBGT1JXQVJETElOSyBlZGdlIFwiICsgbm9kZUJhc2VuYW1lICsgXCIgLT4gXCIgKyB0YXJnZXQpO1xyXG5cdFx0XHRcdFx0XHRnLnNldEVkZ2Uobm9kZUJhc2VuYW1lLCB0YXJnZXRDbGVhbik7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Ly8gYWxsb3cgYmFja2xpbmtzXHJcblx0XHRcdFx0XHRpZih0aGlzLnNldHRpbmdzLnVzZUJhY2tMaW5rcykge1xyXG5cdFx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZyhcIiAgICAgQWRkaW5nIEJBQ0tMSU5LIGVkZ2UgXCIgKyB0YXJnZXQgKyBcIiAtPiBcIiArIG5vZGVCYXNlbmFtZSk7XHJcblx0XHRcdFx0XHRcdGcuc2V0RWRnZSh0YXJnZXRDbGVhbiwgbm9kZUJhc2VuYW1lKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0Ly8gY29uc29sZS5sb2coXCJTa2lwcGluZyBlZGdlIGNyZWF0aW9uIGZvciBcIiArIG5vZGVCYXNlbmFtZSArIFwiIHdpdGggdG9vIG1hbnkgKFwiICsgb3V0Ym91bmRMaW5rQ291bnRlciArIFwiL1wiICsgdGhpcy5zZXR0aW5ncy5NT0NNYXhMaW5rcyArIFwiKSBsaW5rc1wiKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYodGhpcy5zZXR0aW5ncy51c2VUYWdzKSB7XHJcblx0XHRcdFx0Y29uc3QgdGV4dCA9IGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIucmVhZChmaWxlUGF0aCk7XHJcblx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxyXG5cdFx0XHRcdGNvbnN0IHJlc3VsdCA9IHRleHQubWF0Y2hBbGwoL1xcI1tcXHd8w6TDhMO2w5bDvMOcw59cXC9cXC1cXF9dKy9nbWkpO1xyXG5cdFx0XHRcdGNvbnN0IHRzID0gQXJyYXkuZnJvbShyZXN1bHQpO1xyXG5cclxuXHRcdFx0XHRmb3IodmFyIGkgPSAwOyBpIDwgdHMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRcdGxldCB0YWcgPSBTdHJpbmcodHNbaV0pO1xyXG5cdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxyXG5cdFx0XHRcdFx0dGFnID0gdGFnLnRyaW0oKTtcclxuXHJcblx0XHRcdFx0XHRpZighZy5oYXNOb2RlKHRhZykpIHtcclxuXHRcdFx0XHRcdFx0Ly8gY29uc29sZS5sb2coXCJBZGRpbmcgVGFnIG5vZGVcIiArIHRhZylcclxuXHRcdFx0XHRcdFx0Zy5zZXROb2RlKHRhZyk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRpZighZy5oYXNFZGdlKG5vZGVCYXNlbmFtZSwgdGFnKSkge1xyXG5cdFx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZyhcIkFkZGluZyBlZGdlIFwiICsgbm9kZUJhc2VuYW1lICsgXCIgLT4gXCIgKyB0YWcpO1xyXG5cdFx0XHRcdFx0XHRnLnNldEVkZ2Uobm9kZUJhc2VuYW1lLCB0YWcpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYoIWcuaGFzRWRnZSh0YWcsIG5vZGVCYXNlbmFtZSkpIHtcclxuXHRcdFx0XHRcdFx0Ly8gY29uc29sZS5sb2coXCJBZGRpbmcgZWRnZSBcIiArIHRhZyArIFwiIC0+IFwiICsgbm9kZUJhc2VuYW1lKTtcclxuXHRcdFx0XHRcdFx0Zy5zZXRFZGdlKHRhZywgbm9kZUJhc2VuYW1lKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBzZWFyY2hSZXN1bHQgPSBncmFwaGxpYi5hbGcuZGlqa3N0cmEoZywgc3RhcnRCYXNlbmFtZSk7XHJcblxyXG5cdFx0bGV0IGZpbmFsTGlzdCA9IG5ldyBBcnJheSgpO1xyXG5cclxuXHRcdC8vIGNvbnNvbGUubG9nKHNlYXJjaFJlc3VsdCk7XHJcblxyXG5cdFx0aWYoc2VhcmNoUmVzdWx0W2VuZEJhc2VuYW1lXSAhPT0gdW5kZWZpbmVkICYmIHNlYXJjaFJlc3VsdFtlbmRCYXNlbmFtZV0uZGlzdGFuY2UgIT09IEluZmluaXR5KSB7XHJcblx0XHRcdGxldCBzdGVwID0gc2VhcmNoUmVzdWx0W2VuZEJhc2VuYW1lXTtcclxuXHRcdFx0ZmluYWxMaXN0LnB1c2goZW5kQmFzZW5hbWUpO1xyXG5cclxuXHRcdFx0d2hpbGUoc3RlcC5kaXN0YW5jZSAhPSAwKSB7XHJcblx0XHRcdFx0ZmluYWxMaXN0LnB1c2goc3RlcC5wcmVkZWNlc3Nvcik7XHJcblx0XHRcdFx0c3RlcCA9IFx0c2VhcmNoUmVzdWx0W3N0ZXAucHJlZGVjZXNzb3JdO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHR0aGlzLnNlYXJjaE1vZGFsLmNsb3NlKCk7XHJcblx0XHR0aGlzLnNlYXJjaE1vZGFsID0gbmV3IFNlYXJjaE1vZGFsKHRoaXMuYXBwLCB0aGlzKTtcclxuXHRcdHRoaXMucmVzdWx0c01vZGFsID0gbmV3IFJlc3VsdHNNb2RhbCh0aGlzLmFwcCwgdGhpcyk7XHJcblx0XHR0aGlzLnJlc3VsdHNNb2RhbC5yZXN1bHRzID0gZmluYWxMaXN0O1xyXG5cdFx0dGhpcy5yZXN1bHRzTW9kYWwuc3RhcnRCYXNlbmFtZSA9IHN0YXJ0QmFzZW5hbWU7XHJcblx0XHR0aGlzLnJlc3VsdHNNb2RhbC5lbmRCYXNlbmFtZSA9IGVuZEJhc2VuYW1lO1xyXG5cdFx0dGhpcy5yZXN1bHRzTW9kYWwub3BlbigpO1xyXG5cdH1cclxuXHJcblx0cHVibGljIHN0YXJ0U2VhcmNoKCkge1xyXG5cdFx0dGhpcy5zZWFyY2hNb2RhbCA9IG5ldyBTZWFyY2hNb2RhbCh0aGlzLmFwcCwgdGhpcyk7XHJcblx0XHR0aGlzLnNlYXJjaE1vZGFsLm9wZW4oKTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgbG9hZFNldHRpbmdzKCkge1xyXG5cdFx0dGhpcy5zZXR0aW5ncyA9IG5ldyBKb3VybmV5UGx1Z2luU2V0dGluZ3MoKTtcclxuXHRcdChhc3luYyAoKSA9PiB7XHJcblx0XHRcdGNvbnN0IGxvYWRlZFNldHRpbmdzID0gYXdhaXQgdGhpcy5sb2FkRGF0YSgpO1xyXG5cdFx0XHRpZiAobG9hZGVkU2V0dGluZ3MpIHtcclxuXHRcdFx0XHR0aGlzLnNldHRpbmdzLnVzZUZvcndhcmRMaW5rcyA9IGxvYWRlZFNldHRpbmdzLnVzZUZvcndhcmRMaW5rcztcclxuXHRcdFx0XHR0aGlzLnNldHRpbmdzLnVzZUJhY2tMaW5rcyA9IGxvYWRlZFNldHRpbmdzLnVzZUJhY2tMaW5rcztcclxuXHRcdFx0XHR0aGlzLnNldHRpbmdzLnVzZVRhZ3MgPSBsb2FkZWRTZXR0aW5ncy51c2VUYWdzO1xyXG5cdFx0XHRcdHRoaXMuc2V0dGluZ3Muc2tpcE1PQ3MgPSBsb2FkZWRTZXR0aW5ncy5za2lwTU9DcztcclxuXHRcdFx0XHR0aGlzLnNldHRpbmdzLk1PQ01heExpbmtzID0gbG9hZGVkU2V0dGluZ3MuTU9DTWF4TGlua3M7XHJcblx0XHRcdFx0dGhpcy5zZXR0aW5ncy5lbmFibGVIaWdoQ29udHJhc3QgPSBsb2FkZWRTZXR0aW5ncy5lbmFibGVIaWdoQ29udHJhc3Q7XHJcblx0XHRcdFx0dGhpcy5zZXR0aW5ncy5za2lwRm9sZGVycyA9IGxvYWRlZFNldHRpbmdzLnNraXBGb2xkZXJzO1xyXG5cdFx0XHRcdHRoaXMuc2V0dGluZ3MuZW5hYmxlTGlua3MgPSBsb2FkZWRTZXR0aW5ncy5lbmFibGVMaW5rcztcclxuXHRcdFx0XHR0aGlzLnNldHRpbmdzLmVuYWJsZVRyYW5zY2x1c2lvbiA9IGxvYWRlZFNldHRpbmdzLmVuYWJsZVRyYW5zY2x1c2lvbjtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0aGlzLnNhdmVEYXRhKHRoaXMuc2V0dGluZ3MpO1xyXG5cdFx0XHR9XHJcblx0XHR9KSgpO1xyXG5cdH1cclxufVxyXG5cclxuY2xhc3MgU2VhcmNoTW9kYWwgZXh0ZW5kcyBNb2RhbCB7XHJcblx0cHJpdmF0ZSBwbHVnaW46IEpvdXJuZXlQbHVnaW47XHJcblx0cHJpdmF0ZSBmaWxlUGF0aExpc3Q6IHN0cmluZ1tdO1xyXG5cdHByaXZhdGUgc2VhcmNoU3RhcnQ6IFRleHRDb21wb25lbnQ7XHJcblx0cHJpdmF0ZSBzZWFyY2hFbmQ6IFRleHRDb21wb25lbnQ7XHJcblx0cHJpdmF0ZSBmb3JtRGl2OiBIVE1MRGl2RWxlbWVudDtcclxuXHJcblx0Y29uc3RydWN0b3IoYXBwOiBBcHAsIHBsdWdpbjogSm91cm5leVBsdWdpbikge1xyXG5cdFx0c3VwZXIoYXBwKTtcclxuXHRcdHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG5cdH1cclxuXHJcblx0b25PcGVuKCkge1xyXG5cdFx0bGV0IHtjb250ZW50RWx9ID0gdGhpcztcclxuXHRcdGNvbnRlbnRFbC5jcmVhdGVFbChcImgyXCIsIHt0ZXh0OiBcIkZpbmQgdGhlIFN0b3J5IEJldHdlZW4gVHdvIE5vdGVzXCJ9KTtcclxuXHRcdHRoaXMuZm9ybURpdiA9IGNvbnRlbnRFbC5jcmVhdGVEaXYoe2NsczogJ2pvdXJuZXktc2VhcmNoLWZvcm0nfSlcclxuXHRcdFxyXG5cdFx0dGhpcy5zZXR1cEZpbGVMaXN0KCk7XHJcblx0XHR0aGlzLmFkZFN0YXJ0U2VhcmNoQ29tcG9uZW50KCk7XHJcblx0XHR0aGlzLmFkZEVuZFNlYXJjaENvbXBvbmVudCgpO1xyXG5cdFx0dGhpcy5hZGRTZWFyY2hCdXR0b24oY29udGVudEVsKTtcclxuXHRcdHRoaXMuYWRkTHVja3lCdXR0b24oKTtcclxuXHRcdHRoaXMuYWRkU2VhcmNoU2V0dGluZ3NEaXNwbGF5KCk7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGZpbmRSYW5kb21Ob3RlQmFzZW5hbWUoKSB7XHJcblx0XHQvLyBjb25zb2xlLmxvZyh0aGlzLmZpbGVQYXRoTGlzdCk7XHJcblx0XHRjb25zdCByYW5kID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogdGhpcy5maWxlUGF0aExpc3QubGVuZ3RoKSArIDFcclxuXHRcdHJldHVybiB0aGlzLmZpbGVQYXRoTGlzdFtyYW5kXTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgc2V0dXBGaWxlTGlzdCgpIHtcclxuXHRcdGxldCByZXNvbHZlZExpbmtzID0gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5yZXNvbHZlZExpbmtzO1xyXG5cdFx0dGhpcy5maWxlUGF0aExpc3QgPSBbXTtcclxuXHRcdC8vIGNvbnNvbGUubG9nKHRoaXMucGx1Z2luLnNldHRpbmdzLnNraXBGb2xkZXJzTGlzdCgpKTtcclxuXHJcblx0XHRmb3IgKGxldCBrZXkgaW4gcmVzb2x2ZWRMaW5rcykge1xyXG5cdFx0XHRsZXQgZmlsZVBhdGggPSBrZXk7XHJcblxyXG5cdFx0XHQvLyBleGNsdWRlIGZvbGRlcnMgaWYgc2V0XHJcblx0XHRcdGlmKHRoaXMucGx1Z2luLnNldHRpbmdzLnNraXBGb2xkZXJzTGlzdCgpLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHR2YXIgY2xlYW4gPSB0cnVlO1xyXG5cdFx0XHRcdGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLnBsdWdpbi5zZXR0aW5ncy5za2lwRm9sZGVyc0xpc3QoKS5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0aWYoZmlsZVBhdGguY29udGFpbnModGhpcy5wbHVnaW4uc2V0dGluZ3Muc2tpcEZvbGRlcnNMaXN0KClbaV0pKSB7XHJcblx0XHRcdFx0XHRcdGNsZWFuID0gZmFsc2U7XHJcblx0XHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKFwiU2tpcHBpbmcgYWRkaW5nIFwiICsgZmlsZVBhdGggKyBcIiBhcyBzZWFyY2ggb3B0aW9uIGJlY2F1c2UgXCIgKyB0aGlzLnBsdWdpbi5zZXR0aW5ncy5za2lwRm9sZGVyc0xpc3QoKVtpXSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBpZiBpdCdzIHN0aWxsIGNsZWFuLi4uXHJcblx0XHRcdFx0aWYoY2xlYW4pIHtcclxuXHRcdFx0XHRcdHRoaXMuZmlsZVBhdGhMaXN0LnB1c2goZmlsZVBhdGgpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0aGlzLmZpbGVQYXRoTGlzdC5wdXNoKGZpbGVQYXRoKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBhZGRTZWFyY2hTZXR0aW5nc0Rpc3BsYXkoKSB7XHJcblx0XHQvLyBhZGQgc2hvd2luZyB3aGljaCBzZXR0aW5ncyBhcmUgb25cclxuXHRcdHRoaXMuZm9ybURpdi5jcmVhdGVFbChcImJyXCIpO1xyXG5cdFx0bGV0IHZpYTogc3RyaW5nID0gXCJTZXR0aW5nczogXCI7XHJcblx0XHRpZiAodGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlRm9yd2FyZExpbmtzKSB7XHJcblx0XHRcdHZpYSArPSBcIuKclCBGb3J3YXJkbGlua3MgXCI7XHJcblx0XHR9XHJcblx0XHRpZiAodGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlQmFja0xpbmtzKSB7XHJcblx0XHRcdHZpYSArPSBcIuKclCBCYWNrbGlua3MgXCI7XHJcblx0XHR9XHJcblx0XHRpZiAodGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlVGFncykge1xyXG5cdFx0XHR2aWEgKz0gXCLinJQgVGFnc1wiO1xyXG5cdFx0fVxyXG5cclxuXHRcdGxldCBhdm9pZCA9IFwiXCI7XHJcblx0XHRpZiAodGhpcy5wbHVnaW4uc2V0dGluZ3Muc2tpcE1PQ3MpIHtcclxuXHRcdFx0YXZvaWQgPSBcIuKclCBBdm9pZCBub3RlcyB3aXRoIFwiICsgdGhpcy5wbHVnaW4uc2V0dGluZ3MuTU9DTWF4TGlua3MgKyBcIiBvciBtb3JlIGxpbmtzIFwiXHJcblx0XHR9XHJcblxyXG5cdFx0bGV0IHZpc3VhbCA9IFwiXCI7XHJcblx0XHRpZiAodGhpcy5wbHVnaW4uc2V0dGluZ3MuZW5hYmxlSGlnaENvbnRyYXN0KSB7XHJcblx0XHRcdHZpc3VhbCA9IFwi4pyUIEhpZ2gtQ29udHJhc3QgXCI7XHJcblx0XHR9XHJcblxyXG5cdFx0bGV0IGV4Y2x1ZGVTa2lwID0gXCJcIlxyXG5cdFx0aWYgKHRoaXMucGx1Z2luLnNldHRpbmdzLnNraXBGb2xkZXJzTGlzdCgpLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0ZXhjbHVkZVNraXAgPSBcIuKclCBTa2lwcGluZyBcIiArIHRoaXMucGx1Z2luLnNldHRpbmdzLnNraXBGb2xkZXJzICsgXCIgXCI7XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5mb3JtRGl2LmNyZWF0ZUVsKFwicFwiLCB7dGV4dDogdmlhICsgXCIgXCIgKyBhdm9pZCArIFwiIFwiICsgdmlzdWFsICsgXCIgXCIgKyBleGNsdWRlU2tpcCwgY2xzOiAnZGlzY292ZXJ5LXNldHRpbmdzJ30pO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBhZGRMdWNreUJ1dHRvbigpIHtcclxuXHRcdGxldCBsdWNreSA9IHRoaXMuZm9ybURpdi5jcmVhdGVFbCgncCcsIHtjbHM6ICdqb3VybmV5LXNlYXJjaC1sdWNreScsIHRleHQ6ICdJIGZlZWwgbHVja3knfSk7XHJcblx0XHR2YXIgbHVja3lGdW5jdGlvbiA9IChmdW5jdGlvbiAoKSB7XHJcblx0XHRcdHRoaXMuc2VhcmNoU3RhcnQuc2V0VmFsdWUodGhpcy5maW5kUmFuZG9tTm90ZUJhc2VuYW1lKCkpO1xyXG5cdFx0XHR0aGlzLnNlYXJjaEVuZC5zZXRWYWx1ZSh0aGlzLmZpbmRSYW5kb21Ob3RlQmFzZW5hbWUoKSk7XHJcblx0XHR9KS5iaW5kKHRoaXMpO1xyXG5cclxuXHRcdGx1Y2t5Lm9uY2xpY2sgPSBsdWNreUZ1bmN0aW9uO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBhZGRTZWFyY2hCdXR0b24oY29udGVudEVsOiBIVE1MRWxlbWVudCkge1xyXG5cdFx0bGV0IGJ1dHRvbiA9IHRoaXMuZm9ybURpdi5jcmVhdGVFbCgnaW5wdXQnLCB7XHJcblx0XHRcdHR5cGU6ICdzdWJtaXQnLFxyXG5cdFx0XHRjbHM6ICdqb3VybmV5LWlucHV0LWJ1dHRvbicsXHJcblx0XHRcdHZhbHVlOiAnRmluZCBKb3VybmV5J1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0dmFyIHNlYXJjaEZ1bmN0aW9uID0gKGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0Y29udGVudEVsLnJlcGxhY2VXaXRoKGNvbnRlbnRFbC5jcmVhdGVFbChcImgyXCIsIHt0ZXh0OiBcIlNlYXJjaGluZy4uLlwifSkpO1xyXG5cdFx0XHR0aGlzLnBsdWdpbi5maW5kU2hvcnRlc3RQYXRoKHRoaXMuc2VhcmNoU3RhcnQuZ2V0VmFsdWUoKSwgdGhpcy5zZWFyY2hFbmQuZ2V0VmFsdWUoKSk7XHJcblx0XHR9KS5iaW5kKHRoaXMpO1xyXG5cclxuXHRcdGJ1dHRvbi5vbmNsaWNrID0gc2VhcmNoRnVuY3Rpb247XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGFkZEVuZFNlYXJjaENvbXBvbmVudCgpIHtcclxuXHRcdHRoaXMuc2VhcmNoRW5kID0gbmV3IFRleHRDb21wb25lbnQodGhpcy5mb3JtRGl2KTtcclxuXHRcdHRoaXMuc2VhcmNoRW5kLnNldFBsYWNlaG9sZGVyKFwiWW91ciBFbmRpbmcgTm90ZSBUaXRsZVwiKVxyXG5cdFx0bGV0IGF1dG9jb21wbGV0ZVJlc3VsdEVuZCA9IHRoaXMuZm9ybURpdi5jcmVhdGVEaXYoe2NsczogJ2pvdXJuZXktc2VhcmNoLWF1dG9jb21wbGV0ZS1yZXN1bHRzLWNvbnRhaW5lciBoaWRlLW1lJ30pO1xyXG5cdFx0dGhpcy5zZWFyY2hFbmQub25DaGFuZ2UodmFsdWUgPT4ge1xyXG5cdFx0XHR0aGlzLmF1dG9jb21wbGV0ZSh2YWx1ZSwgYXV0b2NvbXBsZXRlUmVzdWx0RW5kLCB0aGlzLnNlYXJjaEVuZCk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgYWRkU3RhcnRTZWFyY2hDb21wb25lbnQoKSB7XHJcblx0XHR0aGlzLnNlYXJjaFN0YXJ0ID0gbmV3IFRleHRDb21wb25lbnQodGhpcy5mb3JtRGl2KTtcclxuXHRcdHRoaXMuc2VhcmNoU3RhcnQuc2V0UGxhY2Vob2xkZXIoXCJZb3VyIFN0YXJ0aW5nIE5vdGUgVGl0bGVcIilcclxuXHRcdGxldCBhdXRvY29tcGxldGVSZXN1bHRTdGFydCA9IHRoaXMuZm9ybURpdi5jcmVhdGVEaXYoe2NsczogJ2pvdXJuZXktc2VhcmNoLWF1dG9jb21wbGV0ZS1yZXN1bHRzLWNvbnRhaW5lciBoaWRlLW1lJ30pO1xyXG5cdFx0dGhpcy5zZWFyY2hTdGFydC5vbkNoYW5nZSh2YWx1ZSA9PiB7XHJcblx0XHRcdHRoaXMuYXV0b2NvbXBsZXRlKHZhbHVlLCBhdXRvY29tcGxldGVSZXN1bHRTdGFydCwgdGhpcy5zZWFyY2hTdGFydCk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgYXV0b2NvbXBsZXRlKHZhbHVlOiBzdHJpbmcsIGF1dG9jb21wbGV0ZVJlc3VsdDogSFRNTERpdkVsZW1lbnQsIHRhcmdldEVsZW1lbnQ6IFRleHRDb21wb25lbnQpIHtcclxuXHJcblx0XHRhdXRvY29tcGxldGVSZXN1bHQuaW5uZXJIVE1MID0gXCJcIjtcclxuXHJcblx0XHRsZXQgYXV0b2NvbXBsZXRlUmVzdWx0Q29udGVudCA9IGNyZWF0ZURpdih7Y2xzOiAnam91cm5leS1zZWFyY2gtYXV0b2NvbXBsZXRlLXJlc3VsdHMtY29udGVudCd9KTtcclxuXHRcdGF1dG9jb21wbGV0ZVJlc3VsdC5hcHBlbmRDaGlsZChhdXRvY29tcGxldGVSZXN1bHRDb250ZW50KTtcclxuXHJcblx0XHQvLyBjb25zb2xlLmxvZyhcIlNlYXJjaGluZyBmb3I6XCIgKyB2YWx1ZSk7XHJcblx0XHRpZighKHZhbHVlLmxlbmd0aCA+IDMpKSB7XHJcblx0XHRcdGF1dG9jb21wbGV0ZVJlc3VsdC5hZGRDbGFzcyhcImhpZGUtbWVcIik7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBjb25zb2xlLmxvZyhcIkhlcmUgYXJlIHRoZSBmaWxlcyBmb3IgYXV0by1jb21wbGV0ZTpcIik7XHJcblx0XHQvLyBjb25zb2xlLmxvZyh0aGlzLmZpbGVQYXRoTGlzdCk7XHJcblxyXG5cdFx0bGV0IHNlYXJjaFJlc3VsdHMgPSBbXTtcclxuXHJcblx0XHRmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5maWxlUGF0aExpc3QubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0aWYodGhpcy5maWxlUGF0aExpc3RbaV0udG9VcHBlckNhc2UoKS5pbmNsdWRlcyh2YWx1ZS50b1VwcGVyQ2FzZSgpKSkge1xyXG5cdFx0XHRcdC8vIGNvbnNvbGUubG9nKFwiRm91bmQ6IFwiICsgdGhpcy5tYXJrZG93bkZpbGVzW2ldLmJhc2VuYW1lKTtcclxuXHRcdFx0XHRzZWFyY2hSZXN1bHRzLnB1c2godGhpcy5maWxlUGF0aExpc3RbaV0pO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0dmFyIGxpbWl0ID0gc2VhcmNoUmVzdWx0cy5sZW5ndGg7XHJcblx0XHRpZihsaW1pdCA+IDUpIHtsaW1pdCA9IDV9O1xyXG5cdFx0YXV0b2NvbXBsZXRlUmVzdWx0Q29udGVudC5pbm5lckhUTUwgPSBcIlwiO1xyXG5cclxuXHRcdGZvcih2YXIgaSA9IDA7IGkgPCBsaW1pdDsgaSsrKSB7XHJcblx0XHRcdGxldCBsaSA9IGNyZWF0ZURpdih7dGV4dDogc2VhcmNoUmVzdWx0c1tpXSwgY2xzOiAnam91cm5leS1zZWFyY2gtYXV0b2NvbXBsZXRlLXJlc3VsdHMtY29udGVudC1pdGVtJ30pO1xyXG5cclxuXHRcdFx0bGkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdGxldCB0ZXh0ID0gbGkuZ2V0VGV4dCgpO1xyXG5cdFx0XHRcdHRhcmdldEVsZW1lbnQuc2V0VmFsdWUodGV4dCk7XHJcblx0XHRcdFx0YXV0b2NvbXBsZXRlUmVzdWx0LnJlbW92ZUNsYXNzKFwic2hvdy1tZVwiKTtcclxuXHRcdFx0XHRhdXRvY29tcGxldGVSZXN1bHQuYWRkQ2xhc3MoXCJoaWRlLW1lXCIpO1xyXG5cdFx0XHR9LmJpbmQodGhpcykpO1xyXG5cclxuXHRcdFx0YXV0b2NvbXBsZXRlUmVzdWx0Q29udGVudC5hcHBlbmRDaGlsZChsaSk7XHJcblx0XHR9XHJcblxyXG5cdFx0YXV0b2NvbXBsZXRlUmVzdWx0LnJlbW92ZUNsYXNzKFwiaGlkZS1tZVwiKTtcclxuXHRcdGF1dG9jb21wbGV0ZVJlc3VsdC5hZGRDbGFzcyhcInNob3ctbWVcIik7XHJcblx0fVxyXG5cclxuXHRvbkNsb3NlKCkge1xyXG5cdFx0bGV0IHtjb250ZW50RWx9ID0gdGhpcztcclxuXHRcdGNvbnRlbnRFbC5lbXB0eSgpO1xyXG5cdH1cclxufVxyXG5cclxuY2xhc3MgUmVzdWx0c01vZGFsIGV4dGVuZHMgTW9kYWwge1xyXG5cdHByaXZhdGUgcGx1Z2luO1xyXG5cdC8vIEB0cy1pZ25vcmVcclxuXHRwdWJsaWMgcmVzdWx0cztcclxuXHRwdWJsaWMgc3RhcnRCYXNlbmFtZTogc3RyaW5nO1xyXG5cdHB1YmxpYyBlbmRCYXNlbmFtZTogc3RyaW5nO1xyXG5cclxuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBKb3VybmV5UGx1Z2luKSB7XHJcblx0XHRzdXBlcihhcHApO1xyXG5cdFx0dGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcblx0fVxyXG5cclxuXHRvbk9wZW4oKSB7XHJcblx0XHQvLyBjb25zb2xlLmxvZyh0aGlzLnJlc3VsdHMpO1xyXG5cdFx0bGV0IHtjb250ZW50RWx9ID0gdGhpcztcclxuXHJcblx0XHRsZXQgYW5vdGhlclNlYXJjaCA9IGNvbnRlbnRFbC5jcmVhdGVFbChcInBcIiwge3RleHQ6IFwiU3RhcnQgYW5vdGhlciBzZWFyY2hcIiwgY2xzOiAnam91cm5leS1yZXN1bHQtbGlzdC1yZXNldC1saW5rJ30pO1xyXG5cclxuXHRcdHZhciBib3VuZEZ1bmN0aW9uQW5vdGhlclNlYXJjaCA9IChmdW5jdGlvbigpIHtcclxuXHRcdFx0dGhpcy5jbG9zZSgpO1xyXG5cdFx0XHR0aGlzLnBsdWdpbi5zdGFydFNlYXJjaCgpO1xyXG5cdFx0fSkuYmluZCh0aGlzKTtcclxuXHJcblx0XHRhbm90aGVyU2VhcmNoLm9uY2xpY2sgPSBib3VuZEZ1bmN0aW9uQW5vdGhlclNlYXJjaDtcclxuXHJcblx0XHRpZih0aGlzLnJlc3VsdHMubGVuZ3RoIDw9IDApIHtcclxuXHRcdFx0bGV0IG5vU2VhcmNoUmVzdWx0ID0gY3JlYXRlRGl2KCk7XHJcblx0XHRcdG5vU2VhcmNoUmVzdWx0LmFwcGVuZENoaWxkKGNyZWF0ZUVsKFwiaDJcIiwge3RleHQ6IFwiTm8gSm91cm5leSBGb3VuZCBiZXR3ZWVuIFwiICsgdGhpcy5zdGFydEJhc2VuYW1lICsgXCIgYW5kIFwiICsgdGhpcy5lbmRCYXNlbmFtZX0pKTtcclxuXHRcdFx0bm9TZWFyY2hSZXN1bHQuYXBwZW5kQ2hpbGQoY3JlYXRlRWwoXCJwXCIsIHt0ZXh0OiBcIkhlcmUgYXJlIHNvbWUgcG9zc2libGUgcmVhc29ucyB3aHk6XCIgfSkpO1xyXG5cdFx0XHRsZXQgZXhwbGFuYXRpb25MaXN0ID0gY3JlYXRlRWwoJ3VsJyk7XHJcblxyXG5cdFx0XHRpZighdGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlRm9yd2FyZExpbmtzKSB7XHJcblx0XHRcdFx0ZXhwbGFuYXRpb25MaXN0LmNyZWF0ZUVsKCdsaScsIHt0ZXh0OiAnWW91IGN1cnJlbnRseSBoYXZlIGZvcndhcmQtbGlua3MgZGlzYWJsZWQgaW4geW91ciBzZXR0aW5ncyd9KTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYoIXRoaXMucGx1Z2luLnNldHRpbmdzLnVzZUJhY2tMaW5rcykge1xyXG5cdFx0XHRcdGV4cGxhbmF0aW9uTGlzdC5jcmVhdGVFbCgnbGknLCB7dGV4dDogJ1lvdSBjdXJyZW50bHkgaGF2ZSBiYWNrLWxpbmtzIGRpc2FibGVkIGluIHlvdXIgc2V0dGluZ3MnfSk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmKCF0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VUYWdzKSB7XHJcblx0XHRcdFx0ZXhwbGFuYXRpb25MaXN0LmNyZWF0ZUVsKCdsaScsIHt0ZXh0OiAnWW91IGN1cnJlbnRseSBoYXZlIHRhZ3MgZGlzYWJsZWQgaW4geW91ciBzZXR0aW5ncyd9KTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYodGhpcy5wbHVnaW4uc2V0dGluZ3Muc2tpcE1PQ3MpIHtcclxuXHRcdFx0XHRleHBsYW5hdGlvbkxpc3QuY3JlYXRlRWwoJ2xpJywge3RleHQ6ICdZb3UgY3VycmVudGx5IGhhdmUgc2tpcHBpbmcgTU9DcyB3aXRoIG1vcmUgdGhhbiAnICsgdGhpcy5wbHVnaW4uc2V0dGluZ3MuTU9DTWF4TGlua3MgKyAnIG91dGJvdW5kIGxpbmtzIGVuYWJsZWQnfSk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmKHRoaXMucGx1Z2luLnNldHRpbmdzLnNraXBGb2xkZXJzKSB7XHJcblx0XHRcdFx0ZXhwbGFuYXRpb25MaXN0LmNyZWF0ZUVsKCdsaScsIHt0ZXh0OiAnWW91IGN1cnJlbnRseSBoYXZlIHNraXBwaW5nIGZvbGRlcnMgZW5hYmxlZCd9KTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZXhwbGFuYXRpb25MaXN0LmNyZWF0ZUVsKCdsaScsIHt0ZXh0OiAnVGhlIHR3byBub3RlcyBtYXkgbm90IGJlIGluIHRoZSBzYW1lIG5ldHdvcmsuJ30pO1xyXG5cclxuXHRcdFx0bm9TZWFyY2hSZXN1bHQuYXBwZW5kQ2hpbGQoZXhwbGFuYXRpb25MaXN0KTtcclxuXHRcdFx0bm9TZWFyY2hSZXN1bHQuYXBwZW5kQ2hpbGQoYW5vdGhlclNlYXJjaCk7XHJcblxyXG5cdFx0XHRjb250ZW50RWwucmVwbGFjZVdpdGgobm9TZWFyY2hSZXN1bHQpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0bGV0IGxpc3RDbGFzcyA9ICdqb3VybmV5LXJlc3VsdC1saXN0JztcclxuXHRcdFx0aWYodGhpcy5wbHVnaW4uc2V0dGluZ3MuZW5hYmxlSGlnaENvbnRyYXN0KSB7XHJcblx0XHRcdFx0bGlzdENsYXNzID0gJ2pvdXJuZXktcmVzdWx0LWxpc3QtaGlnaC1jb250cmFzdCc7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGxldCBsaXN0ID0gY3JlYXRlRGl2KHtjbHM6IGxpc3RDbGFzc30pO1xyXG5cclxuXHRcdFx0bGV0IHJldmVyc2VkUmVzdWx0cyA9IHRoaXMucmVzdWx0cy5yZXZlcnNlKCk7XHJcblx0XHRcdGZvcih2YXIgaSA9IDA7IGkgPCByZXZlcnNlZFJlc3VsdHMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRsZXQgdGV4dCA9IHJldmVyc2VkUmVzdWx0c1tpXTtcclxuXHRcdFx0XHRsZXQgY2xzID0gXCJqb3VybmV5LXJlc3VsdC1saXN0LWl0ZW0tbm90ZVwiO1xyXG5cclxuXHRcdFx0XHRpZihpID09IDApIGNscyA9IFwiam91cm5leS1yZXN1bHQtbGlzdC1pdGVtLXN0YXJ0XCI7XHJcblx0XHRcdFx0aWYoaSA9PSByZXZlcnNlZFJlc3VsdHMubGVuZ3RoIC0gMSkgY2xzID0gXCJqb3VybmV5LXJlc3VsdC1saXN0LWl0ZW0tZW5kXCI7XHJcblx0XHRcdFx0aWYodGV4dC5tYXRjaCgvXlxcI1xcdysvKSkgY2xzID0gXCJqb3VybmV5LXJlc3VsdC1saXN0LWl0ZW0tdGFnXCJcclxuXHJcblx0XHRcdFx0bGlzdC5hcHBlbmRDaGlsZChjcmVhdGVEaXYoe3RleHQ6IHRleHQsIGNsczogY2xzfSkpXHJcblx0XHRcdH1cclxuXHRcdFx0Y29udGVudEVsLmFwcGVuZENoaWxkKGxpc3QpO1xyXG5cclxuXHRcdFx0bGV0IGJ1dHRvbiA9IGNvbnRlbnRFbC5jcmVhdGVFbCgnaW5wdXQnLCB7dHlwZTogJ3N1Ym1pdCcsIGNsczogJ2pvdXJuZXktaW5wdXQtYnV0dG9uJywgdmFsdWU6ICdDb3B5IHRvIENsaXBib2FyZCd9KTtcclxuXHRcdFx0dmFyIGJvdW5kRnVuY3Rpb25CdXR0b24gPSAoZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0dGhpcy5zYXZlVG9DbGlwYm9hcmQoKTtcclxuXHRcdFx0fSkuYmluZCh0aGlzKTtcclxuXHJcblx0XHRcdGJ1dHRvbi5vbmNsaWNrID0gYm91bmRGdW5jdGlvbkJ1dHRvbjtcclxuXHJcblx0XHRcdGNvbnRlbnRFbC5hcHBlbmRDaGlsZChjb250ZW50RWwuY3JlYXRlRWwoXCJoclwiKSk7XHJcblxyXG5cdFx0XHRjb250ZW50RWwuYXBwZW5kQ2hpbGQoYnV0dG9uKVxyXG5cclxuXHRcdFx0Y29udGVudEVsLmFwcGVuZENoaWxkKGFub3RoZXJTZWFyY2gpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0b25DbG9zZSgpIHtcclxuXHRcdGxldCB7Y29udGVudEVsfSA9IHRoaXM7XHJcblx0XHRjb250ZW50RWwuZW1wdHkoKTtcclxuXHR9XHJcblxyXG5cdHNhdmVUb0NsaXBib2FyZCgpIHtcclxuXHRcdGlmICh0aGlzLnJlc3VsdHMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh0aGlzLmNyZWF0ZUNsaXBib2FyZENvbnRlbnQoKSk7XHJcblx0XHRcdG5ldyBOb3RpY2UoXCJKb3VybmV5IGNvcGllZCB0byBjbGlwYm9hcmQhXCIpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Y3JlYXRlQ2xpcGJvYXJkQ29udGVudCgpOiBzdHJpbmcge1xyXG5cdFx0bGV0IHJlc3VsdCA9IFwiIyMgVGhlIEpvdXJuZXkgQmV0d2VlbiBcIiArIHRoaXMucmVzdWx0cy5maXJzdCgpLnJlcGxhY2UoXCIubWRcIiwgXCJcIikgICsgXCIgYW5kIFwiICsgdGhpcy5yZXN1bHRzLmxhc3QoKS5yZXBsYWNlKFwiLm1kXCIsIFwiXCIpICsgXCJcXG5cIjtcclxuXHJcblx0XHRmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5yZXN1bHRzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdGxldCBub3RlVGl0bGUgPSB0aGlzLnJlc3VsdHNbaV0ucmVwbGFjZShcIi5tZFwiLCBcIlwiKTtcclxuXHJcblx0XHRcdGlmKHRoaXMucGx1Z2luLnNldHRpbmdzLmVuYWJsZUxpbmtzICYmICEobm90ZVRpdGxlLnN0YXJ0c1dpdGgoXCIjXCIpKSkge1xyXG5cdFx0XHRcdG5vdGVUaXRsZSA9IFwiW1tcIiArIG5vdGVUaXRsZSArIFwiXV1cIjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYodGhpcy5wbHVnaW4uc2V0dGluZ3MuZW5hYmxlTGlua3MgJiYgdGhpcy5wbHVnaW4uc2V0dGluZ3MuZW5hYmxlVHJhbnNjbHVzaW9uKSB7XHJcblx0XHRcdFx0aWYoIShub3RlVGl0bGUuc3RhcnRzV2l0aChcIiNcIikpKSB7XHJcblx0XHRcdFx0XHRyZXN1bHQgKz0gXCIhXCIgKyBub3RlVGl0bGUgKyBcIlxcblwiO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRyZXN1bHQgKz0gbm90ZVRpdGxlICsgXCJcXG5cIjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0cmVzdWx0ICs9IFwiLSBcIiArIG5vdGVUaXRsZSArIFwiXFxuXCI7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxufVxyXG5cclxuY2xhc3MgSm91cm5leVBsdWdpblNldHRpbmdzIHtcclxuXHRwdWJsaWMgdXNlRm9yd2FyZExpbmtzOiBib29sZWFuO1xyXG5cdHB1YmxpYyB1c2VCYWNrTGlua3M6IGJvb2xlYW47XHJcblx0cHVibGljIHVzZVRhZ3M6IGJvb2xlYW47XHJcblx0cHVibGljIHNraXBNT0NzOiBib29sZWFuO1xyXG5cdHB1YmxpYyBNT0NNYXhMaW5rczogbnVtYmVyO1xyXG5cdHB1YmxpYyBlbmFibGVIaWdoQ29udHJhc3Q6IGJvb2xlYW47XHJcblx0cHVibGljIHNraXBGb2xkZXJzOiBzdHJpbmc7XHJcblx0cHVibGljIGVuYWJsZUxpbmtzOiBib29sZWFuO1xyXG5cdHB1YmxpYyBlbmFibGVUcmFuc2NsdXNpb246IGJvb2xlYW47XHJcblxyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cdFx0dGhpcy51c2VGb3J3YXJkTGlua3MgPSB0cnVlO1xyXG5cdFx0dGhpcy51c2VCYWNrTGlua3MgPSB0cnVlO1xyXG5cdFx0dGhpcy51c2VUYWdzID0gdHJ1ZTtcclxuXHRcdHRoaXMuc2tpcE1PQ3MgPSBmYWxzZTtcclxuXHRcdHRoaXMuTU9DTWF4TGlua3MgPSAzMDtcclxuXHRcdHRoaXMuZW5hYmxlSGlnaENvbnRyYXN0ID0gZmFsc2U7XHJcblx0XHR0aGlzLnNraXBGb2xkZXJzID0gXCJcIjtcclxuXHRcdHRoaXMuZW5hYmxlTGlua3MgPSBmYWxzZTtcclxuXHRcdHRoaXMuZW5hYmxlVHJhbnNjbHVzaW9uID0gZmFsc2U7XHJcblx0fVxyXG5cclxuXHRza2lwRm9sZGVyc0xpc3QoKSB7XHJcblx0XHRpZiAodGhpcy5za2lwRm9sZGVycyA9PSB1bmRlZmluZWQgfHwgdGhpcy5za2lwRm9sZGVycyA9PSBcIlwiKSByZXR1cm4gW107XHJcblx0XHRyZXR1cm4gdGhpcy5za2lwRm9sZGVycy5zcGxpdChcIixcIikubWFwKGZ1bmN0aW9uKGl0ZW0pIHtcclxuXHRcdFx0cmV0dXJuIGl0ZW0udHJpbSgpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG59XHJcblxyXG5jbGFzcyBKb3VybmV5UGx1Z2luU2V0dGluZ3NUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcclxuXHRwcml2YXRlIHJlYWRvbmx5IHBsdWdpbjogSm91cm5leVBsdWdpbjtcclxuXHRwdWJsaWMgTU9DTWF4TGlua3NDb3VudGVyOiBIVE1MRGl2RWxlbWVudDtcclxuXHJcblx0Y29uc3RydWN0b3IoYXBwOiBBcHAsIHBsdWdpbjogSm91cm5leVBsdWdpbikge1xyXG5cdFx0c3VwZXIoYXBwLCBwbHVnaW4pO1xyXG5cdFx0dGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcblx0fVxyXG5cclxuXHRkaXNwbGF5KCk6IHZvaWQge1xyXG5cdFx0Y29uc3Qge2NvbnRhaW5lckVsfSA9IHRoaXM7XHJcblxyXG5cdFx0Y29udGFpbmVyRWwuZW1wdHkoKTtcclxuXHJcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbChcImgyXCIsIHt0ZXh0OiBcIkpvdXJuZXkgUGx1Z2luIFNldHRpbmdzXCJ9KTtcclxuXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoXCJVc2UgRm9yd2FyZC1saW5rc1wiKVxyXG5cdFx0XHQuc2V0RGVzYyhcIklmIHNldCwgYWxsb3dzIHRvIHRyYXZlbCB1c2luZyBmb3J3YXJkLWxpbmtzLiBJZiB5b3UgaGF2ZSBhIGdyYXBoIGxpa2UgdGhpczogQSAtPiBCIC0+IEMgYW5kIHlvdSBhc2sgYWJvdXQgdGhlIHN0b3J5IGJldHdlZW4gQSBhbmQgQywgaXQgd2lsbCBnaXZlIHlvdSAnQSwgQiwgQycgc2luY2UgQSBmb3J3YXJkLWxpbmtzIHRvIEIgYW5kIEIgZm9yd2FyZC1saW5rcyB0byBDXCIpXHJcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuXHRcdFx0XHR0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlRm9yd2FyZExpbmtzKS5vbkNoYW5nZSgodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZUZvcndhcmRMaW5rcyA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xyXG5cdFx0XHRcdH0pLFxyXG5cdFx0XHQpO1xyXG5cclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZShcIlVzZSBCYWNrLWxpbmtzXCIpXHJcblx0XHRcdC5zZXREZXNjKFwiSWYgc2V0LCBhbGxvd3MgdG8gdHJhdmVsIHVzaW5nIGJhY2stbGlua3MuIElmIHlvdSBoYXZlIGEgZ3JhcGggbGlrZSB0aGlzOiBBIC0+IEIgLT4gQyBhbmQgeW91IGFzayBhYm91dCB0aGUgc3RvcnkgYmV0d2VlbiBDIGFuZCBBLCBpdCB3aWxsIGdpdmUgeW91ICdDLCBCLCBBJyBzaW5jZSBDIGhhcyBhIGJhY2stbGluayBmcm9tIEIgYW5kIEIgaGFzIGEgYmFjay1saW5rIGZyb20gQVwiKVxyXG5cdFx0XHQuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcblx0XHRcdFx0dG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZUJhY2tMaW5rcykub25DaGFuZ2UoKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VCYWNrTGlua3MgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNhdmVEYXRhKHRoaXMucGx1Z2luLnNldHRpbmdzKTtcclxuXHRcdFx0XHR9KSxcclxuXHRcdFx0KTtcclxuXHJcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbChcImgzXCIsIHt0ZXh0OiBcIkluY2x1ZGUgVGFnc1wifSk7XHJcblxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKFwiVXNlIFRhZ3NcIilcclxuXHRcdFx0LnNldERlc2MoXCJJZiBzZXQsIGFsbG93cyB0byB0cmF2ZWwgdXNpbmcgdGFncy4gXCIpXHJcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuXHRcdFx0XHR0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlVGFncykub25DaGFuZ2UoKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VUYWdzID0gdmFsdWU7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zYXZlRGF0YSh0aGlzLnBsdWdpbi5zZXR0aW5ncyk7XHJcblx0XHRcdFx0fSksXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoXCJoM1wiLCB7dGV4dDogXCJBdm9pZCB0cmF2ZWxpbmcgdmlhIGNlcnRhaW4gbm90ZXMgYW5kIGZvbGRlcnNcIn0pO1xyXG5cclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZShcIlRha2UgdGhlIHNjZW5pYyByb3V0ZVwiKVxyXG5cdFx0XHQuc2V0RGVzYyhcIklmIHNldCwgd2lsbCBza2lwICdodWInIG5vdGVzIHdpdGggdG9vIG1hbnkgbGlua3MgKE1PQ3MpLiBDb25maWd1cmUgZXhhY3RseSBob3cgbWFueSBsaW5rcyBtYWtlIGEgTU9DIGJlbG93LlwiKVxyXG5cdFx0XHQuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcblx0XHRcdFx0dG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnNraXBNT0NzKS5vbkNoYW5nZSgodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnNraXBNT0NzID0gdmFsdWU7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zYXZlRGF0YSh0aGlzLnBsdWdpbi5zZXR0aW5ncyk7XHJcblx0XHRcdFx0fSksXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKFwiSG93IG1hbnkgbGlua3MgbWFrZSBhIE1PQz9cIilcclxuXHRcdFx0LnNldERlc2MoXCJDb25maWd1cmUgYXQgd2hpY2ggcG9pbnQgdG8gc2tpcCBhIG5vdGUgYmVjYXVzZSBpdCBjb250YWlucyB0b28gbWFueSBvdXQtYm91bmQgbGlua3MuIEFwcGxpZXMgb25seSBpZiAnVGFrZSB0aGUgc2NlbmljIHJvdXRlJyBhYm92ZSBpcyBzZXQuXCIpXHJcblx0XHRcdC5hZGRTbGlkZXIoKHRvZ2dsZSkgPT5cclxuXHRcdFx0XHR0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuTU9DTWF4TGlua3MpLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5NT0NNYXhMaW5rc0NvdW50ZXIuc2V0VGV4dChcIk1heCBsaW5rIGNvdW50OiBcIiArIFN0cmluZyh2YWx1ZSkpO1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuTU9DTWF4TGlua3MgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNhdmVEYXRhKHRoaXMucGx1Z2luLnNldHRpbmdzKTtcclxuXHRcdFx0XHR9KSxcclxuXHRcdFx0KTtcclxuXHRcdHRoaXMuTU9DTWF4TGlua3NDb3VudGVyID0gY29udGFpbmVyRWwuY3JlYXRlRGl2KHtjbHM6ICdtb2MtbWF4LWxpbmtzLWNvdW50ZXInLCB0ZXh0OiBcIk1heCBsaW5rIGNvdW50OiBcIiArIHRoaXMucGx1Z2luLnNldHRpbmdzLk1PQ01heExpbmtzfSk7XHJcblxyXG5cclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZShcIkV4Y2x1ZGUgZm9sZGVyc1wiKVxyXG5cdFx0XHQuc2V0RGVzYyhcIklmIHNldCwgd2lsbCBub3RlIGluY2x1ZGUgbm90ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIGZvbGRlcnMgaW4geW91ciBzZWFyY2guIFBsZWFzZSB1c2UgY29tbWEgdG8gZGVsaW1pbmF0ZSBzZXZlcmFsIGZvbGRlcnNcIilcclxuXHRcdFx0LmFkZFRleHQoKHRleHQpID0+XHJcblx0XHRcdFx0dGV4dFxyXG5cdFx0XHRcdFx0LnNldFBsYWNlaG9sZGVyKFwiRGFpbHkgTm90ZXMvLCBBdHRhY2htZW50cy9cIilcclxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5za2lwRm9sZGVycylcclxuXHRcdFx0XHRcdC5vbkNoYW5nZSgodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3Muc2tpcEZvbGRlcnMgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xyXG5cdFx0XHRcdFx0fSlcclxuXHRcdFx0KTtcclxuXHJcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbChcImgzXCIsIHt0ZXh0OiBcIkNsaXBib2FyZCBTZXR0aW5nc1wifSk7XHJcblxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKFwiRW5hYmxlIEF1dG9tYXRpYyBMaW5raW5nXCIpXHJcblx0XHRcdC5zZXREZXNjKFwiSWYgc2V0LCB3aWxsIHR1cm4gdGl0bGVzIGluIHRoZSBsaXN0IGludG8gbGlua3MgdG8gdGhlaXIgcmVzcGVjdGl2ZSBub3RlXCIpXHJcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuXHRcdFx0XHR0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZW5hYmxlTGlua3MpLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZW5hYmxlTGlua3MgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNhdmVEYXRhKHRoaXMucGx1Z2luLnNldHRpbmdzKTtcclxuXHRcdFx0XHR9KSxcclxuXHRcdFx0KTtcclxuXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoXCJFbmFibGUgQXV0b21hdGljIFRyYW5zY2x1c2lvblwiKVxyXG5cdFx0XHQuc2V0RGVzYyhcIklmIHNldCwgd2lsbCBhdXRvbWF0aWNhbGx5IGNyZWF0ZSB0cmFuc2NsdWRpbmcgbGlua3MgZm9yIHlvdSAoJyFbW25vdGVdXScgaW5zdGVhZCBvZiAnLSBbW25vdGVdXScpXCIpXHJcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuXHRcdFx0XHR0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZW5hYmxlVHJhbnNjbHVzaW9uKS5vbkNoYW5nZSgodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmVuYWJsZVRyYW5zY2x1c2lvbiA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xyXG5cdFx0XHRcdH0pLFxyXG5cdFx0XHQpO1xyXG5cclxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiaDNcIiwge3RleHQ6IFwiQWNjZXNzaWJpbGl0eSBTZXR0aW5nc1wifSk7XHJcblxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKFwiRW5hYmxlIEhpZ2ggQ29udHJhc3RcIilcclxuXHRcdFx0LnNldERlc2MoXCJJZiBzZXQsIHdpbGwgaW5jcmVhc2UgdGhlIGNvbnRyYXN0IHRvIG1ha2UgdGhlIHJlc3VsdC1saXN0IGVhc2llciB0byByZWFkLlwiKVxyXG5cdFx0XHQuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcblx0XHRcdFx0dG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmVuYWJsZUhpZ2hDb250cmFzdCkub25DaGFuZ2UoKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5lbmFibGVIaWdoQ29udHJhc3QgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNhdmVEYXRhKHRoaXMucGx1Z2luLnNldHRpbmdzKTtcclxuXHRcdFx0XHR9KSxcclxuXHRcdFx0KTtcclxuXHR9XHJcbn0iXSwibmFtZXMiOlsiZXEiLCJhc3NvY0luZGV4T2YiLCJsaXN0Q2FjaGVDbGVhciIsImxpc3RDYWNoZURlbGV0ZSIsImxpc3RDYWNoZUdldCIsImxpc3RDYWNoZUhhcyIsImxpc3RDYWNoZVNldCIsIkxpc3RDYWNoZSIsImdsb2JhbCIsImZyZWVHbG9iYWwiLCJTeW1ib2wiLCJyb290Iiwib2JqZWN0UHJvdG8iLCJuYXRpdmVPYmplY3RUb1N0cmluZyIsInN5bVRvU3RyaW5nVGFnIiwiZ2V0UmF3VGFnIiwib2JqZWN0VG9TdHJpbmciLCJpc09iamVjdCIsImJhc2VHZXRUYWciLCJjb3JlSnNEYXRhIiwiZnVuY1Byb3RvIiwiZnVuY1RvU3RyaW5nIiwiaGFzT3duUHJvcGVydHkiLCJpc01hc2tlZCIsImlzRnVuY3Rpb24iLCJ0b1NvdXJjZSIsImdldFZhbHVlIiwiYmFzZUlzTmF0aXZlIiwiZ2V0TmF0aXZlIiwibmF0aXZlQ3JlYXRlIiwiSEFTSF9VTkRFRklORUQiLCJoYXNoQ2xlYXIiLCJoYXNoRGVsZXRlIiwiaGFzaEdldCIsImhhc2hIYXMiLCJoYXNoU2V0IiwiSGFzaCIsIk1hcCIsImlzS2V5YWJsZSIsImdldE1hcERhdGEiLCJtYXBDYWNoZUNsZWFyIiwibWFwQ2FjaGVEZWxldGUiLCJtYXBDYWNoZUdldCIsIm1hcENhY2hlSGFzIiwibWFwQ2FjaGVTZXQiLCJNYXBDYWNoZSIsInN0YWNrQ2xlYXIiLCJzdGFja0RlbGV0ZSIsInN0YWNrR2V0Iiwic3RhY2tIYXMiLCJzdGFja1NldCIsImRlZmluZVByb3BlcnR5IiwiYmFzZUFzc2lnblZhbHVlIiwiYXNzaWduVmFsdWUiLCJpc09iamVjdExpa2UiLCJiYXNlSXNBcmd1bWVudHMiLCJzdHViRmFsc2UiLCJNQVhfU0FGRV9JTlRFR0VSIiwiYXJnc1RhZyIsImZ1bmNUYWciLCJpc0xlbmd0aCIsIm5vZGVVdGlsIiwiYmFzZVVuYXJ5IiwiYmFzZUlzVHlwZWRBcnJheSIsImlzQXJyYXkiLCJpc0FyZ3VtZW50cyIsImlzQnVmZmVyIiwiaXNUeXBlZEFycmF5IiwiYmFzZVRpbWVzIiwiaXNJbmRleCIsIm92ZXJBcmciLCJpc1Byb3RvdHlwZSIsIm5hdGl2ZUtleXMiLCJpc0FycmF5TGlrZSIsImFycmF5TGlrZUtleXMiLCJiYXNlS2V5cyIsImNvcHlPYmplY3QiLCJrZXlzIiwibmF0aXZlS2V5c0luIiwiYmFzZUtleXNJbiIsImtleXNJbiIsInByb3BlcnR5SXNFbnVtZXJhYmxlIiwic3R1YkFycmF5IiwiYXJyYXlGaWx0ZXIiLCJnZXRTeW1ib2xzIiwibmF0aXZlR2V0U3ltYm9scyIsImFycmF5UHVzaCIsImdldFByb3RvdHlwZSIsImdldFN5bWJvbHNJbiIsImJhc2VHZXRBbGxLZXlzIiwiUHJvbWlzZSIsIm1hcFRhZyIsIm9iamVjdFRhZyIsInNldFRhZyIsIndlYWtNYXBUYWciLCJkYXRhVmlld1RhZyIsIkRhdGFWaWV3IiwiU2V0IiwiV2Vha01hcCIsIlVpbnQ4QXJyYXkiLCJjbG9uZUFycmF5QnVmZmVyIiwiYm9vbFRhZyIsImRhdGVUYWciLCJudW1iZXJUYWciLCJyZWdleHBUYWciLCJzdHJpbmdUYWciLCJhcnJheUJ1ZmZlclRhZyIsImZsb2F0MzJUYWciLCJmbG9hdDY0VGFnIiwiaW50OFRhZyIsImludDE2VGFnIiwiaW50MzJUYWciLCJ1aW50OFRhZyIsInVpbnQ4Q2xhbXBlZFRhZyIsInVpbnQxNlRhZyIsInVpbnQzMlRhZyIsImNsb25lRGF0YVZpZXciLCJjbG9uZVR5cGVkQXJyYXkiLCJjbG9uZVJlZ0V4cCIsImNsb25lU3ltYm9sIiwiYmFzZUNyZWF0ZSIsImdldFRhZyIsImJhc2VJc01hcCIsImJhc2VJc1NldCIsImFycmF5VGFnIiwiZXJyb3JUYWciLCJnZW5UYWciLCJzeW1ib2xUYWciLCJpbml0Q2xvbmVBcnJheSIsImNvcHlBcnJheSIsImNsb25lQnVmZmVyIiwiaW5pdENsb25lT2JqZWN0IiwiY29weVN5bWJvbHNJbiIsImJhc2VBc3NpZ25JbiIsImNvcHlTeW1ib2xzIiwiYmFzZUFzc2lnbiIsImluaXRDbG9uZUJ5VGFnIiwiU3RhY2siLCJpc1NldCIsImlzTWFwIiwiZ2V0QWxsS2V5c0luIiwiZ2V0QWxsS2V5cyIsImFycmF5RWFjaCIsIkNMT05FX1NZTUJPTFNfRkxBRyIsImJhc2VDbG9uZSIsImNyZWF0ZUJhc2VGb3IiLCJiYXNlRm9yIiwiY3JlYXRlQmFzZUVhY2giLCJiYXNlRm9yT3duIiwiaWRlbnRpdHkiLCJiYXNlRWFjaCIsImNhc3RGdW5jdGlvbiIsInJlcXVpcmUkJDAiLCJzZXRDYWNoZUFkZCIsInNldENhY2hlSGFzIiwiU2V0Q2FjaGUiLCJhcnJheVNvbWUiLCJjYWNoZUhhcyIsIkNPTVBBUkVfUEFSVElBTF9GTEFHIiwiQ09NUEFSRV9VTk9SREVSRURfRkxBRyIsInN5bWJvbFByb3RvIiwic3ltYm9sVmFsdWVPZiIsIm1hcFRvQXJyYXkiLCJzZXRUb0FycmF5IiwiZXF1YWxBcnJheXMiLCJlcXVhbEJ5VGFnIiwiZXF1YWxPYmplY3RzIiwiYmFzZUlzRXF1YWxEZWVwIiwiYmFzZUlzRXF1YWwiLCJpc1N0cmljdENvbXBhcmFibGUiLCJnZXRNYXRjaERhdGEiLCJtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZSIsImJhc2VJc01hdGNoIiwiaXNTeW1ib2wiLCJtZW1vaXplIiwibWVtb2l6ZUNhcHBlZCIsImFycmF5TWFwIiwiYmFzZVRvU3RyaW5nIiwiaXNLZXkiLCJzdHJpbmdUb1BhdGgiLCJ0b1N0cmluZyIsIklORklOSVRZIiwiY2FzdFBhdGgiLCJ0b0tleSIsImJhc2VHZXQiLCJoYXNQYXRoIiwiYmFzZUhhc0luIiwiZ2V0IiwiaGFzSW4iLCJiYXNlUHJvcGVydHkiLCJiYXNlUHJvcGVydHlEZWVwIiwiYmFzZU1hdGNoZXNQcm9wZXJ0eSIsImJhc2VNYXRjaGVzIiwicHJvcGVydHkiLCJiYXNlRmlsdGVyIiwiYmFzZUl0ZXJhdGVlIiwiYmFzZUhhcyIsImJhc2VNYXAiLCJhcnJheVJlZHVjZSIsImJhc2VSZWR1Y2UiLCJyc0FzdHJhbFJhbmdlIiwicnNDb21ib01hcmtzUmFuZ2UiLCJyZUNvbWJvSGFsZk1hcmtzUmFuZ2UiLCJyc0NvbWJvU3ltYm9sc1JhbmdlIiwicnNDb21ib1JhbmdlIiwicnNWYXJSYW5nZSIsInJzWldKIiwiaGFzVW5pY29kZSIsInVuaWNvZGVTaXplIiwiYXNjaWlTaXplIiwiaXNTdHJpbmciLCJzdHJpbmdTaXplIiwiaXNGbGF0dGVuYWJsZSIsImFwcGx5IiwiY29uc3RhbnQiLCJzaG9ydE91dCIsImJhc2VTZXRUb1N0cmluZyIsInNldFRvU3RyaW5nIiwib3ZlclJlc3QiLCJzdHJpY3RJbmRleE9mIiwiYmFzZUZpbmRJbmRleCIsImJhc2VJc05hTiIsImJhc2VJbmRleE9mIiwibm9vcCIsIkxBUkdFX0FSUkFZX1NJWkUiLCJhcnJheUluY2x1ZGVzIiwiYXJyYXlJbmNsdWRlc1dpdGgiLCJjcmVhdGVTZXQiLCJiYXNlUmVzdCIsImJhc2VVbmlxIiwiYmFzZUZsYXR0ZW4iLCJpc0FycmF5TGlrZU9iamVjdCIsImJhc2VWYWx1ZXMiLCJyZXF1aXJlIiwicmVxdWlyZSQkMSIsInJlcXVpcmUkJDIiLCJyZXF1aXJlJCQzIiwicmVxdWlyZSQkNCIsInJlcXVpcmUkJDUiLCJyZXF1aXJlJCQ2IiwicmVxdWlyZSQkNyIsInJlcXVpcmUkJDgiLCJyZXF1aXJlJCQ5IiwicmVxdWlyZSQkMTAiLCJyZXF1aXJlJCQxMSIsInJlcXVpcmUkJDEyIiwicmVxdWlyZSQkMTMiLCJyZXF1aXJlJCQxNCIsInJlcXVpcmUkJDE1IiwiXyIsIkdyYXBoIiwiUHJpb3JpdHlRdWV1ZSIsImRpamtzdHJhIiwidGFyamFuIiwiREVGQVVMVF9XRUlHSFRfRlVOQyIsInRvcHNvcnQiLCJkZnMiLCJhZGRJY29uIiwiZ3JhcGhsaWIuYWxnIiwiUGx1Z2luIiwiVGV4dENvbXBvbmVudCIsIk1vZGFsIiwiTm90aWNlIiwiU2V0dGluZyIsIlBsdWdpblNldHRpbmdUYWIiXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksYUFBYSxHQUFHLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNuQyxJQUFJLGFBQWEsR0FBRyxNQUFNLENBQUMsY0FBYztBQUN6QyxTQUFTLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxZQUFZLEtBQUssSUFBSSxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDcEYsUUFBUSxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDMUcsSUFBSSxPQUFPLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDL0IsQ0FBQyxDQUFDO0FBQ0Y7QUFDTyxTQUFTLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ2hDLElBQUksSUFBSSxPQUFPLENBQUMsS0FBSyxVQUFVLElBQUksQ0FBQyxLQUFLLElBQUk7QUFDN0MsUUFBUSxNQUFNLElBQUksU0FBUyxDQUFDLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRywrQkFBK0IsQ0FBQyxDQUFDO0FBQ2xHLElBQUksYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN4QixJQUFJLFNBQVMsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsRUFBRTtBQUMzQyxJQUFJLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxLQUFLLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDekYsQ0FBQztBQXVDRDtBQUNPLFNBQVMsU0FBUyxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRTtBQUM3RCxJQUFJLFNBQVMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sS0FBSyxZQUFZLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsVUFBVSxPQUFPLEVBQUUsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRTtBQUNoSCxJQUFJLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLE9BQU8sQ0FBQyxFQUFFLFVBQVUsT0FBTyxFQUFFLE1BQU0sRUFBRTtBQUMvRCxRQUFRLFNBQVMsU0FBUyxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7QUFDbkcsUUFBUSxTQUFTLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7QUFDdEcsUUFBUSxTQUFTLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxNQUFNLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUU7QUFDdEgsUUFBUSxJQUFJLENBQUMsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsVUFBVSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDOUUsS0FBSyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBQ0Q7QUFDTyxTQUFTLFdBQVcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFO0FBQzNDLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNySCxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLE1BQU0sS0FBSyxVQUFVLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxXQUFXLEVBQUUsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzdKLElBQUksU0FBUyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxVQUFVLENBQUMsRUFBRSxFQUFFLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDdEUsSUFBSSxTQUFTLElBQUksQ0FBQyxFQUFFLEVBQUU7QUFDdEIsUUFBUSxJQUFJLENBQUMsRUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7QUFDdEUsUUFBUSxPQUFPLENBQUMsRUFBRSxJQUFJO0FBQ3RCLFlBQVksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENB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LFVBQVUsRUFBRTtBQUNoQyxJQUFJLE9BQU8sVUFBVSxJQUFJLEtBQUssSUFBSSxVQUFVLElBQUksS0FBSyxDQUFDO0FBQ3RELEdBQUc7QUFDSCxFQUFFLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztBQUNoQixNQUFNLE1BQU0sR0FBRyxJQUFJO0FBQ25CLE1BQU0sSUFBSSxHQUFHLENBQUMsT0FBTyxHQUFHLHNCQUFzQixJQUFJLElBQUlDLFNBQVEsR0FBRyxTQUFTLENBQUM7QUFDM0U7QUFDQSxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzFCLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDMUI7QUFDQTtBQUNBLEVBQUUsT0FBTyxFQUFFLEtBQUssR0FBRyxTQUFTLEVBQUU7QUFDOUIsSUFBSSxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO0FBQy9CLFFBQVEsUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNoQztBQUNBLElBQUksSUFBSSxVQUFVLEVBQUU7QUFDcEIsTUFBTSxJQUFJLFFBQVEsR0FBRyxTQUFTO0FBQzlCLFVBQVUsVUFBVSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDO0FBQ3BFLFVBQVUsVUFBVSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDckUsS0FBSztBQUNMLElBQUksSUFBSSxRQUFRLEtBQUssU0FBUyxFQUFFO0FBQ2hDLE1BQU0sSUFBSSxRQUFRLEVBQUU7QUFDcEIsUUFBUSxTQUFTO0FBQ2pCLE9BQU87QUFDUCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUM7QUFDckIsTUFBTSxNQUFNO0FBQ1osS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLElBQUksRUFBRTtBQUNkLE1BQU0sSUFB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QUFFLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUN6RSxJQUFJLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxQixJQUFJLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtBQUMxQixNQUFNLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxQyxNQUFNLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3QixNQUFNQSxRQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxLQUFLLEVBQUU7QUFDL0MsUUFBUSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzlCLE9BQU8sQ0FBQyxDQUFDO0FBQ1QsTUFBTSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0IsS0FBSztBQUNMLElBQUlBLFFBQUMsQ0FBQyxJQUFJLENBQUNBLFFBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQzVDLElBQUksT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLElBQUksT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFCLElBQUlBLFFBQUMsQ0FBQyxJQUFJLENBQUNBLFFBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQzdDLElBQUksT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLElBQUksT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pCLElBQUks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LEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNsQyxJQUFJLElBQUksQ0FBQ0EsUUFBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUU7QUFDaEMsTUFBTSxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDekIsS0FBSztBQUNMLElBQUksSUFBSSxDQUFDQSxRQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxFQUFFO0FBQ25DLE1BQU0sSUFBSSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUM7QUFDN0IsS0FBSztBQUNMLElBQUksT0FBTyxJQUFJLENBQUM7QUFDaEIsR0FBRyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLElBQUksQ0FBQyxJQUFJLEVBQUU7QUFDcEIsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDdkQsRUFBRUQsUUFBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFNBQVMsS0FBSyxFQUFFO0FBQ3JDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNwQyxJQUFJLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRTtBQUN0QixNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDekMsS0FBSztBQUNMLEdBQUcsQ0FBQyxDQUFDO0FBQ0wsRUFBRUEsUUFBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFNBQVMsS0FBSyxFQUFFO0FBQ3JDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxL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 diff --git a/.obsidian/plugins/obsidian-journey-plugin/manifest.json b/.obsidian/plugins/obsidian-journey-plugin/manifest.json deleted file mode 100644 index afb3ea6a3..000000000 --- a/.obsidian/plugins/obsidian-journey-plugin/manifest.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "id": "obsidian-journey-plugin", - "name": "Journey", - "version": "0.0.7", - "minAppVersion": "0.10.10", - "description": "Discover the stories between your notes.", - "author": "Alexis Rondeau", - "authorUrl": "https://publish.obsidian.md/alexisrondeau", - "isDesktopOnly": false -} diff --git a/.obsidian/plugins/obsidian-journey-plugin/styles.css b/.obsidian/plugins/obsidian-journey-plugin/styles.css deleted file mode 100644 index 677d4485a..000000000 --- a/.obsidian/plugins/obsidian-journey-plugin/styles.css +++ /dev/null @@ -1,106 +0,0 @@ -.journey-search-form select, .journey-search-form input[type=text], .journey-input-button { - width: 100%; - height: 50px !important; - font-size: 24px; - padding: 5px; - padding-left: 10px; - margin-bottom: 20px; -} - -.show-me { - display: block; -} - -.hide-me { - display: none; -} - -.journey-search-form .journey-search-autocomplete-results-container { - position: relative; - height: 0px; - top: -20px; - width: 730px; - min-width: 730px; - max-width: 730px; -} - -.journey-search-autocomplete-results-container .journey-search-autocomplete-results-content { - background-color: #222; -} - -.journey-search-autocomplete-results-content-item { - font-size: 24px; - color: white; - border-bottom: 1px solid #000000; - padding: 10px; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - -.journey-input-button { - background-color: black; - color: white; -} - -/** Search Results */ - -.journey-result-list .journey-result-list-item-note, -.journey-result-list .journey-result-list-item-start, -.journey-result-list .journey-result-list-item-end, -.journey-result-list .journey-result-list-item-tag { - font-size: 24px; - padding: 10px; - margin-bottom: 10px; - background-color: #555; - border: 5px solid #777; - border-radius: 10px 10px 10px 10px; -} - -.journey-result-list .journey-result-list-item-start { - background-color: darkgreen; - border: 3px solid forestgreen; -} - -.journey-result-list .journey-result-list-item-end { - background-color: darkgreen; - border: 3px solid forestgreen; -} - -.journey-result-list .journey-result-list-item-tag { - background-color: darkblue; - border: 3px solid royalblue; -} - -.journey-result-list-high-contrast .journey-result-list-item-note, -.journey-result-list-high-contrast .journey-result-list-item-start, -.journey-result-list-high-contrast .journey-result-list-item-end, -.journey-result-list-high-contrast .journey-result-list-item-tag { - font-size: 24px; - padding: 10px; - margin-bottom: 10px; - background-color: #000; - color: white; - border: 5px solid #333; - border-radius: 10px 10px 10px 10px; -} - - -.journey-result-list-reset-link { - text-align: center; - text-decoration: underline; -} - -.discovery-settings { - font-size: 9px; - text-align: center; -} - -.journey-search-lucky { - text-align: center; - text-decoration: underline; -} - -.moc-max-links-counter { - text-align: right; -} \ No newline at end of file diff --git a/.obsidian/plugins/obsidian-mind-map/main.js b/.obsidian/plugins/obsidian-mind-map/main.js deleted file mode 100644 index c93ae0642..000000000 --- a/.obsidian/plugins/obsidian-mind-map/main.js +++ /dev/null @@ -1,32629 +0,0 @@ -'use strict'; - -var obsidian = require('obsidian'); - -/*! ***************************************************************************** -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -***************************************************************************** */ -/* global Reflect, Promise */ - -var extendStatics = function(d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); -}; - -function __extends(d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -} - -function __awaiter(thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -} - -function __generator(thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -} - -function _extends() { - _extends = Object.assign || function (target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - - for (var key in source) { - if (Object.prototype.hasOwnProperty.call(source, key)) { - target[key] = source[key]; - } - } - } - - return target; - }; - - return _extends.apply(this, arguments); -} - -/*! markmap-common v0.1.2 | MIT License */ - -class Hook { - constructor() { - this.listeners = []; - } - - tap(fn) { - this.listeners.push(fn); - return () => this.revoke(fn); - } - - revoke(fn) { - const i = this.listeners.indexOf(fn); - if (i >= 0) this.listeners.splice(i, 1); - } - - revokeAll() { - this.listeners.splice(0); - } - - call(...args) { - for (const fn of this.listeners) { - fn(...args); - } - } - -} - -const uniqId = Math.random().toString(36).slice(2, 8); -function wrapFunction(fn, { - before, - after -}) { - return function wrapped(...args) { - const ctx = { - args - }; - - try { - if (before) before(ctx); - } catch (_unused) {// ignore - } - - ctx.result = fn(...args); - - try { - if (after) after(ctx); - } catch (_unused2) {// ignore - } - - return ctx.result; - }; -} - -var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; - -function createCommonjsModule(fn, basedir, module) { - return module = { - path: basedir, - exports: {}, - require: function (path, base) { - return commonjsRequire(path, (base === undefined || base === null) ? module.path : base); - } - }, fn(module, module.exports), module.exports; -} - -function commonjsRequire () { - throw new Error('Dynamic requires are not currently supported by @rollup/plugin-commonjs'); -} - -var cjs = createCommonjsModule(function (module, exports) { - -Object.defineProperty(exports, '__esModule', { value: true }); - -// List of valid entities -// -// Generate with ./support/entities.js script -// - -/*eslint quotes:0*/ -var entities = { - "Aacute":"\u00C1", - "aacute":"\u00E1", - "Abreve":"\u0102", - "abreve":"\u0103", - "ac":"\u223E", - "acd":"\u223F", - "acE":"\u223E\u0333", - "Acirc":"\u00C2", - "acirc":"\u00E2", - "acute":"\u00B4", - "Acy":"\u0410", - "acy":"\u0430", - "AElig":"\u00C6", - "aelig":"\u00E6", - "af":"\u2061", - "Afr":"\uD835\uDD04", - "afr":"\uD835\uDD1E", - "Agrave":"\u00C0", - "agrave":"\u00E0", - "alefsym":"\u2135", - "aleph":"\u2135", - "Alpha":"\u0391", - "alpha":"\u03B1", - "Amacr":"\u0100", - "amacr":"\u0101", - "amalg":"\u2A3F", - "AMP":"\u0026", - "amp":"\u0026", - "And":"\u2A53", - "and":"\u2227", - "andand":"\u2A55", - "andd":"\u2A5C", - "andslope":"\u2A58", - "andv":"\u2A5A", - "ang":"\u2220", - "ange":"\u29A4", - "angle":"\u2220", - "angmsd":"\u2221", - "angmsdaa":"\u29A8", - "angmsdab":"\u29A9", - "angmsdac":"\u29AA", - "angmsdad":"\u29AB", - "angmsdae":"\u29AC", - "angmsdaf":"\u29AD", - "angmsdag":"\u29AE", - "angmsdah":"\u29AF", - "angrt":"\u221F", - "angrtvb":"\u22BE", - "angrtvbd":"\u299D", - "angsph":"\u2222", - "angst":"\u00C5", - "angzarr":"\u237C", - "Aogon":"\u0104", - "aogon":"\u0105", - "Aopf":"\uD835\uDD38", - "aopf":"\uD835\uDD52", - "ap":"\u2248", - "apacir":"\u2A6F", - "apE":"\u2A70", - "ape":"\u224A", - "apid":"\u224B", - "apos":"\u0027", - "ApplyFunction":"\u2061", - "approx":"\u2248", - "approxeq":"\u224A", - "Aring":"\u00C5", - "aring":"\u00E5", - "Ascr":"\uD835\uDC9C", - "ascr":"\uD835\uDCB6", - "Assign":"\u2254", - "ast":"\u002A", - "asymp":"\u2248", - "asympeq":"\u224D", - "Atilde":"\u00C3", - "atilde":"\u00E3", - "Auml":"\u00C4", - "auml":"\u00E4", - "awconint":"\u2233", - "awint":"\u2A11", - "backcong":"\u224C", - "backepsilon":"\u03F6", - "backprime":"\u2035", - "backsim":"\u223D", - "backsimeq":"\u22CD", - "Backslash":"\u2216", - "Barv":"\u2AE7", - "barvee":"\u22BD", - "Barwed":"\u2306", - "barwed":"\u2305", - "barwedge":"\u2305", - "bbrk":"\u23B5", - "bbrktbrk":"\u23B6", - "bcong":"\u224C", - "Bcy":"\u0411", - "bcy":"\u0431", - "bdquo":"\u201E", - "becaus":"\u2235", - "Because":"\u2235", - "because":"\u2235", - "bemptyv":"\u29B0", - "bepsi":"\u03F6", - "bernou":"\u212C", - "Bernoullis":"\u212C", - "Beta":"\u0392", - "beta":"\u03B2", - "beth":"\u2136", - "between":"\u226C", - "Bfr":"\uD835\uDD05", - "bfr":"\uD835\uDD1F", - "bigcap":"\u22C2", - "bigcirc":"\u25EF", - "bigcup":"\u22C3", - "bigodot":"\u2A00", - "bigoplus":"\u2A01", - "bigotimes":"\u2A02", - "bigsqcup":"\u2A06", - "bigstar":"\u2605", - "bigtriangledown":"\u25BD", - "bigtriangleup":"\u25B3", - "biguplus":"\u2A04", - "bigvee":"\u22C1", - "bigwedge":"\u22C0", - "bkarow":"\u290D", - "blacklozenge":"\u29EB", - "blacksquare":"\u25AA", - "blacktriangle":"\u25B4", - "blacktriangledown":"\u25BE", - "blacktriangleleft":"\u25C2", - "blacktriangleright":"\u25B8", - "blank":"\u2423", - "blk12":"\u2592", - "blk14":"\u2591", - "blk34":"\u2593", - "block":"\u2588", - "bne":"\u003D\u20E5", - "bnequiv":"\u2261\u20E5", - "bNot":"\u2AED", - "bnot":"\u2310", - "Bopf":"\uD835\uDD39", - "bopf":"\uD835\uDD53", - "bot":"\u22A5", - "bottom":"\u22A5", - "bowtie":"\u22C8", - "boxbox":"\u29C9", - "boxDL":"\u2557", - "boxDl":"\u2556", - "boxdL":"\u2555", - "boxdl":"\u2510", - "boxDR":"\u2554", - "boxDr":"\u2553", - "boxdR":"\u2552", - "boxdr":"\u250C", - "boxH":"\u2550", - "boxh":"\u2500", - "boxHD":"\u2566", - "boxHd":"\u2564", - "boxhD":"\u2565", - "boxhd":"\u252C", - "boxHU":"\u2569", - "boxHu":"\u2567", - "boxhU":"\u2568", - "boxhu":"\u2534", - "boxminus":"\u229F", - "boxplus":"\u229E", - "boxtimes":"\u22A0", - "boxUL":"\u255D", - "boxUl":"\u255C", - "boxuL":"\u255B", - "boxul":"\u2518", - "boxUR":"\u255A", - "boxUr":"\u2559", - "boxuR":"\u2558", - "boxur":"\u2514", - "boxV":"\u2551", - "boxv":"\u2502", - "boxVH":"\u256C", - "boxVh":"\u256B", - "boxvH":"\u256A", - "boxvh":"\u253C", - "boxVL":"\u2563", - "boxVl":"\u2562", - "boxvL":"\u2561", - "boxvl":"\u2524", - "boxVR":"\u2560", - "boxVr":"\u255F", - "boxvR":"\u255E", - "boxvr":"\u251C", - "bprime":"\u2035", - "Breve":"\u02D8", - "breve":"\u02D8", - "brvbar":"\u00A6", - "Bscr":"\u212C", - "bscr":"\uD835\uDCB7", - "bsemi":"\u204F", - "bsim":"\u223D", - "bsime":"\u22CD", - "bsol":"\u005C", - "bsolb":"\u29C5", - "bsolhsub":"\u27C8", - "bull":"\u2022", - "bullet":"\u2022", - "bump":"\u224E", - "bumpE":"\u2AAE", - "bumpe":"\u224F", - "Bumpeq":"\u224E", - "bumpeq":"\u224F", - "Cacute":"\u0106", - "cacute":"\u0107", - "Cap":"\u22D2", - "cap":"\u2229", - "capand":"\u2A44", - "capbrcup":"\u2A49", - "capcap":"\u2A4B", - "capcup":"\u2A47", - "capdot":"\u2A40", - "CapitalDifferentialD":"\u2145", - "caps":"\u2229\uFE00", - "caret":"\u2041", - "caron":"\u02C7", - "Cayleys":"\u212D", - "ccaps":"\u2A4D", - "Ccaron":"\u010C", - "ccaron":"\u010D", - "Ccedil":"\u00C7", - "ccedil":"\u00E7", - "Ccirc":"\u0108", - "ccirc":"\u0109", - "Cconint":"\u2230", - "ccups":"\u2A4C", - "ccupssm":"\u2A50", - "Cdot":"\u010A", - "cdot":"\u010B", - "cedil":"\u00B8", - "Cedilla":"\u00B8", - "cemptyv":"\u29B2", - "cent":"\u00A2", - "CenterDot":"\u00B7", - "centerdot":"\u00B7", - "Cfr":"\u212D", - "cfr":"\uD835\uDD20", - "CHcy":"\u0427", - "chcy":"\u0447", - "check":"\u2713", - "checkmark":"\u2713", - "Chi":"\u03A7", - "chi":"\u03C7", - "cir":"\u25CB", - "circ":"\u02C6", - "circeq":"\u2257", - "circlearrowleft":"\u21BA", - "circlearrowright":"\u21BB", - "circledast":"\u229B", - "circledcirc":"\u229A", - "circleddash":"\u229D", - "CircleDot":"\u2299", - "circledR":"\u00AE", - "circledS":"\u24C8", - "CircleMinus":"\u2296", - "CirclePlus":"\u2295", - "CircleTimes":"\u2297", - "cirE":"\u29C3", - "cire":"\u2257", - "cirfnint":"\u2A10", - "cirmid":"\u2AEF", - "cirscir":"\u29C2", - "ClockwiseContourIntegral":"\u2232", - "CloseCurlyDoubleQuote":"\u201D", - "CloseCurlyQuote":"\u2019", - "clubs":"\u2663", - "clubsuit":"\u2663", - "Colon":"\u2237", - "colon":"\u003A", - "Colone":"\u2A74", - "colone":"\u2254", - "coloneq":"\u2254", - "comma":"\u002C", - "commat":"\u0040", - "comp":"\u2201", - "compfn":"\u2218", - "complement":"\u2201", - "complexes":"\u2102", - "cong":"\u2245", - "congdot":"\u2A6D", - "Congruent":"\u2261", - "Conint":"\u222F", - "conint":"\u222E", - "ContourIntegral":"\u222E", - "Copf":"\u2102", - "copf":"\uD835\uDD54", - "coprod":"\u2210", - "Coproduct":"\u2210", - "COPY":"\u00A9", - "copy":"\u00A9", - "copysr":"\u2117", - "CounterClockwiseContourIntegral":"\u2233", - "crarr":"\u21B5", - "Cross":"\u2A2F", - "cross":"\u2717", - "Cscr":"\uD835\uDC9E", - "cscr":"\uD835\uDCB8", - "csub":"\u2ACF", - "csube":"\u2AD1", - "csup":"\u2AD0", - "csupe":"\u2AD2", - "ctdot":"\u22EF", - "cudarrl":"\u2938", - "cudarrr":"\u2935", - "cuepr":"\u22DE", - "cuesc":"\u22DF", - "cularr":"\u21B6", - "cularrp":"\u293D", - "Cup":"\u22D3", - "cup":"\u222A", - "cupbrcap":"\u2A48", - "CupCap":"\u224D", - "cupcap":"\u2A46", - "cupcup":"\u2A4A", - "cupdot":"\u228D", - "cupor":"\u2A45", - "cups":"\u222A\uFE00", - "curarr":"\u21B7", - "curarrm":"\u293C", - "curlyeqprec":"\u22DE", - "curlyeqsucc":"\u22DF", - "curlyvee":"\u22CE", - "curlywedge":"\u22CF", - "curren":"\u00A4", - "curvearrowleft":"\u21B6", - "curvearrowright":"\u21B7", - "cuvee":"\u22CE", - "cuwed":"\u22CF", - "cwconint":"\u2232", - "cwint":"\u2231", - "cylcty":"\u232D", - "Dagger":"\u2021", - "dagger":"\u2020", - "daleth":"\u2138", - "Darr":"\u21A1", - "dArr":"\u21D3", - "darr":"\u2193", - "dash":"\u2010", - "Dashv":"\u2AE4", - "dashv":"\u22A3", - "dbkarow":"\u290F", - "dblac":"\u02DD", - "Dcaron":"\u010E", - "dcaron":"\u010F", - "Dcy":"\u0414", - "dcy":"\u0434", - "DD":"\u2145", - "dd":"\u2146", - "ddagger":"\u2021", - "ddarr":"\u21CA", - "DDotrahd":"\u2911", - "ddotseq":"\u2A77", - "deg":"\u00B0", - "Del":"\u2207", - "Delta":"\u0394", - "delta":"\u03B4", - "demptyv":"\u29B1", - "dfisht":"\u297F", - "Dfr":"\uD835\uDD07", - "dfr":"\uD835\uDD21", - "dHar":"\u2965", - "dharl":"\u21C3", - "dharr":"\u21C2", - "DiacriticalAcute":"\u00B4", - "DiacriticalDot":"\u02D9", - "DiacriticalDoubleAcute":"\u02DD", - "DiacriticalGrave":"\u0060", - "DiacriticalTilde":"\u02DC", - "diam":"\u22C4", - "Diamond":"\u22C4", - "diamond":"\u22C4", - "diamondsuit":"\u2666", - "diams":"\u2666", - "die":"\u00A8", - "DifferentialD":"\u2146", - "digamma":"\u03DD", - "disin":"\u22F2", - "div":"\u00F7", - "divide":"\u00F7", - "divideontimes":"\u22C7", - "divonx":"\u22C7", - "DJcy":"\u0402", - "djcy":"\u0452", - "dlcorn":"\u231E", - "dlcrop":"\u230D", - "dollar":"\u0024", - "Dopf":"\uD835\uDD3B", - "dopf":"\uD835\uDD55", - "Dot":"\u00A8", - "dot":"\u02D9", - "DotDot":"\u20DC", - "doteq":"\u2250", - "doteqdot":"\u2251", - "DotEqual":"\u2250", - "dotminus":"\u2238", - "dotplus":"\u2214", - "dotsquare":"\u22A1", - "doublebarwedge":"\u2306", - "DoubleContourIntegral":"\u222F", - "DoubleDot":"\u00A8", - "DoubleDownArrow":"\u21D3", - "DoubleLeftArrow":"\u21D0", - "DoubleLeftRightArrow":"\u21D4", - "DoubleLeftTee":"\u2AE4", - "DoubleLongLeftArrow":"\u27F8", - "DoubleLongLeftRightArrow":"\u27FA", - "DoubleLongRightArrow":"\u27F9", - "DoubleRightArrow":"\u21D2", - "DoubleRightTee":"\u22A8", - "DoubleUpArrow":"\u21D1", - "DoubleUpDownArrow":"\u21D5", - "DoubleVerticalBar":"\u2225", - "DownArrow":"\u2193", - "Downarrow":"\u21D3", - "downarrow":"\u2193", - "DownArrowBar":"\u2913", - "DownArrowUpArrow":"\u21F5", - "DownBreve":"\u0311", - "downdownarrows":"\u21CA", - "downharpoonleft":"\u21C3", - "downharpoonright":"\u21C2", - "DownLeftRightVector":"\u2950", - "DownLeftTeeVector":"\u295E", - "DownLeftVector":"\u21BD", - "DownLeftVectorBar":"\u2956", - "DownRightTeeVector":"\u295F", - "DownRightVector":"\u21C1", - "DownRightVectorBar":"\u2957", - "DownTee":"\u22A4", - "DownTeeArrow":"\u21A7", - "drbkarow":"\u2910", - "drcorn":"\u231F", - "drcrop":"\u230C", - "Dscr":"\uD835\uDC9F", - "dscr":"\uD835\uDCB9", - "DScy":"\u0405", - "dscy":"\u0455", - "dsol":"\u29F6", - "Dstrok":"\u0110", - "dstrok":"\u0111", - "dtdot":"\u22F1", - "dtri":"\u25BF", - "dtrif":"\u25BE", - "duarr":"\u21F5", - "duhar":"\u296F", - "dwangle":"\u29A6", - "DZcy":"\u040F", - "dzcy":"\u045F", - "dzigrarr":"\u27FF", - "Eacute":"\u00C9", - "eacute":"\u00E9", - "easter":"\u2A6E", - "Ecaron":"\u011A", - "ecaron":"\u011B", - "ecir":"\u2256", - "Ecirc":"\u00CA", - "ecirc":"\u00EA", - "ecolon":"\u2255", - "Ecy":"\u042D", - "ecy":"\u044D", - "eDDot":"\u2A77", - "Edot":"\u0116", - "eDot":"\u2251", - "edot":"\u0117", - "ee":"\u2147", - "efDot":"\u2252", - "Efr":"\uD835\uDD08", - "efr":"\uD835\uDD22", - "eg":"\u2A9A", - "Egrave":"\u00C8", - "egrave":"\u00E8", - "egs":"\u2A96", - "egsdot":"\u2A98", - "el":"\u2A99", - "Element":"\u2208", - "elinters":"\u23E7", - "ell":"\u2113", - "els":"\u2A95", - "elsdot":"\u2A97", - "Emacr":"\u0112", - "emacr":"\u0113", - "empty":"\u2205", - "emptyset":"\u2205", - "EmptySmallSquare":"\u25FB", - "emptyv":"\u2205", - "EmptyVerySmallSquare":"\u25AB", - "emsp":"\u2003", - "emsp13":"\u2004", - "emsp14":"\u2005", - "ENG":"\u014A", - "eng":"\u014B", - "ensp":"\u2002", - "Eogon":"\u0118", - "eogon":"\u0119", - "Eopf":"\uD835\uDD3C", - "eopf":"\uD835\uDD56", - "epar":"\u22D5", - "eparsl":"\u29E3", - "eplus":"\u2A71", - "epsi":"\u03B5", - "Epsilon":"\u0395", - "epsilon":"\u03B5", - "epsiv":"\u03F5", - "eqcirc":"\u2256", - "eqcolon":"\u2255", - "eqsim":"\u2242", - "eqslantgtr":"\u2A96", - "eqslantless":"\u2A95", - "Equal":"\u2A75", - "equals":"\u003D", - "EqualTilde":"\u2242", - "equest":"\u225F", - "Equilibrium":"\u21CC", - "equiv":"\u2261", - "equivDD":"\u2A78", - "eqvparsl":"\u29E5", - "erarr":"\u2971", - "erDot":"\u2253", - "Escr":"\u2130", - "escr":"\u212F", - "esdot":"\u2250", - "Esim":"\u2A73", - "esim":"\u2242", - "Eta":"\u0397", - "eta":"\u03B7", - "ETH":"\u00D0", - "eth":"\u00F0", - "Euml":"\u00CB", - "euml":"\u00EB", - "euro":"\u20AC", - "excl":"\u0021", - "exist":"\u2203", - "Exists":"\u2203", - "expectation":"\u2130", - "ExponentialE":"\u2147", - "exponentiale":"\u2147", - "fallingdotseq":"\u2252", - "Fcy":"\u0424", - "fcy":"\u0444", - "female":"\u2640", - "ffilig":"\uFB03", - "fflig":"\uFB00", - "ffllig":"\uFB04", - "Ffr":"\uD835\uDD09", - "ffr":"\uD835\uDD23", - "filig":"\uFB01", - "FilledSmallSquare":"\u25FC", - "FilledVerySmallSquare":"\u25AA", - "fjlig":"\u0066\u006A", - "flat":"\u266D", - "fllig":"\uFB02", - "fltns":"\u25B1", - "fnof":"\u0192", - "Fopf":"\uD835\uDD3D", - "fopf":"\uD835\uDD57", - "ForAll":"\u2200", - "forall":"\u2200", - "fork":"\u22D4", - "forkv":"\u2AD9", - "Fouriertrf":"\u2131", - "fpartint":"\u2A0D", - "frac12":"\u00BD", - "frac13":"\u2153", - "frac14":"\u00BC", - "frac15":"\u2155", - "frac16":"\u2159", - "frac18":"\u215B", - "frac23":"\u2154", - "frac25":"\u2156", - "frac34":"\u00BE", - "frac35":"\u2157", - "frac38":"\u215C", - "frac45":"\u2158", - "frac56":"\u215A", - "frac58":"\u215D", - "frac78":"\u215E", - "frasl":"\u2044", - "frown":"\u2322", - "Fscr":"\u2131", - "fscr":"\uD835\uDCBB", - "gacute":"\u01F5", - "Gamma":"\u0393", - "gamma":"\u03B3", - "Gammad":"\u03DC", - "gammad":"\u03DD", - "gap":"\u2A86", - "Gbreve":"\u011E", - "gbreve":"\u011F", - "Gcedil":"\u0122", - "Gcirc":"\u011C", - "gcirc":"\u011D", - "Gcy":"\u0413", - "gcy":"\u0433", - "Gdot":"\u0120", - "gdot":"\u0121", - "gE":"\u2267", - "ge":"\u2265", - "gEl":"\u2A8C", - "gel":"\u22DB", - "geq":"\u2265", - "geqq":"\u2267", - "geqslant":"\u2A7E", - "ges":"\u2A7E", - "gescc":"\u2AA9", - "gesdot":"\u2A80", - "gesdoto":"\u2A82", - "gesdotol":"\u2A84", - "gesl":"\u22DB\uFE00", - "gesles":"\u2A94", - "Gfr":"\uD835\uDD0A", - "gfr":"\uD835\uDD24", - "Gg":"\u22D9", - "gg":"\u226B", - "ggg":"\u22D9", - "gimel":"\u2137", - "GJcy":"\u0403", - "gjcy":"\u0453", - "gl":"\u2277", - "gla":"\u2AA5", - "glE":"\u2A92", - "glj":"\u2AA4", - "gnap":"\u2A8A", - "gnapprox":"\u2A8A", - "gnE":"\u2269", - "gne":"\u2A88", - "gneq":"\u2A88", - "gneqq":"\u2269", - "gnsim":"\u22E7", - "Gopf":"\uD835\uDD3E", - "gopf":"\uD835\uDD58", - "grave":"\u0060", - "GreaterEqual":"\u2265", - "GreaterEqualLess":"\u22DB", - "GreaterFullEqual":"\u2267", - "GreaterGreater":"\u2AA2", - "GreaterLess":"\u2277", - "GreaterSlantEqual":"\u2A7E", - "GreaterTilde":"\u2273", - "Gscr":"\uD835\uDCA2", - "gscr":"\u210A", - "gsim":"\u2273", - "gsime":"\u2A8E", - "gsiml":"\u2A90", - "GT":"\u003E", - "Gt":"\u226B", - "gt":"\u003E", - "gtcc":"\u2AA7", - "gtcir":"\u2A7A", - "gtdot":"\u22D7", - "gtlPar":"\u2995", - "gtquest":"\u2A7C", - "gtrapprox":"\u2A86", - "gtrarr":"\u2978", - "gtrdot":"\u22D7", - "gtreqless":"\u22DB", - "gtreqqless":"\u2A8C", - "gtrless":"\u2277", - "gtrsim":"\u2273", - "gvertneqq":"\u2269\uFE00", - "gvnE":"\u2269\uFE00", - "Hacek":"\u02C7", - "hairsp":"\u200A", - "half":"\u00BD", - "hamilt":"\u210B", - "HARDcy":"\u042A", - "hardcy":"\u044A", - "hArr":"\u21D4", - "harr":"\u2194", - "harrcir":"\u2948", - "harrw":"\u21AD", - "Hat":"\u005E", - "hbar":"\u210F", - "Hcirc":"\u0124", - "hcirc":"\u0125", - "hearts":"\u2665", - "heartsuit":"\u2665", - "hellip":"\u2026", - "hercon":"\u22B9", - "Hfr":"\u210C", - "hfr":"\uD835\uDD25", - "HilbertSpace":"\u210B", - "hksearow":"\u2925", - "hkswarow":"\u2926", - "hoarr":"\u21FF", - "homtht":"\u223B", - "hookleftarrow":"\u21A9", - "hookrightarrow":"\u21AA", - "Hopf":"\u210D", - "hopf":"\uD835\uDD59", - "horbar":"\u2015", - "HorizontalLine":"\u2500", - "Hscr":"\u210B", - "hscr":"\uD835\uDCBD", - "hslash":"\u210F", - "Hstrok":"\u0126", - "hstrok":"\u0127", - "HumpDownHump":"\u224E", - "HumpEqual":"\u224F", - "hybull":"\u2043", - "hyphen":"\u2010", - "Iacute":"\u00CD", - "iacute":"\u00ED", - "ic":"\u2063", - "Icirc":"\u00CE", - "icirc":"\u00EE", - "Icy":"\u0418", - "icy":"\u0438", - "Idot":"\u0130", - "IEcy":"\u0415", - "iecy":"\u0435", - "iexcl":"\u00A1", - "iff":"\u21D4", - "Ifr":"\u2111", - "ifr":"\uD835\uDD26", - "Igrave":"\u00CC", - "igrave":"\u00EC", - "ii":"\u2148", - "iiiint":"\u2A0C", - "iiint":"\u222D", - "iinfin":"\u29DC", - "iiota":"\u2129", - "IJlig":"\u0132", - "ijlig":"\u0133", - "Im":"\u2111", - "Imacr":"\u012A", - "imacr":"\u012B", - "image":"\u2111", - "ImaginaryI":"\u2148", - "imagline":"\u2110", - "imagpart":"\u2111", - "imath":"\u0131", - "imof":"\u22B7", - "imped":"\u01B5", - "Implies":"\u21D2", - "in":"\u2208", - "incare":"\u2105", - "infin":"\u221E", - "infintie":"\u29DD", - "inodot":"\u0131", - "Int":"\u222C", - "int":"\u222B", - "intcal":"\u22BA", - "integers":"\u2124", - "Integral":"\u222B", - "intercal":"\u22BA", - "Intersection":"\u22C2", - "intlarhk":"\u2A17", - "intprod":"\u2A3C", - "InvisibleComma":"\u2063", - "InvisibleTimes":"\u2062", - "IOcy":"\u0401", - "iocy":"\u0451", - "Iogon":"\u012E", - "iogon":"\u012F", - "Iopf":"\uD835\uDD40", - "iopf":"\uD835\uDD5A", - "Iota":"\u0399", - "iota":"\u03B9", - "iprod":"\u2A3C", - "iquest":"\u00BF", - "Iscr":"\u2110", - "iscr":"\uD835\uDCBE", - "isin":"\u2208", - "isindot":"\u22F5", - "isinE":"\u22F9", - "isins":"\u22F4", - "isinsv":"\u22F3", - "isinv":"\u2208", - "it":"\u2062", - "Itilde":"\u0128", - "itilde":"\u0129", - "Iukcy":"\u0406", - "iukcy":"\u0456", - "Iuml":"\u00CF", - "iuml":"\u00EF", - "Jcirc":"\u0134", - "jcirc":"\u0135", - "Jcy":"\u0419", - "jcy":"\u0439", - "Jfr":"\uD835\uDD0D", - "jfr":"\uD835\uDD27", - "jmath":"\u0237", - "Jopf":"\uD835\uDD41", - "jopf":"\uD835\uDD5B", - "Jscr":"\uD835\uDCA5", - "jscr":"\uD835\uDCBF", - "Jsercy":"\u0408", - "jsercy":"\u0458", - "Jukcy":"\u0404", - "jukcy":"\u0454", - "Kappa":"\u039A", - "kappa":"\u03BA", - "kappav":"\u03F0", - "Kcedil":"\u0136", - "kcedil":"\u0137", - "Kcy":"\u041A", - "kcy":"\u043A", - "Kfr":"\uD835\uDD0E", - "kfr":"\uD835\uDD28", - "kgreen":"\u0138", - "KHcy":"\u0425", - "khcy":"\u0445", - "KJcy":"\u040C", - "kjcy":"\u045C", - "Kopf":"\uD835\uDD42", - "kopf":"\uD835\uDD5C", - "Kscr":"\uD835\uDCA6", - "kscr":"\uD835\uDCC0", - "lAarr":"\u21DA", - "Lacute":"\u0139", - "lacute":"\u013A", - "laemptyv":"\u29B4", - "lagran":"\u2112", - "Lambda":"\u039B", - "lambda":"\u03BB", - "Lang":"\u27EA", - "lang":"\u27E8", - "langd":"\u2991", - "langle":"\u27E8", - "lap":"\u2A85", - "Laplacetrf":"\u2112", - "laquo":"\u00AB", - "Larr":"\u219E", - "lArr":"\u21D0", - "larr":"\u2190", - "larrb":"\u21E4", - "larrbfs":"\u291F", - "larrfs":"\u291D", - "larrhk":"\u21A9", - "larrlp":"\u21AB", - "larrpl":"\u2939", - "larrsim":"\u2973", - "larrtl":"\u21A2", - "lat":"\u2AAB", - "lAtail":"\u291B", - "latail":"\u2919", - "late":"\u2AAD", - "lates":"\u2AAD\uFE00", - "lBarr":"\u290E", - "lbarr":"\u290C", - "lbbrk":"\u2772", - "lbrace":"\u007B", - "lbrack":"\u005B", - "lbrke":"\u298B", - "lbrksld":"\u298F", - "lbrkslu":"\u298D", - "Lcaron":"\u013D", - "lcaron":"\u013E", - "Lcedil":"\u013B", - "lcedil":"\u013C", - "lceil":"\u2308", - "lcub":"\u007B", - "Lcy":"\u041B", - "lcy":"\u043B", - "ldca":"\u2936", - "ldquo":"\u201C", - "ldquor":"\u201E", - "ldrdhar":"\u2967", - "ldrushar":"\u294B", - "ldsh":"\u21B2", - "lE":"\u2266", - "le":"\u2264", - "LeftAngleBracket":"\u27E8", - "LeftArrow":"\u2190", - "Leftarrow":"\u21D0", - "leftarrow":"\u2190", - "LeftArrowBar":"\u21E4", - "LeftArrowRightArrow":"\u21C6", - "leftarrowtail":"\u21A2", - "LeftCeiling":"\u2308", - "LeftDoubleBracket":"\u27E6", - "LeftDownTeeVector":"\u2961", - "LeftDownVector":"\u21C3", - "LeftDownVectorBar":"\u2959", - "LeftFloor":"\u230A", - "leftharpoondown":"\u21BD", - "leftharpoonup":"\u21BC", - "leftleftarrows":"\u21C7", - "LeftRightArrow":"\u2194", - "Leftrightarrow":"\u21D4", - "leftrightarrow":"\u2194", - "leftrightarrows":"\u21C6", - "leftrightharpoons":"\u21CB", - "leftrightsquigarrow":"\u21AD", - "LeftRightVector":"\u294E", - "LeftTee":"\u22A3", - "LeftTeeArrow":"\u21A4", - "LeftTeeVector":"\u295A", - "leftthreetimes":"\u22CB", - "LeftTriangle":"\u22B2", - "LeftTriangleBar":"\u29CF", - "LeftTriangleEqual":"\u22B4", - "LeftUpDownVector":"\u2951", - "LeftUpTeeVector":"\u2960", - "LeftUpVector":"\u21BF", - "LeftUpVectorBar":"\u2958", - "LeftVector":"\u21BC", - "LeftVectorBar":"\u2952", - "lEg":"\u2A8B", - "leg":"\u22DA", - "leq":"\u2264", - "leqq":"\u2266", - "leqslant":"\u2A7D", - "les":"\u2A7D", - "lescc":"\u2AA8", - "lesdot":"\u2A7F", - "lesdoto":"\u2A81", - "lesdotor":"\u2A83", - "lesg":"\u22DA\uFE00", - "lesges":"\u2A93", - "lessapprox":"\u2A85", - "lessdot":"\u22D6", - "lesseqgtr":"\u22DA", - "lesseqqgtr":"\u2A8B", - "LessEqualGreater":"\u22DA", - "LessFullEqual":"\u2266", - "LessGreater":"\u2276", - "lessgtr":"\u2276", - "LessLess":"\u2AA1", - "lesssim":"\u2272", - "LessSlantEqual":"\u2A7D", - "LessTilde":"\u2272", - "lfisht":"\u297C", - "lfloor":"\u230A", - "Lfr":"\uD835\uDD0F", - "lfr":"\uD835\uDD29", - "lg":"\u2276", - "lgE":"\u2A91", - "lHar":"\u2962", - "lhard":"\u21BD", - "lharu":"\u21BC", - "lharul":"\u296A", - "lhblk":"\u2584", - "LJcy":"\u0409", - "ljcy":"\u0459", - "Ll":"\u22D8", - "ll":"\u226A", - "llarr":"\u21C7", - "llcorner":"\u231E", - "Lleftarrow":"\u21DA", - "llhard":"\u296B", - "lltri":"\u25FA", - "Lmidot":"\u013F", - "lmidot":"\u0140", - "lmoust":"\u23B0", - "lmoustache":"\u23B0", - "lnap":"\u2A89", - "lnapprox":"\u2A89", - "lnE":"\u2268", - "lne":"\u2A87", - "lneq":"\u2A87", - "lneqq":"\u2268", - "lnsim":"\u22E6", - "loang":"\u27EC", - "loarr":"\u21FD", - "lobrk":"\u27E6", - "LongLeftArrow":"\u27F5", - "Longleftarrow":"\u27F8", - "longleftarrow":"\u27F5", - "LongLeftRightArrow":"\u27F7", - "Longleftrightarrow":"\u27FA", - "longleftrightarrow":"\u27F7", - "longmapsto":"\u27FC", - "LongRightArrow":"\u27F6", - "Longrightarrow":"\u27F9", - "longrightarrow":"\u27F6", - "looparrowleft":"\u21AB", - "looparrowright":"\u21AC", - "lopar":"\u2985", - "Lopf":"\uD835\uDD43", - "lopf":"\uD835\uDD5D", - "loplus":"\u2A2D", - "lotimes":"\u2A34", - "lowast":"\u2217", - "lowbar":"\u005F", - "LowerLeftArrow":"\u2199", - "LowerRightArrow":"\u2198", - "loz":"\u25CA", - "lozenge":"\u25CA", - "lozf":"\u29EB", - "lpar":"\u0028", - "lparlt":"\u2993", - "lrarr":"\u21C6", - "lrcorner":"\u231F", - "lrhar":"\u21CB", - "lrhard":"\u296D", - "lrm":"\u200E", - "lrtri":"\u22BF", - "lsaquo":"\u2039", - "Lscr":"\u2112", - "lscr":"\uD835\uDCC1", - "Lsh":"\u21B0", - "lsh":"\u21B0", - "lsim":"\u2272", - "lsime":"\u2A8D", - "lsimg":"\u2A8F", - "lsqb":"\u005B", - "lsquo":"\u2018", - "lsquor":"\u201A", - "Lstrok":"\u0141", - "lstrok":"\u0142", - "LT":"\u003C", - "Lt":"\u226A", - "lt":"\u003C", - "ltcc":"\u2AA6", - "ltcir":"\u2A79", - "ltdot":"\u22D6", - "lthree":"\u22CB", - "ltimes":"\u22C9", - "ltlarr":"\u2976", - "ltquest":"\u2A7B", - "ltri":"\u25C3", - "ltrie":"\u22B4", - "ltrif":"\u25C2", - "ltrPar":"\u2996", - "lurdshar":"\u294A", - "luruhar":"\u2966", - "lvertneqq":"\u2268\uFE00", - "lvnE":"\u2268\uFE00", - "macr":"\u00AF", - "male":"\u2642", - "malt":"\u2720", - "maltese":"\u2720", - "Map":"\u2905", - "map":"\u21A6", - "mapsto":"\u21A6", - "mapstodown":"\u21A7", - "mapstoleft":"\u21A4", - "mapstoup":"\u21A5", - "marker":"\u25AE", - "mcomma":"\u2A29", - "Mcy":"\u041C", - "mcy":"\u043C", - "mdash":"\u2014", - "mDDot":"\u223A", - "measuredangle":"\u2221", - "MediumSpace":"\u205F", - "Mellintrf":"\u2133", - "Mfr":"\uD835\uDD10", - "mfr":"\uD835\uDD2A", - "mho":"\u2127", - "micro":"\u00B5", - "mid":"\u2223", - "midast":"\u002A", - "midcir":"\u2AF0", - "middot":"\u00B7", - "minus":"\u2212", - "minusb":"\u229F", - "minusd":"\u2238", - "minusdu":"\u2A2A", - "MinusPlus":"\u2213", - "mlcp":"\u2ADB", - "mldr":"\u2026", - "mnplus":"\u2213", - "models":"\u22A7", - "Mopf":"\uD835\uDD44", - "mopf":"\uD835\uDD5E", - "mp":"\u2213", - "Mscr":"\u2133", - "mscr":"\uD835\uDCC2", - "mstpos":"\u223E", - "Mu":"\u039C", - "mu":"\u03BC", - "multimap":"\u22B8", - "mumap":"\u22B8", - "nabla":"\u2207", - "Nacute":"\u0143", - "nacute":"\u0144", - "nang":"\u2220\u20D2", - "nap":"\u2249", - "napE":"\u2A70\u0338", - "napid":"\u224B\u0338", - "napos":"\u0149", - "napprox":"\u2249", - "natur":"\u266E", - "natural":"\u266E", - "naturals":"\u2115", - "nbsp":"\u00A0", - "nbump":"\u224E\u0338", - "nbumpe":"\u224F\u0338", - "ncap":"\u2A43", - "Ncaron":"\u0147", - "ncaron":"\u0148", - "Ncedil":"\u0145", - "ncedil":"\u0146", - "ncong":"\u2247", - "ncongdot":"\u2A6D\u0338", - "ncup":"\u2A42", - "Ncy":"\u041D", - "ncy":"\u043D", - "ndash":"\u2013", - "ne":"\u2260", - "nearhk":"\u2924", - "neArr":"\u21D7", - "nearr":"\u2197", - "nearrow":"\u2197", - "nedot":"\u2250\u0338", - "NegativeMediumSpace":"\u200B", - "NegativeThickSpace":"\u200B", - "NegativeThinSpace":"\u200B", - "NegativeVeryThinSpace":"\u200B", - "nequiv":"\u2262", - "nesear":"\u2928", - "nesim":"\u2242\u0338", - "NestedGreaterGreater":"\u226B", - "NestedLessLess":"\u226A", - "NewLine":"\u000A", - "nexist":"\u2204", - "nexists":"\u2204", - "Nfr":"\uD835\uDD11", - "nfr":"\uD835\uDD2B", - "ngE":"\u2267\u0338", - "nge":"\u2271", - "ngeq":"\u2271", - "ngeqq":"\u2267\u0338", - "ngeqslant":"\u2A7E\u0338", - "nges":"\u2A7E\u0338", - "nGg":"\u22D9\u0338", - "ngsim":"\u2275", - "nGt":"\u226B\u20D2", - "ngt":"\u226F", - "ngtr":"\u226F", - "nGtv":"\u226B\u0338", - "nhArr":"\u21CE", - "nharr":"\u21AE", - "nhpar":"\u2AF2", - "ni":"\u220B", - "nis":"\u22FC", - "nisd":"\u22FA", - "niv":"\u220B", - "NJcy":"\u040A", - "njcy":"\u045A", - "nlArr":"\u21CD", - "nlarr":"\u219A", - "nldr":"\u2025", - "nlE":"\u2266\u0338", - "nle":"\u2270", - "nLeftarrow":"\u21CD", - "nleftarrow":"\u219A", - "nLeftrightarrow":"\u21CE", - "nleftrightarrow":"\u21AE", - "nleq":"\u2270", - "nleqq":"\u2266\u0338", - "nleqslant":"\u2A7D\u0338", - "nles":"\u2A7D\u0338", - "nless":"\u226E", - "nLl":"\u22D8\u0338", - "nlsim":"\u2274", - "nLt":"\u226A\u20D2", - "nlt":"\u226E", - "nltri":"\u22EA", - "nltrie":"\u22EC", - "nLtv":"\u226A\u0338", - "nmid":"\u2224", - "NoBreak":"\u2060", - "NonBreakingSpace":"\u00A0", - "Nopf":"\u2115", - "nopf":"\uD835\uDD5F", - "Not":"\u2AEC", - "not":"\u00AC", - "NotCongruent":"\u2262", - "NotCupCap":"\u226D", - "NotDoubleVerticalBar":"\u2226", - "NotElement":"\u2209", - "NotEqual":"\u2260", - "NotEqualTilde":"\u2242\u0338", - "NotExists":"\u2204", - "NotGreater":"\u226F", - "NotGreaterEqual":"\u2271", - "NotGreaterFullEqual":"\u2267\u0338", - "NotGreaterGreater":"\u226B\u0338", - "NotGreaterLess":"\u2279", - "NotGreaterSlantEqual":"\u2A7E\u0338", - "NotGreaterTilde":"\u2275", - "NotHumpDownHump":"\u224E\u0338", - "NotHumpEqual":"\u224F\u0338", - "notin":"\u2209", - "notindot":"\u22F5\u0338", - "notinE":"\u22F9\u0338", - "notinva":"\u2209", - "notinvb":"\u22F7", - "notinvc":"\u22F6", - "NotLeftTriangle":"\u22EA", - "NotLeftTriangleBar":"\u29CF\u0338", - "NotLeftTriangleEqual":"\u22EC", - "NotLess":"\u226E", - "NotLessEqual":"\u2270", - "NotLessGreater":"\u2278", - "NotLessLess":"\u226A\u0338", - "NotLessSlantEqual":"\u2A7D\u0338", - "NotLessTilde":"\u2274", - "NotNestedGreaterGreater":"\u2AA2\u0338", - "NotNestedLessLess":"\u2AA1\u0338", - "notni":"\u220C", - "notniva":"\u220C", - "notnivb":"\u22FE", - "notnivc":"\u22FD", - "NotPrecedes":"\u2280", - "NotPrecedesEqual":"\u2AAF\u0338", - "NotPrecedesSlantEqual":"\u22E0", - "NotReverseElement":"\u220C", - "NotRightTriangle":"\u22EB", - "NotRightTriangleBar":"\u29D0\u0338", - "NotRightTriangleEqual":"\u22ED", - "NotSquareSubset":"\u228F\u0338", - "NotSquareSubsetEqual":"\u22E2", - "NotSquareSuperset":"\u2290\u0338", - "NotSquareSupersetEqual":"\u22E3", - "NotSubset":"\u2282\u20D2", - "NotSubsetEqual":"\u2288", - "NotSucceeds":"\u2281", - "NotSucceedsEqual":"\u2AB0\u0338", - "NotSucceedsSlantEqual":"\u22E1", - "NotSucceedsTilde":"\u227F\u0338", - "NotSuperset":"\u2283\u20D2", - "NotSupersetEqual":"\u2289", - "NotTilde":"\u2241", - "NotTildeEqual":"\u2244", - "NotTildeFullEqual":"\u2247", - "NotTildeTilde":"\u2249", - "NotVerticalBar":"\u2224", - "npar":"\u2226", - "nparallel":"\u2226", - "nparsl":"\u2AFD\u20E5", - "npart":"\u2202\u0338", - "npolint":"\u2A14", - "npr":"\u2280", - "nprcue":"\u22E0", - "npre":"\u2AAF\u0338", - "nprec":"\u2280", - "npreceq":"\u2AAF\u0338", - "nrArr":"\u21CF", - "nrarr":"\u219B", - "nrarrc":"\u2933\u0338", - "nrarrw":"\u219D\u0338", - "nRightarrow":"\u21CF", - "nrightarrow":"\u219B", - "nrtri":"\u22EB", - "nrtrie":"\u22ED", - "nsc":"\u2281", - "nsccue":"\u22E1", - "nsce":"\u2AB0\u0338", - "Nscr":"\uD835\uDCA9", - "nscr":"\uD835\uDCC3", - "nshortmid":"\u2224", - "nshortparallel":"\u2226", - "nsim":"\u2241", - "nsime":"\u2244", - "nsimeq":"\u2244", - "nsmid":"\u2224", - "nspar":"\u2226", - "nsqsube":"\u22E2", - "nsqsupe":"\u22E3", - "nsub":"\u2284", - "nsubE":"\u2AC5\u0338", - "nsube":"\u2288", - "nsubset":"\u2282\u20D2", - "nsubseteq":"\u2288", - "nsubseteqq":"\u2AC5\u0338", - "nsucc":"\u2281", - "nsucceq":"\u2AB0\u0338", - "nsup":"\u2285", - "nsupE":"\u2AC6\u0338", - "nsupe":"\u2289", - "nsupset":"\u2283\u20D2", - "nsupseteq":"\u2289", - "nsupseteqq":"\u2AC6\u0338", - "ntgl":"\u2279", - "Ntilde":"\u00D1", - "ntilde":"\u00F1", - "ntlg":"\u2278", - "ntriangleleft":"\u22EA", - "ntrianglelefteq":"\u22EC", - "ntriangleright":"\u22EB", - "ntrianglerighteq":"\u22ED", - "Nu":"\u039D", - "nu":"\u03BD", - "num":"\u0023", - "numero":"\u2116", - "numsp":"\u2007", - "nvap":"\u224D\u20D2", - "nVDash":"\u22AF", - "nVdash":"\u22AE", - "nvDash":"\u22AD", - "nvdash":"\u22AC", - "nvge":"\u2265\u20D2", - "nvgt":"\u003E\u20D2", - "nvHarr":"\u2904", - "nvinfin":"\u29DE", - "nvlArr":"\u2902", - "nvle":"\u2264\u20D2", - "nvlt":"\u003C\u20D2", - "nvltrie":"\u22B4\u20D2", - "nvrArr":"\u2903", - "nvrtrie":"\u22B5\u20D2", - "nvsim":"\u223C\u20D2", - "nwarhk":"\u2923", - "nwArr":"\u21D6", - "nwarr":"\u2196", - "nwarrow":"\u2196", - "nwnear":"\u2927", - "Oacute":"\u00D3", - "oacute":"\u00F3", - "oast":"\u229B", - "ocir":"\u229A", - "Ocirc":"\u00D4", - "ocirc":"\u00F4", - "Ocy":"\u041E", - "ocy":"\u043E", - "odash":"\u229D", - "Odblac":"\u0150", - "odblac":"\u0151", - "odiv":"\u2A38", - "odot":"\u2299", - "odsold":"\u29BC", - "OElig":"\u0152", - "oelig":"\u0153", - "ofcir":"\u29BF", - "Ofr":"\uD835\uDD12", - "ofr":"\uD835\uDD2C", - "ogon":"\u02DB", - "Ograve":"\u00D2", - "ograve":"\u00F2", - "ogt":"\u29C1", - "ohbar":"\u29B5", - "ohm":"\u03A9", - "oint":"\u222E", - "olarr":"\u21BA", - "olcir":"\u29BE", - "olcross":"\u29BB", - "oline":"\u203E", - "olt":"\u29C0", - "Omacr":"\u014C", - "omacr":"\u014D", - "Omega":"\u03A9", - "omega":"\u03C9", - "Omicron":"\u039F", - "omicron":"\u03BF", - "omid":"\u29B6", - "ominus":"\u2296", - "Oopf":"\uD835\uDD46", - "oopf":"\uD835\uDD60", - "opar":"\u29B7", - "OpenCurlyDoubleQuote":"\u201C", - "OpenCurlyQuote":"\u2018", - "operp":"\u29B9", - "oplus":"\u2295", - "Or":"\u2A54", - "or":"\u2228", - "orarr":"\u21BB", - "ord":"\u2A5D", - "order":"\u2134", - "orderof":"\u2134", - "ordf":"\u00AA", - "ordm":"\u00BA", - "origof":"\u22B6", - "oror":"\u2A56", - "orslope":"\u2A57", - "orv":"\u2A5B", - "oS":"\u24C8", - "Oscr":"\uD835\uDCAA", - "oscr":"\u2134", - "Oslash":"\u00D8", - "oslash":"\u00F8", - "osol":"\u2298", - "Otilde":"\u00D5", - "otilde":"\u00F5", - "Otimes":"\u2A37", - "otimes":"\u2297", - "otimesas":"\u2A36", - "Ouml":"\u00D6", - "ouml":"\u00F6", - "ovbar":"\u233D", - "OverBar":"\u203E", - "OverBrace":"\u23DE", - "OverBracket":"\u23B4", - "OverParenthesis":"\u23DC", - "par":"\u2225", - "para":"\u00B6", - "parallel":"\u2225", - "parsim":"\u2AF3", - "parsl":"\u2AFD", - "part":"\u2202", - "PartialD":"\u2202", - "Pcy":"\u041F", - "pcy":"\u043F", - "percnt":"\u0025", - "period":"\u002E", - "permil":"\u2030", - "perp":"\u22A5", - "pertenk":"\u2031", - "Pfr":"\uD835\uDD13", - "pfr":"\uD835\uDD2D", - "Phi":"\u03A6", - "phi":"\u03C6", - "phiv":"\u03D5", - "phmmat":"\u2133", - "phone":"\u260E", - "Pi":"\u03A0", - "pi":"\u03C0", - "pitchfork":"\u22D4", - "piv":"\u03D6", - "planck":"\u210F", - "planckh":"\u210E", - "plankv":"\u210F", - "plus":"\u002B", - "plusacir":"\u2A23", - "plusb":"\u229E", - "pluscir":"\u2A22", - "plusdo":"\u2214", - "plusdu":"\u2A25", - "pluse":"\u2A72", - "PlusMinus":"\u00B1", - "plusmn":"\u00B1", - "plussim":"\u2A26", - "plustwo":"\u2A27", - "pm":"\u00B1", - "Poincareplane":"\u210C", - "pointint":"\u2A15", - "Popf":"\u2119", - "popf":"\uD835\uDD61", - "pound":"\u00A3", - "Pr":"\u2ABB", - "pr":"\u227A", - "prap":"\u2AB7", - "prcue":"\u227C", - "prE":"\u2AB3", - "pre":"\u2AAF", - "prec":"\u227A", - "precapprox":"\u2AB7", - "preccurlyeq":"\u227C", - "Precedes":"\u227A", - "PrecedesEqual":"\u2AAF", - "PrecedesSlantEqual":"\u227C", - "PrecedesTilde":"\u227E", - "preceq":"\u2AAF", - "precnapprox":"\u2AB9", - "precneqq":"\u2AB5", - "precnsim":"\u22E8", - "precsim":"\u227E", - "Prime":"\u2033", - "prime":"\u2032", - "primes":"\u2119", - "prnap":"\u2AB9", - "prnE":"\u2AB5", - "prnsim":"\u22E8", - "prod":"\u220F", - "Product":"\u220F", - "profalar":"\u232E", - "profline":"\u2312", - "profsurf":"\u2313", - "prop":"\u221D", - "Proportion":"\u2237", - "Proportional":"\u221D", - "propto":"\u221D", - "prsim":"\u227E", - "prurel":"\u22B0", - "Pscr":"\uD835\uDCAB", - "pscr":"\uD835\uDCC5", - "Psi":"\u03A8", - "psi":"\u03C8", - "puncsp":"\u2008", - "Qfr":"\uD835\uDD14", - "qfr":"\uD835\uDD2E", - "qint":"\u2A0C", - "Qopf":"\u211A", - "qopf":"\uD835\uDD62", - "qprime":"\u2057", - "Qscr":"\uD835\uDCAC", - "qscr":"\uD835\uDCC6", - "quaternions":"\u210D", - "quatint":"\u2A16", - "quest":"\u003F", - "questeq":"\u225F", - "QUOT":"\u0022", - "quot":"\u0022", - "rAarr":"\u21DB", - "race":"\u223D\u0331", - "Racute":"\u0154", - "racute":"\u0155", - "radic":"\u221A", - "raemptyv":"\u29B3", - "Rang":"\u27EB", - "rang":"\u27E9", - "rangd":"\u2992", - "range":"\u29A5", - "rangle":"\u27E9", - "raquo":"\u00BB", - "Rarr":"\u21A0", - "rArr":"\u21D2", - "rarr":"\u2192", - "rarrap":"\u2975", - "rarrb":"\u21E5", - "rarrbfs":"\u2920", - "rarrc":"\u2933", - "rarrfs":"\u291E", - "rarrhk":"\u21AA", - "rarrlp":"\u21AC", - "rarrpl":"\u2945", - "rarrsim":"\u2974", - "Rarrtl":"\u2916", - "rarrtl":"\u21A3", - "rarrw":"\u219D", - "rAtail":"\u291C", - "ratail":"\u291A", - "ratio":"\u2236", - "rationals":"\u211A", - "RBarr":"\u2910", - "rBarr":"\u290F", - "rbarr":"\u290D", - "rbbrk":"\u2773", - "rbrace":"\u007D", - "rbrack":"\u005D", - "rbrke":"\u298C", - "rbrksld":"\u298E", - "rbrkslu":"\u2990", - "Rcaron":"\u0158", - "rcaron":"\u0159", - "Rcedil":"\u0156", - "rcedil":"\u0157", - "rceil":"\u2309", - "rcub":"\u007D", - "Rcy":"\u0420", - "rcy":"\u0440", - "rdca":"\u2937", - "rdldhar":"\u2969", - "rdquo":"\u201D", - "rdquor":"\u201D", - "rdsh":"\u21B3", - "Re":"\u211C", - "real":"\u211C", - "realine":"\u211B", - "realpart":"\u211C", - "reals":"\u211D", - "rect":"\u25AD", - "REG":"\u00AE", - "reg":"\u00AE", - "ReverseElement":"\u220B", - "ReverseEquilibrium":"\u21CB", - "ReverseUpEquilibrium":"\u296F", - "rfisht":"\u297D", - "rfloor":"\u230B", - "Rfr":"\u211C", - "rfr":"\uD835\uDD2F", - "rHar":"\u2964", - "rhard":"\u21C1", - "rharu":"\u21C0", - "rharul":"\u296C", - "Rho":"\u03A1", - "rho":"\u03C1", - "rhov":"\u03F1", - "RightAngleBracket":"\u27E9", - "RightArrow":"\u2192", - "Rightarrow":"\u21D2", - "rightarrow":"\u2192", - "RightArrowBar":"\u21E5", - "RightArrowLeftArrow":"\u21C4", - "rightarrowtail":"\u21A3", - "RightCeiling":"\u2309", - "RightDoubleBracket":"\u27E7", - "RightDownTeeVector":"\u295D", - "RightDownVector":"\u21C2", - "RightDownVectorBar":"\u2955", - "RightFloor":"\u230B", - "rightharpoondown":"\u21C1", - "rightharpoonup":"\u21C0", - "rightleftarrows":"\u21C4", - "rightleftharpoons":"\u21CC", - "rightrightarrows":"\u21C9", - "rightsquigarrow":"\u219D", - "RightTee":"\u22A2", - "RightTeeArrow":"\u21A6", - "RightTeeVector":"\u295B", - "rightthreetimes":"\u22CC", - "RightTriangle":"\u22B3", - "RightTriangleBar":"\u29D0", - "RightTriangleEqual":"\u22B5", - "RightUpDownVector":"\u294F", - "RightUpTeeVector":"\u295C", - "RightUpVector":"\u21BE", - "RightUpVectorBar":"\u2954", - "RightVector":"\u21C0", - "RightVectorBar":"\u2953", - "ring":"\u02DA", - "risingdotseq":"\u2253", - "rlarr":"\u21C4", - "rlhar":"\u21CC", - "rlm":"\u200F", - "rmoust":"\u23B1", - "rmoustache":"\u23B1", - "rnmid":"\u2AEE", - "roang":"\u27ED", - "roarr":"\u21FE", - "robrk":"\u27E7", - "ropar":"\u2986", - "Ropf":"\u211D", - "ropf":"\uD835\uDD63", - "roplus":"\u2A2E", - "rotimes":"\u2A35", - "RoundImplies":"\u2970", - "rpar":"\u0029", - "rpargt":"\u2994", - "rppolint":"\u2A12", - "rrarr":"\u21C9", - "Rrightarrow":"\u21DB", - "rsaquo":"\u203A", - "Rscr":"\u211B", - "rscr":"\uD835\uDCC7", - "Rsh":"\u21B1", - "rsh":"\u21B1", - "rsqb":"\u005D", - "rsquo":"\u2019", - "rsquor":"\u2019", - "rthree":"\u22CC", - "rtimes":"\u22CA", - "rtri":"\u25B9", - "rtrie":"\u22B5", - "rtrif":"\u25B8", - "rtriltri":"\u29CE", - "RuleDelayed":"\u29F4", - "ruluhar":"\u2968", - "rx":"\u211E", - "Sacute":"\u015A", - "sacute":"\u015B", - "sbquo":"\u201A", - "Sc":"\u2ABC", - "sc":"\u227B", - "scap":"\u2AB8", - "Scaron":"\u0160", - "scaron":"\u0161", - "sccue":"\u227D", - "scE":"\u2AB4", - "sce":"\u2AB0", - "Scedil":"\u015E", - "scedil":"\u015F", - "Scirc":"\u015C", - "scirc":"\u015D", - "scnap":"\u2ABA", - "scnE":"\u2AB6", - "scnsim":"\u22E9", - "scpolint":"\u2A13", - "scsim":"\u227F", - "Scy":"\u0421", - "scy":"\u0441", - "sdot":"\u22C5", - "sdotb":"\u22A1", - "sdote":"\u2A66", - "searhk":"\u2925", - "seArr":"\u21D8", - "searr":"\u2198", - "searrow":"\u2198", - "sect":"\u00A7", - "semi":"\u003B", - "seswar":"\u2929", - "setminus":"\u2216", - "setmn":"\u2216", - "sext":"\u2736", - "Sfr":"\uD835\uDD16", - "sfr":"\uD835\uDD30", - "sfrown":"\u2322", - "sharp":"\u266F", - "SHCHcy":"\u0429", - "shchcy":"\u0449", - "SHcy":"\u0428", - "shcy":"\u0448", - "ShortDownArrow":"\u2193", - "ShortLeftArrow":"\u2190", - "shortmid":"\u2223", - "shortparallel":"\u2225", - "ShortRightArrow":"\u2192", - "ShortUpArrow":"\u2191", - "shy":"\u00AD", - "Sigma":"\u03A3", - "sigma":"\u03C3", - "sigmaf":"\u03C2", - "sigmav":"\u03C2", - "sim":"\u223C", - "simdot":"\u2A6A", - "sime":"\u2243", - "simeq":"\u2243", - "simg":"\u2A9E", - "simgE":"\u2AA0", - "siml":"\u2A9D", - "simlE":"\u2A9F", - "simne":"\u2246", - "simplus":"\u2A24", - "simrarr":"\u2972", - "slarr":"\u2190", - "SmallCircle":"\u2218", - "smallsetminus":"\u2216", - "smashp":"\u2A33", - "smeparsl":"\u29E4", - "smid":"\u2223", - "smile":"\u2323", - "smt":"\u2AAA", - "smte":"\u2AAC", - "smtes":"\u2AAC\uFE00", - "SOFTcy":"\u042C", - "softcy":"\u044C", - "sol":"\u002F", - "solb":"\u29C4", - "solbar":"\u233F", - "Sopf":"\uD835\uDD4A", - "sopf":"\uD835\uDD64", - "spades":"\u2660", - "spadesuit":"\u2660", - "spar":"\u2225", - "sqcap":"\u2293", - "sqcaps":"\u2293\uFE00", - "sqcup":"\u2294", - "sqcups":"\u2294\uFE00", - "Sqrt":"\u221A", - "sqsub":"\u228F", - "sqsube":"\u2291", - "sqsubset":"\u228F", - "sqsubseteq":"\u2291", - "sqsup":"\u2290", - "sqsupe":"\u2292", - "sqsupset":"\u2290", - "sqsupseteq":"\u2292", - "squ":"\u25A1", - "Square":"\u25A1", - "square":"\u25A1", - "SquareIntersection":"\u2293", - "SquareSubset":"\u228F", - "SquareSubsetEqual":"\u2291", - "SquareSuperset":"\u2290", - "SquareSupersetEqual":"\u2292", - "SquareUnion":"\u2294", - "squarf":"\u25AA", - "squf":"\u25AA", - "srarr":"\u2192", - "Sscr":"\uD835\uDCAE", - "sscr":"\uD835\uDCC8", - "ssetmn":"\u2216", - "ssmile":"\u2323", - "sstarf":"\u22C6", - "Star":"\u22C6", - "star":"\u2606", - "starf":"\u2605", - "straightepsilon":"\u03F5", - "straightphi":"\u03D5", - "strns":"\u00AF", - "Sub":"\u22D0", - "sub":"\u2282", - "subdot":"\u2ABD", - "subE":"\u2AC5", - "sube":"\u2286", - "subedot":"\u2AC3", - "submult":"\u2AC1", - "subnE":"\u2ACB", - "subne":"\u228A", - "subplus":"\u2ABF", - "subrarr":"\u2979", - "Subset":"\u22D0", - "subset":"\u2282", - "subseteq":"\u2286", - "subseteqq":"\u2AC5", - "SubsetEqual":"\u2286", - "subsetneq":"\u228A", - "subsetneqq":"\u2ACB", - "subsim":"\u2AC7", - "subsub":"\u2AD5", - "subsup":"\u2AD3", - "succ":"\u227B", - "succapprox":"\u2AB8", - "succcurlyeq":"\u227D", - "Succeeds":"\u227B", - "SucceedsEqual":"\u2AB0", - "SucceedsSlantEqual":"\u227D", - "SucceedsTilde":"\u227F", - "succeq":"\u2AB0", - "succnapprox":"\u2ABA", - "succneqq":"\u2AB6", - "succnsim":"\u22E9", - "succsim":"\u227F", - "SuchThat":"\u220B", - "Sum":"\u2211", - "sum":"\u2211", - "sung":"\u266A", - "Sup":"\u22D1", - "sup":"\u2283", - "sup1":"\u00B9", - "sup2":"\u00B2", - "sup3":"\u00B3", - "supdot":"\u2ABE", - "supdsub":"\u2AD8", - "supE":"\u2AC6", - "supe":"\u2287", - "supedot":"\u2AC4", - "Superset":"\u2283", - "SupersetEqual":"\u2287", - "suphsol":"\u27C9", - "suphsub":"\u2AD7", - "suplarr":"\u297B", - "supmult":"\u2AC2", - "supnE":"\u2ACC", - "supne":"\u228B", - "supplus":"\u2AC0", - "Supset":"\u22D1", - "supset":"\u2283", - "supseteq":"\u2287", - "supseteqq":"\u2AC6", - "supsetneq":"\u228B", - "supsetneqq":"\u2ACC", - "supsim":"\u2AC8", - "supsub":"\u2AD4", - "supsup":"\u2AD6", - "swarhk":"\u2926", - "swArr":"\u21D9", - "swarr":"\u2199", - "swarrow":"\u2199", - "swnwar":"\u292A", - "szlig":"\u00DF", - "Tab":"\u0009", - "target":"\u2316", - "Tau":"\u03A4", - "tau":"\u03C4", - "tbrk":"\u23B4", - "Tcaron":"\u0164", - "tcaron":"\u0165", - "Tcedil":"\u0162", - "tcedil":"\u0163", - "Tcy":"\u0422", - "tcy":"\u0442", - "tdot":"\u20DB", - "telrec":"\u2315", - "Tfr":"\uD835\uDD17", - "tfr":"\uD835\uDD31", - "there4":"\u2234", - "Therefore":"\u2234", - "therefore":"\u2234", - "Theta":"\u0398", - "theta":"\u03B8", - "thetasym":"\u03D1", - "thetav":"\u03D1", - "thickapprox":"\u2248", - "thicksim":"\u223C", - "ThickSpace":"\u205F\u200A", - "thinsp":"\u2009", - "ThinSpace":"\u2009", - "thkap":"\u2248", - "thksim":"\u223C", - "THORN":"\u00DE", - "thorn":"\u00FE", - "Tilde":"\u223C", - "tilde":"\u02DC", - "TildeEqual":"\u2243", - "TildeFullEqual":"\u2245", - "TildeTilde":"\u2248", - "times":"\u00D7", - "timesb":"\u22A0", - "timesbar":"\u2A31", - "timesd":"\u2A30", - "tint":"\u222D", - "toea":"\u2928", - "top":"\u22A4", - "topbot":"\u2336", - "topcir":"\u2AF1", - "Topf":"\uD835\uDD4B", - "topf":"\uD835\uDD65", - "topfork":"\u2ADA", - "tosa":"\u2929", - "tprime":"\u2034", - "TRADE":"\u2122", - "trade":"\u2122", - "triangle":"\u25B5", - "triangledown":"\u25BF", - "triangleleft":"\u25C3", - "trianglelefteq":"\u22B4", - "triangleq":"\u225C", - "triangleright":"\u25B9", - "trianglerighteq":"\u22B5", - "tridot":"\u25EC", - "trie":"\u225C", - "triminus":"\u2A3A", - "TripleDot":"\u20DB", - "triplus":"\u2A39", - "trisb":"\u29CD", - "tritime":"\u2A3B", - "trpezium":"\u23E2", - "Tscr":"\uD835\uDCAF", - "tscr":"\uD835\uDCC9", - "TScy":"\u0426", - "tscy":"\u0446", - "TSHcy":"\u040B", - "tshcy":"\u045B", - "Tstrok":"\u0166", - "tstrok":"\u0167", - "twixt":"\u226C", - "twoheadleftarrow":"\u219E", - "twoheadrightarrow":"\u21A0", - "Uacute":"\u00DA", - "uacute":"\u00FA", - "Uarr":"\u219F", - "uArr":"\u21D1", - "uarr":"\u2191", - "Uarrocir":"\u2949", - "Ubrcy":"\u040E", - "ubrcy":"\u045E", - "Ubreve":"\u016C", - "ubreve":"\u016D", - "Ucirc":"\u00DB", - "ucirc":"\u00FB", - "Ucy":"\u0423", - "ucy":"\u0443", - "udarr":"\u21C5", - "Udblac":"\u0170", - "udblac":"\u0171", - "udhar":"\u296E", - "ufisht":"\u297E", - "Ufr":"\uD835\uDD18", - "ufr":"\uD835\uDD32", - "Ugrave":"\u00D9", - "ugrave":"\u00F9", - "uHar":"\u2963", - "uharl":"\u21BF", - "uharr":"\u21BE", - "uhblk":"\u2580", - "ulcorn":"\u231C", - "ulcorner":"\u231C", - "ulcrop":"\u230F", - "ultri":"\u25F8", - "Umacr":"\u016A", - "umacr":"\u016B", - "uml":"\u00A8", - "UnderBar":"\u005F", - "UnderBrace":"\u23DF", - "UnderBracket":"\u23B5", - "UnderParenthesis":"\u23DD", - "Union":"\u22C3", - "UnionPlus":"\u228E", - "Uogon":"\u0172", - "uogon":"\u0173", - "Uopf":"\uD835\uDD4C", - "uopf":"\uD835\uDD66", - "UpArrow":"\u2191", - "Uparrow":"\u21D1", - "uparrow":"\u2191", - "UpArrowBar":"\u2912", - "UpArrowDownArrow":"\u21C5", - "UpDownArrow":"\u2195", - "Updownarrow":"\u21D5", - "updownarrow":"\u2195", - "UpEquilibrium":"\u296E", - "upharpoonleft":"\u21BF", - "upharpoonright":"\u21BE", - "uplus":"\u228E", - "UpperLeftArrow":"\u2196", - "UpperRightArrow":"\u2197", - "Upsi":"\u03D2", - "upsi":"\u03C5", - "upsih":"\u03D2", - "Upsilon":"\u03A5", - "upsilon":"\u03C5", - "UpTee":"\u22A5", - "UpTeeArrow":"\u21A5", - "upuparrows":"\u21C8", - "urcorn":"\u231D", - "urcorner":"\u231D", - "urcrop":"\u230E", - "Uring":"\u016E", - "uring":"\u016F", - "urtri":"\u25F9", - "Uscr":"\uD835\uDCB0", - "uscr":"\uD835\uDCCA", - "utdot":"\u22F0", - "Utilde":"\u0168", - "utilde":"\u0169", - "utri":"\u25B5", - "utrif":"\u25B4", - "uuarr":"\u21C8", - "Uuml":"\u00DC", - "uuml":"\u00FC", - "uwangle":"\u29A7", - "vangrt":"\u299C", - "varepsilon":"\u03F5", - "varkappa":"\u03F0", - "varnothing":"\u2205", - "varphi":"\u03D5", - "varpi":"\u03D6", - "varpropto":"\u221D", - "vArr":"\u21D5", - "varr":"\u2195", - "varrho":"\u03F1", - "varsigma":"\u03C2", - "varsubsetneq":"\u228A\uFE00", - "varsubsetneqq":"\u2ACB\uFE00", - "varsupsetneq":"\u228B\uFE00", - "varsupsetneqq":"\u2ACC\uFE00", - "vartheta":"\u03D1", - "vartriangleleft":"\u22B2", - "vartriangleright":"\u22B3", - "Vbar":"\u2AEB", - "vBar":"\u2AE8", - "vBarv":"\u2AE9", - "Vcy":"\u0412", - "vcy":"\u0432", - "VDash":"\u22AB", - "Vdash":"\u22A9", - "vDash":"\u22A8", - "vdash":"\u22A2", - "Vdashl":"\u2AE6", - "Vee":"\u22C1", - "vee":"\u2228", - "veebar":"\u22BB", - "veeeq":"\u225A", - "vellip":"\u22EE", - "Verbar":"\u2016", - "verbar":"\u007C", - "Vert":"\u2016", - "vert":"\u007C", - "VerticalBar":"\u2223", - "VerticalLine":"\u007C", - "VerticalSeparator":"\u2758", - "VerticalTilde":"\u2240", - "VeryThinSpace":"\u200A", - "Vfr":"\uD835\uDD19", - "vfr":"\uD835\uDD33", - "vltri":"\u22B2", - "vnsub":"\u2282\u20D2", - "vnsup":"\u2283\u20D2", - "Vopf":"\uD835\uDD4D", - "vopf":"\uD835\uDD67", - "vprop":"\u221D", - "vrtri":"\u22B3", - "Vscr":"\uD835\uDCB1", - "vscr":"\uD835\uDCCB", - "vsubnE":"\u2ACB\uFE00", - "vsubne":"\u228A\uFE00", - "vsupnE":"\u2ACC\uFE00", - "vsupne":"\u228B\uFE00", - "Vvdash":"\u22AA", - "vzigzag":"\u299A", - "Wcirc":"\u0174", - "wcirc":"\u0175", - "wedbar":"\u2A5F", - "Wedge":"\u22C0", - "wedge":"\u2227", - "wedgeq":"\u2259", - "weierp":"\u2118", - "Wfr":"\uD835\uDD1A", - "wfr":"\uD835\uDD34", - "Wopf":"\uD835\uDD4E", - "wopf":"\uD835\uDD68", - "wp":"\u2118", - "wr":"\u2240", - "wreath":"\u2240", - "Wscr":"\uD835\uDCB2", - "wscr":"\uD835\uDCCC", - "xcap":"\u22C2", - "xcirc":"\u25EF", - "xcup":"\u22C3", - "xdtri":"\u25BD", - "Xfr":"\uD835\uDD1B", - "xfr":"\uD835\uDD35", - "xhArr":"\u27FA", - "xharr":"\u27F7", - "Xi":"\u039E", - "xi":"\u03BE", - "xlArr":"\u27F8", - "xlarr":"\u27F5", - "xmap":"\u27FC", - "xnis":"\u22FB", - "xodot":"\u2A00", - "Xopf":"\uD835\uDD4F", - "xopf":"\uD835\uDD69", - "xoplus":"\u2A01", - "xotime":"\u2A02", - "xrArr":"\u27F9", - "xrarr":"\u27F6", - "Xscr":"\uD835\uDCB3", - "xscr":"\uD835\uDCCD", - "xsqcup":"\u2A06", - "xuplus":"\u2A04", - "xutri":"\u25B3", - "xvee":"\u22C1", - "xwedge":"\u22C0", - "Yacute":"\u00DD", - "yacute":"\u00FD", - "YAcy":"\u042F", - "yacy":"\u044F", - "Ycirc":"\u0176", - "ycirc":"\u0177", - "Ycy":"\u042B", - "ycy":"\u044B", - "yen":"\u00A5", - "Yfr":"\uD835\uDD1C", - "yfr":"\uD835\uDD36", - "YIcy":"\u0407", - "yicy":"\u0457", - "Yopf":"\uD835\uDD50", - "yopf":"\uD835\uDD6A", - "Yscr":"\uD835\uDCB4", - "yscr":"\uD835\uDCCE", - "YUcy":"\u042E", - "yucy":"\u044E", - "Yuml":"\u0178", - "yuml":"\u00FF", - "Zacute":"\u0179", - "zacute":"\u017A", - "Zcaron":"\u017D", - "zcaron":"\u017E", - "Zcy":"\u0417", - "zcy":"\u0437", - "Zdot":"\u017B", - "zdot":"\u017C", - "zeetrf":"\u2128", - "ZeroWidthSpace":"\u200B", - "Zeta":"\u0396", - "zeta":"\u03B6", - "Zfr":"\u2128", - "zfr":"\uD835\uDD37", - "ZHcy":"\u0416", - "zhcy":"\u0436", - "zigrarr":"\u21DD", - "Zopf":"\u2124", - "zopf":"\uD835\uDD6B", - "Zscr":"\uD835\uDCB5", - "zscr":"\uD835\uDCCF", - "zwj":"\u200D", - "zwnj":"\u200C" -}; - -var hasOwn = Object.prototype.hasOwnProperty; - -function has(object, key) { - return object - ? hasOwn.call(object, key) - : false; -} - -function decodeEntity(name) { - if (has(entities, name)) { - return entities[name] - } else { - return name; - } -} - -/** - * Utility functions - */ - -function typeOf(obj) { - return Object.prototype.toString.call(obj); -} - -function isString(obj) { - return typeOf(obj) === '[object String]'; -} - -var hasOwn$1 = Object.prototype.hasOwnProperty; - -function has$1(object, key) { - return object - ? hasOwn$1.call(object, key) - : false; -} - -// Extend objects -// -function assign(obj /*from1, from2, from3, ...*/) { - var sources = [].slice.call(arguments, 1); - - sources.forEach(function (source) { - if (!source) { return; } - - if (typeof source !== 'object') { - throw new TypeError(source + 'must be object'); - } - - Object.keys(source).forEach(function (key) { - obj[key] = source[key]; - }); - }); - - return obj; -} - -//////////////////////////////////////////////////////////////////////////////// - -var UNESCAPE_MD_RE = /\\([\\!"#$%&'()*+,.\/:;<=>?@[\]^_`{|}~-])/g; - -function unescapeMd(str) { - if (str.indexOf('\\') < 0) { return str; } - return str.replace(UNESCAPE_MD_RE, '$1'); -} - -//////////////////////////////////////////////////////////////////////////////// - -function isValidEntityCode(c) { - /*eslint no-bitwise:0*/ - // broken sequence - if (c >= 0xD800 && c <= 0xDFFF) { return false; } - // never used - if (c >= 0xFDD0 && c <= 0xFDEF) { return false; } - if ((c & 0xFFFF) === 0xFFFF || (c & 0xFFFF) === 0xFFFE) { return false; } - // control codes - if (c >= 0x00 && c <= 0x08) { return false; } - if (c === 0x0B) { return false; } - if (c >= 0x0E && c <= 0x1F) { return false; } - if (c >= 0x7F && c <= 0x9F) { return false; } - // out of range - if (c > 0x10FFFF) { return false; } - return true; -} - -function fromCodePoint(c) { - /*eslint no-bitwise:0*/ - if (c > 0xffff) { - c -= 0x10000; - var surrogate1 = 0xd800 + (c >> 10), - surrogate2 = 0xdc00 + (c & 0x3ff); - - return String.fromCharCode(surrogate1, surrogate2); - } - return String.fromCharCode(c); -} - -var NAMED_ENTITY_RE = /&([a-z#][a-z0-9]{1,31});/gi; -var DIGITAL_ENTITY_TEST_RE = /^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))/i; - -function replaceEntityPattern(match, name) { - var code = 0; - var decoded = decodeEntity(name); - - if (name !== decoded) { - return decoded; - } else if (name.charCodeAt(0) === 0x23/* # */ && DIGITAL_ENTITY_TEST_RE.test(name)) { - code = name[1].toLowerCase() === 'x' ? - parseInt(name.slice(2), 16) - : - parseInt(name.slice(1), 10); - if (isValidEntityCode(code)) { - return fromCodePoint(code); - } - } - return match; -} - -function replaceEntities(str) { - if (str.indexOf('&') < 0) { return str; } - - return str.replace(NAMED_ENTITY_RE, replaceEntityPattern); -} - -//////////////////////////////////////////////////////////////////////////////// - -var HTML_ESCAPE_TEST_RE = /[&<>"]/; -var HTML_ESCAPE_REPLACE_RE = /[&<>"]/g; -var HTML_REPLACEMENTS = { - '&': '&', - '<': '<', - '>': '>', - '"': '"' -}; - -function replaceUnsafeChar(ch) { - return HTML_REPLACEMENTS[ch]; -} - -function escapeHtml(str) { - if (HTML_ESCAPE_TEST_RE.test(str)) { - return str.replace(HTML_ESCAPE_REPLACE_RE, replaceUnsafeChar); - } - return str; -} - -var utils = /*#__PURE__*/Object.freeze({ - isString: isString, - has: has$1, - assign: assign, - unescapeMd: unescapeMd, - isValidEntityCode: isValidEntityCode, - fromCodePoint: fromCodePoint, - replaceEntities: replaceEntities, - escapeHtml: escapeHtml -}); - -/** - * Renderer rules cache - */ - -var rules = {}; - -/** - * Blockquotes - */ - -rules.blockquote_open = function(/* tokens, idx, options, env */) { - return '
\n'; -}; - -rules.blockquote_close = function(tokens, idx /*, options, env */) { - return '
' + getBreak(tokens, idx); -}; - -/** - * Code - */ - -rules.code = function(tokens, idx /*, options, env */) { - if (tokens[idx].block) { - return '
' + escapeHtml(tokens[idx].content) + '
' + getBreak(tokens, idx); - } - return '' + escapeHtml(tokens[idx].content) + ''; -}; - -/** - * Fenced code blocks - */ - -rules.fence = function(tokens, idx, options, env, instance) { - var token = tokens[idx]; - var langClass = ''; - var langPrefix = options.langPrefix; - var langName = '', fences, fenceName; - var highlighted; - - if (token.params) { - - // - // ```foo bar - // - // Try custom renderer "foo" first. That will simplify overwrite - // for diagrams, latex, and any other fenced block with custom look - // - - fences = token.params.split(/\s+/g); - fenceName = fences.join(' '); - - if (has$1(instance.rules.fence_custom, fences[0])) { - return instance.rules.fence_custom[fences[0]](tokens, idx, options, env, instance); - } - - langName = escapeHtml(replaceEntities(unescapeMd(fenceName))); - langClass = ' class="' + langPrefix + langName + '"'; - } - - if (options.highlight) { - highlighted = options.highlight.apply(options.highlight, [ token.content ].concat(fences)) - || escapeHtml(token.content); - } else { - highlighted = escapeHtml(token.content); - } - - return '
'
-        + highlighted
-        + '
' - + getBreak(tokens, idx); -}; - -rules.fence_custom = {}; - -/** - * Headings - */ - -rules.heading_open = function(tokens, idx /*, options, env */) { - return ''; -}; -rules.heading_close = function(tokens, idx /*, options, env */) { - return '\n'; -}; - -/** - * Horizontal rules - */ - -rules.hr = function(tokens, idx, options /*, env */) { - return (options.xhtmlOut ? '
' : '
') + getBreak(tokens, idx); -}; - -/** - * Bullets - */ - -rules.bullet_list_open = function(/* tokens, idx, options, env */) { - return '
    \n'; -}; -rules.bullet_list_close = function(tokens, idx /*, options, env */) { - return '
' + getBreak(tokens, idx); -}; - -/** - * List items - */ - -rules.list_item_open = function(/* tokens, idx, options, env */) { - return '
  • '; -}; -rules.list_item_close = function(/* tokens, idx, options, env */) { - return '
  • \n'; -}; - -/** - * Ordered list items - */ - -rules.ordered_list_open = function(tokens, idx /*, options, env */) { - var token = tokens[idx]; - var order = token.order > 1 ? ' start="' + token.order + '"' : ''; - return '\n'; -}; -rules.ordered_list_close = function(tokens, idx /*, options, env */) { - return '' + getBreak(tokens, idx); -}; - -/** - * Paragraphs - */ - -rules.paragraph_open = function(tokens, idx /*, options, env */) { - return tokens[idx].tight ? '' : '

    '; -}; -rules.paragraph_close = function(tokens, idx /*, options, env */) { - var addBreak = !(tokens[idx].tight && idx && tokens[idx - 1].type === 'inline' && !tokens[idx - 1].content); - return (tokens[idx].tight ? '' : '

    ') + (addBreak ? getBreak(tokens, idx) : ''); -}; - -/** - * Links - */ - -rules.link_open = function(tokens, idx, options /* env */) { - var title = tokens[idx].title ? (' title="' + escapeHtml(replaceEntities(tokens[idx].title)) + '"') : ''; - var target = options.linkTarget ? (' target="' + options.linkTarget + '"') : ''; - return ''; -}; -rules.link_close = function(/* tokens, idx, options, env */) { - return ''; -}; - -/** - * Images - */ - -rules.image = function(tokens, idx, options /*, env */) { - var src = ' src="' + escapeHtml(tokens[idx].src) + '"'; - var title = tokens[idx].title ? (' title="' + escapeHtml(replaceEntities(tokens[idx].title)) + '"') : ''; - var alt = ' alt="' + (tokens[idx].alt ? escapeHtml(replaceEntities(unescapeMd(tokens[idx].alt))) : '') + '"'; - var suffix = options.xhtmlOut ? ' /' : ''; - return ''; -}; - -/** - * Tables - */ - -rules.table_open = function(/* tokens, idx, options, env */) { - return '
    \n'; -}; -rules.table_close = function(/* tokens, idx, options, env */) { - return '
    \n'; -}; -rules.thead_open = function(/* tokens, idx, options, env */) { - return '\n'; -}; -rules.thead_close = function(/* tokens, idx, options, env */) { - return '\n'; -}; -rules.tbody_open = function(/* tokens, idx, options, env */) { - return '\n'; -}; -rules.tbody_close = function(/* tokens, idx, options, env */) { - return '\n'; -}; -rules.tr_open = function(/* tokens, idx, options, env */) { - return ''; -}; -rules.tr_close = function(/* tokens, idx, options, env */) { - return '\n'; -}; -rules.th_open = function(tokens, idx /*, options, env */) { - var token = tokens[idx]; - return ''; -}; -rules.th_close = function(/* tokens, idx, options, env */) { - return ''; -}; -rules.td_open = function(tokens, idx /*, options, env */) { - var token = tokens[idx]; - return ''; -}; -rules.td_close = function(/* tokens, idx, options, env */) { - return ''; -}; - -/** - * Bold - */ - -rules.strong_open = function(/* tokens, idx, options, env */) { - return ''; -}; -rules.strong_close = function(/* tokens, idx, options, env */) { - return ''; -}; - -/** - * Italicize - */ - -rules.em_open = function(/* tokens, idx, options, env */) { - return ''; -}; -rules.em_close = function(/* tokens, idx, options, env */) { - return ''; -}; - -/** - * Strikethrough - */ - -rules.del_open = function(/* tokens, idx, options, env */) { - return ''; -}; -rules.del_close = function(/* tokens, idx, options, env */) { - return ''; -}; - -/** - * Insert - */ - -rules.ins_open = function(/* tokens, idx, options, env */) { - return ''; -}; -rules.ins_close = function(/* tokens, idx, options, env */) { - return ''; -}; - -/** - * Highlight - */ - -rules.mark_open = function(/* tokens, idx, options, env */) { - return ''; -}; -rules.mark_close = function(/* tokens, idx, options, env */) { - return ''; -}; - -/** - * Super- and sub-script - */ - -rules.sub = function(tokens, idx /*, options, env */) { - return '' + escapeHtml(tokens[idx].content) + ''; -}; -rules.sup = function(tokens, idx /*, options, env */) { - return '' + escapeHtml(tokens[idx].content) + ''; -}; - -/** - * Breaks - */ - -rules.hardbreak = function(tokens, idx, options /*, env */) { - return options.xhtmlOut ? '
    \n' : '
    \n'; -}; -rules.softbreak = function(tokens, idx, options /*, env */) { - return options.breaks ? (options.xhtmlOut ? '
    \n' : '
    \n') : '\n'; -}; - -/** - * Text - */ - -rules.text = function(tokens, idx /*, options, env */) { - return escapeHtml(tokens[idx].content); -}; - -/** - * Content - */ - -rules.htmlblock = function(tokens, idx /*, options, env */) { - return tokens[idx].content; -}; -rules.htmltag = function(tokens, idx /*, options, env */) { - return tokens[idx].content; -}; - -/** - * Abbreviations, initialism - */ - -rules.abbr_open = function(tokens, idx /*, options, env */) { - return ''; -}; -rules.abbr_close = function(/* tokens, idx, options, env */) { - return ''; -}; - -/** - * Footnotes - */ - -rules.footnote_ref = function(tokens, idx) { - var n = Number(tokens[idx].id + 1).toString(); - var id = 'fnref' + n; - if (tokens[idx].subId > 0) { - id += ':' + tokens[idx].subId; - } - return '[' + n + ']'; -}; -rules.footnote_block_open = function(tokens, idx, options) { - var hr = options.xhtmlOut - ? '
    \n' - : '
    \n'; - return hr + '
    \n
      \n'; -}; -rules.footnote_block_close = function() { - return '
    \n
    \n'; -}; -rules.footnote_open = function(tokens, idx) { - var id = Number(tokens[idx].id + 1).toString(); - return '
  • '; -}; -rules.footnote_close = function() { - return '
  • \n'; -}; -rules.footnote_anchor = function(tokens, idx) { - var n = Number(tokens[idx].id + 1).toString(); - var id = 'fnref' + n; - if (tokens[idx].subId > 0) { - id += ':' + tokens[idx].subId; - } - return ' '; -}; - -/** - * Definition lists - */ - -rules.dl_open = function() { - return '
    \n'; -}; -rules.dt_open = function() { - return '
    '; -}; -rules.dd_open = function() { - return '
    '; -}; -rules.dl_close = function() { - return '
    \n'; -}; -rules.dt_close = function() { - return '\n'; -}; -rules.dd_close = function() { - return '\n'; -}; - -/** - * Helper functions - */ - -function nextToken(tokens, idx) { - if (++idx >= tokens.length - 2) { - return idx; - } - if ((tokens[idx].type === 'paragraph_open' && tokens[idx].tight) && - (tokens[idx + 1].type === 'inline' && tokens[idx + 1].content.length === 0) && - (tokens[idx + 2].type === 'paragraph_close' && tokens[idx + 2].tight)) { - return nextToken(tokens, idx + 2); - } - return idx; -} - -/** - * Check to see if `\n` is needed before the next token. - * - * @param {Array} `tokens` - * @param {Number} `idx` - * @return {String} Empty string or newline - * @api private - */ - -var getBreak = rules.getBreak = function getBreak(tokens, idx) { - idx = nextToken(tokens, idx); - if (idx < tokens.length && tokens[idx].type === 'list_item_close') { - return ''; - } - return '\n'; -}; - -/** - * Renderer class. Renders HTML and exposes `rules` to allow - * local modifications. - */ - -function Renderer() { - this.rules = assign({}, rules); - - // exported helper, for custom rules only - this.getBreak = rules.getBreak; -} - -/** - * Render a string of inline HTML with the given `tokens` and - * `options`. - * - * @param {Array} `tokens` - * @param {Object} `options` - * @param {Object} `env` - * @return {String} - * @api public - */ - -Renderer.prototype.renderInline = function (tokens, options, env) { - var _rules = this.rules; - var len = tokens.length, i = 0; - var result = ''; - - while (len--) { - result += _rules[tokens[i].type](tokens, i++, options, env, this); - } - - return result; -}; - -/** - * Render a string of HTML with the given `tokens` and - * `options`. - * - * @param {Array} `tokens` - * @param {Object} `options` - * @param {Object} `env` - * @return {String} - * @api public - */ - -Renderer.prototype.render = function (tokens, options, env) { - var _rules = this.rules; - var len = tokens.length, i = -1; - var result = ''; - - while (++i < len) { - if (tokens[i].type === 'inline') { - result += this.renderInline(tokens[i].children, options, env); - } else { - result += _rules[tokens[i].type](tokens, i, options, env, this); - } - } - return result; -}; - -/** - * Ruler is a helper class for building responsibility chains from - * parse rules. It allows: - * - * - easy stack rules chains - * - getting main chain and named chains content (as arrays of functions) - * - * Helper methods, should not be used directly. - * @api private - */ - -function Ruler() { - // List of added rules. Each element is: - // - // { name: XXX, - // enabled: Boolean, - // fn: Function(), - // alt: [ name2, name3 ] } - // - this.__rules__ = []; - - // Cached rule chains. - // - // First level - chain name, '' for default. - // Second level - digital anchor for fast filtering by charcodes. - // - this.__cache__ = null; -} - -/** - * Find the index of a rule by `name`. - * - * @param {String} `name` - * @return {Number} Index of the given `name` - * @api private - */ - -Ruler.prototype.__find__ = function (name) { - var len = this.__rules__.length; - var i = -1; - - while (len--) { - if (this.__rules__[++i].name === name) { - return i; - } - } - return -1; -}; - -/** - * Build the rules lookup cache - * - * @api private - */ - -Ruler.prototype.__compile__ = function () { - var self = this; - var chains = [ '' ]; - - // collect unique names - self.__rules__.forEach(function (rule) { - if (!rule.enabled) { - return; - } - - rule.alt.forEach(function (altName) { - if (chains.indexOf(altName) < 0) { - chains.push(altName); - } - }); - }); - - self.__cache__ = {}; - - chains.forEach(function (chain) { - self.__cache__[chain] = []; - self.__rules__.forEach(function (rule) { - if (!rule.enabled) { - return; - } - - if (chain && rule.alt.indexOf(chain) < 0) { - return; - } - self.__cache__[chain].push(rule.fn); - }); - }); -}; - -/** - * Ruler public methods - * ------------------------------------------------ - */ - -/** - * Replace rule function - * - * @param {String} `name` Rule name - * @param {Function `fn` - * @param {Object} `options` - * @api private - */ - -Ruler.prototype.at = function (name, fn, options) { - var idx = this.__find__(name); - var opt = options || {}; - - if (idx === -1) { - throw new Error('Parser rule not found: ' + name); - } - - this.__rules__[idx].fn = fn; - this.__rules__[idx].alt = opt.alt || []; - this.__cache__ = null; -}; - -/** - * Add a rule to the chain before given the `ruleName`. - * - * @param {String} `beforeName` - * @param {String} `ruleName` - * @param {Function} `fn` - * @param {Object} `options` - * @api private - */ - -Ruler.prototype.before = function (beforeName, ruleName, fn, options) { - var idx = this.__find__(beforeName); - var opt = options || {}; - - if (idx === -1) { - throw new Error('Parser rule not found: ' + beforeName); - } - - this.__rules__.splice(idx, 0, { - name: ruleName, - enabled: true, - fn: fn, - alt: opt.alt || [] - }); - - this.__cache__ = null; -}; - -/** - * Add a rule to the chain after the given `ruleName`. - * - * @param {String} `afterName` - * @param {String} `ruleName` - * @param {Function} `fn` - * @param {Object} `options` - * @api private - */ - -Ruler.prototype.after = function (afterName, ruleName, fn, options) { - var idx = this.__find__(afterName); - var opt = options || {}; - - if (idx === -1) { - throw new Error('Parser rule not found: ' + afterName); - } - - this.__rules__.splice(idx + 1, 0, { - name: ruleName, - enabled: true, - fn: fn, - alt: opt.alt || [] - }); - - this.__cache__ = null; -}; - -/** - * Add a rule to the end of chain. - * - * @param {String} `ruleName` - * @param {Function} `fn` - * @param {Object} `options` - * @return {String} - */ - -Ruler.prototype.push = function (ruleName, fn, options) { - var opt = options || {}; - - this.__rules__.push({ - name: ruleName, - enabled: true, - fn: fn, - alt: opt.alt || [] - }); - - this.__cache__ = null; -}; - -/** - * Enable a rule or list of rules. - * - * @param {String|Array} `list` Name or array of rule names to enable - * @param {Boolean} `strict` If `true`, all non listed rules will be disabled. - * @api private - */ - -Ruler.prototype.enable = function (list, strict) { - list = !Array.isArray(list) - ? [ list ] - : list; - - // In strict mode disable all existing rules first - if (strict) { - this.__rules__.forEach(function (rule) { - rule.enabled = false; - }); - } - - // Search by name and enable - list.forEach(function (name) { - var idx = this.__find__(name); - if (idx < 0) { - throw new Error('Rules manager: invalid rule name ' + name); - } - this.__rules__[idx].enabled = true; - }, this); - - this.__cache__ = null; -}; - - -/** - * Disable a rule or list of rules. - * - * @param {String|Array} `list` Name or array of rule names to disable - * @api private - */ - -Ruler.prototype.disable = function (list) { - list = !Array.isArray(list) - ? [ list ] - : list; - - // Search by name and disable - list.forEach(function (name) { - var idx = this.__find__(name); - if (idx < 0) { - throw new Error('Rules manager: invalid rule name ' + name); - } - this.__rules__[idx].enabled = false; - }, this); - - this.__cache__ = null; -}; - -/** - * Get a rules list as an array of functions. - * - * @param {String} `chainName` - * @return {Object} - * @api private - */ - -Ruler.prototype.getRules = function (chainName) { - if (this.__cache__ === null) { - this.__compile__(); - } - return this.__cache__[chainName] || []; -}; - -function block(state) { - - if (state.inlineMode) { - state.tokens.push({ - type: 'inline', - content: state.src.replace(/\n/g, ' ').trim(), - level: 0, - lines: [ 0, 1 ], - children: [] - }); - - } else { - state.block.parse(state.src, state.options, state.env, state.tokens); - } -} - -// Inline parser state - -function StateInline(src, parserInline, options, env, outTokens) { - this.src = src; - this.env = env; - this.options = options; - this.parser = parserInline; - this.tokens = outTokens; - this.pos = 0; - this.posMax = this.src.length; - this.level = 0; - this.pending = ''; - this.pendingLevel = 0; - - this.cache = []; // Stores { start: end } pairs. Useful for backtrack - // optimization of pairs parse (emphasis, strikes). - - // Link parser state vars - - this.isInLabel = false; // Set true when seek link label - we should disable - // "paired" rules (emphasis, strikes) to not skip - // tailing `]` - - this.linkLevel = 0; // Increment for each nesting link. Used to prevent - // nesting in definitions - - this.linkContent = ''; // Temporary storage for link url - - this.labelUnmatchedScopes = 0; // Track unpaired `[` for link labels - // (backtrack optimization) -} - -// Flush pending text -// -StateInline.prototype.pushPending = function () { - this.tokens.push({ - type: 'text', - content: this.pending, - level: this.pendingLevel - }); - this.pending = ''; -}; - -// Push new token to "stream". -// If pending text exists - flush it as text token -// -StateInline.prototype.push = function (token) { - if (this.pending) { - this.pushPending(); - } - - this.tokens.push(token); - this.pendingLevel = this.level; -}; - -// Store value to cache. -// !!! Implementation has parser-specific optimizations -// !!! keys MUST be integer, >= 0; values MUST be integer, > 0 -// -StateInline.prototype.cacheSet = function (key, val) { - for (var i = this.cache.length; i <= key; i++) { - this.cache.push(0); - } - - this.cache[key] = val; -}; - -// Get cache value -// -StateInline.prototype.cacheGet = function (key) { - return key < this.cache.length ? this.cache[key] : 0; -}; - -/** - * Parse link labels - * - * This function assumes that first character (`[`) already matches; - * returns the end of the label. - * - * @param {Object} state - * @param {Number} start - * @api private - */ - -function parseLinkLabel(state, start) { - var level, found, marker, - labelEnd = -1, - max = state.posMax, - oldPos = state.pos, - oldFlag = state.isInLabel; - - if (state.isInLabel) { return -1; } - - if (state.labelUnmatchedScopes) { - state.labelUnmatchedScopes--; - return -1; - } - - state.pos = start + 1; - state.isInLabel = true; - level = 1; - - while (state.pos < max) { - marker = state.src.charCodeAt(state.pos); - if (marker === 0x5B /* [ */) { - level++; - } else if (marker === 0x5D /* ] */) { - level--; - if (level === 0) { - found = true; - break; - } - } - - state.parser.skipToken(state); - } - - if (found) { - labelEnd = state.pos; - state.labelUnmatchedScopes = 0; - } else { - state.labelUnmatchedScopes = level - 1; - } - - // restore old state - state.pos = oldPos; - state.isInLabel = oldFlag; - - return labelEnd; -} - -// Parse abbreviation definitions, i.e. `*[abbr]: description` - - -function parseAbbr(str, parserInline, options, env) { - var state, labelEnd, pos, max, label, title; - - if (str.charCodeAt(0) !== 0x2A/* * */) { return -1; } - if (str.charCodeAt(1) !== 0x5B/* [ */) { return -1; } - - if (str.indexOf(']:') === -1) { return -1; } - - state = new StateInline(str, parserInline, options, env, []); - labelEnd = parseLinkLabel(state, 1); - - if (labelEnd < 0 || str.charCodeAt(labelEnd + 1) !== 0x3A/* : */) { return -1; } - - max = state.posMax; - - // abbr title is always one line, so looking for ending "\n" here - for (pos = labelEnd + 2; pos < max; pos++) { - if (state.src.charCodeAt(pos) === 0x0A) { break; } - } - - label = str.slice(2, labelEnd); - title = str.slice(labelEnd + 2, pos).trim(); - if (title.length === 0) { return -1; } - if (!env.abbreviations) { env.abbreviations = {}; } - // prepend ':' to avoid conflict with Object.prototype members - if (typeof env.abbreviations[':' + label] === 'undefined') { - env.abbreviations[':' + label] = title; - } - - return pos; -} - -function abbr(state) { - var tokens = state.tokens, i, l, content, pos; - - if (state.inlineMode) { - return; - } - - // Parse inlines - for (i = 1, l = tokens.length - 1; i < l; i++) { - if (tokens[i - 1].type === 'paragraph_open' && - tokens[i].type === 'inline' && - tokens[i + 1].type === 'paragraph_close') { - - content = tokens[i].content; - while (content.length) { - pos = parseAbbr(content, state.inline, state.options, state.env); - if (pos < 0) { break; } - content = content.slice(pos).trim(); - } - - tokens[i].content = content; - if (!content.length) { - tokens[i - 1].tight = true; - tokens[i + 1].tight = true; - } - } - } -} - -function normalizeLink(url) { - var normalized = replaceEntities(url); - // We shouldn't care about the result of malformed URIs, - // and should not throw an exception. - try { - normalized = decodeURI(normalized); - } catch (err) {} - return encodeURI(normalized); -} - -/** - * Parse link destination - * - * - on success it returns a string and updates state.pos; - * - on failure it returns null - * - * @param {Object} state - * @param {Number} pos - * @api private - */ - -function parseLinkDestination(state, pos) { - var code, level, link, - start = pos, - max = state.posMax; - - if (state.src.charCodeAt(pos) === 0x3C /* < */) { - pos++; - while (pos < max) { - code = state.src.charCodeAt(pos); - if (code === 0x0A /* \n */) { return false; } - if (code === 0x3E /* > */) { - link = normalizeLink(unescapeMd(state.src.slice(start + 1, pos))); - if (!state.parser.validateLink(link)) { return false; } - state.pos = pos + 1; - state.linkContent = link; - return true; - } - if (code === 0x5C /* \ */ && pos + 1 < max) { - pos += 2; - continue; - } - - pos++; - } - - // no closing '>' - return false; - } - - // this should be ... } else { ... branch - - level = 0; - while (pos < max) { - code = state.src.charCodeAt(pos); - - if (code === 0x20) { break; } - - // ascii control chars - if (code < 0x20 || code === 0x7F) { break; } - - if (code === 0x5C /* \ */ && pos + 1 < max) { - pos += 2; - continue; - } - - if (code === 0x28 /* ( */) { - level++; - if (level > 1) { break; } - } - - if (code === 0x29 /* ) */) { - level--; - if (level < 0) { break; } - } - - pos++; - } - - if (start === pos) { return false; } - - link = unescapeMd(state.src.slice(start, pos)); - if (!state.parser.validateLink(link)) { return false; } - - state.linkContent = link; - state.pos = pos; - return true; -} - -/** - * Parse link title - * - * - on success it returns a string and updates state.pos; - * - on failure it returns null - * - * @param {Object} state - * @param {Number} pos - * @api private - */ - -function parseLinkTitle(state, pos) { - var code, - start = pos, - max = state.posMax, - marker = state.src.charCodeAt(pos); - - if (marker !== 0x22 /* " */ && marker !== 0x27 /* ' */ && marker !== 0x28 /* ( */) { return false; } - - pos++; - - // if opening marker is "(", switch it to closing marker ")" - if (marker === 0x28) { marker = 0x29; } - - while (pos < max) { - code = state.src.charCodeAt(pos); - if (code === marker) { - state.pos = pos + 1; - state.linkContent = unescapeMd(state.src.slice(start + 1, pos)); - return true; - } - if (code === 0x5C /* \ */ && pos + 1 < max) { - pos += 2; - continue; - } - - pos++; - } - - return false; -} - -function normalizeReference(str) { - // use .toUpperCase() instead of .toLowerCase() - // here to avoid a conflict with Object.prototype - // members (most notably, `__proto__`) - return str.trim().replace(/\s+/g, ' ').toUpperCase(); -} - -function parseReference(str, parser, options, env) { - var state, labelEnd, pos, max, code, start, href, title, label; - - if (str.charCodeAt(0) !== 0x5B/* [ */) { return -1; } - - if (str.indexOf(']:') === -1) { return -1; } - - state = new StateInline(str, parser, options, env, []); - labelEnd = parseLinkLabel(state, 0); - - if (labelEnd < 0 || str.charCodeAt(labelEnd + 1) !== 0x3A/* : */) { return -1; } - - max = state.posMax; - - // [label]: destination 'title' - // ^^^ skip optional whitespace here - for (pos = labelEnd + 2; pos < max; pos++) { - code = state.src.charCodeAt(pos); - if (code !== 0x20 && code !== 0x0A) { break; } - } - - // [label]: destination 'title' - // ^^^^^^^^^^^ parse this - if (!parseLinkDestination(state, pos)) { return -1; } - href = state.linkContent; - pos = state.pos; - - // [label]: destination 'title' - // ^^^ skipping those spaces - start = pos; - for (pos = pos + 1; pos < max; pos++) { - code = state.src.charCodeAt(pos); - if (code !== 0x20 && code !== 0x0A) { break; } - } - - // [label]: destination 'title' - // ^^^^^^^ parse this - if (pos < max && start !== pos && parseLinkTitle(state, pos)) { - title = state.linkContent; - pos = state.pos; - } else { - title = ''; - pos = start; - } - - // ensure that the end of the line is empty - while (pos < max && state.src.charCodeAt(pos) === 0x20/* space */) { pos++; } - if (pos < max && state.src.charCodeAt(pos) !== 0x0A) { return -1; } - - label = normalizeReference(str.slice(1, labelEnd)); - if (typeof env.references[label] === 'undefined') { - env.references[label] = { title: title, href: href }; - } - - return pos; -} - - -function references(state) { - var tokens = state.tokens, i, l, content, pos; - - state.env.references = state.env.references || {}; - - if (state.inlineMode) { - return; - } - - // Scan definitions in paragraph inlines - for (i = 1, l = tokens.length - 1; i < l; i++) { - if (tokens[i].type === 'inline' && - tokens[i - 1].type === 'paragraph_open' && - tokens[i + 1].type === 'paragraph_close') { - - content = tokens[i].content; - while (content.length) { - pos = parseReference(content, state.inline, state.options, state.env); - if (pos < 0) { break; } - content = content.slice(pos).trim(); - } - - tokens[i].content = content; - if (!content.length) { - tokens[i - 1].tight = true; - tokens[i + 1].tight = true; - } - } - } -} - -function inline(state) { - var tokens = state.tokens, tok, i, l; - - // Parse inlines - for (i = 0, l = tokens.length; i < l; i++) { - tok = tokens[i]; - if (tok.type === 'inline') { - state.inline.parse(tok.content, state.options, state.env, tok.children); - } - } -} - -function footnote_block(state) { - var i, l, j, t, lastParagraph, list, tokens, current, currentLabel, - level = 0, - insideRef = false, - refTokens = {}; - - if (!state.env.footnotes) { return; } - - state.tokens = state.tokens.filter(function(tok) { - if (tok.type === 'footnote_reference_open') { - insideRef = true; - current = []; - currentLabel = tok.label; - return false; - } - if (tok.type === 'footnote_reference_close') { - insideRef = false; - // prepend ':' to avoid conflict with Object.prototype members - refTokens[':' + currentLabel] = current; - return false; - } - if (insideRef) { current.push(tok); } - return !insideRef; - }); - - if (!state.env.footnotes.list) { return; } - list = state.env.footnotes.list; - - state.tokens.push({ - type: 'footnote_block_open', - level: level++ - }); - for (i = 0, l = list.length; i < l; i++) { - state.tokens.push({ - type: 'footnote_open', - id: i, - level: level++ - }); - - if (list[i].tokens) { - tokens = []; - tokens.push({ - type: 'paragraph_open', - tight: false, - level: level++ - }); - tokens.push({ - type: 'inline', - content: '', - level: level, - children: list[i].tokens - }); - tokens.push({ - type: 'paragraph_close', - tight: false, - level: --level - }); - } else if (list[i].label) { - tokens = refTokens[':' + list[i].label]; - } - - state.tokens = state.tokens.concat(tokens); - if (state.tokens[state.tokens.length - 1].type === 'paragraph_close') { - lastParagraph = state.tokens.pop(); - } else { - lastParagraph = null; - } - - t = list[i].count > 0 ? list[i].count : 1; - for (j = 0; j < t; j++) { - state.tokens.push({ - type: 'footnote_anchor', - id: i, - subId: j, - level: level - }); - } - - if (lastParagraph) { - state.tokens.push(lastParagraph); - } - - state.tokens.push({ - type: 'footnote_close', - level: --level - }); - } - state.tokens.push({ - type: 'footnote_block_close', - level: --level - }); -} - -// Enclose abbreviations in tags -// - -var PUNCT_CHARS = ' \n()[]\'".,!?-'; - - -// from Google closure library -// http://closure-library.googlecode.com/git-history/docs/local_closure_goog_string_string.js.source.html#line1021 -function regEscape(s) { - return s.replace(/([-()\[\]{}+?*.$\^|,:#= 0; i--) { - token = tokens[i]; - if (token.type !== 'text') { continue; } - - pos = 0; - text = token.content; - reg.lastIndex = 0; - level = token.level; - nodes = []; - - while ((m = reg.exec(text))) { - if (reg.lastIndex > pos) { - nodes.push({ - type: 'text', - content: text.slice(pos, m.index + m[1].length), - level: level - }); - } - - nodes.push({ - type: 'abbr_open', - title: state.env.abbreviations[':' + m[2]], - level: level++ - }); - nodes.push({ - type: 'text', - content: m[2], - level: level - }); - nodes.push({ - type: 'abbr_close', - level: --level - }); - pos = reg.lastIndex - m[3].length; - } - - if (!nodes.length) { continue; } - - if (pos < text.length) { - nodes.push({ - type: 'text', - content: text.slice(pos), - level: level - }); - } - - // replace current node - blockTokens[j].children = tokens = [].concat(tokens.slice(0, i), nodes, tokens.slice(i + 1)); - } - } -} - -// Simple typographical replacements -// -// TODO: -// - fractionals 1/2, 1/4, 3/4 -> ½, ¼, ¾ -// - miltiplication 2 x 4 -> 2 × 4 - -var RARE_RE = /\+-|\.\.|\?\?\?\?|!!!!|,,|--/; - -var SCOPED_ABBR_RE = /\((c|tm|r|p)\)/ig; -var SCOPED_ABBR = { - 'c': '©', - 'r': '®', - 'p': '§', - 'tm': '™' -}; - -function replaceScopedAbbr(str) { - if (str.indexOf('(') < 0) { return str; } - - return str.replace(SCOPED_ABBR_RE, function(match, name) { - return SCOPED_ABBR[name.toLowerCase()]; - }); -} - - -function replace(state) { - var i, token, text, inlineTokens, blkIdx; - - if (!state.options.typographer) { return; } - - for (blkIdx = state.tokens.length - 1; blkIdx >= 0; blkIdx--) { - - if (state.tokens[blkIdx].type !== 'inline') { continue; } - - inlineTokens = state.tokens[blkIdx].children; - - for (i = inlineTokens.length - 1; i >= 0; i--) { - token = inlineTokens[i]; - if (token.type === 'text') { - text = token.content; - - text = replaceScopedAbbr(text); - - if (RARE_RE.test(text)) { - text = text - .replace(/\+-/g, '±') - // .., ..., ....... -> … - // but ?..... & !..... -> ?.. & !.. - .replace(/\.{2,}/g, '…').replace(/([?!])…/g, '$1..') - .replace(/([?!]){4,}/g, '$1$1$1').replace(/,{2,}/g, ',') - // em-dash - .replace(/(^|[^-])---([^-]|$)/mg, '$1\u2014$2') - // en-dash - .replace(/(^|\s)--(\s|$)/mg, '$1\u2013$2') - .replace(/(^|[^-\s])--([^-\s]|$)/mg, '$1\u2013$2'); - } - - token.content = text; - } - } - } -} - -// Convert straight quotation marks to typographic ones -// - -var QUOTE_TEST_RE = /['"]/; -var QUOTE_RE = /['"]/g; -var PUNCT_RE = /[-\s()\[\]]/; -var APOSTROPHE = '’'; - -// This function returns true if the character at `pos` -// could be inside a word. -function isLetter(str, pos) { - if (pos < 0 || pos >= str.length) { return false; } - return !PUNCT_RE.test(str[pos]); -} - - -function replaceAt(str, index, ch) { - return str.substr(0, index) + ch + str.substr(index + 1); -} - - -function smartquotes(state) { - /*eslint max-depth:0*/ - var i, token, text, t, pos, max, thisLevel, lastSpace, nextSpace, item, - canOpen, canClose, j, isSingle, blkIdx, tokens, - stack; - - if (!state.options.typographer) { return; } - - stack = []; - - for (blkIdx = state.tokens.length - 1; blkIdx >= 0; blkIdx--) { - - if (state.tokens[blkIdx].type !== 'inline') { continue; } - - tokens = state.tokens[blkIdx].children; - stack.length = 0; - - for (i = 0; i < tokens.length; i++) { - token = tokens[i]; - - if (token.type !== 'text' || QUOTE_TEST_RE.test(token.text)) { continue; } - - thisLevel = tokens[i].level; - - for (j = stack.length - 1; j >= 0; j--) { - if (stack[j].level <= thisLevel) { break; } - } - stack.length = j + 1; - - text = token.content; - pos = 0; - max = text.length; - - /*eslint no-labels:0,block-scoped-var:0*/ - OUTER: - while (pos < max) { - QUOTE_RE.lastIndex = pos; - t = QUOTE_RE.exec(text); - if (!t) { break; } - - lastSpace = !isLetter(text, t.index - 1); - pos = t.index + 1; - isSingle = (t[0] === "'"); - nextSpace = !isLetter(text, pos); - - if (!nextSpace && !lastSpace) { - // middle of word - if (isSingle) { - token.content = replaceAt(token.content, t.index, APOSTROPHE); - } - continue; - } - - canOpen = !nextSpace; - canClose = !lastSpace; - - if (canClose) { - // this could be a closing quote, rewind the stack to get a match - for (j = stack.length - 1; j >= 0; j--) { - item = stack[j]; - if (stack[j].level < thisLevel) { break; } - if (item.single === isSingle && stack[j].level === thisLevel) { - item = stack[j]; - if (isSingle) { - tokens[item.token].content = replaceAt(tokens[item.token].content, item.pos, state.options.quotes[2]); - token.content = replaceAt(token.content, t.index, state.options.quotes[3]); - } else { - tokens[item.token].content = replaceAt(tokens[item.token].content, item.pos, state.options.quotes[0]); - token.content = replaceAt(token.content, t.index, state.options.quotes[1]); - } - stack.length = j; - continue OUTER; - } - } - } - - if (canOpen) { - stack.push({ - token: i, - pos: t.index, - single: isSingle, - level: thisLevel - }); - } else if (canClose && isSingle) { - token.content = replaceAt(token.content, t.index, APOSTROPHE); - } - } - } - } -} - -/** - * Core parser `rules` - */ - -var _rules = [ - [ 'block', block ], - [ 'abbr', abbr ], - [ 'references', references ], - [ 'inline', inline ], - [ 'footnote_tail', footnote_block ], - [ 'abbr2', abbr2 ], - [ 'replacements', replace ], - [ 'smartquotes', smartquotes ], -]; - -/** - * Class for top level (`core`) parser rules - * - * @api private - */ - -function Core() { - this.options = {}; - this.ruler = new Ruler(); - for (var i = 0; i < _rules.length; i++) { - this.ruler.push(_rules[i][0], _rules[i][1]); - } -} - -/** - * Process rules with the given `state` - * - * @param {Object} `state` - * @api private - */ - -Core.prototype.process = function (state) { - var i, l, rules; - rules = this.ruler.getRules(''); - for (i = 0, l = rules.length; i < l; i++) { - rules[i](state); - } -}; - -// Parser state class - -function StateBlock(src, parser, options, env, tokens) { - var ch, s, start, pos, len, indent, indent_found; - - this.src = src; - - // Shortcuts to simplify nested calls - this.parser = parser; - - this.options = options; - - this.env = env; - - // - // Internal state vartiables - // - - this.tokens = tokens; - - this.bMarks = []; // line begin offsets for fast jumps - this.eMarks = []; // line end offsets for fast jumps - this.tShift = []; // indent for each line - - // block parser variables - this.blkIndent = 0; // required block content indent - // (for example, if we are in list) - this.line = 0; // line index in src - this.lineMax = 0; // lines count - this.tight = false; // loose/tight mode for lists - this.parentType = 'root'; // if `list`, block parser stops on two newlines - this.ddIndent = -1; // indent of the current dd block (-1 if there isn't any) - - this.level = 0; - - // renderer - this.result = ''; - - // Create caches - // Generate markers. - s = this.src; - indent = 0; - indent_found = false; - - for (start = pos = indent = 0, len = s.length; pos < len; pos++) { - ch = s.charCodeAt(pos); - - if (!indent_found) { - if (ch === 0x20/* space */) { - indent++; - continue; - } else { - indent_found = true; - } - } - - if (ch === 0x0A || pos === len - 1) { - if (ch !== 0x0A) { pos++; } - this.bMarks.push(start); - this.eMarks.push(pos); - this.tShift.push(indent); - - indent_found = false; - indent = 0; - start = pos + 1; - } - } - - // Push fake entry to simplify cache bounds checks - this.bMarks.push(s.length); - this.eMarks.push(s.length); - this.tShift.push(0); - - this.lineMax = this.bMarks.length - 1; // don't count last fake line -} - -StateBlock.prototype.isEmpty = function isEmpty(line) { - return this.bMarks[line] + this.tShift[line] >= this.eMarks[line]; -}; - -StateBlock.prototype.skipEmptyLines = function skipEmptyLines(from) { - for (var max = this.lineMax; from < max; from++) { - if (this.bMarks[from] + this.tShift[from] < this.eMarks[from]) { - break; - } - } - return from; -}; - -// Skip spaces from given position. -StateBlock.prototype.skipSpaces = function skipSpaces(pos) { - for (var max = this.src.length; pos < max; pos++) { - if (this.src.charCodeAt(pos) !== 0x20/* space */) { break; } - } - return pos; -}; - -// Skip char codes from given position -StateBlock.prototype.skipChars = function skipChars(pos, code) { - for (var max = this.src.length; pos < max; pos++) { - if (this.src.charCodeAt(pos) !== code) { break; } - } - return pos; -}; - -// Skip char codes reverse from given position - 1 -StateBlock.prototype.skipCharsBack = function skipCharsBack(pos, code, min) { - if (pos <= min) { return pos; } - - while (pos > min) { - if (code !== this.src.charCodeAt(--pos)) { return pos + 1; } - } - return pos; -}; - -// cut lines range from source. -StateBlock.prototype.getLines = function getLines(begin, end, indent, keepLastLF) { - var i, first, last, queue, shift, - line = begin; - - if (begin >= end) { - return ''; - } - - // Opt: don't use push queue for single line; - if (line + 1 === end) { - first = this.bMarks[line] + Math.min(this.tShift[line], indent); - last = keepLastLF ? this.eMarks[line] + 1 : this.eMarks[line]; - return this.src.slice(first, last); - } - - queue = new Array(end - begin); - - for (i = 0; line < end; line++, i++) { - shift = this.tShift[line]; - if (shift > indent) { shift = indent; } - if (shift < 0) { shift = 0; } - - first = this.bMarks[line] + shift; - - if (line + 1 < end || keepLastLF) { - // No need for bounds check because we have fake entry on tail. - last = this.eMarks[line] + 1; - } else { - last = this.eMarks[line]; - } - - queue[i] = this.src.slice(first, last); - } - - return queue.join(''); -}; - -// Code block (4 spaces padded) - -function code(state, startLine, endLine/*, silent*/) { - var nextLine, last; - - if (state.tShift[startLine] - state.blkIndent < 4) { return false; } - - last = nextLine = startLine + 1; - - while (nextLine < endLine) { - if (state.isEmpty(nextLine)) { - nextLine++; - continue; - } - if (state.tShift[nextLine] - state.blkIndent >= 4) { - nextLine++; - last = nextLine; - continue; - } - break; - } - - state.line = nextLine; - state.tokens.push({ - type: 'code', - content: state.getLines(startLine, last, 4 + state.blkIndent, true), - block: true, - lines: [ startLine, state.line ], - level: state.level - }); - - return true; -} - -// fences (``` lang, ~~~ lang) - -function fences(state, startLine, endLine, silent) { - var marker, len, params, nextLine, mem, - haveEndMarker = false, - pos = state.bMarks[startLine] + state.tShift[startLine], - max = state.eMarks[startLine]; - - if (pos + 3 > max) { return false; } - - marker = state.src.charCodeAt(pos); - - if (marker !== 0x7E/* ~ */ && marker !== 0x60 /* ` */) { - return false; - } - - // scan marker length - mem = pos; - pos = state.skipChars(pos, marker); - - len = pos - mem; - - if (len < 3) { return false; } - - params = state.src.slice(pos, max).trim(); - - if (params.indexOf('`') >= 0) { return false; } - - // Since start is found, we can report success here in validation mode - if (silent) { return true; } - - // search end of block - nextLine = startLine; - - for (;;) { - nextLine++; - if (nextLine >= endLine) { - // unclosed block should be autoclosed by end of document. - // also block seems to be autoclosed by end of parent - break; - } - - pos = mem = state.bMarks[nextLine] + state.tShift[nextLine]; - max = state.eMarks[nextLine]; - - if (pos < max && state.tShift[nextLine] < state.blkIndent) { - // non-empty line with negative indent should stop the list: - // - ``` - // test - break; - } - - if (state.src.charCodeAt(pos) !== marker) { continue; } - - if (state.tShift[nextLine] - state.blkIndent >= 4) { - // closing fence should be indented less than 4 spaces - continue; - } - - pos = state.skipChars(pos, marker); - - // closing code fence must be at least as long as the opening one - if (pos - mem < len) { continue; } - - // make sure tail has spaces only - pos = state.skipSpaces(pos); - - if (pos < max) { continue; } - - haveEndMarker = true; - // found! - break; - } - - // If a fence has heading spaces, they should be removed from its inner block - len = state.tShift[startLine]; - - state.line = nextLine + (haveEndMarker ? 1 : 0); - state.tokens.push({ - type: 'fence', - params: params, - content: state.getLines(startLine + 1, nextLine, len, true), - lines: [ startLine, state.line ], - level: state.level - }); - - return true; -} - -// Block quotes - -function blockquote(state, startLine, endLine, silent) { - var nextLine, lastLineEmpty, oldTShift, oldBMarks, oldIndent, oldParentType, lines, - terminatorRules, - i, l, terminate, - pos = state.bMarks[startLine] + state.tShift[startLine], - max = state.eMarks[startLine]; - - if (pos > max) { return false; } - - // check the block quote marker - if (state.src.charCodeAt(pos++) !== 0x3E/* > */) { return false; } - - if (state.level >= state.options.maxNesting) { return false; } - - // we know that it's going to be a valid blockquote, - // so no point trying to find the end of it in silent mode - if (silent) { return true; } - - // skip one optional space after '>' - if (state.src.charCodeAt(pos) === 0x20) { pos++; } - - oldIndent = state.blkIndent; - state.blkIndent = 0; - - oldBMarks = [ state.bMarks[startLine] ]; - state.bMarks[startLine] = pos; - - // check if we have an empty blockquote - pos = pos < max ? state.skipSpaces(pos) : pos; - lastLineEmpty = pos >= max; - - oldTShift = [ state.tShift[startLine] ]; - state.tShift[startLine] = pos - state.bMarks[startLine]; - - terminatorRules = state.parser.ruler.getRules('blockquote'); - - // Search the end of the block - // - // Block ends with either: - // 1. an empty line outside: - // ``` - // > test - // - // ``` - // 2. an empty line inside: - // ``` - // > - // test - // ``` - // 3. another tag - // ``` - // > test - // - - - - // ``` - for (nextLine = startLine + 1; nextLine < endLine; nextLine++) { - pos = state.bMarks[nextLine] + state.tShift[nextLine]; - max = state.eMarks[nextLine]; - - if (pos >= max) { - // Case 1: line is not inside the blockquote, and this line is empty. - break; - } - - if (state.src.charCodeAt(pos++) === 0x3E/* > */) { - // This line is inside the blockquote. - - // skip one optional space after '>' - if (state.src.charCodeAt(pos) === 0x20) { pos++; } - - oldBMarks.push(state.bMarks[nextLine]); - state.bMarks[nextLine] = pos; - - pos = pos < max ? state.skipSpaces(pos) : pos; - lastLineEmpty = pos >= max; - - oldTShift.push(state.tShift[nextLine]); - state.tShift[nextLine] = pos - state.bMarks[nextLine]; - continue; - } - - // Case 2: line is not inside the blockquote, and the last line was empty. - if (lastLineEmpty) { break; } - - // Case 3: another tag found. - terminate = false; - for (i = 0, l = terminatorRules.length; i < l; i++) { - if (terminatorRules[i](state, nextLine, endLine, true)) { - terminate = true; - break; - } - } - if (terminate) { break; } - - oldBMarks.push(state.bMarks[nextLine]); - oldTShift.push(state.tShift[nextLine]); - - // A negative number means that this is a paragraph continuation; - // - // Any negative number will do the job here, but it's better for it - // to be large enough to make any bugs obvious. - state.tShift[nextLine] = -1337; - } - - oldParentType = state.parentType; - state.parentType = 'blockquote'; - state.tokens.push({ - type: 'blockquote_open', - lines: lines = [ startLine, 0 ], - level: state.level++ - }); - state.parser.tokenize(state, startLine, nextLine); - state.tokens.push({ - type: 'blockquote_close', - level: --state.level - }); - state.parentType = oldParentType; - lines[1] = state.line; - - // Restore original tShift; this might not be necessary since the parser - // has already been here, but just to make sure we can do that. - for (i = 0; i < oldTShift.length; i++) { - state.bMarks[i + startLine] = oldBMarks[i]; - state.tShift[i + startLine] = oldTShift[i]; - } - state.blkIndent = oldIndent; - - return true; -} - -// Horizontal rule - -function hr(state, startLine, endLine, silent) { - var marker, cnt, ch, - pos = state.bMarks[startLine], - max = state.eMarks[startLine]; - - pos += state.tShift[startLine]; - - if (pos > max) { return false; } - - marker = state.src.charCodeAt(pos++); - - // Check hr marker - if (marker !== 0x2A/* * */ && - marker !== 0x2D/* - */ && - marker !== 0x5F/* _ */) { - return false; - } - - // markers can be mixed with spaces, but there should be at least 3 one - - cnt = 1; - while (pos < max) { - ch = state.src.charCodeAt(pos++); - if (ch !== marker && ch !== 0x20/* space */) { return false; } - if (ch === marker) { cnt++; } - } - - if (cnt < 3) { return false; } - - if (silent) { return true; } - - state.line = startLine + 1; - state.tokens.push({ - type: 'hr', - lines: [ startLine, state.line ], - level: state.level - }); - - return true; -} - -// Lists - -// Search `[-+*][\n ]`, returns next pos arter marker on success -// or -1 on fail. -function skipBulletListMarker(state, startLine) { - var marker, pos, max; - - pos = state.bMarks[startLine] + state.tShift[startLine]; - max = state.eMarks[startLine]; - - if (pos >= max) { return -1; } - - marker = state.src.charCodeAt(pos++); - // Check bullet - if (marker !== 0x2A/* * */ && - marker !== 0x2D/* - */ && - marker !== 0x2B/* + */) { - return -1; - } - - if (pos < max && state.src.charCodeAt(pos) !== 0x20) { - // " 1.test " - is not a list item - return -1; - } - - return pos; -} - -// Search `\d+[.)][\n ]`, returns next pos arter marker on success -// or -1 on fail. -function skipOrderedListMarker(state, startLine) { - var ch, - pos = state.bMarks[startLine] + state.tShift[startLine], - max = state.eMarks[startLine]; - - if (pos + 1 >= max) { return -1; } - - ch = state.src.charCodeAt(pos++); - - if (ch < 0x30/* 0 */ || ch > 0x39/* 9 */) { return -1; } - - for (;;) { - // EOL -> fail - if (pos >= max) { return -1; } - - ch = state.src.charCodeAt(pos++); - - if (ch >= 0x30/* 0 */ && ch <= 0x39/* 9 */) { - continue; - } - - // found valid marker - if (ch === 0x29/* ) */ || ch === 0x2e/* . */) { - break; - } - - return -1; - } - - - if (pos < max && state.src.charCodeAt(pos) !== 0x20/* space */) { - // " 1.test " - is not a list item - return -1; - } - return pos; -} - -function markTightParagraphs(state, idx) { - var i, l, - level = state.level + 2; - - for (i = idx + 2, l = state.tokens.length - 2; i < l; i++) { - if (state.tokens[i].level === level && state.tokens[i].type === 'paragraph_open') { - state.tokens[i + 2].tight = true; - state.tokens[i].tight = true; - i += 2; - } - } -} - - -function list(state, startLine, endLine, silent) { - var nextLine, - indent, - oldTShift, - oldIndent, - oldTight, - oldParentType, - start, - posAfterMarker, - max, - indentAfterMarker, - markerValue, - markerCharCode, - isOrdered, - contentStart, - listTokIdx, - prevEmptyEnd, - listLines, - itemLines, - tight = true, - terminatorRules, - i, l, terminate; - - // Detect list type and position after marker - if ((posAfterMarker = skipOrderedListMarker(state, startLine)) >= 0) { - isOrdered = true; - } else if ((posAfterMarker = skipBulletListMarker(state, startLine)) >= 0) { - isOrdered = false; - } else { - return false; - } - - if (state.level >= state.options.maxNesting) { return false; } - - // We should terminate list on style change. Remember first one to compare. - markerCharCode = state.src.charCodeAt(posAfterMarker - 1); - - // For validation mode we can terminate immediately - if (silent) { return true; } - - // Start list - listTokIdx = state.tokens.length; - - if (isOrdered) { - start = state.bMarks[startLine] + state.tShift[startLine]; - markerValue = Number(state.src.substr(start, posAfterMarker - start - 1)); - - state.tokens.push({ - type: 'ordered_list_open', - order: markerValue, - lines: listLines = [ startLine, 0 ], - level: state.level++ - }); - - } else { - state.tokens.push({ - type: 'bullet_list_open', - lines: listLines = [ startLine, 0 ], - level: state.level++ - }); - } - - // - // Iterate list items - // - - nextLine = startLine; - prevEmptyEnd = false; - terminatorRules = state.parser.ruler.getRules('list'); - - while (nextLine < endLine) { - contentStart = state.skipSpaces(posAfterMarker); - max = state.eMarks[nextLine]; - - if (contentStart >= max) { - // trimming space in "- \n 3" case, indent is 1 here - indentAfterMarker = 1; - } else { - indentAfterMarker = contentStart - posAfterMarker; - } - - // If we have more than 4 spaces, the indent is 1 - // (the rest is just indented code block) - if (indentAfterMarker > 4) { indentAfterMarker = 1; } - - // If indent is less than 1, assume that it's one, example: - // "-\n test" - if (indentAfterMarker < 1) { indentAfterMarker = 1; } - - // " - test" - // ^^^^^ - calculating total length of this thing - indent = (posAfterMarker - state.bMarks[nextLine]) + indentAfterMarker; - - // Run subparser & write tokens - state.tokens.push({ - type: 'list_item_open', - lines: itemLines = [ startLine, 0 ], - level: state.level++ - }); - - oldIndent = state.blkIndent; - oldTight = state.tight; - oldTShift = state.tShift[startLine]; - oldParentType = state.parentType; - state.tShift[startLine] = contentStart - state.bMarks[startLine]; - state.blkIndent = indent; - state.tight = true; - state.parentType = 'list'; - - state.parser.tokenize(state, startLine, endLine, true); - - // If any of list item is tight, mark list as tight - if (!state.tight || prevEmptyEnd) { - tight = false; - } - // Item become loose if finish with empty line, - // but we should filter last element, because it means list finish - prevEmptyEnd = (state.line - startLine) > 1 && state.isEmpty(state.line - 1); - - state.blkIndent = oldIndent; - state.tShift[startLine] = oldTShift; - state.tight = oldTight; - state.parentType = oldParentType; - - state.tokens.push({ - type: 'list_item_close', - level: --state.level - }); - - nextLine = startLine = state.line; - itemLines[1] = nextLine; - contentStart = state.bMarks[startLine]; - - if (nextLine >= endLine) { break; } - - if (state.isEmpty(nextLine)) { - break; - } - - // - // Try to check if list is terminated or continued. - // - if (state.tShift[nextLine] < state.blkIndent) { break; } - - // fail if terminating block found - terminate = false; - for (i = 0, l = terminatorRules.length; i < l; i++) { - if (terminatorRules[i](state, nextLine, endLine, true)) { - terminate = true; - break; - } - } - if (terminate) { break; } - - // fail if list has another type - if (isOrdered) { - posAfterMarker = skipOrderedListMarker(state, nextLine); - if (posAfterMarker < 0) { break; } - } else { - posAfterMarker = skipBulletListMarker(state, nextLine); - if (posAfterMarker < 0) { break; } - } - - if (markerCharCode !== state.src.charCodeAt(posAfterMarker - 1)) { break; } - } - - // Finilize list - state.tokens.push({ - type: isOrdered ? 'ordered_list_close' : 'bullet_list_close', - level: --state.level - }); - listLines[1] = nextLine; - - state.line = nextLine; - - // mark paragraphs tight if needed - if (tight) { - markTightParagraphs(state, listTokIdx); - } - - return true; -} - -// Process footnote reference list - -function footnote(state, startLine, endLine, silent) { - var oldBMark, oldTShift, oldParentType, pos, label, - start = state.bMarks[startLine] + state.tShift[startLine], - max = state.eMarks[startLine]; - - // line should be at least 5 chars - "[^x]:" - if (start + 4 > max) { return false; } - - if (state.src.charCodeAt(start) !== 0x5B/* [ */) { return false; } - if (state.src.charCodeAt(start + 1) !== 0x5E/* ^ */) { return false; } - if (state.level >= state.options.maxNesting) { return false; } - - for (pos = start + 2; pos < max; pos++) { - if (state.src.charCodeAt(pos) === 0x20) { return false; } - if (state.src.charCodeAt(pos) === 0x5D /* ] */) { - break; - } - } - - if (pos === start + 2) { return false; } // no empty footnote labels - if (pos + 1 >= max || state.src.charCodeAt(++pos) !== 0x3A /* : */) { return false; } - if (silent) { return true; } - pos++; - - if (!state.env.footnotes) { state.env.footnotes = {}; } - if (!state.env.footnotes.refs) { state.env.footnotes.refs = {}; } - label = state.src.slice(start + 2, pos - 2); - state.env.footnotes.refs[':' + label] = -1; - - state.tokens.push({ - type: 'footnote_reference_open', - label: label, - level: state.level++ - }); - - oldBMark = state.bMarks[startLine]; - oldTShift = state.tShift[startLine]; - oldParentType = state.parentType; - state.tShift[startLine] = state.skipSpaces(pos) - pos; - state.bMarks[startLine] = pos; - state.blkIndent += 4; - state.parentType = 'footnote'; - - if (state.tShift[startLine] < state.blkIndent) { - state.tShift[startLine] += state.blkIndent; - state.bMarks[startLine] -= state.blkIndent; - } - - state.parser.tokenize(state, startLine, endLine, true); - - state.parentType = oldParentType; - state.blkIndent -= 4; - state.tShift[startLine] = oldTShift; - state.bMarks[startLine] = oldBMark; - - state.tokens.push({ - type: 'footnote_reference_close', - level: --state.level - }); - - return true; -} - -// heading (#, ##, ...) - -function heading(state, startLine, endLine, silent) { - var ch, level, tmp, - pos = state.bMarks[startLine] + state.tShift[startLine], - max = state.eMarks[startLine]; - - if (pos >= max) { return false; } - - ch = state.src.charCodeAt(pos); - - if (ch !== 0x23/* # */ || pos >= max) { return false; } - - // count heading level - level = 1; - ch = state.src.charCodeAt(++pos); - while (ch === 0x23/* # */ && pos < max && level <= 6) { - level++; - ch = state.src.charCodeAt(++pos); - } - - if (level > 6 || (pos < max && ch !== 0x20/* space */)) { return false; } - - if (silent) { return true; } - - // Let's cut tails like ' ### ' from the end of string - - max = state.skipCharsBack(max, 0x20, pos); // space - tmp = state.skipCharsBack(max, 0x23, pos); // # - if (tmp > pos && state.src.charCodeAt(tmp - 1) === 0x20/* space */) { - max = tmp; - } - - state.line = startLine + 1; - - state.tokens.push({ type: 'heading_open', - hLevel: level, - lines: [ startLine, state.line ], - level: state.level - }); - - // only if header is not empty - if (pos < max) { - state.tokens.push({ - type: 'inline', - content: state.src.slice(pos, max).trim(), - level: state.level + 1, - lines: [ startLine, state.line ], - children: [] - }); - } - state.tokens.push({ type: 'heading_close', hLevel: level, level: state.level }); - - return true; -} - -// lheading (---, ===) - -function lheading(state, startLine, endLine/*, silent*/) { - var marker, pos, max, - next = startLine + 1; - - if (next >= endLine) { return false; } - if (state.tShift[next] < state.blkIndent) { return false; } - - // Scan next line - - if (state.tShift[next] - state.blkIndent > 3) { return false; } - - pos = state.bMarks[next] + state.tShift[next]; - max = state.eMarks[next]; - - if (pos >= max) { return false; } - - marker = state.src.charCodeAt(pos); - - if (marker !== 0x2D/* - */ && marker !== 0x3D/* = */) { return false; } - - pos = state.skipChars(pos, marker); - - pos = state.skipSpaces(pos); - - if (pos < max) { return false; } - - pos = state.bMarks[startLine] + state.tShift[startLine]; - - state.line = next + 1; - state.tokens.push({ - type: 'heading_open', - hLevel: marker === 0x3D/* = */ ? 1 : 2, - lines: [ startLine, state.line ], - level: state.level - }); - state.tokens.push({ - type: 'inline', - content: state.src.slice(pos, state.eMarks[startLine]).trim(), - level: state.level + 1, - lines: [ startLine, state.line - 1 ], - children: [] - }); - state.tokens.push({ - type: 'heading_close', - hLevel: marker === 0x3D/* = */ ? 1 : 2, - level: state.level - }); - - return true; -} - -// List of valid html blocks names, accorting to commonmark spec -// http://jgm.github.io/CommonMark/spec.html#html-blocks - -var html_blocks = {}; - -[ - 'article', - 'aside', - 'button', - 'blockquote', - 'body', - 'canvas', - 'caption', - 'col', - 'colgroup', - 'dd', - 'div', - 'dl', - 'dt', - 'embed', - 'fieldset', - 'figcaption', - 'figure', - 'footer', - 'form', - 'h1', - 'h2', - 'h3', - 'h4', - 'h5', - 'h6', - 'header', - 'hgroup', - 'hr', - 'iframe', - 'li', - 'map', - 'object', - 'ol', - 'output', - 'p', - 'pre', - 'progress', - 'script', - 'section', - 'style', - 'table', - 'tbody', - 'td', - 'textarea', - 'tfoot', - 'th', - 'tr', - 'thead', - 'ul', - 'video' -].forEach(function (name) { html_blocks[name] = true; }); - -// HTML block - - -var HTML_TAG_OPEN_RE = /^<([a-zA-Z]{1,15})[\s\/>]/; -var HTML_TAG_CLOSE_RE = /^<\/([a-zA-Z]{1,15})[\s>]/; - -function isLetter$1(ch) { - /*eslint no-bitwise:0*/ - var lc = ch | 0x20; // to lower case - return (lc >= 0x61/* a */) && (lc <= 0x7a/* z */); -} - -function htmlblock(state, startLine, endLine, silent) { - var ch, match, nextLine, - pos = state.bMarks[startLine], - max = state.eMarks[startLine], - shift = state.tShift[startLine]; - - pos += shift; - - if (!state.options.html) { return false; } - - if (shift > 3 || pos + 2 >= max) { return false; } - - if (state.src.charCodeAt(pos) !== 0x3C/* < */) { return false; } - - ch = state.src.charCodeAt(pos + 1); - - if (ch === 0x21/* ! */ || ch === 0x3F/* ? */) { - // Directive start / comment start / processing instruction start - if (silent) { return true; } - - } else if (ch === 0x2F/* / */ || isLetter$1(ch)) { - - // Probably start or end of tag - if (ch === 0x2F/* \ */) { - // closing tag - match = state.src.slice(pos, max).match(HTML_TAG_CLOSE_RE); - if (!match) { return false; } - } else { - // opening tag - match = state.src.slice(pos, max).match(HTML_TAG_OPEN_RE); - if (!match) { return false; } - } - // Make sure tag name is valid - if (html_blocks[match[1].toLowerCase()] !== true) { return false; } - if (silent) { return true; } - - } else { - return false; - } - - // If we are here - we detected HTML block. - // Let's roll down till empty line (block end). - nextLine = startLine + 1; - while (nextLine < state.lineMax && !state.isEmpty(nextLine)) { - nextLine++; - } - - state.line = nextLine; - state.tokens.push({ - type: 'htmlblock', - level: state.level, - lines: [ startLine, state.line ], - content: state.getLines(startLine, nextLine, 0, true) - }); - - return true; -} - -// GFM table, non-standard - -function getLine(state, line) { - var pos = state.bMarks[line] + state.blkIndent, - max = state.eMarks[line]; - - return state.src.substr(pos, max - pos); -} - -function table(state, startLine, endLine, silent) { - var ch, lineText, pos, i, nextLine, rows, cell, - aligns, t, tableLines, tbodyLines; - - // should have at least three lines - if (startLine + 2 > endLine) { return false; } - - nextLine = startLine + 1; - - if (state.tShift[nextLine] < state.blkIndent) { return false; } - - // first character of the second line should be '|' or '-' - - pos = state.bMarks[nextLine] + state.tShift[nextLine]; - if (pos >= state.eMarks[nextLine]) { return false; } - - ch = state.src.charCodeAt(pos); - if (ch !== 0x7C/* | */ && ch !== 0x2D/* - */ && ch !== 0x3A/* : */) { return false; } - - lineText = getLine(state, startLine + 1); - if (!/^[-:| ]+$/.test(lineText)) { return false; } - - rows = lineText.split('|'); - if (rows <= 2) { return false; } - aligns = []; - for (i = 0; i < rows.length; i++) { - t = rows[i].trim(); - if (!t) { - // allow empty columns before and after table, but not in between columns; - // e.g. allow ` |---| `, disallow ` ---||--- ` - if (i === 0 || i === rows.length - 1) { - continue; - } else { - return false; - } - } - - if (!/^:?-+:?$/.test(t)) { return false; } - if (t.charCodeAt(t.length - 1) === 0x3A/* : */) { - aligns.push(t.charCodeAt(0) === 0x3A/* : */ ? 'center' : 'right'); - } else if (t.charCodeAt(0) === 0x3A/* : */) { - aligns.push('left'); - } else { - aligns.push(''); - } - } - - lineText = getLine(state, startLine).trim(); - if (lineText.indexOf('|') === -1) { return false; } - rows = lineText.replace(/^\||\|$/g, '').split('|'); - if (aligns.length !== rows.length) { return false; } - if (silent) { return true; } - - state.tokens.push({ - type: 'table_open', - lines: tableLines = [ startLine, 0 ], - level: state.level++ - }); - state.tokens.push({ - type: 'thead_open', - lines: [ startLine, startLine + 1 ], - level: state.level++ - }); - - state.tokens.push({ - type: 'tr_open', - lines: [ startLine, startLine + 1 ], - level: state.level++ - }); - for (i = 0; i < rows.length; i++) { - state.tokens.push({ - type: 'th_open', - align: aligns[i], - lines: [ startLine, startLine + 1 ], - level: state.level++ - }); - state.tokens.push({ - type: 'inline', - content: rows[i].trim(), - lines: [ startLine, startLine + 1 ], - level: state.level, - children: [] - }); - state.tokens.push({ type: 'th_close', level: --state.level }); - } - state.tokens.push({ type: 'tr_close', level: --state.level }); - state.tokens.push({ type: 'thead_close', level: --state.level }); - - state.tokens.push({ - type: 'tbody_open', - lines: tbodyLines = [ startLine + 2, 0 ], - level: state.level++ - }); - - for (nextLine = startLine + 2; nextLine < endLine; nextLine++) { - if (state.tShift[nextLine] < state.blkIndent) { break; } - - lineText = getLine(state, nextLine).trim(); - if (lineText.indexOf('|') === -1) { break; } - rows = lineText.replace(/^\||\|$/g, '').split('|'); - - state.tokens.push({ type: 'tr_open', level: state.level++ }); - for (i = 0; i < rows.length; i++) { - state.tokens.push({ type: 'td_open', align: aligns[i], level: state.level++ }); - // 0x7c === '|' - cell = rows[i].substring( - rows[i].charCodeAt(0) === 0x7c ? 1 : 0, - rows[i].charCodeAt(rows[i].length - 1) === 0x7c ? rows[i].length - 1 : rows[i].length - ).trim(); - state.tokens.push({ - type: 'inline', - content: cell, - level: state.level, - children: [] - }); - state.tokens.push({ type: 'td_close', level: --state.level }); - } - state.tokens.push({ type: 'tr_close', level: --state.level }); - } - state.tokens.push({ type: 'tbody_close', level: --state.level }); - state.tokens.push({ type: 'table_close', level: --state.level }); - - tableLines[1] = tbodyLines[1] = nextLine; - state.line = nextLine; - return true; -} - -// Definition lists - -// Search `[:~][\n ]`, returns next pos after marker on success -// or -1 on fail. -function skipMarker(state, line) { - var pos, marker, - start = state.bMarks[line] + state.tShift[line], - max = state.eMarks[line]; - - if (start >= max) { return -1; } - - // Check bullet - marker = state.src.charCodeAt(start++); - if (marker !== 0x7E/* ~ */ && marker !== 0x3A/* : */) { return -1; } - - pos = state.skipSpaces(start); - - // require space after ":" - if (start === pos) { return -1; } - - // no empty definitions, e.g. " : " - if (pos >= max) { return -1; } - - return pos; -} - -function markTightParagraphs$1(state, idx) { - var i, l, - level = state.level + 2; - - for (i = idx + 2, l = state.tokens.length - 2; i < l; i++) { - if (state.tokens[i].level === level && state.tokens[i].type === 'paragraph_open') { - state.tokens[i + 2].tight = true; - state.tokens[i].tight = true; - i += 2; - } - } -} - -function deflist(state, startLine, endLine, silent) { - var contentStart, - ddLine, - dtLine, - itemLines, - listLines, - listTokIdx, - nextLine, - oldIndent, - oldDDIndent, - oldParentType, - oldTShift, - oldTight, - prevEmptyEnd, - tight; - - if (silent) { - // quirk: validation mode validates a dd block only, not a whole deflist - if (state.ddIndent < 0) { return false; } - return skipMarker(state, startLine) >= 0; - } - - nextLine = startLine + 1; - if (state.isEmpty(nextLine)) { - if (++nextLine > endLine) { return false; } - } - - if (state.tShift[nextLine] < state.blkIndent) { return false; } - contentStart = skipMarker(state, nextLine); - if (contentStart < 0) { return false; } - - if (state.level >= state.options.maxNesting) { return false; } - - // Start list - listTokIdx = state.tokens.length; - - state.tokens.push({ - type: 'dl_open', - lines: listLines = [ startLine, 0 ], - level: state.level++ - }); - - // - // Iterate list items - // - - dtLine = startLine; - ddLine = nextLine; - - // One definition list can contain multiple DTs, - // and one DT can be followed by multiple DDs. - // - // Thus, there is two loops here, and label is - // needed to break out of the second one - // - /*eslint no-labels:0,block-scoped-var:0*/ - OUTER: - for (;;) { - tight = true; - prevEmptyEnd = false; - - state.tokens.push({ - type: 'dt_open', - lines: [ dtLine, dtLine ], - level: state.level++ - }); - state.tokens.push({ - type: 'inline', - content: state.getLines(dtLine, dtLine + 1, state.blkIndent, false).trim(), - level: state.level + 1, - lines: [ dtLine, dtLine ], - children: [] - }); - state.tokens.push({ - type: 'dt_close', - level: --state.level - }); - - for (;;) { - state.tokens.push({ - type: 'dd_open', - lines: itemLines = [ nextLine, 0 ], - level: state.level++ - }); - - oldTight = state.tight; - oldDDIndent = state.ddIndent; - oldIndent = state.blkIndent; - oldTShift = state.tShift[ddLine]; - oldParentType = state.parentType; - state.blkIndent = state.ddIndent = state.tShift[ddLine] + 2; - state.tShift[ddLine] = contentStart - state.bMarks[ddLine]; - state.tight = true; - state.parentType = 'deflist'; - - state.parser.tokenize(state, ddLine, endLine, true); - - // If any of list item is tight, mark list as tight - if (!state.tight || prevEmptyEnd) { - tight = false; - } - // Item become loose if finish with empty line, - // but we should filter last element, because it means list finish - prevEmptyEnd = (state.line - ddLine) > 1 && state.isEmpty(state.line - 1); - - state.tShift[ddLine] = oldTShift; - state.tight = oldTight; - state.parentType = oldParentType; - state.blkIndent = oldIndent; - state.ddIndent = oldDDIndent; - - state.tokens.push({ - type: 'dd_close', - level: --state.level - }); - - itemLines[1] = nextLine = state.line; - - if (nextLine >= endLine) { break OUTER; } - - if (state.tShift[nextLine] < state.blkIndent) { break OUTER; } - contentStart = skipMarker(state, nextLine); - if (contentStart < 0) { break; } - - ddLine = nextLine; - - // go to the next loop iteration: - // insert DD tag and repeat checking - } - - if (nextLine >= endLine) { break; } - dtLine = nextLine; - - if (state.isEmpty(dtLine)) { break; } - if (state.tShift[dtLine] < state.blkIndent) { break; } - - ddLine = dtLine + 1; - if (ddLine >= endLine) { break; } - if (state.isEmpty(ddLine)) { ddLine++; } - if (ddLine >= endLine) { break; } - - if (state.tShift[ddLine] < state.blkIndent) { break; } - contentStart = skipMarker(state, ddLine); - if (contentStart < 0) { break; } - - // go to the next loop iteration: - // insert DT and DD tags and repeat checking - } - - // Finilize list - state.tokens.push({ - type: 'dl_close', - level: --state.level - }); - listLines[1] = nextLine; - - state.line = nextLine; - - // mark paragraphs tight if needed - if (tight) { - markTightParagraphs$1(state, listTokIdx); - } - - return true; -} - -// Paragraph - -function paragraph(state, startLine/*, endLine*/) { - var endLine, content, terminate, i, l, - nextLine = startLine + 1, - terminatorRules; - - endLine = state.lineMax; - - // jump line-by-line until empty one or EOF - if (nextLine < endLine && !state.isEmpty(nextLine)) { - terminatorRules = state.parser.ruler.getRules('paragraph'); - - for (; nextLine < endLine && !state.isEmpty(nextLine); nextLine++) { - // this would be a code block normally, but after paragraph - // it's considered a lazy continuation regardless of what's there - if (state.tShift[nextLine] - state.blkIndent > 3) { continue; } - - // Some tags can terminate paragraph without empty line. - terminate = false; - for (i = 0, l = terminatorRules.length; i < l; i++) { - if (terminatorRules[i](state, nextLine, endLine, true)) { - terminate = true; - break; - } - } - if (terminate) { break; } - } - } - - content = state.getLines(startLine, nextLine, state.blkIndent, false).trim(); - - state.line = nextLine; - if (content.length) { - state.tokens.push({ - type: 'paragraph_open', - tight: false, - lines: [ startLine, state.line ], - level: state.level - }); - state.tokens.push({ - type: 'inline', - content: content, - level: state.level + 1, - lines: [ startLine, state.line ], - children: [] - }); - state.tokens.push({ - type: 'paragraph_close', - tight: false, - level: state.level - }); - } - - return true; -} - -/** - * Parser rules - */ - -var _rules$1 = [ - [ 'code', code ], - [ 'fences', fences, [ 'paragraph', 'blockquote', 'list' ] ], - [ 'blockquote', blockquote, [ 'paragraph', 'blockquote', 'list' ] ], - [ 'hr', hr, [ 'paragraph', 'blockquote', 'list' ] ], - [ 'list', list, [ 'paragraph', 'blockquote' ] ], - [ 'footnote', footnote, [ 'paragraph' ] ], - [ 'heading', heading, [ 'paragraph', 'blockquote' ] ], - [ 'lheading', lheading ], - [ 'htmlblock', htmlblock, [ 'paragraph', 'blockquote' ] ], - [ 'table', table, [ 'paragraph' ] ], - [ 'deflist', deflist, [ 'paragraph' ] ], - [ 'paragraph', paragraph ] -]; - -/** - * Block Parser class - * - * @api private - */ - -function ParserBlock() { - this.ruler = new Ruler(); - for (var i = 0; i < _rules$1.length; i++) { - this.ruler.push(_rules$1[i][0], _rules$1[i][1], { - alt: (_rules$1[i][2] || []).slice() - }); - } -} - -/** - * Generate tokens for the given input range. - * - * @param {Object} `state` Has properties like `src`, `parser`, `options` etc - * @param {Number} `startLine` - * @param {Number} `endLine` - * @api private - */ - -ParserBlock.prototype.tokenize = function (state, startLine, endLine) { - var rules = this.ruler.getRules(''); - var len = rules.length; - var line = startLine; - var hasEmptyLines = false; - var ok, i; - - while (line < endLine) { - state.line = line = state.skipEmptyLines(line); - if (line >= endLine) { - break; - } - - // Termination condition for nested calls. - // Nested calls currently used for blockquotes & lists - if (state.tShift[line] < state.blkIndent) { - break; - } - - // Try all possible rules. - // On success, rule should: - // - // - update `state.line` - // - update `state.tokens` - // - return true - - for (i = 0; i < len; i++) { - ok = rules[i](state, line, endLine, false); - if (ok) { - break; - } - } - - // set state.tight iff we had an empty line before current tag - // i.e. latest empty line should not count - state.tight = !hasEmptyLines; - - // paragraph might "eat" one newline after it in nested lists - if (state.isEmpty(state.line - 1)) { - hasEmptyLines = true; - } - - line = state.line; - - if (line < endLine && state.isEmpty(line)) { - hasEmptyLines = true; - line++; - - // two empty lines should stop the parser in list mode - if (line < endLine && state.parentType === 'list' && state.isEmpty(line)) { break; } - state.line = line; - } - } -}; - -var TABS_SCAN_RE = /[\n\t]/g; -var NEWLINES_RE = /\r[\n\u0085]|[\u2424\u2028\u0085]/g; -var SPACES_RE = /\u00a0/g; - -/** - * Tokenize the given `str`. - * - * @param {String} `str` Source string - * @param {Object} `options` - * @param {Object} `env` - * @param {Array} `outTokens` - * @api private - */ - -ParserBlock.prototype.parse = function (str, options, env, outTokens) { - var state, lineStart = 0, lastTabPos = 0; - if (!str) { return []; } - - // Normalize spaces - str = str.replace(SPACES_RE, ' '); - - // Normalize newlines - str = str.replace(NEWLINES_RE, '\n'); - - // Replace tabs with proper number of spaces (1..4) - if (str.indexOf('\t') >= 0) { - str = str.replace(TABS_SCAN_RE, function (match, offset) { - var result; - if (str.charCodeAt(offset) === 0x0A) { - lineStart = offset + 1; - lastTabPos = 0; - return match; - } - result = ' '.slice((offset - lineStart - lastTabPos) % 4); - lastTabPos = offset - lineStart + 1; - return result; - }); - } - - state = new StateBlock(str, this, options, env, outTokens); - this.tokenize(state, state.line, state.lineMax); -}; - -// Skip text characters for text token, place those to pending buffer -// and increment current pos - -// Rule to skip pure text -// '{}$%@~+=:' reserved for extentions - -function isTerminatorChar(ch) { - switch (ch) { - case 0x0A/* \n */: - case 0x5C/* \ */: - case 0x60/* ` */: - case 0x2A/* * */: - case 0x5F/* _ */: - case 0x5E/* ^ */: - case 0x5B/* [ */: - case 0x5D/* ] */: - case 0x21/* ! */: - case 0x26/* & */: - case 0x3C/* < */: - case 0x3E/* > */: - case 0x7B/* { */: - case 0x7D/* } */: - case 0x24/* $ */: - case 0x25/* % */: - case 0x40/* @ */: - case 0x7E/* ~ */: - case 0x2B/* + */: - case 0x3D/* = */: - case 0x3A/* : */: - return true; - default: - return false; - } -} - -function text(state, silent) { - var pos = state.pos; - - while (pos < state.posMax && !isTerminatorChar(state.src.charCodeAt(pos))) { - pos++; - } - - if (pos === state.pos) { return false; } - - if (!silent) { state.pending += state.src.slice(state.pos, pos); } - - state.pos = pos; - - return true; -} - -// Proceess '\n' - -function newline(state, silent) { - var pmax, max, pos = state.pos; - - if (state.src.charCodeAt(pos) !== 0x0A/* \n */) { return false; } - - pmax = state.pending.length - 1; - max = state.posMax; - - // ' \n' -> hardbreak - // Lookup in pending chars is bad practice! Don't copy to other rules! - // Pending string is stored in concat mode, indexed lookups will cause - // convertion to flat mode. - if (!silent) { - if (pmax >= 0 && state.pending.charCodeAt(pmax) === 0x20) { - if (pmax >= 1 && state.pending.charCodeAt(pmax - 1) === 0x20) { - // Strip out all trailing spaces on this line. - for (var i = pmax - 2; i >= 0; i--) { - if (state.pending.charCodeAt(i) !== 0x20) { - state.pending = state.pending.substring(0, i + 1); - break; - } - } - state.push({ - type: 'hardbreak', - level: state.level - }); - } else { - state.pending = state.pending.slice(0, -1); - state.push({ - type: 'softbreak', - level: state.level - }); - } - - } else { - state.push({ - type: 'softbreak', - level: state.level - }); - } - } - - pos++; - - // skip heading spaces for next line - while (pos < max && state.src.charCodeAt(pos) === 0x20) { pos++; } - - state.pos = pos; - return true; -} - -// Proceess escaped chars and hardbreaks - -var ESCAPED = []; - -for (var i = 0; i < 256; i++) { ESCAPED.push(0); } - -'\\!"#$%&\'()*+,./:;<=>?@[]^_`{|}~-' - .split('').forEach(function(ch) { ESCAPED[ch.charCodeAt(0)] = 1; }); - - -function escape(state, silent) { - var ch, pos = state.pos, max = state.posMax; - - if (state.src.charCodeAt(pos) !== 0x5C/* \ */) { return false; } - - pos++; - - if (pos < max) { - ch = state.src.charCodeAt(pos); - - if (ch < 256 && ESCAPED[ch] !== 0) { - if (!silent) { state.pending += state.src[pos]; } - state.pos += 2; - return true; - } - - if (ch === 0x0A) { - if (!silent) { - state.push({ - type: 'hardbreak', - level: state.level - }); - } - - pos++; - // skip leading whitespaces from next line - while (pos < max && state.src.charCodeAt(pos) === 0x20) { pos++; } - - state.pos = pos; - return true; - } - } - - if (!silent) { state.pending += '\\'; } - state.pos++; - return true; -} - -// Parse backticks - -function backticks(state, silent) { - var start, max, marker, matchStart, matchEnd, - pos = state.pos, - ch = state.src.charCodeAt(pos); - - if (ch !== 0x60/* ` */) { return false; } - - start = pos; - pos++; - max = state.posMax; - - while (pos < max && state.src.charCodeAt(pos) === 0x60/* ` */) { pos++; } - - marker = state.src.slice(start, pos); - - matchStart = matchEnd = pos; - - while ((matchStart = state.src.indexOf('`', matchEnd)) !== -1) { - matchEnd = matchStart + 1; - - while (matchEnd < max && state.src.charCodeAt(matchEnd) === 0x60/* ` */) { matchEnd++; } - - if (matchEnd - matchStart === marker.length) { - if (!silent) { - state.push({ - type: 'code', - content: state.src.slice(pos, matchStart) - .replace(/[ \n]+/g, ' ') - .trim(), - block: false, - level: state.level - }); - } - state.pos = matchEnd; - return true; - } - } - - if (!silent) { state.pending += marker; } - state.pos += marker.length; - return true; -} - -// Process ~~deleted text~~ - -function del(state, silent) { - var found, - pos, - stack, - max = state.posMax, - start = state.pos, - lastChar, - nextChar; - - if (state.src.charCodeAt(start) !== 0x7E/* ~ */) { return false; } - if (silent) { return false; } // don't run any pairs in validation mode - if (start + 4 >= max) { return false; } - if (state.src.charCodeAt(start + 1) !== 0x7E/* ~ */) { return false; } - if (state.level >= state.options.maxNesting) { return false; } - - lastChar = start > 0 ? state.src.charCodeAt(start - 1) : -1; - nextChar = state.src.charCodeAt(start + 2); - - if (lastChar === 0x7E/* ~ */) { return false; } - if (nextChar === 0x7E/* ~ */) { return false; } - if (nextChar === 0x20 || nextChar === 0x0A) { return false; } - - pos = start + 2; - while (pos < max && state.src.charCodeAt(pos) === 0x7E/* ~ */) { pos++; } - if (pos > start + 3) { - // sequence of 4+ markers taking as literal, same as in a emphasis - state.pos += pos - start; - if (!silent) { state.pending += state.src.slice(start, pos); } - return true; - } - - state.pos = start + 2; - stack = 1; - - while (state.pos + 1 < max) { - if (state.src.charCodeAt(state.pos) === 0x7E/* ~ */) { - if (state.src.charCodeAt(state.pos + 1) === 0x7E/* ~ */) { - lastChar = state.src.charCodeAt(state.pos - 1); - nextChar = state.pos + 2 < max ? state.src.charCodeAt(state.pos + 2) : -1; - if (nextChar !== 0x7E/* ~ */ && lastChar !== 0x7E/* ~ */) { - if (lastChar !== 0x20 && lastChar !== 0x0A) { - // closing '~~' - stack--; - } else if (nextChar !== 0x20 && nextChar !== 0x0A) { - // opening '~~' - stack++; - } // else { - // // standalone ' ~~ ' indented with spaces - // } - if (stack <= 0) { - found = true; - break; - } - } - } - } - - state.parser.skipToken(state); - } - - if (!found) { - // parser failed to find ending tag, so it's not valid emphasis - state.pos = start; - return false; - } - - // found! - state.posMax = state.pos; - state.pos = start + 2; - - if (!silent) { - state.push({ type: 'del_open', level: state.level++ }); - state.parser.tokenize(state); - state.push({ type: 'del_close', level: --state.level }); - } - - state.pos = state.posMax + 2; - state.posMax = max; - return true; -} - -// Process ++inserted text++ - -function ins(state, silent) { - var found, - pos, - stack, - max = state.posMax, - start = state.pos, - lastChar, - nextChar; - - if (state.src.charCodeAt(start) !== 0x2B/* + */) { return false; } - if (silent) { return false; } // don't run any pairs in validation mode - if (start + 4 >= max) { return false; } - if (state.src.charCodeAt(start + 1) !== 0x2B/* + */) { return false; } - if (state.level >= state.options.maxNesting) { return false; } - - lastChar = start > 0 ? state.src.charCodeAt(start - 1) : -1; - nextChar = state.src.charCodeAt(start + 2); - - if (lastChar === 0x2B/* + */) { return false; } - if (nextChar === 0x2B/* + */) { return false; } - if (nextChar === 0x20 || nextChar === 0x0A) { return false; } - - pos = start + 2; - while (pos < max && state.src.charCodeAt(pos) === 0x2B/* + */) { pos++; } - if (pos !== start + 2) { - // sequence of 3+ markers taking as literal, same as in a emphasis - state.pos += pos - start; - if (!silent) { state.pending += state.src.slice(start, pos); } - return true; - } - - state.pos = start + 2; - stack = 1; - - while (state.pos + 1 < max) { - if (state.src.charCodeAt(state.pos) === 0x2B/* + */) { - if (state.src.charCodeAt(state.pos + 1) === 0x2B/* + */) { - lastChar = state.src.charCodeAt(state.pos - 1); - nextChar = state.pos + 2 < max ? state.src.charCodeAt(state.pos + 2) : -1; - if (nextChar !== 0x2B/* + */ && lastChar !== 0x2B/* + */) { - if (lastChar !== 0x20 && lastChar !== 0x0A) { - // closing '++' - stack--; - } else if (nextChar !== 0x20 && nextChar !== 0x0A) { - // opening '++' - stack++; - } // else { - // // standalone ' ++ ' indented with spaces - // } - if (stack <= 0) { - found = true; - break; - } - } - } - } - - state.parser.skipToken(state); - } - - if (!found) { - // parser failed to find ending tag, so it's not valid emphasis - state.pos = start; - return false; - } - - // found! - state.posMax = state.pos; - state.pos = start + 2; - - if (!silent) { - state.push({ type: 'ins_open', level: state.level++ }); - state.parser.tokenize(state); - state.push({ type: 'ins_close', level: --state.level }); - } - - state.pos = state.posMax + 2; - state.posMax = max; - return true; -} - -// Process ==highlighted text== - -function mark(state, silent) { - var found, - pos, - stack, - max = state.posMax, - start = state.pos, - lastChar, - nextChar; - - if (state.src.charCodeAt(start) !== 0x3D/* = */) { return false; } - if (silent) { return false; } // don't run any pairs in validation mode - if (start + 4 >= max) { return false; } - if (state.src.charCodeAt(start + 1) !== 0x3D/* = */) { return false; } - if (state.level >= state.options.maxNesting) { return false; } - - lastChar = start > 0 ? state.src.charCodeAt(start - 1) : -1; - nextChar = state.src.charCodeAt(start + 2); - - if (lastChar === 0x3D/* = */) { return false; } - if (nextChar === 0x3D/* = */) { return false; } - if (nextChar === 0x20 || nextChar === 0x0A) { return false; } - - pos = start + 2; - while (pos < max && state.src.charCodeAt(pos) === 0x3D/* = */) { pos++; } - if (pos !== start + 2) { - // sequence of 3+ markers taking as literal, same as in a emphasis - state.pos += pos - start; - if (!silent) { state.pending += state.src.slice(start, pos); } - return true; - } - - state.pos = start + 2; - stack = 1; - - while (state.pos + 1 < max) { - if (state.src.charCodeAt(state.pos) === 0x3D/* = */) { - if (state.src.charCodeAt(state.pos + 1) === 0x3D/* = */) { - lastChar = state.src.charCodeAt(state.pos - 1); - nextChar = state.pos + 2 < max ? state.src.charCodeAt(state.pos + 2) : -1; - if (nextChar !== 0x3D/* = */ && lastChar !== 0x3D/* = */) { - if (lastChar !== 0x20 && lastChar !== 0x0A) { - // closing '==' - stack--; - } else if (nextChar !== 0x20 && nextChar !== 0x0A) { - // opening '==' - stack++; - } // else { - // // standalone ' == ' indented with spaces - // } - if (stack <= 0) { - found = true; - break; - } - } - } - } - - state.parser.skipToken(state); - } - - if (!found) { - // parser failed to find ending tag, so it's not valid emphasis - state.pos = start; - return false; - } - - // found! - state.posMax = state.pos; - state.pos = start + 2; - - if (!silent) { - state.push({ type: 'mark_open', level: state.level++ }); - state.parser.tokenize(state); - state.push({ type: 'mark_close', level: --state.level }); - } - - state.pos = state.posMax + 2; - state.posMax = max; - return true; -} - -// Process *this* and _that_ - -function isAlphaNum(code) { - return (code >= 0x30 /* 0 */ && code <= 0x39 /* 9 */) || - (code >= 0x41 /* A */ && code <= 0x5A /* Z */) || - (code >= 0x61 /* a */ && code <= 0x7A /* z */); -} - -// parse sequence of emphasis markers, -// "start" should point at a valid marker -function scanDelims(state, start) { - var pos = start, lastChar, nextChar, count, - can_open = true, - can_close = true, - max = state.posMax, - marker = state.src.charCodeAt(start); - - lastChar = start > 0 ? state.src.charCodeAt(start - 1) : -1; - - while (pos < max && state.src.charCodeAt(pos) === marker) { pos++; } - if (pos >= max) { can_open = false; } - count = pos - start; - - if (count >= 4) { - // sequence of four or more unescaped markers can't start/end an emphasis - can_open = can_close = false; - } else { - nextChar = pos < max ? state.src.charCodeAt(pos) : -1; - - // check whitespace conditions - if (nextChar === 0x20 || nextChar === 0x0A) { can_open = false; } - if (lastChar === 0x20 || lastChar === 0x0A) { can_close = false; } - - if (marker === 0x5F /* _ */) { - // check if we aren't inside the word - if (isAlphaNum(lastChar)) { can_open = false; } - if (isAlphaNum(nextChar)) { can_close = false; } - } - } - - return { - can_open: can_open, - can_close: can_close, - delims: count - }; -} - -function emphasis(state, silent) { - var startCount, - count, - found, - oldCount, - newCount, - stack, - res, - max = state.posMax, - start = state.pos, - marker = state.src.charCodeAt(start); - - if (marker !== 0x5F/* _ */ && marker !== 0x2A /* * */) { return false; } - if (silent) { return false; } // don't run any pairs in validation mode - - res = scanDelims(state, start); - startCount = res.delims; - if (!res.can_open) { - state.pos += startCount; - if (!silent) { state.pending += state.src.slice(start, state.pos); } - return true; - } - - if (state.level >= state.options.maxNesting) { return false; } - - state.pos = start + startCount; - stack = [ startCount ]; - - while (state.pos < max) { - if (state.src.charCodeAt(state.pos) === marker) { - res = scanDelims(state, state.pos); - count = res.delims; - if (res.can_close) { - oldCount = stack.pop(); - newCount = count; - - while (oldCount !== newCount) { - if (newCount < oldCount) { - stack.push(oldCount - newCount); - break; - } - - // assert(newCount > oldCount) - newCount -= oldCount; - - if (stack.length === 0) { break; } - state.pos += oldCount; - oldCount = stack.pop(); - } - - if (stack.length === 0) { - startCount = oldCount; - found = true; - break; - } - state.pos += count; - continue; - } - - if (res.can_open) { stack.push(count); } - state.pos += count; - continue; - } - - state.parser.skipToken(state); - } - - if (!found) { - // parser failed to find ending tag, so it's not valid emphasis - state.pos = start; - return false; - } - - // found! - state.posMax = state.pos; - state.pos = start + startCount; - - if (!silent) { - if (startCount === 2 || startCount === 3) { - state.push({ type: 'strong_open', level: state.level++ }); - } - if (startCount === 1 || startCount === 3) { - state.push({ type: 'em_open', level: state.level++ }); - } - - state.parser.tokenize(state); - - if (startCount === 1 || startCount === 3) { - state.push({ type: 'em_close', level: --state.level }); - } - if (startCount === 2 || startCount === 3) { - state.push({ type: 'strong_close', level: --state.level }); - } - } - - state.pos = state.posMax + startCount; - state.posMax = max; - return true; -} - -// Process ~subscript~ - -// same as UNESCAPE_MD_RE plus a space -var UNESCAPE_RE = /\\([ \\!"#$%&'()*+,.\/:;<=>?@[\]^_`{|}~-])/g; - -function sub(state, silent) { - var found, - content, - max = state.posMax, - start = state.pos; - - if (state.src.charCodeAt(start) !== 0x7E/* ~ */) { return false; } - if (silent) { return false; } // don't run any pairs in validation mode - if (start + 2 >= max) { return false; } - if (state.level >= state.options.maxNesting) { return false; } - - state.pos = start + 1; - - while (state.pos < max) { - if (state.src.charCodeAt(state.pos) === 0x7E/* ~ */) { - found = true; - break; - } - - state.parser.skipToken(state); - } - - if (!found || start + 1 === state.pos) { - state.pos = start; - return false; - } - - content = state.src.slice(start + 1, state.pos); - - // don't allow unescaped spaces/newlines inside - if (content.match(/(^|[^\\])(\\\\)*\s/)) { - state.pos = start; - return false; - } - - // found! - state.posMax = state.pos; - state.pos = start + 1; - - if (!silent) { - state.push({ - type: 'sub', - level: state.level, - content: content.replace(UNESCAPE_RE, '$1') - }); - } - - state.pos = state.posMax + 1; - state.posMax = max; - return true; -} - -// Process ^superscript^ - -// same as UNESCAPE_MD_RE plus a space -var UNESCAPE_RE$1 = /\\([ \\!"#$%&'()*+,.\/:;<=>?@[\]^_`{|}~-])/g; - -function sup(state, silent) { - var found, - content, - max = state.posMax, - start = state.pos; - - if (state.src.charCodeAt(start) !== 0x5E/* ^ */) { return false; } - if (silent) { return false; } // don't run any pairs in validation mode - if (start + 2 >= max) { return false; } - if (state.level >= state.options.maxNesting) { return false; } - - state.pos = start + 1; - - while (state.pos < max) { - if (state.src.charCodeAt(state.pos) === 0x5E/* ^ */) { - found = true; - break; - } - - state.parser.skipToken(state); - } - - if (!found || start + 1 === state.pos) { - state.pos = start; - return false; - } - - content = state.src.slice(start + 1, state.pos); - - // don't allow unescaped spaces/newlines inside - if (content.match(/(^|[^\\])(\\\\)*\s/)) { - state.pos = start; - return false; - } - - // found! - state.posMax = state.pos; - state.pos = start + 1; - - if (!silent) { - state.push({ - type: 'sup', - level: state.level, - content: content.replace(UNESCAPE_RE$1, '$1') - }); - } - - state.pos = state.posMax + 1; - state.posMax = max; - return true; -} - -// Process [links]( "stuff") - - -function links(state, silent) { - var labelStart, - labelEnd, - label, - href, - title, - pos, - ref, - code, - isImage = false, - oldPos = state.pos, - max = state.posMax, - start = state.pos, - marker = state.src.charCodeAt(start); - - if (marker === 0x21/* ! */) { - isImage = true; - marker = state.src.charCodeAt(++start); - } - - if (marker !== 0x5B/* [ */) { return false; } - if (state.level >= state.options.maxNesting) { return false; } - - labelStart = start + 1; - labelEnd = parseLinkLabel(state, start); - - // parser failed to find ']', so it's not a valid link - if (labelEnd < 0) { return false; } - - pos = labelEnd + 1; - if (pos < max && state.src.charCodeAt(pos) === 0x28/* ( */) { - // - // Inline link - // - - // [link]( "title" ) - // ^^ skipping these spaces - pos++; - for (; pos < max; pos++) { - code = state.src.charCodeAt(pos); - if (code !== 0x20 && code !== 0x0A) { break; } - } - if (pos >= max) { return false; } - - // [link]( "title" ) - // ^^^^^^ parsing link destination - start = pos; - if (parseLinkDestination(state, pos)) { - href = state.linkContent; - pos = state.pos; - } else { - href = ''; - } - - // [link]( "title" ) - // ^^ skipping these spaces - start = pos; - for (; pos < max; pos++) { - code = state.src.charCodeAt(pos); - if (code !== 0x20 && code !== 0x0A) { break; } - } - - // [link]( "title" ) - // ^^^^^^^ parsing link title - if (pos < max && start !== pos && parseLinkTitle(state, pos)) { - title = state.linkContent; - pos = state.pos; - - // [link]( "title" ) - // ^^ skipping these spaces - for (; pos < max; pos++) { - code = state.src.charCodeAt(pos); - if (code !== 0x20 && code !== 0x0A) { break; } - } - } else { - title = ''; - } - - if (pos >= max || state.src.charCodeAt(pos) !== 0x29/* ) */) { - state.pos = oldPos; - return false; - } - pos++; - } else { - // - // Link reference - // - - // do not allow nested reference links - if (state.linkLevel > 0) { return false; } - - // [foo] [bar] - // ^^ optional whitespace (can include newlines) - for (; pos < max; pos++) { - code = state.src.charCodeAt(pos); - if (code !== 0x20 && code !== 0x0A) { break; } - } - - if (pos < max && state.src.charCodeAt(pos) === 0x5B/* [ */) { - start = pos + 1; - pos = parseLinkLabel(state, pos); - if (pos >= 0) { - label = state.src.slice(start, pos++); - } else { - pos = start - 1; - } - } - - // covers label === '' and label === undefined - // (collapsed reference link and shortcut reference link respectively) - if (!label) { - if (typeof label === 'undefined') { - pos = labelEnd + 1; - } - label = state.src.slice(labelStart, labelEnd); - } - - ref = state.env.references[normalizeReference(label)]; - if (!ref) { - state.pos = oldPos; - return false; - } - href = ref.href; - title = ref.title; - } - - // - // We found the end of the link, and know for a fact it's a valid link; - // so all that's left to do is to call tokenizer. - // - if (!silent) { - state.pos = labelStart; - state.posMax = labelEnd; - - if (isImage) { - state.push({ - type: 'image', - src: href, - title: title, - alt: state.src.substr(labelStart, labelEnd - labelStart), - level: state.level - }); - } else { - state.push({ - type: 'link_open', - href: href, - title: title, - level: state.level++ - }); - state.linkLevel++; - state.parser.tokenize(state); - state.linkLevel--; - state.push({ type: 'link_close', level: --state.level }); - } - } - - state.pos = pos; - state.posMax = max; - return true; -} - -// Process inline footnotes (^[...]) - - -function footnote_inline(state, silent) { - var labelStart, - labelEnd, - footnoteId, - oldLength, - max = state.posMax, - start = state.pos; - - if (start + 2 >= max) { return false; } - if (state.src.charCodeAt(start) !== 0x5E/* ^ */) { return false; } - if (state.src.charCodeAt(start + 1) !== 0x5B/* [ */) { return false; } - if (state.level >= state.options.maxNesting) { return false; } - - labelStart = start + 2; - labelEnd = parseLinkLabel(state, start + 1); - - // parser failed to find ']', so it's not a valid note - if (labelEnd < 0) { return false; } - - // We found the end of the link, and know for a fact it's a valid link; - // so all that's left to do is to call tokenizer. - // - if (!silent) { - if (!state.env.footnotes) { state.env.footnotes = {}; } - if (!state.env.footnotes.list) { state.env.footnotes.list = []; } - footnoteId = state.env.footnotes.list.length; - - state.pos = labelStart; - state.posMax = labelEnd; - - state.push({ - type: 'footnote_ref', - id: footnoteId, - level: state.level - }); - state.linkLevel++; - oldLength = state.tokens.length; - state.parser.tokenize(state); - state.env.footnotes.list[footnoteId] = { tokens: state.tokens.splice(oldLength) }; - state.linkLevel--; - } - - state.pos = labelEnd + 1; - state.posMax = max; - return true; -} - -// Process footnote references ([^...]) - -function footnote_ref(state, silent) { - var label, - pos, - footnoteId, - footnoteSubId, - max = state.posMax, - start = state.pos; - - // should be at least 4 chars - "[^x]" - if (start + 3 > max) { return false; } - - if (!state.env.footnotes || !state.env.footnotes.refs) { return false; } - if (state.src.charCodeAt(start) !== 0x5B/* [ */) { return false; } - if (state.src.charCodeAt(start + 1) !== 0x5E/* ^ */) { return false; } - if (state.level >= state.options.maxNesting) { return false; } - - for (pos = start + 2; pos < max; pos++) { - if (state.src.charCodeAt(pos) === 0x20) { return false; } - if (state.src.charCodeAt(pos) === 0x0A) { return false; } - if (state.src.charCodeAt(pos) === 0x5D /* ] */) { - break; - } - } - - if (pos === start + 2) { return false; } // no empty footnote labels - if (pos >= max) { return false; } - pos++; - - label = state.src.slice(start + 2, pos - 1); - if (typeof state.env.footnotes.refs[':' + label] === 'undefined') { return false; } - - if (!silent) { - if (!state.env.footnotes.list) { state.env.footnotes.list = []; } - - if (state.env.footnotes.refs[':' + label] < 0) { - footnoteId = state.env.footnotes.list.length; - state.env.footnotes.list[footnoteId] = { label: label, count: 0 }; - state.env.footnotes.refs[':' + label] = footnoteId; - } else { - footnoteId = state.env.footnotes.refs[':' + label]; - } - - footnoteSubId = state.env.footnotes.list[footnoteId].count; - state.env.footnotes.list[footnoteId].count++; - - state.push({ - type: 'footnote_ref', - id: footnoteId, - subId: footnoteSubId, - level: state.level - }); - } - - state.pos = pos; - state.posMax = max; - return true; -} - -// List of valid url schemas, accorting to commonmark spec -// http://jgm.github.io/CommonMark/spec.html#autolinks - -var url_schemas = [ - 'coap', - 'doi', - 'javascript', - 'aaa', - 'aaas', - 'about', - 'acap', - 'cap', - 'cid', - 'crid', - 'data', - 'dav', - 'dict', - 'dns', - 'file', - 'ftp', - 'geo', - 'go', - 'gopher', - 'h323', - 'http', - 'https', - 'iax', - 'icap', - 'im', - 'imap', - 'info', - 'ipp', - 'iris', - 'iris.beep', - 'iris.xpc', - 'iris.xpcs', - 'iris.lwz', - 'ldap', - 'mailto', - 'mid', - 'msrp', - 'msrps', - 'mtqp', - 'mupdate', - 'news', - 'nfs', - 'ni', - 'nih', - 'nntp', - 'opaquelocktoken', - 'pop', - 'pres', - 'rtsp', - 'service', - 'session', - 'shttp', - 'sieve', - 'sip', - 'sips', - 'sms', - 'snmp', - 'soap.beep', - 'soap.beeps', - 'tag', - 'tel', - 'telnet', - 'tftp', - 'thismessage', - 'tn3270', - 'tip', - 'tv', - 'urn', - 'vemmi', - 'ws', - 'wss', - 'xcon', - 'xcon-userid', - 'xmlrpc.beep', - 'xmlrpc.beeps', - 'xmpp', - 'z39.50r', - 'z39.50s', - 'adiumxtra', - 'afp', - 'afs', - 'aim', - 'apt', - 'attachment', - 'aw', - 'beshare', - 'bitcoin', - 'bolo', - 'callto', - 'chrome', - 'chrome-extension', - 'com-eventbrite-attendee', - 'content', - 'cvs', - 'dlna-playsingle', - 'dlna-playcontainer', - 'dtn', - 'dvb', - 'ed2k', - 'facetime', - 'feed', - 'finger', - 'fish', - 'gg', - 'git', - 'gizmoproject', - 'gtalk', - 'hcp', - 'icon', - 'ipn', - 'irc', - 'irc6', - 'ircs', - 'itms', - 'jar', - 'jms', - 'keyparc', - 'lastfm', - 'ldaps', - 'magnet', - 'maps', - 'market', - 'message', - 'mms', - 'ms-help', - 'msnim', - 'mumble', - 'mvn', - 'notes', - 'oid', - 'palm', - 'paparazzi', - 'platform', - 'proxy', - 'psyc', - 'query', - 'res', - 'resource', - 'rmi', - 'rsync', - 'rtmp', - 'secondlife', - 'sftp', - 'sgn', - 'skype', - 'smb', - 'soldat', - 'spotify', - 'ssh', - 'steam', - 'svn', - 'teamspeak', - 'things', - 'udp', - 'unreal', - 'ut2004', - 'ventrilo', - 'view-source', - 'webcal', - 'wtai', - 'wyciwyg', - 'xfire', - 'xri', - 'ymsgr' -]; - -// Process autolinks '' - - -/*eslint max-len:0*/ -var 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])?)*)>/; -var AUTOLINK_RE = /^<([a-zA-Z.\-]{1,25}):([^<>\x00-\x20]*)>/; - - -function autolink(state, silent) { - var tail, linkMatch, emailMatch, url, fullUrl, pos = state.pos; - - if (state.src.charCodeAt(pos) !== 0x3C/* < */) { return false; } - - tail = state.src.slice(pos); - - if (tail.indexOf('>') < 0) { return false; } - - linkMatch = tail.match(AUTOLINK_RE); - - if (linkMatch) { - if (url_schemas.indexOf(linkMatch[1].toLowerCase()) < 0) { return false; } - - url = linkMatch[0].slice(1, -1); - fullUrl = normalizeLink(url); - if (!state.parser.validateLink(url)) { return false; } - - if (!silent) { - state.push({ - type: 'link_open', - href: fullUrl, - level: state.level - }); - state.push({ - type: 'text', - content: url, - level: state.level + 1 - }); - state.push({ type: 'link_close', level: state.level }); - } - - state.pos += linkMatch[0].length; - return true; - } - - emailMatch = tail.match(EMAIL_RE); - - if (emailMatch) { - - url = emailMatch[0].slice(1, -1); - - fullUrl = normalizeLink('mailto:' + url); - if (!state.parser.validateLink(fullUrl)) { return false; } - - if (!silent) { - state.push({ - type: 'link_open', - href: fullUrl, - level: state.level - }); - state.push({ - type: 'text', - content: url, - level: state.level + 1 - }); - state.push({ type: 'link_close', level: state.level }); - } - - state.pos += emailMatch[0].length; - return true; - } - - return false; -} - -// Regexps to match html elements - -function replace$1(regex, options) { - regex = regex.source; - options = options || ''; - - return function self(name, val) { - if (!name) { - return new RegExp(regex, options); - } - val = val.source || val; - regex = regex.replace(name, val); - return self; - }; -} - - -var attr_name = /[a-zA-Z_:][a-zA-Z0-9:._-]*/; - -var unquoted = /[^"'=<>`\x00-\x20]+/; -var single_quoted = /'[^']*'/; -var double_quoted = /"[^"]*"/; - -/*eslint no-spaced-func:0*/ -var attr_value = replace$1(/(?:unquoted|single_quoted|double_quoted)/) - ('unquoted', unquoted) - ('single_quoted', single_quoted) - ('double_quoted', double_quoted) - (); - -var attribute = replace$1(/(?:\s+attr_name(?:\s*=\s*attr_value)?)/) - ('attr_name', attr_name) - ('attr_value', attr_value) - (); - -var open_tag = replace$1(/<[A-Za-z][A-Za-z0-9]*attribute*\s*\/?>/) - ('attribute', attribute) - (); - -var close_tag = /<\/[A-Za-z][A-Za-z0-9]*\s*>/; -var comment = /|/; -var processing = /<[?].*?[?]>/; -var declaration = /]*>/; -var cdata = //; - -var HTML_TAG_RE = replace$1(/^(?:open_tag|close_tag|comment|processing|declaration|cdata)/) - ('open_tag', open_tag) - ('close_tag', close_tag) - ('comment', comment) - ('processing', processing) - ('declaration', declaration) - ('cdata', cdata) - (); - -// Process html tags - - -function isLetter$2(ch) { - /*eslint no-bitwise:0*/ - var lc = ch | 0x20; // to lower case - return (lc >= 0x61/* a */) && (lc <= 0x7a/* z */); -} - - -function htmltag(state, silent) { - var ch, match, max, pos = state.pos; - - if (!state.options.html) { return false; } - - // Check start - max = state.posMax; - if (state.src.charCodeAt(pos) !== 0x3C/* < */ || - pos + 2 >= max) { - return false; - } - - // Quick fail on second char - ch = state.src.charCodeAt(pos + 1); - if (ch !== 0x21/* ! */ && - ch !== 0x3F/* ? */ && - ch !== 0x2F/* / */ && - !isLetter$2(ch)) { - return false; - } - - match = state.src.slice(pos).match(HTML_TAG_RE); - if (!match) { return false; } - - if (!silent) { - state.push({ - type: 'htmltag', - content: state.src.slice(pos, pos + match[0].length), - level: state.level - }); - } - state.pos += match[0].length; - return true; -} - -// Process html entity - {, ¯, ", ... - - -var DIGITAL_RE = /^&#((?:x[a-f0-9]{1,8}|[0-9]{1,8}));/i; -var NAMED_RE = /^&([a-z][a-z0-9]{1,31});/i; - - -function entity(state, silent) { - var ch, code, match, pos = state.pos, max = state.posMax; - - if (state.src.charCodeAt(pos) !== 0x26/* & */) { return false; } - - if (pos + 1 < max) { - ch = state.src.charCodeAt(pos + 1); - - if (ch === 0x23 /* # */) { - match = state.src.slice(pos).match(DIGITAL_RE); - if (match) { - if (!silent) { - code = match[1][0].toLowerCase() === 'x' ? parseInt(match[1].slice(1), 16) : parseInt(match[1], 10); - state.pending += isValidEntityCode(code) ? fromCodePoint(code) : fromCodePoint(0xFFFD); - } - state.pos += match[0].length; - return true; - } - } else { - match = state.src.slice(pos).match(NAMED_RE); - if (match) { - var decoded = decodeEntity(match[1]); - if (match[1] !== decoded) { - if (!silent) { state.pending += decoded; } - state.pos += match[0].length; - return true; - } - } - } - } - - if (!silent) { state.pending += '&'; } - state.pos++; - return true; -} - -/** - * Inline Parser `rules` - */ - -var _rules$2 = [ - [ 'text', text ], - [ 'newline', newline ], - [ 'escape', escape ], - [ 'backticks', backticks ], - [ 'del', del ], - [ 'ins', ins ], - [ 'mark', mark ], - [ 'emphasis', emphasis ], - [ 'sub', sub ], - [ 'sup', sup ], - [ 'links', links ], - [ 'footnote_inline', footnote_inline ], - [ 'footnote_ref', footnote_ref ], - [ 'autolink', autolink ], - [ 'htmltag', htmltag ], - [ 'entity', entity ] -]; - -/** - * Inline Parser class. Note that link validation is stricter - * in Remarkable than what is specified by CommonMark. If you - * want to change this you can use a custom validator. - * - * @api private - */ - -function ParserInline() { - this.ruler = new Ruler(); - for (var i = 0; i < _rules$2.length; i++) { - this.ruler.push(_rules$2[i][0], _rules$2[i][1]); - } - - // Can be overridden with a custom validator - this.validateLink = validateLink; -} - -/** - * Skip a single token by running all rules in validation mode. - * Returns `true` if any rule reports success. - * - * @param {Object} `state` - * @api privage - */ - -ParserInline.prototype.skipToken = function (state) { - var rules = this.ruler.getRules(''); - var len = rules.length; - var pos = state.pos; - var i, cached_pos; - - if ((cached_pos = state.cacheGet(pos)) > 0) { - state.pos = cached_pos; - return; - } - - for (i = 0; i < len; i++) { - if (rules[i](state, true)) { - state.cacheSet(pos, state.pos); - return; - } - } - - state.pos++; - state.cacheSet(pos, state.pos); -}; - -/** - * Generate tokens for the given input range. - * - * @param {Object} `state` - * @api private - */ - -ParserInline.prototype.tokenize = function (state) { - var rules = this.ruler.getRules(''); - var len = rules.length; - var end = state.posMax; - var ok, i; - - while (state.pos < end) { - - // Try all possible rules. - // On success, the rule should: - // - // - update `state.pos` - // - update `state.tokens` - // - return true - for (i = 0; i < len; i++) { - ok = rules[i](state, false); - - if (ok) { - break; - } - } - - if (ok) { - if (state.pos >= end) { break; } - continue; - } - - state.pending += state.src[state.pos++]; - } - - if (state.pending) { - state.pushPending(); - } -}; - -/** - * Parse the given input string. - * - * @param {String} `str` - * @param {Object} `options` - * @param {Object} `env` - * @param {Array} `outTokens` - * @api private - */ - -ParserInline.prototype.parse = function (str, options, env, outTokens) { - var state = new StateInline(str, this, options, env, outTokens); - this.tokenize(state); -}; - -/** - * Validate the given `url` by checking for bad protocols. - * - * @param {String} `url` - * @return {Boolean} - */ - -function validateLink(url) { - var BAD_PROTOCOLS = [ 'vbscript', 'javascript', 'file', 'data' ]; - var str = url.trim().toLowerCase(); - // Care about digital entities "javascript:alert(1)" - str = replaceEntities(str); - if (str.indexOf(':') !== -1 && BAD_PROTOCOLS.indexOf(str.split(':')[0]) !== -1) { - return false; - } - return true; -} - -// Remarkable default options - -var defaultConfig = { - options: { - html: false, // Enable HTML tags in source - xhtmlOut: false, // Use '/' to close single tags (
    ) - breaks: false, // Convert '\n' in paragraphs into
    - langPrefix: 'language-', // CSS language prefix for fenced blocks - linkTarget: '', // set target to open link in - - // Enable some language-neutral replacements + quotes beautification - typographer: false, - - // Double + single quotes replacement pairs, when typographer enabled, - // and smartquotes on. Set doubles to '«»' for Russian, '„“' for German. - quotes: '“”‘’', - - // Highlighter function. Should return escaped HTML, - // or '' if input not changed - // - // function (/*str, lang*/) { return ''; } - // - highlight: null, - - maxNesting: 20 // Internal protection, recursion limit - }, - - components: { - - core: { - rules: [ - 'block', - 'inline', - 'references', - 'replacements', - 'smartquotes', - 'references', - 'abbr2', - 'footnote_tail' - ] - }, - - block: { - rules: [ - 'blockquote', - 'code', - 'fences', - 'footnote', - 'heading', - 'hr', - 'htmlblock', - 'lheading', - 'list', - 'paragraph', - 'table' - ] - }, - - inline: { - rules: [ - 'autolink', - 'backticks', - 'del', - 'emphasis', - 'entity', - 'escape', - 'footnote_ref', - 'htmltag', - 'links', - 'newline', - 'text' - ] - } - } -}; - -// Remarkable default options - -var fullConfig = { - options: { - html: false, // Enable HTML tags in source - xhtmlOut: false, // Use '/' to close single tags (
    ) - breaks: false, // Convert '\n' in paragraphs into
    - langPrefix: 'language-', // CSS language prefix for fenced blocks - linkTarget: '', // set target to open link in - - // Enable some language-neutral replacements + quotes beautification - typographer: false, - - // Double + single quotes replacement pairs, when typographer enabled, - // and smartquotes on. Set doubles to '«»' for Russian, '„“' for German. - quotes: '“”‘’', - - // Highlighter function. Should return escaped HTML, - // or '' if input not changed - // - // function (/*str, lang*/) { return ''; } - // - highlight: null, - - maxNesting: 20 // Internal protection, recursion limit - }, - - components: { - // Don't restrict core/block/inline rules - core: {}, - block: {}, - inline: {} - } -}; - -// Commonmark default options - -var commonmarkConfig = { - options: { - html: true, // Enable HTML tags in source - xhtmlOut: true, // Use '/' to close single tags (
    ) - breaks: false, // Convert '\n' in paragraphs into
    - langPrefix: 'language-', // CSS language prefix for fenced blocks - linkTarget: '', // set target to open link in - - // Enable some language-neutral replacements + quotes beautification - typographer: false, - - // Double + single quotes replacement pairs, when typographer enabled, - // and smartquotes on. Set doubles to '«»' for Russian, '„“' for German. - quotes: '“”‘’', - - // Highlighter function. Should return escaped HTML, - // or '' if input not changed - // - // function (/*str, lang*/) { return ''; } - // - highlight: null, - - maxNesting: 20 // Internal protection, recursion limit - }, - - components: { - - core: { - rules: [ - 'block', - 'inline', - 'references', - 'abbr2' - ] - }, - - block: { - rules: [ - 'blockquote', - 'code', - 'fences', - 'heading', - 'hr', - 'htmlblock', - 'lheading', - 'list', - 'paragraph' - ] - }, - - inline: { - rules: [ - 'autolink', - 'backticks', - 'emphasis', - 'entity', - 'escape', - 'htmltag', - 'links', - 'newline', - 'text' - ] - } - } -}; - -/** - * Preset configs - */ - -var config = { - 'default': defaultConfig, - 'full': fullConfig, - 'commonmark': commonmarkConfig -}; - -/** - * The `StateCore` class manages state. - * - * @param {Object} `instance` Remarkable instance - * @param {String} `str` Markdown string - * @param {Object} `env` - */ - -function StateCore(instance, str, env) { - this.src = str; - this.env = env; - this.options = instance.options; - this.tokens = []; - this.inlineMode = false; - - this.inline = instance.inline; - this.block = instance.block; - this.renderer = instance.renderer; - this.typographer = instance.typographer; -} - -/** - * The main `Remarkable` class. Create an instance of - * `Remarkable` with a `preset` and/or `options`. - * - * @param {String} `preset` If no preset is given, `default` is used. - * @param {Object} `options` - */ - -function Remarkable(preset, options) { - if (typeof preset !== 'string') { - options = preset; - preset = 'default'; - } - - if (options && options.linkify != null) { - console.warn( - 'linkify option is removed. Use linkify plugin instead:\n\n' + - 'import Remarkable from \'remarkable\';\n' + - 'import linkify from \'remarkable/linkify\';\n' + - 'new Remarkable().use(linkify)\n' - ); - } - - this.inline = new ParserInline(); - this.block = new ParserBlock(); - this.core = new Core(); - this.renderer = new Renderer(); - this.ruler = new Ruler(); - - this.options = {}; - this.configure(config[preset]); - this.set(options || {}); -} - -/** - * Set options as an alternative to passing them - * to the constructor. - * - * ```js - * md.set({typographer: true}); - * ``` - * @param {Object} `options` - * @api public - */ - -Remarkable.prototype.set = function (options) { - assign(this.options, options); -}; - -/** - * Batch loader for components rules states, and options - * - * @param {Object} `presets` - */ - -Remarkable.prototype.configure = function (presets) { - var self = this; - - if (!presets) { throw new Error('Wrong `remarkable` preset, check name/content'); } - if (presets.options) { self.set(presets.options); } - if (presets.components) { - Object.keys(presets.components).forEach(function (name) { - if (presets.components[name].rules) { - self[name].ruler.enable(presets.components[name].rules, true); - } - }); - } -}; - -/** - * Use a plugin. - * - * ```js - * var md = new Remarkable(); - * - * md.use(plugin1) - * .use(plugin2, opts) - * .use(plugin3); - * ``` - * - * @param {Function} `plugin` - * @param {Object} `options` - * @return {Object} `Remarkable` for chaining - */ - -Remarkable.prototype.use = function (plugin, options) { - plugin(this, options); - return this; -}; - - -/** - * Parse the input `string` and return a tokens array. - * Modifies `env` with definitions data. - * - * @param {String} `string` - * @param {Object} `env` - * @return {Array} Array of tokens - */ - -Remarkable.prototype.parse = function (str, env) { - var state = new StateCore(this, str, env); - this.core.process(state); - return state.tokens; -}; - -/** - * The main `.render()` method that does all the magic :) - * - * @param {String} `string` - * @param {Object} `env` - * @return {String} Rendered HTML. - */ - -Remarkable.prototype.render = function (str, env) { - env = env || {}; - return this.renderer.render(this.parse(str, env), this.options, env); -}; - -/** - * Parse the given content `string` as a single string. - * - * @param {String} `string` - * @param {Object} `env` - * @return {Array} Array of tokens - */ - -Remarkable.prototype.parseInline = function (str, env) { - var state = new StateCore(this, str, env); - state.inlineMode = true; - this.core.process(state); - return state.tokens; -}; - -/** - * Render a single content `string`, without wrapping it - * to paragraphs - * - * @param {String} `str` - * @param {Object} `env` - * @return {String} - */ - -Remarkable.prototype.renderInline = function (str, env) { - env = env || {}; - return this.renderer.render(this.parseInline(str, env), this.options, env); -}; - -exports.Remarkable = Remarkable; -exports.utils = utils; -}); - -var katex = createCommonjsModule(function (module, exports) { -(function webpackUniversalModuleDefinition(root, factory) { - module.exports = factory(); -})((typeof self !== 'undefined' ? self : commonjsGlobal), function() { -return /******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 1); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ (function(module, exports, __webpack_require__) { - -// extracted by mini-css-extract-plugin - -/***/ }), -/* 1 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -__webpack_require__.r(__webpack_exports__); - -// EXTERNAL MODULE: ./src/katex.less -var katex = __webpack_require__(0); - -// CONCATENATED MODULE: ./src/SourceLocation.js -/** - * Lexing or parsing positional information for error reporting. - * This object is immutable. - */ -var SourceLocation = -/*#__PURE__*/ -function () { - // The + prefix indicates that these fields aren't writeable - // Lexer holding the input string. - // Start offset, zero-based inclusive. - // End offset, zero-based exclusive. - function SourceLocation(lexer, start, end) { - this.lexer = void 0; - this.start = void 0; - this.end = void 0; - this.lexer = lexer; - this.start = start; - this.end = end; - } - /** - * Merges two `SourceLocation`s from location providers, given they are - * provided in order of appearance. - * - Returns the first one's location if only the first is provided. - * - Returns a merged range of the first and the last if both are provided - * and their lexers match. - * - Otherwise, returns null. - */ - - - SourceLocation.range = function range(first, second) { - if (!second) { - return first && first.loc; - } else if (!first || !first.loc || !second.loc || first.loc.lexer !== second.loc.lexer) { - return null; - } else { - return new SourceLocation(first.loc.lexer, first.loc.start, second.loc.end); - } - }; - - return SourceLocation; -}(); - - -// CONCATENATED MODULE: ./src/Token.js - -/** - * Interface required to break circular dependency between Token, Lexer, and - * ParseError. - */ - -/** - * The resulting token returned from `lex`. - * - * It consists of the token text plus some position information. - * The position information is essentially a range in an input string, - * but instead of referencing the bare input string, we refer to the lexer. - * That way it is possible to attach extra metadata to the input string, - * like for example a file name or similar. - * - * The position information is optional, so it is OK to construct synthetic - * tokens if appropriate. Not providing available position information may - * lead to degraded error reporting, though. - */ -var Token_Token = -/*#__PURE__*/ -function () { - // don't expand the token - // used in \noexpand - function Token(text, // the text of this token - loc) { - this.text = void 0; - this.loc = void 0; - this.noexpand = void 0; - this.treatAsRelax = void 0; - this.text = text; - this.loc = loc; - } - /** - * Given a pair of tokens (this and endToken), compute a `Token` encompassing - * the whole input range enclosed by these two. - */ - - - var _proto = Token.prototype; - - _proto.range = function range(endToken, // last token of the range, inclusive - text) // the text of the newly constructed token - { - return new Token(text, SourceLocation.range(this, endToken)); - }; - - return Token; -}(); -// CONCATENATED MODULE: ./src/ParseError.js - - -/** - * This is the ParseError class, which is the main error thrown by KaTeX - * functions when something has gone wrong. This is used to distinguish internal - * errors from errors in the expression that the user provided. - * - * If possible, a caller should provide a Token or ParseNode with information - * about where in the source string the problem occurred. - */ -var ParseError = // Error position based on passed-in Token or ParseNode. -function ParseError(message, // The error message -token) // An object providing position information -{ - this.position = void 0; - var error = "KaTeX parse error: " + message; - var start; - var loc = token && token.loc; - - if (loc && loc.start <= loc.end) { - // If we have the input and a position, make the error a bit fancier - // Get the input - var input = loc.lexer.input; // Prepend some information - - start = loc.start; - var end = loc.end; - - if (start === input.length) { - error += " at end of input: "; - } else { - error += " at position " + (start + 1) + ": "; - } // Underline token in question using combining underscores - - - var underlined = input.slice(start, end).replace(/[^]/g, "$&\u0332"); // Extract some context from the input and add it to the error - - var left; - - if (start > 15) { - left = "…" + input.slice(start - 15, start); - } else { - left = input.slice(0, start); - } - - var right; - - if (end + 15 < input.length) { - right = input.slice(end, end + 15) + "…"; - } else { - right = input.slice(end); - } - - error += left + underlined + right; - } // Some hackery to make ParseError a prototype of Error - // See http://stackoverflow.com/a/8460753 - - - var self = new Error(error); - self.name = "ParseError"; // $FlowFixMe - - self.__proto__ = ParseError.prototype; // $FlowFixMe - - self.position = start; - return self; -}; // $FlowFixMe More hackery - - -ParseError.prototype.__proto__ = Error.prototype; -/* harmony default export */ var src_ParseError = (ParseError); -// CONCATENATED MODULE: ./src/utils.js -/** - * This file contains a list of utility functions which are useful in other - * files. - */ - -/** - * Return whether an element is contained in a list - */ -var contains = function contains(list, elem) { - return list.indexOf(elem) !== -1; -}; -/** - * Provide a default value if a setting is undefined - * NOTE: Couldn't use `T` as the output type due to facebook/flow#5022. - */ - - -var deflt = function deflt(setting, defaultIfUndefined) { - return setting === undefined ? defaultIfUndefined : setting; -}; // hyphenate and escape adapted from Facebook's React under Apache 2 license - - -var uppercase = /([A-Z])/g; - -var hyphenate = function hyphenate(str) { - return str.replace(uppercase, "-$1").toLowerCase(); -}; - -var ESCAPE_LOOKUP = { - "&": "&", - ">": ">", - "<": "<", - "\"": """, - "'": "'" -}; -var ESCAPE_REGEX = /[&><"']/g; -/** - * Escapes text to prevent scripting attacks. - */ - -function utils_escape(text) { - return String(text).replace(ESCAPE_REGEX, function (match) { - return ESCAPE_LOOKUP[match]; - }); -} -/** - * Sometimes we want to pull out the innermost element of a group. In most - * cases, this will just be the group itself, but when ordgroups and colors have - * a single element, we want to pull that out. - */ - - -var getBaseElem = function getBaseElem(group) { - if (group.type === "ordgroup") { - if (group.body.length === 1) { - return getBaseElem(group.body[0]); - } else { - return group; - } - } else if (group.type === "color") { - if (group.body.length === 1) { - return getBaseElem(group.body[0]); - } else { - return group; - } - } else if (group.type === "font") { - return getBaseElem(group.body); - } else { - return group; - } -}; -/** - * TeXbook algorithms often reference "character boxes", which are simply groups - * with a single character in them. To decide if something is a character box, - * we find its innermost group, and see if it is a single character. - */ - - -var utils_isCharacterBox = function isCharacterBox(group) { - var baseElem = getBaseElem(group); // These are all they types of groups which hold single characters - - return baseElem.type === "mathord" || baseElem.type === "textord" || baseElem.type === "atom"; -}; - -var assert = function assert(value) { - if (!value) { - throw new Error('Expected non-null, but got ' + String(value)); - } - - return value; -}; -/** - * Return the protocol of a URL, or "_relative" if the URL does not specify a - * protocol (and thus is relative). - */ - -var protocolFromUrl = function protocolFromUrl(url) { - var protocol = /^\s*([^\\/#]*?)(?::|�*58|�*3a)/i.exec(url); - return protocol != null ? protocol[1] : "_relative"; -}; -/* harmony default export */ var utils = ({ - contains: contains, - deflt: deflt, - escape: utils_escape, - hyphenate: hyphenate, - getBaseElem: getBaseElem, - isCharacterBox: utils_isCharacterBox, - protocolFromUrl: protocolFromUrl -}); -// CONCATENATED MODULE: ./src/Settings.js -/* eslint no-console:0 */ - -/** - * This is a module for storing settings passed into KaTeX. It correctly handles - * default settings. - */ - - - - -/** - * The main Settings object - * - * The current options stored are: - * - displayMode: Whether the expression should be typeset as inline math - * (false, the default), meaning that the math starts in - * \textstyle and is placed in an inline-block); or as display - * math (true), meaning that the math starts in \displaystyle - * and is placed in a block with vertical margin. - */ -var Settings_Settings = -/*#__PURE__*/ -function () { - function Settings(options) { - this.displayMode = void 0; - this.output = void 0; - this.leqno = void 0; - this.fleqn = void 0; - this.throwOnError = void 0; - this.errorColor = void 0; - this.macros = void 0; - this.minRuleThickness = void 0; - this.colorIsTextColor = void 0; - this.strict = void 0; - this.trust = void 0; - this.maxSize = void 0; - this.maxExpand = void 0; - this.globalGroup = void 0; - // allow null options - options = options || {}; - this.displayMode = utils.deflt(options.displayMode, false); - this.output = utils.deflt(options.output, "htmlAndMathml"); - this.leqno = utils.deflt(options.leqno, false); - this.fleqn = utils.deflt(options.fleqn, false); - this.throwOnError = utils.deflt(options.throwOnError, true); - this.errorColor = utils.deflt(options.errorColor, "#cc0000"); - this.macros = options.macros || {}; - this.minRuleThickness = Math.max(0, utils.deflt(options.minRuleThickness, 0)); - this.colorIsTextColor = utils.deflt(options.colorIsTextColor, false); - this.strict = utils.deflt(options.strict, "warn"); - this.trust = utils.deflt(options.trust, false); - this.maxSize = Math.max(0, utils.deflt(options.maxSize, Infinity)); - this.maxExpand = Math.max(0, utils.deflt(options.maxExpand, 1000)); - this.globalGroup = utils.deflt(options.globalGroup, false); - } - /** - * Report nonstrict (non-LaTeX-compatible) input. - * Can safely not be called if `this.strict` is false in JavaScript. - */ - - - var _proto = Settings.prototype; - - _proto.reportNonstrict = function reportNonstrict(errorCode, errorMsg, token) { - var strict = this.strict; - - if (typeof strict === "function") { - // Allow return value of strict function to be boolean or string - // (or null/undefined, meaning no further processing). - strict = strict(errorCode, errorMsg, token); - } - - if (!strict || strict === "ignore") { - return; - } else if (strict === true || strict === "error") { - throw new src_ParseError("LaTeX-incompatible input and strict mode is set to 'error': " + (errorMsg + " [" + errorCode + "]"), token); - } else if (strict === "warn") { - typeof console !== "undefined" && console.warn("LaTeX-incompatible input and strict mode is set to 'warn': " + (errorMsg + " [" + errorCode + "]")); - } else { - // won't happen in type-safe code - typeof console !== "undefined" && console.warn("LaTeX-incompatible input and strict mode is set to " + ("unrecognized '" + strict + "': " + errorMsg + " [" + errorCode + "]")); - } - } - /** - * Check whether to apply strict (LaTeX-adhering) behavior for unusual - * input (like `\\`). Unlike `nonstrict`, will not throw an error; - * instead, "error" translates to a return value of `true`, while "ignore" - * translates to a return value of `false`. May still print a warning: - * "warn" prints a warning and returns `false`. - * This is for the second category of `errorCode`s listed in the README. - */ - ; - - _proto.useStrictBehavior = function useStrictBehavior(errorCode, errorMsg, token) { - var strict = this.strict; - - if (typeof strict === "function") { - // Allow return value of strict function to be boolean or string - // (or null/undefined, meaning no further processing). - // But catch any exceptions thrown by function, treating them - // like "error". - try { - strict = strict(errorCode, errorMsg, token); - } catch (error) { - strict = "error"; - } - } - - if (!strict || strict === "ignore") { - return false; - } else if (strict === true || strict === "error") { - return true; - } else if (strict === "warn") { - typeof console !== "undefined" && console.warn("LaTeX-incompatible input and strict mode is set to 'warn': " + (errorMsg + " [" + errorCode + "]")); - return false; - } else { - // won't happen in type-safe code - typeof console !== "undefined" && console.warn("LaTeX-incompatible input and strict mode is set to " + ("unrecognized '" + strict + "': " + errorMsg + " [" + errorCode + "]")); - return false; - } - } - /** - * Check whether to test potentially dangerous input, and return - * `true` (trusted) or `false` (untrusted). The sole argument `context` - * should be an object with `command` field specifying the relevant LaTeX - * command (as a string starting with `\`), and any other arguments, etc. - * If `context` has a `url` field, a `protocol` field will automatically - * get added by this function (changing the specified object). - */ - ; - - _proto.isTrusted = function isTrusted(context) { - if (context.url && !context.protocol) { - context.protocol = utils.protocolFromUrl(context.url); - } - - var trust = typeof this.trust === "function" ? this.trust(context) : this.trust; - return Boolean(trust); - }; - - return Settings; -}(); - - -// CONCATENATED MODULE: ./src/Style.js -/** - * This file contains information and classes for the various kinds of styles - * used in TeX. It provides a generic `Style` class, which holds information - * about a specific style. It then provides instances of all the different kinds - * of styles possible, and provides functions to move between them and get - * information about them. - */ - -/** - * The main style class. Contains a unique id for the style, a size (which is - * the same for cramped and uncramped version of a style), and a cramped flag. - */ -var Style = -/*#__PURE__*/ -function () { - function Style(id, size, cramped) { - this.id = void 0; - this.size = void 0; - this.cramped = void 0; - this.id = id; - this.size = size; - this.cramped = cramped; - } - /** - * Get the style of a superscript given a base in the current style. - */ - - - var _proto = Style.prototype; - - _proto.sup = function sup() { - return Style_styles[_sup[this.id]]; - } - /** - * Get the style of a subscript given a base in the current style. - */ - ; - - _proto.sub = function sub() { - return Style_styles[_sub[this.id]]; - } - /** - * Get the style of a fraction numerator given the fraction in the current - * style. - */ - ; - - _proto.fracNum = function fracNum() { - return Style_styles[_fracNum[this.id]]; - } - /** - * Get the style of a fraction denominator given the fraction in the current - * style. - */ - ; - - _proto.fracDen = function fracDen() { - return Style_styles[_fracDen[this.id]]; - } - /** - * Get the cramped version of a style (in particular, cramping a cramped style - * doesn't change the style). - */ - ; - - _proto.cramp = function cramp() { - return Style_styles[_cramp[this.id]]; - } - /** - * Get a text or display version of this style. - */ - ; - - _proto.text = function text() { - return Style_styles[_text[this.id]]; - } - /** - * Return true if this style is tightly spaced (scriptstyle/scriptscriptstyle) - */ - ; - - _proto.isTight = function isTight() { - return this.size >= 2; - }; - - return Style; -}(); // Export an interface for type checking, but don't expose the implementation. -// This way, no more styles can be generated. - - -// IDs of the different styles -var D = 0; -var Dc = 1; -var T = 2; -var Tc = 3; -var S = 4; -var Sc = 5; -var SS = 6; -var SSc = 7; // Instances of the different styles - -var Style_styles = [new Style(D, 0, false), new Style(Dc, 0, true), new Style(T, 1, false), new Style(Tc, 1, true), new Style(S, 2, false), new Style(Sc, 2, true), new Style(SS, 3, false), new Style(SSc, 3, true)]; // Lookup tables for switching from one style to another - -var _sup = [S, Sc, S, Sc, SS, SSc, SS, SSc]; -var _sub = [Sc, Sc, Sc, Sc, SSc, SSc, SSc, SSc]; -var _fracNum = [T, Tc, S, Sc, SS, SSc, SS, SSc]; -var _fracDen = [Tc, Tc, Sc, Sc, SSc, SSc, SSc, SSc]; -var _cramp = [Dc, Dc, Tc, Tc, Sc, Sc, SSc, SSc]; -var _text = [D, Dc, T, Tc, T, Tc, T, Tc]; // We only export some of the styles. - -/* harmony default export */ var src_Style = ({ - DISPLAY: Style_styles[D], - TEXT: Style_styles[T], - SCRIPT: Style_styles[S], - SCRIPTSCRIPT: Style_styles[SS] -}); -// CONCATENATED MODULE: ./src/unicodeScripts.js -/* - * This file defines the Unicode scripts and script families that we - * support. To add new scripts or families, just add a new entry to the - * scriptData array below. Adding scripts to the scriptData array allows - * characters from that script to appear in \text{} environments. - */ - -/** - * Each script or script family has a name and an array of blocks. - * Each block is an array of two numbers which specify the start and - * end points (inclusive) of a block of Unicode codepoints. - */ - -/** - * Unicode block data for the families of scripts we support in \text{}. - * Scripts only need to appear here if they do not have font metrics. - */ -var scriptData = [{ - // Latin characters beyond the Latin-1 characters we have metrics for. - // Needed for Czech, Hungarian and Turkish text, for example. - name: 'latin', - blocks: [[0x0100, 0x024f], // Latin Extended-A and Latin Extended-B - [0x0300, 0x036f]] -}, { - // The Cyrillic script used by Russian and related languages. - // A Cyrillic subset used to be supported as explicitly defined - // symbols in symbols.js - name: 'cyrillic', - blocks: [[0x0400, 0x04ff]] -}, { - // The Brahmic scripts of South and Southeast Asia - // Devanagari (0900–097F) - // Bengali (0980–09FF) - // Gurmukhi (0A00–0A7F) - // Gujarati (0A80–0AFF) - // Oriya (0B00–0B7F) - // Tamil (0B80–0BFF) - // Telugu (0C00–0C7F) - // Kannada (0C80–0CFF) - // Malayalam (0D00–0D7F) - // Sinhala (0D80–0DFF) - // Thai (0E00–0E7F) - // Lao (0E80–0EFF) - // Tibetan (0F00–0FFF) - // Myanmar (1000–109F) - name: 'brahmic', - blocks: [[0x0900, 0x109F]] -}, { - name: 'georgian', - blocks: [[0x10A0, 0x10ff]] -}, { - // Chinese and Japanese. - // The "k" in cjk is for Korean, but we've separated Korean out - name: "cjk", - blocks: [[0x3000, 0x30FF], // CJK symbols and punctuation, Hiragana, Katakana - [0x4E00, 0x9FAF], // CJK ideograms - [0xFF00, 0xFF60]] -}, { - // Korean - name: 'hangul', - blocks: [[0xAC00, 0xD7AF]] -}]; -/** - * Given a codepoint, return the name of the script or script family - * it is from, or null if it is not part of a known block - */ - -function scriptFromCodepoint(codepoint) { - for (var i = 0; i < scriptData.length; i++) { - var script = scriptData[i]; - - for (var _i = 0; _i < script.blocks.length; _i++) { - var block = script.blocks[_i]; - - if (codepoint >= block[0] && codepoint <= block[1]) { - return script.name; - } - } - } - - return null; -} -/** - * A flattened version of all the supported blocks in a single array. - * This is an optimization to make supportedCodepoint() fast. - */ - -var allBlocks = []; -scriptData.forEach(function (s) { - return s.blocks.forEach(function (b) { - return allBlocks.push.apply(allBlocks, b); - }); -}); -/** - * Given a codepoint, return true if it falls within one of the - * scripts or script families defined above and false otherwise. - * - * Micro benchmarks shows that this is faster than - * /[\u3000-\u30FF\u4E00-\u9FAF\uFF00-\uFF60\uAC00-\uD7AF\u0900-\u109F]/.test() - * in Firefox, Chrome and Node. - */ - -function supportedCodepoint(codepoint) { - for (var i = 0; i < allBlocks.length; i += 2) { - if (codepoint >= allBlocks[i] && codepoint <= allBlocks[i + 1]) { - return true; - } - } - - return false; -} -// CONCATENATED MODULE: ./src/svgGeometry.js -/** - * This file provides support to domTree.js and delimiter.js. - * It's a storehouse of path geometry for SVG images. - */ -// In all paths below, the viewBox-to-em scale is 1000:1. -var hLinePad = 80; // padding above a sqrt viniculum. Prevents image cropping. -// The viniculum of a \sqrt can be made thicker by a KaTeX rendering option. -// Think of variable extraViniculum as two detours in the SVG path. -// The detour begins at the lower left of the area labeled extraViniculum below. -// The detour proceeds one extraViniculum distance up and slightly to the right, -// displacing the radiused corner between surd and viniculum. The radius is -// traversed as usual, then the detour resumes. It goes right, to the end of -// the very long viniculumn, then down one extraViniculum distance, -// after which it resumes regular path geometry for the radical. - -/* viniculum - / - /▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒←extraViniculum - / █████████████████████←0.04em (40 unit) std viniculum thickness - / / - / / - / /\ - / / surd -*/ - -var sqrtMain = function sqrtMain(extraViniculum, hLinePad) { - // sqrtMain path geometry is from glyph U221A in the font KaTeX Main - return "M95," + (622 + extraViniculum + hLinePad) + "\nc-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14\nc0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54\nc44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10\ns173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429\nc69,-144,104.5,-217.7,106.5,-221\nl" + extraViniculum / 2.075 + " -" + extraViniculum + "\nc5.3,-9.3,12,-14,20,-14\nH400000v" + (40 + extraViniculum) + "H845.2724\ns-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7\nc-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z\nM" + (834 + extraViniculum) + " " + hLinePad + "h400000v" + (40 + extraViniculum) + "h-400000z"; -}; - -var sqrtSize1 = function sqrtSize1(extraViniculum, hLinePad) { - // size1 is from glyph U221A in the font KaTeX_Size1-Regular - return "M263," + (601 + extraViniculum + hLinePad) + "c0.7,0,18,39.7,52,119\nc34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120\nc340,-704.7,510.7,-1060.3,512,-1067\nl" + extraViniculum / 2.084 + " -" + extraViniculum + "\nc4.7,-7.3,11,-11,19,-11\nH40000v" + (40 + extraViniculum) + "H1012.3\ns-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232\nc-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1\ns-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26\nc-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z\nM" + (1001 + extraViniculum) + " " + hLinePad + "h400000v" + (40 + extraViniculum) + "h-400000z"; -}; - -var sqrtSize2 = function sqrtSize2(extraViniculum, hLinePad) { - // size2 is from glyph U221A in the font KaTeX_Size2-Regular - return "M983 " + (10 + extraViniculum + hLinePad) + "\nl" + extraViniculum / 3.13 + " -" + extraViniculum + "\nc4,-6.7,10,-10,18,-10 H400000v" + (40 + extraViniculum) + "\nH1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7\ns-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744\nc-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30\nc26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722\nc56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5\nc53.7,-170.3,84.5,-266.8,92.5,-289.5z\nM" + (1001 + extraViniculum) + " " + hLinePad + "h400000v" + (40 + extraViniculum) + "h-400000z"; -}; - -var sqrtSize3 = function sqrtSize3(extraViniculum, hLinePad) { - // size3 is from glyph U221A in the font KaTeX_Size3-Regular - return "M424," + (2398 + extraViniculum + hLinePad) + "\nc-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514\nc0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20\ns-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121\ns209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081\nl" + extraViniculum / 4.223 + " -" + extraViniculum + "c4,-6.7,10,-10,18,-10 H400000\nv" + (40 + extraViniculum) + "H1014.6\ns-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185\nc-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2z M" + (1001 + extraViniculum) + " " + hLinePad + "\nh400000v" + (40 + extraViniculum) + "h-400000z"; -}; - -var sqrtSize4 = function sqrtSize4(extraViniculum, hLinePad) { - // size4 is from glyph U221A in the font KaTeX_Size4-Regular - return "M473," + (2713 + extraViniculum + hLinePad) + "\nc339.3,-1799.3,509.3,-2700,510,-2702 l" + extraViniculum / 5.298 + " -" + extraViniculum + "\nc3.3,-7.3,9.3,-11,18,-11 H400000v" + (40 + extraViniculum) + "H1017.7\ns-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200\nc0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26\ns76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104,\n606zM" + (1001 + extraViniculum) + " " + hLinePad + "h400000v" + (40 + extraViniculum) + "H1017.7z"; -}; - -var sqrtTall = function sqrtTall(extraViniculum, hLinePad, viewBoxHeight) { - // sqrtTall is from glyph U23B7 in the font KaTeX_Size4-Regular - // One path edge has a variable length. It runs vertically from the viniculumn - // to a point near (14 units) the bottom of the surd. The viniculum - // is normally 40 units thick. So the length of the line in question is: - var vertSegment = viewBoxHeight - 54 - hLinePad - extraViniculum; - return "M702 " + (extraViniculum + hLinePad) + "H400000" + (40 + extraViniculum) + "\nH742v" + vertSegment + "l-4 4-4 4c-.667.7 -2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1\nh-12l-28-84c-16.667-52-96.667 -294.333-240-727l-212 -643 -85 170\nc-4-3.333-8.333-7.667-13 -13l-13-13l77-155 77-156c66 199.333 139 419.667\n219 661 l218 661zM702 " + hLinePad + "H400000v" + (40 + extraViniculum) + "H742z"; -}; - -var sqrtPath = function sqrtPath(size, extraViniculum, viewBoxHeight) { - extraViniculum = 1000 * extraViniculum; // Convert from document ems to viewBox. - - var path = ""; - - switch (size) { - case "sqrtMain": - path = sqrtMain(extraViniculum, hLinePad); - break; - - case "sqrtSize1": - path = sqrtSize1(extraViniculum, hLinePad); - break; - - case "sqrtSize2": - path = sqrtSize2(extraViniculum, hLinePad); - break; - - case "sqrtSize3": - path = sqrtSize3(extraViniculum, hLinePad); - break; - - case "sqrtSize4": - path = sqrtSize4(extraViniculum, hLinePad); - break; - - case "sqrtTall": - path = sqrtTall(extraViniculum, hLinePad, viewBoxHeight); - } - - return path; -}; -var svgGeometry_path = { - // Two paths that cover gaps in built-up parentheses. - leftParenInner: "M291 0 H417 V300 H291 z", - rightParenInner: "M457 0 H583 V300 H457 z", - // The doubleleftarrow geometry is from glyph U+21D0 in the font KaTeX Main - doubleleftarrow: "M262 157\nl10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3\n 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28\n 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5\nc2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5\n 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87\n-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7\n-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z\nm8 0v40h399730v-40zm0 194v40h399730v-40z", - // doublerightarrow is from glyph U+21D2 in font KaTeX Main - doublerightarrow: "M399738 392l\n-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5\n 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88\n-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68\n-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18\n-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782\nc-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3\n-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z", - // leftarrow is from glyph U+2190 in font KaTeX Main - leftarrow: "M400000 241H110l3-3c68.7-52.7 113.7-120\n 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8\n-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247\nc-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208\n 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3\n 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202\n l-3-3h399890zM100 241v40h399900v-40z", - // overbrace is from glyphs U+23A9/23A8/23A7 in font KaTeX_Size4-Regular - leftbrace: "M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117\n-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7\n 5-6 9-10 13-.7 1-7.3 1-20 1H6z", - leftbraceunder: "M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13\n 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688\n 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7\n-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z", - // overgroup is from the MnSymbol package (public domain) - leftgroup: "M400000 80\nH435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0\n 435 0h399565z", - leftgroupunder: "M400000 262\nH435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219\n 435 219h399565z", - // Harpoons are from glyph U+21BD in font KaTeX Main - leftharpoon: "M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3\n-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5\n-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7\n-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z", - leftharpoonplus: "M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5\n 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3\n-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7\n-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z\nm0 0v40h400000v-40z", - leftharpoondown: "M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333\n 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5\n 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667\n-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z", - leftharpoondownplus: "M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12\n 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7\n-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0\nv40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z", - // hook is from glyph U+21A9 in font KaTeX Main - lefthook: "M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5\n-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3\n-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21\n 71.5 23h399859zM103 281v-40h399897v40z", - leftlinesegment: "M40 281 V428 H0 V94 H40 V241 H400000 v40z\nM40 281 V428 H0 V94 H40 V241 H400000 v40z", - leftmapsto: "M40 281 V448H0V74H40V241H400000v40z\nM40 281 V448H0V74H40V241H400000v40z", - // tofrom is from glyph U+21C4 in font KaTeX AMS Regular - leftToFrom: "M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23\n-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8\nc28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3\n 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z", - longequal: "M0 50 h400000 v40H0z m0 194h40000v40H0z\nM0 50 h400000 v40H0z m0 194h40000v40H0z", - midbrace: "M200428 334\nc-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14\n-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7\n 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11\n 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z", - midbraceunder: "M199572 214\nc100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14\n 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3\n 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0\n-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z", - oiintSize1: "M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6\n-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z\nm368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8\n60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z", - oiintSize2: "M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8\n-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z\nm502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2\nc0 110 84 276 504 276s502.4-166 502.4-276z", - oiiintSize1: "M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6\n-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z\nm525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0\n85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z", - oiiintSize2: "M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8\n-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z\nm770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1\nc0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z", - rightarrow: "M0 241v40h399891c-47.3 35.3-84 78-110 128\n-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20\n 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7\n 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85\n-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n 151.7 139 205zm0 0v40h399900v-40z", - rightbrace: "M400000 542l\n-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5\ns-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1\nc124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z", - rightbraceunder: "M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3\n 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237\n-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z", - rightgroup: "M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0\n 3-1 3-3v-38c-76-158-257-219-435-219H0z", - rightgroupunder: "M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18\n 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z", - rightharpoon: "M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3\n-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2\n-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58\n 69.2 92 94.5zm0 0v40h399900v-40z", - rightharpoonplus: "M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11\n-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7\n 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z\nm0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z", - rightharpoondown: "M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8\n 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5\n-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95\n-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z", - rightharpoondownplus: "M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8\n 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3\n 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3\n-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z\nm0-194v40h400000v-40zm0 0v40h400000v-40z", - righthook: "M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3\n 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0\n-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21\n 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z", - rightlinesegment: "M399960 241 V94 h40 V428 h-40 V281 H0 v-40z\nM399960 241 V94 h40 V428 h-40 V281 H0 v-40z", - rightToFrom: "M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23\n 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32\n-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142\n-167z M100 147v40h399900v-40zM0 341v40h399900v-40z", - // twoheadleftarrow is from glyph U+219E in font KaTeX AMS Regular - twoheadleftarrow: "M0 167c68 40\n 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69\n-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3\n-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19\n-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101\n 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z", - twoheadrightarrow: "M400000 167\nc-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3\n 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42\n 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333\n-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70\n 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z", - // tilde1 is a modified version of a glyph from the MnSymbol package - tilde1: "M200 55.538c-77 0-168 73.953-177 73.953-3 0-7\n-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0\n 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0\n 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128\n-68.267.847-113-73.952-191-73.952z", - // ditto tilde2, tilde3, & tilde4 - tilde2: "M344 55.266c-142 0-300.638 81.316-311.5 86.418\n-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9\n 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114\nc1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751\n 181.476 676 181.476c-149 0-189-126.21-332-126.21z", - tilde3: "M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457\n-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0\n 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697\n 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696\n -338 0-409-156.573-744-156.573z", - tilde4: "M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345\n-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409\n 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9\n 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409\n -175.236-744-175.236z", - // vec is from glyph U+20D7 in font KaTeX Main - vec: "M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z", - // widehat1 is a modified version of a glyph from the MnSymbol package - widehat1: "M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22\nc-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z", - // ditto widehat2, widehat3, & widehat4 - widehat2: "M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z", - widehat3: "M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z", - widehat4: "M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z", - // widecheck paths are all inverted versions of widehat - widecheck1: "M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1,\n-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z", - widecheck2: "M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z", - widecheck3: "M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z", - widecheck4: "M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z", - // The next ten paths support reaction arrows from the mhchem package. - // Arrows for \ce{<-->} are offset from xAxis by 0.22ex, per mhchem in LaTeX - // baraboveleftarrow is mostly from from glyph U+2190 in font KaTeX Main - baraboveleftarrow: "M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202\nc4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5\nc-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130\ns-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47\n121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6\ns2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11\nc0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z\nM100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z", - // rightarrowabovebar is mostly from glyph U+2192, KaTeX Main - rightarrowabovebar: "M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32\n-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0\n13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39\n-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5\n-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z", - // The short left harpoon has 0.5em (i.e. 500 units) kern on the left end. - // Ref from mhchem.sty: \rlap{\raisebox{-.22ex}{$\kern0.5em - baraboveshortleftharpoon: "M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17\nc2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21\nc-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40\nc-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z\nM0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z", - rightharpoonaboveshortbar: "M0,241 l0,40c399126,0,399993,0,399993,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z", - shortbaraboveleftharpoon: "M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9,\n1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7,\n-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z\nM93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z", - shortrightharpoonabovebar: "M53,241l0,40c398570,0,399437,0,399437,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z" -}; -// CONCATENATED MODULE: ./src/tree.js - - -/** - * This node represents a document fragment, which contains elements, but when - * placed into the DOM doesn't have any representation itself. It only contains - * children and doesn't have any DOM node properties. - */ -var tree_DocumentFragment = -/*#__PURE__*/ -function () { - // HtmlDomNode - // Never used; needed for satisfying interface. - function DocumentFragment(children) { - this.children = void 0; - this.classes = void 0; - this.height = void 0; - this.depth = void 0; - this.maxFontSize = void 0; - this.style = void 0; - this.children = children; - this.classes = []; - this.height = 0; - this.depth = 0; - this.maxFontSize = 0; - this.style = {}; - } - - var _proto = DocumentFragment.prototype; - - _proto.hasClass = function hasClass(className) { - return utils.contains(this.classes, className); - } - /** Convert the fragment into a node. */ - ; - - _proto.toNode = function toNode() { - var frag = document.createDocumentFragment(); - - for (var i = 0; i < this.children.length; i++) { - frag.appendChild(this.children[i].toNode()); - } - - return frag; - } - /** Convert the fragment into HTML markup. */ - ; - - _proto.toMarkup = function toMarkup() { - var markup = ""; // Simply concatenate the markup for the children together. - - for (var i = 0; i < this.children.length; i++) { - markup += this.children[i].toMarkup(); - } - - return markup; - } - /** - * Converts the math node into a string, similar to innerText. Applies to - * MathDomNode's only. - */ - ; - - _proto.toText = function toText() { - // To avoid this, we would subclass documentFragment separately for - // MathML, but polyfills for subclassing is expensive per PR 1469. - // $FlowFixMe: Only works for ChildType = MathDomNode. - var toText = function toText(child) { - return child.toText(); - }; - - return this.children.map(toText).join(""); - }; - - return DocumentFragment; -}(); -// CONCATENATED MODULE: ./src/domTree.js -/** - * These objects store the data about the DOM nodes we create, as well as some - * extra data. They can then be transformed into real DOM nodes with the - * `toNode` function or HTML markup using `toMarkup`. They are useful for both - * storing extra properties on the nodes, as well as providing a way to easily - * work with the DOM. - * - * Similar functions for working with MathML nodes exist in mathMLTree.js. - * - * TODO: refactor `span` and `anchor` into common superclass when - * target environments support class inheritance - */ - - - - - -/** - * Create an HTML className based on a list of classes. In addition to joining - * with spaces, we also remove empty classes. - */ -var createClass = function createClass(classes) { - return classes.filter(function (cls) { - return cls; - }).join(" "); -}; - -var initNode = function initNode(classes, options, style) { - this.classes = classes || []; - this.attributes = {}; - this.height = 0; - this.depth = 0; - this.maxFontSize = 0; - this.style = style || {}; - - if (options) { - if (options.style.isTight()) { - this.classes.push("mtight"); - } - - var color = options.getColor(); - - if (color) { - this.style.color = color; - } - } -}; -/** - * Convert into an HTML node - */ - - -var _toNode = function toNode(tagName) { - var node = document.createElement(tagName); // Apply the class - - node.className = createClass(this.classes); // Apply inline styles - - for (var style in this.style) { - if (this.style.hasOwnProperty(style)) { - // $FlowFixMe Flow doesn't seem to understand span.style's type. - node.style[style] = this.style[style]; - } - } // Apply attributes - - - for (var attr in this.attributes) { - if (this.attributes.hasOwnProperty(attr)) { - node.setAttribute(attr, this.attributes[attr]); - } - } // Append the children, also as HTML nodes - - - for (var i = 0; i < this.children.length; i++) { - node.appendChild(this.children[i].toNode()); - } - - return node; -}; -/** - * Convert into an HTML markup string - */ - - -var _toMarkup = function toMarkup(tagName) { - var markup = "<" + tagName; // Add the class - - if (this.classes.length) { - markup += " class=\"" + utils.escape(createClass(this.classes)) + "\""; - } - - var styles = ""; // Add the styles, after hyphenation - - for (var style in this.style) { - if (this.style.hasOwnProperty(style)) { - styles += utils.hyphenate(style) + ":" + this.style[style] + ";"; - } - } - - if (styles) { - markup += " style=\"" + utils.escape(styles) + "\""; - } // Add the attributes - - - for (var attr in this.attributes) { - if (this.attributes.hasOwnProperty(attr)) { - markup += " " + attr + "=\"" + utils.escape(this.attributes[attr]) + "\""; - } - } - - markup += ">"; // Add the markup of the children, also as markup - - for (var i = 0; i < this.children.length; i++) { - markup += this.children[i].toMarkup(); - } - - markup += ""; - return markup; -}; // Making the type below exact with all optional fields doesn't work due to -// - https://github.com/facebook/flow/issues/4582 -// - https://github.com/facebook/flow/issues/5688 -// However, since *all* fields are optional, $Shape<> works as suggested in 5688 -// above. -// This type does not include all CSS properties. Additional properties should -// be added as needed. - - -/** - * This node represents a span node, with a className, a list of children, and - * an inline style. It also contains information about its height, depth, and - * maxFontSize. - * - * Represents two types with different uses: SvgSpan to wrap an SVG and DomSpan - * otherwise. This typesafety is important when HTML builders access a span's - * children. - */ -var domTree_Span = -/*#__PURE__*/ -function () { - function Span(classes, children, options, style) { - this.children = void 0; - this.attributes = void 0; - this.classes = void 0; - this.height = void 0; - this.depth = void 0; - this.width = void 0; - this.maxFontSize = void 0; - this.style = void 0; - initNode.call(this, classes, options, style); - this.children = children || []; - } - /** - * Sets an arbitrary attribute on the span. Warning: use this wisely. Not - * all browsers support attributes the same, and having too many custom - * attributes is probably bad. - */ - - - var _proto = Span.prototype; - - _proto.setAttribute = function setAttribute(attribute, value) { - this.attributes[attribute] = value; - }; - - _proto.hasClass = function hasClass(className) { - return utils.contains(this.classes, className); - }; - - _proto.toNode = function toNode() { - return _toNode.call(this, "span"); - }; - - _proto.toMarkup = function toMarkup() { - return _toMarkup.call(this, "span"); - }; - - return Span; -}(); -/** - * This node represents an anchor () element with a hyperlink. See `span` - * for further details. - */ - -var domTree_Anchor = -/*#__PURE__*/ -function () { - function Anchor(href, classes, children, options) { - this.children = void 0; - this.attributes = void 0; - this.classes = void 0; - this.height = void 0; - this.depth = void 0; - this.maxFontSize = void 0; - this.style = void 0; - initNode.call(this, classes, options); - this.children = children || []; - this.setAttribute('href', href); - } - - var _proto2 = Anchor.prototype; - - _proto2.setAttribute = function setAttribute(attribute, value) { - this.attributes[attribute] = value; - }; - - _proto2.hasClass = function hasClass(className) { - return utils.contains(this.classes, className); - }; - - _proto2.toNode = function toNode() { - return _toNode.call(this, "a"); - }; - - _proto2.toMarkup = function toMarkup() { - return _toMarkup.call(this, "a"); - }; - - return Anchor; -}(); -/** - * This node represents an image embed () element. - */ - -var domTree_Img = -/*#__PURE__*/ -function () { - function Img(src, alt, style) { - this.src = void 0; - this.alt = void 0; - this.classes = void 0; - this.height = void 0; - this.depth = void 0; - this.maxFontSize = void 0; - this.style = void 0; - this.alt = alt; - this.src = src; - this.classes = ["mord"]; - this.style = style; - } - - var _proto3 = Img.prototype; - - _proto3.hasClass = function hasClass(className) { - return utils.contains(this.classes, className); - }; - - _proto3.toNode = function toNode() { - var node = document.createElement("img"); - node.src = this.src; - node.alt = this.alt; - node.className = "mord"; // Apply inline styles - - for (var style in this.style) { - if (this.style.hasOwnProperty(style)) { - // $FlowFixMe - node.style[style] = this.style[style]; - } - } - - return node; - }; - - _proto3.toMarkup = function toMarkup() { - var markup = "" + this.alt + " 0) { - span = document.createElement("span"); - span.style.marginRight = this.italic + "em"; - } - - if (this.classes.length > 0) { - span = span || document.createElement("span"); - span.className = createClass(this.classes); - } - - for (var style in this.style) { - if (this.style.hasOwnProperty(style)) { - span = span || document.createElement("span"); // $FlowFixMe Flow doesn't seem to understand span.style's type. - - span.style[style] = this.style[style]; - } - } - - if (span) { - span.appendChild(node); - return span; - } else { - return node; - } - } - /** - * Creates markup for a symbol node. - */ - ; - - _proto4.toMarkup = function toMarkup() { - // TODO(alpert): More duplication than I'd like from - // span.prototype.toMarkup and symbolNode.prototype.toNode... - var needsSpan = false; - var markup = " 0) { - styles += "margin-right:" + this.italic + "em;"; - } - - for (var style in this.style) { - if (this.style.hasOwnProperty(style)) { - styles += utils.hyphenate(style) + ":" + this.style[style] + ";"; - } - } - - if (styles) { - needsSpan = true; - markup += " style=\"" + utils.escape(styles) + "\""; - } - - var escaped = utils.escape(this.text); - - if (needsSpan) { - markup += ">"; - markup += escaped; - markup += ""; - return markup; - } else { - return escaped; - } - }; - - return SymbolNode; -}(); -/** - * SVG nodes are used to render stretchy wide elements. - */ - -var SvgNode = -/*#__PURE__*/ -function () { - function SvgNode(children, attributes) { - this.children = void 0; - this.attributes = void 0; - this.children = children || []; - this.attributes = attributes || {}; - } - - var _proto5 = SvgNode.prototype; - - _proto5.toNode = function toNode() { - var svgNS = "http://www.w3.org/2000/svg"; - var node = document.createElementNS(svgNS, "svg"); // Apply attributes - - for (var attr in this.attributes) { - if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) { - node.setAttribute(attr, this.attributes[attr]); - } - } - - for (var i = 0; i < this.children.length; i++) { - node.appendChild(this.children[i].toNode()); - } - - return node; - }; - - _proto5.toMarkup = function toMarkup() { - var markup = ""; - } else { - return ""; - } - }; - - return PathNode; -}(); -var LineNode = -/*#__PURE__*/ -function () { - function LineNode(attributes) { - this.attributes = void 0; - this.attributes = attributes || {}; - } - - var _proto7 = LineNode.prototype; - - _proto7.toNode = function toNode() { - var svgNS = "http://www.w3.org/2000/svg"; - var node = document.createElementNS(svgNS, "line"); // Apply attributes - - for (var attr in this.attributes) { - if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) { - node.setAttribute(attr, this.attributes[attr]); - } - } - - return node; - }; - - _proto7.toMarkup = function toMarkup() { - var markup = " but got " + String(group) + "."); - } -} -// CONCATENATED MODULE: ./submodules/katex-fonts/fontMetricsData.js -// This file is GENERATED by buildMetrics.sh. DO NOT MODIFY. -/* harmony default export */ var fontMetricsData = ({ - "AMS-Regular": { - "32": [0, 0, 0, 0, 0.25], - "65": [0, 0.68889, 0, 0, 0.72222], - "66": [0, 0.68889, 0, 0, 0.66667], - "67": [0, 0.68889, 0, 0, 0.72222], - "68": [0, 0.68889, 0, 0, 0.72222], - "69": [0, 0.68889, 0, 0, 0.66667], - "70": [0, 0.68889, 0, 0, 0.61111], - "71": [0, 0.68889, 0, 0, 0.77778], - "72": [0, 0.68889, 0, 0, 0.77778], - "73": [0, 0.68889, 0, 0, 0.38889], - "74": [0.16667, 0.68889, 0, 0, 0.5], - "75": [0, 0.68889, 0, 0, 0.77778], - "76": [0, 0.68889, 0, 0, 0.66667], - "77": [0, 0.68889, 0, 0, 0.94445], - "78": [0, 0.68889, 0, 0, 0.72222], - "79": [0.16667, 0.68889, 0, 0, 0.77778], - "80": [0, 0.68889, 0, 0, 0.61111], - "81": [0.16667, 0.68889, 0, 0, 0.77778], - "82": [0, 0.68889, 0, 0, 0.72222], - "83": [0, 0.68889, 0, 0, 0.55556], - "84": [0, 0.68889, 0, 0, 0.66667], - "85": [0, 0.68889, 0, 0, 0.72222], - "86": [0, 0.68889, 0, 0, 0.72222], - "87": [0, 0.68889, 0, 0, 1.0], - "88": [0, 0.68889, 0, 0, 0.72222], - "89": [0, 0.68889, 0, 0, 0.72222], - "90": [0, 0.68889, 0, 0, 0.66667], - "107": [0, 0.68889, 0, 0, 0.55556], - "160": [0, 0, 0, 0, 0.25], - "165": [0, 0.675, 0.025, 0, 0.75], - "174": [0.15559, 0.69224, 0, 0, 0.94666], - "240": [0, 0.68889, 0, 0, 0.55556], - "295": [0, 0.68889, 0, 0, 0.54028], - "710": [0, 0.825, 0, 0, 2.33334], - "732": [0, 0.9, 0, 0, 2.33334], - "770": [0, 0.825, 0, 0, 2.33334], - "771": [0, 0.9, 0, 0, 2.33334], - "989": [0.08167, 0.58167, 0, 0, 0.77778], - "1008": [0, 0.43056, 0.04028, 0, 0.66667], - "8245": [0, 0.54986, 0, 0, 0.275], - "8463": [0, 0.68889, 0, 0, 0.54028], - "8487": [0, 0.68889, 0, 0, 0.72222], - "8498": [0, 0.68889, 0, 0, 0.55556], - "8502": [0, 0.68889, 0, 0, 0.66667], - "8503": [0, 0.68889, 0, 0, 0.44445], - "8504": [0, 0.68889, 0, 0, 0.66667], - "8513": [0, 0.68889, 0, 0, 0.63889], - "8592": [-0.03598, 0.46402, 0, 0, 0.5], - "8594": [-0.03598, 0.46402, 0, 0, 0.5], - "8602": [-0.13313, 0.36687, 0, 0, 1.0], - "8603": [-0.13313, 0.36687, 0, 0, 1.0], - "8606": [0.01354, 0.52239, 0, 0, 1.0], - "8608": [0.01354, 0.52239, 0, 0, 1.0], - "8610": [0.01354, 0.52239, 0, 0, 1.11111], - "8611": [0.01354, 0.52239, 0, 0, 1.11111], - "8619": [0, 0.54986, 0, 0, 1.0], - "8620": [0, 0.54986, 0, 0, 1.0], - "8621": [-0.13313, 0.37788, 0, 0, 1.38889], - "8622": [-0.13313, 0.36687, 0, 0, 1.0], - "8624": [0, 0.69224, 0, 0, 0.5], - "8625": [0, 0.69224, 0, 0, 0.5], - "8630": [0, 0.43056, 0, 0, 1.0], - "8631": [0, 0.43056, 0, 0, 1.0], - "8634": [0.08198, 0.58198, 0, 0, 0.77778], - "8635": [0.08198, 0.58198, 0, 0, 0.77778], - "8638": [0.19444, 0.69224, 0, 0, 0.41667], - "8639": [0.19444, 0.69224, 0, 0, 0.41667], - "8642": [0.19444, 0.69224, 0, 0, 0.41667], - "8643": [0.19444, 0.69224, 0, 0, 0.41667], - "8644": [0.1808, 0.675, 0, 0, 1.0], - "8646": [0.1808, 0.675, 0, 0, 1.0], - "8647": [0.1808, 0.675, 0, 0, 1.0], - "8648": [0.19444, 0.69224, 0, 0, 0.83334], - "8649": [0.1808, 0.675, 0, 0, 1.0], - "8650": [0.19444, 0.69224, 0, 0, 0.83334], - "8651": [0.01354, 0.52239, 0, 0, 1.0], - "8652": [0.01354, 0.52239, 0, 0, 1.0], - "8653": [-0.13313, 0.36687, 0, 0, 1.0], - "8654": [-0.13313, 0.36687, 0, 0, 1.0], - "8655": [-0.13313, 0.36687, 0, 0, 1.0], - "8666": [0.13667, 0.63667, 0, 0, 1.0], - "8667": [0.13667, 0.63667, 0, 0, 1.0], - "8669": [-0.13313, 0.37788, 0, 0, 1.0], - "8672": [-0.064, 0.437, 0, 0, 1.334], - "8674": [-0.064, 0.437, 0, 0, 1.334], - "8705": [0, 0.825, 0, 0, 0.5], - "8708": [0, 0.68889, 0, 0, 0.55556], - "8709": [0.08167, 0.58167, 0, 0, 0.77778], - "8717": [0, 0.43056, 0, 0, 0.42917], - "8722": [-0.03598, 0.46402, 0, 0, 0.5], - "8724": [0.08198, 0.69224, 0, 0, 0.77778], - "8726": [0.08167, 0.58167, 0, 0, 0.77778], - "8733": [0, 0.69224, 0, 0, 0.77778], - "8736": [0, 0.69224, 0, 0, 0.72222], - "8737": [0, 0.69224, 0, 0, 0.72222], - "8738": [0.03517, 0.52239, 0, 0, 0.72222], - "8739": [0.08167, 0.58167, 0, 0, 0.22222], - "8740": [0.25142, 0.74111, 0, 0, 0.27778], - "8741": [0.08167, 0.58167, 0, 0, 0.38889], - "8742": [0.25142, 0.74111, 0, 0, 0.5], - "8756": [0, 0.69224, 0, 0, 0.66667], - "8757": [0, 0.69224, 0, 0, 0.66667], - "8764": [-0.13313, 0.36687, 0, 0, 0.77778], - "8765": [-0.13313, 0.37788, 0, 0, 0.77778], - "8769": [-0.13313, 0.36687, 0, 0, 0.77778], - "8770": [-0.03625, 0.46375, 0, 0, 0.77778], - "8774": [0.30274, 0.79383, 0, 0, 0.77778], - "8776": [-0.01688, 0.48312, 0, 0, 0.77778], - "8778": [0.08167, 0.58167, 0, 0, 0.77778], - "8782": [0.06062, 0.54986, 0, 0, 0.77778], - "8783": [0.06062, 0.54986, 0, 0, 0.77778], - "8785": [0.08198, 0.58198, 0, 0, 0.77778], - "8786": [0.08198, 0.58198, 0, 0, 0.77778], - "8787": [0.08198, 0.58198, 0, 0, 0.77778], - "8790": [0, 0.69224, 0, 0, 0.77778], - "8791": [0.22958, 0.72958, 0, 0, 0.77778], - "8796": [0.08198, 0.91667, 0, 0, 0.77778], - "8806": [0.25583, 0.75583, 0, 0, 0.77778], - "8807": [0.25583, 0.75583, 0, 0, 0.77778], - "8808": [0.25142, 0.75726, 0, 0, 0.77778], - "8809": [0.25142, 0.75726, 0, 0, 0.77778], - "8812": [0.25583, 0.75583, 0, 0, 0.5], - "8814": [0.20576, 0.70576, 0, 0, 0.77778], - "8815": [0.20576, 0.70576, 0, 0, 0.77778], - "8816": [0.30274, 0.79383, 0, 0, 0.77778], - "8817": [0.30274, 0.79383, 0, 0, 0.77778], - "8818": [0.22958, 0.72958, 0, 0, 0.77778], - "8819": [0.22958, 0.72958, 0, 0, 0.77778], - "8822": [0.1808, 0.675, 0, 0, 0.77778], - "8823": [0.1808, 0.675, 0, 0, 0.77778], - "8828": [0.13667, 0.63667, 0, 0, 0.77778], - "8829": [0.13667, 0.63667, 0, 0, 0.77778], - "8830": [0.22958, 0.72958, 0, 0, 0.77778], - "8831": [0.22958, 0.72958, 0, 0, 0.77778], - "8832": [0.20576, 0.70576, 0, 0, 0.77778], - "8833": [0.20576, 0.70576, 0, 0, 0.77778], - "8840": [0.30274, 0.79383, 0, 0, 0.77778], - "8841": [0.30274, 0.79383, 0, 0, 0.77778], - "8842": [0.13597, 0.63597, 0, 0, 0.77778], - "8843": [0.13597, 0.63597, 0, 0, 0.77778], - "8847": [0.03517, 0.54986, 0, 0, 0.77778], - "8848": [0.03517, 0.54986, 0, 0, 0.77778], - "8858": [0.08198, 0.58198, 0, 0, 0.77778], - "8859": [0.08198, 0.58198, 0, 0, 0.77778], - "8861": [0.08198, 0.58198, 0, 0, 0.77778], - "8862": [0, 0.675, 0, 0, 0.77778], - "8863": [0, 0.675, 0, 0, 0.77778], - "8864": [0, 0.675, 0, 0, 0.77778], - "8865": [0, 0.675, 0, 0, 0.77778], - "8872": [0, 0.69224, 0, 0, 0.61111], - "8873": [0, 0.69224, 0, 0, 0.72222], - "8874": [0, 0.69224, 0, 0, 0.88889], - "8876": [0, 0.68889, 0, 0, 0.61111], - "8877": [0, 0.68889, 0, 0, 0.61111], - "8878": [0, 0.68889, 0, 0, 0.72222], - "8879": [0, 0.68889, 0, 0, 0.72222], - "8882": [0.03517, 0.54986, 0, 0, 0.77778], - "8883": [0.03517, 0.54986, 0, 0, 0.77778], - "8884": [0.13667, 0.63667, 0, 0, 0.77778], - "8885": [0.13667, 0.63667, 0, 0, 0.77778], - "8888": [0, 0.54986, 0, 0, 1.11111], - "8890": [0.19444, 0.43056, 0, 0, 0.55556], - "8891": [0.19444, 0.69224, 0, 0, 0.61111], - "8892": [0.19444, 0.69224, 0, 0, 0.61111], - "8901": [0, 0.54986, 0, 0, 0.27778], - "8903": [0.08167, 0.58167, 0, 0, 0.77778], - "8905": [0.08167, 0.58167, 0, 0, 0.77778], - "8906": [0.08167, 0.58167, 0, 0, 0.77778], - "8907": [0, 0.69224, 0, 0, 0.77778], - "8908": [0, 0.69224, 0, 0, 0.77778], - "8909": [-0.03598, 0.46402, 0, 0, 0.77778], - "8910": [0, 0.54986, 0, 0, 0.76042], - "8911": [0, 0.54986, 0, 0, 0.76042], - "8912": [0.03517, 0.54986, 0, 0, 0.77778], - "8913": [0.03517, 0.54986, 0, 0, 0.77778], - "8914": [0, 0.54986, 0, 0, 0.66667], - "8915": [0, 0.54986, 0, 0, 0.66667], - "8916": [0, 0.69224, 0, 0, 0.66667], - "8918": [0.0391, 0.5391, 0, 0, 0.77778], - "8919": [0.0391, 0.5391, 0, 0, 0.77778], - "8920": [0.03517, 0.54986, 0, 0, 1.33334], - "8921": [0.03517, 0.54986, 0, 0, 1.33334], - "8922": [0.38569, 0.88569, 0, 0, 0.77778], - "8923": [0.38569, 0.88569, 0, 0, 0.77778], - "8926": [0.13667, 0.63667, 0, 0, 0.77778], - "8927": [0.13667, 0.63667, 0, 0, 0.77778], - "8928": [0.30274, 0.79383, 0, 0, 0.77778], - "8929": [0.30274, 0.79383, 0, 0, 0.77778], - "8934": [0.23222, 0.74111, 0, 0, 0.77778], - "8935": [0.23222, 0.74111, 0, 0, 0.77778], - "8936": [0.23222, 0.74111, 0, 0, 0.77778], - "8937": [0.23222, 0.74111, 0, 0, 0.77778], - "8938": [0.20576, 0.70576, 0, 0, 0.77778], - "8939": [0.20576, 0.70576, 0, 0, 0.77778], - "8940": [0.30274, 0.79383, 0, 0, 0.77778], - "8941": [0.30274, 0.79383, 0, 0, 0.77778], - "8994": [0.19444, 0.69224, 0, 0, 0.77778], - "8995": [0.19444, 0.69224, 0, 0, 0.77778], - "9416": [0.15559, 0.69224, 0, 0, 0.90222], - "9484": [0, 0.69224, 0, 0, 0.5], - "9488": [0, 0.69224, 0, 0, 0.5], - "9492": [0, 0.37788, 0, 0, 0.5], - "9496": [0, 0.37788, 0, 0, 0.5], - "9585": [0.19444, 0.68889, 0, 0, 0.88889], - "9586": [0.19444, 0.74111, 0, 0, 0.88889], - "9632": [0, 0.675, 0, 0, 0.77778], - "9633": [0, 0.675, 0, 0, 0.77778], - "9650": [0, 0.54986, 0, 0, 0.72222], - "9651": [0, 0.54986, 0, 0, 0.72222], - "9654": [0.03517, 0.54986, 0, 0, 0.77778], - "9660": [0, 0.54986, 0, 0, 0.72222], - "9661": [0, 0.54986, 0, 0, 0.72222], - "9664": [0.03517, 0.54986, 0, 0, 0.77778], - "9674": [0.11111, 0.69224, 0, 0, 0.66667], - "9733": [0.19444, 0.69224, 0, 0, 0.94445], - "10003": [0, 0.69224, 0, 0, 0.83334], - "10016": [0, 0.69224, 0, 0, 0.83334], - "10731": [0.11111, 0.69224, 0, 0, 0.66667], - "10846": [0.19444, 0.75583, 0, 0, 0.61111], - "10877": [0.13667, 0.63667, 0, 0, 0.77778], - "10878": [0.13667, 0.63667, 0, 0, 0.77778], - "10885": [0.25583, 0.75583, 0, 0, 0.77778], - "10886": [0.25583, 0.75583, 0, 0, 0.77778], - "10887": [0.13597, 0.63597, 0, 0, 0.77778], - "10888": [0.13597, 0.63597, 0, 0, 0.77778], - "10889": [0.26167, 0.75726, 0, 0, 0.77778], - "10890": [0.26167, 0.75726, 0, 0, 0.77778], - "10891": [0.48256, 0.98256, 0, 0, 0.77778], - "10892": [0.48256, 0.98256, 0, 0, 0.77778], - "10901": [0.13667, 0.63667, 0, 0, 0.77778], - "10902": [0.13667, 0.63667, 0, 0, 0.77778], - "10933": [0.25142, 0.75726, 0, 0, 0.77778], - "10934": [0.25142, 0.75726, 0, 0, 0.77778], - "10935": [0.26167, 0.75726, 0, 0, 0.77778], - "10936": [0.26167, 0.75726, 0, 0, 0.77778], - "10937": [0.26167, 0.75726, 0, 0, 0.77778], - "10938": [0.26167, 0.75726, 0, 0, 0.77778], - "10949": [0.25583, 0.75583, 0, 0, 0.77778], - "10950": [0.25583, 0.75583, 0, 0, 0.77778], - "10955": [0.28481, 0.79383, 0, 0, 0.77778], - "10956": [0.28481, 0.79383, 0, 0, 0.77778], - "57350": [0.08167, 0.58167, 0, 0, 0.22222], - "57351": [0.08167, 0.58167, 0, 0, 0.38889], - "57352": [0.08167, 0.58167, 0, 0, 0.77778], - "57353": [0, 0.43056, 0.04028, 0, 0.66667], - "57356": [0.25142, 0.75726, 0, 0, 0.77778], - "57357": [0.25142, 0.75726, 0, 0, 0.77778], - "57358": [0.41951, 0.91951, 0, 0, 0.77778], - "57359": [0.30274, 0.79383, 0, 0, 0.77778], - "57360": [0.30274, 0.79383, 0, 0, 0.77778], - "57361": [0.41951, 0.91951, 0, 0, 0.77778], - "57366": [0.25142, 0.75726, 0, 0, 0.77778], - "57367": [0.25142, 0.75726, 0, 0, 0.77778], - "57368": [0.25142, 0.75726, 0, 0, 0.77778], - "57369": [0.25142, 0.75726, 0, 0, 0.77778], - "57370": [0.13597, 0.63597, 0, 0, 0.77778], - "57371": [0.13597, 0.63597, 0, 0, 0.77778] - }, - "Caligraphic-Regular": { - "32": [0, 0, 0, 0, 0.25], - "65": [0, 0.68333, 0, 0.19445, 0.79847], - "66": [0, 0.68333, 0.03041, 0.13889, 0.65681], - "67": [0, 0.68333, 0.05834, 0.13889, 0.52653], - "68": [0, 0.68333, 0.02778, 0.08334, 0.77139], - "69": [0, 0.68333, 0.08944, 0.11111, 0.52778], - "70": [0, 0.68333, 0.09931, 0.11111, 0.71875], - "71": [0.09722, 0.68333, 0.0593, 0.11111, 0.59487], - "72": [0, 0.68333, 0.00965, 0.11111, 0.84452], - "73": [0, 0.68333, 0.07382, 0, 0.54452], - "74": [0.09722, 0.68333, 0.18472, 0.16667, 0.67778], - "75": [0, 0.68333, 0.01445, 0.05556, 0.76195], - "76": [0, 0.68333, 0, 0.13889, 0.68972], - "77": [0, 0.68333, 0, 0.13889, 1.2009], - "78": [0, 0.68333, 0.14736, 0.08334, 0.82049], - "79": [0, 0.68333, 0.02778, 0.11111, 0.79611], - "80": [0, 0.68333, 0.08222, 0.08334, 0.69556], - "81": [0.09722, 0.68333, 0, 0.11111, 0.81667], - "82": [0, 0.68333, 0, 0.08334, 0.8475], - "83": [0, 0.68333, 0.075, 0.13889, 0.60556], - "84": [0, 0.68333, 0.25417, 0, 0.54464], - "85": [0, 0.68333, 0.09931, 0.08334, 0.62583], - "86": [0, 0.68333, 0.08222, 0, 0.61278], - "87": [0, 0.68333, 0.08222, 0.08334, 0.98778], - "88": [0, 0.68333, 0.14643, 0.13889, 0.7133], - "89": [0.09722, 0.68333, 0.08222, 0.08334, 0.66834], - "90": [0, 0.68333, 0.07944, 0.13889, 0.72473], - "160": [0, 0, 0, 0, 0.25] - }, - "Fraktur-Regular": { - "32": [0, 0, 0, 0, 0.25], - "33": [0, 0.69141, 0, 0, 0.29574], - "34": [0, 0.69141, 0, 0, 0.21471], - "38": [0, 0.69141, 0, 0, 0.73786], - "39": [0, 0.69141, 0, 0, 0.21201], - "40": [0.24982, 0.74947, 0, 0, 0.38865], - "41": [0.24982, 0.74947, 0, 0, 0.38865], - "42": [0, 0.62119, 0, 0, 0.27764], - "43": [0.08319, 0.58283, 0, 0, 0.75623], - "44": [0, 0.10803, 0, 0, 0.27764], - "45": [0.08319, 0.58283, 0, 0, 0.75623], - "46": [0, 0.10803, 0, 0, 0.27764], - "47": [0.24982, 0.74947, 0, 0, 0.50181], - "48": [0, 0.47534, 0, 0, 0.50181], - "49": [0, 0.47534, 0, 0, 0.50181], - "50": [0, 0.47534, 0, 0, 0.50181], - "51": [0.18906, 0.47534, 0, 0, 0.50181], - "52": [0.18906, 0.47534, 0, 0, 0.50181], - "53": [0.18906, 0.47534, 0, 0, 0.50181], - "54": [0, 0.69141, 0, 0, 0.50181], - "55": [0.18906, 0.47534, 0, 0, 0.50181], - "56": [0, 0.69141, 0, 0, 0.50181], - "57": [0.18906, 0.47534, 0, 0, 0.50181], - "58": [0, 0.47534, 0, 0, 0.21606], - "59": [0.12604, 0.47534, 0, 0, 0.21606], - "61": [-0.13099, 0.36866, 0, 0, 0.75623], - "63": [0, 0.69141, 0, 0, 0.36245], - "65": [0, 0.69141, 0, 0, 0.7176], - "66": [0, 0.69141, 0, 0, 0.88397], - "67": [0, 0.69141, 0, 0, 0.61254], - "68": [0, 0.69141, 0, 0, 0.83158], - "69": [0, 0.69141, 0, 0, 0.66278], - "70": [0.12604, 0.69141, 0, 0, 0.61119], - "71": [0, 0.69141, 0, 0, 0.78539], - "72": [0.06302, 0.69141, 0, 0, 0.7203], - "73": [0, 0.69141, 0, 0, 0.55448], - "74": [0.12604, 0.69141, 0, 0, 0.55231], - "75": [0, 0.69141, 0, 0, 0.66845], - "76": [0, 0.69141, 0, 0, 0.66602], - "77": [0, 0.69141, 0, 0, 1.04953], - "78": [0, 0.69141, 0, 0, 0.83212], - "79": [0, 0.69141, 0, 0, 0.82699], - "80": [0.18906, 0.69141, 0, 0, 0.82753], - "81": [0.03781, 0.69141, 0, 0, 0.82699], - "82": [0, 0.69141, 0, 0, 0.82807], - "83": [0, 0.69141, 0, 0, 0.82861], - "84": [0, 0.69141, 0, 0, 0.66899], - "85": [0, 0.69141, 0, 0, 0.64576], - "86": [0, 0.69141, 0, 0, 0.83131], - "87": [0, 0.69141, 0, 0, 1.04602], - "88": [0, 0.69141, 0, 0, 0.71922], - "89": [0.18906, 0.69141, 0, 0, 0.83293], - "90": [0.12604, 0.69141, 0, 0, 0.60201], - "91": [0.24982, 0.74947, 0, 0, 0.27764], - "93": [0.24982, 0.74947, 0, 0, 0.27764], - "94": [0, 0.69141, 0, 0, 0.49965], - "97": [0, 0.47534, 0, 0, 0.50046], - "98": [0, 0.69141, 0, 0, 0.51315], - "99": [0, 0.47534, 0, 0, 0.38946], - "100": [0, 0.62119, 0, 0, 0.49857], - "101": [0, 0.47534, 0, 0, 0.40053], - "102": [0.18906, 0.69141, 0, 0, 0.32626], - "103": [0.18906, 0.47534, 0, 0, 0.5037], - "104": [0.18906, 0.69141, 0, 0, 0.52126], - "105": [0, 0.69141, 0, 0, 0.27899], - "106": [0, 0.69141, 0, 0, 0.28088], - "107": [0, 0.69141, 0, 0, 0.38946], - "108": [0, 0.69141, 0, 0, 0.27953], - "109": [0, 0.47534, 0, 0, 0.76676], - "110": [0, 0.47534, 0, 0, 0.52666], - "111": [0, 0.47534, 0, 0, 0.48885], - "112": [0.18906, 0.52396, 0, 0, 0.50046], - "113": [0.18906, 0.47534, 0, 0, 0.48912], - "114": [0, 0.47534, 0, 0, 0.38919], - "115": [0, 0.47534, 0, 0, 0.44266], - "116": [0, 0.62119, 0, 0, 0.33301], - "117": [0, 0.47534, 0, 0, 0.5172], - "118": [0, 0.52396, 0, 0, 0.5118], - "119": [0, 0.52396, 0, 0, 0.77351], - "120": [0.18906, 0.47534, 0, 0, 0.38865], - "121": [0.18906, 0.47534, 0, 0, 0.49884], - "122": [0.18906, 0.47534, 0, 0, 0.39054], - "160": [0, 0, 0, 0, 0.25], - "8216": [0, 0.69141, 0, 0, 0.21471], - "8217": [0, 0.69141, 0, 0, 0.21471], - "58112": [0, 0.62119, 0, 0, 0.49749], - "58113": [0, 0.62119, 0, 0, 0.4983], - "58114": [0.18906, 0.69141, 0, 0, 0.33328], - "58115": [0.18906, 0.69141, 0, 0, 0.32923], - "58116": [0.18906, 0.47534, 0, 0, 0.50343], - "58117": [0, 0.69141, 0, 0, 0.33301], - "58118": [0, 0.62119, 0, 0, 0.33409], - "58119": [0, 0.47534, 0, 0, 0.50073] - }, - "Main-Bold": { - "32": [0, 0, 0, 0, 0.25], - "33": [0, 0.69444, 0, 0, 0.35], - "34": [0, 0.69444, 0, 0, 0.60278], - "35": [0.19444, 0.69444, 0, 0, 0.95833], - "36": [0.05556, 0.75, 0, 0, 0.575], - "37": [0.05556, 0.75, 0, 0, 0.95833], - "38": [0, 0.69444, 0, 0, 0.89444], - "39": [0, 0.69444, 0, 0, 0.31944], - "40": [0.25, 0.75, 0, 0, 0.44722], - "41": [0.25, 0.75, 0, 0, 0.44722], - "42": [0, 0.75, 0, 0, 0.575], - "43": [0.13333, 0.63333, 0, 0, 0.89444], - "44": [0.19444, 0.15556, 0, 0, 0.31944], - "45": [0, 0.44444, 0, 0, 0.38333], - "46": [0, 0.15556, 0, 0, 0.31944], - "47": [0.25, 0.75, 0, 0, 0.575], - "48": [0, 0.64444, 0, 0, 0.575], - "49": [0, 0.64444, 0, 0, 0.575], - "50": [0, 0.64444, 0, 0, 0.575], - "51": [0, 0.64444, 0, 0, 0.575], - "52": [0, 0.64444, 0, 0, 0.575], - "53": [0, 0.64444, 0, 0, 0.575], - "54": [0, 0.64444, 0, 0, 0.575], - "55": [0, 0.64444, 0, 0, 0.575], - "56": [0, 0.64444, 0, 0, 0.575], - "57": [0, 0.64444, 0, 0, 0.575], - "58": [0, 0.44444, 0, 0, 0.31944], - "59": [0.19444, 0.44444, 0, 0, 0.31944], - "60": [0.08556, 0.58556, 0, 0, 0.89444], - "61": [-0.10889, 0.39111, 0, 0, 0.89444], - "62": [0.08556, 0.58556, 0, 0, 0.89444], - "63": [0, 0.69444, 0, 0, 0.54305], - "64": [0, 0.69444, 0, 0, 0.89444], - "65": [0, 0.68611, 0, 0, 0.86944], - "66": [0, 0.68611, 0, 0, 0.81805], - "67": [0, 0.68611, 0, 0, 0.83055], - "68": [0, 0.68611, 0, 0, 0.88194], - "69": [0, 0.68611, 0, 0, 0.75555], - "70": [0, 0.68611, 0, 0, 0.72361], - "71": [0, 0.68611, 0, 0, 0.90416], - "72": [0, 0.68611, 0, 0, 0.9], - "73": [0, 0.68611, 0, 0, 0.43611], - "74": [0, 0.68611, 0, 0, 0.59444], - "75": [0, 0.68611, 0, 0, 0.90138], - "76": [0, 0.68611, 0, 0, 0.69166], - "77": [0, 0.68611, 0, 0, 1.09166], - "78": [0, 0.68611, 0, 0, 0.9], - "79": [0, 0.68611, 0, 0, 0.86388], - "80": [0, 0.68611, 0, 0, 0.78611], - "81": [0.19444, 0.68611, 0, 0, 0.86388], - "82": [0, 0.68611, 0, 0, 0.8625], - "83": [0, 0.68611, 0, 0, 0.63889], - "84": [0, 0.68611, 0, 0, 0.8], - "85": [0, 0.68611, 0, 0, 0.88472], - "86": [0, 0.68611, 0.01597, 0, 0.86944], - "87": [0, 0.68611, 0.01597, 0, 1.18888], - "88": [0, 0.68611, 0, 0, 0.86944], - "89": [0, 0.68611, 0.02875, 0, 0.86944], - "90": [0, 0.68611, 0, 0, 0.70277], - "91": [0.25, 0.75, 0, 0, 0.31944], - "92": [0.25, 0.75, 0, 0, 0.575], - "93": [0.25, 0.75, 0, 0, 0.31944], - "94": [0, 0.69444, 0, 0, 0.575], - "95": [0.31, 0.13444, 0.03194, 0, 0.575], - "97": [0, 0.44444, 0, 0, 0.55902], - "98": [0, 0.69444, 0, 0, 0.63889], - "99": [0, 0.44444, 0, 0, 0.51111], - "100": [0, 0.69444, 0, 0, 0.63889], - "101": [0, 0.44444, 0, 0, 0.52708], - "102": [0, 0.69444, 0.10903, 0, 0.35139], - "103": [0.19444, 0.44444, 0.01597, 0, 0.575], - "104": [0, 0.69444, 0, 0, 0.63889], - "105": [0, 0.69444, 0, 0, 0.31944], - "106": [0.19444, 0.69444, 0, 0, 0.35139], - "107": [0, 0.69444, 0, 0, 0.60694], - "108": [0, 0.69444, 0, 0, 0.31944], - "109": [0, 0.44444, 0, 0, 0.95833], - "110": [0, 0.44444, 0, 0, 0.63889], - "111": [0, 0.44444, 0, 0, 0.575], - "112": [0.19444, 0.44444, 0, 0, 0.63889], - "113": [0.19444, 0.44444, 0, 0, 0.60694], - "114": [0, 0.44444, 0, 0, 0.47361], - "115": [0, 0.44444, 0, 0, 0.45361], - "116": [0, 0.63492, 0, 0, 0.44722], - "117": [0, 0.44444, 0, 0, 0.63889], - "118": [0, 0.44444, 0.01597, 0, 0.60694], - "119": [0, 0.44444, 0.01597, 0, 0.83055], - "120": [0, 0.44444, 0, 0, 0.60694], - "121": [0.19444, 0.44444, 0.01597, 0, 0.60694], - "122": [0, 0.44444, 0, 0, 0.51111], - "123": [0.25, 0.75, 0, 0, 0.575], - "124": [0.25, 0.75, 0, 0, 0.31944], - "125": [0.25, 0.75, 0, 0, 0.575], - "126": [0.35, 0.34444, 0, 0, 0.575], - "160": [0, 0, 0, 0, 0.25], - "163": [0, 0.69444, 0, 0, 0.86853], - "168": [0, 0.69444, 0, 0, 0.575], - "172": [0, 0.44444, 0, 0, 0.76666], - "176": [0, 0.69444, 0, 0, 0.86944], - "177": [0.13333, 0.63333, 0, 0, 0.89444], - "184": [0.17014, 0, 0, 0, 0.51111], - "198": [0, 0.68611, 0, 0, 1.04166], - "215": [0.13333, 0.63333, 0, 0, 0.89444], - "216": [0.04861, 0.73472, 0, 0, 0.89444], - "223": [0, 0.69444, 0, 0, 0.59722], - "230": [0, 0.44444, 0, 0, 0.83055], - "247": [0.13333, 0.63333, 0, 0, 0.89444], - "248": [0.09722, 0.54167, 0, 0, 0.575], - "305": [0, 0.44444, 0, 0, 0.31944], - "338": [0, 0.68611, 0, 0, 1.16944], - "339": [0, 0.44444, 0, 0, 0.89444], - "567": [0.19444, 0.44444, 0, 0, 0.35139], - "710": [0, 0.69444, 0, 0, 0.575], - "711": [0, 0.63194, 0, 0, 0.575], - "713": [0, 0.59611, 0, 0, 0.575], - "714": [0, 0.69444, 0, 0, 0.575], - "715": [0, 0.69444, 0, 0, 0.575], - "728": [0, 0.69444, 0, 0, 0.575], - "729": [0, 0.69444, 0, 0, 0.31944], - "730": [0, 0.69444, 0, 0, 0.86944], - "732": [0, 0.69444, 0, 0, 0.575], - "733": [0, 0.69444, 0, 0, 0.575], - "915": [0, 0.68611, 0, 0, 0.69166], - "916": [0, 0.68611, 0, 0, 0.95833], - "920": [0, 0.68611, 0, 0, 0.89444], - "923": [0, 0.68611, 0, 0, 0.80555], - "926": [0, 0.68611, 0, 0, 0.76666], - "928": [0, 0.68611, 0, 0, 0.9], - "931": [0, 0.68611, 0, 0, 0.83055], - "933": [0, 0.68611, 0, 0, 0.89444], - "934": [0, 0.68611, 0, 0, 0.83055], - "936": [0, 0.68611, 0, 0, 0.89444], - "937": [0, 0.68611, 0, 0, 0.83055], - "8211": [0, 0.44444, 0.03194, 0, 0.575], - "8212": [0, 0.44444, 0.03194, 0, 1.14999], - "8216": [0, 0.69444, 0, 0, 0.31944], - "8217": [0, 0.69444, 0, 0, 0.31944], - "8220": [0, 0.69444, 0, 0, 0.60278], - "8221": [0, 0.69444, 0, 0, 0.60278], - "8224": [0.19444, 0.69444, 0, 0, 0.51111], - "8225": [0.19444, 0.69444, 0, 0, 0.51111], - "8242": [0, 0.55556, 0, 0, 0.34444], - "8407": [0, 0.72444, 0.15486, 0, 0.575], - "8463": [0, 0.69444, 0, 0, 0.66759], - "8465": [0, 0.69444, 0, 0, 0.83055], - "8467": [0, 0.69444, 0, 0, 0.47361], - "8472": [0.19444, 0.44444, 0, 0, 0.74027], - "8476": [0, 0.69444, 0, 0, 0.83055], - "8501": [0, 0.69444, 0, 0, 0.70277], - "8592": [-0.10889, 0.39111, 0, 0, 1.14999], - "8593": [0.19444, 0.69444, 0, 0, 0.575], - "8594": [-0.10889, 0.39111, 0, 0, 1.14999], - "8595": [0.19444, 0.69444, 0, 0, 0.575], - "8596": [-0.10889, 0.39111, 0, 0, 1.14999], - "8597": [0.25, 0.75, 0, 0, 0.575], - "8598": [0.19444, 0.69444, 0, 0, 1.14999], - "8599": [0.19444, 0.69444, 0, 0, 1.14999], - "8600": [0.19444, 0.69444, 0, 0, 1.14999], - "8601": [0.19444, 0.69444, 0, 0, 1.14999], - "8636": [-0.10889, 0.39111, 0, 0, 1.14999], - "8637": [-0.10889, 0.39111, 0, 0, 1.14999], - "8640": [-0.10889, 0.39111, 0, 0, 1.14999], - "8641": [-0.10889, 0.39111, 0, 0, 1.14999], - "8656": [-0.10889, 0.39111, 0, 0, 1.14999], - "8657": [0.19444, 0.69444, 0, 0, 0.70277], - "8658": [-0.10889, 0.39111, 0, 0, 1.14999], - "8659": [0.19444, 0.69444, 0, 0, 0.70277], - "8660": [-0.10889, 0.39111, 0, 0, 1.14999], - "8661": [0.25, 0.75, 0, 0, 0.70277], - "8704": [0, 0.69444, 0, 0, 0.63889], - "8706": [0, 0.69444, 0.06389, 0, 0.62847], - "8707": [0, 0.69444, 0, 0, 0.63889], - "8709": [0.05556, 0.75, 0, 0, 0.575], - "8711": [0, 0.68611, 0, 0, 0.95833], - "8712": [0.08556, 0.58556, 0, 0, 0.76666], - "8715": [0.08556, 0.58556, 0, 0, 0.76666], - "8722": [0.13333, 0.63333, 0, 0, 0.89444], - "8723": [0.13333, 0.63333, 0, 0, 0.89444], - "8725": [0.25, 0.75, 0, 0, 0.575], - "8726": [0.25, 0.75, 0, 0, 0.575], - "8727": [-0.02778, 0.47222, 0, 0, 0.575], - "8728": [-0.02639, 0.47361, 0, 0, 0.575], - "8729": [-0.02639, 0.47361, 0, 0, 0.575], - "8730": [0.18, 0.82, 0, 0, 0.95833], - "8733": [0, 0.44444, 0, 0, 0.89444], - "8734": [0, 0.44444, 0, 0, 1.14999], - "8736": [0, 0.69224, 0, 0, 0.72222], - "8739": [0.25, 0.75, 0, 0, 0.31944], - "8741": [0.25, 0.75, 0, 0, 0.575], - "8743": [0, 0.55556, 0, 0, 0.76666], - "8744": [0, 0.55556, 0, 0, 0.76666], - "8745": [0, 0.55556, 0, 0, 0.76666], - "8746": [0, 0.55556, 0, 0, 0.76666], - "8747": [0.19444, 0.69444, 0.12778, 0, 0.56875], - "8764": [-0.10889, 0.39111, 0, 0, 0.89444], - "8768": [0.19444, 0.69444, 0, 0, 0.31944], - "8771": [0.00222, 0.50222, 0, 0, 0.89444], - "8776": [0.02444, 0.52444, 0, 0, 0.89444], - "8781": [0.00222, 0.50222, 0, 0, 0.89444], - "8801": [0.00222, 0.50222, 0, 0, 0.89444], - "8804": [0.19667, 0.69667, 0, 0, 0.89444], - "8805": [0.19667, 0.69667, 0, 0, 0.89444], - "8810": [0.08556, 0.58556, 0, 0, 1.14999], - "8811": [0.08556, 0.58556, 0, 0, 1.14999], - "8826": [0.08556, 0.58556, 0, 0, 0.89444], - "8827": [0.08556, 0.58556, 0, 0, 0.89444], - "8834": [0.08556, 0.58556, 0, 0, 0.89444], - "8835": [0.08556, 0.58556, 0, 0, 0.89444], - "8838": [0.19667, 0.69667, 0, 0, 0.89444], - "8839": [0.19667, 0.69667, 0, 0, 0.89444], - "8846": [0, 0.55556, 0, 0, 0.76666], - "8849": [0.19667, 0.69667, 0, 0, 0.89444], - "8850": [0.19667, 0.69667, 0, 0, 0.89444], - "8851": [0, 0.55556, 0, 0, 0.76666], - "8852": [0, 0.55556, 0, 0, 0.76666], - "8853": [0.13333, 0.63333, 0, 0, 0.89444], - "8854": [0.13333, 0.63333, 0, 0, 0.89444], - "8855": [0.13333, 0.63333, 0, 0, 0.89444], - "8856": [0.13333, 0.63333, 0, 0, 0.89444], - "8857": [0.13333, 0.63333, 0, 0, 0.89444], - "8866": [0, 0.69444, 0, 0, 0.70277], - "8867": [0, 0.69444, 0, 0, 0.70277], - "8868": [0, 0.69444, 0, 0, 0.89444], - "8869": [0, 0.69444, 0, 0, 0.89444], - "8900": [-0.02639, 0.47361, 0, 0, 0.575], - "8901": [-0.02639, 0.47361, 0, 0, 0.31944], - "8902": [-0.02778, 0.47222, 0, 0, 0.575], - "8968": [0.25, 0.75, 0, 0, 0.51111], - "8969": [0.25, 0.75, 0, 0, 0.51111], - "8970": [0.25, 0.75, 0, 0, 0.51111], - "8971": [0.25, 0.75, 0, 0, 0.51111], - "8994": [-0.13889, 0.36111, 0, 0, 1.14999], - "8995": [-0.13889, 0.36111, 0, 0, 1.14999], - "9651": [0.19444, 0.69444, 0, 0, 1.02222], - "9657": [-0.02778, 0.47222, 0, 0, 0.575], - "9661": [0.19444, 0.69444, 0, 0, 1.02222], - "9667": [-0.02778, 0.47222, 0, 0, 0.575], - "9711": [0.19444, 0.69444, 0, 0, 1.14999], - "9824": [0.12963, 0.69444, 0, 0, 0.89444], - "9825": [0.12963, 0.69444, 0, 0, 0.89444], - "9826": [0.12963, 0.69444, 0, 0, 0.89444], - "9827": [0.12963, 0.69444, 0, 0, 0.89444], - "9837": [0, 0.75, 0, 0, 0.44722], - "9838": [0.19444, 0.69444, 0, 0, 0.44722], - "9839": [0.19444, 0.69444, 0, 0, 0.44722], - "10216": [0.25, 0.75, 0, 0, 0.44722], - "10217": [0.25, 0.75, 0, 0, 0.44722], - "10815": [0, 0.68611, 0, 0, 0.9], - "10927": [0.19667, 0.69667, 0, 0, 0.89444], - "10928": [0.19667, 0.69667, 0, 0, 0.89444], - "57376": [0.19444, 0.69444, 0, 0, 0] - }, - "Main-BoldItalic": { - "32": [0, 0, 0, 0, 0.25], - "33": [0, 0.69444, 0.11417, 0, 0.38611], - "34": [0, 0.69444, 0.07939, 0, 0.62055], - "35": [0.19444, 0.69444, 0.06833, 0, 0.94444], - "37": [0.05556, 0.75, 0.12861, 0, 0.94444], - "38": [0, 0.69444, 0.08528, 0, 0.88555], - "39": [0, 0.69444, 0.12945, 0, 0.35555], - "40": [0.25, 0.75, 0.15806, 0, 0.47333], - "41": [0.25, 0.75, 0.03306, 0, 0.47333], - "42": [0, 0.75, 0.14333, 0, 0.59111], - "43": [0.10333, 0.60333, 0.03306, 0, 0.88555], - "44": [0.19444, 0.14722, 0, 0, 0.35555], - "45": [0, 0.44444, 0.02611, 0, 0.41444], - "46": [0, 0.14722, 0, 0, 0.35555], - "47": [0.25, 0.75, 0.15806, 0, 0.59111], - "48": [0, 0.64444, 0.13167, 0, 0.59111], - "49": [0, 0.64444, 0.13167, 0, 0.59111], - "50": [0, 0.64444, 0.13167, 0, 0.59111], - "51": [0, 0.64444, 0.13167, 0, 0.59111], - "52": [0.19444, 0.64444, 0.13167, 0, 0.59111], - "53": [0, 0.64444, 0.13167, 0, 0.59111], - "54": [0, 0.64444, 0.13167, 0, 0.59111], - "55": [0.19444, 0.64444, 0.13167, 0, 0.59111], - "56": [0, 0.64444, 0.13167, 0, 0.59111], - "57": [0, 0.64444, 0.13167, 0, 0.59111], - "58": [0, 0.44444, 0.06695, 0, 0.35555], - "59": [0.19444, 0.44444, 0.06695, 0, 0.35555], - "61": [-0.10889, 0.39111, 0.06833, 0, 0.88555], - "63": [0, 0.69444, 0.11472, 0, 0.59111], - "64": [0, 0.69444, 0.09208, 0, 0.88555], - "65": [0, 0.68611, 0, 0, 0.86555], - "66": [0, 0.68611, 0.0992, 0, 0.81666], - "67": [0, 0.68611, 0.14208, 0, 0.82666], - "68": [0, 0.68611, 0.09062, 0, 0.87555], - "69": [0, 0.68611, 0.11431, 0, 0.75666], - "70": [0, 0.68611, 0.12903, 0, 0.72722], - "71": [0, 0.68611, 0.07347, 0, 0.89527], - "72": [0, 0.68611, 0.17208, 0, 0.8961], - "73": [0, 0.68611, 0.15681, 0, 0.47166], - "74": [0, 0.68611, 0.145, 0, 0.61055], - "75": [0, 0.68611, 0.14208, 0, 0.89499], - "76": [0, 0.68611, 0, 0, 0.69777], - "77": [0, 0.68611, 0.17208, 0, 1.07277], - "78": [0, 0.68611, 0.17208, 0, 0.8961], - "79": [0, 0.68611, 0.09062, 0, 0.85499], - "80": [0, 0.68611, 0.0992, 0, 0.78721], - "81": [0.19444, 0.68611, 0.09062, 0, 0.85499], - "82": [0, 0.68611, 0.02559, 0, 0.85944], - "83": [0, 0.68611, 0.11264, 0, 0.64999], - "84": [0, 0.68611, 0.12903, 0, 0.7961], - "85": [0, 0.68611, 0.17208, 0, 0.88083], - "86": [0, 0.68611, 0.18625, 0, 0.86555], - "87": [0, 0.68611, 0.18625, 0, 1.15999], - "88": [0, 0.68611, 0.15681, 0, 0.86555], - "89": [0, 0.68611, 0.19803, 0, 0.86555], - "90": [0, 0.68611, 0.14208, 0, 0.70888], - "91": [0.25, 0.75, 0.1875, 0, 0.35611], - "93": [0.25, 0.75, 0.09972, 0, 0.35611], - "94": [0, 0.69444, 0.06709, 0, 0.59111], - "95": [0.31, 0.13444, 0.09811, 0, 0.59111], - "97": [0, 0.44444, 0.09426, 0, 0.59111], - "98": [0, 0.69444, 0.07861, 0, 0.53222], - "99": [0, 0.44444, 0.05222, 0, 0.53222], - "100": [0, 0.69444, 0.10861, 0, 0.59111], - "101": [0, 0.44444, 0.085, 0, 0.53222], - "102": [0.19444, 0.69444, 0.21778, 0, 0.4], - "103": [0.19444, 0.44444, 0.105, 0, 0.53222], - "104": [0, 0.69444, 0.09426, 0, 0.59111], - "105": [0, 0.69326, 0.11387, 0, 0.35555], - "106": [0.19444, 0.69326, 0.1672, 0, 0.35555], - "107": [0, 0.69444, 0.11111, 0, 0.53222], - "108": [0, 0.69444, 0.10861, 0, 0.29666], - "109": [0, 0.44444, 0.09426, 0, 0.94444], - "110": [0, 0.44444, 0.09426, 0, 0.64999], - "111": [0, 0.44444, 0.07861, 0, 0.59111], - "112": [0.19444, 0.44444, 0.07861, 0, 0.59111], - "113": [0.19444, 0.44444, 0.105, 0, 0.53222], - "114": [0, 0.44444, 0.11111, 0, 0.50167], - "115": [0, 0.44444, 0.08167, 0, 0.48694], - "116": [0, 0.63492, 0.09639, 0, 0.385], - "117": [0, 0.44444, 0.09426, 0, 0.62055], - "118": [0, 0.44444, 0.11111, 0, 0.53222], - "119": [0, 0.44444, 0.11111, 0, 0.76777], - "120": [0, 0.44444, 0.12583, 0, 0.56055], - "121": [0.19444, 0.44444, 0.105, 0, 0.56166], - "122": [0, 0.44444, 0.13889, 0, 0.49055], - "126": [0.35, 0.34444, 0.11472, 0, 0.59111], - "160": [0, 0, 0, 0, 0.25], - "168": [0, 0.69444, 0.11473, 0, 0.59111], - "176": [0, 0.69444, 0, 0, 0.94888], - "184": [0.17014, 0, 0, 0, 0.53222], - "198": [0, 0.68611, 0.11431, 0, 1.02277], - "216": [0.04861, 0.73472, 0.09062, 0, 0.88555], - "223": [0.19444, 0.69444, 0.09736, 0, 0.665], - "230": [0, 0.44444, 0.085, 0, 0.82666], - "248": [0.09722, 0.54167, 0.09458, 0, 0.59111], - "305": [0, 0.44444, 0.09426, 0, 0.35555], - "338": [0, 0.68611, 0.11431, 0, 1.14054], - "339": [0, 0.44444, 0.085, 0, 0.82666], - "567": [0.19444, 0.44444, 0.04611, 0, 0.385], - "710": [0, 0.69444, 0.06709, 0, 0.59111], - "711": [0, 0.63194, 0.08271, 0, 0.59111], - "713": [0, 0.59444, 0.10444, 0, 0.59111], - "714": [0, 0.69444, 0.08528, 0, 0.59111], - "715": [0, 0.69444, 0, 0, 0.59111], - "728": [0, 0.69444, 0.10333, 0, 0.59111], - "729": [0, 0.69444, 0.12945, 0, 0.35555], - "730": [0, 0.69444, 0, 0, 0.94888], - "732": [0, 0.69444, 0.11472, 0, 0.59111], - "733": [0, 0.69444, 0.11472, 0, 0.59111], - "915": [0, 0.68611, 0.12903, 0, 0.69777], - "916": [0, 0.68611, 0, 0, 0.94444], - "920": [0, 0.68611, 0.09062, 0, 0.88555], - "923": [0, 0.68611, 0, 0, 0.80666], - "926": [0, 0.68611, 0.15092, 0, 0.76777], - "928": [0, 0.68611, 0.17208, 0, 0.8961], - "931": [0, 0.68611, 0.11431, 0, 0.82666], - "933": [0, 0.68611, 0.10778, 0, 0.88555], - "934": [0, 0.68611, 0.05632, 0, 0.82666], - "936": [0, 0.68611, 0.10778, 0, 0.88555], - "937": [0, 0.68611, 0.0992, 0, 0.82666], - "8211": [0, 0.44444, 0.09811, 0, 0.59111], - "8212": [0, 0.44444, 0.09811, 0, 1.18221], - "8216": [0, 0.69444, 0.12945, 0, 0.35555], - "8217": [0, 0.69444, 0.12945, 0, 0.35555], - "8220": [0, 0.69444, 0.16772, 0, 0.62055], - "8221": [0, 0.69444, 0.07939, 0, 0.62055] - }, - "Main-Italic": { - "32": [0, 0, 0, 0, 0.25], - "33": [0, 0.69444, 0.12417, 0, 0.30667], - "34": [0, 0.69444, 0.06961, 0, 0.51444], - "35": [0.19444, 0.69444, 0.06616, 0, 0.81777], - "37": [0.05556, 0.75, 0.13639, 0, 0.81777], - "38": [0, 0.69444, 0.09694, 0, 0.76666], - "39": [0, 0.69444, 0.12417, 0, 0.30667], - "40": [0.25, 0.75, 0.16194, 0, 0.40889], - "41": [0.25, 0.75, 0.03694, 0, 0.40889], - "42": [0, 0.75, 0.14917, 0, 0.51111], - "43": [0.05667, 0.56167, 0.03694, 0, 0.76666], - "44": [0.19444, 0.10556, 0, 0, 0.30667], - "45": [0, 0.43056, 0.02826, 0, 0.35778], - "46": [0, 0.10556, 0, 0, 0.30667], - "47": [0.25, 0.75, 0.16194, 0, 0.51111], - "48": [0, 0.64444, 0.13556, 0, 0.51111], - "49": [0, 0.64444, 0.13556, 0, 0.51111], - "50": [0, 0.64444, 0.13556, 0, 0.51111], - "51": [0, 0.64444, 0.13556, 0, 0.51111], - "52": [0.19444, 0.64444, 0.13556, 0, 0.51111], - "53": [0, 0.64444, 0.13556, 0, 0.51111], - "54": [0, 0.64444, 0.13556, 0, 0.51111], - "55": [0.19444, 0.64444, 0.13556, 0, 0.51111], - "56": [0, 0.64444, 0.13556, 0, 0.51111], - "57": [0, 0.64444, 0.13556, 0, 0.51111], - "58": [0, 0.43056, 0.0582, 0, 0.30667], - "59": [0.19444, 0.43056, 0.0582, 0, 0.30667], - "61": [-0.13313, 0.36687, 0.06616, 0, 0.76666], - "63": [0, 0.69444, 0.1225, 0, 0.51111], - "64": [0, 0.69444, 0.09597, 0, 0.76666], - "65": [0, 0.68333, 0, 0, 0.74333], - "66": [0, 0.68333, 0.10257, 0, 0.70389], - "67": [0, 0.68333, 0.14528, 0, 0.71555], - "68": [0, 0.68333, 0.09403, 0, 0.755], - "69": [0, 0.68333, 0.12028, 0, 0.67833], - "70": [0, 0.68333, 0.13305, 0, 0.65277], - "71": [0, 0.68333, 0.08722, 0, 0.77361], - "72": [0, 0.68333, 0.16389, 0, 0.74333], - "73": [0, 0.68333, 0.15806, 0, 0.38555], - "74": [0, 0.68333, 0.14028, 0, 0.525], - "75": [0, 0.68333, 0.14528, 0, 0.76888], - "76": [0, 0.68333, 0, 0, 0.62722], - "77": [0, 0.68333, 0.16389, 0, 0.89666], - "78": [0, 0.68333, 0.16389, 0, 0.74333], - "79": [0, 0.68333, 0.09403, 0, 0.76666], - "80": [0, 0.68333, 0.10257, 0, 0.67833], - "81": [0.19444, 0.68333, 0.09403, 0, 0.76666], - "82": [0, 0.68333, 0.03868, 0, 0.72944], - "83": [0, 0.68333, 0.11972, 0, 0.56222], - "84": [0, 0.68333, 0.13305, 0, 0.71555], - "85": [0, 0.68333, 0.16389, 0, 0.74333], - "86": [0, 0.68333, 0.18361, 0, 0.74333], - "87": [0, 0.68333, 0.18361, 0, 0.99888], - "88": [0, 0.68333, 0.15806, 0, 0.74333], - "89": [0, 0.68333, 0.19383, 0, 0.74333], - "90": [0, 0.68333, 0.14528, 0, 0.61333], - "91": [0.25, 0.75, 0.1875, 0, 0.30667], - "93": [0.25, 0.75, 0.10528, 0, 0.30667], - "94": [0, 0.69444, 0.06646, 0, 0.51111], - "95": [0.31, 0.12056, 0.09208, 0, 0.51111], - "97": [0, 0.43056, 0.07671, 0, 0.51111], - "98": [0, 0.69444, 0.06312, 0, 0.46], - "99": [0, 0.43056, 0.05653, 0, 0.46], - "100": [0, 0.69444, 0.10333, 0, 0.51111], - "101": [0, 0.43056, 0.07514, 0, 0.46], - "102": [0.19444, 0.69444, 0.21194, 0, 0.30667], - "103": [0.19444, 0.43056, 0.08847, 0, 0.46], - "104": [0, 0.69444, 0.07671, 0, 0.51111], - "105": [0, 0.65536, 0.1019, 0, 0.30667], - "106": [0.19444, 0.65536, 0.14467, 0, 0.30667], - "107": [0, 0.69444, 0.10764, 0, 0.46], - "108": [0, 0.69444, 0.10333, 0, 0.25555], - "109": [0, 0.43056, 0.07671, 0, 0.81777], - "110": [0, 0.43056, 0.07671, 0, 0.56222], - "111": [0, 0.43056, 0.06312, 0, 0.51111], - "112": [0.19444, 0.43056, 0.06312, 0, 0.51111], - "113": [0.19444, 0.43056, 0.08847, 0, 0.46], - "114": [0, 0.43056, 0.10764, 0, 0.42166], - "115": [0, 0.43056, 0.08208, 0, 0.40889], - "116": [0, 0.61508, 0.09486, 0, 0.33222], - "117": [0, 0.43056, 0.07671, 0, 0.53666], - "118": [0, 0.43056, 0.10764, 0, 0.46], - "119": [0, 0.43056, 0.10764, 0, 0.66444], - "120": [0, 0.43056, 0.12042, 0, 0.46389], - "121": [0.19444, 0.43056, 0.08847, 0, 0.48555], - "122": [0, 0.43056, 0.12292, 0, 0.40889], - "126": [0.35, 0.31786, 0.11585, 0, 0.51111], - "160": [0, 0, 0, 0, 0.25], - "168": [0, 0.66786, 0.10474, 0, 0.51111], - "176": [0, 0.69444, 0, 0, 0.83129], - "184": [0.17014, 0, 0, 0, 0.46], - "198": [0, 0.68333, 0.12028, 0, 0.88277], - "216": [0.04861, 0.73194, 0.09403, 0, 0.76666], - "223": [0.19444, 0.69444, 0.10514, 0, 0.53666], - "230": [0, 0.43056, 0.07514, 0, 0.71555], - "248": [0.09722, 0.52778, 0.09194, 0, 0.51111], - "338": [0, 0.68333, 0.12028, 0, 0.98499], - "339": [0, 0.43056, 0.07514, 0, 0.71555], - "710": [0, 0.69444, 0.06646, 0, 0.51111], - "711": [0, 0.62847, 0.08295, 0, 0.51111], - "713": [0, 0.56167, 0.10333, 0, 0.51111], - "714": [0, 0.69444, 0.09694, 0, 0.51111], - "715": [0, 0.69444, 0, 0, 0.51111], - "728": [0, 0.69444, 0.10806, 0, 0.51111], - "729": [0, 0.66786, 0.11752, 0, 0.30667], - "730": [0, 0.69444, 0, 0, 0.83129], - "732": [0, 0.66786, 0.11585, 0, 0.51111], - "733": [0, 0.69444, 0.1225, 0, 0.51111], - "915": [0, 0.68333, 0.13305, 0, 0.62722], - "916": [0, 0.68333, 0, 0, 0.81777], - "920": [0, 0.68333, 0.09403, 0, 0.76666], - "923": [0, 0.68333, 0, 0, 0.69222], - "926": [0, 0.68333, 0.15294, 0, 0.66444], - "928": [0, 0.68333, 0.16389, 0, 0.74333], - "931": [0, 0.68333, 0.12028, 0, 0.71555], - "933": [0, 0.68333, 0.11111, 0, 0.76666], - "934": [0, 0.68333, 0.05986, 0, 0.71555], - "936": [0, 0.68333, 0.11111, 0, 0.76666], - "937": [0, 0.68333, 0.10257, 0, 0.71555], - "8211": [0, 0.43056, 0.09208, 0, 0.51111], - "8212": [0, 0.43056, 0.09208, 0, 1.02222], - "8216": [0, 0.69444, 0.12417, 0, 0.30667], - "8217": [0, 0.69444, 0.12417, 0, 0.30667], - "8220": [0, 0.69444, 0.1685, 0, 0.51444], - "8221": [0, 0.69444, 0.06961, 0, 0.51444], - "8463": [0, 0.68889, 0, 0, 0.54028] - }, - "Main-Regular": { - "32": [0, 0, 0, 0, 0.25], - "33": [0, 0.69444, 0, 0, 0.27778], - "34": [0, 0.69444, 0, 0, 0.5], - "35": [0.19444, 0.69444, 0, 0, 0.83334], - "36": [0.05556, 0.75, 0, 0, 0.5], - "37": [0.05556, 0.75, 0, 0, 0.83334], - "38": [0, 0.69444, 0, 0, 0.77778], - "39": [0, 0.69444, 0, 0, 0.27778], - "40": [0.25, 0.75, 0, 0, 0.38889], - "41": [0.25, 0.75, 0, 0, 0.38889], - "42": [0, 0.75, 0, 0, 0.5], - "43": [0.08333, 0.58333, 0, 0, 0.77778], - "44": [0.19444, 0.10556, 0, 0, 0.27778], - "45": [0, 0.43056, 0, 0, 0.33333], - "46": [0, 0.10556, 0, 0, 0.27778], - "47": [0.25, 0.75, 0, 0, 0.5], - "48": [0, 0.64444, 0, 0, 0.5], - "49": [0, 0.64444, 0, 0, 0.5], - "50": [0, 0.64444, 0, 0, 0.5], - "51": [0, 0.64444, 0, 0, 0.5], - "52": [0, 0.64444, 0, 0, 0.5], - "53": [0, 0.64444, 0, 0, 0.5], - "54": [0, 0.64444, 0, 0, 0.5], - "55": [0, 0.64444, 0, 0, 0.5], - "56": [0, 0.64444, 0, 0, 0.5], - "57": [0, 0.64444, 0, 0, 0.5], - "58": [0, 0.43056, 0, 0, 0.27778], - "59": [0.19444, 0.43056, 0, 0, 0.27778], - "60": [0.0391, 0.5391, 0, 0, 0.77778], - "61": [-0.13313, 0.36687, 0, 0, 0.77778], - "62": [0.0391, 0.5391, 0, 0, 0.77778], - "63": [0, 0.69444, 0, 0, 0.47222], - "64": [0, 0.69444, 0, 0, 0.77778], - "65": [0, 0.68333, 0, 0, 0.75], - "66": [0, 0.68333, 0, 0, 0.70834], - "67": [0, 0.68333, 0, 0, 0.72222], - "68": [0, 0.68333, 0, 0, 0.76389], - "69": [0, 0.68333, 0, 0, 0.68056], - "70": [0, 0.68333, 0, 0, 0.65278], - "71": [0, 0.68333, 0, 0, 0.78472], - "72": [0, 0.68333, 0, 0, 0.75], - "73": [0, 0.68333, 0, 0, 0.36111], - "74": [0, 0.68333, 0, 0, 0.51389], - "75": [0, 0.68333, 0, 0, 0.77778], - "76": [0, 0.68333, 0, 0, 0.625], - "77": [0, 0.68333, 0, 0, 0.91667], - "78": [0, 0.68333, 0, 0, 0.75], - "79": [0, 0.68333, 0, 0, 0.77778], - "80": [0, 0.68333, 0, 0, 0.68056], - "81": [0.19444, 0.68333, 0, 0, 0.77778], - "82": [0, 0.68333, 0, 0, 0.73611], - "83": [0, 0.68333, 0, 0, 0.55556], - "84": [0, 0.68333, 0, 0, 0.72222], - "85": [0, 0.68333, 0, 0, 0.75], - "86": [0, 0.68333, 0.01389, 0, 0.75], - "87": [0, 0.68333, 0.01389, 0, 1.02778], - "88": [0, 0.68333, 0, 0, 0.75], - "89": [0, 0.68333, 0.025, 0, 0.75], - "90": [0, 0.68333, 0, 0, 0.61111], - "91": [0.25, 0.75, 0, 0, 0.27778], - "92": [0.25, 0.75, 0, 0, 0.5], - "93": [0.25, 0.75, 0, 0, 0.27778], - "94": [0, 0.69444, 0, 0, 0.5], - "95": [0.31, 0.12056, 0.02778, 0, 0.5], - "97": [0, 0.43056, 0, 0, 0.5], - "98": [0, 0.69444, 0, 0, 0.55556], - "99": [0, 0.43056, 0, 0, 0.44445], - "100": [0, 0.69444, 0, 0, 0.55556], - "101": [0, 0.43056, 0, 0, 0.44445], - "102": [0, 0.69444, 0.07778, 0, 0.30556], - "103": [0.19444, 0.43056, 0.01389, 0, 0.5], - "104": [0, 0.69444, 0, 0, 0.55556], - "105": [0, 0.66786, 0, 0, 0.27778], - "106": [0.19444, 0.66786, 0, 0, 0.30556], - "107": [0, 0.69444, 0, 0, 0.52778], - "108": [0, 0.69444, 0, 0, 0.27778], - "109": [0, 0.43056, 0, 0, 0.83334], - "110": [0, 0.43056, 0, 0, 0.55556], - "111": [0, 0.43056, 0, 0, 0.5], - "112": [0.19444, 0.43056, 0, 0, 0.55556], - "113": [0.19444, 0.43056, 0, 0, 0.52778], - "114": [0, 0.43056, 0, 0, 0.39167], - "115": [0, 0.43056, 0, 0, 0.39445], - "116": [0, 0.61508, 0, 0, 0.38889], - "117": [0, 0.43056, 0, 0, 0.55556], - "118": [0, 0.43056, 0.01389, 0, 0.52778], - "119": [0, 0.43056, 0.01389, 0, 0.72222], - "120": [0, 0.43056, 0, 0, 0.52778], - "121": [0.19444, 0.43056, 0.01389, 0, 0.52778], - "122": [0, 0.43056, 0, 0, 0.44445], - "123": [0.25, 0.75, 0, 0, 0.5], - "124": [0.25, 0.75, 0, 0, 0.27778], - "125": [0.25, 0.75, 0, 0, 0.5], - "126": [0.35, 0.31786, 0, 0, 0.5], - "160": [0, 0, 0, 0, 0.25], - "163": [0, 0.69444, 0, 0, 0.76909], - "167": [0.19444, 0.69444, 0, 0, 0.44445], - "168": [0, 0.66786, 0, 0, 0.5], - "172": [0, 0.43056, 0, 0, 0.66667], - "176": [0, 0.69444, 0, 0, 0.75], - "177": [0.08333, 0.58333, 0, 0, 0.77778], - "182": [0.19444, 0.69444, 0, 0, 0.61111], - "184": [0.17014, 0, 0, 0, 0.44445], - "198": [0, 0.68333, 0, 0, 0.90278], - "215": [0.08333, 0.58333, 0, 0, 0.77778], - "216": [0.04861, 0.73194, 0, 0, 0.77778], - "223": [0, 0.69444, 0, 0, 0.5], - "230": [0, 0.43056, 0, 0, 0.72222], - "247": [0.08333, 0.58333, 0, 0, 0.77778], - "248": [0.09722, 0.52778, 0, 0, 0.5], - "305": [0, 0.43056, 0, 0, 0.27778], - "338": [0, 0.68333, 0, 0, 1.01389], - "339": [0, 0.43056, 0, 0, 0.77778], - "567": [0.19444, 0.43056, 0, 0, 0.30556], - "710": [0, 0.69444, 0, 0, 0.5], - "711": [0, 0.62847, 0, 0, 0.5], - "713": [0, 0.56778, 0, 0, 0.5], - "714": [0, 0.69444, 0, 0, 0.5], - "715": [0, 0.69444, 0, 0, 0.5], - "728": [0, 0.69444, 0, 0, 0.5], - "729": [0, 0.66786, 0, 0, 0.27778], - "730": [0, 0.69444, 0, 0, 0.75], - "732": [0, 0.66786, 0, 0, 0.5], - "733": [0, 0.69444, 0, 0, 0.5], - "915": [0, 0.68333, 0, 0, 0.625], - "916": [0, 0.68333, 0, 0, 0.83334], - "920": [0, 0.68333, 0, 0, 0.77778], - "923": [0, 0.68333, 0, 0, 0.69445], - "926": [0, 0.68333, 0, 0, 0.66667], - "928": [0, 0.68333, 0, 0, 0.75], - "931": [0, 0.68333, 0, 0, 0.72222], - "933": [0, 0.68333, 0, 0, 0.77778], - "934": [0, 0.68333, 0, 0, 0.72222], - "936": [0, 0.68333, 0, 0, 0.77778], - "937": [0, 0.68333, 0, 0, 0.72222], - "8211": [0, 0.43056, 0.02778, 0, 0.5], - "8212": [0, 0.43056, 0.02778, 0, 1.0], - "8216": [0, 0.69444, 0, 0, 0.27778], - "8217": [0, 0.69444, 0, 0, 0.27778], - "8220": [0, 0.69444, 0, 0, 0.5], - "8221": [0, 0.69444, 0, 0, 0.5], - "8224": [0.19444, 0.69444, 0, 0, 0.44445], - "8225": [0.19444, 0.69444, 0, 0, 0.44445], - "8230": [0, 0.12, 0, 0, 1.172], - "8242": [0, 0.55556, 0, 0, 0.275], - "8407": [0, 0.71444, 0.15382, 0, 0.5], - "8463": [0, 0.68889, 0, 0, 0.54028], - "8465": [0, 0.69444, 0, 0, 0.72222], - "8467": [0, 0.69444, 0, 0.11111, 0.41667], - "8472": [0.19444, 0.43056, 0, 0.11111, 0.63646], - "8476": [0, 0.69444, 0, 0, 0.72222], - "8501": [0, 0.69444, 0, 0, 0.61111], - "8592": [-0.13313, 0.36687, 0, 0, 1.0], - "8593": [0.19444, 0.69444, 0, 0, 0.5], - "8594": [-0.13313, 0.36687, 0, 0, 1.0], - "8595": [0.19444, 0.69444, 0, 0, 0.5], - "8596": [-0.13313, 0.36687, 0, 0, 1.0], - "8597": [0.25, 0.75, 0, 0, 0.5], - "8598": [0.19444, 0.69444, 0, 0, 1.0], - "8599": [0.19444, 0.69444, 0, 0, 1.0], - "8600": [0.19444, 0.69444, 0, 0, 1.0], - "8601": [0.19444, 0.69444, 0, 0, 1.0], - "8614": [0.011, 0.511, 0, 0, 1.0], - "8617": [0.011, 0.511, 0, 0, 1.126], - "8618": [0.011, 0.511, 0, 0, 1.126], - "8636": [-0.13313, 0.36687, 0, 0, 1.0], - "8637": [-0.13313, 0.36687, 0, 0, 1.0], - "8640": [-0.13313, 0.36687, 0, 0, 1.0], - "8641": [-0.13313, 0.36687, 0, 0, 1.0], - "8652": [0.011, 0.671, 0, 0, 1.0], - "8656": [-0.13313, 0.36687, 0, 0, 1.0], - "8657": [0.19444, 0.69444, 0, 0, 0.61111], - "8658": [-0.13313, 0.36687, 0, 0, 1.0], - "8659": [0.19444, 0.69444, 0, 0, 0.61111], - "8660": [-0.13313, 0.36687, 0, 0, 1.0], - "8661": [0.25, 0.75, 0, 0, 0.61111], - "8704": [0, 0.69444, 0, 0, 0.55556], - "8706": [0, 0.69444, 0.05556, 0.08334, 0.5309], - "8707": [0, 0.69444, 0, 0, 0.55556], - "8709": [0.05556, 0.75, 0, 0, 0.5], - "8711": [0, 0.68333, 0, 0, 0.83334], - "8712": [0.0391, 0.5391, 0, 0, 0.66667], - "8715": [0.0391, 0.5391, 0, 0, 0.66667], - "8722": [0.08333, 0.58333, 0, 0, 0.77778], - "8723": [0.08333, 0.58333, 0, 0, 0.77778], - "8725": [0.25, 0.75, 0, 0, 0.5], - "8726": [0.25, 0.75, 0, 0, 0.5], - "8727": [-0.03472, 0.46528, 0, 0, 0.5], - "8728": [-0.05555, 0.44445, 0, 0, 0.5], - "8729": [-0.05555, 0.44445, 0, 0, 0.5], - "8730": [0.2, 0.8, 0, 0, 0.83334], - "8733": [0, 0.43056, 0, 0, 0.77778], - "8734": [0, 0.43056, 0, 0, 1.0], - "8736": [0, 0.69224, 0, 0, 0.72222], - "8739": [0.25, 0.75, 0, 0, 0.27778], - "8741": [0.25, 0.75, 0, 0, 0.5], - "8743": [0, 0.55556, 0, 0, 0.66667], - "8744": [0, 0.55556, 0, 0, 0.66667], - "8745": [0, 0.55556, 0, 0, 0.66667], - "8746": [0, 0.55556, 0, 0, 0.66667], - "8747": [0.19444, 0.69444, 0.11111, 0, 0.41667], - "8764": [-0.13313, 0.36687, 0, 0, 0.77778], - "8768": [0.19444, 0.69444, 0, 0, 0.27778], - "8771": [-0.03625, 0.46375, 0, 0, 0.77778], - "8773": [-0.022, 0.589, 0, 0, 1.0], - "8776": [-0.01688, 0.48312, 0, 0, 0.77778], - "8781": [-0.03625, 0.46375, 0, 0, 0.77778], - "8784": [-0.133, 0.67, 0, 0, 0.778], - "8801": [-0.03625, 0.46375, 0, 0, 0.77778], - "8804": [0.13597, 0.63597, 0, 0, 0.77778], - "8805": [0.13597, 0.63597, 0, 0, 0.77778], - "8810": [0.0391, 0.5391, 0, 0, 1.0], - "8811": [0.0391, 0.5391, 0, 0, 1.0], - "8826": [0.0391, 0.5391, 0, 0, 0.77778], - "8827": [0.0391, 0.5391, 0, 0, 0.77778], - "8834": [0.0391, 0.5391, 0, 0, 0.77778], - "8835": [0.0391, 0.5391, 0, 0, 0.77778], - "8838": [0.13597, 0.63597, 0, 0, 0.77778], - "8839": [0.13597, 0.63597, 0, 0, 0.77778], - "8846": [0, 0.55556, 0, 0, 0.66667], - "8849": [0.13597, 0.63597, 0, 0, 0.77778], - "8850": [0.13597, 0.63597, 0, 0, 0.77778], - "8851": [0, 0.55556, 0, 0, 0.66667], - "8852": [0, 0.55556, 0, 0, 0.66667], - "8853": [0.08333, 0.58333, 0, 0, 0.77778], - "8854": [0.08333, 0.58333, 0, 0, 0.77778], - "8855": [0.08333, 0.58333, 0, 0, 0.77778], - "8856": [0.08333, 0.58333, 0, 0, 0.77778], - "8857": [0.08333, 0.58333, 0, 0, 0.77778], - "8866": [0, 0.69444, 0, 0, 0.61111], - "8867": [0, 0.69444, 0, 0, 0.61111], - "8868": [0, 0.69444, 0, 0, 0.77778], - "8869": [0, 0.69444, 0, 0, 0.77778], - "8872": [0.249, 0.75, 0, 0, 0.867], - "8900": [-0.05555, 0.44445, 0, 0, 0.5], - "8901": [-0.05555, 0.44445, 0, 0, 0.27778], - "8902": [-0.03472, 0.46528, 0, 0, 0.5], - "8904": [0.005, 0.505, 0, 0, 0.9], - "8942": [0.03, 0.9, 0, 0, 0.278], - "8943": [-0.19, 0.31, 0, 0, 1.172], - "8945": [-0.1, 0.82, 0, 0, 1.282], - "8968": [0.25, 0.75, 0, 0, 0.44445], - "8969": [0.25, 0.75, 0, 0, 0.44445], - "8970": [0.25, 0.75, 0, 0, 0.44445], - "8971": [0.25, 0.75, 0, 0, 0.44445], - "8994": [-0.14236, 0.35764, 0, 0, 1.0], - "8995": [-0.14236, 0.35764, 0, 0, 1.0], - "9136": [0.244, 0.744, 0, 0, 0.412], - "9137": [0.244, 0.744, 0, 0, 0.412], - "9651": [0.19444, 0.69444, 0, 0, 0.88889], - "9657": [-0.03472, 0.46528, 0, 0, 0.5], - "9661": [0.19444, 0.69444, 0, 0, 0.88889], - "9667": [-0.03472, 0.46528, 0, 0, 0.5], - "9711": [0.19444, 0.69444, 0, 0, 1.0], - "9824": [0.12963, 0.69444, 0, 0, 0.77778], - "9825": [0.12963, 0.69444, 0, 0, 0.77778], - "9826": [0.12963, 0.69444, 0, 0, 0.77778], - "9827": [0.12963, 0.69444, 0, 0, 0.77778], - "9837": [0, 0.75, 0, 0, 0.38889], - "9838": [0.19444, 0.69444, 0, 0, 0.38889], - "9839": [0.19444, 0.69444, 0, 0, 0.38889], - "10216": [0.25, 0.75, 0, 0, 0.38889], - "10217": [0.25, 0.75, 0, 0, 0.38889], - "10222": [0.244, 0.744, 0, 0, 0.412], - "10223": [0.244, 0.744, 0, 0, 0.412], - "10229": [0.011, 0.511, 0, 0, 1.609], - "10230": [0.011, 0.511, 0, 0, 1.638], - "10231": [0.011, 0.511, 0, 0, 1.859], - "10232": [0.024, 0.525, 0, 0, 1.609], - "10233": [0.024, 0.525, 0, 0, 1.638], - "10234": [0.024, 0.525, 0, 0, 1.858], - "10236": [0.011, 0.511, 0, 0, 1.638], - "10815": [0, 0.68333, 0, 0, 0.75], - "10927": [0.13597, 0.63597, 0, 0, 0.77778], - "10928": [0.13597, 0.63597, 0, 0, 0.77778], - "57376": [0.19444, 0.69444, 0, 0, 0] - }, - "Math-BoldItalic": { - "32": [0, 0, 0, 0, 0.25], - "48": [0, 0.44444, 0, 0, 0.575], - "49": [0, 0.44444, 0, 0, 0.575], - "50": [0, 0.44444, 0, 0, 0.575], - "51": [0.19444, 0.44444, 0, 0, 0.575], - "52": [0.19444, 0.44444, 0, 0, 0.575], - "53": [0.19444, 0.44444, 0, 0, 0.575], - "54": [0, 0.64444, 0, 0, 0.575], - "55": [0.19444, 0.44444, 0, 0, 0.575], - "56": [0, 0.64444, 0, 0, 0.575], - "57": [0.19444, 0.44444, 0, 0, 0.575], - "65": [0, 0.68611, 0, 0, 0.86944], - "66": [0, 0.68611, 0.04835, 0, 0.8664], - "67": [0, 0.68611, 0.06979, 0, 0.81694], - "68": [0, 0.68611, 0.03194, 0, 0.93812], - "69": [0, 0.68611, 0.05451, 0, 0.81007], - "70": [0, 0.68611, 0.15972, 0, 0.68889], - "71": [0, 0.68611, 0, 0, 0.88673], - "72": [0, 0.68611, 0.08229, 0, 0.98229], - "73": [0, 0.68611, 0.07778, 0, 0.51111], - "74": [0, 0.68611, 0.10069, 0, 0.63125], - "75": [0, 0.68611, 0.06979, 0, 0.97118], - "76": [0, 0.68611, 0, 0, 0.75555], - "77": [0, 0.68611, 0.11424, 0, 1.14201], - "78": [0, 0.68611, 0.11424, 0, 0.95034], - "79": [0, 0.68611, 0.03194, 0, 0.83666], - "80": [0, 0.68611, 0.15972, 0, 0.72309], - "81": [0.19444, 0.68611, 0, 0, 0.86861], - "82": [0, 0.68611, 0.00421, 0, 0.87235], - "83": [0, 0.68611, 0.05382, 0, 0.69271], - "84": [0, 0.68611, 0.15972, 0, 0.63663], - "85": [0, 0.68611, 0.11424, 0, 0.80027], - "86": [0, 0.68611, 0.25555, 0, 0.67778], - "87": [0, 0.68611, 0.15972, 0, 1.09305], - "88": [0, 0.68611, 0.07778, 0, 0.94722], - "89": [0, 0.68611, 0.25555, 0, 0.67458], - "90": [0, 0.68611, 0.06979, 0, 0.77257], - "97": [0, 0.44444, 0, 0, 0.63287], - "98": [0, 0.69444, 0, 0, 0.52083], - "99": [0, 0.44444, 0, 0, 0.51342], - "100": [0, 0.69444, 0, 0, 0.60972], - "101": [0, 0.44444, 0, 0, 0.55361], - "102": [0.19444, 0.69444, 0.11042, 0, 0.56806], - "103": [0.19444, 0.44444, 0.03704, 0, 0.5449], - "104": [0, 0.69444, 0, 0, 0.66759], - "105": [0, 0.69326, 0, 0, 0.4048], - "106": [0.19444, 0.69326, 0.0622, 0, 0.47083], - "107": [0, 0.69444, 0.01852, 0, 0.6037], - "108": [0, 0.69444, 0.0088, 0, 0.34815], - "109": [0, 0.44444, 0, 0, 1.0324], - "110": [0, 0.44444, 0, 0, 0.71296], - "111": [0, 0.44444, 0, 0, 0.58472], - "112": [0.19444, 0.44444, 0, 0, 0.60092], - "113": [0.19444, 0.44444, 0.03704, 0, 0.54213], - "114": [0, 0.44444, 0.03194, 0, 0.5287], - "115": [0, 0.44444, 0, 0, 0.53125], - "116": [0, 0.63492, 0, 0, 0.41528], - "117": [0, 0.44444, 0, 0, 0.68102], - "118": [0, 0.44444, 0.03704, 0, 0.56666], - "119": [0, 0.44444, 0.02778, 0, 0.83148], - "120": [0, 0.44444, 0, 0, 0.65903], - "121": [0.19444, 0.44444, 0.03704, 0, 0.59028], - "122": [0, 0.44444, 0.04213, 0, 0.55509], - "160": [0, 0, 0, 0, 0.25], - "915": [0, 0.68611, 0.15972, 0, 0.65694], - "916": [0, 0.68611, 0, 0, 0.95833], - "920": [0, 0.68611, 0.03194, 0, 0.86722], - "923": [0, 0.68611, 0, 0, 0.80555], - "926": [0, 0.68611, 0.07458, 0, 0.84125], - "928": [0, 0.68611, 0.08229, 0, 0.98229], - "931": [0, 0.68611, 0.05451, 0, 0.88507], - "933": [0, 0.68611, 0.15972, 0, 0.67083], - "934": [0, 0.68611, 0, 0, 0.76666], - "936": [0, 0.68611, 0.11653, 0, 0.71402], - "937": [0, 0.68611, 0.04835, 0, 0.8789], - "945": [0, 0.44444, 0, 0, 0.76064], - "946": [0.19444, 0.69444, 0.03403, 0, 0.65972], - "947": [0.19444, 0.44444, 0.06389, 0, 0.59003], - "948": [0, 0.69444, 0.03819, 0, 0.52222], - "949": [0, 0.44444, 0, 0, 0.52882], - "950": [0.19444, 0.69444, 0.06215, 0, 0.50833], - "951": [0.19444, 0.44444, 0.03704, 0, 0.6], - "952": [0, 0.69444, 0.03194, 0, 0.5618], - "953": [0, 0.44444, 0, 0, 0.41204], - "954": [0, 0.44444, 0, 0, 0.66759], - "955": [0, 0.69444, 0, 0, 0.67083], - "956": [0.19444, 0.44444, 0, 0, 0.70787], - "957": [0, 0.44444, 0.06898, 0, 0.57685], - "958": [0.19444, 0.69444, 0.03021, 0, 0.50833], - "959": [0, 0.44444, 0, 0, 0.58472], - "960": [0, 0.44444, 0.03704, 0, 0.68241], - "961": [0.19444, 0.44444, 0, 0, 0.6118], - "962": [0.09722, 0.44444, 0.07917, 0, 0.42361], - "963": [0, 0.44444, 0.03704, 0, 0.68588], - "964": [0, 0.44444, 0.13472, 0, 0.52083], - "965": [0, 0.44444, 0.03704, 0, 0.63055], - "966": [0.19444, 0.44444, 0, 0, 0.74722], - "967": [0.19444, 0.44444, 0, 0, 0.71805], - "968": [0.19444, 0.69444, 0.03704, 0, 0.75833], - "969": [0, 0.44444, 0.03704, 0, 0.71782], - "977": [0, 0.69444, 0, 0, 0.69155], - "981": [0.19444, 0.69444, 0, 0, 0.7125], - "982": [0, 0.44444, 0.03194, 0, 0.975], - "1009": [0.19444, 0.44444, 0, 0, 0.6118], - "1013": [0, 0.44444, 0, 0, 0.48333], - "57649": [0, 0.44444, 0, 0, 0.39352], - "57911": [0.19444, 0.44444, 0, 0, 0.43889] - }, - "Math-Italic": { - "32": [0, 0, 0, 0, 0.25], - "48": [0, 0.43056, 0, 0, 0.5], - "49": [0, 0.43056, 0, 0, 0.5], - "50": [0, 0.43056, 0, 0, 0.5], - "51": [0.19444, 0.43056, 0, 0, 0.5], - "52": [0.19444, 0.43056, 0, 0, 0.5], - "53": [0.19444, 0.43056, 0, 0, 0.5], - "54": [0, 0.64444, 0, 0, 0.5], - "55": [0.19444, 0.43056, 0, 0, 0.5], - "56": [0, 0.64444, 0, 0, 0.5], - "57": [0.19444, 0.43056, 0, 0, 0.5], - "65": [0, 0.68333, 0, 0.13889, 0.75], - "66": [0, 0.68333, 0.05017, 0.08334, 0.75851], - "67": [0, 0.68333, 0.07153, 0.08334, 0.71472], - "68": [0, 0.68333, 0.02778, 0.05556, 0.82792], - "69": [0, 0.68333, 0.05764, 0.08334, 0.7382], - "70": [0, 0.68333, 0.13889, 0.08334, 0.64306], - "71": [0, 0.68333, 0, 0.08334, 0.78625], - "72": [0, 0.68333, 0.08125, 0.05556, 0.83125], - "73": [0, 0.68333, 0.07847, 0.11111, 0.43958], - "74": [0, 0.68333, 0.09618, 0.16667, 0.55451], - "75": [0, 0.68333, 0.07153, 0.05556, 0.84931], - "76": [0, 0.68333, 0, 0.02778, 0.68056], - "77": [0, 0.68333, 0.10903, 0.08334, 0.97014], - "78": [0, 0.68333, 0.10903, 0.08334, 0.80347], - "79": [0, 0.68333, 0.02778, 0.08334, 0.76278], - "80": [0, 0.68333, 0.13889, 0.08334, 0.64201], - "81": [0.19444, 0.68333, 0, 0.08334, 0.79056], - "82": [0, 0.68333, 0.00773, 0.08334, 0.75929], - "83": [0, 0.68333, 0.05764, 0.08334, 0.6132], - "84": [0, 0.68333, 0.13889, 0.08334, 0.58438], - "85": [0, 0.68333, 0.10903, 0.02778, 0.68278], - "86": [0, 0.68333, 0.22222, 0, 0.58333], - "87": [0, 0.68333, 0.13889, 0, 0.94445], - "88": [0, 0.68333, 0.07847, 0.08334, 0.82847], - "89": [0, 0.68333, 0.22222, 0, 0.58056], - "90": [0, 0.68333, 0.07153, 0.08334, 0.68264], - "97": [0, 0.43056, 0, 0, 0.52859], - "98": [0, 0.69444, 0, 0, 0.42917], - "99": [0, 0.43056, 0, 0.05556, 0.43276], - "100": [0, 0.69444, 0, 0.16667, 0.52049], - "101": [0, 0.43056, 0, 0.05556, 0.46563], - "102": [0.19444, 0.69444, 0.10764, 0.16667, 0.48959], - "103": [0.19444, 0.43056, 0.03588, 0.02778, 0.47697], - "104": [0, 0.69444, 0, 0, 0.57616], - "105": [0, 0.65952, 0, 0, 0.34451], - "106": [0.19444, 0.65952, 0.05724, 0, 0.41181], - "107": [0, 0.69444, 0.03148, 0, 0.5206], - "108": [0, 0.69444, 0.01968, 0.08334, 0.29838], - "109": [0, 0.43056, 0, 0, 0.87801], - "110": [0, 0.43056, 0, 0, 0.60023], - "111": [0, 0.43056, 0, 0.05556, 0.48472], - "112": [0.19444, 0.43056, 0, 0.08334, 0.50313], - "113": [0.19444, 0.43056, 0.03588, 0.08334, 0.44641], - "114": [0, 0.43056, 0.02778, 0.05556, 0.45116], - "115": [0, 0.43056, 0, 0.05556, 0.46875], - "116": [0, 0.61508, 0, 0.08334, 0.36111], - "117": [0, 0.43056, 0, 0.02778, 0.57246], - "118": [0, 0.43056, 0.03588, 0.02778, 0.48472], - "119": [0, 0.43056, 0.02691, 0.08334, 0.71592], - "120": [0, 0.43056, 0, 0.02778, 0.57153], - "121": [0.19444, 0.43056, 0.03588, 0.05556, 0.49028], - "122": [0, 0.43056, 0.04398, 0.05556, 0.46505], - "160": [0, 0, 0, 0, 0.25], - "915": [0, 0.68333, 0.13889, 0.08334, 0.61528], - "916": [0, 0.68333, 0, 0.16667, 0.83334], - "920": [0, 0.68333, 0.02778, 0.08334, 0.76278], - "923": [0, 0.68333, 0, 0.16667, 0.69445], - "926": [0, 0.68333, 0.07569, 0.08334, 0.74236], - "928": [0, 0.68333, 0.08125, 0.05556, 0.83125], - "931": [0, 0.68333, 0.05764, 0.08334, 0.77986], - "933": [0, 0.68333, 0.13889, 0.05556, 0.58333], - "934": [0, 0.68333, 0, 0.08334, 0.66667], - "936": [0, 0.68333, 0.11, 0.05556, 0.61222], - "937": [0, 0.68333, 0.05017, 0.08334, 0.7724], - "945": [0, 0.43056, 0.0037, 0.02778, 0.6397], - "946": [0.19444, 0.69444, 0.05278, 0.08334, 0.56563], - "947": [0.19444, 0.43056, 0.05556, 0, 0.51773], - "948": [0, 0.69444, 0.03785, 0.05556, 0.44444], - "949": [0, 0.43056, 0, 0.08334, 0.46632], - "950": [0.19444, 0.69444, 0.07378, 0.08334, 0.4375], - "951": [0.19444, 0.43056, 0.03588, 0.05556, 0.49653], - "952": [0, 0.69444, 0.02778, 0.08334, 0.46944], - "953": [0, 0.43056, 0, 0.05556, 0.35394], - "954": [0, 0.43056, 0, 0, 0.57616], - "955": [0, 0.69444, 0, 0, 0.58334], - "956": [0.19444, 0.43056, 0, 0.02778, 0.60255], - "957": [0, 0.43056, 0.06366, 0.02778, 0.49398], - "958": [0.19444, 0.69444, 0.04601, 0.11111, 0.4375], - "959": [0, 0.43056, 0, 0.05556, 0.48472], - "960": [0, 0.43056, 0.03588, 0, 0.57003], - "961": [0.19444, 0.43056, 0, 0.08334, 0.51702], - "962": [0.09722, 0.43056, 0.07986, 0.08334, 0.36285], - "963": [0, 0.43056, 0.03588, 0, 0.57141], - "964": [0, 0.43056, 0.1132, 0.02778, 0.43715], - "965": [0, 0.43056, 0.03588, 0.02778, 0.54028], - "966": [0.19444, 0.43056, 0, 0.08334, 0.65417], - "967": [0.19444, 0.43056, 0, 0.05556, 0.62569], - "968": [0.19444, 0.69444, 0.03588, 0.11111, 0.65139], - "969": [0, 0.43056, 0.03588, 0, 0.62245], - "977": [0, 0.69444, 0, 0.08334, 0.59144], - "981": [0.19444, 0.69444, 0, 0.08334, 0.59583], - "982": [0, 0.43056, 0.02778, 0, 0.82813], - "1009": [0.19444, 0.43056, 0, 0.08334, 0.51702], - "1013": [0, 0.43056, 0, 0.05556, 0.4059], - "57649": [0, 0.43056, 0, 0.02778, 0.32246], - "57911": [0.19444, 0.43056, 0, 0.08334, 0.38403] - }, - "SansSerif-Bold": { - "32": [0, 0, 0, 0, 0.25], - "33": [0, 0.69444, 0, 0, 0.36667], - "34": [0, 0.69444, 0, 0, 0.55834], - "35": [0.19444, 0.69444, 0, 0, 0.91667], - "36": [0.05556, 0.75, 0, 0, 0.55], - "37": [0.05556, 0.75, 0, 0, 1.02912], - "38": [0, 0.69444, 0, 0, 0.83056], - "39": [0, 0.69444, 0, 0, 0.30556], - "40": [0.25, 0.75, 0, 0, 0.42778], - "41": [0.25, 0.75, 0, 0, 0.42778], - "42": [0, 0.75, 0, 0, 0.55], - "43": [0.11667, 0.61667, 0, 0, 0.85556], - "44": [0.10556, 0.13056, 0, 0, 0.30556], - "45": [0, 0.45833, 0, 0, 0.36667], - "46": [0, 0.13056, 0, 0, 0.30556], - "47": [0.25, 0.75, 0, 0, 0.55], - "48": [0, 0.69444, 0, 0, 0.55], - "49": [0, 0.69444, 0, 0, 0.55], - "50": [0, 0.69444, 0, 0, 0.55], - "51": [0, 0.69444, 0, 0, 0.55], - "52": [0, 0.69444, 0, 0, 0.55], - "53": [0, 0.69444, 0, 0, 0.55], - "54": [0, 0.69444, 0, 0, 0.55], - "55": [0, 0.69444, 0, 0, 0.55], - "56": [0, 0.69444, 0, 0, 0.55], - "57": [0, 0.69444, 0, 0, 0.55], - "58": [0, 0.45833, 0, 0, 0.30556], - "59": [0.10556, 0.45833, 0, 0, 0.30556], - "61": [-0.09375, 0.40625, 0, 0, 0.85556], - "63": [0, 0.69444, 0, 0, 0.51945], - "64": [0, 0.69444, 0, 0, 0.73334], - "65": [0, 0.69444, 0, 0, 0.73334], - "66": [0, 0.69444, 0, 0, 0.73334], - "67": [0, 0.69444, 0, 0, 0.70278], - "68": [0, 0.69444, 0, 0, 0.79445], - "69": [0, 0.69444, 0, 0, 0.64167], - "70": [0, 0.69444, 0, 0, 0.61111], - "71": [0, 0.69444, 0, 0, 0.73334], - "72": [0, 0.69444, 0, 0, 0.79445], - "73": [0, 0.69444, 0, 0, 0.33056], - "74": [0, 0.69444, 0, 0, 0.51945], - "75": [0, 0.69444, 0, 0, 0.76389], - "76": [0, 0.69444, 0, 0, 0.58056], - "77": [0, 0.69444, 0, 0, 0.97778], - "78": [0, 0.69444, 0, 0, 0.79445], - "79": [0, 0.69444, 0, 0, 0.79445], - "80": [0, 0.69444, 0, 0, 0.70278], - "81": [0.10556, 0.69444, 0, 0, 0.79445], - "82": [0, 0.69444, 0, 0, 0.70278], - "83": [0, 0.69444, 0, 0, 0.61111], - "84": [0, 0.69444, 0, 0, 0.73334], - "85": [0, 0.69444, 0, 0, 0.76389], - "86": [0, 0.69444, 0.01528, 0, 0.73334], - "87": [0, 0.69444, 0.01528, 0, 1.03889], - "88": [0, 0.69444, 0, 0, 0.73334], - "89": [0, 0.69444, 0.0275, 0, 0.73334], - "90": [0, 0.69444, 0, 0, 0.67223], - "91": [0.25, 0.75, 0, 0, 0.34306], - "93": [0.25, 0.75, 0, 0, 0.34306], - "94": [0, 0.69444, 0, 0, 0.55], - "95": [0.35, 0.10833, 0.03056, 0, 0.55], - "97": [0, 0.45833, 0, 0, 0.525], - "98": [0, 0.69444, 0, 0, 0.56111], - "99": [0, 0.45833, 0, 0, 0.48889], - "100": [0, 0.69444, 0, 0, 0.56111], - "101": [0, 0.45833, 0, 0, 0.51111], - "102": [0, 0.69444, 0.07639, 0, 0.33611], - "103": [0.19444, 0.45833, 0.01528, 0, 0.55], - "104": [0, 0.69444, 0, 0, 0.56111], - "105": [0, 0.69444, 0, 0, 0.25556], - "106": [0.19444, 0.69444, 0, 0, 0.28611], - "107": [0, 0.69444, 0, 0, 0.53056], - "108": [0, 0.69444, 0, 0, 0.25556], - "109": [0, 0.45833, 0, 0, 0.86667], - "110": [0, 0.45833, 0, 0, 0.56111], - "111": [0, 0.45833, 0, 0, 0.55], - "112": [0.19444, 0.45833, 0, 0, 0.56111], - "113": [0.19444, 0.45833, 0, 0, 0.56111], - "114": [0, 0.45833, 0.01528, 0, 0.37222], - "115": [0, 0.45833, 0, 0, 0.42167], - "116": [0, 0.58929, 0, 0, 0.40417], - "117": [0, 0.45833, 0, 0, 0.56111], - "118": [0, 0.45833, 0.01528, 0, 0.5], - "119": [0, 0.45833, 0.01528, 0, 0.74445], - "120": [0, 0.45833, 0, 0, 0.5], - "121": [0.19444, 0.45833, 0.01528, 0, 0.5], - "122": [0, 0.45833, 0, 0, 0.47639], - "126": [0.35, 0.34444, 0, 0, 0.55], - "160": [0, 0, 0, 0, 0.25], - "168": [0, 0.69444, 0, 0, 0.55], - "176": [0, 0.69444, 0, 0, 0.73334], - "180": [0, 0.69444, 0, 0, 0.55], - "184": [0.17014, 0, 0, 0, 0.48889], - "305": [0, 0.45833, 0, 0, 0.25556], - "567": [0.19444, 0.45833, 0, 0, 0.28611], - "710": [0, 0.69444, 0, 0, 0.55], - "711": [0, 0.63542, 0, 0, 0.55], - "713": [0, 0.63778, 0, 0, 0.55], - "728": [0, 0.69444, 0, 0, 0.55], - "729": [0, 0.69444, 0, 0, 0.30556], - "730": [0, 0.69444, 0, 0, 0.73334], - "732": [0, 0.69444, 0, 0, 0.55], - "733": [0, 0.69444, 0, 0, 0.55], - "915": [0, 0.69444, 0, 0, 0.58056], - "916": [0, 0.69444, 0, 0, 0.91667], - "920": [0, 0.69444, 0, 0, 0.85556], - "923": [0, 0.69444, 0, 0, 0.67223], - "926": [0, 0.69444, 0, 0, 0.73334], - "928": [0, 0.69444, 0, 0, 0.79445], - "931": [0, 0.69444, 0, 0, 0.79445], - "933": [0, 0.69444, 0, 0, 0.85556], - "934": [0, 0.69444, 0, 0, 0.79445], - "936": [0, 0.69444, 0, 0, 0.85556], - "937": [0, 0.69444, 0, 0, 0.79445], - "8211": [0, 0.45833, 0.03056, 0, 0.55], - "8212": [0, 0.45833, 0.03056, 0, 1.10001], - "8216": [0, 0.69444, 0, 0, 0.30556], - "8217": [0, 0.69444, 0, 0, 0.30556], - "8220": [0, 0.69444, 0, 0, 0.55834], - "8221": [0, 0.69444, 0, 0, 0.55834] - }, - "SansSerif-Italic": { - "32": [0, 0, 0, 0, 0.25], - "33": [0, 0.69444, 0.05733, 0, 0.31945], - "34": [0, 0.69444, 0.00316, 0, 0.5], - "35": [0.19444, 0.69444, 0.05087, 0, 0.83334], - "36": [0.05556, 0.75, 0.11156, 0, 0.5], - "37": [0.05556, 0.75, 0.03126, 0, 0.83334], - "38": [0, 0.69444, 0.03058, 0, 0.75834], - "39": [0, 0.69444, 0.07816, 0, 0.27778], - "40": [0.25, 0.75, 0.13164, 0, 0.38889], - "41": [0.25, 0.75, 0.02536, 0, 0.38889], - "42": [0, 0.75, 0.11775, 0, 0.5], - "43": [0.08333, 0.58333, 0.02536, 0, 0.77778], - "44": [0.125, 0.08333, 0, 0, 0.27778], - "45": [0, 0.44444, 0.01946, 0, 0.33333], - "46": [0, 0.08333, 0, 0, 0.27778], - "47": [0.25, 0.75, 0.13164, 0, 0.5], - "48": [0, 0.65556, 0.11156, 0, 0.5], - "49": [0, 0.65556, 0.11156, 0, 0.5], - "50": [0, 0.65556, 0.11156, 0, 0.5], - "51": [0, 0.65556, 0.11156, 0, 0.5], - "52": [0, 0.65556, 0.11156, 0, 0.5], - "53": [0, 0.65556, 0.11156, 0, 0.5], - "54": [0, 0.65556, 0.11156, 0, 0.5], - "55": [0, 0.65556, 0.11156, 0, 0.5], - "56": [0, 0.65556, 0.11156, 0, 0.5], - "57": [0, 0.65556, 0.11156, 0, 0.5], - "58": [0, 0.44444, 0.02502, 0, 0.27778], - "59": [0.125, 0.44444, 0.02502, 0, 0.27778], - "61": [-0.13, 0.37, 0.05087, 0, 0.77778], - "63": [0, 0.69444, 0.11809, 0, 0.47222], - "64": [0, 0.69444, 0.07555, 0, 0.66667], - "65": [0, 0.69444, 0, 0, 0.66667], - "66": [0, 0.69444, 0.08293, 0, 0.66667], - "67": [0, 0.69444, 0.11983, 0, 0.63889], - "68": [0, 0.69444, 0.07555, 0, 0.72223], - "69": [0, 0.69444, 0.11983, 0, 0.59722], - "70": [0, 0.69444, 0.13372, 0, 0.56945], - "71": [0, 0.69444, 0.11983, 0, 0.66667], - "72": [0, 0.69444, 0.08094, 0, 0.70834], - "73": [0, 0.69444, 0.13372, 0, 0.27778], - "74": [0, 0.69444, 0.08094, 0, 0.47222], - "75": [0, 0.69444, 0.11983, 0, 0.69445], - "76": [0, 0.69444, 0, 0, 0.54167], - "77": [0, 0.69444, 0.08094, 0, 0.875], - "78": [0, 0.69444, 0.08094, 0, 0.70834], - "79": [0, 0.69444, 0.07555, 0, 0.73611], - "80": [0, 0.69444, 0.08293, 0, 0.63889], - "81": [0.125, 0.69444, 0.07555, 0, 0.73611], - "82": [0, 0.69444, 0.08293, 0, 0.64584], - "83": [0, 0.69444, 0.09205, 0, 0.55556], - "84": [0, 0.69444, 0.13372, 0, 0.68056], - "85": [0, 0.69444, 0.08094, 0, 0.6875], - "86": [0, 0.69444, 0.1615, 0, 0.66667], - "87": [0, 0.69444, 0.1615, 0, 0.94445], - "88": [0, 0.69444, 0.13372, 0, 0.66667], - "89": [0, 0.69444, 0.17261, 0, 0.66667], - "90": [0, 0.69444, 0.11983, 0, 0.61111], - "91": [0.25, 0.75, 0.15942, 0, 0.28889], - "93": [0.25, 0.75, 0.08719, 0, 0.28889], - "94": [0, 0.69444, 0.0799, 0, 0.5], - "95": [0.35, 0.09444, 0.08616, 0, 0.5], - "97": [0, 0.44444, 0.00981, 0, 0.48056], - "98": [0, 0.69444, 0.03057, 0, 0.51667], - "99": [0, 0.44444, 0.08336, 0, 0.44445], - "100": [0, 0.69444, 0.09483, 0, 0.51667], - "101": [0, 0.44444, 0.06778, 0, 0.44445], - "102": [0, 0.69444, 0.21705, 0, 0.30556], - "103": [0.19444, 0.44444, 0.10836, 0, 0.5], - "104": [0, 0.69444, 0.01778, 0, 0.51667], - "105": [0, 0.67937, 0.09718, 0, 0.23889], - "106": [0.19444, 0.67937, 0.09162, 0, 0.26667], - "107": [0, 0.69444, 0.08336, 0, 0.48889], - "108": [0, 0.69444, 0.09483, 0, 0.23889], - "109": [0, 0.44444, 0.01778, 0, 0.79445], - "110": [0, 0.44444, 0.01778, 0, 0.51667], - "111": [0, 0.44444, 0.06613, 0, 0.5], - "112": [0.19444, 0.44444, 0.0389, 0, 0.51667], - "113": [0.19444, 0.44444, 0.04169, 0, 0.51667], - "114": [0, 0.44444, 0.10836, 0, 0.34167], - "115": [0, 0.44444, 0.0778, 0, 0.38333], - "116": [0, 0.57143, 0.07225, 0, 0.36111], - "117": [0, 0.44444, 0.04169, 0, 0.51667], - "118": [0, 0.44444, 0.10836, 0, 0.46111], - "119": [0, 0.44444, 0.10836, 0, 0.68334], - "120": [0, 0.44444, 0.09169, 0, 0.46111], - "121": [0.19444, 0.44444, 0.10836, 0, 0.46111], - "122": [0, 0.44444, 0.08752, 0, 0.43472], - "126": [0.35, 0.32659, 0.08826, 0, 0.5], - "160": [0, 0, 0, 0, 0.25], - "168": [0, 0.67937, 0.06385, 0, 0.5], - "176": [0, 0.69444, 0, 0, 0.73752], - "184": [0.17014, 0, 0, 0, 0.44445], - "305": [0, 0.44444, 0.04169, 0, 0.23889], - "567": [0.19444, 0.44444, 0.04169, 0, 0.26667], - "710": [0, 0.69444, 0.0799, 0, 0.5], - "711": [0, 0.63194, 0.08432, 0, 0.5], - "713": [0, 0.60889, 0.08776, 0, 0.5], - "714": [0, 0.69444, 0.09205, 0, 0.5], - "715": [0, 0.69444, 0, 0, 0.5], - "728": [0, 0.69444, 0.09483, 0, 0.5], - "729": [0, 0.67937, 0.07774, 0, 0.27778], - "730": [0, 0.69444, 0, 0, 0.73752], - "732": [0, 0.67659, 0.08826, 0, 0.5], - "733": [0, 0.69444, 0.09205, 0, 0.5], - "915": [0, 0.69444, 0.13372, 0, 0.54167], - "916": [0, 0.69444, 0, 0, 0.83334], - "920": [0, 0.69444, 0.07555, 0, 0.77778], - "923": [0, 0.69444, 0, 0, 0.61111], - "926": [0, 0.69444, 0.12816, 0, 0.66667], - "928": [0, 0.69444, 0.08094, 0, 0.70834], - "931": [0, 0.69444, 0.11983, 0, 0.72222], - "933": [0, 0.69444, 0.09031, 0, 0.77778], - "934": [0, 0.69444, 0.04603, 0, 0.72222], - "936": [0, 0.69444, 0.09031, 0, 0.77778], - "937": [0, 0.69444, 0.08293, 0, 0.72222], - "8211": [0, 0.44444, 0.08616, 0, 0.5], - "8212": [0, 0.44444, 0.08616, 0, 1.0], - "8216": [0, 0.69444, 0.07816, 0, 0.27778], - "8217": [0, 0.69444, 0.07816, 0, 0.27778], - "8220": [0, 0.69444, 0.14205, 0, 0.5], - "8221": [0, 0.69444, 0.00316, 0, 0.5] - }, - "SansSerif-Regular": { - "32": [0, 0, 0, 0, 0.25], - "33": [0, 0.69444, 0, 0, 0.31945], - "34": [0, 0.69444, 0, 0, 0.5], - "35": [0.19444, 0.69444, 0, 0, 0.83334], - "36": [0.05556, 0.75, 0, 0, 0.5], - "37": [0.05556, 0.75, 0, 0, 0.83334], - "38": [0, 0.69444, 0, 0, 0.75834], - "39": [0, 0.69444, 0, 0, 0.27778], - "40": [0.25, 0.75, 0, 0, 0.38889], - "41": [0.25, 0.75, 0, 0, 0.38889], - "42": [0, 0.75, 0, 0, 0.5], - "43": [0.08333, 0.58333, 0, 0, 0.77778], - "44": [0.125, 0.08333, 0, 0, 0.27778], - "45": [0, 0.44444, 0, 0, 0.33333], - "46": [0, 0.08333, 0, 0, 0.27778], - "47": [0.25, 0.75, 0, 0, 0.5], - "48": [0, 0.65556, 0, 0, 0.5], - "49": [0, 0.65556, 0, 0, 0.5], - "50": [0, 0.65556, 0, 0, 0.5], - "51": [0, 0.65556, 0, 0, 0.5], - "52": [0, 0.65556, 0, 0, 0.5], - "53": [0, 0.65556, 0, 0, 0.5], - "54": [0, 0.65556, 0, 0, 0.5], - "55": [0, 0.65556, 0, 0, 0.5], - "56": [0, 0.65556, 0, 0, 0.5], - "57": [0, 0.65556, 0, 0, 0.5], - "58": [0, 0.44444, 0, 0, 0.27778], - "59": [0.125, 0.44444, 0, 0, 0.27778], - "61": [-0.13, 0.37, 0, 0, 0.77778], - "63": [0, 0.69444, 0, 0, 0.47222], - "64": [0, 0.69444, 0, 0, 0.66667], - "65": [0, 0.69444, 0, 0, 0.66667], - "66": [0, 0.69444, 0, 0, 0.66667], - "67": [0, 0.69444, 0, 0, 0.63889], - "68": [0, 0.69444, 0, 0, 0.72223], - "69": [0, 0.69444, 0, 0, 0.59722], - "70": [0, 0.69444, 0, 0, 0.56945], - "71": [0, 0.69444, 0, 0, 0.66667], - "72": [0, 0.69444, 0, 0, 0.70834], - "73": [0, 0.69444, 0, 0, 0.27778], - "74": [0, 0.69444, 0, 0, 0.47222], - "75": [0, 0.69444, 0, 0, 0.69445], - "76": [0, 0.69444, 0, 0, 0.54167], - "77": [0, 0.69444, 0, 0, 0.875], - "78": [0, 0.69444, 0, 0, 0.70834], - "79": [0, 0.69444, 0, 0, 0.73611], - "80": [0, 0.69444, 0, 0, 0.63889], - "81": [0.125, 0.69444, 0, 0, 0.73611], - "82": [0, 0.69444, 0, 0, 0.64584], - "83": [0, 0.69444, 0, 0, 0.55556], - "84": [0, 0.69444, 0, 0, 0.68056], - "85": [0, 0.69444, 0, 0, 0.6875], - "86": [0, 0.69444, 0.01389, 0, 0.66667], - "87": [0, 0.69444, 0.01389, 0, 0.94445], - "88": [0, 0.69444, 0, 0, 0.66667], - "89": [0, 0.69444, 0.025, 0, 0.66667], - "90": [0, 0.69444, 0, 0, 0.61111], - "91": [0.25, 0.75, 0, 0, 0.28889], - "93": [0.25, 0.75, 0, 0, 0.28889], - "94": [0, 0.69444, 0, 0, 0.5], - "95": [0.35, 0.09444, 0.02778, 0, 0.5], - "97": [0, 0.44444, 0, 0, 0.48056], - "98": [0, 0.69444, 0, 0, 0.51667], - "99": [0, 0.44444, 0, 0, 0.44445], - "100": [0, 0.69444, 0, 0, 0.51667], - "101": [0, 0.44444, 0, 0, 0.44445], - "102": [0, 0.69444, 0.06944, 0, 0.30556], - "103": [0.19444, 0.44444, 0.01389, 0, 0.5], - "104": [0, 0.69444, 0, 0, 0.51667], - "105": [0, 0.67937, 0, 0, 0.23889], - "106": [0.19444, 0.67937, 0, 0, 0.26667], - "107": [0, 0.69444, 0, 0, 0.48889], - "108": [0, 0.69444, 0, 0, 0.23889], - "109": [0, 0.44444, 0, 0, 0.79445], - "110": [0, 0.44444, 0, 0, 0.51667], - "111": [0, 0.44444, 0, 0, 0.5], - "112": [0.19444, 0.44444, 0, 0, 0.51667], - "113": [0.19444, 0.44444, 0, 0, 0.51667], - "114": [0, 0.44444, 0.01389, 0, 0.34167], - "115": [0, 0.44444, 0, 0, 0.38333], - "116": [0, 0.57143, 0, 0, 0.36111], - "117": [0, 0.44444, 0, 0, 0.51667], - "118": [0, 0.44444, 0.01389, 0, 0.46111], - "119": [0, 0.44444, 0.01389, 0, 0.68334], - "120": [0, 0.44444, 0, 0, 0.46111], - "121": [0.19444, 0.44444, 0.01389, 0, 0.46111], - "122": [0, 0.44444, 0, 0, 0.43472], - "126": [0.35, 0.32659, 0, 0, 0.5], - "160": [0, 0, 0, 0, 0.25], - "168": [0, 0.67937, 0, 0, 0.5], - "176": [0, 0.69444, 0, 0, 0.66667], - "184": [0.17014, 0, 0, 0, 0.44445], - "305": [0, 0.44444, 0, 0, 0.23889], - "567": [0.19444, 0.44444, 0, 0, 0.26667], - "710": [0, 0.69444, 0, 0, 0.5], - "711": [0, 0.63194, 0, 0, 0.5], - "713": [0, 0.60889, 0, 0, 0.5], - "714": [0, 0.69444, 0, 0, 0.5], - "715": [0, 0.69444, 0, 0, 0.5], - "728": [0, 0.69444, 0, 0, 0.5], - "729": [0, 0.67937, 0, 0, 0.27778], - "730": [0, 0.69444, 0, 0, 0.66667], - "732": [0, 0.67659, 0, 0, 0.5], - "733": [0, 0.69444, 0, 0, 0.5], - "915": [0, 0.69444, 0, 0, 0.54167], - "916": [0, 0.69444, 0, 0, 0.83334], - "920": [0, 0.69444, 0, 0, 0.77778], - "923": [0, 0.69444, 0, 0, 0.61111], - "926": [0, 0.69444, 0, 0, 0.66667], - "928": [0, 0.69444, 0, 0, 0.70834], - "931": [0, 0.69444, 0, 0, 0.72222], - "933": [0, 0.69444, 0, 0, 0.77778], - "934": [0, 0.69444, 0, 0, 0.72222], - "936": [0, 0.69444, 0, 0, 0.77778], - "937": [0, 0.69444, 0, 0, 0.72222], - "8211": [0, 0.44444, 0.02778, 0, 0.5], - "8212": [0, 0.44444, 0.02778, 0, 1.0], - "8216": [0, 0.69444, 0, 0, 0.27778], - "8217": [0, 0.69444, 0, 0, 0.27778], - "8220": [0, 0.69444, 0, 0, 0.5], - "8221": [0, 0.69444, 0, 0, 0.5] - }, - "Script-Regular": { - "32": [0, 0, 0, 0, 0.25], - "65": [0, 0.7, 0.22925, 0, 0.80253], - "66": [0, 0.7, 0.04087, 0, 0.90757], - "67": [0, 0.7, 0.1689, 0, 0.66619], - "68": [0, 0.7, 0.09371, 0, 0.77443], - "69": [0, 0.7, 0.18583, 0, 0.56162], - "70": [0, 0.7, 0.13634, 0, 0.89544], - "71": [0, 0.7, 0.17322, 0, 0.60961], - "72": [0, 0.7, 0.29694, 0, 0.96919], - "73": [0, 0.7, 0.19189, 0, 0.80907], - "74": [0.27778, 0.7, 0.19189, 0, 1.05159], - "75": [0, 0.7, 0.31259, 0, 0.91364], - "76": [0, 0.7, 0.19189, 0, 0.87373], - "77": [0, 0.7, 0.15981, 0, 1.08031], - "78": [0, 0.7, 0.3525, 0, 0.9015], - "79": [0, 0.7, 0.08078, 0, 0.73787], - "80": [0, 0.7, 0.08078, 0, 1.01262], - "81": [0, 0.7, 0.03305, 0, 0.88282], - "82": [0, 0.7, 0.06259, 0, 0.85], - "83": [0, 0.7, 0.19189, 0, 0.86767], - "84": [0, 0.7, 0.29087, 0, 0.74697], - "85": [0, 0.7, 0.25815, 0, 0.79996], - "86": [0, 0.7, 0.27523, 0, 0.62204], - "87": [0, 0.7, 0.27523, 0, 0.80532], - "88": [0, 0.7, 0.26006, 0, 0.94445], - "89": [0, 0.7, 0.2939, 0, 0.70961], - "90": [0, 0.7, 0.24037, 0, 0.8212], - "160": [0, 0, 0, 0, 0.25] - }, - "Size1-Regular": { - "32": [0, 0, 0, 0, 0.25], - "40": [0.35001, 0.85, 0, 0, 0.45834], - "41": [0.35001, 0.85, 0, 0, 0.45834], - "47": [0.35001, 0.85, 0, 0, 0.57778], - "91": [0.35001, 0.85, 0, 0, 0.41667], - "92": [0.35001, 0.85, 0, 0, 0.57778], - "93": [0.35001, 0.85, 0, 0, 0.41667], - "123": [0.35001, 0.85, 0, 0, 0.58334], - "125": [0.35001, 0.85, 0, 0, 0.58334], - "160": [0, 0, 0, 0, 0.25], - "710": [0, 0.72222, 0, 0, 0.55556], - "732": [0, 0.72222, 0, 0, 0.55556], - "770": [0, 0.72222, 0, 0, 0.55556], - "771": [0, 0.72222, 0, 0, 0.55556], - "8214": [-0.00099, 0.601, 0, 0, 0.77778], - "8593": [1e-05, 0.6, 0, 0, 0.66667], - "8595": [1e-05, 0.6, 0, 0, 0.66667], - "8657": [1e-05, 0.6, 0, 0, 0.77778], - "8659": [1e-05, 0.6, 0, 0, 0.77778], - "8719": [0.25001, 0.75, 0, 0, 0.94445], - "8720": [0.25001, 0.75, 0, 0, 0.94445], - "8721": [0.25001, 0.75, 0, 0, 1.05556], - "8730": [0.35001, 0.85, 0, 0, 1.0], - "8739": [-0.00599, 0.606, 0, 0, 0.33333], - "8741": [-0.00599, 0.606, 0, 0, 0.55556], - "8747": [0.30612, 0.805, 0.19445, 0, 0.47222], - "8748": [0.306, 0.805, 0.19445, 0, 0.47222], - "8749": [0.306, 0.805, 0.19445, 0, 0.47222], - "8750": [0.30612, 0.805, 0.19445, 0, 0.47222], - "8896": [0.25001, 0.75, 0, 0, 0.83334], - "8897": [0.25001, 0.75, 0, 0, 0.83334], - "8898": [0.25001, 0.75, 0, 0, 0.83334], - "8899": [0.25001, 0.75, 0, 0, 0.83334], - "8968": [0.35001, 0.85, 0, 0, 0.47222], - "8969": [0.35001, 0.85, 0, 0, 0.47222], - "8970": [0.35001, 0.85, 0, 0, 0.47222], - "8971": [0.35001, 0.85, 0, 0, 0.47222], - "9168": [-0.00099, 0.601, 0, 0, 0.66667], - "10216": [0.35001, 0.85, 0, 0, 0.47222], - "10217": [0.35001, 0.85, 0, 0, 0.47222], - "10752": [0.25001, 0.75, 0, 0, 1.11111], - "10753": [0.25001, 0.75, 0, 0, 1.11111], - "10754": [0.25001, 0.75, 0, 0, 1.11111], - "10756": [0.25001, 0.75, 0, 0, 0.83334], - "10758": [0.25001, 0.75, 0, 0, 0.83334] - }, - "Size2-Regular": { - "32": [0, 0, 0, 0, 0.25], - "40": [0.65002, 1.15, 0, 0, 0.59722], - "41": [0.65002, 1.15, 0, 0, 0.59722], - "47": [0.65002, 1.15, 0, 0, 0.81111], - "91": [0.65002, 1.15, 0, 0, 0.47222], - "92": [0.65002, 1.15, 0, 0, 0.81111], - "93": [0.65002, 1.15, 0, 0, 0.47222], - "123": [0.65002, 1.15, 0, 0, 0.66667], - "125": [0.65002, 1.15, 0, 0, 0.66667], - "160": [0, 0, 0, 0, 0.25], - "710": [0, 0.75, 0, 0, 1.0], - "732": [0, 0.75, 0, 0, 1.0], - "770": [0, 0.75, 0, 0, 1.0], - "771": [0, 0.75, 0, 0, 1.0], - "8719": [0.55001, 1.05, 0, 0, 1.27778], - "8720": [0.55001, 1.05, 0, 0, 1.27778], - "8721": [0.55001, 1.05, 0, 0, 1.44445], - "8730": [0.65002, 1.15, 0, 0, 1.0], - "8747": [0.86225, 1.36, 0.44445, 0, 0.55556], - "8748": [0.862, 1.36, 0.44445, 0, 0.55556], - "8749": [0.862, 1.36, 0.44445, 0, 0.55556], - "8750": [0.86225, 1.36, 0.44445, 0, 0.55556], - "8896": [0.55001, 1.05, 0, 0, 1.11111], - "8897": [0.55001, 1.05, 0, 0, 1.11111], - "8898": [0.55001, 1.05, 0, 0, 1.11111], - "8899": [0.55001, 1.05, 0, 0, 1.11111], - "8968": [0.65002, 1.15, 0, 0, 0.52778], - "8969": [0.65002, 1.15, 0, 0, 0.52778], - "8970": [0.65002, 1.15, 0, 0, 0.52778], - "8971": [0.65002, 1.15, 0, 0, 0.52778], - "10216": [0.65002, 1.15, 0, 0, 0.61111], - "10217": [0.65002, 1.15, 0, 0, 0.61111], - "10752": [0.55001, 1.05, 0, 0, 1.51112], - "10753": [0.55001, 1.05, 0, 0, 1.51112], - "10754": [0.55001, 1.05, 0, 0, 1.51112], - "10756": [0.55001, 1.05, 0, 0, 1.11111], - "10758": [0.55001, 1.05, 0, 0, 1.11111] - }, - "Size3-Regular": { - "32": [0, 0, 0, 0, 0.25], - "40": [0.95003, 1.45, 0, 0, 0.73611], - "41": [0.95003, 1.45, 0, 0, 0.73611], - "47": [0.95003, 1.45, 0, 0, 1.04445], - "91": [0.95003, 1.45, 0, 0, 0.52778], - "92": [0.95003, 1.45, 0, 0, 1.04445], - "93": [0.95003, 1.45, 0, 0, 0.52778], - "123": [0.95003, 1.45, 0, 0, 0.75], - "125": [0.95003, 1.45, 0, 0, 0.75], - "160": [0, 0, 0, 0, 0.25], - "710": [0, 0.75, 0, 0, 1.44445], - "732": [0, 0.75, 0, 0, 1.44445], - "770": [0, 0.75, 0, 0, 1.44445], - "771": [0, 0.75, 0, 0, 1.44445], - "8730": [0.95003, 1.45, 0, 0, 1.0], - "8968": [0.95003, 1.45, 0, 0, 0.58334], - "8969": [0.95003, 1.45, 0, 0, 0.58334], - "8970": [0.95003, 1.45, 0, 0, 0.58334], - "8971": [0.95003, 1.45, 0, 0, 0.58334], - "10216": [0.95003, 1.45, 0, 0, 0.75], - "10217": [0.95003, 1.45, 0, 0, 0.75] - }, - "Size4-Regular": { - "32": [0, 0, 0, 0, 0.25], - "40": [1.25003, 1.75, 0, 0, 0.79167], - "41": [1.25003, 1.75, 0, 0, 0.79167], - "47": [1.25003, 1.75, 0, 0, 1.27778], - "91": [1.25003, 1.75, 0, 0, 0.58334], - "92": [1.25003, 1.75, 0, 0, 1.27778], - "93": [1.25003, 1.75, 0, 0, 0.58334], - "123": [1.25003, 1.75, 0, 0, 0.80556], - "125": [1.25003, 1.75, 0, 0, 0.80556], - "160": [0, 0, 0, 0, 0.25], - "710": [0, 0.825, 0, 0, 1.8889], - "732": [0, 0.825, 0, 0, 1.8889], - "770": [0, 0.825, 0, 0, 1.8889], - "771": [0, 0.825, 0, 0, 1.8889], - "8730": [1.25003, 1.75, 0, 0, 1.0], - "8968": [1.25003, 1.75, 0, 0, 0.63889], - "8969": [1.25003, 1.75, 0, 0, 0.63889], - "8970": [1.25003, 1.75, 0, 0, 0.63889], - "8971": [1.25003, 1.75, 0, 0, 0.63889], - "9115": [0.64502, 1.155, 0, 0, 0.875], - "9116": [1e-05, 0.6, 0, 0, 0.875], - "9117": [0.64502, 1.155, 0, 0, 0.875], - "9118": [0.64502, 1.155, 0, 0, 0.875], - "9119": [1e-05, 0.6, 0, 0, 0.875], - "9120": [0.64502, 1.155, 0, 0, 0.875], - "9121": [0.64502, 1.155, 0, 0, 0.66667], - "9122": [-0.00099, 0.601, 0, 0, 0.66667], - "9123": [0.64502, 1.155, 0, 0, 0.66667], - "9124": [0.64502, 1.155, 0, 0, 0.66667], - "9125": [-0.00099, 0.601, 0, 0, 0.66667], - "9126": [0.64502, 1.155, 0, 0, 0.66667], - "9127": [1e-05, 0.9, 0, 0, 0.88889], - "9128": [0.65002, 1.15, 0, 0, 0.88889], - "9129": [0.90001, 0, 0, 0, 0.88889], - "9130": [0, 0.3, 0, 0, 0.88889], - "9131": [1e-05, 0.9, 0, 0, 0.88889], - "9132": [0.65002, 1.15, 0, 0, 0.88889], - "9133": [0.90001, 0, 0, 0, 0.88889], - "9143": [0.88502, 0.915, 0, 0, 1.05556], - "10216": [1.25003, 1.75, 0, 0, 0.80556], - "10217": [1.25003, 1.75, 0, 0, 0.80556], - "57344": [-0.00499, 0.605, 0, 0, 1.05556], - "57345": [-0.00499, 0.605, 0, 0, 1.05556], - "57680": [0, 0.12, 0, 0, 0.45], - "57681": [0, 0.12, 0, 0, 0.45], - "57682": [0, 0.12, 0, 0, 0.45], - "57683": [0, 0.12, 0, 0, 0.45] - }, - "Typewriter-Regular": { - "32": [0, 0, 0, 0, 0.525], - "33": [0, 0.61111, 0, 0, 0.525], - "34": [0, 0.61111, 0, 0, 0.525], - "35": [0, 0.61111, 0, 0, 0.525], - "36": [0.08333, 0.69444, 0, 0, 0.525], - "37": [0.08333, 0.69444, 0, 0, 0.525], - "38": [0, 0.61111, 0, 0, 0.525], - "39": [0, 0.61111, 0, 0, 0.525], - "40": [0.08333, 0.69444, 0, 0, 0.525], - "41": [0.08333, 0.69444, 0, 0, 0.525], - "42": [0, 0.52083, 0, 0, 0.525], - "43": [-0.08056, 0.53055, 0, 0, 0.525], - "44": [0.13889, 0.125, 0, 0, 0.525], - "45": [-0.08056, 0.53055, 0, 0, 0.525], - "46": [0, 0.125, 0, 0, 0.525], - "47": [0.08333, 0.69444, 0, 0, 0.525], - "48": [0, 0.61111, 0, 0, 0.525], - "49": [0, 0.61111, 0, 0, 0.525], - "50": [0, 0.61111, 0, 0, 0.525], - "51": [0, 0.61111, 0, 0, 0.525], - "52": [0, 0.61111, 0, 0, 0.525], - "53": [0, 0.61111, 0, 0, 0.525], - "54": [0, 0.61111, 0, 0, 0.525], - "55": [0, 0.61111, 0, 0, 0.525], - "56": [0, 0.61111, 0, 0, 0.525], - "57": [0, 0.61111, 0, 0, 0.525], - "58": [0, 0.43056, 0, 0, 0.525], - "59": [0.13889, 0.43056, 0, 0, 0.525], - "60": [-0.05556, 0.55556, 0, 0, 0.525], - "61": [-0.19549, 0.41562, 0, 0, 0.525], - "62": [-0.05556, 0.55556, 0, 0, 0.525], - "63": [0, 0.61111, 0, 0, 0.525], - "64": [0, 0.61111, 0, 0, 0.525], - "65": [0, 0.61111, 0, 0, 0.525], - "66": [0, 0.61111, 0, 0, 0.525], - "67": [0, 0.61111, 0, 0, 0.525], - "68": [0, 0.61111, 0, 0, 0.525], - "69": [0, 0.61111, 0, 0, 0.525], - "70": [0, 0.61111, 0, 0, 0.525], - "71": [0, 0.61111, 0, 0, 0.525], - "72": [0, 0.61111, 0, 0, 0.525], - "73": [0, 0.61111, 0, 0, 0.525], - "74": [0, 0.61111, 0, 0, 0.525], - "75": [0, 0.61111, 0, 0, 0.525], - "76": [0, 0.61111, 0, 0, 0.525], - "77": [0, 0.61111, 0, 0, 0.525], - "78": [0, 0.61111, 0, 0, 0.525], - "79": [0, 0.61111, 0, 0, 0.525], - "80": [0, 0.61111, 0, 0, 0.525], - "81": [0.13889, 0.61111, 0, 0, 0.525], - "82": [0, 0.61111, 0, 0, 0.525], - "83": [0, 0.61111, 0, 0, 0.525], - "84": [0, 0.61111, 0, 0, 0.525], - "85": [0, 0.61111, 0, 0, 0.525], - "86": [0, 0.61111, 0, 0, 0.525], - "87": [0, 0.61111, 0, 0, 0.525], - "88": [0, 0.61111, 0, 0, 0.525], - "89": [0, 0.61111, 0, 0, 0.525], - "90": [0, 0.61111, 0, 0, 0.525], - "91": [0.08333, 0.69444, 0, 0, 0.525], - "92": [0.08333, 0.69444, 0, 0, 0.525], - "93": [0.08333, 0.69444, 0, 0, 0.525], - "94": [0, 0.61111, 0, 0, 0.525], - "95": [0.09514, 0, 0, 0, 0.525], - "96": [0, 0.61111, 0, 0, 0.525], - "97": [0, 0.43056, 0, 0, 0.525], - "98": [0, 0.61111, 0, 0, 0.525], - "99": [0, 0.43056, 0, 0, 0.525], - "100": [0, 0.61111, 0, 0, 0.525], - "101": [0, 0.43056, 0, 0, 0.525], - "102": [0, 0.61111, 0, 0, 0.525], - "103": [0.22222, 0.43056, 0, 0, 0.525], - "104": [0, 0.61111, 0, 0, 0.525], - "105": [0, 0.61111, 0, 0, 0.525], - "106": [0.22222, 0.61111, 0, 0, 0.525], - "107": [0, 0.61111, 0, 0, 0.525], - "108": [0, 0.61111, 0, 0, 0.525], - "109": [0, 0.43056, 0, 0, 0.525], - "110": [0, 0.43056, 0, 0, 0.525], - "111": [0, 0.43056, 0, 0, 0.525], - "112": [0.22222, 0.43056, 0, 0, 0.525], - "113": [0.22222, 0.43056, 0, 0, 0.525], - "114": [0, 0.43056, 0, 0, 0.525], - "115": [0, 0.43056, 0, 0, 0.525], - "116": [0, 0.55358, 0, 0, 0.525], - "117": [0, 0.43056, 0, 0, 0.525], - "118": [0, 0.43056, 0, 0, 0.525], - "119": [0, 0.43056, 0, 0, 0.525], - "120": [0, 0.43056, 0, 0, 0.525], - "121": [0.22222, 0.43056, 0, 0, 0.525], - "122": [0, 0.43056, 0, 0, 0.525], - "123": [0.08333, 0.69444, 0, 0, 0.525], - "124": [0.08333, 0.69444, 0, 0, 0.525], - "125": [0.08333, 0.69444, 0, 0, 0.525], - "126": [0, 0.61111, 0, 0, 0.525], - "127": [0, 0.61111, 0, 0, 0.525], - "160": [0, 0, 0, 0, 0.525], - "176": [0, 0.61111, 0, 0, 0.525], - "184": [0.19445, 0, 0, 0, 0.525], - "305": [0, 0.43056, 0, 0, 0.525], - "567": [0.22222, 0.43056, 0, 0, 0.525], - "711": [0, 0.56597, 0, 0, 0.525], - "713": [0, 0.56555, 0, 0, 0.525], - "714": [0, 0.61111, 0, 0, 0.525], - "715": [0, 0.61111, 0, 0, 0.525], - "728": [0, 0.61111, 0, 0, 0.525], - "730": [0, 0.61111, 0, 0, 0.525], - "770": [0, 0.61111, 0, 0, 0.525], - "771": [0, 0.61111, 0, 0, 0.525], - "776": [0, 0.61111, 0, 0, 0.525], - "915": [0, 0.61111, 0, 0, 0.525], - "916": [0, 0.61111, 0, 0, 0.525], - "920": [0, 0.61111, 0, 0, 0.525], - "923": [0, 0.61111, 0, 0, 0.525], - "926": [0, 0.61111, 0, 0, 0.525], - "928": [0, 0.61111, 0, 0, 0.525], - "931": [0, 0.61111, 0, 0, 0.525], - "933": [0, 0.61111, 0, 0, 0.525], - "934": [0, 0.61111, 0, 0, 0.525], - "936": [0, 0.61111, 0, 0, 0.525], - "937": [0, 0.61111, 0, 0, 0.525], - "8216": [0, 0.61111, 0, 0, 0.525], - "8217": [0, 0.61111, 0, 0, 0.525], - "8242": [0, 0.61111, 0, 0, 0.525], - "9251": [0.11111, 0.21944, 0, 0, 0.525] - } -}); -// CONCATENATED MODULE: ./src/fontMetrics.js - - -/** - * This file contains metrics regarding fonts and individual symbols. The sigma - * and xi variables, as well as the metricMap map contain data extracted from - * TeX, TeX font metrics, and the TTF files. These data are then exposed via the - * `metrics` variable and the getCharacterMetrics function. - */ -// In TeX, there are actually three sets of dimensions, one for each of -// textstyle (size index 5 and higher: >=9pt), scriptstyle (size index 3 and 4: -// 7-8pt), and scriptscriptstyle (size index 1 and 2: 5-6pt). These are -// provided in the the arrays below, in that order. -// -// The font metrics are stored in fonts cmsy10, cmsy7, and cmsy5 respsectively. -// This was determined by running the following script: -// -// latex -interaction=nonstopmode \ -// '\documentclass{article}\usepackage{amsmath}\begin{document}' \ -// '$a$ \expandafter\show\the\textfont2' \ -// '\expandafter\show\the\scriptfont2' \ -// '\expandafter\show\the\scriptscriptfont2' \ -// '\stop' -// -// The metrics themselves were retreived using the following commands: -// -// tftopl cmsy10 -// tftopl cmsy7 -// tftopl cmsy5 -// -// The output of each of these commands is quite lengthy. The only part we -// care about is the FONTDIMEN section. Each value is measured in EMs. -var sigmasAndXis = { - slant: [0.250, 0.250, 0.250], - // sigma1 - space: [0.000, 0.000, 0.000], - // sigma2 - stretch: [0.000, 0.000, 0.000], - // sigma3 - shrink: [0.000, 0.000, 0.000], - // sigma4 - xHeight: [0.431, 0.431, 0.431], - // sigma5 - quad: [1.000, 1.171, 1.472], - // sigma6 - extraSpace: [0.000, 0.000, 0.000], - // sigma7 - num1: [0.677, 0.732, 0.925], - // sigma8 - num2: [0.394, 0.384, 0.387], - // sigma9 - num3: [0.444, 0.471, 0.504], - // sigma10 - denom1: [0.686, 0.752, 1.025], - // sigma11 - denom2: [0.345, 0.344, 0.532], - // sigma12 - sup1: [0.413, 0.503, 0.504], - // sigma13 - sup2: [0.363, 0.431, 0.404], - // sigma14 - sup3: [0.289, 0.286, 0.294], - // sigma15 - sub1: [0.150, 0.143, 0.200], - // sigma16 - sub2: [0.247, 0.286, 0.400], - // sigma17 - supDrop: [0.386, 0.353, 0.494], - // sigma18 - subDrop: [0.050, 0.071, 0.100], - // sigma19 - delim1: [2.390, 1.700, 1.980], - // sigma20 - delim2: [1.010, 1.157, 1.420], - // sigma21 - axisHeight: [0.250, 0.250, 0.250], - // sigma22 - // These font metrics are extracted from TeX by using tftopl on cmex10.tfm; - // they correspond to the font parameters of the extension fonts (family 3). - // See the TeXbook, page 441. In AMSTeX, the extension fonts scale; to - // match cmex7, we'd use cmex7.tfm values for script and scriptscript - // values. - defaultRuleThickness: [0.04, 0.049, 0.049], - // xi8; cmex7: 0.049 - bigOpSpacing1: [0.111, 0.111, 0.111], - // xi9 - bigOpSpacing2: [0.166, 0.166, 0.166], - // xi10 - bigOpSpacing3: [0.2, 0.2, 0.2], - // xi11 - bigOpSpacing4: [0.6, 0.611, 0.611], - // xi12; cmex7: 0.611 - bigOpSpacing5: [0.1, 0.143, 0.143], - // xi13; cmex7: 0.143 - // The \sqrt rule width is taken from the height of the surd character. - // Since we use the same font at all sizes, this thickness doesn't scale. - sqrtRuleThickness: [0.04, 0.04, 0.04], - // This value determines how large a pt is, for metrics which are defined - // in terms of pts. - // This value is also used in katex.less; if you change it make sure the - // values match. - ptPerEm: [10.0, 10.0, 10.0], - // The space between adjacent `|` columns in an array definition. From - // `\showthe\doublerulesep` in LaTeX. Equals 2.0 / ptPerEm. - doubleRuleSep: [0.2, 0.2, 0.2], - // The width of separator lines in {array} environments. From - // `\showthe\arrayrulewidth` in LaTeX. Equals 0.4 / ptPerEm. - arrayRuleWidth: [0.04, 0.04, 0.04], - // Two values from LaTeX source2e: - fboxsep: [0.3, 0.3, 0.3], - // 3 pt / ptPerEm - fboxrule: [0.04, 0.04, 0.04] // 0.4 pt / ptPerEm - -}; // This map contains a mapping from font name and character code to character -// metrics, including height, depth, italic correction, and skew (kern from the -// character to the corresponding \skewchar) -// This map is generated via `make metrics`. It should not be changed manually. - - // These are very rough approximations. We default to Times New Roman which -// should have Latin-1 and Cyrillic characters, but may not depending on the -// operating system. The metrics do not account for extra height from the -// accents. In the case of Cyrillic characters which have both ascenders and -// descenders we prefer approximations with ascenders, primarily to prevent -// the fraction bar or root line from intersecting the glyph. -// TODO(kevinb) allow union of multiple glyph metrics for better accuracy. - -var extraCharacterMap = { - // Latin-1 - 'Å': 'A', - 'Ç': 'C', - 'Ð': 'D', - 'Þ': 'o', - 'å': 'a', - 'ç': 'c', - 'ð': 'd', - 'þ': 'o', - // Cyrillic - 'А': 'A', - 'Б': 'B', - 'В': 'B', - 'Г': 'F', - 'Д': 'A', - 'Е': 'E', - 'Ж': 'K', - 'З': '3', - 'И': 'N', - 'Й': 'N', - 'К': 'K', - 'Л': 'N', - 'М': 'M', - 'Н': 'H', - 'О': 'O', - 'П': 'N', - 'Р': 'P', - 'С': 'C', - 'Т': 'T', - 'У': 'y', - 'Ф': 'O', - 'Х': 'X', - 'Ц': 'U', - 'Ч': 'h', - 'Ш': 'W', - 'Щ': 'W', - 'Ъ': 'B', - 'Ы': 'X', - 'Ь': 'B', - 'Э': '3', - 'Ю': 'X', - 'Я': 'R', - 'а': 'a', - 'б': 'b', - 'в': 'a', - 'г': 'r', - 'д': 'y', - 'е': 'e', - 'ж': 'm', - 'з': 'e', - 'и': 'n', - 'й': 'n', - 'к': 'n', - 'л': 'n', - 'м': 'm', - 'н': 'n', - 'о': 'o', - 'п': 'n', - 'р': 'p', - 'с': 'c', - 'т': 'o', - 'у': 'y', - 'ф': 'b', - 'х': 'x', - 'ц': 'n', - 'ч': 'n', - 'ш': 'w', - 'щ': 'w', - 'ъ': 'a', - 'ы': 'm', - 'ь': 'a', - 'э': 'e', - 'ю': 'm', - 'я': 'r' -}; - -/** - * This function adds new font metrics to default metricMap - * It can also override existing metrics - */ -function setFontMetrics(fontName, metrics) { - fontMetricsData[fontName] = metrics; -} -/** - * This function is a convenience function for looking up information in the - * metricMap table. It takes a character as a string, and a font. - * - * Note: the `width` property may be undefined if fontMetricsData.js wasn't - * built using `Make extended_metrics`. - */ - -function getCharacterMetrics(character, font, mode) { - if (!fontMetricsData[font]) { - throw new Error("Font metrics not found for font: " + font + "."); - } - - var ch = character.charCodeAt(0); - var metrics = fontMetricsData[font][ch]; - - if (!metrics && character[0] in extraCharacterMap) { - ch = extraCharacterMap[character[0]].charCodeAt(0); - metrics = fontMetricsData[font][ch]; - } - - if (!metrics && mode === 'text') { - // We don't typically have font metrics for Asian scripts. - // But since we support them in text mode, we need to return - // some sort of metrics. - // So if the character is in a script we support but we - // don't have metrics for it, just use the metrics for - // the Latin capital letter M. This is close enough because - // we (currently) only care about the height of the glpyh - // not its width. - if (supportedCodepoint(ch)) { - metrics = fontMetricsData[font][77]; // 77 is the charcode for 'M' - } - } - - if (metrics) { - return { - depth: metrics[0], - height: metrics[1], - italic: metrics[2], - skew: metrics[3], - width: metrics[4] - }; - } -} -var fontMetricsBySizeIndex = {}; -/** - * Get the font metrics for a given size. - */ - -function getGlobalMetrics(size) { - var sizeIndex; - - if (size >= 5) { - sizeIndex = 0; - } else if (size >= 3) { - sizeIndex = 1; - } else { - sizeIndex = 2; - } - - if (!fontMetricsBySizeIndex[sizeIndex]) { - var metrics = fontMetricsBySizeIndex[sizeIndex] = { - cssEmPerMu: sigmasAndXis.quad[sizeIndex] / 18 - }; - - for (var key in sigmasAndXis) { - if (sigmasAndXis.hasOwnProperty(key)) { - metrics[key] = sigmasAndXis[key][sizeIndex]; - } - } - } - - return fontMetricsBySizeIndex[sizeIndex]; -} -// CONCATENATED MODULE: ./src/symbols.js -/** - * This file holds a list of all no-argument functions and single-character - * symbols (like 'a' or ';'). - * - * For each of the symbols, there are three properties they can have: - * - font (required): the font to be used for this symbol. Either "main" (the - normal font), or "ams" (the ams fonts). - * - group (required): the ParseNode group type the symbol should have (i.e. - "textord", "mathord", etc). - See https://github.com/KaTeX/KaTeX/wiki/Examining-TeX#group-types - * - replace: the character that this symbol or function should be - * replaced with (i.e. "\phi" has a replace value of "\u03d5", the phi - * character in the main font). - * - * The outermost map in the table indicates what mode the symbols should be - * accepted in (e.g. "math" or "text"). - */ -// Some of these have a "-token" suffix since these are also used as `ParseNode` -// types for raw text tokens, and we want to avoid conflicts with higher-level -// `ParseNode` types. These `ParseNode`s are constructed within `Parser` by -// looking up the `symbols` map. -var ATOMS = { - "bin": 1, - "close": 1, - "inner": 1, - "open": 1, - "punct": 1, - "rel": 1 -}; -var NON_ATOMS = { - "accent-token": 1, - "mathord": 1, - "op-token": 1, - "spacing": 1, - "textord": 1 -}; -var symbols = { - "math": {}, - "text": {} -}; -/* harmony default export */ var src_symbols = (symbols); -/** `acceptUnicodeChar = true` is only applicable if `replace` is set. */ - -function defineSymbol(mode, font, group, replace, name, acceptUnicodeChar) { - symbols[mode][name] = { - font: font, - group: group, - replace: replace - }; - - if (acceptUnicodeChar && replace) { - symbols[mode][replace] = symbols[mode][name]; - } -} // Some abbreviations for commonly used strings. -// This helps minify the code, and also spotting typos using jshint. -// modes: - -var symbols_math = "math"; -var symbols_text = "text"; // fonts: - -var main = "main"; -var ams = "ams"; // groups: - -var symbols_accent = "accent-token"; -var bin = "bin"; -var symbols_close = "close"; -var symbols_inner = "inner"; -var mathord = "mathord"; -var op = "op-token"; -var symbols_open = "open"; -var punct = "punct"; -var rel = "rel"; -var symbols_spacing = "spacing"; -var symbols_textord = "textord"; // Now comes the symbol table -// Relation Symbols - -defineSymbol(symbols_math, main, rel, "\u2261", "\\equiv", true); -defineSymbol(symbols_math, main, rel, "\u227A", "\\prec", true); -defineSymbol(symbols_math, main, rel, "\u227B", "\\succ", true); -defineSymbol(symbols_math, main, rel, "\u223C", "\\sim", true); -defineSymbol(symbols_math, main, rel, "\u22A5", "\\perp"); -defineSymbol(symbols_math, main, rel, "\u2AAF", "\\preceq", true); -defineSymbol(symbols_math, main, rel, "\u2AB0", "\\succeq", true); -defineSymbol(symbols_math, main, rel, "\u2243", "\\simeq", true); -defineSymbol(symbols_math, main, rel, "\u2223", "\\mid", true); -defineSymbol(symbols_math, main, rel, "\u226A", "\\ll", true); -defineSymbol(symbols_math, main, rel, "\u226B", "\\gg", true); -defineSymbol(symbols_math, main, rel, "\u224D", "\\asymp", true); -defineSymbol(symbols_math, main, rel, "\u2225", "\\parallel"); -defineSymbol(symbols_math, main, rel, "\u22C8", "\\bowtie", true); -defineSymbol(symbols_math, main, rel, "\u2323", "\\smile", true); -defineSymbol(symbols_math, main, rel, "\u2291", "\\sqsubseteq", true); -defineSymbol(symbols_math, main, rel, "\u2292", "\\sqsupseteq", true); -defineSymbol(symbols_math, main, rel, "\u2250", "\\doteq", true); -defineSymbol(symbols_math, main, rel, "\u2322", "\\frown", true); -defineSymbol(symbols_math, main, rel, "\u220B", "\\ni", true); -defineSymbol(symbols_math, main, rel, "\u221D", "\\propto", true); -defineSymbol(symbols_math, main, rel, "\u22A2", "\\vdash", true); -defineSymbol(symbols_math, main, rel, "\u22A3", "\\dashv", true); -defineSymbol(symbols_math, main, rel, "\u220B", "\\owns"); // Punctuation - -defineSymbol(symbols_math, main, punct, ".", "\\ldotp"); -defineSymbol(symbols_math, main, punct, "\u22C5", "\\cdotp"); // Misc Symbols - -defineSymbol(symbols_math, main, symbols_textord, "#", "\\#"); -defineSymbol(symbols_text, main, symbols_textord, "#", "\\#"); -defineSymbol(symbols_math, main, symbols_textord, "&", "\\&"); -defineSymbol(symbols_text, main, symbols_textord, "&", "\\&"); -defineSymbol(symbols_math, main, symbols_textord, "\u2135", "\\aleph", true); -defineSymbol(symbols_math, main, symbols_textord, "\u2200", "\\forall", true); -defineSymbol(symbols_math, main, symbols_textord, "\u210F", "\\hbar", true); -defineSymbol(symbols_math, main, symbols_textord, "\u2203", "\\exists", true); -defineSymbol(symbols_math, main, symbols_textord, "\u2207", "\\nabla", true); -defineSymbol(symbols_math, main, symbols_textord, "\u266D", "\\flat", true); -defineSymbol(symbols_math, main, symbols_textord, "\u2113", "\\ell", true); -defineSymbol(symbols_math, main, symbols_textord, "\u266E", "\\natural", true); -defineSymbol(symbols_math, main, symbols_textord, "\u2663", "\\clubsuit", true); -defineSymbol(symbols_math, main, symbols_textord, "\u2118", "\\wp", true); -defineSymbol(symbols_math, main, symbols_textord, "\u266F", "\\sharp", true); -defineSymbol(symbols_math, main, symbols_textord, "\u2662", "\\diamondsuit", true); -defineSymbol(symbols_math, main, symbols_textord, "\u211C", "\\Re", true); -defineSymbol(symbols_math, main, symbols_textord, "\u2661", "\\heartsuit", true); -defineSymbol(symbols_math, main, symbols_textord, "\u2111", "\\Im", true); -defineSymbol(symbols_math, main, symbols_textord, "\u2660", "\\spadesuit", true); -defineSymbol(symbols_text, main, symbols_textord, "\xA7", "\\S", true); -defineSymbol(symbols_text, main, symbols_textord, "\xB6", "\\P", true); // Math and Text - -defineSymbol(symbols_math, main, symbols_textord, "\u2020", "\\dag"); -defineSymbol(symbols_text, main, symbols_textord, "\u2020", "\\dag"); -defineSymbol(symbols_text, main, symbols_textord, "\u2020", "\\textdagger"); -defineSymbol(symbols_math, main, symbols_textord, "\u2021", "\\ddag"); -defineSymbol(symbols_text, main, symbols_textord, "\u2021", "\\ddag"); -defineSymbol(symbols_text, main, symbols_textord, "\u2021", "\\textdaggerdbl"); // Large Delimiters - -defineSymbol(symbols_math, main, symbols_close, "\u23B1", "\\rmoustache", true); -defineSymbol(symbols_math, main, symbols_open, "\u23B0", "\\lmoustache", true); -defineSymbol(symbols_math, main, symbols_close, "\u27EF", "\\rgroup", true); -defineSymbol(symbols_math, main, symbols_open, "\u27EE", "\\lgroup", true); // Binary Operators - -defineSymbol(symbols_math, main, bin, "\u2213", "\\mp", true); -defineSymbol(symbols_math, main, bin, "\u2296", "\\ominus", true); -defineSymbol(symbols_math, main, bin, "\u228E", "\\uplus", true); -defineSymbol(symbols_math, main, bin, "\u2293", "\\sqcap", true); -defineSymbol(symbols_math, main, bin, "\u2217", "\\ast"); -defineSymbol(symbols_math, main, bin, "\u2294", "\\sqcup", true); -defineSymbol(symbols_math, main, bin, "\u25EF", "\\bigcirc"); -defineSymbol(symbols_math, main, bin, "\u2219", "\\bullet"); -defineSymbol(symbols_math, main, bin, "\u2021", "\\ddagger"); -defineSymbol(symbols_math, main, bin, "\u2240", "\\wr", true); -defineSymbol(symbols_math, main, bin, "\u2A3F", "\\amalg"); -defineSymbol(symbols_math, main, bin, "&", "\\And"); // from amsmath -// Arrow Symbols - -defineSymbol(symbols_math, main, rel, "\u27F5", "\\longleftarrow", true); -defineSymbol(symbols_math, main, rel, "\u21D0", "\\Leftarrow", true); -defineSymbol(symbols_math, main, rel, "\u27F8", "\\Longleftarrow", true); -defineSymbol(symbols_math, main, rel, "\u27F6", "\\longrightarrow", true); -defineSymbol(symbols_math, main, rel, "\u21D2", "\\Rightarrow", true); -defineSymbol(symbols_math, main, rel, "\u27F9", "\\Longrightarrow", true); -defineSymbol(symbols_math, main, rel, "\u2194", "\\leftrightarrow", true); -defineSymbol(symbols_math, main, rel, "\u27F7", "\\longleftrightarrow", true); -defineSymbol(symbols_math, main, rel, "\u21D4", "\\Leftrightarrow", true); -defineSymbol(symbols_math, main, rel, "\u27FA", "\\Longleftrightarrow", true); -defineSymbol(symbols_math, main, rel, "\u21A6", "\\mapsto", true); -defineSymbol(symbols_math, main, rel, "\u27FC", "\\longmapsto", true); -defineSymbol(symbols_math, main, rel, "\u2197", "\\nearrow", true); -defineSymbol(symbols_math, main, rel, "\u21A9", "\\hookleftarrow", true); -defineSymbol(symbols_math, main, rel, "\u21AA", "\\hookrightarrow", true); -defineSymbol(symbols_math, main, rel, "\u2198", "\\searrow", true); -defineSymbol(symbols_math, main, rel, "\u21BC", "\\leftharpoonup", true); -defineSymbol(symbols_math, main, rel, "\u21C0", "\\rightharpoonup", true); -defineSymbol(symbols_math, main, rel, "\u2199", "\\swarrow", true); -defineSymbol(symbols_math, main, rel, "\u21BD", "\\leftharpoondown", true); -defineSymbol(symbols_math, main, rel, "\u21C1", "\\rightharpoondown", true); -defineSymbol(symbols_math, main, rel, "\u2196", "\\nwarrow", true); -defineSymbol(symbols_math, main, rel, "\u21CC", "\\rightleftharpoons", true); // AMS Negated Binary Relations - -defineSymbol(symbols_math, ams, rel, "\u226E", "\\nless", true); // Symbol names preceeded by "@" each have a corresponding macro. - -defineSymbol(symbols_math, ams, rel, "\uE010", "\\@nleqslant"); -defineSymbol(symbols_math, ams, rel, "\uE011", "\\@nleqq"); -defineSymbol(symbols_math, ams, rel, "\u2A87", "\\lneq", true); -defineSymbol(symbols_math, ams, rel, "\u2268", "\\lneqq", true); -defineSymbol(symbols_math, ams, rel, "\uE00C", "\\@lvertneqq"); -defineSymbol(symbols_math, ams, rel, "\u22E6", "\\lnsim", true); -defineSymbol(symbols_math, ams, rel, "\u2A89", "\\lnapprox", true); -defineSymbol(symbols_math, ams, rel, "\u2280", "\\nprec", true); // unicode-math maps \u22e0 to \npreccurlyeq. We'll use the AMS synonym. - -defineSymbol(symbols_math, ams, rel, "\u22E0", "\\npreceq", true); -defineSymbol(symbols_math, ams, rel, "\u22E8", "\\precnsim", true); -defineSymbol(symbols_math, ams, rel, "\u2AB9", "\\precnapprox", true); -defineSymbol(symbols_math, ams, rel, "\u2241", "\\nsim", true); -defineSymbol(symbols_math, ams, rel, "\uE006", "\\@nshortmid"); -defineSymbol(symbols_math, ams, rel, "\u2224", "\\nmid", true); -defineSymbol(symbols_math, ams, rel, "\u22AC", "\\nvdash", true); -defineSymbol(symbols_math, ams, rel, "\u22AD", "\\nvDash", true); -defineSymbol(symbols_math, ams, rel, "\u22EA", "\\ntriangleleft"); -defineSymbol(symbols_math, ams, rel, "\u22EC", "\\ntrianglelefteq", true); -defineSymbol(symbols_math, ams, rel, "\u228A", "\\subsetneq", true); -defineSymbol(symbols_math, ams, rel, "\uE01A", "\\@varsubsetneq"); -defineSymbol(symbols_math, ams, rel, "\u2ACB", "\\subsetneqq", true); -defineSymbol(symbols_math, ams, rel, "\uE017", "\\@varsubsetneqq"); -defineSymbol(symbols_math, ams, rel, "\u226F", "\\ngtr", true); -defineSymbol(symbols_math, ams, rel, "\uE00F", "\\@ngeqslant"); -defineSymbol(symbols_math, ams, rel, "\uE00E", "\\@ngeqq"); -defineSymbol(symbols_math, ams, rel, "\u2A88", "\\gneq", true); -defineSymbol(symbols_math, ams, rel, "\u2269", "\\gneqq", true); -defineSymbol(symbols_math, ams, rel, "\uE00D", "\\@gvertneqq"); -defineSymbol(symbols_math, ams, rel, "\u22E7", "\\gnsim", true); -defineSymbol(symbols_math, ams, rel, "\u2A8A", "\\gnapprox", true); -defineSymbol(symbols_math, ams, rel, "\u2281", "\\nsucc", true); // unicode-math maps \u22e1 to \nsucccurlyeq. We'll use the AMS synonym. - -defineSymbol(symbols_math, ams, rel, "\u22E1", "\\nsucceq", true); -defineSymbol(symbols_math, ams, rel, "\u22E9", "\\succnsim", true); -defineSymbol(symbols_math, ams, rel, "\u2ABA", "\\succnapprox", true); // unicode-math maps \u2246 to \simneqq. We'll use the AMS synonym. - -defineSymbol(symbols_math, ams, rel, "\u2246", "\\ncong", true); -defineSymbol(symbols_math, ams, rel, "\uE007", "\\@nshortparallel"); -defineSymbol(symbols_math, ams, rel, "\u2226", "\\nparallel", true); -defineSymbol(symbols_math, ams, rel, "\u22AF", "\\nVDash", true); -defineSymbol(symbols_math, ams, rel, "\u22EB", "\\ntriangleright"); -defineSymbol(symbols_math, ams, rel, "\u22ED", "\\ntrianglerighteq", true); -defineSymbol(symbols_math, ams, rel, "\uE018", "\\@nsupseteqq"); -defineSymbol(symbols_math, ams, rel, "\u228B", "\\supsetneq", true); -defineSymbol(symbols_math, ams, rel, "\uE01B", "\\@varsupsetneq"); -defineSymbol(symbols_math, ams, rel, "\u2ACC", "\\supsetneqq", true); -defineSymbol(symbols_math, ams, rel, "\uE019", "\\@varsupsetneqq"); -defineSymbol(symbols_math, ams, rel, "\u22AE", "\\nVdash", true); -defineSymbol(symbols_math, ams, rel, "\u2AB5", "\\precneqq", true); -defineSymbol(symbols_math, ams, rel, "\u2AB6", "\\succneqq", true); -defineSymbol(symbols_math, ams, rel, "\uE016", "\\@nsubseteqq"); -defineSymbol(symbols_math, ams, bin, "\u22B4", "\\unlhd"); -defineSymbol(symbols_math, ams, bin, "\u22B5", "\\unrhd"); // AMS Negated Arrows - -defineSymbol(symbols_math, ams, rel, "\u219A", "\\nleftarrow", true); -defineSymbol(symbols_math, ams, rel, "\u219B", "\\nrightarrow", true); -defineSymbol(symbols_math, ams, rel, "\u21CD", "\\nLeftarrow", true); -defineSymbol(symbols_math, ams, rel, "\u21CF", "\\nRightarrow", true); -defineSymbol(symbols_math, ams, rel, "\u21AE", "\\nleftrightarrow", true); -defineSymbol(symbols_math, ams, rel, "\u21CE", "\\nLeftrightarrow", true); // AMS Misc - -defineSymbol(symbols_math, ams, rel, "\u25B3", "\\vartriangle"); -defineSymbol(symbols_math, ams, symbols_textord, "\u210F", "\\hslash"); -defineSymbol(symbols_math, ams, symbols_textord, "\u25BD", "\\triangledown"); -defineSymbol(symbols_math, ams, symbols_textord, "\u25CA", "\\lozenge"); -defineSymbol(symbols_math, ams, symbols_textord, "\u24C8", "\\circledS"); -defineSymbol(symbols_math, ams, symbols_textord, "\xAE", "\\circledR"); -defineSymbol(symbols_text, ams, symbols_textord, "\xAE", "\\circledR"); -defineSymbol(symbols_math, ams, symbols_textord, "\u2221", "\\measuredangle", true); -defineSymbol(symbols_math, ams, symbols_textord, "\u2204", "\\nexists"); -defineSymbol(symbols_math, ams, symbols_textord, "\u2127", "\\mho"); -defineSymbol(symbols_math, ams, symbols_textord, "\u2132", "\\Finv", true); -defineSymbol(symbols_math, ams, symbols_textord, "\u2141", "\\Game", true); -defineSymbol(symbols_math, ams, symbols_textord, "\u2035", "\\backprime"); -defineSymbol(symbols_math, ams, symbols_textord, "\u25B2", "\\blacktriangle"); -defineSymbol(symbols_math, ams, symbols_textord, "\u25BC", "\\blacktriangledown"); -defineSymbol(symbols_math, ams, symbols_textord, "\u25A0", "\\blacksquare"); -defineSymbol(symbols_math, ams, symbols_textord, "\u29EB", "\\blacklozenge"); -defineSymbol(symbols_math, ams, symbols_textord, "\u2605", "\\bigstar"); -defineSymbol(symbols_math, ams, symbols_textord, "\u2222", "\\sphericalangle", true); -defineSymbol(symbols_math, ams, symbols_textord, "\u2201", "\\complement", true); // unicode-math maps U+F0 to \matheth. We map to AMS function \eth - -defineSymbol(symbols_math, ams, symbols_textord, "\xF0", "\\eth", true); -defineSymbol(symbols_text, main, symbols_textord, "\xF0", "\xF0"); -defineSymbol(symbols_math, ams, symbols_textord, "\u2571", "\\diagup"); -defineSymbol(symbols_math, ams, symbols_textord, "\u2572", "\\diagdown"); -defineSymbol(symbols_math, ams, symbols_textord, "\u25A1", "\\square"); -defineSymbol(symbols_math, ams, symbols_textord, "\u25A1", "\\Box"); -defineSymbol(symbols_math, ams, symbols_textord, "\u25CA", "\\Diamond"); // unicode-math maps U+A5 to \mathyen. We map to AMS function \yen - -defineSymbol(symbols_math, ams, symbols_textord, "\xA5", "\\yen", true); -defineSymbol(symbols_text, ams, symbols_textord, "\xA5", "\\yen", true); -defineSymbol(symbols_math, ams, symbols_textord, "\u2713", "\\checkmark", true); -defineSymbol(symbols_text, ams, symbols_textord, "\u2713", "\\checkmark"); // AMS Hebrew - -defineSymbol(symbols_math, ams, symbols_textord, "\u2136", "\\beth", true); -defineSymbol(symbols_math, ams, symbols_textord, "\u2138", "\\daleth", true); -defineSymbol(symbols_math, ams, symbols_textord, "\u2137", "\\gimel", true); // AMS Greek - -defineSymbol(symbols_math, ams, symbols_textord, "\u03DD", "\\digamma", true); -defineSymbol(symbols_math, ams, symbols_textord, "\u03F0", "\\varkappa"); // AMS Delimiters - -defineSymbol(symbols_math, ams, symbols_open, "\u250C", "\\@ulcorner", true); -defineSymbol(symbols_math, ams, symbols_close, "\u2510", "\\@urcorner", true); -defineSymbol(symbols_math, ams, symbols_open, "\u2514", "\\@llcorner", true); -defineSymbol(symbols_math, ams, symbols_close, "\u2518", "\\@lrcorner", true); // AMS Binary Relations - -defineSymbol(symbols_math, ams, rel, "\u2266", "\\leqq", true); -defineSymbol(symbols_math, ams, rel, "\u2A7D", "\\leqslant", true); -defineSymbol(symbols_math, ams, rel, "\u2A95", "\\eqslantless", true); -defineSymbol(symbols_math, ams, rel, "\u2272", "\\lesssim", true); -defineSymbol(symbols_math, ams, rel, "\u2A85", "\\lessapprox", true); -defineSymbol(symbols_math, ams, rel, "\u224A", "\\approxeq", true); -defineSymbol(symbols_math, ams, bin, "\u22D6", "\\lessdot"); -defineSymbol(symbols_math, ams, rel, "\u22D8", "\\lll", true); -defineSymbol(symbols_math, ams, rel, "\u2276", "\\lessgtr", true); -defineSymbol(symbols_math, ams, rel, "\u22DA", "\\lesseqgtr", true); -defineSymbol(symbols_math, ams, rel, "\u2A8B", "\\lesseqqgtr", true); -defineSymbol(symbols_math, ams, rel, "\u2251", "\\doteqdot"); -defineSymbol(symbols_math, ams, rel, "\u2253", "\\risingdotseq", true); -defineSymbol(symbols_math, ams, rel, "\u2252", "\\fallingdotseq", true); -defineSymbol(symbols_math, ams, rel, "\u223D", "\\backsim", true); -defineSymbol(symbols_math, ams, rel, "\u22CD", "\\backsimeq", true); -defineSymbol(symbols_math, ams, rel, "\u2AC5", "\\subseteqq", true); -defineSymbol(symbols_math, ams, rel, "\u22D0", "\\Subset", true); -defineSymbol(symbols_math, ams, rel, "\u228F", "\\sqsubset", true); -defineSymbol(symbols_math, ams, rel, "\u227C", "\\preccurlyeq", true); -defineSymbol(symbols_math, ams, rel, "\u22DE", "\\curlyeqprec", true); -defineSymbol(symbols_math, ams, rel, "\u227E", "\\precsim", true); -defineSymbol(symbols_math, ams, rel, "\u2AB7", "\\precapprox", true); -defineSymbol(symbols_math, ams, rel, "\u22B2", "\\vartriangleleft"); -defineSymbol(symbols_math, ams, rel, "\u22B4", "\\trianglelefteq"); -defineSymbol(symbols_math, ams, rel, "\u22A8", "\\vDash", true); -defineSymbol(symbols_math, ams, rel, "\u22AA", "\\Vvdash", true); -defineSymbol(symbols_math, ams, rel, "\u2323", "\\smallsmile"); -defineSymbol(symbols_math, ams, rel, "\u2322", "\\smallfrown"); -defineSymbol(symbols_math, ams, rel, "\u224F", "\\bumpeq", true); -defineSymbol(symbols_math, ams, rel, "\u224E", "\\Bumpeq", true); -defineSymbol(symbols_math, ams, rel, "\u2267", "\\geqq", true); -defineSymbol(symbols_math, ams, rel, "\u2A7E", "\\geqslant", true); -defineSymbol(symbols_math, ams, rel, "\u2A96", "\\eqslantgtr", true); -defineSymbol(symbols_math, ams, rel, "\u2273", "\\gtrsim", true); -defineSymbol(symbols_math, ams, rel, "\u2A86", "\\gtrapprox", true); -defineSymbol(symbols_math, ams, bin, "\u22D7", "\\gtrdot"); -defineSymbol(symbols_math, ams, rel, "\u22D9", "\\ggg", true); -defineSymbol(symbols_math, ams, rel, "\u2277", "\\gtrless", true); -defineSymbol(symbols_math, ams, rel, "\u22DB", "\\gtreqless", true); -defineSymbol(symbols_math, ams, rel, "\u2A8C", "\\gtreqqless", true); -defineSymbol(symbols_math, ams, rel, "\u2256", "\\eqcirc", true); -defineSymbol(symbols_math, ams, rel, "\u2257", "\\circeq", true); -defineSymbol(symbols_math, ams, rel, "\u225C", "\\triangleq", true); -defineSymbol(symbols_math, ams, rel, "\u223C", "\\thicksim"); -defineSymbol(symbols_math, ams, rel, "\u2248", "\\thickapprox"); -defineSymbol(symbols_math, ams, rel, "\u2AC6", "\\supseteqq", true); -defineSymbol(symbols_math, ams, rel, "\u22D1", "\\Supset", true); -defineSymbol(symbols_math, ams, rel, "\u2290", "\\sqsupset", true); -defineSymbol(symbols_math, ams, rel, "\u227D", "\\succcurlyeq", true); -defineSymbol(symbols_math, ams, rel, "\u22DF", "\\curlyeqsucc", true); -defineSymbol(symbols_math, ams, rel, "\u227F", "\\succsim", true); -defineSymbol(symbols_math, ams, rel, "\u2AB8", "\\succapprox", true); -defineSymbol(symbols_math, ams, rel, "\u22B3", "\\vartriangleright"); -defineSymbol(symbols_math, ams, rel, "\u22B5", "\\trianglerighteq"); -defineSymbol(symbols_math, ams, rel, "\u22A9", "\\Vdash", true); -defineSymbol(symbols_math, ams, rel, "\u2223", "\\shortmid"); -defineSymbol(symbols_math, ams, rel, "\u2225", "\\shortparallel"); -defineSymbol(symbols_math, ams, rel, "\u226C", "\\between", true); -defineSymbol(symbols_math, ams, rel, "\u22D4", "\\pitchfork", true); -defineSymbol(symbols_math, ams, rel, "\u221D", "\\varpropto"); -defineSymbol(symbols_math, ams, rel, "\u25C0", "\\blacktriangleleft"); // unicode-math says that \therefore is a mathord atom. -// We kept the amssymb atom type, which is rel. - -defineSymbol(symbols_math, ams, rel, "\u2234", "\\therefore", true); -defineSymbol(symbols_math, ams, rel, "\u220D", "\\backepsilon"); -defineSymbol(symbols_math, ams, rel, "\u25B6", "\\blacktriangleright"); // unicode-math says that \because is a mathord atom. -// We kept the amssymb atom type, which is rel. - -defineSymbol(symbols_math, ams, rel, "\u2235", "\\because", true); -defineSymbol(symbols_math, ams, rel, "\u22D8", "\\llless"); -defineSymbol(symbols_math, ams, rel, "\u22D9", "\\gggtr"); -defineSymbol(symbols_math, ams, bin, "\u22B2", "\\lhd"); -defineSymbol(symbols_math, ams, bin, "\u22B3", "\\rhd"); -defineSymbol(symbols_math, ams, rel, "\u2242", "\\eqsim", true); -defineSymbol(symbols_math, main, rel, "\u22C8", "\\Join"); -defineSymbol(symbols_math, ams, rel, "\u2251", "\\Doteq", true); // AMS Binary Operators - -defineSymbol(symbols_math, ams, bin, "\u2214", "\\dotplus", true); -defineSymbol(symbols_math, ams, bin, "\u2216", "\\smallsetminus"); -defineSymbol(symbols_math, ams, bin, "\u22D2", "\\Cap", true); -defineSymbol(symbols_math, ams, bin, "\u22D3", "\\Cup", true); -defineSymbol(symbols_math, ams, bin, "\u2A5E", "\\doublebarwedge", true); -defineSymbol(symbols_math, ams, bin, "\u229F", "\\boxminus", true); -defineSymbol(symbols_math, ams, bin, "\u229E", "\\boxplus", true); -defineSymbol(symbols_math, ams, bin, "\u22C7", "\\divideontimes", true); -defineSymbol(symbols_math, ams, bin, "\u22C9", "\\ltimes", true); -defineSymbol(symbols_math, ams, bin, "\u22CA", "\\rtimes", true); -defineSymbol(symbols_math, ams, bin, "\u22CB", "\\leftthreetimes", true); -defineSymbol(symbols_math, ams, bin, "\u22CC", "\\rightthreetimes", true); -defineSymbol(symbols_math, ams, bin, "\u22CF", "\\curlywedge", true); -defineSymbol(symbols_math, ams, bin, "\u22CE", "\\curlyvee", true); -defineSymbol(symbols_math, ams, bin, "\u229D", "\\circleddash", true); -defineSymbol(symbols_math, ams, bin, "\u229B", "\\circledast", true); -defineSymbol(symbols_math, ams, bin, "\u22C5", "\\centerdot"); -defineSymbol(symbols_math, ams, bin, "\u22BA", "\\intercal", true); -defineSymbol(symbols_math, ams, bin, "\u22D2", "\\doublecap"); -defineSymbol(symbols_math, ams, bin, "\u22D3", "\\doublecup"); -defineSymbol(symbols_math, ams, bin, "\u22A0", "\\boxtimes", true); // AMS Arrows -// Note: unicode-math maps \u21e2 to their own function \rightdasharrow. -// We'll map it to AMS function \dashrightarrow. It produces the same atom. - -defineSymbol(symbols_math, ams, rel, "\u21E2", "\\dashrightarrow", true); // unicode-math maps \u21e0 to \leftdasharrow. We'll use the AMS synonym. - -defineSymbol(symbols_math, ams, rel, "\u21E0", "\\dashleftarrow", true); -defineSymbol(symbols_math, ams, rel, "\u21C7", "\\leftleftarrows", true); -defineSymbol(symbols_math, ams, rel, "\u21C6", "\\leftrightarrows", true); -defineSymbol(symbols_math, ams, rel, "\u21DA", "\\Lleftarrow", true); -defineSymbol(symbols_math, ams, rel, "\u219E", "\\twoheadleftarrow", true); -defineSymbol(symbols_math, ams, rel, "\u21A2", "\\leftarrowtail", true); -defineSymbol(symbols_math, ams, rel, "\u21AB", "\\looparrowleft", true); -defineSymbol(symbols_math, ams, rel, "\u21CB", "\\leftrightharpoons", true); -defineSymbol(symbols_math, ams, rel, "\u21B6", "\\curvearrowleft", true); // unicode-math maps \u21ba to \acwopencirclearrow. We'll use the AMS synonym. - -defineSymbol(symbols_math, ams, rel, "\u21BA", "\\circlearrowleft", true); -defineSymbol(symbols_math, ams, rel, "\u21B0", "\\Lsh", true); -defineSymbol(symbols_math, ams, rel, "\u21C8", "\\upuparrows", true); -defineSymbol(symbols_math, ams, rel, "\u21BF", "\\upharpoonleft", true); -defineSymbol(symbols_math, ams, rel, "\u21C3", "\\downharpoonleft", true); -defineSymbol(symbols_math, ams, rel, "\u22B8", "\\multimap", true); -defineSymbol(symbols_math, ams, rel, "\u21AD", "\\leftrightsquigarrow", true); -defineSymbol(symbols_math, ams, rel, "\u21C9", "\\rightrightarrows", true); -defineSymbol(symbols_math, ams, rel, "\u21C4", "\\rightleftarrows", true); -defineSymbol(symbols_math, ams, rel, "\u21A0", "\\twoheadrightarrow", true); -defineSymbol(symbols_math, ams, rel, "\u21A3", "\\rightarrowtail", true); -defineSymbol(symbols_math, ams, rel, "\u21AC", "\\looparrowright", true); -defineSymbol(symbols_math, ams, rel, "\u21B7", "\\curvearrowright", true); // unicode-math maps \u21bb to \cwopencirclearrow. We'll use the AMS synonym. - -defineSymbol(symbols_math, ams, rel, "\u21BB", "\\circlearrowright", true); -defineSymbol(symbols_math, ams, rel, "\u21B1", "\\Rsh", true); -defineSymbol(symbols_math, ams, rel, "\u21CA", "\\downdownarrows", true); -defineSymbol(symbols_math, ams, rel, "\u21BE", "\\upharpoonright", true); -defineSymbol(symbols_math, ams, rel, "\u21C2", "\\downharpoonright", true); -defineSymbol(symbols_math, ams, rel, "\u21DD", "\\rightsquigarrow", true); -defineSymbol(symbols_math, ams, rel, "\u21DD", "\\leadsto"); -defineSymbol(symbols_math, ams, rel, "\u21DB", "\\Rrightarrow", true); -defineSymbol(symbols_math, ams, rel, "\u21BE", "\\restriction"); -defineSymbol(symbols_math, main, symbols_textord, "\u2018", "`"); -defineSymbol(symbols_math, main, symbols_textord, "$", "\\$"); -defineSymbol(symbols_text, main, symbols_textord, "$", "\\$"); -defineSymbol(symbols_text, main, symbols_textord, "$", "\\textdollar"); -defineSymbol(symbols_math, main, symbols_textord, "%", "\\%"); -defineSymbol(symbols_text, main, symbols_textord, "%", "\\%"); -defineSymbol(symbols_math, main, symbols_textord, "_", "\\_"); -defineSymbol(symbols_text, main, symbols_textord, "_", "\\_"); -defineSymbol(symbols_text, main, symbols_textord, "_", "\\textunderscore"); -defineSymbol(symbols_math, main, symbols_textord, "\u2220", "\\angle", true); -defineSymbol(symbols_math, main, symbols_textord, "\u221E", "\\infty", true); -defineSymbol(symbols_math, main, symbols_textord, "\u2032", "\\prime"); -defineSymbol(symbols_math, main, symbols_textord, "\u25B3", "\\triangle"); -defineSymbol(symbols_math, main, symbols_textord, "\u0393", "\\Gamma", true); -defineSymbol(symbols_math, main, symbols_textord, "\u0394", "\\Delta", true); -defineSymbol(symbols_math, main, symbols_textord, "\u0398", "\\Theta", true); -defineSymbol(symbols_math, main, symbols_textord, "\u039B", "\\Lambda", true); -defineSymbol(symbols_math, main, symbols_textord, "\u039E", "\\Xi", true); -defineSymbol(symbols_math, main, symbols_textord, "\u03A0", "\\Pi", true); -defineSymbol(symbols_math, main, symbols_textord, "\u03A3", "\\Sigma", true); -defineSymbol(symbols_math, main, symbols_textord, "\u03A5", "\\Upsilon", true); -defineSymbol(symbols_math, main, symbols_textord, "\u03A6", "\\Phi", true); -defineSymbol(symbols_math, main, symbols_textord, "\u03A8", "\\Psi", true); -defineSymbol(symbols_math, main, symbols_textord, "\u03A9", "\\Omega", true); -defineSymbol(symbols_math, main, symbols_textord, "A", "\u0391"); -defineSymbol(symbols_math, main, symbols_textord, "B", "\u0392"); -defineSymbol(symbols_math, main, symbols_textord, "E", "\u0395"); -defineSymbol(symbols_math, main, symbols_textord, "Z", "\u0396"); -defineSymbol(symbols_math, main, symbols_textord, "H", "\u0397"); -defineSymbol(symbols_math, main, symbols_textord, "I", "\u0399"); -defineSymbol(symbols_math, main, symbols_textord, "K", "\u039A"); -defineSymbol(symbols_math, main, symbols_textord, "M", "\u039C"); -defineSymbol(symbols_math, main, symbols_textord, "N", "\u039D"); -defineSymbol(symbols_math, main, symbols_textord, "O", "\u039F"); -defineSymbol(symbols_math, main, symbols_textord, "P", "\u03A1"); -defineSymbol(symbols_math, main, symbols_textord, "T", "\u03A4"); -defineSymbol(symbols_math, main, symbols_textord, "X", "\u03A7"); -defineSymbol(symbols_math, main, symbols_textord, "\xAC", "\\neg", true); -defineSymbol(symbols_math, main, symbols_textord, "\xAC", "\\lnot"); -defineSymbol(symbols_math, main, symbols_textord, "\u22A4", "\\top"); -defineSymbol(symbols_math, main, symbols_textord, "\u22A5", "\\bot"); -defineSymbol(symbols_math, main, symbols_textord, "\u2205", "\\emptyset"); -defineSymbol(symbols_math, ams, symbols_textord, "\u2205", "\\varnothing"); -defineSymbol(symbols_math, main, mathord, "\u03B1", "\\alpha", true); -defineSymbol(symbols_math, main, mathord, "\u03B2", "\\beta", true); -defineSymbol(symbols_math, main, mathord, "\u03B3", "\\gamma", true); -defineSymbol(symbols_math, main, mathord, "\u03B4", "\\delta", true); -defineSymbol(symbols_math, main, mathord, "\u03F5", "\\epsilon", true); -defineSymbol(symbols_math, main, mathord, "\u03B6", "\\zeta", true); -defineSymbol(symbols_math, main, mathord, "\u03B7", "\\eta", true); -defineSymbol(symbols_math, main, mathord, "\u03B8", "\\theta", true); -defineSymbol(symbols_math, main, mathord, "\u03B9", "\\iota", true); -defineSymbol(symbols_math, main, mathord, "\u03BA", "\\kappa", true); -defineSymbol(symbols_math, main, mathord, "\u03BB", "\\lambda", true); -defineSymbol(symbols_math, main, mathord, "\u03BC", "\\mu", true); -defineSymbol(symbols_math, main, mathord, "\u03BD", "\\nu", true); -defineSymbol(symbols_math, main, mathord, "\u03BE", "\\xi", true); -defineSymbol(symbols_math, main, mathord, "\u03BF", "\\omicron", true); -defineSymbol(symbols_math, main, mathord, "\u03C0", "\\pi", true); -defineSymbol(symbols_math, main, mathord, "\u03C1", "\\rho", true); -defineSymbol(symbols_math, main, mathord, "\u03C3", "\\sigma", true); -defineSymbol(symbols_math, main, mathord, "\u03C4", "\\tau", true); -defineSymbol(symbols_math, main, mathord, "\u03C5", "\\upsilon", true); -defineSymbol(symbols_math, main, mathord, "\u03D5", "\\phi", true); -defineSymbol(symbols_math, main, mathord, "\u03C7", "\\chi", true); -defineSymbol(symbols_math, main, mathord, "\u03C8", "\\psi", true); -defineSymbol(symbols_math, main, mathord, "\u03C9", "\\omega", true); -defineSymbol(symbols_math, main, mathord, "\u03B5", "\\varepsilon", true); -defineSymbol(symbols_math, main, mathord, "\u03D1", "\\vartheta", true); -defineSymbol(symbols_math, main, mathord, "\u03D6", "\\varpi", true); -defineSymbol(symbols_math, main, mathord, "\u03F1", "\\varrho", true); -defineSymbol(symbols_math, main, mathord, "\u03C2", "\\varsigma", true); -defineSymbol(symbols_math, main, mathord, "\u03C6", "\\varphi", true); -defineSymbol(symbols_math, main, bin, "\u2217", "*"); -defineSymbol(symbols_math, main, bin, "+", "+"); -defineSymbol(symbols_math, main, bin, "\u2212", "-"); -defineSymbol(symbols_math, main, bin, "\u22C5", "\\cdot", true); -defineSymbol(symbols_math, main, bin, "\u2218", "\\circ"); -defineSymbol(symbols_math, main, bin, "\xF7", "\\div", true); -defineSymbol(symbols_math, main, bin, "\xB1", "\\pm", true); -defineSymbol(symbols_math, main, bin, "\xD7", "\\times", true); -defineSymbol(symbols_math, main, bin, "\u2229", "\\cap", true); -defineSymbol(symbols_math, main, bin, "\u222A", "\\cup", true); -defineSymbol(symbols_math, main, bin, "\u2216", "\\setminus"); -defineSymbol(symbols_math, main, bin, "\u2227", "\\land"); -defineSymbol(symbols_math, main, bin, "\u2228", "\\lor"); -defineSymbol(symbols_math, main, bin, "\u2227", "\\wedge", true); -defineSymbol(symbols_math, main, bin, "\u2228", "\\vee", true); -defineSymbol(symbols_math, main, symbols_textord, "\u221A", "\\surd"); -defineSymbol(symbols_math, main, symbols_open, "\u27E8", "\\langle", true); -defineSymbol(symbols_math, main, symbols_open, "\u2223", "\\lvert"); -defineSymbol(symbols_math, main, symbols_open, "\u2225", "\\lVert"); -defineSymbol(symbols_math, main, symbols_close, "?", "?"); -defineSymbol(symbols_math, main, symbols_close, "!", "!"); -defineSymbol(symbols_math, main, symbols_close, "\u27E9", "\\rangle", true); -defineSymbol(symbols_math, main, symbols_close, "\u2223", "\\rvert"); -defineSymbol(symbols_math, main, symbols_close, "\u2225", "\\rVert"); -defineSymbol(symbols_math, main, rel, "=", "="); -defineSymbol(symbols_math, main, rel, ":", ":"); -defineSymbol(symbols_math, main, rel, "\u2248", "\\approx", true); -defineSymbol(symbols_math, main, rel, "\u2245", "\\cong", true); -defineSymbol(symbols_math, main, rel, "\u2265", "\\ge"); -defineSymbol(symbols_math, main, rel, "\u2265", "\\geq", true); -defineSymbol(symbols_math, main, rel, "\u2190", "\\gets"); -defineSymbol(symbols_math, main, rel, ">", "\\gt", true); -defineSymbol(symbols_math, main, rel, "\u2208", "\\in", true); -defineSymbol(symbols_math, main, rel, "\uE020", "\\@not"); -defineSymbol(symbols_math, main, rel, "\u2282", "\\subset", true); -defineSymbol(symbols_math, main, rel, "\u2283", "\\supset", true); -defineSymbol(symbols_math, main, rel, "\u2286", "\\subseteq", true); -defineSymbol(symbols_math, main, rel, "\u2287", "\\supseteq", true); -defineSymbol(symbols_math, ams, rel, "\u2288", "\\nsubseteq", true); -defineSymbol(symbols_math, ams, rel, "\u2289", "\\nsupseteq", true); -defineSymbol(symbols_math, main, rel, "\u22A8", "\\models"); -defineSymbol(symbols_math, main, rel, "\u2190", "\\leftarrow", true); -defineSymbol(symbols_math, main, rel, "\u2264", "\\le"); -defineSymbol(symbols_math, main, rel, "\u2264", "\\leq", true); -defineSymbol(symbols_math, main, rel, "<", "\\lt", true); -defineSymbol(symbols_math, main, rel, "\u2192", "\\rightarrow", true); -defineSymbol(symbols_math, main, rel, "\u2192", "\\to"); -defineSymbol(symbols_math, ams, rel, "\u2271", "\\ngeq", true); -defineSymbol(symbols_math, ams, rel, "\u2270", "\\nleq", true); -defineSymbol(symbols_math, main, symbols_spacing, "\xA0", "\\ "); -defineSymbol(symbols_math, main, symbols_spacing, "\xA0", "~"); -defineSymbol(symbols_math, main, symbols_spacing, "\xA0", "\\space"); // Ref: LaTeX Source 2e: \DeclareRobustCommand{\nobreakspace}{% - -defineSymbol(symbols_math, main, symbols_spacing, "\xA0", "\\nobreakspace"); -defineSymbol(symbols_text, main, symbols_spacing, "\xA0", "\\ "); -defineSymbol(symbols_text, main, symbols_spacing, "\xA0", " "); -defineSymbol(symbols_text, main, symbols_spacing, "\xA0", "~"); -defineSymbol(symbols_text, main, symbols_spacing, "\xA0", "\\space"); -defineSymbol(symbols_text, main, symbols_spacing, "\xA0", "\\nobreakspace"); -defineSymbol(symbols_math, main, symbols_spacing, null, "\\nobreak"); -defineSymbol(symbols_math, main, symbols_spacing, null, "\\allowbreak"); -defineSymbol(symbols_math, main, punct, ",", ","); -defineSymbol(symbols_math, main, punct, ";", ";"); -defineSymbol(symbols_math, ams, bin, "\u22BC", "\\barwedge", true); -defineSymbol(symbols_math, ams, bin, "\u22BB", "\\veebar", true); -defineSymbol(symbols_math, main, bin, "\u2299", "\\odot", true); -defineSymbol(symbols_math, main, bin, "\u2295", "\\oplus", true); -defineSymbol(symbols_math, main, bin, "\u2297", "\\otimes", true); -defineSymbol(symbols_math, main, symbols_textord, "\u2202", "\\partial", true); -defineSymbol(symbols_math, main, bin, "\u2298", "\\oslash", true); -defineSymbol(symbols_math, ams, bin, "\u229A", "\\circledcirc", true); -defineSymbol(symbols_math, ams, bin, "\u22A1", "\\boxdot", true); -defineSymbol(symbols_math, main, bin, "\u25B3", "\\bigtriangleup"); -defineSymbol(symbols_math, main, bin, "\u25BD", "\\bigtriangledown"); -defineSymbol(symbols_math, main, bin, "\u2020", "\\dagger"); -defineSymbol(symbols_math, main, bin, "\u22C4", "\\diamond"); -defineSymbol(symbols_math, main, bin, "\u22C6", "\\star"); -defineSymbol(symbols_math, main, bin, "\u25C3", "\\triangleleft"); -defineSymbol(symbols_math, main, bin, "\u25B9", "\\triangleright"); -defineSymbol(symbols_math, main, symbols_open, "{", "\\{"); -defineSymbol(symbols_text, main, symbols_textord, "{", "\\{"); -defineSymbol(symbols_text, main, symbols_textord, "{", "\\textbraceleft"); -defineSymbol(symbols_math, main, symbols_close, "}", "\\}"); -defineSymbol(symbols_text, main, symbols_textord, "}", "\\}"); -defineSymbol(symbols_text, main, symbols_textord, "}", "\\textbraceright"); -defineSymbol(symbols_math, main, symbols_open, "{", "\\lbrace"); -defineSymbol(symbols_math, main, symbols_close, "}", "\\rbrace"); -defineSymbol(symbols_math, main, symbols_open, "[", "\\lbrack", true); -defineSymbol(symbols_text, main, symbols_textord, "[", "\\lbrack", true); -defineSymbol(symbols_math, main, symbols_close, "]", "\\rbrack", true); -defineSymbol(symbols_text, main, symbols_textord, "]", "\\rbrack", true); -defineSymbol(symbols_math, main, symbols_open, "(", "\\lparen", true); -defineSymbol(symbols_math, main, symbols_close, ")", "\\rparen", true); -defineSymbol(symbols_text, main, symbols_textord, "<", "\\textless", true); // in T1 fontenc - -defineSymbol(symbols_text, main, symbols_textord, ">", "\\textgreater", true); // in T1 fontenc - -defineSymbol(symbols_math, main, symbols_open, "\u230A", "\\lfloor", true); -defineSymbol(symbols_math, main, symbols_close, "\u230B", "\\rfloor", true); -defineSymbol(symbols_math, main, symbols_open, "\u2308", "\\lceil", true); -defineSymbol(symbols_math, main, symbols_close, "\u2309", "\\rceil", true); -defineSymbol(symbols_math, main, symbols_textord, "\\", "\\backslash"); -defineSymbol(symbols_math, main, symbols_textord, "\u2223", "|"); -defineSymbol(symbols_math, main, symbols_textord, "\u2223", "\\vert"); -defineSymbol(symbols_text, main, symbols_textord, "|", "\\textbar", true); // in T1 fontenc - -defineSymbol(symbols_math, main, symbols_textord, "\u2225", "\\|"); -defineSymbol(symbols_math, main, symbols_textord, "\u2225", "\\Vert"); -defineSymbol(symbols_text, main, symbols_textord, "\u2225", "\\textbardbl"); -defineSymbol(symbols_text, main, symbols_textord, "~", "\\textasciitilde"); -defineSymbol(symbols_text, main, symbols_textord, "\\", "\\textbackslash"); -defineSymbol(symbols_text, main, symbols_textord, "^", "\\textasciicircum"); -defineSymbol(symbols_math, main, rel, "\u2191", "\\uparrow", true); -defineSymbol(symbols_math, main, rel, "\u21D1", "\\Uparrow", true); -defineSymbol(symbols_math, main, rel, "\u2193", "\\downarrow", true); -defineSymbol(symbols_math, main, rel, "\u21D3", "\\Downarrow", true); -defineSymbol(symbols_math, main, rel, "\u2195", "\\updownarrow", true); -defineSymbol(symbols_math, main, rel, "\u21D5", "\\Updownarrow", true); -defineSymbol(symbols_math, main, op, "\u2210", "\\coprod"); -defineSymbol(symbols_math, main, op, "\u22C1", "\\bigvee"); -defineSymbol(symbols_math, main, op, "\u22C0", "\\bigwedge"); -defineSymbol(symbols_math, main, op, "\u2A04", "\\biguplus"); -defineSymbol(symbols_math, main, op, "\u22C2", "\\bigcap"); -defineSymbol(symbols_math, main, op, "\u22C3", "\\bigcup"); -defineSymbol(symbols_math, main, op, "\u222B", "\\int"); -defineSymbol(symbols_math, main, op, "\u222B", "\\intop"); -defineSymbol(symbols_math, main, op, "\u222C", "\\iint"); -defineSymbol(symbols_math, main, op, "\u222D", "\\iiint"); -defineSymbol(symbols_math, main, op, "\u220F", "\\prod"); -defineSymbol(symbols_math, main, op, "\u2211", "\\sum"); -defineSymbol(symbols_math, main, op, "\u2A02", "\\bigotimes"); -defineSymbol(symbols_math, main, op, "\u2A01", "\\bigoplus"); -defineSymbol(symbols_math, main, op, "\u2A00", "\\bigodot"); -defineSymbol(symbols_math, main, op, "\u222E", "\\oint"); -defineSymbol(symbols_math, main, op, "\u2A06", "\\bigsqcup"); -defineSymbol(symbols_math, main, op, "\u222B", "\\smallint"); -defineSymbol(symbols_text, main, symbols_inner, "\u2026", "\\textellipsis"); -defineSymbol(symbols_math, main, symbols_inner, "\u2026", "\\mathellipsis"); -defineSymbol(symbols_text, main, symbols_inner, "\u2026", "\\ldots", true); -defineSymbol(symbols_math, main, symbols_inner, "\u2026", "\\ldots", true); -defineSymbol(symbols_math, main, symbols_inner, "\u22EF", "\\@cdots", true); -defineSymbol(symbols_math, main, symbols_inner, "\u22F1", "\\ddots", true); -defineSymbol(symbols_math, main, symbols_textord, "\u22EE", "\\varvdots"); // \vdots is a macro - -defineSymbol(symbols_math, main, symbols_accent, "\u02CA", "\\acute"); -defineSymbol(symbols_math, main, symbols_accent, "\u02CB", "\\grave"); -defineSymbol(symbols_math, main, symbols_accent, "\xA8", "\\ddot"); -defineSymbol(symbols_math, main, symbols_accent, "~", "\\tilde"); -defineSymbol(symbols_math, main, symbols_accent, "\u02C9", "\\bar"); -defineSymbol(symbols_math, main, symbols_accent, "\u02D8", "\\breve"); -defineSymbol(symbols_math, main, symbols_accent, "\u02C7", "\\check"); -defineSymbol(symbols_math, main, symbols_accent, "^", "\\hat"); -defineSymbol(symbols_math, main, symbols_accent, "\u20D7", "\\vec"); -defineSymbol(symbols_math, main, symbols_accent, "\u02D9", "\\dot"); -defineSymbol(symbols_math, main, symbols_accent, "\u02DA", "\\mathring"); // \imath and \jmath should be invariant to \mathrm, \mathbf, etc., so use PUA - -defineSymbol(symbols_math, main, mathord, "\uE131", "\\@imath"); -defineSymbol(symbols_math, main, mathord, "\uE237", "\\@jmath"); -defineSymbol(symbols_math, main, symbols_textord, "\u0131", "\u0131"); -defineSymbol(symbols_math, main, symbols_textord, "\u0237", "\u0237"); -defineSymbol(symbols_text, main, symbols_textord, "\u0131", "\\i", true); -defineSymbol(symbols_text, main, symbols_textord, "\u0237", "\\j", true); -defineSymbol(symbols_text, main, symbols_textord, "\xDF", "\\ss", true); -defineSymbol(symbols_text, main, symbols_textord, "\xE6", "\\ae", true); -defineSymbol(symbols_text, main, symbols_textord, "\u0153", "\\oe", true); -defineSymbol(symbols_text, main, symbols_textord, "\xF8", "\\o", true); -defineSymbol(symbols_text, main, symbols_textord, "\xC6", "\\AE", true); -defineSymbol(symbols_text, main, symbols_textord, "\u0152", "\\OE", true); -defineSymbol(symbols_text, main, symbols_textord, "\xD8", "\\O", true); -defineSymbol(symbols_text, main, symbols_accent, "\u02CA", "\\'"); // acute - -defineSymbol(symbols_text, main, symbols_accent, "\u02CB", "\\`"); // grave - -defineSymbol(symbols_text, main, symbols_accent, "\u02C6", "\\^"); // circumflex - -defineSymbol(symbols_text, main, symbols_accent, "\u02DC", "\\~"); // tilde - -defineSymbol(symbols_text, main, symbols_accent, "\u02C9", "\\="); // macron - -defineSymbol(symbols_text, main, symbols_accent, "\u02D8", "\\u"); // breve - -defineSymbol(symbols_text, main, symbols_accent, "\u02D9", "\\."); // dot above - -defineSymbol(symbols_text, main, symbols_accent, "\u02DA", "\\r"); // ring above - -defineSymbol(symbols_text, main, symbols_accent, "\u02C7", "\\v"); // caron - -defineSymbol(symbols_text, main, symbols_accent, "\xA8", '\\"'); // diaresis - -defineSymbol(symbols_text, main, symbols_accent, "\u02DD", "\\H"); // double acute - -defineSymbol(symbols_text, main, symbols_accent, "\u25EF", "\\textcircled"); // \bigcirc glyph -// These ligatures are detected and created in Parser.js's `formLigatures`. - -var ligatures = { - "--": true, - "---": true, - "``": true, - "''": true -}; -defineSymbol(symbols_text, main, symbols_textord, "\u2013", "--", true); -defineSymbol(symbols_text, main, symbols_textord, "\u2013", "\\textendash"); -defineSymbol(symbols_text, main, symbols_textord, "\u2014", "---", true); -defineSymbol(symbols_text, main, symbols_textord, "\u2014", "\\textemdash"); -defineSymbol(symbols_text, main, symbols_textord, "\u2018", "`", true); -defineSymbol(symbols_text, main, symbols_textord, "\u2018", "\\textquoteleft"); -defineSymbol(symbols_text, main, symbols_textord, "\u2019", "'", true); -defineSymbol(symbols_text, main, symbols_textord, "\u2019", "\\textquoteright"); -defineSymbol(symbols_text, main, symbols_textord, "\u201C", "``", true); -defineSymbol(symbols_text, main, symbols_textord, "\u201C", "\\textquotedblleft"); -defineSymbol(symbols_text, main, symbols_textord, "\u201D", "''", true); -defineSymbol(symbols_text, main, symbols_textord, "\u201D", "\\textquotedblright"); // \degree from gensymb package - -defineSymbol(symbols_math, main, symbols_textord, "\xB0", "\\degree", true); -defineSymbol(symbols_text, main, symbols_textord, "\xB0", "\\degree"); // \textdegree from inputenc package - -defineSymbol(symbols_text, main, symbols_textord, "\xB0", "\\textdegree", true); // TODO: In LaTeX, \pounds can generate a different character in text and math -// mode, but among our fonts, only Main-Regular defines this character "163". - -defineSymbol(symbols_math, main, symbols_textord, "\xA3", "\\pounds"); -defineSymbol(symbols_math, main, symbols_textord, "\xA3", "\\mathsterling", true); -defineSymbol(symbols_text, main, symbols_textord, "\xA3", "\\pounds"); -defineSymbol(symbols_text, main, symbols_textord, "\xA3", "\\textsterling", true); -defineSymbol(symbols_math, ams, symbols_textord, "\u2720", "\\maltese"); -defineSymbol(symbols_text, ams, symbols_textord, "\u2720", "\\maltese"); // There are lots of symbols which are the same, so we add them in afterwards. -// All of these are textords in math mode - -var mathTextSymbols = "0123456789/@.\""; - -for (var symbols_i = 0; symbols_i < mathTextSymbols.length; symbols_i++) { - var symbols_ch = mathTextSymbols.charAt(symbols_i); - defineSymbol(symbols_math, main, symbols_textord, symbols_ch, symbols_ch); -} // All of these are textords in text mode - - -var textSymbols = "0123456789!@*()-=+\";:?/.,"; - -for (var src_symbols_i = 0; src_symbols_i < textSymbols.length; src_symbols_i++) { - var _ch = textSymbols.charAt(src_symbols_i); - - defineSymbol(symbols_text, main, symbols_textord, _ch, _ch); -} // All of these are textords in text mode, and mathords in math mode - - -var letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; - -for (var symbols_i2 = 0; symbols_i2 < letters.length; symbols_i2++) { - var _ch2 = letters.charAt(symbols_i2); - - defineSymbol(symbols_math, main, mathord, _ch2, _ch2); - defineSymbol(symbols_text, main, symbols_textord, _ch2, _ch2); -} // Blackboard bold and script letters in Unicode range - - -defineSymbol(symbols_math, ams, symbols_textord, "C", "\u2102"); // blackboard bold - -defineSymbol(symbols_text, ams, symbols_textord, "C", "\u2102"); -defineSymbol(symbols_math, ams, symbols_textord, "H", "\u210D"); -defineSymbol(symbols_text, ams, symbols_textord, "H", "\u210D"); -defineSymbol(symbols_math, ams, symbols_textord, "N", "\u2115"); -defineSymbol(symbols_text, ams, symbols_textord, "N", "\u2115"); -defineSymbol(symbols_math, ams, symbols_textord, "P", "\u2119"); -defineSymbol(symbols_text, ams, symbols_textord, "P", "\u2119"); -defineSymbol(symbols_math, ams, symbols_textord, "Q", "\u211A"); -defineSymbol(symbols_text, ams, symbols_textord, "Q", "\u211A"); -defineSymbol(symbols_math, ams, symbols_textord, "R", "\u211D"); -defineSymbol(symbols_text, ams, symbols_textord, "R", "\u211D"); -defineSymbol(symbols_math, ams, symbols_textord, "Z", "\u2124"); -defineSymbol(symbols_text, ams, symbols_textord, "Z", "\u2124"); -defineSymbol(symbols_math, main, mathord, "h", "\u210E"); // italic h, Planck constant - -defineSymbol(symbols_text, main, mathord, "h", "\u210E"); // The next loop loads wide (surrogate pair) characters. -// We support some letters in the Unicode range U+1D400 to U+1D7FF, -// Mathematical Alphanumeric Symbols. -// Some editors do not deal well with wide characters. So don't write the -// string into this file. Instead, create the string from the surrogate pair. - -var symbols_wideChar = ""; - -for (var symbols_i3 = 0; symbols_i3 < letters.length; symbols_i3++) { - var _ch3 = letters.charAt(symbols_i3); // The hex numbers in the next line are a surrogate pair. - // 0xD835 is the high surrogate for all letters in the range we support. - // 0xDC00 is the low surrogate for bold A. - - - symbols_wideChar = String.fromCharCode(0xD835, 0xDC00 + symbols_i3); // A-Z a-z bold - - defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar); - defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar); - symbols_wideChar = String.fromCharCode(0xD835, 0xDC34 + symbols_i3); // A-Z a-z italic - - defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar); - defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar); - symbols_wideChar = String.fromCharCode(0xD835, 0xDC68 + symbols_i3); // A-Z a-z bold italic - - defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar); - defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar); - symbols_wideChar = String.fromCharCode(0xD835, 0xDD04 + symbols_i3); // A-Z a-z Fractur - - defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar); - defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar); - symbols_wideChar = String.fromCharCode(0xD835, 0xDDA0 + symbols_i3); // A-Z a-z sans-serif - - defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar); - defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar); - symbols_wideChar = String.fromCharCode(0xD835, 0xDDD4 + symbols_i3); // A-Z a-z sans bold - - defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar); - defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar); - symbols_wideChar = String.fromCharCode(0xD835, 0xDE08 + symbols_i3); // A-Z a-z sans italic - - defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar); - defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar); - symbols_wideChar = String.fromCharCode(0xD835, 0xDE70 + symbols_i3); // A-Z a-z monospace - - defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar); - defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar); - - if (symbols_i3 < 26) { - // KaTeX fonts have only capital letters for blackboard bold and script. - // See exception for k below. - symbols_wideChar = String.fromCharCode(0xD835, 0xDD38 + symbols_i3); // A-Z double struck - - defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar); - defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar); - symbols_wideChar = String.fromCharCode(0xD835, 0xDC9C + symbols_i3); // A-Z script - - defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar); - defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar); - } // TODO: Add bold script when it is supported by a KaTeX font. - -} // "k" is the only double struck lower case letter in the KaTeX fonts. - - -symbols_wideChar = String.fromCharCode(0xD835, 0xDD5C); // k double struck - -defineSymbol(symbols_math, main, mathord, "k", symbols_wideChar); -defineSymbol(symbols_text, main, symbols_textord, "k", symbols_wideChar); // Next, some wide character numerals - -for (var symbols_i4 = 0; symbols_i4 < 10; symbols_i4++) { - var _ch4 = symbols_i4.toString(); - - symbols_wideChar = String.fromCharCode(0xD835, 0xDFCE + symbols_i4); // 0-9 bold - - defineSymbol(symbols_math, main, mathord, _ch4, symbols_wideChar); - defineSymbol(symbols_text, main, symbols_textord, _ch4, symbols_wideChar); - symbols_wideChar = String.fromCharCode(0xD835, 0xDFE2 + symbols_i4); // 0-9 sans serif - - defineSymbol(symbols_math, main, mathord, _ch4, symbols_wideChar); - defineSymbol(symbols_text, main, symbols_textord, _ch4, symbols_wideChar); - symbols_wideChar = String.fromCharCode(0xD835, 0xDFEC + symbols_i4); // 0-9 bold sans - - defineSymbol(symbols_math, main, mathord, _ch4, symbols_wideChar); - defineSymbol(symbols_text, main, symbols_textord, _ch4, symbols_wideChar); - symbols_wideChar = String.fromCharCode(0xD835, 0xDFF6 + symbols_i4); // 0-9 monospace - - defineSymbol(symbols_math, main, mathord, _ch4, symbols_wideChar); - defineSymbol(symbols_text, main, symbols_textord, _ch4, symbols_wideChar); -} // We add these Latin-1 letters as symbols for backwards-compatibility, -// but they are not actually in the font, nor are they supported by the -// Unicode accent mechanism, so they fall back to Times font and look ugly. -// TODO(edemaine): Fix this. - - -var extraLatin = "\xC7\xD0\xDE\xE7\xFE"; - -for (var _i5 = 0; _i5 < extraLatin.length; _i5++) { - var _ch5 = extraLatin.charAt(_i5); - - defineSymbol(symbols_math, main, mathord, _ch5, _ch5); - defineSymbol(symbols_text, main, symbols_textord, _ch5, _ch5); -} -// CONCATENATED MODULE: ./src/wide-character.js -/** - * This file provides support for Unicode range U+1D400 to U+1D7FF, - * Mathematical Alphanumeric Symbols. - * - * Function wideCharacterFont takes a wide character as input and returns - * the font information necessary to render it properly. - */ - -/** - * Data below is from https://www.unicode.org/charts/PDF/U1D400.pdf - * That document sorts characters into groups by font type, say bold or italic. - * - * In the arrays below, each subarray consists three elements: - * * The CSS class of that group when in math mode. - * * The CSS class of that group when in text mode. - * * The font name, so that KaTeX can get font metrics. - */ - -var wideLatinLetterData = [["mathbf", "textbf", "Main-Bold"], // A-Z bold upright -["mathbf", "textbf", "Main-Bold"], // a-z bold upright -["mathnormal", "textit", "Math-Italic"], // A-Z italic -["mathnormal", "textit", "Math-Italic"], // a-z italic -["boldsymbol", "boldsymbol", "Main-BoldItalic"], // A-Z bold italic -["boldsymbol", "boldsymbol", "Main-BoldItalic"], // a-z bold italic -// Map fancy A-Z letters to script, not calligraphic. -// This aligns with unicode-math and math fonts (except Cambria Math). -["mathscr", "textscr", "Script-Regular"], // A-Z script -["", "", ""], // a-z script. No font -["", "", ""], // A-Z bold script. No font -["", "", ""], // a-z bold script. No font -["mathfrak", "textfrak", "Fraktur-Regular"], // A-Z Fraktur -["mathfrak", "textfrak", "Fraktur-Regular"], // a-z Fraktur -["mathbb", "textbb", "AMS-Regular"], // A-Z double-struck -["mathbb", "textbb", "AMS-Regular"], // k double-struck -["", "", ""], // A-Z bold Fraktur No font metrics -["", "", ""], // a-z bold Fraktur. No font. -["mathsf", "textsf", "SansSerif-Regular"], // A-Z sans-serif -["mathsf", "textsf", "SansSerif-Regular"], // a-z sans-serif -["mathboldsf", "textboldsf", "SansSerif-Bold"], // A-Z bold sans-serif -["mathboldsf", "textboldsf", "SansSerif-Bold"], // a-z bold sans-serif -["mathitsf", "textitsf", "SansSerif-Italic"], // A-Z italic sans-serif -["mathitsf", "textitsf", "SansSerif-Italic"], // a-z italic sans-serif -["", "", ""], // A-Z bold italic sans. No font -["", "", ""], // a-z bold italic sans. No font -["mathtt", "texttt", "Typewriter-Regular"], // A-Z monospace -["mathtt", "texttt", "Typewriter-Regular"]]; -var wideNumeralData = [["mathbf", "textbf", "Main-Bold"], // 0-9 bold -["", "", ""], // 0-9 double-struck. No KaTeX font. -["mathsf", "textsf", "SansSerif-Regular"], // 0-9 sans-serif -["mathboldsf", "textboldsf", "SansSerif-Bold"], // 0-9 bold sans-serif -["mathtt", "texttt", "Typewriter-Regular"]]; -var wide_character_wideCharacterFont = function wideCharacterFont(wideChar, mode) { - // IE doesn't support codePointAt(). So work with the surrogate pair. - var H = wideChar.charCodeAt(0); // high surrogate - - var L = wideChar.charCodeAt(1); // low surrogate - - var codePoint = (H - 0xD800) * 0x400 + (L - 0xDC00) + 0x10000; - var j = mode === "math" ? 0 : 1; // column index for CSS class. - - if (0x1D400 <= codePoint && codePoint < 0x1D6A4) { - // wideLatinLetterData contains exactly 26 chars on each row. - // So we can calculate the relevant row. No traverse necessary. - var i = Math.floor((codePoint - 0x1D400) / 26); - return [wideLatinLetterData[i][2], wideLatinLetterData[i][j]]; - } else if (0x1D7CE <= codePoint && codePoint <= 0x1D7FF) { - // Numerals, ten per row. - var _i = Math.floor((codePoint - 0x1D7CE) / 10); - - return [wideNumeralData[_i][2], wideNumeralData[_i][j]]; - } else if (codePoint === 0x1D6A5 || codePoint === 0x1D6A6) { - // dotless i or j - return [wideLatinLetterData[0][2], wideLatinLetterData[0][j]]; - } else if (0x1D6A6 < codePoint && codePoint < 0x1D7CE) { - // Greek letters. Not supported, yet. - return ["", ""]; - } else { - // We don't support any wide characters outside 1D400–1D7FF. - throw new src_ParseError("Unsupported character: " + wideChar); - } -}; -// CONCATENATED MODULE: ./src/Options.js -/** - * This file contains information about the options that the Parser carries - * around with it while parsing. Data is held in an `Options` object, and when - * recursing, a new `Options` object can be created with the `.with*` and - * `.reset` functions. - */ - -var sizeStyleMap = [// Each element contains [textsize, scriptsize, scriptscriptsize]. -// The size mappings are taken from TeX with \normalsize=10pt. -[1, 1, 1], // size1: [5, 5, 5] \tiny -[2, 1, 1], // size2: [6, 5, 5] -[3, 1, 1], // size3: [7, 5, 5] \scriptsize -[4, 2, 1], // size4: [8, 6, 5] \footnotesize -[5, 2, 1], // size5: [9, 6, 5] \small -[6, 3, 1], // size6: [10, 7, 5] \normalsize -[7, 4, 2], // size7: [12, 8, 6] \large -[8, 6, 3], // size8: [14.4, 10, 7] \Large -[9, 7, 6], // size9: [17.28, 12, 10] \LARGE -[10, 8, 7], // size10: [20.74, 14.4, 12] \huge -[11, 10, 9]]; -var sizeMultipliers = [// fontMetrics.js:getGlobalMetrics also uses size indexes, so if -// you change size indexes, change that function. -0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.2, 1.44, 1.728, 2.074, 2.488]; - -var sizeAtStyle = function sizeAtStyle(size, style) { - return style.size < 2 ? size : sizeStyleMap[size - 1][style.size - 1]; -}; // In these types, "" (empty string) means "no change". - - -/** - * This is the main options class. It contains the current style, size, color, - * and font. - * - * Options objects should not be modified. To create a new Options with - * different properties, call a `.having*` method. - */ -var Options_Options = -/*#__PURE__*/ -function () { - // A font family applies to a group of fonts (i.e. SansSerif), while a font - // represents a specific font (i.e. SansSerif Bold). - // See: https://tex.stackexchange.com/questions/22350/difference-between-textrm-and-mathrm - - /** - * The base size index. - */ - function Options(data) { - this.style = void 0; - this.color = void 0; - this.size = void 0; - this.textSize = void 0; - this.phantom = void 0; - this.font = void 0; - this.fontFamily = void 0; - this.fontWeight = void 0; - this.fontShape = void 0; - this.sizeMultiplier = void 0; - this.maxSize = void 0; - this.minRuleThickness = void 0; - this._fontMetrics = void 0; - this.style = data.style; - this.color = data.color; - this.size = data.size || Options.BASESIZE; - this.textSize = data.textSize || this.size; - this.phantom = !!data.phantom; - this.font = data.font || ""; - this.fontFamily = data.fontFamily || ""; - this.fontWeight = data.fontWeight || ''; - this.fontShape = data.fontShape || ''; - this.sizeMultiplier = sizeMultipliers[this.size - 1]; - this.maxSize = data.maxSize; - this.minRuleThickness = data.minRuleThickness; - this._fontMetrics = undefined; - } - /** - * Returns a new options object with the same properties as "this". Properties - * from "extension" will be copied to the new options object. - */ - - - var _proto = Options.prototype; - - _proto.extend = function extend(extension) { - var data = { - style: this.style, - size: this.size, - textSize: this.textSize, - color: this.color, - phantom: this.phantom, - font: this.font, - fontFamily: this.fontFamily, - fontWeight: this.fontWeight, - fontShape: this.fontShape, - maxSize: this.maxSize, - minRuleThickness: this.minRuleThickness - }; - - for (var key in extension) { - if (extension.hasOwnProperty(key)) { - data[key] = extension[key]; - } - } - - return new Options(data); - } - /** - * Return an options object with the given style. If `this.style === style`, - * returns `this`. - */ - ; - - _proto.havingStyle = function havingStyle(style) { - if (this.style === style) { - return this; - } else { - return this.extend({ - style: style, - size: sizeAtStyle(this.textSize, style) - }); - } - } - /** - * Return an options object with a cramped version of the current style. If - * the current style is cramped, returns `this`. - */ - ; - - _proto.havingCrampedStyle = function havingCrampedStyle() { - return this.havingStyle(this.style.cramp()); - } - /** - * Return an options object with the given size and in at least `\textstyle`. - * Returns `this` if appropriate. - */ - ; - - _proto.havingSize = function havingSize(size) { - if (this.size === size && this.textSize === size) { - return this; - } else { - return this.extend({ - style: this.style.text(), - size: size, - textSize: size, - sizeMultiplier: sizeMultipliers[size - 1] - }); - } - } - /** - * Like `this.havingSize(BASESIZE).havingStyle(style)`. If `style` is omitted, - * changes to at least `\textstyle`. - */ - ; - - _proto.havingBaseStyle = function havingBaseStyle(style) { - style = style || this.style.text(); - var wantSize = sizeAtStyle(Options.BASESIZE, style); - - if (this.size === wantSize && this.textSize === Options.BASESIZE && this.style === style) { - return this; - } else { - return this.extend({ - style: style, - size: wantSize - }); - } - } - /** - * Remove the effect of sizing changes such as \Huge. - * Keep the effect of the current style, such as \scriptstyle. - */ - ; - - _proto.havingBaseSizing = function havingBaseSizing() { - var size; - - switch (this.style.id) { - case 4: - case 5: - size = 3; // normalsize in scriptstyle - - break; - - case 6: - case 7: - size = 1; // normalsize in scriptscriptstyle - - break; - - default: - size = 6; - // normalsize in textstyle or displaystyle - } - - return this.extend({ - style: this.style.text(), - size: size - }); - } - /** - * Create a new options object with the given color. - */ - ; - - _proto.withColor = function withColor(color) { - return this.extend({ - color: color - }); - } - /** - * Create a new options object with "phantom" set to true. - */ - ; - - _proto.withPhantom = function withPhantom() { - return this.extend({ - phantom: true - }); - } - /** - * Creates a new options object with the given math font or old text font. - * @type {[type]} - */ - ; - - _proto.withFont = function withFont(font) { - return this.extend({ - font: font - }); - } - /** - * Create a new options objects with the given fontFamily. - */ - ; - - _proto.withTextFontFamily = function withTextFontFamily(fontFamily) { - return this.extend({ - fontFamily: fontFamily, - font: "" - }); - } - /** - * Creates a new options object with the given font weight - */ - ; - - _proto.withTextFontWeight = function withTextFontWeight(fontWeight) { - return this.extend({ - fontWeight: fontWeight, - font: "" - }); - } - /** - * Creates a new options object with the given font weight - */ - ; - - _proto.withTextFontShape = function withTextFontShape(fontShape) { - return this.extend({ - fontShape: fontShape, - font: "" - }); - } - /** - * Return the CSS sizing classes required to switch from enclosing options - * `oldOptions` to `this`. Returns an array of classes. - */ - ; - - _proto.sizingClasses = function sizingClasses(oldOptions) { - if (oldOptions.size !== this.size) { - return ["sizing", "reset-size" + oldOptions.size, "size" + this.size]; - } else { - return []; - } - } - /** - * Return the CSS sizing classes required to switch to the base size. Like - * `this.havingSize(BASESIZE).sizingClasses(this)`. - */ - ; - - _proto.baseSizingClasses = function baseSizingClasses() { - if (this.size !== Options.BASESIZE) { - return ["sizing", "reset-size" + this.size, "size" + Options.BASESIZE]; - } else { - return []; - } - } - /** - * Return the font metrics for this size. - */ - ; - - _proto.fontMetrics = function fontMetrics() { - if (!this._fontMetrics) { - this._fontMetrics = getGlobalMetrics(this.size); - } - - return this._fontMetrics; - } - /** - * Gets the CSS color of the current options object - */ - ; - - _proto.getColor = function getColor() { - if (this.phantom) { - return "transparent"; - } else { - return this.color; - } - }; - - return Options; -}(); - -Options_Options.BASESIZE = 6; -/* harmony default export */ var src_Options = (Options_Options); -// CONCATENATED MODULE: ./src/units.js -/** - * This file does conversion between units. In particular, it provides - * calculateSize to convert other units into ems. - */ - - // This table gives the number of TeX pts in one of each *absolute* TeX unit. -// Thus, multiplying a length by this number converts the length from units -// into pts. Dividing the result by ptPerEm gives the number of ems -// *assuming* a font size of ptPerEm (normal size, normal style). - -var ptPerUnit = { - // https://en.wikibooks.org/wiki/LaTeX/Lengths and - // https://tex.stackexchange.com/a/8263 - "pt": 1, - // TeX point - "mm": 7227 / 2540, - // millimeter - "cm": 7227 / 254, - // centimeter - "in": 72.27, - // inch - "bp": 803 / 800, - // big (PostScript) points - "pc": 12, - // pica - "dd": 1238 / 1157, - // didot - "cc": 14856 / 1157, - // cicero (12 didot) - "nd": 685 / 642, - // new didot - "nc": 1370 / 107, - // new cicero (12 new didot) - "sp": 1 / 65536, - // scaled point (TeX's internal smallest unit) - // https://tex.stackexchange.com/a/41371 - "px": 803 / 800 // \pdfpxdimen defaults to 1 bp in pdfTeX and LuaTeX - -}; // Dictionary of relative units, for fast validity testing. - -var relativeUnit = { - "ex": true, - "em": true, - "mu": true -}; - -/** - * Determine whether the specified unit (either a string defining the unit - * or a "size" parse node containing a unit field) is valid. - */ -var validUnit = function validUnit(unit) { - if (typeof unit !== "string") { - unit = unit.unit; - } - - return unit in ptPerUnit || unit in relativeUnit || unit === "ex"; -}; -/* - * Convert a "size" parse node (with numeric "number" and string "unit" fields, - * as parsed by functions.js argType "size") into a CSS em value for the - * current style/scale. `options` gives the current options. - */ - -var units_calculateSize = function calculateSize(sizeValue, options) { - var scale; - - if (sizeValue.unit in ptPerUnit) { - // Absolute units - scale = ptPerUnit[sizeValue.unit] // Convert unit to pt - / options.fontMetrics().ptPerEm // Convert pt to CSS em - / options.sizeMultiplier; // Unscale to make absolute units - } else if (sizeValue.unit === "mu") { - // `mu` units scale with scriptstyle/scriptscriptstyle. - scale = options.fontMetrics().cssEmPerMu; - } else { - // Other relative units always refer to the *textstyle* font - // in the current size. - var unitOptions; - - if (options.style.isTight()) { - // isTight() means current style is script/scriptscript. - unitOptions = options.havingStyle(options.style.text()); - } else { - unitOptions = options; - } // TODO: In TeX these units are relative to the quad of the current - // *text* font, e.g. cmr10. KaTeX instead uses values from the - // comparably-sized *Computer Modern symbol* font. At 10pt, these - // match. At 7pt and 5pt, they differ: cmr7=1.138894, cmsy7=1.170641; - // cmr5=1.361133, cmsy5=1.472241. Consider $\scriptsize a\kern1emb$. - // TeX \showlists shows a kern of 1.13889 * fontsize; - // KaTeX shows a kern of 1.171 * fontsize. - - - if (sizeValue.unit === "ex") { - scale = unitOptions.fontMetrics().xHeight; - } else if (sizeValue.unit === "em") { - scale = unitOptions.fontMetrics().quad; - } else { - throw new src_ParseError("Invalid unit: '" + sizeValue.unit + "'"); - } - - if (unitOptions !== options) { - scale *= unitOptions.sizeMultiplier / options.sizeMultiplier; - } - } - - return Math.min(sizeValue.number * scale, options.maxSize); -}; -// CONCATENATED MODULE: ./src/buildCommon.js -/* eslint no-console:0 */ - -/** - * This module contains general functions that can be used for building - * different kinds of domTree nodes in a consistent manner. - */ - - - - - - - -/** - * Looks up the given symbol in fontMetrics, after applying any symbol - * replacements defined in symbol.js - */ -var buildCommon_lookupSymbol = function lookupSymbol(value, // TODO(#963): Use a union type for this. -fontName, mode) { - // Replace the value with its replaced value from symbol.js - if (src_symbols[mode][value] && src_symbols[mode][value].replace) { - value = src_symbols[mode][value].replace; - } - - return { - value: value, - metrics: getCharacterMetrics(value, fontName, mode) - }; -}; -/** - * Makes a symbolNode after translation via the list of symbols in symbols.js. - * Correctly pulls out metrics for the character, and optionally takes a list of - * classes to be attached to the node. - * - * TODO: make argument order closer to makeSpan - * TODO: add a separate argument for math class (e.g. `mop`, `mbin`), which - * should if present come first in `classes`. - * TODO(#953): Make `options` mandatory and always pass it in. - */ - - -var buildCommon_makeSymbol = function makeSymbol(value, fontName, mode, options, classes) { - var lookup = buildCommon_lookupSymbol(value, fontName, mode); - var metrics = lookup.metrics; - value = lookup.value; - var symbolNode; - - if (metrics) { - var italic = metrics.italic; - - if (mode === "text" || options && options.font === "mathit") { - italic = 0; - } - - symbolNode = new domTree_SymbolNode(value, metrics.height, metrics.depth, italic, metrics.skew, metrics.width, classes); - } else { - // TODO(emily): Figure out a good way to only print this in development - typeof console !== "undefined" && console.warn("No character metrics " + ("for '" + value + "' in style '" + fontName + "' and mode '" + mode + "'")); - symbolNode = new domTree_SymbolNode(value, 0, 0, 0, 0, 0, classes); - } - - if (options) { - symbolNode.maxFontSize = options.sizeMultiplier; - - if (options.style.isTight()) { - symbolNode.classes.push("mtight"); - } - - var color = options.getColor(); - - if (color) { - symbolNode.style.color = color; - } - } - - return symbolNode; -}; -/** - * Makes a symbol in Main-Regular or AMS-Regular. - * Used for rel, bin, open, close, inner, and punct. - */ - - -var buildCommon_mathsym = function mathsym(value, mode, options, classes) { - if (classes === void 0) { - classes = []; - } - - // Decide what font to render the symbol in by its entry in the symbols - // table. - // Have a special case for when the value = \ because the \ is used as a - // textord in unsupported command errors but cannot be parsed as a regular - // text ordinal and is therefore not present as a symbol in the symbols - // table for text, as well as a special case for boldsymbol because it - // can be used for bold + and - - if (options.font === "boldsymbol" && buildCommon_lookupSymbol(value, "Main-Bold", mode).metrics) { - return buildCommon_makeSymbol(value, "Main-Bold", mode, options, classes.concat(["mathbf"])); - } else if (value === "\\" || src_symbols[mode][value].font === "main") { - return buildCommon_makeSymbol(value, "Main-Regular", mode, options, classes); - } else { - return buildCommon_makeSymbol(value, "AMS-Regular", mode, options, classes.concat(["amsrm"])); - } -}; -/** - * Determines which of the two font names (Main-Bold and Math-BoldItalic) and - * corresponding style tags (mathbf or boldsymbol) to use for font "boldsymbol", - * depending on the symbol. Use this function instead of fontMap for font - * "boldsymbol". - */ - - -var boldsymbol = function boldsymbol(value, mode, options, classes, type) { - if (type !== "textord" && buildCommon_lookupSymbol(value, "Math-BoldItalic", mode).metrics) { - return { - fontName: "Math-BoldItalic", - fontClass: "boldsymbol" - }; - } else { - // Some glyphs do not exist in Math-BoldItalic so we need to use - // Main-Bold instead. - return { - fontName: "Main-Bold", - fontClass: "mathbf" - }; - } -}; -/** - * Makes either a mathord or textord in the correct font and color. - */ - - -var buildCommon_makeOrd = function makeOrd(group, options, type) { - var mode = group.mode; - var text = group.text; - var classes = ["mord"]; // Math mode or Old font (i.e. \rm) - - var isFont = mode === "math" || mode === "text" && options.font; - var fontOrFamily = isFont ? options.font : options.fontFamily; - - if (text.charCodeAt(0) === 0xD835) { - // surrogate pairs get special treatment - var _wideCharacterFont = wide_character_wideCharacterFont(text, mode), - wideFontName = _wideCharacterFont[0], - wideFontClass = _wideCharacterFont[1]; - - return buildCommon_makeSymbol(text, wideFontName, mode, options, classes.concat(wideFontClass)); - } else if (fontOrFamily) { - var fontName; - var fontClasses; - - if (fontOrFamily === "boldsymbol") { - var fontData = boldsymbol(text, mode, options, classes, type); - fontName = fontData.fontName; - fontClasses = [fontData.fontClass]; - } else if (isFont) { - fontName = fontMap[fontOrFamily].fontName; - fontClasses = [fontOrFamily]; - } else { - fontName = retrieveTextFontName(fontOrFamily, options.fontWeight, options.fontShape); - fontClasses = [fontOrFamily, options.fontWeight, options.fontShape]; - } - - if (buildCommon_lookupSymbol(text, fontName, mode).metrics) { - return buildCommon_makeSymbol(text, fontName, mode, options, classes.concat(fontClasses)); - } else if (ligatures.hasOwnProperty(text) && fontName.substr(0, 10) === "Typewriter") { - // Deconstruct ligatures in monospace fonts (\texttt, \tt). - var parts = []; - - for (var i = 0; i < text.length; i++) { - parts.push(buildCommon_makeSymbol(text[i], fontName, mode, options, classes.concat(fontClasses))); - } - - return buildCommon_makeFragment(parts); - } - } // Makes a symbol in the default font for mathords and textords. - - - if (type === "mathord") { - return buildCommon_makeSymbol(text, "Math-Italic", mode, options, classes.concat(["mathnormal"])); - } else if (type === "textord") { - var font = src_symbols[mode][text] && src_symbols[mode][text].font; - - if (font === "ams") { - var _fontName = retrieveTextFontName("amsrm", options.fontWeight, options.fontShape); - - return buildCommon_makeSymbol(text, _fontName, mode, options, classes.concat("amsrm", options.fontWeight, options.fontShape)); - } else if (font === "main" || !font) { - var _fontName2 = retrieveTextFontName("textrm", options.fontWeight, options.fontShape); - - return buildCommon_makeSymbol(text, _fontName2, mode, options, classes.concat(options.fontWeight, options.fontShape)); - } else { - // fonts added by plugins - var _fontName3 = retrieveTextFontName(font, options.fontWeight, options.fontShape); // We add font name as a css class - - - return buildCommon_makeSymbol(text, _fontName3, mode, options, classes.concat(_fontName3, options.fontWeight, options.fontShape)); - } - } else { - throw new Error("unexpected type: " + type + " in makeOrd"); - } -}; -/** - * Returns true if subsequent symbolNodes have the same classes, skew, maxFont, - * and styles. - */ - - -var buildCommon_canCombine = function canCombine(prev, next) { - if (createClass(prev.classes) !== createClass(next.classes) || prev.skew !== next.skew || prev.maxFontSize !== next.maxFontSize) { - return false; - } - - for (var style in prev.style) { - if (prev.style.hasOwnProperty(style) && prev.style[style] !== next.style[style]) { - return false; - } - } - - for (var _style in next.style) { - if (next.style.hasOwnProperty(_style) && prev.style[_style] !== next.style[_style]) { - return false; - } - } - - return true; -}; -/** - * Combine consequetive domTree.symbolNodes into a single symbolNode. - * Note: this function mutates the argument. - */ - - -var buildCommon_tryCombineChars = function tryCombineChars(chars) { - for (var i = 0; i < chars.length - 1; i++) { - var prev = chars[i]; - var next = chars[i + 1]; - - if (prev instanceof domTree_SymbolNode && next instanceof domTree_SymbolNode && buildCommon_canCombine(prev, next)) { - prev.text += next.text; - prev.height = Math.max(prev.height, next.height); - prev.depth = Math.max(prev.depth, next.depth); // Use the last character's italic correction since we use - // it to add padding to the right of the span created from - // the combined characters. - - prev.italic = next.italic; - chars.splice(i + 1, 1); - i--; - } - } - - return chars; -}; -/** - * Calculate the height, depth, and maxFontSize of an element based on its - * children. - */ - - -var sizeElementFromChildren = function sizeElementFromChildren(elem) { - var height = 0; - var depth = 0; - var maxFontSize = 0; - - for (var i = 0; i < elem.children.length; i++) { - var child = elem.children[i]; - - if (child.height > height) { - height = child.height; - } - - if (child.depth > depth) { - depth = child.depth; - } - - if (child.maxFontSize > maxFontSize) { - maxFontSize = child.maxFontSize; - } - } - - elem.height = height; - elem.depth = depth; - elem.maxFontSize = maxFontSize; -}; -/** - * Makes a span with the given list of classes, list of children, and options. - * - * TODO(#953): Ensure that `options` is always provided (currently some call - * sites don't pass it) and make the type below mandatory. - * TODO: add a separate argument for math class (e.g. `mop`, `mbin`), which - * should if present come first in `classes`. - */ - - -var buildCommon_makeSpan = function makeSpan(classes, children, options, style) { - var span = new domTree_Span(classes, children, options, style); - sizeElementFromChildren(span); - return span; -}; // SVG one is simpler -- doesn't require height, depth, max-font setting. -// This is also a separate method for typesafety. - - -var buildCommon_makeSvgSpan = function makeSvgSpan(classes, children, options, style) { - return new domTree_Span(classes, children, options, style); -}; - -var makeLineSpan = function makeLineSpan(className, options, thickness) { - var line = buildCommon_makeSpan([className], [], options); - line.height = Math.max(thickness || options.fontMetrics().defaultRuleThickness, options.minRuleThickness); - line.style.borderBottomWidth = line.height + "em"; - line.maxFontSize = 1.0; - return line; -}; -/** - * Makes an anchor with the given href, list of classes, list of children, - * and options. - */ - - -var buildCommon_makeAnchor = function makeAnchor(href, classes, children, options) { - var anchor = new domTree_Anchor(href, classes, children, options); - sizeElementFromChildren(anchor); - return anchor; -}; -/** - * Makes a document fragment with the given list of children. - */ - - -var buildCommon_makeFragment = function makeFragment(children) { - var fragment = new tree_DocumentFragment(children); - sizeElementFromChildren(fragment); - return fragment; -}; -/** - * Wraps group in a span if it's a document fragment, allowing to apply classes - * and styles - */ - - -var buildCommon_wrapFragment = function wrapFragment(group, options) { - if (group instanceof tree_DocumentFragment) { - return buildCommon_makeSpan([], [group], options); - } - - return group; -}; // These are exact object types to catch typos in the names of the optional fields. - - -// Computes the updated `children` list and the overall depth. -// -// This helper function for makeVList makes it easier to enforce type safety by -// allowing early exits (returns) in the logic. -var getVListChildrenAndDepth = function getVListChildrenAndDepth(params) { - if (params.positionType === "individualShift") { - var oldChildren = params.children; - var children = [oldChildren[0]]; // Add in kerns to the list of params.children to get each element to be - // shifted to the correct specified shift - - var _depth = -oldChildren[0].shift - oldChildren[0].elem.depth; - - var currPos = _depth; - - for (var i = 1; i < oldChildren.length; i++) { - var diff = -oldChildren[i].shift - currPos - oldChildren[i].elem.depth; - var size = diff - (oldChildren[i - 1].elem.height + oldChildren[i - 1].elem.depth); - currPos = currPos + diff; - children.push({ - type: "kern", - size: size - }); - children.push(oldChildren[i]); - } - - return { - children: children, - depth: _depth - }; - } - - var depth; - - if (params.positionType === "top") { - // We always start at the bottom, so calculate the bottom by adding up - // all the sizes - var bottom = params.positionData; - - for (var _i = 0; _i < params.children.length; _i++) { - var child = params.children[_i]; - bottom -= child.type === "kern" ? child.size : child.elem.height + child.elem.depth; - } - - depth = bottom; - } else if (params.positionType === "bottom") { - depth = -params.positionData; - } else { - var firstChild = params.children[0]; - - if (firstChild.type !== "elem") { - throw new Error('First child must have type "elem".'); - } - - if (params.positionType === "shift") { - depth = -firstChild.elem.depth - params.positionData; - } else if (params.positionType === "firstBaseline") { - depth = -firstChild.elem.depth; - } else { - throw new Error("Invalid positionType " + params.positionType + "."); - } - } - - return { - children: params.children, - depth: depth - }; -}; -/** - * Makes a vertical list by stacking elements and kerns on top of each other. - * Allows for many different ways of specifying the positioning method. - * - * See VListParam documentation above. - */ - - -var buildCommon_makeVList = function makeVList(params, options) { - var _getVListChildrenAndD = getVListChildrenAndDepth(params), - children = _getVListChildrenAndD.children, - depth = _getVListChildrenAndD.depth; // Create a strut that is taller than any list item. The strut is added to - // each item, where it will determine the item's baseline. Since it has - // `overflow:hidden`, the strut's top edge will sit on the item's line box's - // top edge and the strut's bottom edge will sit on the item's baseline, - // with no additional line-height spacing. This allows the item baseline to - // be positioned precisely without worrying about font ascent and - // line-height. - - - var pstrutSize = 0; - - for (var i = 0; i < children.length; i++) { - var child = children[i]; - - if (child.type === "elem") { - var elem = child.elem; - pstrutSize = Math.max(pstrutSize, elem.maxFontSize, elem.height); - } - } - - pstrutSize += 2; - var pstrut = buildCommon_makeSpan(["pstrut"], []); - pstrut.style.height = pstrutSize + "em"; // Create a new list of actual children at the correct offsets - - var realChildren = []; - var minPos = depth; - var maxPos = depth; - var currPos = depth; - - for (var _i2 = 0; _i2 < children.length; _i2++) { - var _child = children[_i2]; - - if (_child.type === "kern") { - currPos += _child.size; - } else { - var _elem = _child.elem; - var classes = _child.wrapperClasses || []; - var style = _child.wrapperStyle || {}; - var childWrap = buildCommon_makeSpan(classes, [pstrut, _elem], undefined, style); - childWrap.style.top = -pstrutSize - currPos - _elem.depth + "em"; - - if (_child.marginLeft) { - childWrap.style.marginLeft = _child.marginLeft; - } - - if (_child.marginRight) { - childWrap.style.marginRight = _child.marginRight; - } - - realChildren.push(childWrap); - currPos += _elem.height + _elem.depth; - } - - minPos = Math.min(minPos, currPos); - maxPos = Math.max(maxPos, currPos); - } // The vlist contents go in a table-cell with `vertical-align:bottom`. - // This cell's bottom edge will determine the containing table's baseline - // without overly expanding the containing line-box. - - - var vlist = buildCommon_makeSpan(["vlist"], realChildren); - vlist.style.height = maxPos + "em"; // A second row is used if necessary to represent the vlist's depth. - - var rows; - - if (minPos < 0) { - // We will define depth in an empty span with display: table-cell. - // It should render with the height that we define. But Chrome, in - // contenteditable mode only, treats that span as if it contains some - // text content. And that min-height over-rides our desired height. - // So we put another empty span inside the depth strut span. - var emptySpan = buildCommon_makeSpan([], []); - var depthStrut = buildCommon_makeSpan(["vlist"], [emptySpan]); - depthStrut.style.height = -minPos + "em"; // Safari wants the first row to have inline content; otherwise it - // puts the bottom of the *second* row on the baseline. - - var topStrut = buildCommon_makeSpan(["vlist-s"], [new domTree_SymbolNode("\u200B")]); - rows = [buildCommon_makeSpan(["vlist-r"], [vlist, topStrut]), buildCommon_makeSpan(["vlist-r"], [depthStrut])]; - } else { - rows = [buildCommon_makeSpan(["vlist-r"], [vlist])]; - } - - var vtable = buildCommon_makeSpan(["vlist-t"], rows); - - if (rows.length === 2) { - vtable.classes.push("vlist-t2"); - } - - vtable.height = maxPos; - vtable.depth = -minPos; - return vtable; -}; // Glue is a concept from TeX which is a flexible space between elements in -// either a vertical or horizontal list. In KaTeX, at least for now, it's -// static space between elements in a horizontal layout. - - -var buildCommon_makeGlue = function makeGlue(measurement, options) { - // Make an empty span for the space - var rule = buildCommon_makeSpan(["mspace"], [], options); - var size = units_calculateSize(measurement, options); - rule.style.marginRight = size + "em"; - return rule; -}; // Takes font options, and returns the appropriate fontLookup name - - -var retrieveTextFontName = function retrieveTextFontName(fontFamily, fontWeight, fontShape) { - var baseFontName = ""; - - switch (fontFamily) { - case "amsrm": - baseFontName = "AMS"; - break; - - case "textrm": - baseFontName = "Main"; - break; - - case "textsf": - baseFontName = "SansSerif"; - break; - - case "texttt": - baseFontName = "Typewriter"; - break; - - default: - baseFontName = fontFamily; - // use fonts added by a plugin - } - - var fontStylesName; - - if (fontWeight === "textbf" && fontShape === "textit") { - fontStylesName = "BoldItalic"; - } else if (fontWeight === "textbf") { - fontStylesName = "Bold"; - } else if (fontWeight === "textit") { - fontStylesName = "Italic"; - } else { - fontStylesName = "Regular"; - } - - return baseFontName + "-" + fontStylesName; -}; -/** - * Maps TeX font commands to objects containing: - * - variant: string used for "mathvariant" attribute in buildMathML.js - * - fontName: the "style" parameter to fontMetrics.getCharacterMetrics - */ -// A map between tex font commands an MathML mathvariant attribute values - - -var fontMap = { - // styles - "mathbf": { - variant: "bold", - fontName: "Main-Bold" - }, - "mathrm": { - variant: "normal", - fontName: "Main-Regular" - }, - "textit": { - variant: "italic", - fontName: "Main-Italic" - }, - "mathit": { - variant: "italic", - fontName: "Main-Italic" - }, - "mathnormal": { - variant: "italic", - fontName: "Math-Italic" - }, - // "boldsymbol" is missing because they require the use of multiple fonts: - // Math-BoldItalic and Main-Bold. This is handled by a special case in - // makeOrd which ends up calling boldsymbol. - // families - "mathbb": { - variant: "double-struck", - fontName: "AMS-Regular" - }, - "mathcal": { - variant: "script", - fontName: "Caligraphic-Regular" - }, - "mathfrak": { - variant: "fraktur", - fontName: "Fraktur-Regular" - }, - "mathscr": { - variant: "script", - fontName: "Script-Regular" - }, - "mathsf": { - variant: "sans-serif", - fontName: "SansSerif-Regular" - }, - "mathtt": { - variant: "monospace", - fontName: "Typewriter-Regular" - } -}; -var svgData = { - // path, width, height - vec: ["vec", 0.471, 0.714], - // values from the font glyph - oiintSize1: ["oiintSize1", 0.957, 0.499], - // oval to overlay the integrand - oiintSize2: ["oiintSize2", 1.472, 0.659], - oiiintSize1: ["oiiintSize1", 1.304, 0.499], - oiiintSize2: ["oiiintSize2", 1.98, 0.659], - leftParenInner: ["leftParenInner", 0.875, 0.3], - rightParenInner: ["rightParenInner", 0.875, 0.3] -}; - -var buildCommon_staticSvg = function staticSvg(value, options) { - // Create a span with inline SVG for the element. - var _svgData$value = svgData[value], - pathName = _svgData$value[0], - width = _svgData$value[1], - height = _svgData$value[2]; - var path = new domTree_PathNode(pathName); - var svgNode = new SvgNode([path], { - "width": width + "em", - "height": height + "em", - // Override CSS rule `.katex svg { width: 100% }` - "style": "width:" + width + "em", - "viewBox": "0 0 " + 1000 * width + " " + 1000 * height, - "preserveAspectRatio": "xMinYMin" - }); - var span = buildCommon_makeSvgSpan(["overlay"], [svgNode], options); - span.height = height; - span.style.height = height + "em"; - span.style.width = width + "em"; - return span; -}; - -/* harmony default export */ var buildCommon = ({ - fontMap: fontMap, - makeSymbol: buildCommon_makeSymbol, - mathsym: buildCommon_mathsym, - makeSpan: buildCommon_makeSpan, - makeSvgSpan: buildCommon_makeSvgSpan, - makeLineSpan: makeLineSpan, - makeAnchor: buildCommon_makeAnchor, - makeFragment: buildCommon_makeFragment, - wrapFragment: buildCommon_wrapFragment, - makeVList: buildCommon_makeVList, - makeOrd: buildCommon_makeOrd, - makeGlue: buildCommon_makeGlue, - staticSvg: buildCommon_staticSvg, - svgData: svgData, - tryCombineChars: buildCommon_tryCombineChars -}); -// CONCATENATED MODULE: ./src/spacingData.js -/** - * Describes spaces between different classes of atoms. - */ -var thinspace = { - number: 3, - unit: "mu" -}; -var mediumspace = { - number: 4, - unit: "mu" -}; -var thickspace = { - number: 5, - unit: "mu" -}; // Making the type below exact with all optional fields doesn't work due to -// - https://github.com/facebook/flow/issues/4582 -// - https://github.com/facebook/flow/issues/5688 -// However, since *all* fields are optional, $Shape<> works as suggested in 5688 -// above. - -// Spacing relationships for display and text styles -var spacings = { - mord: { - mop: thinspace, - mbin: mediumspace, - mrel: thickspace, - minner: thinspace - }, - mop: { - mord: thinspace, - mop: thinspace, - mrel: thickspace, - minner: thinspace - }, - mbin: { - mord: mediumspace, - mop: mediumspace, - mopen: mediumspace, - minner: mediumspace - }, - mrel: { - mord: thickspace, - mop: thickspace, - mopen: thickspace, - minner: thickspace - }, - mopen: {}, - mclose: { - mop: thinspace, - mbin: mediumspace, - mrel: thickspace, - minner: thinspace - }, - mpunct: { - mord: thinspace, - mop: thinspace, - mrel: thickspace, - mopen: thinspace, - mclose: thinspace, - mpunct: thinspace, - minner: thinspace - }, - minner: { - mord: thinspace, - mop: thinspace, - mbin: mediumspace, - mrel: thickspace, - mopen: thinspace, - mpunct: thinspace, - minner: thinspace - } -}; // Spacing relationships for script and scriptscript styles - -var tightSpacings = { - mord: { - mop: thinspace - }, - mop: { - mord: thinspace, - mop: thinspace - }, - mbin: {}, - mrel: {}, - mopen: {}, - mclose: { - mop: thinspace - }, - mpunct: {}, - minner: { - mop: thinspace - } -}; -// CONCATENATED MODULE: ./src/defineFunction.js -/** Context provided to function handlers for error messages. */ -// Note: reverse the order of the return type union will cause a flow error. -// See https://github.com/facebook/flow/issues/3663. -// More general version of `HtmlBuilder` for nodes (e.g. \sum, accent types) -// whose presence impacts super/subscripting. In this case, ParseNode<"supsub"> -// delegates its HTML building to the HtmlBuilder corresponding to these nodes. - -/** - * Final function spec for use at parse time. - * This is almost identical to `FunctionPropSpec`, except it - * 1. includes the function handler, and - * 2. requires all arguments except argTypes. - * It is generated by `defineFunction()` below. - */ - -/** - * All registered functions. - * `functions.js` just exports this same dictionary again and makes it public. - * `Parser.js` requires this dictionary. - */ -var _functions = {}; -/** - * All HTML builders. Should be only used in the `define*` and the `build*ML` - * functions. - */ - -var _htmlGroupBuilders = {}; -/** - * All MathML builders. Should be only used in the `define*` and the `build*ML` - * functions. - */ - -var _mathmlGroupBuilders = {}; -function defineFunction(_ref) { - var type = _ref.type, - names = _ref.names, - props = _ref.props, - handler = _ref.handler, - htmlBuilder = _ref.htmlBuilder, - mathmlBuilder = _ref.mathmlBuilder; - // Set default values of functions - var data = { - type: type, - numArgs: props.numArgs, - argTypes: props.argTypes, - greediness: props.greediness === undefined ? 1 : props.greediness, - allowedInText: !!props.allowedInText, - allowedInMath: props.allowedInMath === undefined ? true : props.allowedInMath, - numOptionalArgs: props.numOptionalArgs || 0, - infix: !!props.infix, - handler: handler - }; - - for (var i = 0; i < names.length; ++i) { - _functions[names[i]] = data; - } - - if (type) { - if (htmlBuilder) { - _htmlGroupBuilders[type] = htmlBuilder; - } - - if (mathmlBuilder) { - _mathmlGroupBuilders[type] = mathmlBuilder; - } - } -} -/** - * Use this to register only the HTML and MathML builders for a function (e.g. - * if the function's ParseNode is generated in Parser.js rather than via a - * stand-alone handler provided to `defineFunction`). - */ - -function defineFunctionBuilders(_ref2) { - var type = _ref2.type, - htmlBuilder = _ref2.htmlBuilder, - mathmlBuilder = _ref2.mathmlBuilder; - defineFunction({ - type: type, - names: [], - props: { - numArgs: 0 - }, - handler: function handler() { - throw new Error('Should never be called.'); - }, - htmlBuilder: htmlBuilder, - mathmlBuilder: mathmlBuilder - }); -} // Since the corresponding buildHTML/buildMathML function expects a -// list of elements, we normalize for different kinds of arguments - -var ordargument = function ordargument(arg) { - return arg.type === "ordgroup" ? arg.body : [arg]; -}; -// CONCATENATED MODULE: ./src/buildHTML.js -/** - * This file does the main work of building a domTree structure from a parse - * tree. The entry point is the `buildHTML` function, which takes a parse tree. - * Then, the buildExpression, buildGroup, and various groupBuilders functions - * are called, to produce a final HTML tree. - */ - - - - - - - - -var buildHTML_makeSpan = buildCommon.makeSpan; // Binary atoms (first class `mbin`) change into ordinary atoms (`mord`) -// depending on their surroundings. See TeXbook pg. 442-446, Rules 5 and 6, -// and the text before Rule 19. - -var binLeftCanceller = ["leftmost", "mbin", "mopen", "mrel", "mop", "mpunct"]; -var binRightCanceller = ["rightmost", "mrel", "mclose", "mpunct"]; -var styleMap = { - "display": src_Style.DISPLAY, - "text": src_Style.TEXT, - "script": src_Style.SCRIPT, - "scriptscript": src_Style.SCRIPTSCRIPT -}; -var DomEnum = { - mord: "mord", - mop: "mop", - mbin: "mbin", - mrel: "mrel", - mopen: "mopen", - mclose: "mclose", - mpunct: "mpunct", - minner: "minner" -}; - -/** - * Take a list of nodes, build them in order, and return a list of the built - * nodes. documentFragments are flattened into their contents, so the - * returned list contains no fragments. `isRealGroup` is true if `expression` - * is a real group (no atoms will be added on either side), as opposed to - * a partial group (e.g. one created by \color). `surrounding` is an array - * consisting type of nodes that will be added to the left and right. - */ -var buildHTML_buildExpression = function buildExpression(expression, options, isRealGroup, surrounding) { - if (surrounding === void 0) { - surrounding = [null, null]; - } - - // Parse expressions into `groups`. - var groups = []; - - for (var i = 0; i < expression.length; i++) { - var output = buildHTML_buildGroup(expression[i], options); - - if (output instanceof tree_DocumentFragment) { - var children = output.children; - groups.push.apply(groups, children); - } else { - groups.push(output); - } - } // If `expression` is a partial group, let the parent handle spacings - // to avoid processing groups multiple times. - - - if (!isRealGroup) { - return groups; - } - - var glueOptions = options; - - if (expression.length === 1) { - var node = expression[0]; - - if (node.type === "sizing") { - glueOptions = options.havingSize(node.size); - } else if (node.type === "styling") { - glueOptions = options.havingStyle(styleMap[node.style]); - } - } // Dummy spans for determining spacings between surrounding atoms. - // If `expression` has no atoms on the left or right, class "leftmost" - // or "rightmost", respectively, is used to indicate it. - - - var dummyPrev = buildHTML_makeSpan([surrounding[0] || "leftmost"], [], options); - var dummyNext = buildHTML_makeSpan([surrounding[1] || "rightmost"], [], options); // TODO: These code assumes that a node's math class is the first element - // of its `classes` array. A later cleanup should ensure this, for - // instance by changing the signature of `makeSpan`. - // Before determining what spaces to insert, perform bin cancellation. - // Binary operators change to ordinary symbols in some contexts. - - var isRoot = isRealGroup === "root"; - traverseNonSpaceNodes(groups, function (node, prev) { - var prevType = prev.classes[0]; - var type = node.classes[0]; - - if (prevType === "mbin" && utils.contains(binRightCanceller, type)) { - prev.classes[0] = "mord"; - } else if (type === "mbin" && utils.contains(binLeftCanceller, prevType)) { - node.classes[0] = "mord"; - } - }, { - node: dummyPrev - }, dummyNext, isRoot); - traverseNonSpaceNodes(groups, function (node, prev) { - var prevType = getTypeOfDomTree(prev); - var type = getTypeOfDomTree(node); // 'mtight' indicates that the node is script or scriptscript style. - - var space = prevType && type ? node.hasClass("mtight") ? tightSpacings[prevType][type] : spacings[prevType][type] : null; - - if (space) { - // Insert glue (spacing) after the `prev`. - return buildCommon.makeGlue(space, glueOptions); - } - }, { - node: dummyPrev - }, dummyNext, isRoot); - return groups; -}; // Depth-first traverse non-space `nodes`, calling `callback` with the current and -// previous node as arguments, optionally returning a node to insert after the -// previous node. `prev` is an object with the previous node and `insertAfter` -// function to insert after it. `next` is a node that will be added to the right. -// Used for bin cancellation and inserting spacings. - -var traverseNonSpaceNodes = function traverseNonSpaceNodes(nodes, callback, prev, next, isRoot) { - if (next) { - // temporarily append the right node, if exists - nodes.push(next); - } - - var i = 0; - - for (; i < nodes.length; i++) { - var node = nodes[i]; - var partialGroup = buildHTML_checkPartialGroup(node); - - if (partialGroup) { - // Recursive DFS - // $FlowFixMe: make nodes a $ReadOnlyArray by returning a new array - traverseNonSpaceNodes(partialGroup.children, callback, prev, null, isRoot); - continue; - } // Ignore explicit spaces (e.g., \;, \,) when determining what implicit - // spacing should go between atoms of different classes - - - var nonspace = !node.hasClass("mspace"); - - if (nonspace) { - var result = callback(node, prev.node); - - if (result) { - if (prev.insertAfter) { - prev.insertAfter(result); - } else { - // insert at front - nodes.unshift(result); - i++; - } - } - } - - if (nonspace) { - prev.node = node; - } else if (isRoot && node.hasClass("newline")) { - prev.node = buildHTML_makeSpan(["leftmost"]); // treat like beginning of line - } - - prev.insertAfter = function (index) { - return function (n) { - nodes.splice(index + 1, 0, n); - i++; - }; - }(i); - } - - if (next) { - nodes.pop(); - } -}; // Check if given node is a partial group, i.e., does not affect spacing around. - - -var buildHTML_checkPartialGroup = function checkPartialGroup(node) { - if (node instanceof tree_DocumentFragment || node instanceof domTree_Anchor || node instanceof domTree_Span && node.hasClass("enclosing")) { - return node; - } - - return null; -}; // Return the outermost node of a domTree. - - -var getOutermostNode = function getOutermostNode(node, side) { - var partialGroup = buildHTML_checkPartialGroup(node); - - if (partialGroup) { - var children = partialGroup.children; - - if (children.length) { - if (side === "right") { - return getOutermostNode(children[children.length - 1], "right"); - } else if (side === "left") { - return getOutermostNode(children[0], "left"); - } - } - } - - return node; -}; // Return math atom class (mclass) of a domTree. -// If `side` is given, it will get the type of the outermost node at given side. - - -var getTypeOfDomTree = function getTypeOfDomTree(node, side) { - if (!node) { - return null; - } - - if (side) { - node = getOutermostNode(node, side); - } // This makes a lot of assumptions as to where the type of atom - // appears. We should do a better job of enforcing this. - - - return DomEnum[node.classes[0]] || null; -}; -var makeNullDelimiter = function makeNullDelimiter(options, classes) { - var moreClasses = ["nulldelimiter"].concat(options.baseSizingClasses()); - return buildHTML_makeSpan(classes.concat(moreClasses)); -}; -/** - * buildGroup is the function that takes a group and calls the correct groupType - * function for it. It also handles the interaction of size and style changes - * between parents and children. - */ - -var buildHTML_buildGroup = function buildGroup(group, options, baseOptions) { - if (!group) { - return buildHTML_makeSpan(); - } - - if (_htmlGroupBuilders[group.type]) { - // Call the groupBuilders function - var groupNode = _htmlGroupBuilders[group.type](group, options); // If the size changed between the parent and the current group, account - // for that size difference. - - if (baseOptions && options.size !== baseOptions.size) { - groupNode = buildHTML_makeSpan(options.sizingClasses(baseOptions), [groupNode], options); - var multiplier = options.sizeMultiplier / baseOptions.sizeMultiplier; - groupNode.height *= multiplier; - groupNode.depth *= multiplier; - } - - return groupNode; - } else { - throw new src_ParseError("Got group of unknown type: '" + group.type + "'"); - } -}; -/** - * Combine an array of HTML DOM nodes (e.g., the output of `buildExpression`) - * into an unbreakable HTML node of class .base, with proper struts to - * guarantee correct vertical extent. `buildHTML` calls this repeatedly to - * make up the entire expression as a sequence of unbreakable units. - */ - -function buildHTMLUnbreakable(children, options) { - // Compute height and depth of this chunk. - var body = buildHTML_makeSpan(["base"], children, options); // Add strut, which ensures that the top of the HTML element falls at - // the height of the expression, and the bottom of the HTML element - // falls at the depth of the expression. - - var strut = buildHTML_makeSpan(["strut"]); - strut.style.height = body.height + body.depth + "em"; - strut.style.verticalAlign = -body.depth + "em"; - body.children.unshift(strut); - return body; -} -/** - * Take an entire parse tree, and build it into an appropriate set of HTML - * nodes. - */ - - -function buildHTML(tree, options) { - // Strip off outer tag wrapper for processing below. - var tag = null; - - if (tree.length === 1 && tree[0].type === "tag") { - tag = tree[0].tag; - tree = tree[0].body; - } // Build the expression contained in the tree - - - var expression = buildHTML_buildExpression(tree, options, "root"); - var children = []; // Create one base node for each chunk between potential line breaks. - // The TeXBook [p.173] says "A formula will be broken only after a - // relation symbol like $=$ or $<$ or $\rightarrow$, or after a binary - // operation symbol like $+$ or $-$ or $\times$, where the relation or - // binary operation is on the ``outer level'' of the formula (i.e., not - // enclosed in {...} and not part of an \over construction)." - - var parts = []; - - for (var i = 0; i < expression.length; i++) { - parts.push(expression[i]); - - if (expression[i].hasClass("mbin") || expression[i].hasClass("mrel") || expression[i].hasClass("allowbreak")) { - // Put any post-operator glue on same line as operator. - // Watch for \nobreak along the way, and stop at \newline. - var nobreak = false; - - while (i < expression.length - 1 && expression[i + 1].hasClass("mspace") && !expression[i + 1].hasClass("newline")) { - i++; - parts.push(expression[i]); - - if (expression[i].hasClass("nobreak")) { - nobreak = true; - } - } // Don't allow break if \nobreak among the post-operator glue. - - - if (!nobreak) { - children.push(buildHTMLUnbreakable(parts, options)); - parts = []; - } - } else if (expression[i].hasClass("newline")) { - // Write the line except the newline - parts.pop(); - - if (parts.length > 0) { - children.push(buildHTMLUnbreakable(parts, options)); - parts = []; - } // Put the newline at the top level - - - children.push(expression[i]); - } - } - - if (parts.length > 0) { - children.push(buildHTMLUnbreakable(parts, options)); - } // Now, if there was a tag, build it too and append it as a final child. - - - var tagChild; - - if (tag) { - tagChild = buildHTMLUnbreakable(buildHTML_buildExpression(tag, options, true)); - tagChild.classes = ["tag"]; - children.push(tagChild); - } - - var htmlNode = buildHTML_makeSpan(["katex-html"], children); - htmlNode.setAttribute("aria-hidden", "true"); // Adjust the strut of the tag to be the maximum height of all children - // (the height of the enclosing htmlNode) for proper vertical alignment. - - if (tagChild) { - var strut = tagChild.children[0]; - strut.style.height = htmlNode.height + htmlNode.depth + "em"; - strut.style.verticalAlign = -htmlNode.depth + "em"; - } - - return htmlNode; -} -// CONCATENATED MODULE: ./src/mathMLTree.js -/** - * These objects store data about MathML nodes. This is the MathML equivalent - * of the types in domTree.js. Since MathML handles its own rendering, and - * since we're mainly using MathML to improve accessibility, we don't manage - * any of the styling state that the plain DOM nodes do. - * - * The `toNode` and `toMarkup` functions work simlarly to how they do in - * domTree.js, creating namespaced DOM nodes and HTML text markup respectively. - */ - - -function newDocumentFragment(children) { - return new tree_DocumentFragment(children); -} -/** - * This node represents a general purpose MathML node of any type. The - * constructor requires the type of node to create (for example, `"mo"` or - * `"mspace"`, corresponding to `` and `` tags). - */ - -var mathMLTree_MathNode = -/*#__PURE__*/ -function () { - function MathNode(type, children) { - this.type = void 0; - this.attributes = void 0; - this.children = void 0; - this.type = type; - this.attributes = {}; - this.children = children || []; - } - /** - * Sets an attribute on a MathML node. MathML depends on attributes to convey a - * semantic content, so this is used heavily. - */ - - - var _proto = MathNode.prototype; - - _proto.setAttribute = function setAttribute(name, value) { - this.attributes[name] = value; - } - /** - * Gets an attribute on a MathML node. - */ - ; - - _proto.getAttribute = function getAttribute(name) { - return this.attributes[name]; - } - /** - * Converts the math node into a MathML-namespaced DOM element. - */ - ; - - _proto.toNode = function toNode() { - var node = document.createElementNS("http://www.w3.org/1998/Math/MathML", this.type); - - for (var attr in this.attributes) { - if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) { - node.setAttribute(attr, this.attributes[attr]); - } - } - - for (var i = 0; i < this.children.length; i++) { - node.appendChild(this.children[i].toNode()); - } - - return node; - } - /** - * Converts the math node into an HTML markup string. - */ - ; - - _proto.toMarkup = function toMarkup() { - var markup = "<" + this.type; // Add the attributes - - for (var attr in this.attributes) { - if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) { - markup += " " + attr + "=\""; - markup += utils.escape(this.attributes[attr]); - markup += "\""; - } - } - - markup += ">"; - - for (var i = 0; i < this.children.length; i++) { - markup += this.children[i].toMarkup(); - } - - markup += ""; - return markup; - } - /** - * Converts the math node into a string, similar to innerText, but escaped. - */ - ; - - _proto.toText = function toText() { - return this.children.map(function (child) { - return child.toText(); - }).join(""); - }; - - return MathNode; -}(); -/** - * This node represents a piece of text. - */ - -var mathMLTree_TextNode = -/*#__PURE__*/ -function () { - function TextNode(text) { - this.text = void 0; - this.text = text; - } - /** - * Converts the text node into a DOM text node. - */ - - - var _proto2 = TextNode.prototype; - - _proto2.toNode = function toNode() { - return document.createTextNode(this.text); - } - /** - * Converts the text node into escaped HTML markup - * (representing the text itself). - */ - ; - - _proto2.toMarkup = function toMarkup() { - return utils.escape(this.toText()); - } - /** - * Converts the text node into a string - * (representing the text iteself). - */ - ; - - _proto2.toText = function toText() { - return this.text; - }; - - return TextNode; -}(); -/** - * This node represents a space, but may render as or as text, - * depending on the width. - */ - -var SpaceNode = -/*#__PURE__*/ -function () { - /** - * Create a Space node with width given in CSS ems. - */ - function SpaceNode(width) { - this.width = void 0; - this.character = void 0; - this.width = width; // See https://www.w3.org/TR/2000/WD-MathML2-20000328/chapter6.html - // for a table of space-like characters. We use Unicode - // representations instead of &LongNames; as it's not clear how to - // make the latter via document.createTextNode. - - if (width >= 0.05555 && width <= 0.05556) { - this.character = "\u200A"; //   - } else if (width >= 0.1666 && width <= 0.1667) { - this.character = "\u2009"; //   - } else if (width >= 0.2222 && width <= 0.2223) { - this.character = "\u2005"; //   - } else if (width >= 0.2777 && width <= 0.2778) { - this.character = "\u2005\u200A"; //    - } else if (width >= -0.05556 && width <= -0.05555) { - this.character = "\u200A\u2063"; // ​ - } else if (width >= -0.1667 && width <= -0.1666) { - this.character = "\u2009\u2063"; // ​ - } else if (width >= -0.2223 && width <= -0.2222) { - this.character = "\u205F\u2063"; // ​ - } else if (width >= -0.2778 && width <= -0.2777) { - this.character = "\u2005\u2063"; // ​ - } else { - this.character = null; - } - } - /** - * Converts the math node into a MathML-namespaced DOM element. - */ - - - var _proto3 = SpaceNode.prototype; - - _proto3.toNode = function toNode() { - if (this.character) { - return document.createTextNode(this.character); - } else { - var node = document.createElementNS("http://www.w3.org/1998/Math/MathML", "mspace"); - node.setAttribute("width", this.width + "em"); - return node; - } - } - /** - * Converts the math node into an HTML markup string. - */ - ; - - _proto3.toMarkup = function toMarkup() { - if (this.character) { - return "" + this.character + ""; - } else { - return ""; - } - } - /** - * Converts the math node into a string, similar to innerText. - */ - ; - - _proto3.toText = function toText() { - if (this.character) { - return this.character; - } else { - return " "; - } - }; - - return SpaceNode; -}(); - -/* harmony default export */ var mathMLTree = ({ - MathNode: mathMLTree_MathNode, - TextNode: mathMLTree_TextNode, - SpaceNode: SpaceNode, - newDocumentFragment: newDocumentFragment -}); -// CONCATENATED MODULE: ./src/buildMathML.js -/** - * This file converts a parse tree into a cooresponding MathML tree. The main - * entry point is the `buildMathML` function, which takes a parse tree from the - * parser. - */ - - - - - - - - - -/** - * Takes a symbol and converts it into a MathML text node after performing - * optional replacement from symbols.js. - */ -var buildMathML_makeText = function makeText(text, mode, options) { - if (src_symbols[mode][text] && src_symbols[mode][text].replace && text.charCodeAt(0) !== 0xD835 && !(ligatures.hasOwnProperty(text) && options && (options.fontFamily && options.fontFamily.substr(4, 2) === "tt" || options.font && options.font.substr(4, 2) === "tt"))) { - text = src_symbols[mode][text].replace; - } - - return new mathMLTree.TextNode(text); -}; -/** - * Wrap the given array of nodes in an node if needed, i.e., - * unless the array has length 1. Always returns a single node. - */ - -var buildMathML_makeRow = function makeRow(body) { - if (body.length === 1) { - return body[0]; - } else { - return new mathMLTree.MathNode("mrow", body); - } -}; -/** - * Returns the math variant as a string or null if none is required. - */ - -var buildMathML_getVariant = function getVariant(group, options) { - // Handle \text... font specifiers as best we can. - // MathML has a limited list of allowable mathvariant specifiers; see - // https://www.w3.org/TR/MathML3/chapter3.html#presm.commatt - if (options.fontFamily === "texttt") { - return "monospace"; - } else if (options.fontFamily === "textsf") { - if (options.fontShape === "textit" && options.fontWeight === "textbf") { - return "sans-serif-bold-italic"; - } else if (options.fontShape === "textit") { - return "sans-serif-italic"; - } else if (options.fontWeight === "textbf") { - return "bold-sans-serif"; - } else { - return "sans-serif"; - } - } else if (options.fontShape === "textit" && options.fontWeight === "textbf") { - return "bold-italic"; - } else if (options.fontShape === "textit") { - return "italic"; - } else if (options.fontWeight === "textbf") { - return "bold"; - } - - var font = options.font; - - if (!font || font === "mathnormal") { - return null; - } - - var mode = group.mode; - - if (font === "mathit") { - return "italic"; - } else if (font === "boldsymbol") { - return group.type === "textord" ? "bold" : "bold-italic"; - } else if (font === "mathbf") { - return "bold"; - } else if (font === "mathbb") { - return "double-struck"; - } else if (font === "mathfrak") { - return "fraktur"; - } else if (font === "mathscr" || font === "mathcal") { - // MathML makes no distinction between script and caligrahpic - return "script"; - } else if (font === "mathsf") { - return "sans-serif"; - } else if (font === "mathtt") { - return "monospace"; - } - - var text = group.text; - - if (utils.contains(["\\imath", "\\jmath"], text)) { - return null; - } - - if (src_symbols[mode][text] && src_symbols[mode][text].replace) { - text = src_symbols[mode][text].replace; - } - - var fontName = buildCommon.fontMap[font].fontName; - - if (getCharacterMetrics(text, fontName, mode)) { - return buildCommon.fontMap[font].variant; - } - - return null; -}; -/** - * Takes a list of nodes, builds them, and returns a list of the generated - * MathML nodes. Also combine consecutive outputs into a single - * tag. - */ - -var buildMathML_buildExpression = function buildExpression(expression, options, isOrdgroup) { - if (expression.length === 1) { - var group = buildMathML_buildGroup(expression[0], options); - - if (isOrdgroup && group instanceof mathMLTree_MathNode && group.type === "mo") { - // When TeX writers want to suppress spacing on an operator, - // they often put the operator by itself inside braces. - group.setAttribute("lspace", "0em"); - group.setAttribute("rspace", "0em"); - } - - return [group]; - } - - var groups = []; - var lastGroup; - - for (var i = 0; i < expression.length; i++) { - var _group = buildMathML_buildGroup(expression[i], options); - - if (_group instanceof mathMLTree_MathNode && lastGroup instanceof mathMLTree_MathNode) { - // Concatenate adjacent s - if (_group.type === 'mtext' && lastGroup.type === 'mtext' && _group.getAttribute('mathvariant') === lastGroup.getAttribute('mathvariant')) { - var _lastGroup$children; - - (_lastGroup$children = lastGroup.children).push.apply(_lastGroup$children, _group.children); - - continue; // Concatenate adjacent s - } else if (_group.type === 'mn' && lastGroup.type === 'mn') { - var _lastGroup$children2; - - (_lastGroup$children2 = lastGroup.children).push.apply(_lastGroup$children2, _group.children); - - continue; // Concatenate ... followed by . - } else if (_group.type === 'mi' && _group.children.length === 1 && lastGroup.type === 'mn') { - var child = _group.children[0]; - - if (child instanceof mathMLTree_TextNode && child.text === '.') { - var _lastGroup$children3; - - (_lastGroup$children3 = lastGroup.children).push.apply(_lastGroup$children3, _group.children); - - continue; - } - } else if (lastGroup.type === 'mi' && lastGroup.children.length === 1) { - var lastChild = lastGroup.children[0]; - - if (lastChild instanceof mathMLTree_TextNode && lastChild.text === "\u0338" && (_group.type === 'mo' || _group.type === 'mi' || _group.type === 'mn')) { - var _child = _group.children[0]; - - if (_child instanceof mathMLTree_TextNode && _child.text.length > 0) { - // Overlay with combining character long solidus - _child.text = _child.text.slice(0, 1) + "\u0338" + _child.text.slice(1); - groups.pop(); - } - } - } - } - - groups.push(_group); - lastGroup = _group; - } - - return groups; -}; -/** - * Equivalent to buildExpression, but wraps the elements in an - * if there's more than one. Returns a single node instead of an array. - */ - -var buildExpressionRow = function buildExpressionRow(expression, options, isOrdgroup) { - return buildMathML_makeRow(buildMathML_buildExpression(expression, options, isOrdgroup)); -}; -/** - * Takes a group from the parser and calls the appropriate groupBuilders function - * on it to produce a MathML node. - */ - -var buildMathML_buildGroup = function buildGroup(group, options) { - if (!group) { - return new mathMLTree.MathNode("mrow"); - } - - if (_mathmlGroupBuilders[group.type]) { - // Call the groupBuilders function - var result = _mathmlGroupBuilders[group.type](group, options); - return result; - } else { - throw new src_ParseError("Got group of unknown type: '" + group.type + "'"); - } -}; -/** - * Takes a full parse tree and settings and builds a MathML representation of - * it. In particular, we put the elements from building the parse tree into a - * tag so we can also include that TeX source as an annotation. - * - * Note that we actually return a domTree element with a `` inside it so - * we can do appropriate styling. - */ - -function buildMathML(tree, texExpression, options, isDisplayMode, forMathmlOnly) { - var expression = buildMathML_buildExpression(tree, options); // Wrap up the expression in an mrow so it is presented in the semantics - // tag correctly, unless it's a single or . - - var wrapper; - - if (expression.length === 1 && expression[0] instanceof mathMLTree_MathNode && utils.contains(["mrow", "mtable"], expression[0].type)) { - wrapper = expression[0]; - } else { - wrapper = new mathMLTree.MathNode("mrow", expression); - } // Build a TeX annotation of the source - - - var annotation = new mathMLTree.MathNode("annotation", [new mathMLTree.TextNode(texExpression)]); - annotation.setAttribute("encoding", "application/x-tex"); - var semantics = new mathMLTree.MathNode("semantics", [wrapper, annotation]); - var math = new mathMLTree.MathNode("math", [semantics]); - math.setAttribute("xmlns", "http://www.w3.org/1998/Math/MathML"); - - if (isDisplayMode) { - math.setAttribute("display", "block"); - } // You can't style nodes, so we wrap the node in a span. - // NOTE: The span class is not typed to have nodes as children, and - // we don't want to make the children type more generic since the children - // of span are expected to have more fields in `buildHtml` contexts. - - - var wrapperClass = forMathmlOnly ? "katex" : "katex-mathml"; // $FlowFixMe - - return buildCommon.makeSpan([wrapperClass], [math]); -} -// CONCATENATED MODULE: ./src/buildTree.js - - - - - - - -var buildTree_optionsFromSettings = function optionsFromSettings(settings) { - return new src_Options({ - style: settings.displayMode ? src_Style.DISPLAY : src_Style.TEXT, - maxSize: settings.maxSize, - minRuleThickness: settings.minRuleThickness - }); -}; - -var buildTree_displayWrap = function displayWrap(node, settings) { - if (settings.displayMode) { - var classes = ["katex-display"]; - - if (settings.leqno) { - classes.push("leqno"); - } - - if (settings.fleqn) { - classes.push("fleqn"); - } - - node = buildCommon.makeSpan(classes, [node]); - } - - return node; -}; - -var buildTree_buildTree = function buildTree(tree, expression, settings) { - var options = buildTree_optionsFromSettings(settings); - var katexNode; - - if (settings.output === "mathml") { - return buildMathML(tree, expression, options, settings.displayMode, true); - } else if (settings.output === "html") { - var htmlNode = buildHTML(tree, options); - katexNode = buildCommon.makeSpan(["katex"], [htmlNode]); - } else { - var mathMLNode = buildMathML(tree, expression, options, settings.displayMode, false); - - var _htmlNode = buildHTML(tree, options); - - katexNode = buildCommon.makeSpan(["katex"], [mathMLNode, _htmlNode]); - } - - return buildTree_displayWrap(katexNode, settings); -}; -var buildTree_buildHTMLTree = function buildHTMLTree(tree, expression, settings) { - var options = buildTree_optionsFromSettings(settings); - var htmlNode = buildHTML(tree, options); - var katexNode = buildCommon.makeSpan(["katex"], [htmlNode]); - return buildTree_displayWrap(katexNode, settings); -}; -// CONCATENATED MODULE: ./src/stretchy.js -/** - * This file provides support to buildMathML.js and buildHTML.js - * for stretchy wide elements rendered from SVG files - * and other CSS trickery. - */ - - - - -var stretchyCodePoint = { - widehat: "^", - widecheck: "ˇ", - widetilde: "~", - utilde: "~", - overleftarrow: "\u2190", - underleftarrow: "\u2190", - xleftarrow: "\u2190", - overrightarrow: "\u2192", - underrightarrow: "\u2192", - xrightarrow: "\u2192", - underbrace: "\u23DF", - overbrace: "\u23DE", - overgroup: "\u23E0", - undergroup: "\u23E1", - overleftrightarrow: "\u2194", - underleftrightarrow: "\u2194", - xleftrightarrow: "\u2194", - Overrightarrow: "\u21D2", - xRightarrow: "\u21D2", - overleftharpoon: "\u21BC", - xleftharpoonup: "\u21BC", - overrightharpoon: "\u21C0", - xrightharpoonup: "\u21C0", - xLeftarrow: "\u21D0", - xLeftrightarrow: "\u21D4", - xhookleftarrow: "\u21A9", - xhookrightarrow: "\u21AA", - xmapsto: "\u21A6", - xrightharpoondown: "\u21C1", - xleftharpoondown: "\u21BD", - xrightleftharpoons: "\u21CC", - xleftrightharpoons: "\u21CB", - xtwoheadleftarrow: "\u219E", - xtwoheadrightarrow: "\u21A0", - xlongequal: "=", - xtofrom: "\u21C4", - xrightleftarrows: "\u21C4", - xrightequilibrium: "\u21CC", - // Not a perfect match. - xleftequilibrium: "\u21CB" // None better available. - -}; - -var stretchy_mathMLnode = function mathMLnode(label) { - var node = new mathMLTree.MathNode("mo", [new mathMLTree.TextNode(stretchyCodePoint[label.substr(1)])]); - node.setAttribute("stretchy", "true"); - return node; -}; // Many of the KaTeX SVG images have been adapted from glyphs in KaTeX fonts. -// Copyright (c) 2009-2010, Design Science, Inc. () -// Copyright (c) 2014-2017 Khan Academy () -// Licensed under the SIL Open Font License, Version 1.1. -// See \nhttp://scripts.sil.org/OFL -// Very Long SVGs -// Many of the KaTeX stretchy wide elements use a long SVG image and an -// overflow: hidden tactic to achieve a stretchy image while avoiding -// distortion of arrowheads or brace corners. -// The SVG typically contains a very long (400 em) arrow. -// The SVG is in a container span that has overflow: hidden, so the span -// acts like a window that exposes only part of the SVG. -// The SVG always has a longer, thinner aspect ratio than the container span. -// After the SVG fills 100% of the height of the container span, -// there is a long arrow shaft left over. That left-over shaft is not shown. -// Instead, it is sliced off because the span's CSS has overflow: hidden. -// Thus, the reader sees an arrow that matches the subject matter width -// without distortion. -// Some functions, such as \cancel, need to vary their aspect ratio. These -// functions do not get the overflow SVG treatment. -// Second Brush Stroke -// Low resolution monitors struggle to display images in fine detail. -// So browsers apply anti-aliasing. A long straight arrow shaft therefore -// will sometimes appear as if it has a blurred edge. -// To mitigate this, these SVG files contain a second "brush-stroke" on the -// arrow shafts. That is, a second long thin rectangular SVG path has been -// written directly on top of each arrow shaft. This reinforcement causes -// some of the screen pixels to display as black instead of the anti-aliased -// gray pixel that a single path would generate. So we get arrow shafts -// whose edges appear to be sharper. -// In the katexImagesData object just below, the dimensions all -// correspond to path geometry inside the relevant SVG. -// For example, \overrightarrow uses the same arrowhead as glyph U+2192 -// from the KaTeX Main font. The scaling factor is 1000. -// That is, inside the font, that arrowhead is 522 units tall, which -// corresponds to 0.522 em inside the document. - - -var katexImagesData = { - // path(s), minWidth, height, align - overrightarrow: [["rightarrow"], 0.888, 522, "xMaxYMin"], - overleftarrow: [["leftarrow"], 0.888, 522, "xMinYMin"], - underrightarrow: [["rightarrow"], 0.888, 522, "xMaxYMin"], - underleftarrow: [["leftarrow"], 0.888, 522, "xMinYMin"], - xrightarrow: [["rightarrow"], 1.469, 522, "xMaxYMin"], - xleftarrow: [["leftarrow"], 1.469, 522, "xMinYMin"], - Overrightarrow: [["doublerightarrow"], 0.888, 560, "xMaxYMin"], - xRightarrow: [["doublerightarrow"], 1.526, 560, "xMaxYMin"], - xLeftarrow: [["doubleleftarrow"], 1.526, 560, "xMinYMin"], - overleftharpoon: [["leftharpoon"], 0.888, 522, "xMinYMin"], - xleftharpoonup: [["leftharpoon"], 0.888, 522, "xMinYMin"], - xleftharpoondown: [["leftharpoondown"], 0.888, 522, "xMinYMin"], - overrightharpoon: [["rightharpoon"], 0.888, 522, "xMaxYMin"], - xrightharpoonup: [["rightharpoon"], 0.888, 522, "xMaxYMin"], - xrightharpoondown: [["rightharpoondown"], 0.888, 522, "xMaxYMin"], - xlongequal: [["longequal"], 0.888, 334, "xMinYMin"], - xtwoheadleftarrow: [["twoheadleftarrow"], 0.888, 334, "xMinYMin"], - xtwoheadrightarrow: [["twoheadrightarrow"], 0.888, 334, "xMaxYMin"], - overleftrightarrow: [["leftarrow", "rightarrow"], 0.888, 522], - overbrace: [["leftbrace", "midbrace", "rightbrace"], 1.6, 548], - underbrace: [["leftbraceunder", "midbraceunder", "rightbraceunder"], 1.6, 548], - underleftrightarrow: [["leftarrow", "rightarrow"], 0.888, 522], - xleftrightarrow: [["leftarrow", "rightarrow"], 1.75, 522], - xLeftrightarrow: [["doubleleftarrow", "doublerightarrow"], 1.75, 560], - xrightleftharpoons: [["leftharpoondownplus", "rightharpoonplus"], 1.75, 716], - xleftrightharpoons: [["leftharpoonplus", "rightharpoondownplus"], 1.75, 716], - xhookleftarrow: [["leftarrow", "righthook"], 1.08, 522], - xhookrightarrow: [["lefthook", "rightarrow"], 1.08, 522], - overlinesegment: [["leftlinesegment", "rightlinesegment"], 0.888, 522], - underlinesegment: [["leftlinesegment", "rightlinesegment"], 0.888, 522], - overgroup: [["leftgroup", "rightgroup"], 0.888, 342], - undergroup: [["leftgroupunder", "rightgroupunder"], 0.888, 342], - xmapsto: [["leftmapsto", "rightarrow"], 1.5, 522], - xtofrom: [["leftToFrom", "rightToFrom"], 1.75, 528], - // The next three arrows are from the mhchem package. - // In mhchem.sty, min-length is 2.0em. But these arrows might appear in the - // document as \xrightarrow or \xrightleftharpoons. Those have - // min-length = 1.75em, so we set min-length on these next three to match. - xrightleftarrows: [["baraboveleftarrow", "rightarrowabovebar"], 1.75, 901], - xrightequilibrium: [["baraboveshortleftharpoon", "rightharpoonaboveshortbar"], 1.75, 716], - xleftequilibrium: [["shortbaraboveleftharpoon", "shortrightharpoonabovebar"], 1.75, 716] -}; - -var groupLength = function groupLength(arg) { - if (arg.type === "ordgroup") { - return arg.body.length; - } else { - return 1; - } -}; - -var stretchy_svgSpan = function svgSpan(group, options) { - // Create a span with inline SVG for the element. - function buildSvgSpan_() { - var viewBoxWidth = 400000; // default - - var label = group.label.substr(1); - - if (utils.contains(["widehat", "widecheck", "widetilde", "utilde"], label)) { - // Each type in the `if` statement corresponds to one of the ParseNode - // types below. This narrowing is required to access `grp.base`. - var grp = group; // There are four SVG images available for each function. - // Choose a taller image when there are more characters. - - var numChars = groupLength(grp.base); - var viewBoxHeight; - var pathName; - - var _height; - - if (numChars > 5) { - if (label === "widehat" || label === "widecheck") { - viewBoxHeight = 420; - viewBoxWidth = 2364; - _height = 0.42; - pathName = label + "4"; - } else { - viewBoxHeight = 312; - viewBoxWidth = 2340; - _height = 0.34; - pathName = "tilde4"; - } - } else { - var imgIndex = [1, 1, 2, 2, 3, 3][numChars]; - - if (label === "widehat" || label === "widecheck") { - viewBoxWidth = [0, 1062, 2364, 2364, 2364][imgIndex]; - viewBoxHeight = [0, 239, 300, 360, 420][imgIndex]; - _height = [0, 0.24, 0.3, 0.3, 0.36, 0.42][imgIndex]; - pathName = label + imgIndex; - } else { - viewBoxWidth = [0, 600, 1033, 2339, 2340][imgIndex]; - viewBoxHeight = [0, 260, 286, 306, 312][imgIndex]; - _height = [0, 0.26, 0.286, 0.3, 0.306, 0.34][imgIndex]; - pathName = "tilde" + imgIndex; - } - } - - var path = new domTree_PathNode(pathName); - var svgNode = new SvgNode([path], { - "width": "100%", - "height": _height + "em", - "viewBox": "0 0 " + viewBoxWidth + " " + viewBoxHeight, - "preserveAspectRatio": "none" - }); - return { - span: buildCommon.makeSvgSpan([], [svgNode], options), - minWidth: 0, - height: _height - }; - } else { - var spans = []; - var data = katexImagesData[label]; - var paths = data[0], - _minWidth = data[1], - _viewBoxHeight = data[2]; - - var _height2 = _viewBoxHeight / 1000; - - var numSvgChildren = paths.length; - var widthClasses; - var aligns; - - if (numSvgChildren === 1) { - // $FlowFixMe: All these cases must be of the 4-tuple type. - var align1 = data[3]; - widthClasses = ["hide-tail"]; - aligns = [align1]; - } else if (numSvgChildren === 2) { - widthClasses = ["halfarrow-left", "halfarrow-right"]; - aligns = ["xMinYMin", "xMaxYMin"]; - } else if (numSvgChildren === 3) { - widthClasses = ["brace-left", "brace-center", "brace-right"]; - aligns = ["xMinYMin", "xMidYMin", "xMaxYMin"]; - } else { - throw new Error("Correct katexImagesData or update code here to support\n " + numSvgChildren + " children."); - } - - for (var i = 0; i < numSvgChildren; i++) { - var _path = new domTree_PathNode(paths[i]); - - var _svgNode = new SvgNode([_path], { - "width": "400em", - "height": _height2 + "em", - "viewBox": "0 0 " + viewBoxWidth + " " + _viewBoxHeight, - "preserveAspectRatio": aligns[i] + " slice" - }); - - var _span = buildCommon.makeSvgSpan([widthClasses[i]], [_svgNode], options); - - if (numSvgChildren === 1) { - return { - span: _span, - minWidth: _minWidth, - height: _height2 - }; - } else { - _span.style.height = _height2 + "em"; - spans.push(_span); - } - } - - return { - span: buildCommon.makeSpan(["stretchy"], spans, options), - minWidth: _minWidth, - height: _height2 - }; - } - } // buildSvgSpan_() - - - var _buildSvgSpan_ = buildSvgSpan_(), - span = _buildSvgSpan_.span, - minWidth = _buildSvgSpan_.minWidth, - height = _buildSvgSpan_.height; // Note that we are returning span.depth = 0. - // Any adjustments relative to the baseline must be done in buildHTML. - - - span.height = height; - span.style.height = height + "em"; - - if (minWidth > 0) { - span.style.minWidth = minWidth + "em"; - } - - return span; -}; - -var stretchy_encloseSpan = function encloseSpan(inner, label, pad, options) { - // Return an image span for \cancel, \bcancel, \xcancel, or \fbox - var img; - var totalHeight = inner.height + inner.depth + 2 * pad; - - if (/fbox|color/.test(label)) { - img = buildCommon.makeSpan(["stretchy", label], [], options); - - if (label === "fbox") { - var color = options.color && options.getColor(); - - if (color) { - img.style.borderColor = color; - } - } - } else { - // \cancel, \bcancel, or \xcancel - // Since \cancel's SVG is inline and it omits the viewBox attribute, - // its stroke-width will not vary with span area. - var lines = []; - - if (/^[bx]cancel$/.test(label)) { - lines.push(new LineNode({ - "x1": "0", - "y1": "0", - "x2": "100%", - "y2": "100%", - "stroke-width": "0.046em" - })); - } - - if (/^x?cancel$/.test(label)) { - lines.push(new LineNode({ - "x1": "0", - "y1": "100%", - "x2": "100%", - "y2": "0", - "stroke-width": "0.046em" - })); - } - - var svgNode = new SvgNode(lines, { - "width": "100%", - "height": totalHeight + "em" - }); - img = buildCommon.makeSvgSpan([], [svgNode], options); - } - - img.height = totalHeight; - img.style.height = totalHeight + "em"; - return img; -}; - -/* harmony default export */ var stretchy = ({ - encloseSpan: stretchy_encloseSpan, - mathMLnode: stretchy_mathMLnode, - svgSpan: stretchy_svgSpan -}); -// CONCATENATED MODULE: ./src/parseNode.js - - -/** - * Asserts that the node is of the given type and returns it with stricter - * typing. Throws if the node's type does not match. - */ -function assertNodeType(node, type) { - if (!node || node.type !== type) { - throw new Error("Expected node of type " + type + ", but got " + (node ? "node of type " + node.type : String(node))); - } - - return node; -} -/** - * Returns the node more strictly typed iff it is of the given type. Otherwise, - * returns null. - */ - -function assertSymbolNodeType(node) { - var typedNode = checkSymbolNodeType(node); - - if (!typedNode) { - throw new Error("Expected node of symbol group type, but got " + (node ? "node of type " + node.type : String(node))); - } - - return typedNode; -} -/** - * Returns the node more strictly typed iff it is of the given type. Otherwise, - * returns null. - */ - -function checkSymbolNodeType(node) { - if (node && (node.type === "atom" || NON_ATOMS.hasOwnProperty(node.type))) { - // $FlowFixMe - return node; - } - - return null; -} -// CONCATENATED MODULE: ./src/functions/accent.js - - - - - - - - - -// NOTE: Unlike most `htmlBuilder`s, this one handles not only "accent", but -var accent_htmlBuilder = function htmlBuilder(grp, options) { - // Accents are handled in the TeXbook pg. 443, rule 12. - var base; - var group; - var supSubGroup; - - if (grp && grp.type === "supsub") { - // If our base is a character box, and we have superscripts and - // subscripts, the supsub will defer to us. In particular, we want - // to attach the superscripts and subscripts to the inner body (so - // that the position of the superscripts and subscripts won't be - // affected by the height of the accent). We accomplish this by - // sticking the base of the accent into the base of the supsub, and - // rendering that, while keeping track of where the accent is. - // The real accent group is the base of the supsub group - group = assertNodeType(grp.base, "accent"); // The character box is the base of the accent group - - base = group.base; // Stick the character box into the base of the supsub group - - grp.base = base; // Rerender the supsub group with its new base, and store that - // result. - - supSubGroup = assertSpan(buildHTML_buildGroup(grp, options)); // reset original base - - grp.base = group; - } else { - group = assertNodeType(grp, "accent"); - base = group.base; - } // Build the base group - - - var body = buildHTML_buildGroup(base, options.havingCrampedStyle()); // Does the accent need to shift for the skew of a character? - - var mustShift = group.isShifty && utils.isCharacterBox(base); // Calculate the skew of the accent. This is based on the line "If the - // nucleus is not a single character, let s = 0; otherwise set s to the - // kern amount for the nucleus followed by the \skewchar of its font." - // Note that our skew metrics are just the kern between each character - // and the skewchar. - - var skew = 0; - - if (mustShift) { - // If the base is a character box, then we want the skew of the - // innermost character. To do that, we find the innermost character: - var baseChar = utils.getBaseElem(base); // Then, we render its group to get the symbol inside it - - var baseGroup = buildHTML_buildGroup(baseChar, options.havingCrampedStyle()); // Finally, we pull the skew off of the symbol. - - skew = assertSymbolDomNode(baseGroup).skew; // Note that we now throw away baseGroup, because the layers we - // removed with getBaseElem might contain things like \color which - // we can't get rid of. - // TODO(emily): Find a better way to get the skew - } // calculate the amount of space between the body and the accent - - - var clearance = Math.min(body.height, options.fontMetrics().xHeight); // Build the accent - - var accentBody; - - if (!group.isStretchy) { - var accent; - var width; - - if (group.label === "\\vec") { - // Before version 0.9, \vec used the combining font glyph U+20D7. - // But browsers, especially Safari, are not consistent in how they - // render combining characters when not preceded by a character. - // So now we use an SVG. - // If Safari reforms, we should consider reverting to the glyph. - accent = buildCommon.staticSvg("vec", options); - width = buildCommon.svgData.vec[1]; - } else { - accent = buildCommon.makeOrd({ - mode: group.mode, - text: group.label - }, options, "textord"); - accent = assertSymbolDomNode(accent); // Remove the italic correction of the accent, because it only serves to - // shift the accent over to a place we don't want. - - accent.italic = 0; - width = accent.width; - } - - accentBody = buildCommon.makeSpan(["accent-body"], [accent]); // "Full" accents expand the width of the resulting symbol to be - // at least the width of the accent, and overlap directly onto the - // character without any vertical offset. - - var accentFull = group.label === "\\textcircled"; - - if (accentFull) { - accentBody.classes.push('accent-full'); - clearance = body.height; - } // Shift the accent over by the skew. - - - var left = skew; // CSS defines `.katex .accent .accent-body:not(.accent-full) { width: 0 }` - // so that the accent doesn't contribute to the bounding box. - // We need to shift the character by its width (effectively half - // its width) to compensate. - - if (!accentFull) { - left -= width / 2; - } - - accentBody.style.left = left + "em"; // \textcircled uses the \bigcirc glyph, so it needs some - // vertical adjustment to match LaTeX. - - if (group.label === "\\textcircled") { - accentBody.style.top = ".2em"; - } - - accentBody = buildCommon.makeVList({ - positionType: "firstBaseline", - children: [{ - type: "elem", - elem: body - }, { - type: "kern", - size: -clearance - }, { - type: "elem", - elem: accentBody - }] - }, options); - } else { - accentBody = stretchy.svgSpan(group, options); - accentBody = buildCommon.makeVList({ - positionType: "firstBaseline", - children: [{ - type: "elem", - elem: body - }, { - type: "elem", - elem: accentBody, - wrapperClasses: ["svg-align"], - wrapperStyle: skew > 0 ? { - width: "calc(100% - " + 2 * skew + "em)", - marginLeft: 2 * skew + "em" - } : undefined - }] - }, options); - } - - var accentWrap = buildCommon.makeSpan(["mord", "accent"], [accentBody], options); - - if (supSubGroup) { - // Here, we replace the "base" child of the supsub with our newly - // generated accent. - supSubGroup.children[0] = accentWrap; // Since we don't rerun the height calculation after replacing the - // accent, we manually recalculate height. - - supSubGroup.height = Math.max(accentWrap.height, supSubGroup.height); // Accents should always be ords, even when their innards are not. - - supSubGroup.classes[0] = "mord"; - return supSubGroup; - } else { - return accentWrap; - } -}; - -var accent_mathmlBuilder = function mathmlBuilder(group, options) { - var accentNode = group.isStretchy ? stretchy.mathMLnode(group.label) : new mathMLTree.MathNode("mo", [buildMathML_makeText(group.label, group.mode)]); - var node = new mathMLTree.MathNode("mover", [buildMathML_buildGroup(group.base, options), accentNode]); - node.setAttribute("accent", "true"); - return node; -}; - -var NON_STRETCHY_ACCENT_REGEX = new RegExp(["\\acute", "\\grave", "\\ddot", "\\tilde", "\\bar", "\\breve", "\\check", "\\hat", "\\vec", "\\dot", "\\mathring"].map(function (accent) { - return "\\" + accent; -}).join("|")); // Accents - -defineFunction({ - type: "accent", - names: ["\\acute", "\\grave", "\\ddot", "\\tilde", "\\bar", "\\breve", "\\check", "\\hat", "\\vec", "\\dot", "\\mathring", "\\widecheck", "\\widehat", "\\widetilde", "\\overrightarrow", "\\overleftarrow", "\\Overrightarrow", "\\overleftrightarrow", "\\overgroup", "\\overlinesegment", "\\overleftharpoon", "\\overrightharpoon"], - props: { - numArgs: 1 - }, - handler: function handler(context, args) { - var base = args[0]; - var isStretchy = !NON_STRETCHY_ACCENT_REGEX.test(context.funcName); - var isShifty = !isStretchy || context.funcName === "\\widehat" || context.funcName === "\\widetilde" || context.funcName === "\\widecheck"; - return { - type: "accent", - mode: context.parser.mode, - label: context.funcName, - isStretchy: isStretchy, - isShifty: isShifty, - base: base - }; - }, - htmlBuilder: accent_htmlBuilder, - mathmlBuilder: accent_mathmlBuilder -}); // Text-mode accents - -defineFunction({ - type: "accent", - names: ["\\'", "\\`", "\\^", "\\~", "\\=", "\\u", "\\.", '\\"', "\\r", "\\H", "\\v", "\\textcircled"], - props: { - numArgs: 1, - allowedInText: true, - allowedInMath: false - }, - handler: function handler(context, args) { - var base = args[0]; - return { - type: "accent", - mode: context.parser.mode, - label: context.funcName, - isStretchy: false, - isShifty: true, - base: base - }; - }, - htmlBuilder: accent_htmlBuilder, - mathmlBuilder: accent_mathmlBuilder -}); -// CONCATENATED MODULE: ./src/functions/accentunder.js -// Horizontal overlap functions - - - - - - -defineFunction({ - type: "accentUnder", - names: ["\\underleftarrow", "\\underrightarrow", "\\underleftrightarrow", "\\undergroup", "\\underlinesegment", "\\utilde"], - props: { - numArgs: 1 - }, - handler: function handler(_ref, args) { - var parser = _ref.parser, - funcName = _ref.funcName; - var base = args[0]; - return { - type: "accentUnder", - mode: parser.mode, - label: funcName, - base: base - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - // Treat under accents much like underlines. - var innerGroup = buildHTML_buildGroup(group.base, options); - var accentBody = stretchy.svgSpan(group, options); - var kern = group.label === "\\utilde" ? 0.12 : 0; // Generate the vlist, with the appropriate kerns - - var vlist = buildCommon.makeVList({ - positionType: "top", - positionData: innerGroup.height, - children: [{ - type: "elem", - elem: accentBody, - wrapperClasses: ["svg-align"] - }, { - type: "kern", - size: kern - }, { - type: "elem", - elem: innerGroup - }] - }, options); - return buildCommon.makeSpan(["mord", "accentunder"], [vlist], options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var accentNode = stretchy.mathMLnode(group.label); - var node = new mathMLTree.MathNode("munder", [buildMathML_buildGroup(group.base, options), accentNode]); - node.setAttribute("accentunder", "true"); - return node; - } -}); -// CONCATENATED MODULE: ./src/functions/arrow.js - - - - - - - -// Helper function -var arrow_paddedNode = function paddedNode(group) { - var node = new mathMLTree.MathNode("mpadded", group ? [group] : []); - node.setAttribute("width", "+0.6em"); - node.setAttribute("lspace", "0.3em"); - return node; -}; // Stretchy arrows with an optional argument - - -defineFunction({ - type: "xArrow", - names: ["\\xleftarrow", "\\xrightarrow", "\\xLeftarrow", "\\xRightarrow", "\\xleftrightarrow", "\\xLeftrightarrow", "\\xhookleftarrow", "\\xhookrightarrow", "\\xmapsto", "\\xrightharpoondown", "\\xrightharpoonup", "\\xleftharpoondown", "\\xleftharpoonup", "\\xrightleftharpoons", "\\xleftrightharpoons", "\\xlongequal", "\\xtwoheadrightarrow", "\\xtwoheadleftarrow", "\\xtofrom", // The next 3 functions are here to support the mhchem extension. - // Direct use of these functions is discouraged and may break someday. - "\\xrightleftarrows", "\\xrightequilibrium", "\\xleftequilibrium"], - props: { - numArgs: 1, - numOptionalArgs: 1 - }, - handler: function handler(_ref, args, optArgs) { - var parser = _ref.parser, - funcName = _ref.funcName; - return { - type: "xArrow", - mode: parser.mode, - label: funcName, - body: args[0], - below: optArgs[0] - }; - }, - // Flow is unable to correctly infer the type of `group`, even though it's - // unamibiguously determined from the passed-in `type` above. - htmlBuilder: function htmlBuilder(group, options) { - var style = options.style; // Build the argument groups in the appropriate style. - // Ref: amsmath.dtx: \hbox{$\scriptstyle\mkern#3mu{#6}\mkern#4mu$}% - // Some groups can return document fragments. Handle those by wrapping - // them in a span. - - var newOptions = options.havingStyle(style.sup()); - var upperGroup = buildCommon.wrapFragment(buildHTML_buildGroup(group.body, newOptions, options), options); - upperGroup.classes.push("x-arrow-pad"); - var lowerGroup; - - if (group.below) { - // Build the lower group - newOptions = options.havingStyle(style.sub()); - lowerGroup = buildCommon.wrapFragment(buildHTML_buildGroup(group.below, newOptions, options), options); - lowerGroup.classes.push("x-arrow-pad"); - } - - var arrowBody = stretchy.svgSpan(group, options); // Re shift: Note that stretchy.svgSpan returned arrowBody.depth = 0. - // The point we want on the math axis is at 0.5 * arrowBody.height. - - var arrowShift = -options.fontMetrics().axisHeight + 0.5 * arrowBody.height; // 2 mu kern. Ref: amsmath.dtx: #7\if0#2\else\mkern#2mu\fi - - var upperShift = -options.fontMetrics().axisHeight - 0.5 * arrowBody.height - 0.111; // 0.111 em = 2 mu - - if (upperGroup.depth > 0.25 || group.label === "\\xleftequilibrium") { - upperShift -= upperGroup.depth; // shift up if depth encroaches - } // Generate the vlist - - - var vlist; - - if (lowerGroup) { - var lowerShift = -options.fontMetrics().axisHeight + lowerGroup.height + 0.5 * arrowBody.height + 0.111; - vlist = buildCommon.makeVList({ - positionType: "individualShift", - children: [{ - type: "elem", - elem: upperGroup, - shift: upperShift - }, { - type: "elem", - elem: arrowBody, - shift: arrowShift - }, { - type: "elem", - elem: lowerGroup, - shift: lowerShift - }] - }, options); - } else { - vlist = buildCommon.makeVList({ - positionType: "individualShift", - children: [{ - type: "elem", - elem: upperGroup, - shift: upperShift - }, { - type: "elem", - elem: arrowBody, - shift: arrowShift - }] - }, options); - } // $FlowFixMe: Replace this with passing "svg-align" into makeVList. - - - vlist.children[0].children[0].children[1].classes.push("svg-align"); - return buildCommon.makeSpan(["mrel", "x-arrow"], [vlist], options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var arrowNode = stretchy.mathMLnode(group.label); - var node; - - if (group.body) { - var upperNode = arrow_paddedNode(buildMathML_buildGroup(group.body, options)); - - if (group.below) { - var lowerNode = arrow_paddedNode(buildMathML_buildGroup(group.below, options)); - node = new mathMLTree.MathNode("munderover", [arrowNode, lowerNode, upperNode]); - } else { - node = new mathMLTree.MathNode("mover", [arrowNode, upperNode]); - } - } else if (group.below) { - var _lowerNode = arrow_paddedNode(buildMathML_buildGroup(group.below, options)); - - node = new mathMLTree.MathNode("munder", [arrowNode, _lowerNode]); - } else { - // This should never happen. - // Parser.js throws an error if there is no argument. - node = arrow_paddedNode(); - node = new mathMLTree.MathNode("mover", [arrowNode, node]); - } - - return node; - } -}); -// CONCATENATED MODULE: ./src/functions/char.js - - - // \@char is an internal function that takes a grouped decimal argument like -// {123} and converts into symbol with code 123. It is used by the *macro* -// \char defined in macros.js. - -defineFunction({ - type: "textord", - names: ["\\@char"], - props: { - numArgs: 1, - allowedInText: true - }, - handler: function handler(_ref, args) { - var parser = _ref.parser; - var arg = assertNodeType(args[0], "ordgroup"); - var group = arg.body; - var number = ""; - - for (var i = 0; i < group.length; i++) { - var node = assertNodeType(group[i], "textord"); - number += node.text; - } - - var code = parseInt(number); - - if (isNaN(code)) { - throw new src_ParseError("\\@char has non-numeric argument " + number); - } - - return { - type: "textord", - mode: parser.mode, - text: String.fromCharCode(code) - }; - } -}); -// CONCATENATED MODULE: ./src/functions/color.js - - - - - - - -var color_htmlBuilder = function htmlBuilder(group, options) { - var elements = buildHTML_buildExpression(group.body, options.withColor(group.color), false); // \color isn't supposed to affect the type of the elements it contains. - // To accomplish this, we wrap the results in a fragment, so the inner - // elements will be able to directly interact with their neighbors. For - // example, `\color{red}{2 +} 3` has the same spacing as `2 + 3` - - return buildCommon.makeFragment(elements); -}; - -var color_mathmlBuilder = function mathmlBuilder(group, options) { - var inner = buildMathML_buildExpression(group.body, options.withColor(group.color)); - var node = new mathMLTree.MathNode("mstyle", inner); - node.setAttribute("mathcolor", group.color); - return node; -}; - -defineFunction({ - type: "color", - names: ["\\textcolor"], - props: { - numArgs: 2, - allowedInText: true, - greediness: 3, - argTypes: ["color", "original"] - }, - handler: function handler(_ref, args) { - var parser = _ref.parser; - var color = assertNodeType(args[0], "color-token").color; - var body = args[1]; - return { - type: "color", - mode: parser.mode, - color: color, - body: ordargument(body) - }; - }, - htmlBuilder: color_htmlBuilder, - mathmlBuilder: color_mathmlBuilder -}); -defineFunction({ - type: "color", - names: ["\\color"], - props: { - numArgs: 1, - allowedInText: true, - greediness: 3, - argTypes: ["color"] - }, - handler: function handler(_ref2, args) { - var parser = _ref2.parser, - breakOnTokenText = _ref2.breakOnTokenText; - var color = assertNodeType(args[0], "color-token").color; // Set macro \current@color in current namespace to store the current - // color, mimicking the behavior of color.sty. - // This is currently used just to correctly color a \right - // that follows a \color command. - - parser.gullet.macros.set("\\current@color", color); // Parse out the implicit body that should be colored. - - var body = parser.parseExpression(true, breakOnTokenText); - return { - type: "color", - mode: parser.mode, - color: color, - body: body - }; - }, - htmlBuilder: color_htmlBuilder, - mathmlBuilder: color_mathmlBuilder -}); -// CONCATENATED MODULE: ./src/functions/cr.js -// Row breaks within tabular environments, and line breaks at top level - - - - - - // \\ is a macro mapping to either \cr or \newline. Because they have the -// same signature, we implement them as one megafunction, with newRow -// indicating whether we're in the \cr case, and newLine indicating whether -// to break the line in the \newline case. - -defineFunction({ - type: "cr", - names: ["\\cr", "\\newline"], - props: { - numArgs: 0, - numOptionalArgs: 1, - argTypes: ["size"], - allowedInText: true - }, - handler: function handler(_ref, args, optArgs) { - var parser = _ref.parser, - funcName = _ref.funcName; - var size = optArgs[0]; - var newRow = funcName === "\\cr"; - var newLine = false; - - if (!newRow) { - if (parser.settings.displayMode && parser.settings.useStrictBehavior("newLineInDisplayMode", "In LaTeX, \\\\ or \\newline " + "does nothing in display mode")) { - newLine = false; - } else { - newLine = true; - } - } - - return { - type: "cr", - mode: parser.mode, - newLine: newLine, - newRow: newRow, - size: size && assertNodeType(size, "size").value - }; - }, - // The following builders are called only at the top level, - // not within tabular/array environments. - htmlBuilder: function htmlBuilder(group, options) { - if (group.newRow) { - throw new src_ParseError("\\cr valid only within a tabular/array environment"); - } - - var span = buildCommon.makeSpan(["mspace"], [], options); - - if (group.newLine) { - span.classes.push("newline"); - - if (group.size) { - span.style.marginTop = units_calculateSize(group.size, options) + "em"; - } - } - - return span; - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var node = new mathMLTree.MathNode("mspace"); - - if (group.newLine) { - node.setAttribute("linebreak", "newline"); - - if (group.size) { - node.setAttribute("height", units_calculateSize(group.size, options) + "em"); - } - } - - return node; - } -}); -// CONCATENATED MODULE: ./src/functions/def.js - - - -var globalMap = { - "\\global": "\\global", - "\\long": "\\\\globallong", - "\\\\globallong": "\\\\globallong", - "\\def": "\\gdef", - "\\gdef": "\\gdef", - "\\edef": "\\xdef", - "\\xdef": "\\xdef", - "\\let": "\\\\globallet", - "\\futurelet": "\\\\globalfuture" -}; - -var def_checkControlSequence = function checkControlSequence(tok) { - var name = tok.text; - - if (/^(?:[\\{}$&#^_]|EOF)$/.test(name)) { - throw new src_ParseError("Expected a control sequence", tok); - } - - return name; -}; - -var getRHS = function getRHS(parser) { - var tok = parser.gullet.popToken(); - - if (tok.text === "=") { - // consume optional equals - tok = parser.gullet.popToken(); - - if (tok.text === " ") { - // consume one optional space - tok = parser.gullet.popToken(); - } - } - - return tok; -}; - -var letCommand = function letCommand(parser, name, tok, global) { - var macro = parser.gullet.macros.get(tok.text); - - if (macro == null) { - // don't expand it later even if a macro with the same name is defined - // e.g., \let\foo=\frac \def\frac{\relax} \frac12 - tok.noexpand = true; - macro = { - tokens: [tok], - numArgs: 0, - // reproduce the same behavior in expansion - unexpandable: !parser.gullet.isExpandable(tok.text) - }; - } - - parser.gullet.macros.set(name, macro, global); -}; // -> | -// -> |\global -// -> | -// -> \global|\long|\outer - - -defineFunction({ - type: "internal", - names: ["\\global", "\\long", "\\\\globallong"], - props: { - numArgs: 0, - allowedInText: true - }, - handler: function handler(_ref) { - var parser = _ref.parser, - funcName = _ref.funcName; - parser.consumeSpaces(); - var token = parser.fetch(); - - if (globalMap[token.text]) { - // KaTeX doesn't have \par, so ignore \long - if (funcName === "\\global" || funcName === "\\\\globallong") { - token.text = globalMap[token.text]; - } - - return assertNodeType(parser.parseFunction(), "internal"); - } - - throw new src_ParseError("Invalid token after macro prefix", token); - } -}); // Basic support for macro definitions: \def, \gdef, \edef, \xdef -// -> -// -> \def|\gdef|\edef|\xdef -// -> - -defineFunction({ - type: "internal", - names: ["\\def", "\\gdef", "\\edef", "\\xdef"], - props: { - numArgs: 0, - allowedInText: true - }, - handler: function handler(_ref2) { - var parser = _ref2.parser, - funcName = _ref2.funcName; - var arg = parser.gullet.consumeArgs(1)[0]; - - if (arg.length !== 1) { - throw new src_ParseError("\\gdef's first argument must be a macro name"); - } - - var name = arg[0].text; // Count argument specifiers, and check they are in the order #1 #2 ... - - var numArgs = 0; - arg = parser.gullet.consumeArgs(1)[0]; - - while (arg.length === 1 && arg[0].text === "#") { - arg = parser.gullet.consumeArgs(1)[0]; - - if (arg.length !== 1) { - throw new src_ParseError("Invalid argument number length \"" + arg.length + "\""); - } - - if (!/^[1-9]$/.test(arg[0].text)) { - throw new src_ParseError("Invalid argument number \"" + arg[0].text + "\""); - } - - numArgs++; - - if (parseInt(arg[0].text) !== numArgs) { - throw new src_ParseError("Argument number \"" + arg[0].text + "\" out of order"); - } - - arg = parser.gullet.consumeArgs(1)[0]; - } - - if (funcName === "\\edef" || funcName === "\\xdef") { - arg = parser.gullet.expandTokens(arg); - arg.reverse(); // to fit in with stack order - } // Final arg is the expansion of the macro - - - parser.gullet.macros.set(name, { - tokens: arg, - numArgs: numArgs - }, funcName === globalMap[funcName]); - return { - type: "internal", - mode: parser.mode - }; - } -}); // -> -// -> \futurelet -// | \let -// -> |= - -defineFunction({ - type: "internal", - names: ["\\let", "\\\\globallet"], - props: { - numArgs: 0, - allowedInText: true - }, - handler: function handler(_ref3) { - var parser = _ref3.parser, - funcName = _ref3.funcName; - var name = def_checkControlSequence(parser.gullet.popToken()); - parser.gullet.consumeSpaces(); - var tok = getRHS(parser); - letCommand(parser, name, tok, funcName === "\\\\globallet"); - return { - type: "internal", - mode: parser.mode - }; - } -}); // ref: https://www.tug.org/TUGboat/tb09-3/tb22bechtolsheim.pdf - -defineFunction({ - type: "internal", - names: ["\\futurelet", "\\\\globalfuture"], - props: { - numArgs: 0, - allowedInText: true - }, - handler: function handler(_ref4) { - var parser = _ref4.parser, - funcName = _ref4.funcName; - var name = def_checkControlSequence(parser.gullet.popToken()); - var middle = parser.gullet.popToken(); - var tok = parser.gullet.popToken(); - letCommand(parser, name, tok, funcName === "\\\\globalfuture"); - parser.gullet.pushToken(tok); - parser.gullet.pushToken(middle); - return { - type: "internal", - mode: parser.mode - }; - } -}); -// CONCATENATED MODULE: ./src/delimiter.js -/** - * This file deals with creating delimiters of various sizes. The TeXbook - * discusses these routines on page 441-442, in the "Another subroutine sets box - * x to a specified variable delimiter" paragraph. - * - * There are three main routines here. `makeSmallDelim` makes a delimiter in the - * normal font, but in either text, script, or scriptscript style. - * `makeLargeDelim` makes a delimiter in textstyle, but in one of the Size1, - * Size2, Size3, or Size4 fonts. `makeStackedDelim` makes a delimiter out of - * smaller pieces that are stacked on top of one another. - * - * The functions take a parameter `center`, which determines if the delimiter - * should be centered around the axis. - * - * Then, there are three exposed functions. `sizedDelim` makes a delimiter in - * one of the given sizes. This is used for things like `\bigl`. - * `customSizedDelim` makes a delimiter with a given total height+depth. It is - * called in places like `\sqrt`. `leftRightDelim` makes an appropriate - * delimiter which surrounds an expression of a given height an depth. It is - * used in `\left` and `\right`. - */ - - - - - - - - - -/** - * Get the metrics for a given symbol and font, after transformation (i.e. - * after following replacement from symbols.js) - */ -var delimiter_getMetrics = function getMetrics(symbol, font, mode) { - var replace = src_symbols.math[symbol] && src_symbols.math[symbol].replace; - var metrics = getCharacterMetrics(replace || symbol, font, mode); - - if (!metrics) { - throw new Error("Unsupported symbol " + symbol + " and font size " + font + "."); - } - - return metrics; -}; -/** - * Puts a delimiter span in a given style, and adds appropriate height, depth, - * and maxFontSizes. - */ - - -var delimiter_styleWrap = function styleWrap(delim, toStyle, options, classes) { - var newOptions = options.havingBaseStyle(toStyle); - var span = buildCommon.makeSpan(classes.concat(newOptions.sizingClasses(options)), [delim], options); - var delimSizeMultiplier = newOptions.sizeMultiplier / options.sizeMultiplier; - span.height *= delimSizeMultiplier; - span.depth *= delimSizeMultiplier; - span.maxFontSize = newOptions.sizeMultiplier; - return span; -}; - -var centerSpan = function centerSpan(span, options, style) { - var newOptions = options.havingBaseStyle(style); - var shift = (1 - options.sizeMultiplier / newOptions.sizeMultiplier) * options.fontMetrics().axisHeight; - span.classes.push("delimcenter"); - span.style.top = shift + "em"; - span.height -= shift; - span.depth += shift; -}; -/** - * Makes a small delimiter. This is a delimiter that comes in the Main-Regular - * font, but is restyled to either be in textstyle, scriptstyle, or - * scriptscriptstyle. - */ - - -var delimiter_makeSmallDelim = function makeSmallDelim(delim, style, center, options, mode, classes) { - var text = buildCommon.makeSymbol(delim, "Main-Regular", mode, options); - var span = delimiter_styleWrap(text, style, options, classes); - - if (center) { - centerSpan(span, options, style); - } - - return span; -}; -/** - * Builds a symbol in the given font size (note size is an integer) - */ - - -var delimiter_mathrmSize = function mathrmSize(value, size, mode, options) { - return buildCommon.makeSymbol(value, "Size" + size + "-Regular", mode, options); -}; -/** - * Makes a large delimiter. This is a delimiter that comes in the Size1, Size2, - * Size3, or Size4 fonts. It is always rendered in textstyle. - */ - - -var delimiter_makeLargeDelim = function makeLargeDelim(delim, size, center, options, mode, classes) { - var inner = delimiter_mathrmSize(delim, size, mode, options); - var span = delimiter_styleWrap(buildCommon.makeSpan(["delimsizing", "size" + size], [inner], options), src_Style.TEXT, options, classes); - - if (center) { - centerSpan(span, options, src_Style.TEXT); - } - - return span; -}; -/** - * Make an inner span with the given offset and in the given font. This is used - * in `makeStackedDelim` to make the stacking pieces for the delimiter. - */ - - -var delimiter_makeInner = function makeInner(symbol, font, mode) { - var sizeClass; // Apply the correct CSS class to choose the right font. - - if (font === "Size1-Regular") { - sizeClass = "delim-size1"; - } else - /* if (font === "Size4-Regular") */ - { - sizeClass = "delim-size4"; - } - - var inner = buildCommon.makeSpan(["delimsizinginner", sizeClass], [buildCommon.makeSpan([], [buildCommon.makeSymbol(symbol, font, mode)])]); // Since this will be passed into `makeVList` in the end, wrap the element - // in the appropriate tag that VList uses. - - return { - type: "elem", - elem: inner - }; -}; // Helper for makeStackedDelim - - -var lap = { - type: "kern", - size: -0.005 -}; -/** - * Make a stacked delimiter out of a given delimiter, with the total height at - * least `heightTotal`. This routine is mentioned on page 442 of the TeXbook. - */ - -var delimiter_makeStackedDelim = function makeStackedDelim(delim, heightTotal, center, options, mode, classes) { - // There are four parts, the top, an optional middle, a repeated part, and a - // bottom. - var top; - var middle; - var repeat; - var bottom; - top = repeat = bottom = delim; - middle = null; // Also keep track of what font the delimiters are in - - var font = "Size1-Regular"; // We set the parts and font based on the symbol. Note that we use - // '\u23d0' instead of '|' and '\u2016' instead of '\\|' for the - // repeats of the arrows - - if (delim === "\\uparrow") { - repeat = bottom = "\u23D0"; - } else if (delim === "\\Uparrow") { - repeat = bottom = "\u2016"; - } else if (delim === "\\downarrow") { - top = repeat = "\u23D0"; - } else if (delim === "\\Downarrow") { - top = repeat = "\u2016"; - } else if (delim === "\\updownarrow") { - top = "\\uparrow"; - repeat = "\u23D0"; - bottom = "\\downarrow"; - } else if (delim === "\\Updownarrow") { - top = "\\Uparrow"; - repeat = "\u2016"; - bottom = "\\Downarrow"; - } else if (delim === "[" || delim === "\\lbrack") { - top = "\u23A1"; - repeat = "\u23A2"; - bottom = "\u23A3"; - font = "Size4-Regular"; - } else if (delim === "]" || delim === "\\rbrack") { - top = "\u23A4"; - repeat = "\u23A5"; - bottom = "\u23A6"; - font = "Size4-Regular"; - } else if (delim === "\\lfloor" || delim === "\u230A") { - repeat = top = "\u23A2"; - bottom = "\u23A3"; - font = "Size4-Regular"; - } else if (delim === "\\lceil" || delim === "\u2308") { - top = "\u23A1"; - repeat = bottom = "\u23A2"; - font = "Size4-Regular"; - } else if (delim === "\\rfloor" || delim === "\u230B") { - repeat = top = "\u23A5"; - bottom = "\u23A6"; - font = "Size4-Regular"; - } else if (delim === "\\rceil" || delim === "\u2309") { - top = "\u23A4"; - repeat = bottom = "\u23A5"; - font = "Size4-Regular"; - } else if (delim === "(" || delim === "\\lparen") { - top = "\u239B"; - repeat = "\u239C"; - bottom = "\u239D"; - font = "Size4-Regular"; - } else if (delim === ")" || delim === "\\rparen") { - top = "\u239E"; - repeat = "\u239F"; - bottom = "\u23A0"; - font = "Size4-Regular"; - } else if (delim === "\\{" || delim === "\\lbrace") { - top = "\u23A7"; - middle = "\u23A8"; - bottom = "\u23A9"; - repeat = "\u23AA"; - font = "Size4-Regular"; - } else if (delim === "\\}" || delim === "\\rbrace") { - top = "\u23AB"; - middle = "\u23AC"; - bottom = "\u23AD"; - repeat = "\u23AA"; - font = "Size4-Regular"; - } else if (delim === "\\lgroup" || delim === "\u27EE") { - top = "\u23A7"; - bottom = "\u23A9"; - repeat = "\u23AA"; - font = "Size4-Regular"; - } else if (delim === "\\rgroup" || delim === "\u27EF") { - top = "\u23AB"; - bottom = "\u23AD"; - repeat = "\u23AA"; - font = "Size4-Regular"; - } else if (delim === "\\lmoustache" || delim === "\u23B0") { - top = "\u23A7"; - bottom = "\u23AD"; - repeat = "\u23AA"; - font = "Size4-Regular"; - } else if (delim === "\\rmoustache" || delim === "\u23B1") { - top = "\u23AB"; - bottom = "\u23A9"; - repeat = "\u23AA"; - font = "Size4-Regular"; - } // Get the metrics of the four sections - - - var topMetrics = delimiter_getMetrics(top, font, mode); - var topHeightTotal = topMetrics.height + topMetrics.depth; - var repeatMetrics = delimiter_getMetrics(repeat, font, mode); - var repeatHeightTotal = repeatMetrics.height + repeatMetrics.depth; - var bottomMetrics = delimiter_getMetrics(bottom, font, mode); - var bottomHeightTotal = bottomMetrics.height + bottomMetrics.depth; - var middleHeightTotal = 0; - var middleFactor = 1; - - if (middle !== null) { - var middleMetrics = delimiter_getMetrics(middle, font, mode); - middleHeightTotal = middleMetrics.height + middleMetrics.depth; - middleFactor = 2; // repeat symmetrically above and below middle - } // Calcuate the minimal height that the delimiter can have. - // It is at least the size of the top, bottom, and optional middle combined. - - - var minHeight = topHeightTotal + bottomHeightTotal + middleHeightTotal; // Compute the number of copies of the repeat symbol we will need - - var repeatCount = Math.max(0, Math.ceil((heightTotal - minHeight) / (middleFactor * repeatHeightTotal))); // Compute the total height of the delimiter including all the symbols - - var realHeightTotal = minHeight + repeatCount * middleFactor * repeatHeightTotal; // The center of the delimiter is placed at the center of the axis. Note - // that in this context, "center" means that the delimiter should be - // centered around the axis in the current style, while normally it is - // centered around the axis in textstyle. - - var axisHeight = options.fontMetrics().axisHeight; - - if (center) { - axisHeight *= options.sizeMultiplier; - } // Calculate the depth - - - var depth = realHeightTotal / 2 - axisHeight; // This function differs from the TeX procedure in one way. - // We shift each repeat element downwards by 0.005em, to prevent a gap - // due to browser floating point rounding error. - // Then, at the last element-to element joint, we add one extra repeat - // element to cover the gap created by the shifts. - // Find the shift needed to align the upper end of the extra element at a point - // 0.005em above the lower end of the top element. - - var shiftOfExtraElement = (repeatCount + 1) * 0.005 - repeatHeightTotal; // Now, we start building the pieces that will go into the vlist - // Keep a list of the inner pieces - - var inners = []; // Add the bottom symbol - - inners.push(delimiter_makeInner(bottom, font, mode)); - - if (middle === null) { - // Add that many symbols - for (var i = 0; i < repeatCount; i++) { - inners.push(lap); // overlap - - inners.push(delimiter_makeInner(repeat, font, mode)); - } - } else { - // When there is a middle bit, we need the middle part and two repeated - // sections - for (var _i = 0; _i < repeatCount; _i++) { - inners.push(lap); - inners.push(delimiter_makeInner(repeat, font, mode)); - } // Insert one extra repeat element. - - - inners.push({ - type: "kern", - size: shiftOfExtraElement - }); - inners.push(delimiter_makeInner(repeat, font, mode)); - inners.push(lap); // Now insert the middle of the brace. - - inners.push(delimiter_makeInner(middle, font, mode)); - - for (var _i2 = 0; _i2 < repeatCount; _i2++) { - inners.push(lap); - inners.push(delimiter_makeInner(repeat, font, mode)); - } - } // To cover the gap create by the overlaps, insert one more repeat element, - // at a position that juts 0.005 above the bottom of the top element. - - - if ((repeat === "\u239C" || repeat === "\u239F") && repeatCount === 0) { - // Parentheses need a short repeat element in order to avoid an overrun. - // We'll make a 0.3em tall element from a SVG. - var overlap = buildCommon.svgData.leftParenInner[2] / 2; - inners.push({ - type: "kern", - size: -overlap - }); - var pathName = repeat === "\u239C" ? "leftParenInner" : "rightParenInner"; - var innerSpan = buildCommon.staticSvg(pathName, options); - inners.push({ - type: "elem", - elem: innerSpan - }); - inners.push({ - type: "kern", - size: -overlap - }); - } else { - inners.push({ - type: "kern", - size: shiftOfExtraElement - }); - inners.push(delimiter_makeInner(repeat, font, mode)); - inners.push(lap); - } // Add the top symbol - - - inners.push(delimiter_makeInner(top, font, mode)); // Finally, build the vlist - - var newOptions = options.havingBaseStyle(src_Style.TEXT); - var inner = buildCommon.makeVList({ - positionType: "bottom", - positionData: depth, - children: inners - }, newOptions); - return delimiter_styleWrap(buildCommon.makeSpan(["delimsizing", "mult"], [inner], newOptions), src_Style.TEXT, options, classes); -}; // All surds have 0.08em padding above the viniculum inside the SVG. -// That keeps browser span height rounding error from pinching the line. - - -var vbPad = 80; // padding above the surd, measured inside the viewBox. - -var emPad = 0.08; // padding, in ems, measured in the document. - -var delimiter_sqrtSvg = function sqrtSvg(sqrtName, height, viewBoxHeight, extraViniculum, options) { - var path = sqrtPath(sqrtName, extraViniculum, viewBoxHeight); - var pathNode = new domTree_PathNode(sqrtName, path); - var svg = new SvgNode([pathNode], { - // Note: 1000:1 ratio of viewBox to document em width. - "width": "400em", - "height": height + "em", - "viewBox": "0 0 400000 " + viewBoxHeight, - "preserveAspectRatio": "xMinYMin slice" - }); - return buildCommon.makeSvgSpan(["hide-tail"], [svg], options); -}; -/** - * Make a sqrt image of the given height, - */ - - -var makeSqrtImage = function makeSqrtImage(height, options) { - // Define a newOptions that removes the effect of size changes such as \Huge. - // We don't pick different a height surd for \Huge. For it, we scale up. - var newOptions = options.havingBaseSizing(); // Pick the desired surd glyph from a sequence of surds. - - var delim = traverseSequence("\\surd", height * newOptions.sizeMultiplier, stackLargeDelimiterSequence, newOptions); - var sizeMultiplier = newOptions.sizeMultiplier; // default - // The standard sqrt SVGs each have a 0.04em thick viniculum. - // If Settings.minRuleThickness is larger than that, we add extraViniculum. - - var extraViniculum = Math.max(0, options.minRuleThickness - options.fontMetrics().sqrtRuleThickness); // Create a span containing an SVG image of a sqrt symbol. - - var span; - var spanHeight = 0; - var texHeight = 0; - var viewBoxHeight = 0; - var advanceWidth; // We create viewBoxes with 80 units of "padding" above each surd. - // Then browser rounding error on the parent span height will not - // encroach on the ink of the viniculum. But that padding is not - // included in the TeX-like `height` used for calculation of - // vertical alignment. So texHeight = span.height < span.style.height. - - if (delim.type === "small") { - // Get an SVG that is derived from glyph U+221A in font KaTeX-Main. - // 1000 unit normal glyph height. - viewBoxHeight = 1000 + 1000 * extraViniculum + vbPad; - - if (height < 1.0) { - sizeMultiplier = 1.0; // mimic a \textfont radical - } else if (height < 1.4) { - sizeMultiplier = 0.7; // mimic a \scriptfont radical - } - - spanHeight = (1.0 + extraViniculum + emPad) / sizeMultiplier; - texHeight = (1.00 + extraViniculum) / sizeMultiplier; - span = delimiter_sqrtSvg("sqrtMain", spanHeight, viewBoxHeight, extraViniculum, options); - span.style.minWidth = "0.853em"; - advanceWidth = 0.833 / sizeMultiplier; // from the font. - } else if (delim.type === "large") { - // These SVGs come from fonts: KaTeX_Size1, _Size2, etc. - viewBoxHeight = (1000 + vbPad) * sizeToMaxHeight[delim.size]; - texHeight = (sizeToMaxHeight[delim.size] + extraViniculum) / sizeMultiplier; - spanHeight = (sizeToMaxHeight[delim.size] + extraViniculum + emPad) / sizeMultiplier; - span = delimiter_sqrtSvg("sqrtSize" + delim.size, spanHeight, viewBoxHeight, extraViniculum, options); - span.style.minWidth = "1.02em"; - advanceWidth = 1.0 / sizeMultiplier; // 1.0 from the font. - } else { - // Tall sqrt. In TeX, this would be stacked using multiple glyphs. - // We'll use a single SVG to accomplish the same thing. - spanHeight = height + extraViniculum + emPad; - texHeight = height + extraViniculum; - viewBoxHeight = Math.floor(1000 * height + extraViniculum) + vbPad; - span = delimiter_sqrtSvg("sqrtTall", spanHeight, viewBoxHeight, extraViniculum, options); - span.style.minWidth = "0.742em"; - advanceWidth = 1.056; - } - - span.height = texHeight; - span.style.height = spanHeight + "em"; - return { - span: span, - advanceWidth: advanceWidth, - // Calculate the actual line width. - // This actually should depend on the chosen font -- e.g. \boldmath - // should use the thicker surd symbols from e.g. KaTeX_Main-Bold, and - // have thicker rules. - ruleWidth: (options.fontMetrics().sqrtRuleThickness + extraViniculum) * sizeMultiplier - }; -}; // There are three kinds of delimiters, delimiters that stack when they become -// too large - - -var stackLargeDelimiters = ["(", "\\lparen", ")", "\\rparen", "[", "\\lbrack", "]", "\\rbrack", "\\{", "\\lbrace", "\\}", "\\rbrace", "\\lfloor", "\\rfloor", "\u230A", "\u230B", "\\lceil", "\\rceil", "\u2308", "\u2309", "\\surd"]; // delimiters that always stack - -var stackAlwaysDelimiters = ["\\uparrow", "\\downarrow", "\\updownarrow", "\\Uparrow", "\\Downarrow", "\\Updownarrow", "|", "\\|", "\\vert", "\\Vert", "\\lvert", "\\rvert", "\\lVert", "\\rVert", "\\lgroup", "\\rgroup", "\u27EE", "\u27EF", "\\lmoustache", "\\rmoustache", "\u23B0", "\u23B1"]; // and delimiters that never stack - -var stackNeverDelimiters = ["<", ">", "\\langle", "\\rangle", "/", "\\backslash", "\\lt", "\\gt"]; // Metrics of the different sizes. Found by looking at TeX's output of -// $\bigl| // \Bigl| \biggl| \Biggl| \showlists$ -// Used to create stacked delimiters of appropriate sizes in makeSizedDelim. - -var sizeToMaxHeight = [0, 1.2, 1.8, 2.4, 3.0]; -/** - * Used to create a delimiter of a specific size, where `size` is 1, 2, 3, or 4. - */ - -var delimiter_makeSizedDelim = function makeSizedDelim(delim, size, options, mode, classes) { - // < and > turn into \langle and \rangle in delimiters - if (delim === "<" || delim === "\\lt" || delim === "\u27E8") { - delim = "\\langle"; - } else if (delim === ">" || delim === "\\gt" || delim === "\u27E9") { - delim = "\\rangle"; - } // Sized delimiters are never centered. - - - if (utils.contains(stackLargeDelimiters, delim) || utils.contains(stackNeverDelimiters, delim)) { - return delimiter_makeLargeDelim(delim, size, false, options, mode, classes); - } else if (utils.contains(stackAlwaysDelimiters, delim)) { - return delimiter_makeStackedDelim(delim, sizeToMaxHeight[size], false, options, mode, classes); - } else { - throw new src_ParseError("Illegal delimiter: '" + delim + "'"); - } -}; -/** - * There are three different sequences of delimiter sizes that the delimiters - * follow depending on the kind of delimiter. This is used when creating custom - * sized delimiters to decide whether to create a small, large, or stacked - * delimiter. - * - * In real TeX, these sequences aren't explicitly defined, but are instead - * defined inside the font metrics. Since there are only three sequences that - * are possible for the delimiters that TeX defines, it is easier to just encode - * them explicitly here. - */ - - -// Delimiters that never stack try small delimiters and large delimiters only -var stackNeverDelimiterSequence = [{ - type: "small", - style: src_Style.SCRIPTSCRIPT -}, { - type: "small", - style: src_Style.SCRIPT -}, { - type: "small", - style: src_Style.TEXT -}, { - type: "large", - size: 1 -}, { - type: "large", - size: 2 -}, { - type: "large", - size: 3 -}, { - type: "large", - size: 4 -}]; // Delimiters that always stack try the small delimiters first, then stack - -var stackAlwaysDelimiterSequence = [{ - type: "small", - style: src_Style.SCRIPTSCRIPT -}, { - type: "small", - style: src_Style.SCRIPT -}, { - type: "small", - style: src_Style.TEXT -}, { - type: "stack" -}]; // Delimiters that stack when large try the small and then large delimiters, and -// stack afterwards - -var stackLargeDelimiterSequence = [{ - type: "small", - style: src_Style.SCRIPTSCRIPT -}, { - type: "small", - style: src_Style.SCRIPT -}, { - type: "small", - style: src_Style.TEXT -}, { - type: "large", - size: 1 -}, { - type: "large", - size: 2 -}, { - type: "large", - size: 3 -}, { - type: "large", - size: 4 -}, { - type: "stack" -}]; -/** - * Get the font used in a delimiter based on what kind of delimiter it is. - * TODO(#963) Use more specific font family return type once that is introduced. - */ - -var delimTypeToFont = function delimTypeToFont(type) { - if (type.type === "small") { - return "Main-Regular"; - } else if (type.type === "large") { - return "Size" + type.size + "-Regular"; - } else if (type.type === "stack") { - return "Size4-Regular"; - } else { - throw new Error("Add support for delim type '" + type.type + "' here."); - } -}; -/** - * Traverse a sequence of types of delimiters to decide what kind of delimiter - * should be used to create a delimiter of the given height+depth. - */ - - -var traverseSequence = function traverseSequence(delim, height, sequence, options) { - // Here, we choose the index we should start at in the sequences. In smaller - // sizes (which correspond to larger numbers in style.size) we start earlier - // in the sequence. Thus, scriptscript starts at index 3-3=0, script starts - // at index 3-2=1, text starts at 3-1=2, and display starts at min(2,3-0)=2 - var start = Math.min(2, 3 - options.style.size); - - for (var i = start; i < sequence.length; i++) { - if (sequence[i].type === "stack") { - // This is always the last delimiter, so we just break the loop now. - break; - } - - var metrics = delimiter_getMetrics(delim, delimTypeToFont(sequence[i]), "math"); - var heightDepth = metrics.height + metrics.depth; // Small delimiters are scaled down versions of the same font, so we - // account for the style change size. - - if (sequence[i].type === "small") { - var newOptions = options.havingBaseStyle(sequence[i].style); - heightDepth *= newOptions.sizeMultiplier; - } // Check if the delimiter at this size works for the given height. - - - if (heightDepth > height) { - return sequence[i]; - } - } // If we reached the end of the sequence, return the last sequence element. - - - return sequence[sequence.length - 1]; -}; -/** - * Make a delimiter of a given height+depth, with optional centering. Here, we - * traverse the sequences, and create a delimiter that the sequence tells us to. - */ - - -var delimiter_makeCustomSizedDelim = function makeCustomSizedDelim(delim, height, center, options, mode, classes) { - if (delim === "<" || delim === "\\lt" || delim === "\u27E8") { - delim = "\\langle"; - } else if (delim === ">" || delim === "\\gt" || delim === "\u27E9") { - delim = "\\rangle"; - } // Decide what sequence to use - - - var sequence; - - if (utils.contains(stackNeverDelimiters, delim)) { - sequence = stackNeverDelimiterSequence; - } else if (utils.contains(stackLargeDelimiters, delim)) { - sequence = stackLargeDelimiterSequence; - } else { - sequence = stackAlwaysDelimiterSequence; - } // Look through the sequence - - - var delimType = traverseSequence(delim, height, sequence, options); // Get the delimiter from font glyphs. - // Depending on the sequence element we decided on, call the - // appropriate function. - - if (delimType.type === "small") { - return delimiter_makeSmallDelim(delim, delimType.style, center, options, mode, classes); - } else if (delimType.type === "large") { - return delimiter_makeLargeDelim(delim, delimType.size, center, options, mode, classes); - } else - /* if (delimType.type === "stack") */ - { - return delimiter_makeStackedDelim(delim, height, center, options, mode, classes); - } -}; -/** - * Make a delimiter for use with `\left` and `\right`, given a height and depth - * of an expression that the delimiters surround. - */ - - -var makeLeftRightDelim = function makeLeftRightDelim(delim, height, depth, options, mode, classes) { - // We always center \left/\right delimiters, so the axis is always shifted - var axisHeight = options.fontMetrics().axisHeight * options.sizeMultiplier; // Taken from TeX source, tex.web, function make_left_right - - var delimiterFactor = 901; - var delimiterExtend = 5.0 / options.fontMetrics().ptPerEm; - var maxDistFromAxis = Math.max(height - axisHeight, depth + axisHeight); - var totalHeight = Math.max( // In real TeX, calculations are done using integral values which are - // 65536 per pt, or 655360 per em. So, the division here truncates in - // TeX but doesn't here, producing different results. If we wanted to - // exactly match TeX's calculation, we could do - // Math.floor(655360 * maxDistFromAxis / 500) * - // delimiterFactor / 655360 - // (To see the difference, compare - // x^{x^{\left(\rule{0.1em}{0.68em}\right)}} - // in TeX and KaTeX) - maxDistFromAxis / 500 * delimiterFactor, 2 * maxDistFromAxis - delimiterExtend); // Finally, we defer to `makeCustomSizedDelim` with our calculated total - // height - - return delimiter_makeCustomSizedDelim(delim, totalHeight, true, options, mode, classes); -}; - -/* harmony default export */ var delimiter = ({ - sqrtImage: makeSqrtImage, - sizedDelim: delimiter_makeSizedDelim, - customSizedDelim: delimiter_makeCustomSizedDelim, - leftRightDelim: makeLeftRightDelim -}); -// CONCATENATED MODULE: ./src/functions/delimsizing.js - - - - - - - - - -// Extra data needed for the delimiter handler down below -var delimiterSizes = { - "\\bigl": { - mclass: "mopen", - size: 1 - }, - "\\Bigl": { - mclass: "mopen", - size: 2 - }, - "\\biggl": { - mclass: "mopen", - size: 3 - }, - "\\Biggl": { - mclass: "mopen", - size: 4 - }, - "\\bigr": { - mclass: "mclose", - size: 1 - }, - "\\Bigr": { - mclass: "mclose", - size: 2 - }, - "\\biggr": { - mclass: "mclose", - size: 3 - }, - "\\Biggr": { - mclass: "mclose", - size: 4 - }, - "\\bigm": { - mclass: "mrel", - size: 1 - }, - "\\Bigm": { - mclass: "mrel", - size: 2 - }, - "\\biggm": { - mclass: "mrel", - size: 3 - }, - "\\Biggm": { - mclass: "mrel", - size: 4 - }, - "\\big": { - mclass: "mord", - size: 1 - }, - "\\Big": { - mclass: "mord", - size: 2 - }, - "\\bigg": { - mclass: "mord", - size: 3 - }, - "\\Bigg": { - mclass: "mord", - size: 4 - } -}; -var delimiters = ["(", "\\lparen", ")", "\\rparen", "[", "\\lbrack", "]", "\\rbrack", "\\{", "\\lbrace", "\\}", "\\rbrace", "\\lfloor", "\\rfloor", "\u230A", "\u230B", "\\lceil", "\\rceil", "\u2308", "\u2309", "<", ">", "\\langle", "\u27E8", "\\rangle", "\u27E9", "\\lt", "\\gt", "\\lvert", "\\rvert", "\\lVert", "\\rVert", "\\lgroup", "\\rgroup", "\u27EE", "\u27EF", "\\lmoustache", "\\rmoustache", "\u23B0", "\u23B1", "/", "\\backslash", "|", "\\vert", "\\|", "\\Vert", "\\uparrow", "\\Uparrow", "\\downarrow", "\\Downarrow", "\\updownarrow", "\\Updownarrow", "."]; - -// Delimiter functions -function checkDelimiter(delim, context) { - var symDelim = checkSymbolNodeType(delim); - - if (symDelim && utils.contains(delimiters, symDelim.text)) { - return symDelim; - } else if (symDelim) { - throw new src_ParseError("Invalid delimiter '" + symDelim.text + "' after '" + context.funcName + "'", delim); - } else { - throw new src_ParseError("Invalid delimiter type '" + delim.type + "'", delim); - } -} - -defineFunction({ - type: "delimsizing", - names: ["\\bigl", "\\Bigl", "\\biggl", "\\Biggl", "\\bigr", "\\Bigr", "\\biggr", "\\Biggr", "\\bigm", "\\Bigm", "\\biggm", "\\Biggm", "\\big", "\\Big", "\\bigg", "\\Bigg"], - props: { - numArgs: 1 - }, - handler: function handler(context, args) { - var delim = checkDelimiter(args[0], context); - return { - type: "delimsizing", - mode: context.parser.mode, - size: delimiterSizes[context.funcName].size, - mclass: delimiterSizes[context.funcName].mclass, - delim: delim.text - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - if (group.delim === ".") { - // Empty delimiters still count as elements, even though they don't - // show anything. - return buildCommon.makeSpan([group.mclass]); - } // Use delimiter.sizedDelim to generate the delimiter. - - - return delimiter.sizedDelim(group.delim, group.size, options, group.mode, [group.mclass]); - }, - mathmlBuilder: function mathmlBuilder(group) { - var children = []; - - if (group.delim !== ".") { - children.push(buildMathML_makeText(group.delim, group.mode)); - } - - var node = new mathMLTree.MathNode("mo", children); - - if (group.mclass === "mopen" || group.mclass === "mclose") { - // Only some of the delimsizing functions act as fences, and they - // return "mopen" or "mclose" mclass. - node.setAttribute("fence", "true"); - } else { - // Explicitly disable fencing if it's not a fence, to override the - // defaults. - node.setAttribute("fence", "false"); - } - - return node; - } -}); - -function assertParsed(group) { - if (!group.body) { - throw new Error("Bug: The leftright ParseNode wasn't fully parsed."); - } -} - -defineFunction({ - type: "leftright-right", - names: ["\\right"], - props: { - numArgs: 1 - }, - handler: function handler(context, args) { - // \left case below triggers parsing of \right in - // `const right = parser.parseFunction();` - // uses this return value. - var color = context.parser.gullet.macros.get("\\current@color"); - - if (color && typeof color !== "string") { - throw new src_ParseError("\\current@color set to non-string in \\right"); - } - - return { - type: "leftright-right", - mode: context.parser.mode, - delim: checkDelimiter(args[0], context).text, - color: color // undefined if not set via \color - - }; - } -}); -defineFunction({ - type: "leftright", - names: ["\\left"], - props: { - numArgs: 1 - }, - handler: function handler(context, args) { - var delim = checkDelimiter(args[0], context); - var parser = context.parser; // Parse out the implicit body - - ++parser.leftrightDepth; // parseExpression stops before '\\right' - - var body = parser.parseExpression(false); - --parser.leftrightDepth; // Check the next token - - parser.expect("\\right", false); - var right = assertNodeType(parser.parseFunction(), "leftright-right"); - return { - type: "leftright", - mode: parser.mode, - body: body, - left: delim.text, - right: right.delim, - rightColor: right.color - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - assertParsed(group); // Build the inner expression - - var inner = buildHTML_buildExpression(group.body, options, true, ["mopen", "mclose"]); - var innerHeight = 0; - var innerDepth = 0; - var hadMiddle = false; // Calculate its height and depth - - for (var i = 0; i < inner.length; i++) { - // Property `isMiddle` not defined on `span`. See comment in - // "middle"'s htmlBuilder. - // $FlowFixMe - if (inner[i].isMiddle) { - hadMiddle = true; - } else { - innerHeight = Math.max(inner[i].height, innerHeight); - innerDepth = Math.max(inner[i].depth, innerDepth); - } - } // The size of delimiters is the same, regardless of what style we are - // in. Thus, to correctly calculate the size of delimiter we need around - // a group, we scale down the inner size based on the size. - - - innerHeight *= options.sizeMultiplier; - innerDepth *= options.sizeMultiplier; - var leftDelim; - - if (group.left === ".") { - // Empty delimiters in \left and \right make null delimiter spaces. - leftDelim = makeNullDelimiter(options, ["mopen"]); - } else { - // Otherwise, use leftRightDelim to generate the correct sized - // delimiter. - leftDelim = delimiter.leftRightDelim(group.left, innerHeight, innerDepth, options, group.mode, ["mopen"]); - } // Add it to the beginning of the expression - - - inner.unshift(leftDelim); // Handle middle delimiters - - if (hadMiddle) { - for (var _i = 1; _i < inner.length; _i++) { - var middleDelim = inner[_i]; // Property `isMiddle` not defined on `span`. See comment in - // "middle"'s htmlBuilder. - // $FlowFixMe - - var isMiddle = middleDelim.isMiddle; - - if (isMiddle) { - // Apply the options that were active when \middle was called - inner[_i] = delimiter.leftRightDelim(isMiddle.delim, innerHeight, innerDepth, isMiddle.options, group.mode, []); - } - } - } - - var rightDelim; // Same for the right delimiter, but using color specified by \color - - if (group.right === ".") { - rightDelim = makeNullDelimiter(options, ["mclose"]); - } else { - var colorOptions = group.rightColor ? options.withColor(group.rightColor) : options; - rightDelim = delimiter.leftRightDelim(group.right, innerHeight, innerDepth, colorOptions, group.mode, ["mclose"]); - } // Add it to the end of the expression. - - - inner.push(rightDelim); - return buildCommon.makeSpan(["minner"], inner, options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - assertParsed(group); - var inner = buildMathML_buildExpression(group.body, options); - - if (group.left !== ".") { - var leftNode = new mathMLTree.MathNode("mo", [buildMathML_makeText(group.left, group.mode)]); - leftNode.setAttribute("fence", "true"); - inner.unshift(leftNode); - } - - if (group.right !== ".") { - var rightNode = new mathMLTree.MathNode("mo", [buildMathML_makeText(group.right, group.mode)]); - rightNode.setAttribute("fence", "true"); - - if (group.rightColor) { - rightNode.setAttribute("mathcolor", group.rightColor); - } - - inner.push(rightNode); - } - - return buildMathML_makeRow(inner); - } -}); -defineFunction({ - type: "middle", - names: ["\\middle"], - props: { - numArgs: 1 - }, - handler: function handler(context, args) { - var delim = checkDelimiter(args[0], context); - - if (!context.parser.leftrightDepth) { - throw new src_ParseError("\\middle without preceding \\left", delim); - } - - return { - type: "middle", - mode: context.parser.mode, - delim: delim.text - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - var middleDelim; - - if (group.delim === ".") { - middleDelim = makeNullDelimiter(options, []); - } else { - middleDelim = delimiter.sizedDelim(group.delim, 1, options, group.mode, []); - var isMiddle = { - delim: group.delim, - options: options - }; // Property `isMiddle` not defined on `span`. It is only used in - // this file above. - // TODO: Fix this violation of the `span` type and possibly rename - // things since `isMiddle` sounds like a boolean, but is a struct. - // $FlowFixMe - - middleDelim.isMiddle = isMiddle; - } - - return middleDelim; - }, - mathmlBuilder: function mathmlBuilder(group, options) { - // A Firefox \middle will strech a character vertically only if it - // is in the fence part of the operator dictionary at: - // https://www.w3.org/TR/MathML3/appendixc.html. - // So we need to avoid U+2223 and use plain "|" instead. - var textNode = group.delim === "\\vert" || group.delim === "|" ? buildMathML_makeText("|", "text") : buildMathML_makeText(group.delim, group.mode); - var middleNode = new mathMLTree.MathNode("mo", [textNode]); - middleNode.setAttribute("fence", "true"); // MathML gives 5/18em spacing to each element. - // \middle should get delimiter spacing instead. - - middleNode.setAttribute("lspace", "0.05em"); - middleNode.setAttribute("rspace", "0.05em"); - return middleNode; - } -}); -// CONCATENATED MODULE: ./src/functions/enclose.js - - - - - - - - - -var enclose_htmlBuilder = function htmlBuilder(group, options) { - // \cancel, \bcancel, \xcancel, \sout, \fbox, \colorbox, \fcolorbox - // Some groups can return document fragments. Handle those by wrapping - // them in a span. - var inner = buildCommon.wrapFragment(buildHTML_buildGroup(group.body, options), options); - var label = group.label.substr(1); - var scale = options.sizeMultiplier; - var img; - var imgShift = 0; // In the LaTeX cancel package, line geometry is slightly different - // depending on whether the subject is wider than it is tall, or vice versa. - // We don't know the width of a group, so as a proxy, we test if - // the subject is a single character. This captures most of the - // subjects that should get the "tall" treatment. - - var isSingleChar = utils.isCharacterBox(group.body); - - if (label === "sout") { - img = buildCommon.makeSpan(["stretchy", "sout"]); - img.height = options.fontMetrics().defaultRuleThickness / scale; - imgShift = -0.5 * options.fontMetrics().xHeight; - } else { - // Add horizontal padding - if (/cancel/.test(label)) { - if (!isSingleChar) { - inner.classes.push("cancel-pad"); - } - } else { - inner.classes.push("boxpad"); - } // Add vertical padding - - - var vertPad = 0; - var ruleThickness = 0; // ref: cancel package: \advance\totalheight2\p@ % "+2" - - if (/box/.test(label)) { - ruleThickness = Math.max(options.fontMetrics().fboxrule, // default - options.minRuleThickness // User override. - ); - vertPad = options.fontMetrics().fboxsep + (label === "colorbox" ? 0 : ruleThickness); - } else { - vertPad = isSingleChar ? 0.2 : 0; - } - - img = stretchy.encloseSpan(inner, label, vertPad, options); - - if (/fbox|boxed|fcolorbox/.test(label)) { - img.style.borderStyle = "solid"; - img.style.borderWidth = ruleThickness + "em"; - } - - imgShift = inner.depth + vertPad; - - if (group.backgroundColor) { - img.style.backgroundColor = group.backgroundColor; - - if (group.borderColor) { - img.style.borderColor = group.borderColor; - } - } - } - - var vlist; - - if (group.backgroundColor) { - vlist = buildCommon.makeVList({ - positionType: "individualShift", - children: [// Put the color background behind inner; - { - type: "elem", - elem: img, - shift: imgShift - }, { - type: "elem", - elem: inner, - shift: 0 - }] - }, options); - } else { - vlist = buildCommon.makeVList({ - positionType: "individualShift", - children: [// Write the \cancel stroke on top of inner. - { - type: "elem", - elem: inner, - shift: 0 - }, { - type: "elem", - elem: img, - shift: imgShift, - wrapperClasses: /cancel/.test(label) ? ["svg-align"] : [] - }] - }, options); - } - - if (/cancel/.test(label)) { - // The cancel package documentation says that cancel lines add their height - // to the expression, but tests show that isn't how it actually works. - vlist.height = inner.height; - vlist.depth = inner.depth; - } - - if (/cancel/.test(label) && !isSingleChar) { - // cancel does not create horiz space for its line extension. - return buildCommon.makeSpan(["mord", "cancel-lap"], [vlist], options); - } else { - return buildCommon.makeSpan(["mord"], [vlist], options); - } -}; - -var enclose_mathmlBuilder = function mathmlBuilder(group, options) { - var fboxsep = 0; - var node = new mathMLTree.MathNode(group.label.indexOf("colorbox") > -1 ? "mpadded" : "menclose", [buildMathML_buildGroup(group.body, options)]); - - switch (group.label) { - case "\\cancel": - node.setAttribute("notation", "updiagonalstrike"); - break; - - case "\\bcancel": - node.setAttribute("notation", "downdiagonalstrike"); - break; - - case "\\sout": - node.setAttribute("notation", "horizontalstrike"); - break; - - case "\\fbox": - node.setAttribute("notation", "box"); - break; - - case "\\fcolorbox": - case "\\colorbox": - // doesn't have a good notation option. So use - // instead. Set some attributes that come included with . - fboxsep = options.fontMetrics().fboxsep * options.fontMetrics().ptPerEm; - node.setAttribute("width", "+" + 2 * fboxsep + "pt"); - node.setAttribute("height", "+" + 2 * fboxsep + "pt"); - node.setAttribute("lspace", fboxsep + "pt"); // - - node.setAttribute("voffset", fboxsep + "pt"); - - if (group.label === "\\fcolorbox") { - var thk = Math.max(options.fontMetrics().fboxrule, // default - options.minRuleThickness // user override - ); - node.setAttribute("style", "border: " + thk + "em solid " + String(group.borderColor)); - } - - break; - - case "\\xcancel": - node.setAttribute("notation", "updiagonalstrike downdiagonalstrike"); - break; - } - - if (group.backgroundColor) { - node.setAttribute("mathbackground", group.backgroundColor); - } - - return node; -}; - -defineFunction({ - type: "enclose", - names: ["\\colorbox"], - props: { - numArgs: 2, - allowedInText: true, - greediness: 3, - argTypes: ["color", "text"] - }, - handler: function handler(_ref, args, optArgs) { - var parser = _ref.parser, - funcName = _ref.funcName; - var color = assertNodeType(args[0], "color-token").color; - var body = args[1]; - return { - type: "enclose", - mode: parser.mode, - label: funcName, - backgroundColor: color, - body: body - }; - }, - htmlBuilder: enclose_htmlBuilder, - mathmlBuilder: enclose_mathmlBuilder -}); -defineFunction({ - type: "enclose", - names: ["\\fcolorbox"], - props: { - numArgs: 3, - allowedInText: true, - greediness: 3, - argTypes: ["color", "color", "text"] - }, - handler: function handler(_ref2, args, optArgs) { - var parser = _ref2.parser, - funcName = _ref2.funcName; - var borderColor = assertNodeType(args[0], "color-token").color; - var backgroundColor = assertNodeType(args[1], "color-token").color; - var body = args[2]; - return { - type: "enclose", - mode: parser.mode, - label: funcName, - backgroundColor: backgroundColor, - borderColor: borderColor, - body: body - }; - }, - htmlBuilder: enclose_htmlBuilder, - mathmlBuilder: enclose_mathmlBuilder -}); -defineFunction({ - type: "enclose", - names: ["\\fbox"], - props: { - numArgs: 1, - argTypes: ["hbox"], - allowedInText: true - }, - handler: function handler(_ref3, args) { - var parser = _ref3.parser; - return { - type: "enclose", - mode: parser.mode, - label: "\\fbox", - body: args[0] - }; - } -}); -defineFunction({ - type: "enclose", - names: ["\\cancel", "\\bcancel", "\\xcancel", "\\sout"], - props: { - numArgs: 1 - }, - handler: function handler(_ref4, args, optArgs) { - var parser = _ref4.parser, - funcName = _ref4.funcName; - var body = args[0]; - return { - type: "enclose", - mode: parser.mode, - label: funcName, - body: body - }; - }, - htmlBuilder: enclose_htmlBuilder, - mathmlBuilder: enclose_mathmlBuilder -}); -// CONCATENATED MODULE: ./src/defineEnvironment.js - - -/** - * All registered environments. - * `environments.js` exports this same dictionary again and makes it public. - * `Parser.js` requires this dictionary via `environments.js`. - */ -var _environments = {}; -function defineEnvironment(_ref) { - var type = _ref.type, - names = _ref.names, - props = _ref.props, - handler = _ref.handler, - htmlBuilder = _ref.htmlBuilder, - mathmlBuilder = _ref.mathmlBuilder; - // Set default values of environments. - var data = { - type: type, - numArgs: props.numArgs || 0, - greediness: 1, - allowedInText: false, - numOptionalArgs: 0, - handler: handler - }; - - for (var i = 0; i < names.length; ++i) { - // TODO: The value type of _environments should be a type union of all - // possible `EnvSpec<>` possibilities instead of `EnvSpec<*>`, which is - // an existential type. - // $FlowFixMe - _environments[names[i]] = data; - } - - if (htmlBuilder) { - _htmlGroupBuilders[type] = htmlBuilder; - } - - if (mathmlBuilder) { - _mathmlGroupBuilders[type] = mathmlBuilder; - } -} -// CONCATENATED MODULE: ./src/environments/array.js - - - - - - - - - - - - - -function getHLines(parser) { - // Return an array. The array length = number of hlines. - // Each element in the array tells if the line is dashed. - var hlineInfo = []; - parser.consumeSpaces(); - var nxt = parser.fetch().text; - - while (nxt === "\\hline" || nxt === "\\hdashline") { - parser.consume(); - hlineInfo.push(nxt === "\\hdashline"); - parser.consumeSpaces(); - nxt = parser.fetch().text; - } - - return hlineInfo; -} -/** - * Parse the body of the environment, with rows delimited by \\ and - * columns delimited by &, and create a nested list in row-major order - * with one group per cell. If given an optional argument style - * ("text", "display", etc.), then each cell is cast into that style. - */ - - -function parseArray(parser, _ref, style) { - var hskipBeforeAndAfter = _ref.hskipBeforeAndAfter, - addJot = _ref.addJot, - cols = _ref.cols, - arraystretch = _ref.arraystretch, - colSeparationType = _ref.colSeparationType; - // Parse body of array with \\ temporarily mapped to \cr - parser.gullet.beginGroup(); - parser.gullet.macros.set("\\\\", "\\cr"); // Get current arraystretch if it's not set by the environment - - if (!arraystretch) { - var stretch = parser.gullet.expandMacroAsText("\\arraystretch"); - - if (stretch == null) { - // Default \arraystretch from lttab.dtx - arraystretch = 1; - } else { - arraystretch = parseFloat(stretch); - - if (!arraystretch || arraystretch < 0) { - throw new src_ParseError("Invalid \\arraystretch: " + stretch); - } - } - } // Start group for first cell - - - parser.gullet.beginGroup(); - var row = []; - var body = [row]; - var rowGaps = []; - var hLinesBeforeRow = []; // Test for \hline at the top of the array. - - hLinesBeforeRow.push(getHLines(parser)); - - while (true) { - // eslint-disable-line no-constant-condition - // Parse each cell in its own group (namespace) - var cell = parser.parseExpression(false, "\\cr"); - parser.gullet.endGroup(); - parser.gullet.beginGroup(); - cell = { - type: "ordgroup", - mode: parser.mode, - body: cell - }; - - if (style) { - cell = { - type: "styling", - mode: parser.mode, - style: style, - body: [cell] - }; - } - - row.push(cell); - var next = parser.fetch().text; - - if (next === "&") { - parser.consume(); - } else if (next === "\\end") { - // Arrays terminate newlines with `\crcr` which consumes a `\cr` if - // the last line is empty. - // NOTE: Currently, `cell` is the last item added into `row`. - if (row.length === 1 && cell.type === "styling" && cell.body[0].body.length === 0) { - body.pop(); - } - - if (hLinesBeforeRow.length < body.length + 1) { - hLinesBeforeRow.push([]); - } - - break; - } else if (next === "\\cr") { - var cr = assertNodeType(parser.parseFunction(), "cr"); - rowGaps.push(cr.size); // check for \hline(s) following the row separator - - hLinesBeforeRow.push(getHLines(parser)); - row = []; - body.push(row); - } else { - throw new src_ParseError("Expected & or \\\\ or \\cr or \\end", parser.nextToken); - } - } // End cell group - - - parser.gullet.endGroup(); // End array group defining \\ - - parser.gullet.endGroup(); - return { - type: "array", - mode: parser.mode, - addJot: addJot, - arraystretch: arraystretch, - body: body, - cols: cols, - rowGaps: rowGaps, - hskipBeforeAndAfter: hskipBeforeAndAfter, - hLinesBeforeRow: hLinesBeforeRow, - colSeparationType: colSeparationType - }; -} // Decides on a style for cells in an array according to whether the given -// environment name starts with the letter 'd'. - - -function dCellStyle(envName) { - if (envName.substr(0, 1) === "d") { - return "display"; - } else { - return "text"; - } -} - -var array_htmlBuilder = function htmlBuilder(group, options) { - var r; - var c; - var nr = group.body.length; - var hLinesBeforeRow = group.hLinesBeforeRow; - var nc = 0; - var body = new Array(nr); - var hlines = []; - var ruleThickness = Math.max( // From LaTeX \showthe\arrayrulewidth. Equals 0.04 em. - options.fontMetrics().arrayRuleWidth, options.minRuleThickness // User override. - ); // Horizontal spacing - - var pt = 1 / options.fontMetrics().ptPerEm; - var arraycolsep = 5 * pt; // default value, i.e. \arraycolsep in article.cls - - if (group.colSeparationType && group.colSeparationType === "small") { - // We're in a {smallmatrix}. Default column space is \thickspace, - // i.e. 5/18em = 0.2778em, per amsmath.dtx for {smallmatrix}. - // But that needs adjustment because LaTeX applies \scriptstyle to the - // entire array, including the colspace, but this function applies - // \scriptstyle only inside each element. - var localMultiplier = options.havingStyle(src_Style.SCRIPT).sizeMultiplier; - arraycolsep = 0.2778 * (localMultiplier / options.sizeMultiplier); - } // Vertical spacing - - - var baselineskip = 12 * pt; // see size10.clo - // Default \jot from ltmath.dtx - // TODO(edemaine): allow overriding \jot via \setlength (#687) - - var jot = 3 * pt; - var arrayskip = group.arraystretch * baselineskip; - var arstrutHeight = 0.7 * arrayskip; // \strutbox in ltfsstrc.dtx and - - var arstrutDepth = 0.3 * arrayskip; // \@arstrutbox in lttab.dtx - - var totalHeight = 0; // Set a position for \hline(s) at the top of the array, if any. - - function setHLinePos(hlinesInGap) { - for (var i = 0; i < hlinesInGap.length; ++i) { - if (i > 0) { - totalHeight += 0.25; - } - - hlines.push({ - pos: totalHeight, - isDashed: hlinesInGap[i] - }); - } - } - - setHLinePos(hLinesBeforeRow[0]); - - for (r = 0; r < group.body.length; ++r) { - var inrow = group.body[r]; - var height = arstrutHeight; // \@array adds an \@arstrut - - var depth = arstrutDepth; // to each tow (via the template) - - if (nc < inrow.length) { - nc = inrow.length; - } - - var outrow = new Array(inrow.length); - - for (c = 0; c < inrow.length; ++c) { - var elt = buildHTML_buildGroup(inrow[c], options); - - if (depth < elt.depth) { - depth = elt.depth; - } - - if (height < elt.height) { - height = elt.height; - } - - outrow[c] = elt; - } - - var rowGap = group.rowGaps[r]; - var gap = 0; - - if (rowGap) { - gap = units_calculateSize(rowGap, options); - - if (gap > 0) { - // \@argarraycr - gap += arstrutDepth; - - if (depth < gap) { - depth = gap; // \@xargarraycr - } - - gap = 0; - } - } // In AMS multiline environments such as aligned and gathered, rows - // correspond to lines that have additional \jot added to the - // \baselineskip via \openup. - - - if (group.addJot) { - depth += jot; - } - - outrow.height = height; - outrow.depth = depth; - totalHeight += height; - outrow.pos = totalHeight; - totalHeight += depth + gap; // \@yargarraycr - - body[r] = outrow; // Set a position for \hline(s), if any. - - setHLinePos(hLinesBeforeRow[r + 1]); - } - - var offset = totalHeight / 2 + options.fontMetrics().axisHeight; - var colDescriptions = group.cols || []; - var cols = []; - var colSep; - var colDescrNum; - - for (c = 0, colDescrNum = 0; // Continue while either there are more columns or more column - // descriptions, so trailing separators don't get lost. - c < nc || colDescrNum < colDescriptions.length; ++c, ++colDescrNum) { - var colDescr = colDescriptions[colDescrNum] || {}; - var firstSeparator = true; - - while (colDescr.type === "separator") { - // If there is more than one separator in a row, add a space - // between them. - if (!firstSeparator) { - colSep = buildCommon.makeSpan(["arraycolsep"], []); - colSep.style.width = options.fontMetrics().doubleRuleSep + "em"; - cols.push(colSep); - } - - if (colDescr.separator === "|" || colDescr.separator === ":") { - var lineType = colDescr.separator === "|" ? "solid" : "dashed"; - var separator = buildCommon.makeSpan(["vertical-separator"], [], options); - separator.style.height = totalHeight + "em"; - separator.style.borderRightWidth = ruleThickness + "em"; - separator.style.borderRightStyle = lineType; - separator.style.margin = "0 -" + ruleThickness / 2 + "em"; - separator.style.verticalAlign = -(totalHeight - offset) + "em"; - cols.push(separator); - } else { - throw new src_ParseError("Invalid separator type: " + colDescr.separator); - } - - colDescrNum++; - colDescr = colDescriptions[colDescrNum] || {}; - firstSeparator = false; - } - - if (c >= nc) { - continue; - } - - var sepwidth = void 0; - - if (c > 0 || group.hskipBeforeAndAfter) { - sepwidth = utils.deflt(colDescr.pregap, arraycolsep); - - if (sepwidth !== 0) { - colSep = buildCommon.makeSpan(["arraycolsep"], []); - colSep.style.width = sepwidth + "em"; - cols.push(colSep); - } - } - - var col = []; - - for (r = 0; r < nr; ++r) { - var row = body[r]; - var elem = row[c]; - - if (!elem) { - continue; - } - - var shift = row.pos - offset; - elem.depth = row.depth; - elem.height = row.height; - col.push({ - type: "elem", - elem: elem, - shift: shift - }); - } - - col = buildCommon.makeVList({ - positionType: "individualShift", - children: col - }, options); - col = buildCommon.makeSpan(["col-align-" + (colDescr.align || "c")], [col]); - cols.push(col); - - if (c < nc - 1 || group.hskipBeforeAndAfter) { - sepwidth = utils.deflt(colDescr.postgap, arraycolsep); - - if (sepwidth !== 0) { - colSep = buildCommon.makeSpan(["arraycolsep"], []); - colSep.style.width = sepwidth + "em"; - cols.push(colSep); - } - } - } - - body = buildCommon.makeSpan(["mtable"], cols); // Add \hline(s), if any. - - if (hlines.length > 0) { - var line = buildCommon.makeLineSpan("hline", options, ruleThickness); - var dashes = buildCommon.makeLineSpan("hdashline", options, ruleThickness); - var vListElems = [{ - type: "elem", - elem: body, - shift: 0 - }]; - - while (hlines.length > 0) { - var hline = hlines.pop(); - var lineShift = hline.pos - offset; - - if (hline.isDashed) { - vListElems.push({ - type: "elem", - elem: dashes, - shift: lineShift - }); - } else { - vListElems.push({ - type: "elem", - elem: line, - shift: lineShift - }); - } - } - - body = buildCommon.makeVList({ - positionType: "individualShift", - children: vListElems - }, options); - } - - return buildCommon.makeSpan(["mord"], [body], options); -}; - -var alignMap = { - c: "center ", - l: "left ", - r: "right " -}; - -var array_mathmlBuilder = function mathmlBuilder(group, options) { - var table = new mathMLTree.MathNode("mtable", group.body.map(function (row) { - return new mathMLTree.MathNode("mtr", row.map(function (cell) { - return new mathMLTree.MathNode("mtd", [buildMathML_buildGroup(cell, options)]); - })); - })); // Set column alignment, row spacing, column spacing, and - // array lines by setting attributes on the table element. - // Set the row spacing. In MathML, we specify a gap distance. - // We do not use rowGap[] because MathML automatically increases - // cell height with the height/depth of the element content. - // LaTeX \arraystretch multiplies the row baseline-to-baseline distance. - // We simulate this by adding (arraystretch - 1)em to the gap. This - // does a reasonable job of adjusting arrays containing 1 em tall content. - // The 0.16 and 0.09 values are found emprically. They produce an array - // similar to LaTeX and in which content does not interfere with \hines. - - var gap = group.arraystretch === 0.5 ? 0.1 // {smallmatrix}, {subarray} - : 0.16 + group.arraystretch - 1 + (group.addJot ? 0.09 : 0); - table.setAttribute("rowspacing", gap + "em"); // MathML table lines go only between cells. - // To place a line on an edge we'll use , if necessary. - - var menclose = ""; - var align = ""; - - if (group.cols && group.cols.length > 0) { - // Find column alignment, column spacing, and vertical lines. - var cols = group.cols; - var columnLines = ""; - var prevTypeWasAlign = false; - var iStart = 0; - var iEnd = cols.length; - - if (cols[0].type === "separator") { - menclose += "top "; - iStart = 1; - } - - if (cols[cols.length - 1].type === "separator") { - menclose += "bottom "; - iEnd -= 1; - } - - for (var i = iStart; i < iEnd; i++) { - if (cols[i].type === "align") { - align += alignMap[cols[i].align]; - - if (prevTypeWasAlign) { - columnLines += "none "; - } - - prevTypeWasAlign = true; - } else if (cols[i].type === "separator") { - // MathML accepts only single lines between cells. - // So we read only the first of consecutive separators. - if (prevTypeWasAlign) { - columnLines += cols[i].separator === "|" ? "solid " : "dashed "; - prevTypeWasAlign = false; - } - } - } - - table.setAttribute("columnalign", align.trim()); - - if (/[sd]/.test(columnLines)) { - table.setAttribute("columnlines", columnLines.trim()); - } - } // Set column spacing. - - - if (group.colSeparationType === "align") { - var _cols = group.cols || []; - - var spacing = ""; - - for (var _i = 1; _i < _cols.length; _i++) { - spacing += _i % 2 ? "0em " : "1em "; - } - - table.setAttribute("columnspacing", spacing.trim()); - } else if (group.colSeparationType === "alignat") { - table.setAttribute("columnspacing", "0em"); - } else if (group.colSeparationType === "small") { - table.setAttribute("columnspacing", "0.2778em"); - } else { - table.setAttribute("columnspacing", "1em"); - } // Address \hline and \hdashline - - - var rowLines = ""; - var hlines = group.hLinesBeforeRow; - menclose += hlines[0].length > 0 ? "left " : ""; - menclose += hlines[hlines.length - 1].length > 0 ? "right " : ""; - - for (var _i2 = 1; _i2 < hlines.length - 1; _i2++) { - rowLines += hlines[_i2].length === 0 ? "none " // MathML accepts only a single line between rows. Read one element. - : hlines[_i2][0] ? "dashed " : "solid "; - } - - if (/[sd]/.test(rowLines)) { - table.setAttribute("rowlines", rowLines.trim()); - } - - if (menclose !== "") { - table = new mathMLTree.MathNode("menclose", [table]); - table.setAttribute("notation", menclose.trim()); - } - - if (group.arraystretch && group.arraystretch < 1) { - // A small array. Wrap in scriptstyle so row gap is not too large. - table = new mathMLTree.MathNode("mstyle", [table]); - table.setAttribute("scriptlevel", "1"); - } - - return table; -}; // Convenience function for aligned and alignedat environments. - - -var array_alignedHandler = function alignedHandler(context, args) { - var cols = []; - var res = parseArray(context.parser, { - cols: cols, - addJot: true - }, "display"); // Determining number of columns. - // 1. If the first argument is given, we use it as a number of columns, - // and makes sure that each row doesn't exceed that number. - // 2. Otherwise, just count number of columns = maximum number - // of cells in each row ("aligned" mode -- isAligned will be true). - // - // At the same time, prepend empty group {} at beginning of every second - // cell in each row (starting with second cell) so that operators become - // binary. This behavior is implemented in amsmath's \start@aligned. - - var numMaths; - var numCols = 0; - var emptyGroup = { - type: "ordgroup", - mode: context.mode, - body: [] - }; - - if (args[0] && args[0].type === "ordgroup") { - var arg0 = ""; - - for (var i = 0; i < args[0].body.length; i++) { - var textord = assertNodeType(args[0].body[i], "textord"); - arg0 += textord.text; - } - - numMaths = Number(arg0); - numCols = numMaths * 2; - } - - var isAligned = !numCols; - res.body.forEach(function (row) { - for (var _i3 = 1; _i3 < row.length; _i3 += 2) { - // Modify ordgroup node within styling node - var styling = assertNodeType(row[_i3], "styling"); - var ordgroup = assertNodeType(styling.body[0], "ordgroup"); - ordgroup.body.unshift(emptyGroup); - } - - if (!isAligned) { - // Case 1 - var curMaths = row.length / 2; - - if (numMaths < curMaths) { - throw new src_ParseError("Too many math in a row: " + ("expected " + numMaths + ", but got " + curMaths), row[0]); - } - } else if (numCols < row.length) { - // Case 2 - numCols = row.length; - } - }); // Adjusting alignment. - // In aligned mode, we add one \qquad between columns; - // otherwise we add nothing. - - for (var _i4 = 0; _i4 < numCols; ++_i4) { - var align = "r"; - var pregap = 0; - - if (_i4 % 2 === 1) { - align = "l"; - } else if (_i4 > 0 && isAligned) { - // "aligned" mode. - pregap = 1; // add one \quad - } - - cols[_i4] = { - type: "align", - align: align, - pregap: pregap, - postgap: 0 - }; - } - - res.colSeparationType = isAligned ? "align" : "alignat"; - return res; -}; // Arrays are part of LaTeX, defined in lttab.dtx so its documentation -// is part of the source2e.pdf file of LaTeX2e source documentation. -// {darray} is an {array} environment where cells are set in \displaystyle, -// as defined in nccmath.sty. - - -defineEnvironment({ - type: "array", - names: ["array", "darray"], - props: { - numArgs: 1 - }, - handler: function handler(context, args) { - // Since no types are specified above, the two possibilities are - // - The argument is wrapped in {} or [], in which case Parser's - // parseGroup() returns an "ordgroup" wrapping some symbol node. - // - The argument is a bare symbol node. - var symNode = checkSymbolNodeType(args[0]); - var colalign = symNode ? [args[0]] : assertNodeType(args[0], "ordgroup").body; - var cols = colalign.map(function (nde) { - var node = assertSymbolNodeType(nde); - var ca = node.text; - - if ("lcr".indexOf(ca) !== -1) { - return { - type: "align", - align: ca - }; - } else if (ca === "|") { - return { - type: "separator", - separator: "|" - }; - } else if (ca === ":") { - return { - type: "separator", - separator: ":" - }; - } - - throw new src_ParseError("Unknown column alignment: " + ca, nde); - }); - var res = { - cols: cols, - hskipBeforeAndAfter: true // \@preamble in lttab.dtx - - }; - return parseArray(context.parser, res, dCellStyle(context.envName)); - }, - htmlBuilder: array_htmlBuilder, - mathmlBuilder: array_mathmlBuilder -}); // The matrix environments of amsmath builds on the array environment -// of LaTeX, which is discussed above. - -defineEnvironment({ - type: "array", - names: ["matrix", "pmatrix", "bmatrix", "Bmatrix", "vmatrix", "Vmatrix"], - props: { - numArgs: 0 - }, - handler: function handler(context) { - var delimiters = { - "matrix": null, - "pmatrix": ["(", ")"], - "bmatrix": ["[", "]"], - "Bmatrix": ["\\{", "\\}"], - "vmatrix": ["|", "|"], - "Vmatrix": ["\\Vert", "\\Vert"] - }[context.envName]; // \hskip -\arraycolsep in amsmath - - var payload = { - hskipBeforeAndAfter: false - }; - var res = parseArray(context.parser, payload, dCellStyle(context.envName)); - return delimiters ? { - type: "leftright", - mode: context.mode, - body: [res], - left: delimiters[0], - right: delimiters[1], - rightColor: undefined // \right uninfluenced by \color in array - - } : res; - }, - htmlBuilder: array_htmlBuilder, - mathmlBuilder: array_mathmlBuilder -}); -defineEnvironment({ - type: "array", - names: ["smallmatrix"], - props: { - numArgs: 0 - }, - handler: function handler(context) { - var payload = { - arraystretch: 0.5 - }; - var res = parseArray(context.parser, payload, "script"); - res.colSeparationType = "small"; - return res; - }, - htmlBuilder: array_htmlBuilder, - mathmlBuilder: array_mathmlBuilder -}); -defineEnvironment({ - type: "array", - names: ["subarray"], - props: { - numArgs: 1 - }, - handler: function handler(context, args) { - // Parsing of {subarray} is similar to {array} - var symNode = checkSymbolNodeType(args[0]); - var colalign = symNode ? [args[0]] : assertNodeType(args[0], "ordgroup").body; - var cols = colalign.map(function (nde) { - var node = assertSymbolNodeType(nde); - var ca = node.text; // {subarray} only recognizes "l" & "c" - - if ("lc".indexOf(ca) !== -1) { - return { - type: "align", - align: ca - }; - } - - throw new src_ParseError("Unknown column alignment: " + ca, nde); - }); - - if (cols.length > 1) { - throw new src_ParseError("{subarray} can contain only one column"); - } - - var res = { - cols: cols, - hskipBeforeAndAfter: false, - arraystretch: 0.5 - }; - res = parseArray(context.parser, res, "script"); - - if (res.body.length > 0 && res.body[0].length > 1) { - throw new src_ParseError("{subarray} can contain only one column"); - } - - return res; - }, - htmlBuilder: array_htmlBuilder, - mathmlBuilder: array_mathmlBuilder -}); // A cases environment (in amsmath.sty) is almost equivalent to -// \def\arraystretch{1.2}% -// \left\{\begin{array}{@{}l@{\quad}l@{}} … \end{array}\right. -// {dcases} is a {cases} environment where cells are set in \displaystyle, -// as defined in mathtools.sty. -// {rcases} is another mathtools environment. It's brace is on the right side. - -defineEnvironment({ - type: "array", - names: ["cases", "dcases", "rcases", "drcases"], - props: { - numArgs: 0 - }, - handler: function handler(context) { - var payload = { - arraystretch: 1.2, - cols: [{ - type: "align", - align: "l", - pregap: 0, - // TODO(kevinb) get the current style. - // For now we use the metrics for TEXT style which is what we were - // doing before. Before attempting to get the current style we - // should look at TeX's behavior especially for \over and matrices. - postgap: 1.0 - /* 1em quad */ - - }, { - type: "align", - align: "l", - pregap: 0, - postgap: 0 - }] - }; - var res = parseArray(context.parser, payload, dCellStyle(context.envName)); - return { - type: "leftright", - mode: context.mode, - body: [res], - left: context.envName.indexOf("r") > -1 ? "." : "\\{", - right: context.envName.indexOf("r") > -1 ? "\\}" : ".", - rightColor: undefined - }; - }, - htmlBuilder: array_htmlBuilder, - mathmlBuilder: array_mathmlBuilder -}); // An aligned environment is like the align* environment -// except it operates within math mode. -// Note that we assume \nomallineskiplimit to be zero, -// so that \strut@ is the same as \strut. - -defineEnvironment({ - type: "array", - names: ["aligned"], - props: { - numArgs: 0 - }, - handler: array_alignedHandler, - htmlBuilder: array_htmlBuilder, - mathmlBuilder: array_mathmlBuilder -}); // A gathered environment is like an array environment with one centered -// column, but where rows are considered lines so get \jot line spacing -// and contents are set in \displaystyle. - -defineEnvironment({ - type: "array", - names: ["gathered"], - props: { - numArgs: 0 - }, - handler: function handler(context) { - var res = { - cols: [{ - type: "align", - align: "c" - }], - addJot: true - }; - return parseArray(context.parser, res, "display"); - }, - htmlBuilder: array_htmlBuilder, - mathmlBuilder: array_mathmlBuilder -}); // alignat environment is like an align environment, but one must explicitly -// specify maximum number of columns in each row, and can adjust spacing between -// each columns. - -defineEnvironment({ - type: "array", - names: ["alignedat"], - // One for numbered and for unnumbered; - // but, KaTeX doesn't supports math numbering yet, - // they make no difference for now. - props: { - numArgs: 1 - }, - handler: array_alignedHandler, - htmlBuilder: array_htmlBuilder, - mathmlBuilder: array_mathmlBuilder -}); // Catch \hline outside array environment - -defineFunction({ - type: "text", - // Doesn't matter what this is. - names: ["\\hline", "\\hdashline"], - props: { - numArgs: 0, - allowedInText: true, - allowedInMath: true - }, - handler: function handler(context, args) { - throw new src_ParseError(context.funcName + " valid only within array environment"); - } -}); -// CONCATENATED MODULE: ./src/environments.js - -var environments = _environments; -/* harmony default export */ var src_environments = (environments); // All environment definitions should be imported below - - -// CONCATENATED MODULE: ./src/functions/environment.js - - - - // Environment delimiters. HTML/MathML rendering is defined in the corresponding -// defineEnvironment definitions. -// $FlowFixMe, "environment" handler returns an environment ParseNode - -defineFunction({ - type: "environment", - names: ["\\begin", "\\end"], - props: { - numArgs: 1, - argTypes: ["text"] - }, - handler: function handler(_ref, args) { - var parser = _ref.parser, - funcName = _ref.funcName; - var nameGroup = args[0]; - - if (nameGroup.type !== "ordgroup") { - throw new src_ParseError("Invalid environment name", nameGroup); - } - - var envName = ""; - - for (var i = 0; i < nameGroup.body.length; ++i) { - envName += assertNodeType(nameGroup.body[i], "textord").text; - } - - if (funcName === "\\begin") { - // begin...end is similar to left...right - if (!src_environments.hasOwnProperty(envName)) { - throw new src_ParseError("No such environment: " + envName, nameGroup); - } // Build the environment object. Arguments and other information will - // be made available to the begin and end methods using properties. - - - var env = src_environments[envName]; - - var _parser$parseArgument = parser.parseArguments("\\begin{" + envName + "}", env), - _args = _parser$parseArgument.args, - optArgs = _parser$parseArgument.optArgs; - - var context = { - mode: parser.mode, - envName: envName, - parser: parser - }; - var result = env.handler(context, _args, optArgs); - parser.expect("\\end", false); - var endNameToken = parser.nextToken; - var end = assertNodeType(parser.parseFunction(), "environment"); - - if (end.name !== envName) { - throw new src_ParseError("Mismatch: \\begin{" + envName + "} matched by \\end{" + end.name + "}", endNameToken); - } - - return result; - } - - return { - type: "environment", - mode: parser.mode, - name: envName, - nameGroup: nameGroup - }; - } -}); -// CONCATENATED MODULE: ./src/functions/mclass.js - - - - - - -var mclass_makeSpan = buildCommon.makeSpan; - -function mclass_htmlBuilder(group, options) { - var elements = buildHTML_buildExpression(group.body, options, true); - return mclass_makeSpan([group.mclass], elements, options); -} - -function mclass_mathmlBuilder(group, options) { - var node; - var inner = buildMathML_buildExpression(group.body, options); - - if (group.mclass === "minner") { - return mathMLTree.newDocumentFragment(inner); - } else if (group.mclass === "mord") { - if (group.isCharacterBox) { - node = inner[0]; - node.type = "mi"; - } else { - node = new mathMLTree.MathNode("mi", inner); - } - } else { - if (group.isCharacterBox) { - node = inner[0]; - node.type = "mo"; - } else { - node = new mathMLTree.MathNode("mo", inner); - } // Set spacing based on what is the most likely adjacent atom type. - // See TeXbook p170. - - - if (group.mclass === "mbin") { - node.attributes.lspace = "0.22em"; // medium space - - node.attributes.rspace = "0.22em"; - } else if (group.mclass === "mpunct") { - node.attributes.lspace = "0em"; - node.attributes.rspace = "0.17em"; // thinspace - } else if (group.mclass === "mopen" || group.mclass === "mclose") { - node.attributes.lspace = "0em"; - node.attributes.rspace = "0em"; - } // MathML default space is 5/18 em, so needs no action. - // Ref: https://developer.mozilla.org/en-US/docs/Web/MathML/Element/mo - - } - - return node; -} // Math class commands except \mathop - - -defineFunction({ - type: "mclass", - names: ["\\mathord", "\\mathbin", "\\mathrel", "\\mathopen", "\\mathclose", "\\mathpunct", "\\mathinner"], - props: { - numArgs: 1 - }, - handler: function handler(_ref, args) { - var parser = _ref.parser, - funcName = _ref.funcName; - var body = args[0]; - return { - type: "mclass", - mode: parser.mode, - mclass: "m" + funcName.substr(5), - // TODO(kevinb): don't prefix with 'm' - body: ordargument(body), - isCharacterBox: utils.isCharacterBox(body) - }; - }, - htmlBuilder: mclass_htmlBuilder, - mathmlBuilder: mclass_mathmlBuilder -}); -var binrelClass = function binrelClass(arg) { - // \binrel@ spacing varies with (bin|rel|ord) of the atom in the argument. - // (by rendering separately and with {}s before and after, and measuring - // the change in spacing). We'll do roughly the same by detecting the - // atom type directly. - var atom = arg.type === "ordgroup" && arg.body.length ? arg.body[0] : arg; - - if (atom.type === "atom" && (atom.family === "bin" || atom.family === "rel")) { - return "m" + atom.family; - } else { - return "mord"; - } -}; // \@binrel{x}{y} renders like y but as mbin/mrel/mord if x is mbin/mrel/mord. -// This is equivalent to \binrel@{x}\binrel@@{y} in AMSTeX. - -defineFunction({ - type: "mclass", - names: ["\\@binrel"], - props: { - numArgs: 2 - }, - handler: function handler(_ref2, args) { - var parser = _ref2.parser; - return { - type: "mclass", - mode: parser.mode, - mclass: binrelClass(args[0]), - body: [args[1]], - isCharacterBox: utils.isCharacterBox(args[1]) - }; - } -}); // Build a relation or stacked op by placing one symbol on top of another - -defineFunction({ - type: "mclass", - names: ["\\stackrel", "\\overset", "\\underset"], - props: { - numArgs: 2 - }, - handler: function handler(_ref3, args) { - var parser = _ref3.parser, - funcName = _ref3.funcName; - var baseArg = args[1]; - var shiftedArg = args[0]; - var mclass; - - if (funcName !== "\\stackrel") { - // LaTeX applies \binrel spacing to \overset and \underset. - mclass = binrelClass(baseArg); - } else { - mclass = "mrel"; // for \stackrel - } - - var baseOp = { - type: "op", - mode: baseArg.mode, - limits: true, - alwaysHandleSupSub: true, - parentIsSupSub: false, - symbol: false, - suppressBaseShift: funcName !== "\\stackrel", - body: ordargument(baseArg) - }; - var supsub = { - type: "supsub", - mode: shiftedArg.mode, - base: baseOp, - sup: funcName === "\\underset" ? null : shiftedArg, - sub: funcName === "\\underset" ? shiftedArg : null - }; - return { - type: "mclass", - mode: parser.mode, - mclass: mclass, - body: [supsub], - isCharacterBox: utils.isCharacterBox(supsub) - }; - }, - htmlBuilder: mclass_htmlBuilder, - mathmlBuilder: mclass_mathmlBuilder -}); -// CONCATENATED MODULE: ./src/functions/font.js -// TODO(kevinb): implement \\sl and \\sc - - - - - - -var font_htmlBuilder = function htmlBuilder(group, options) { - var font = group.font; - var newOptions = options.withFont(font); - return buildHTML_buildGroup(group.body, newOptions); -}; - -var font_mathmlBuilder = function mathmlBuilder(group, options) { - var font = group.font; - var newOptions = options.withFont(font); - return buildMathML_buildGroup(group.body, newOptions); -}; - -var fontAliases = { - "\\Bbb": "\\mathbb", - "\\bold": "\\mathbf", - "\\frak": "\\mathfrak", - "\\bm": "\\boldsymbol" -}; -defineFunction({ - type: "font", - names: [// styles, except \boldsymbol defined below - "\\mathrm", "\\mathit", "\\mathbf", "\\mathnormal", // families - "\\mathbb", "\\mathcal", "\\mathfrak", "\\mathscr", "\\mathsf", "\\mathtt", // aliases, except \bm defined below - "\\Bbb", "\\bold", "\\frak"], - props: { - numArgs: 1, - greediness: 2 - }, - handler: function handler(_ref, args) { - var parser = _ref.parser, - funcName = _ref.funcName; - var body = args[0]; - var func = funcName; - - if (func in fontAliases) { - func = fontAliases[func]; - } - - return { - type: "font", - mode: parser.mode, - font: func.slice(1), - body: body - }; - }, - htmlBuilder: font_htmlBuilder, - mathmlBuilder: font_mathmlBuilder -}); -defineFunction({ - type: "mclass", - names: ["\\boldsymbol", "\\bm"], - props: { - numArgs: 1, - greediness: 2 - }, - handler: function handler(_ref2, args) { - var parser = _ref2.parser; - var body = args[0]; - var isCharacterBox = utils.isCharacterBox(body); // amsbsy.sty's \boldsymbol uses \binrel spacing to inherit the - // argument's bin|rel|ord status - - return { - type: "mclass", - mode: parser.mode, - mclass: binrelClass(body), - body: [{ - type: "font", - mode: parser.mode, - font: "boldsymbol", - body: body - }], - isCharacterBox: isCharacterBox - }; - } -}); // Old font changing functions - -defineFunction({ - type: "font", - names: ["\\rm", "\\sf", "\\tt", "\\bf", "\\it", "\\cal"], - props: { - numArgs: 0, - allowedInText: true - }, - handler: function handler(_ref3, args) { - var parser = _ref3.parser, - funcName = _ref3.funcName, - breakOnTokenText = _ref3.breakOnTokenText; - var mode = parser.mode; - var body = parser.parseExpression(true, breakOnTokenText); - var style = "math" + funcName.slice(1); - return { - type: "font", - mode: mode, - font: style, - body: { - type: "ordgroup", - mode: parser.mode, - body: body - } - }; - }, - htmlBuilder: font_htmlBuilder, - mathmlBuilder: font_mathmlBuilder -}); -// CONCATENATED MODULE: ./src/functions/genfrac.js - - - - - - - - - - - -var genfrac_adjustStyle = function adjustStyle(size, originalStyle) { - // Figure out what style this fraction should be in based on the - // function used - var style = originalStyle; - - if (size === "display") { - // Get display style as a default. - // If incoming style is sub/sup, use style.text() to get correct size. - style = style.id >= src_Style.SCRIPT.id ? style.text() : src_Style.DISPLAY; - } else if (size === "text" && style.size === src_Style.DISPLAY.size) { - // We're in a \tfrac but incoming style is displaystyle, so: - style = src_Style.TEXT; - } else if (size === "script") { - style = src_Style.SCRIPT; - } else if (size === "scriptscript") { - style = src_Style.SCRIPTSCRIPT; - } - - return style; -}; - -var genfrac_htmlBuilder = function htmlBuilder(group, options) { - // Fractions are handled in the TeXbook on pages 444-445, rules 15(a-e). - var style = genfrac_adjustStyle(group.size, options.style); - var nstyle = style.fracNum(); - var dstyle = style.fracDen(); - var newOptions; - newOptions = options.havingStyle(nstyle); - var numerm = buildHTML_buildGroup(group.numer, newOptions, options); - - if (group.continued) { - // \cfrac inserts a \strut into the numerator. - // Get \strut dimensions from TeXbook page 353. - var hStrut = 8.5 / options.fontMetrics().ptPerEm; - var dStrut = 3.5 / options.fontMetrics().ptPerEm; - numerm.height = numerm.height < hStrut ? hStrut : numerm.height; - numerm.depth = numerm.depth < dStrut ? dStrut : numerm.depth; - } - - newOptions = options.havingStyle(dstyle); - var denomm = buildHTML_buildGroup(group.denom, newOptions, options); - var rule; - var ruleWidth; - var ruleSpacing; - - if (group.hasBarLine) { - if (group.barSize) { - ruleWidth = units_calculateSize(group.barSize, options); - rule = buildCommon.makeLineSpan("frac-line", options, ruleWidth); - } else { - rule = buildCommon.makeLineSpan("frac-line", options); - } - - ruleWidth = rule.height; - ruleSpacing = rule.height; - } else { - rule = null; - ruleWidth = 0; - ruleSpacing = options.fontMetrics().defaultRuleThickness; - } // Rule 15b - - - var numShift; - var clearance; - var denomShift; - - if (style.size === src_Style.DISPLAY.size || group.size === "display") { - numShift = options.fontMetrics().num1; - - if (ruleWidth > 0) { - clearance = 3 * ruleSpacing; - } else { - clearance = 7 * ruleSpacing; - } - - denomShift = options.fontMetrics().denom1; - } else { - if (ruleWidth > 0) { - numShift = options.fontMetrics().num2; - clearance = ruleSpacing; - } else { - numShift = options.fontMetrics().num3; - clearance = 3 * ruleSpacing; - } - - denomShift = options.fontMetrics().denom2; - } - - var frac; - - if (!rule) { - // Rule 15c - var candidateClearance = numShift - numerm.depth - (denomm.height - denomShift); - - if (candidateClearance < clearance) { - numShift += 0.5 * (clearance - candidateClearance); - denomShift += 0.5 * (clearance - candidateClearance); - } - - frac = buildCommon.makeVList({ - positionType: "individualShift", - children: [{ - type: "elem", - elem: denomm, - shift: denomShift - }, { - type: "elem", - elem: numerm, - shift: -numShift - }] - }, options); - } else { - // Rule 15d - var axisHeight = options.fontMetrics().axisHeight; - - if (numShift - numerm.depth - (axisHeight + 0.5 * ruleWidth) < clearance) { - numShift += clearance - (numShift - numerm.depth - (axisHeight + 0.5 * ruleWidth)); - } - - if (axisHeight - 0.5 * ruleWidth - (denomm.height - denomShift) < clearance) { - denomShift += clearance - (axisHeight - 0.5 * ruleWidth - (denomm.height - denomShift)); - } - - var midShift = -(axisHeight - 0.5 * ruleWidth); - frac = buildCommon.makeVList({ - positionType: "individualShift", - children: [{ - type: "elem", - elem: denomm, - shift: denomShift - }, { - type: "elem", - elem: rule, - shift: midShift - }, { - type: "elem", - elem: numerm, - shift: -numShift - }] - }, options); - } // Since we manually change the style sometimes (with \dfrac or \tfrac), - // account for the possible size change here. - - - newOptions = options.havingStyle(style); - frac.height *= newOptions.sizeMultiplier / options.sizeMultiplier; - frac.depth *= newOptions.sizeMultiplier / options.sizeMultiplier; // Rule 15e - - var delimSize; - - if (style.size === src_Style.DISPLAY.size) { - delimSize = options.fontMetrics().delim1; - } else { - delimSize = options.fontMetrics().delim2; - } - - var leftDelim; - var rightDelim; - - if (group.leftDelim == null) { - leftDelim = makeNullDelimiter(options, ["mopen"]); - } else { - leftDelim = delimiter.customSizedDelim(group.leftDelim, delimSize, true, options.havingStyle(style), group.mode, ["mopen"]); - } - - if (group.continued) { - rightDelim = buildCommon.makeSpan([]); // zero width for \cfrac - } else if (group.rightDelim == null) { - rightDelim = makeNullDelimiter(options, ["mclose"]); - } else { - rightDelim = delimiter.customSizedDelim(group.rightDelim, delimSize, true, options.havingStyle(style), group.mode, ["mclose"]); - } - - return buildCommon.makeSpan(["mord"].concat(newOptions.sizingClasses(options)), [leftDelim, buildCommon.makeSpan(["mfrac"], [frac]), rightDelim], options); -}; - -var genfrac_mathmlBuilder = function mathmlBuilder(group, options) { - var node = new mathMLTree.MathNode("mfrac", [buildMathML_buildGroup(group.numer, options), buildMathML_buildGroup(group.denom, options)]); - - if (!group.hasBarLine) { - node.setAttribute("linethickness", "0px"); - } else if (group.barSize) { - var ruleWidth = units_calculateSize(group.barSize, options); - node.setAttribute("linethickness", ruleWidth + "em"); - } - - var style = genfrac_adjustStyle(group.size, options.style); - - if (style.size !== options.style.size) { - node = new mathMLTree.MathNode("mstyle", [node]); - var isDisplay = style.size === src_Style.DISPLAY.size ? "true" : "false"; - node.setAttribute("displaystyle", isDisplay); - node.setAttribute("scriptlevel", "0"); - } - - if (group.leftDelim != null || group.rightDelim != null) { - var withDelims = []; - - if (group.leftDelim != null) { - var leftOp = new mathMLTree.MathNode("mo", [new mathMLTree.TextNode(group.leftDelim.replace("\\", ""))]); - leftOp.setAttribute("fence", "true"); - withDelims.push(leftOp); - } - - withDelims.push(node); - - if (group.rightDelim != null) { - var rightOp = new mathMLTree.MathNode("mo", [new mathMLTree.TextNode(group.rightDelim.replace("\\", ""))]); - rightOp.setAttribute("fence", "true"); - withDelims.push(rightOp); - } - - return buildMathML_makeRow(withDelims); - } - - return node; -}; - -defineFunction({ - type: "genfrac", - names: ["\\cfrac", "\\dfrac", "\\frac", "\\tfrac", "\\dbinom", "\\binom", "\\tbinom", "\\\\atopfrac", // can’t be entered directly - "\\\\bracefrac", "\\\\brackfrac"], - props: { - numArgs: 2, - greediness: 2 - }, - handler: function handler(_ref, args) { - var parser = _ref.parser, - funcName = _ref.funcName; - var numer = args[0]; - var denom = args[1]; - var hasBarLine; - var leftDelim = null; - var rightDelim = null; - var size = "auto"; - - switch (funcName) { - case "\\cfrac": - case "\\dfrac": - case "\\frac": - case "\\tfrac": - hasBarLine = true; - break; - - case "\\\\atopfrac": - hasBarLine = false; - break; - - case "\\dbinom": - case "\\binom": - case "\\tbinom": - hasBarLine = false; - leftDelim = "("; - rightDelim = ")"; - break; - - case "\\\\bracefrac": - hasBarLine = false; - leftDelim = "\\{"; - rightDelim = "\\}"; - break; - - case "\\\\brackfrac": - hasBarLine = false; - leftDelim = "["; - rightDelim = "]"; - break; - - default: - throw new Error("Unrecognized genfrac command"); - } - - switch (funcName) { - case "\\cfrac": - case "\\dfrac": - case "\\dbinom": - size = "display"; - break; - - case "\\tfrac": - case "\\tbinom": - size = "text"; - break; - } - - return { - type: "genfrac", - mode: parser.mode, - continued: funcName === "\\cfrac", - numer: numer, - denom: denom, - hasBarLine: hasBarLine, - leftDelim: leftDelim, - rightDelim: rightDelim, - size: size, - barSize: null - }; - }, - htmlBuilder: genfrac_htmlBuilder, - mathmlBuilder: genfrac_mathmlBuilder -}); // Infix generalized fractions -- these are not rendered directly, but replaced -// immediately by one of the variants above. - -defineFunction({ - type: "infix", - names: ["\\over", "\\choose", "\\atop", "\\brace", "\\brack"], - props: { - numArgs: 0, - infix: true - }, - handler: function handler(_ref2) { - var parser = _ref2.parser, - funcName = _ref2.funcName, - token = _ref2.token; - var replaceWith; - - switch (funcName) { - case "\\over": - replaceWith = "\\frac"; - break; - - case "\\choose": - replaceWith = "\\binom"; - break; - - case "\\atop": - replaceWith = "\\\\atopfrac"; - break; - - case "\\brace": - replaceWith = "\\\\bracefrac"; - break; - - case "\\brack": - replaceWith = "\\\\brackfrac"; - break; - - default: - throw new Error("Unrecognized infix genfrac command"); - } - - return { - type: "infix", - mode: parser.mode, - replaceWith: replaceWith, - token: token - }; - } -}); -var stylArray = ["display", "text", "script", "scriptscript"]; - -var delimFromValue = function delimFromValue(delimString) { - var delim = null; - - if (delimString.length > 0) { - delim = delimString; - delim = delim === "." ? null : delim; - } - - return delim; -}; - -defineFunction({ - type: "genfrac", - names: ["\\genfrac"], - props: { - numArgs: 6, - greediness: 6, - argTypes: ["math", "math", "size", "text", "math", "math"] - }, - handler: function handler(_ref3, args) { - var parser = _ref3.parser; - var numer = args[4]; - var denom = args[5]; // Look into the parse nodes to get the desired delimiters. - - var leftDelim = args[0].type === "atom" && args[0].family === "open" ? delimFromValue(args[0].text) : null; - var rightDelim = args[1].type === "atom" && args[1].family === "close" ? delimFromValue(args[1].text) : null; - var barNode = assertNodeType(args[2], "size"); - var hasBarLine; - var barSize = null; - - if (barNode.isBlank) { - // \genfrac acts differently than \above. - // \genfrac treats an empty size group as a signal to use a - // standard bar size. \above would see size = 0 and omit the bar. - hasBarLine = true; - } else { - barSize = barNode.value; - hasBarLine = barSize.number > 0; - } // Find out if we want displaystyle, textstyle, etc. - - - var size = "auto"; - var styl = args[3]; - - if (styl.type === "ordgroup") { - if (styl.body.length > 0) { - var textOrd = assertNodeType(styl.body[0], "textord"); - size = stylArray[Number(textOrd.text)]; - } - } else { - styl = assertNodeType(styl, "textord"); - size = stylArray[Number(styl.text)]; - } - - return { - type: "genfrac", - mode: parser.mode, - numer: numer, - denom: denom, - continued: false, - hasBarLine: hasBarLine, - barSize: barSize, - leftDelim: leftDelim, - rightDelim: rightDelim, - size: size - }; - }, - htmlBuilder: genfrac_htmlBuilder, - mathmlBuilder: genfrac_mathmlBuilder -}); // \above is an infix fraction that also defines a fraction bar size. - -defineFunction({ - type: "infix", - names: ["\\above"], - props: { - numArgs: 1, - argTypes: ["size"], - infix: true - }, - handler: function handler(_ref4, args) { - var parser = _ref4.parser, - funcName = _ref4.funcName, - token = _ref4.token; - return { - type: "infix", - mode: parser.mode, - replaceWith: "\\\\abovefrac", - size: assertNodeType(args[0], "size").value, - token: token - }; - } -}); -defineFunction({ - type: "genfrac", - names: ["\\\\abovefrac"], - props: { - numArgs: 3, - argTypes: ["math", "size", "math"] - }, - handler: function handler(_ref5, args) { - var parser = _ref5.parser, - funcName = _ref5.funcName; - var numer = args[0]; - var barSize = assert(assertNodeType(args[1], "infix").size); - var denom = args[2]; - var hasBarLine = barSize.number > 0; - return { - type: "genfrac", - mode: parser.mode, - numer: numer, - denom: denom, - continued: false, - hasBarLine: hasBarLine, - barSize: barSize, - leftDelim: null, - rightDelim: null, - size: "auto" - }; - }, - htmlBuilder: genfrac_htmlBuilder, - mathmlBuilder: genfrac_mathmlBuilder -}); -// CONCATENATED MODULE: ./src/functions/horizBrace.js - - - - - - - - -// NOTE: Unlike most `htmlBuilder`s, this one handles not only "horizBrace", but -var horizBrace_htmlBuilder = function htmlBuilder(grp, options) { - var style = options.style; // Pull out the `ParseNode<"horizBrace">` if `grp` is a "supsub" node. - - var supSubGroup; - var group; - - if (grp.type === "supsub") { - // Ref: LaTeX source2e: }}}}\limits} - // i.e. LaTeX treats the brace similar to an op and passes it - // with \limits, so we need to assign supsub style. - supSubGroup = grp.sup ? buildHTML_buildGroup(grp.sup, options.havingStyle(style.sup()), options) : buildHTML_buildGroup(grp.sub, options.havingStyle(style.sub()), options); - group = assertNodeType(grp.base, "horizBrace"); - } else { - group = assertNodeType(grp, "horizBrace"); - } // Build the base group - - - var body = buildHTML_buildGroup(group.base, options.havingBaseStyle(src_Style.DISPLAY)); // Create the stretchy element - - var braceBody = stretchy.svgSpan(group, options); // Generate the vlist, with the appropriate kerns ┏━━━━━━━━┓ - // This first vlist contains the content and the brace: equation - - var vlist; - - if (group.isOver) { - vlist = buildCommon.makeVList({ - positionType: "firstBaseline", - children: [{ - type: "elem", - elem: body - }, { - type: "kern", - size: 0.1 - }, { - type: "elem", - elem: braceBody - }] - }, options); // $FlowFixMe: Replace this with passing "svg-align" into makeVList. - - vlist.children[0].children[0].children[1].classes.push("svg-align"); - } else { - vlist = buildCommon.makeVList({ - positionType: "bottom", - positionData: body.depth + 0.1 + braceBody.height, - children: [{ - type: "elem", - elem: braceBody - }, { - type: "kern", - size: 0.1 - }, { - type: "elem", - elem: body - }] - }, options); // $FlowFixMe: Replace this with passing "svg-align" into makeVList. - - vlist.children[0].children[0].children[0].classes.push("svg-align"); - } - - if (supSubGroup) { - // To write the supsub, wrap the first vlist in another vlist: - // They can't all go in the same vlist, because the note might be - // wider than the equation. We want the equation to control the - // brace width. - // note long note long note - // ┏━━━━━━━━┓ or ┏━━━┓ not ┏━━━━━━━━━┓ - // equation eqn eqn - var vSpan = buildCommon.makeSpan(["mord", group.isOver ? "mover" : "munder"], [vlist], options); - - if (group.isOver) { - vlist = buildCommon.makeVList({ - positionType: "firstBaseline", - children: [{ - type: "elem", - elem: vSpan - }, { - type: "kern", - size: 0.2 - }, { - type: "elem", - elem: supSubGroup - }] - }, options); - } else { - vlist = buildCommon.makeVList({ - positionType: "bottom", - positionData: vSpan.depth + 0.2 + supSubGroup.height + supSubGroup.depth, - children: [{ - type: "elem", - elem: supSubGroup - }, { - type: "kern", - size: 0.2 - }, { - type: "elem", - elem: vSpan - }] - }, options); - } - } - - return buildCommon.makeSpan(["mord", group.isOver ? "mover" : "munder"], [vlist], options); -}; - -var horizBrace_mathmlBuilder = function mathmlBuilder(group, options) { - var accentNode = stretchy.mathMLnode(group.label); - return new mathMLTree.MathNode(group.isOver ? "mover" : "munder", [buildMathML_buildGroup(group.base, options), accentNode]); -}; // Horizontal stretchy braces - - -defineFunction({ - type: "horizBrace", - names: ["\\overbrace", "\\underbrace"], - props: { - numArgs: 1 - }, - handler: function handler(_ref, args) { - var parser = _ref.parser, - funcName = _ref.funcName; - return { - type: "horizBrace", - mode: parser.mode, - label: funcName, - isOver: /^\\over/.test(funcName), - base: args[0] - }; - }, - htmlBuilder: horizBrace_htmlBuilder, - mathmlBuilder: horizBrace_mathmlBuilder -}); -// CONCATENATED MODULE: ./src/functions/href.js - - - - - - -defineFunction({ - type: "href", - names: ["\\href"], - props: { - numArgs: 2, - argTypes: ["url", "original"], - allowedInText: true - }, - handler: function handler(_ref, args) { - var parser = _ref.parser; - var body = args[1]; - var href = assertNodeType(args[0], "url").url; - - if (!parser.settings.isTrusted({ - command: "\\href", - url: href - })) { - return parser.formatUnsupportedCmd("\\href"); - } - - return { - type: "href", - mode: parser.mode, - href: href, - body: ordargument(body) - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - var elements = buildHTML_buildExpression(group.body, options, false); - return buildCommon.makeAnchor(group.href, [], elements, options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var math = buildExpressionRow(group.body, options); - - if (!(math instanceof mathMLTree_MathNode)) { - math = new mathMLTree_MathNode("mrow", [math]); - } - - math.setAttribute("href", group.href); - return math; - } -}); -defineFunction({ - type: "href", - names: ["\\url"], - props: { - numArgs: 1, - argTypes: ["url"], - allowedInText: true - }, - handler: function handler(_ref2, args) { - var parser = _ref2.parser; - var href = assertNodeType(args[0], "url").url; - - if (!parser.settings.isTrusted({ - command: "\\url", - url: href - })) { - return parser.formatUnsupportedCmd("\\url"); - } - - var chars = []; - - for (var i = 0; i < href.length; i++) { - var c = href[i]; - - if (c === "~") { - c = "\\textasciitilde"; - } - - chars.push({ - type: "textord", - mode: "text", - text: c - }); - } - - var body = { - type: "text", - mode: parser.mode, - font: "\\texttt", - body: chars - }; - return { - type: "href", - mode: parser.mode, - href: href, - body: ordargument(body) - }; - } -}); -// CONCATENATED MODULE: ./src/functions/html.js - - - - - - -defineFunction({ - type: "html", - names: ["\\htmlClass", "\\htmlId", "\\htmlStyle", "\\htmlData"], - props: { - numArgs: 2, - argTypes: ["raw", "original"], - allowedInText: true - }, - handler: function handler(_ref, args) { - var parser = _ref.parser, - funcName = _ref.funcName, - token = _ref.token; - var value = assertNodeType(args[0], "raw").string; - var body = args[1]; - - if (parser.settings.strict) { - parser.settings.reportNonstrict("htmlExtension", "HTML extension is disabled on strict mode"); - } - - var trustContext; - var attributes = {}; - - switch (funcName) { - case "\\htmlClass": - attributes.class = value; - trustContext = { - command: "\\htmlClass", - class: value - }; - break; - - case "\\htmlId": - attributes.id = value; - trustContext = { - command: "\\htmlId", - id: value - }; - break; - - case "\\htmlStyle": - attributes.style = value; - trustContext = { - command: "\\htmlStyle", - style: value - }; - break; - - case "\\htmlData": - { - var data = value.split(","); - - for (var i = 0; i < data.length; i++) { - var keyVal = data[i].split("="); - - if (keyVal.length !== 2) { - throw new src_ParseError("Error parsing key-value for \\htmlData"); - } - - attributes["data-" + keyVal[0].trim()] = keyVal[1].trim(); - } - - trustContext = { - command: "\\htmlData", - attributes: attributes - }; - break; - } - - default: - throw new Error("Unrecognized html command"); - } - - if (!parser.settings.isTrusted(trustContext)) { - return parser.formatUnsupportedCmd(funcName); - } - - return { - type: "html", - mode: parser.mode, - attributes: attributes, - body: ordargument(body) - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - var elements = buildHTML_buildExpression(group.body, options, false); - var classes = ["enclosing"]; - - if (group.attributes.class) { - classes.push.apply(classes, group.attributes.class.trim().split(/\s+/)); - } - - var span = buildCommon.makeSpan(classes, elements, options); - - for (var attr in group.attributes) { - if (attr !== "class" && group.attributes.hasOwnProperty(attr)) { - span.setAttribute(attr, group.attributes[attr]); - } - } - - return span; - }, - mathmlBuilder: function mathmlBuilder(group, options) { - return buildExpressionRow(group.body, options); - } -}); -// CONCATENATED MODULE: ./src/functions/htmlmathml.js - - - - -defineFunction({ - type: "htmlmathml", - names: ["\\html@mathml"], - props: { - numArgs: 2, - allowedInText: true - }, - handler: function handler(_ref, args) { - var parser = _ref.parser; - return { - type: "htmlmathml", - mode: parser.mode, - html: ordargument(args[0]), - mathml: ordargument(args[1]) - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - var elements = buildHTML_buildExpression(group.html, options, false); - return buildCommon.makeFragment(elements); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - return buildExpressionRow(group.mathml, options); - } -}); -// CONCATENATED MODULE: ./src/functions/includegraphics.js - - - - - - - -var includegraphics_sizeData = function sizeData(str) { - if (/^[-+]? *(\d+(\.\d*)?|\.\d+)$/.test(str)) { - // str is a number with no unit specified. - // default unit is bp, per graphix package. - return { - number: +str, - unit: "bp" - }; - } else { - var match = /([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(str); - - if (!match) { - throw new src_ParseError("Invalid size: '" + str + "' in \\includegraphics"); - } - - var data = { - number: +(match[1] + match[2]), - // sign + magnitude, cast to number - unit: match[3] - }; - - if (!validUnit(data)) { - throw new src_ParseError("Invalid unit: '" + data.unit + "' in \\includegraphics."); - } - - return data; - } -}; - -defineFunction({ - type: "includegraphics", - names: ["\\includegraphics"], - props: { - numArgs: 1, - numOptionalArgs: 1, - argTypes: ["raw", "url"], - allowedInText: false - }, - handler: function handler(_ref, args, optArgs) { - var parser = _ref.parser; - var width = { - number: 0, - unit: "em" - }; - var height = { - number: 0.9, - unit: "em" - }; // sorta character sized. - - var totalheight = { - number: 0, - unit: "em" - }; - var alt = ""; - - if (optArgs[0]) { - var attributeStr = assertNodeType(optArgs[0], "raw").string; // Parser.js does not parse key/value pairs. We get a string. - - var attributes = attributeStr.split(","); - - for (var i = 0; i < attributes.length; i++) { - var keyVal = attributes[i].split("="); - - if (keyVal.length === 2) { - var str = keyVal[1].trim(); - - switch (keyVal[0].trim()) { - case "alt": - alt = str; - break; - - case "width": - width = includegraphics_sizeData(str); - break; - - case "height": - height = includegraphics_sizeData(str); - break; - - case "totalheight": - totalheight = includegraphics_sizeData(str); - break; - - default: - throw new src_ParseError("Invalid key: '" + keyVal[0] + "' in \\includegraphics."); - } - } - } - } - - var src = assertNodeType(args[0], "url").url; - - if (alt === "") { - // No alt given. Use the file name. Strip away the path. - alt = src; - alt = alt.replace(/^.*[\\/]/, ''); - alt = alt.substring(0, alt.lastIndexOf('.')); - } - - if (!parser.settings.isTrusted({ - command: "\\includegraphics", - url: src - })) { - return parser.formatUnsupportedCmd("\\includegraphics"); - } - - return { - type: "includegraphics", - mode: parser.mode, - alt: alt, - width: width, - height: height, - totalheight: totalheight, - src: src - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - var height = units_calculateSize(group.height, options); - var depth = 0; - - if (group.totalheight.number > 0) { - depth = units_calculateSize(group.totalheight, options) - height; - depth = Number(depth.toFixed(2)); - } - - var width = 0; - - if (group.width.number > 0) { - width = units_calculateSize(group.width, options); - } - - var style = { - height: height + depth + "em" - }; - - if (width > 0) { - style.width = width + "em"; - } - - if (depth > 0) { - style.verticalAlign = -depth + "em"; - } - - var node = new domTree_Img(group.src, group.alt, style); - node.height = height; - node.depth = depth; - return node; - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var node = new mathMLTree.MathNode("mglyph", []); - node.setAttribute("alt", group.alt); - var height = units_calculateSize(group.height, options); - var depth = 0; - - if (group.totalheight.number > 0) { - depth = units_calculateSize(group.totalheight, options) - height; - depth = depth.toFixed(2); - node.setAttribute("valign", "-" + depth + "em"); - } - - node.setAttribute("height", height + depth + "em"); - - if (group.width.number > 0) { - var width = units_calculateSize(group.width, options); - node.setAttribute("width", width + "em"); - } - - node.setAttribute("src", group.src); - return node; - } -}); -// CONCATENATED MODULE: ./src/functions/kern.js -// Horizontal spacing commands - - - - - // TODO: \hskip and \mskip should support plus and minus in lengths - -defineFunction({ - type: "kern", - names: ["\\kern", "\\mkern", "\\hskip", "\\mskip"], - props: { - numArgs: 1, - argTypes: ["size"], - allowedInText: true - }, - handler: function handler(_ref, args) { - var parser = _ref.parser, - funcName = _ref.funcName; - var size = assertNodeType(args[0], "size"); - - if (parser.settings.strict) { - var mathFunction = funcName[1] === 'm'; // \mkern, \mskip - - var muUnit = size.value.unit === 'mu'; - - if (mathFunction) { - if (!muUnit) { - parser.settings.reportNonstrict("mathVsTextUnits", "LaTeX's " + funcName + " supports only mu units, " + ("not " + size.value.unit + " units")); - } - - if (parser.mode !== "math") { - parser.settings.reportNonstrict("mathVsTextUnits", "LaTeX's " + funcName + " works only in math mode"); - } - } else { - // !mathFunction - if (muUnit) { - parser.settings.reportNonstrict("mathVsTextUnits", "LaTeX's " + funcName + " doesn't support mu units"); - } - } - } - - return { - type: "kern", - mode: parser.mode, - dimension: size.value - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - return buildCommon.makeGlue(group.dimension, options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var dimension = units_calculateSize(group.dimension, options); - return new mathMLTree.SpaceNode(dimension); - } -}); -// CONCATENATED MODULE: ./src/functions/lap.js -// Horizontal overlap functions - - - - - -defineFunction({ - type: "lap", - names: ["\\mathllap", "\\mathrlap", "\\mathclap"], - props: { - numArgs: 1, - allowedInText: true - }, - handler: function handler(_ref, args) { - var parser = _ref.parser, - funcName = _ref.funcName; - var body = args[0]; - return { - type: "lap", - mode: parser.mode, - alignment: funcName.slice(5), - body: body - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - // mathllap, mathrlap, mathclap - var inner; - - if (group.alignment === "clap") { - // ref: https://www.math.lsu.edu/~aperlis/publications/mathclap/ - inner = buildCommon.makeSpan([], [buildHTML_buildGroup(group.body, options)]); // wrap, since CSS will center a .clap > .inner > span - - inner = buildCommon.makeSpan(["inner"], [inner], options); - } else { - inner = buildCommon.makeSpan(["inner"], [buildHTML_buildGroup(group.body, options)]); - } - - var fix = buildCommon.makeSpan(["fix"], []); - var node = buildCommon.makeSpan([group.alignment], [inner, fix], options); // At this point, we have correctly set horizontal alignment of the - // two items involved in the lap. - // Next, use a strut to set the height of the HTML bounding box. - // Otherwise, a tall argument may be misplaced. - // This code resolved issue #1153 - - var strut = buildCommon.makeSpan(["strut"]); - strut.style.height = node.height + node.depth + "em"; - strut.style.verticalAlign = -node.depth + "em"; - node.children.unshift(strut); // Next, prevent vertical misplacement when next to something tall. - // This code resolves issue #1234 - - node = buildCommon.makeSpan(["thinbox"], [node], options); - return buildCommon.makeSpan(["mord", "vbox"], [node], options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - // mathllap, mathrlap, mathclap - var node = new mathMLTree.MathNode("mpadded", [buildMathML_buildGroup(group.body, options)]); - - if (group.alignment !== "rlap") { - var offset = group.alignment === "llap" ? "-1" : "-0.5"; - node.setAttribute("lspace", offset + "width"); - } - - node.setAttribute("width", "0px"); - return node; - } -}); -// CONCATENATED MODULE: ./src/functions/math.js - - // Switching from text mode back to math mode - -defineFunction({ - type: "styling", - names: ["\\(", "$"], - props: { - numArgs: 0, - allowedInText: true, - allowedInMath: false - }, - handler: function handler(_ref, args) { - var funcName = _ref.funcName, - parser = _ref.parser; - var outerMode = parser.mode; - parser.switchMode("math"); - var close = funcName === "\\(" ? "\\)" : "$"; - var body = parser.parseExpression(false, close); - parser.expect(close); - parser.switchMode(outerMode); - return { - type: "styling", - mode: parser.mode, - style: "text", - body: body - }; - } -}); // Check for extra closing math delimiters - -defineFunction({ - type: "text", - // Doesn't matter what this is. - names: ["\\)", "\\]"], - props: { - numArgs: 0, - allowedInText: true, - allowedInMath: false - }, - handler: function handler(context, args) { - throw new src_ParseError("Mismatched " + context.funcName); - } -}); -// CONCATENATED MODULE: ./src/functions/mathchoice.js - - - - - - -var mathchoice_chooseMathStyle = function chooseMathStyle(group, options) { - switch (options.style.size) { - case src_Style.DISPLAY.size: - return group.display; - - case src_Style.TEXT.size: - return group.text; - - case src_Style.SCRIPT.size: - return group.script; - - case src_Style.SCRIPTSCRIPT.size: - return group.scriptscript; - - default: - return group.text; - } -}; - -defineFunction({ - type: "mathchoice", - names: ["\\mathchoice"], - props: { - numArgs: 4 - }, - handler: function handler(_ref, args) { - var parser = _ref.parser; - return { - type: "mathchoice", - mode: parser.mode, - display: ordargument(args[0]), - text: ordargument(args[1]), - script: ordargument(args[2]), - scriptscript: ordargument(args[3]) - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - var body = mathchoice_chooseMathStyle(group, options); - var elements = buildHTML_buildExpression(body, options, false); - return buildCommon.makeFragment(elements); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var body = mathchoice_chooseMathStyle(group, options); - return buildExpressionRow(body, options); - } -}); -// CONCATENATED MODULE: ./src/functions/utils/assembleSupSub.js - - -// For an operator with limits, assemble the base, sup, and sub into a span. -var assembleSupSub_assembleSupSub = function assembleSupSub(base, supGroup, subGroup, options, style, slant, baseShift) { - base = buildCommon.makeSpan([], [base]); - var sub; - var sup; // We manually have to handle the superscripts and subscripts. This, - // aside from the kern calculations, is copied from supsub. - - if (supGroup) { - var elem = buildHTML_buildGroup(supGroup, options.havingStyle(style.sup()), options); - sup = { - elem: elem, - kern: Math.max(options.fontMetrics().bigOpSpacing1, options.fontMetrics().bigOpSpacing3 - elem.depth) - }; - } - - if (subGroup) { - var _elem = buildHTML_buildGroup(subGroup, options.havingStyle(style.sub()), options); - - sub = { - elem: _elem, - kern: Math.max(options.fontMetrics().bigOpSpacing2, options.fontMetrics().bigOpSpacing4 - _elem.height) - }; - } // Build the final group as a vlist of the possible subscript, base, - // and possible superscript. - - - var finalGroup; - - if (sup && sub) { - var bottom = options.fontMetrics().bigOpSpacing5 + sub.elem.height + sub.elem.depth + sub.kern + base.depth + baseShift; - finalGroup = buildCommon.makeVList({ - positionType: "bottom", - positionData: bottom, - children: [{ - type: "kern", - size: options.fontMetrics().bigOpSpacing5 - }, { - type: "elem", - elem: sub.elem, - marginLeft: -slant + "em" - }, { - type: "kern", - size: sub.kern - }, { - type: "elem", - elem: base - }, { - type: "kern", - size: sup.kern - }, { - type: "elem", - elem: sup.elem, - marginLeft: slant + "em" - }, { - type: "kern", - size: options.fontMetrics().bigOpSpacing5 - }] - }, options); - } else if (sub) { - var top = base.height - baseShift; // Shift the limits by the slant of the symbol. Note - // that we are supposed to shift the limits by 1/2 of the slant, - // but since we are centering the limits adding a full slant of - // margin will shift by 1/2 that. - - finalGroup = buildCommon.makeVList({ - positionType: "top", - positionData: top, - children: [{ - type: "kern", - size: options.fontMetrics().bigOpSpacing5 - }, { - type: "elem", - elem: sub.elem, - marginLeft: -slant + "em" - }, { - type: "kern", - size: sub.kern - }, { - type: "elem", - elem: base - }] - }, options); - } else if (sup) { - var _bottom = base.depth + baseShift; - - finalGroup = buildCommon.makeVList({ - positionType: "bottom", - positionData: _bottom, - children: [{ - type: "elem", - elem: base - }, { - type: "kern", - size: sup.kern - }, { - type: "elem", - elem: sup.elem, - marginLeft: slant + "em" - }, { - type: "kern", - size: options.fontMetrics().bigOpSpacing5 - }] - }, options); - } else { - // This case probably shouldn't occur (this would mean the - // supsub was sending us a group with no superscript or - // subscript) but be safe. - return base; - } - - return buildCommon.makeSpan(["mop", "op-limits"], [finalGroup], options); -}; -// CONCATENATED MODULE: ./src/functions/op.js -// Limits, symbols - - - - - - - - - - -// Most operators have a large successor symbol, but these don't. -var noSuccessor = ["\\smallint"]; // NOTE: Unlike most `htmlBuilder`s, this one handles not only "op", but also -// "supsub" since some of them (like \int) can affect super/subscripting. - -var op_htmlBuilder = function htmlBuilder(grp, options) { - // Operators are handled in the TeXbook pg. 443-444, rule 13(a). - var supGroup; - var subGroup; - var hasLimits = false; - var group; - - if (grp.type === "supsub") { - // If we have limits, supsub will pass us its group to handle. Pull - // out the superscript and subscript and set the group to the op in - // its base. - supGroup = grp.sup; - subGroup = grp.sub; - group = assertNodeType(grp.base, "op"); - hasLimits = true; - } else { - group = assertNodeType(grp, "op"); - } - - var style = options.style; - var large = false; - - if (style.size === src_Style.DISPLAY.size && group.symbol && !utils.contains(noSuccessor, group.name)) { - // Most symbol operators get larger in displaystyle (rule 13) - large = true; - } - - var base; - - if (group.symbol) { - // If this is a symbol, create the symbol. - var fontName = large ? "Size2-Regular" : "Size1-Regular"; - var stash = ""; - - if (group.name === "\\oiint" || group.name === "\\oiiint") { - // No font glyphs yet, so use a glyph w/o the oval. - // TODO: When font glyphs are available, delete this code. - stash = group.name.substr(1); // $FlowFixMe - - group.name = stash === "oiint" ? "\\iint" : "\\iiint"; - } - - base = buildCommon.makeSymbol(group.name, fontName, "math", options, ["mop", "op-symbol", large ? "large-op" : "small-op"]); - - if (stash.length > 0) { - // We're in \oiint or \oiiint. Overlay the oval. - // TODO: When font glyphs are available, delete this code. - var italic = base.italic; - var oval = buildCommon.staticSvg(stash + "Size" + (large ? "2" : "1"), options); - base = buildCommon.makeVList({ - positionType: "individualShift", - children: [{ - type: "elem", - elem: base, - shift: 0 - }, { - type: "elem", - elem: oval, - shift: large ? 0.08 : 0 - }] - }, options); // $FlowFixMe - - group.name = "\\" + stash; - base.classes.unshift("mop"); // $FlowFixMe - - base.italic = italic; - } - } else if (group.body) { - // If this is a list, compose that list. - var inner = buildHTML_buildExpression(group.body, options, true); - - if (inner.length === 1 && inner[0] instanceof domTree_SymbolNode) { - base = inner[0]; - base.classes[0] = "mop"; // replace old mclass - } else { - base = buildCommon.makeSpan(["mop"], buildCommon.tryCombineChars(inner), options); - } - } else { - // Otherwise, this is a text operator. Build the text from the - // operator's name. - // TODO(emily): Add a space in the middle of some of these - // operators, like \limsup - var output = []; - - for (var i = 1; i < group.name.length; i++) { - output.push(buildCommon.mathsym(group.name[i], group.mode, options)); - } - - base = buildCommon.makeSpan(["mop"], output, options); - } // If content of op is a single symbol, shift it vertically. - - - var baseShift = 0; - var slant = 0; - - if ((base instanceof domTree_SymbolNode || group.name === "\\oiint" || group.name === "\\oiiint") && !group.suppressBaseShift) { - // We suppress the shift of the base of \overset and \underset. Otherwise, - // shift the symbol so its center lies on the axis (rule 13). It - // appears that our fonts have the centers of the symbols already - // almost on the axis, so these numbers are very small. Note we - // don't actually apply this here, but instead it is used either in - // the vlist creation or separately when there are no limits. - baseShift = (base.height - base.depth) / 2 - options.fontMetrics().axisHeight; // The slant of the symbol is just its italic correction. - // $FlowFixMe - - slant = base.italic; - } - - if (hasLimits) { - return assembleSupSub_assembleSupSub(base, supGroup, subGroup, options, style, slant, baseShift); - } else { - if (baseShift) { - base.style.position = "relative"; - base.style.top = baseShift + "em"; - } - - return base; - } -}; - -var op_mathmlBuilder = function mathmlBuilder(group, options) { - var node; - - if (group.symbol) { - // This is a symbol. Just add the symbol. - node = new mathMLTree_MathNode("mo", [buildMathML_makeText(group.name, group.mode)]); - - if (utils.contains(noSuccessor, group.name)) { - node.setAttribute("largeop", "false"); - } - } else if (group.body) { - // This is an operator with children. Add them. - node = new mathMLTree_MathNode("mo", buildMathML_buildExpression(group.body, options)); - } else { - // This is a text operator. Add all of the characters from the - // operator's name. - node = new mathMLTree_MathNode("mi", [new mathMLTree_TextNode(group.name.slice(1))]); // Append an . - // ref: https://www.w3.org/TR/REC-MathML/chap3_2.html#sec3.2.4 - - var operator = new mathMLTree_MathNode("mo", [buildMathML_makeText("\u2061", "text")]); - - if (group.parentIsSupSub) { - node = new mathMLTree_MathNode("mo", [node, operator]); - } else { - node = newDocumentFragment([node, operator]); - } - } - - return node; -}; - -var singleCharBigOps = { - "\u220F": "\\prod", - "\u2210": "\\coprod", - "\u2211": "\\sum", - "\u22C0": "\\bigwedge", - "\u22C1": "\\bigvee", - "\u22C2": "\\bigcap", - "\u22C3": "\\bigcup", - "\u2A00": "\\bigodot", - "\u2A01": "\\bigoplus", - "\u2A02": "\\bigotimes", - "\u2A04": "\\biguplus", - "\u2A06": "\\bigsqcup" -}; -defineFunction({ - type: "op", - names: ["\\coprod", "\\bigvee", "\\bigwedge", "\\biguplus", "\\bigcap", "\\bigcup", "\\intop", "\\prod", "\\sum", "\\bigotimes", "\\bigoplus", "\\bigodot", "\\bigsqcup", "\\smallint", "\u220F", "\u2210", "\u2211", "\u22C0", "\u22C1", "\u22C2", "\u22C3", "\u2A00", "\u2A01", "\u2A02", "\u2A04", "\u2A06"], - props: { - numArgs: 0 - }, - handler: function handler(_ref, args) { - var parser = _ref.parser, - funcName = _ref.funcName; - var fName = funcName; - - if (fName.length === 1) { - fName = singleCharBigOps[fName]; - } - - return { - type: "op", - mode: parser.mode, - limits: true, - parentIsSupSub: false, - symbol: true, - name: fName - }; - }, - htmlBuilder: op_htmlBuilder, - mathmlBuilder: op_mathmlBuilder -}); // Note: calling defineFunction with a type that's already been defined only -// works because the same htmlBuilder and mathmlBuilder are being used. - -defineFunction({ - type: "op", - names: ["\\mathop"], - props: { - numArgs: 1 - }, - handler: function handler(_ref2, args) { - var parser = _ref2.parser; - var body = args[0]; - return { - type: "op", - mode: parser.mode, - limits: false, - parentIsSupSub: false, - symbol: false, - body: ordargument(body) - }; - }, - htmlBuilder: op_htmlBuilder, - mathmlBuilder: op_mathmlBuilder -}); // There are 2 flags for operators; whether they produce limits in -// displaystyle, and whether they are symbols and should grow in -// displaystyle. These four groups cover the four possible choices. - -var singleCharIntegrals = { - "\u222B": "\\int", - "\u222C": "\\iint", - "\u222D": "\\iiint", - "\u222E": "\\oint", - "\u222F": "\\oiint", - "\u2230": "\\oiiint" -}; // No limits, not symbols - -defineFunction({ - type: "op", - names: ["\\arcsin", "\\arccos", "\\arctan", "\\arctg", "\\arcctg", "\\arg", "\\ch", "\\cos", "\\cosec", "\\cosh", "\\cot", "\\cotg", "\\coth", "\\csc", "\\ctg", "\\cth", "\\deg", "\\dim", "\\exp", "\\hom", "\\ker", "\\lg", "\\ln", "\\log", "\\sec", "\\sin", "\\sinh", "\\sh", "\\tan", "\\tanh", "\\tg", "\\th"], - props: { - numArgs: 0 - }, - handler: function handler(_ref3) { - var parser = _ref3.parser, - funcName = _ref3.funcName; - return { - type: "op", - mode: parser.mode, - limits: false, - parentIsSupSub: false, - symbol: false, - name: funcName - }; - }, - htmlBuilder: op_htmlBuilder, - mathmlBuilder: op_mathmlBuilder -}); // Limits, not symbols - -defineFunction({ - type: "op", - names: ["\\det", "\\gcd", "\\inf", "\\lim", "\\max", "\\min", "\\Pr", "\\sup"], - props: { - numArgs: 0 - }, - handler: function handler(_ref4) { - var parser = _ref4.parser, - funcName = _ref4.funcName; - return { - type: "op", - mode: parser.mode, - limits: true, - parentIsSupSub: false, - symbol: false, - name: funcName - }; - }, - htmlBuilder: op_htmlBuilder, - mathmlBuilder: op_mathmlBuilder -}); // No limits, symbols - -defineFunction({ - type: "op", - names: ["\\int", "\\iint", "\\iiint", "\\oint", "\\oiint", "\\oiiint", "\u222B", "\u222C", "\u222D", "\u222E", "\u222F", "\u2230"], - props: { - numArgs: 0 - }, - handler: function handler(_ref5) { - var parser = _ref5.parser, - funcName = _ref5.funcName; - var fName = funcName; - - if (fName.length === 1) { - fName = singleCharIntegrals[fName]; - } - - return { - type: "op", - mode: parser.mode, - limits: false, - parentIsSupSub: false, - symbol: true, - name: fName - }; - }, - htmlBuilder: op_htmlBuilder, - mathmlBuilder: op_mathmlBuilder -}); -// CONCATENATED MODULE: ./src/functions/operatorname.js - - - - - - - - -// NOTE: Unlike most `htmlBuilder`s, this one handles not only -// "operatorname", but also "supsub" since \operatorname* can -var operatorname_htmlBuilder = function htmlBuilder(grp, options) { - // Operators are handled in the TeXbook pg. 443-444, rule 13(a). - var supGroup; - var subGroup; - var hasLimits = false; - var group; - - if (grp.type === "supsub") { - // If we have limits, supsub will pass us its group to handle. Pull - // out the superscript and subscript and set the group to the op in - // its base. - supGroup = grp.sup; - subGroup = grp.sub; - group = assertNodeType(grp.base, "operatorname"); - hasLimits = true; - } else { - group = assertNodeType(grp, "operatorname"); - } - - var base; - - if (group.body.length > 0) { - var body = group.body.map(function (child) { - // $FlowFixMe: Check if the node has a string `text` property. - var childText = child.text; - - if (typeof childText === "string") { - return { - type: "textord", - mode: child.mode, - text: childText - }; - } else { - return child; - } - }); // Consolidate function names into symbol characters. - - var expression = buildHTML_buildExpression(body, options.withFont("mathrm"), true); - - for (var i = 0; i < expression.length; i++) { - var child = expression[i]; - - if (child instanceof domTree_SymbolNode) { - // Per amsopn package, - // change minus to hyphen and \ast to asterisk - child.text = child.text.replace(/\u2212/, "-").replace(/\u2217/, "*"); - } - } - - base = buildCommon.makeSpan(["mop"], expression, options); - } else { - base = buildCommon.makeSpan(["mop"], [], options); - } - - if (hasLimits) { - return assembleSupSub_assembleSupSub(base, supGroup, subGroup, options, options.style, 0, 0); - } else { - return base; - } -}; - -var operatorname_mathmlBuilder = function mathmlBuilder(group, options) { - // The steps taken here are similar to the html version. - var expression = buildMathML_buildExpression(group.body, options.withFont("mathrm")); // Is expression a string or has it something like a fraction? - - var isAllString = true; // default - - for (var i = 0; i < expression.length; i++) { - var node = expression[i]; - - if (node instanceof mathMLTree.SpaceNode) ; else if (node instanceof mathMLTree.MathNode) { - switch (node.type) { - case "mi": - case "mn": - case "ms": - case "mspace": - case "mtext": - break; - // Do nothing yet. - - case "mo": - { - var child = node.children[0]; - - if (node.children.length === 1 && child instanceof mathMLTree.TextNode) { - child.text = child.text.replace(/\u2212/, "-").replace(/\u2217/, "*"); - } else { - isAllString = false; - } - - break; - } - - default: - isAllString = false; - } - } else { - isAllString = false; - } - } - - if (isAllString) { - // Write a single TextNode instead of multiple nested tags. - var word = expression.map(function (node) { - return node.toText(); - }).join(""); - expression = [new mathMLTree.TextNode(word)]; - } - - var identifier = new mathMLTree.MathNode("mi", expression); - identifier.setAttribute("mathvariant", "normal"); // \u2061 is the same as ⁡ - // ref: https://www.w3schools.com/charsets/ref_html_entities_a.asp - - var operator = new mathMLTree.MathNode("mo", [buildMathML_makeText("\u2061", "text")]); - - if (group.parentIsSupSub) { - return new mathMLTree.MathNode("mo", [identifier, operator]); - } else { - return mathMLTree.newDocumentFragment([identifier, operator]); - } -}; // \operatorname -// amsopn.dtx: \mathop{#1\kern\z@\operator@font#3}\newmcodes@ - - -defineFunction({ - type: "operatorname", - names: ["\\operatorname", "\\operatorname*"], - props: { - numArgs: 1 - }, - handler: function handler(_ref, args) { - var parser = _ref.parser, - funcName = _ref.funcName; - var body = args[0]; - return { - type: "operatorname", - mode: parser.mode, - body: ordargument(body), - alwaysHandleSupSub: funcName === "\\operatorname*", - limits: false, - parentIsSupSub: false - }; - }, - htmlBuilder: operatorname_htmlBuilder, - mathmlBuilder: operatorname_mathmlBuilder -}); -// CONCATENATED MODULE: ./src/functions/ordgroup.js - - - - -defineFunctionBuilders({ - type: "ordgroup", - htmlBuilder: function htmlBuilder(group, options) { - if (group.semisimple) { - return buildCommon.makeFragment(buildHTML_buildExpression(group.body, options, false)); - } - - return buildCommon.makeSpan(["mord"], buildHTML_buildExpression(group.body, options, true), options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - return buildExpressionRow(group.body, options, true); - } -}); -// CONCATENATED MODULE: ./src/functions/overline.js - - - - - -defineFunction({ - type: "overline", - names: ["\\overline"], - props: { - numArgs: 1 - }, - handler: function handler(_ref, args) { - var parser = _ref.parser; - var body = args[0]; - return { - type: "overline", - mode: parser.mode, - body: body - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - // Overlines are handled in the TeXbook pg 443, Rule 9. - // Build the inner group in the cramped style. - var innerGroup = buildHTML_buildGroup(group.body, options.havingCrampedStyle()); // Create the line above the body - - var line = buildCommon.makeLineSpan("overline-line", options); // Generate the vlist, with the appropriate kerns - - var defaultRuleThickness = options.fontMetrics().defaultRuleThickness; - var vlist = buildCommon.makeVList({ - positionType: "firstBaseline", - children: [{ - type: "elem", - elem: innerGroup - }, { - type: "kern", - size: 3 * defaultRuleThickness - }, { - type: "elem", - elem: line - }, { - type: "kern", - size: defaultRuleThickness - }] - }, options); - return buildCommon.makeSpan(["mord", "overline"], [vlist], options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var operator = new mathMLTree.MathNode("mo", [new mathMLTree.TextNode("\u203E")]); - operator.setAttribute("stretchy", "true"); - var node = new mathMLTree.MathNode("mover", [buildMathML_buildGroup(group.body, options), operator]); - node.setAttribute("accent", "true"); - return node; - } -}); -// CONCATENATED MODULE: ./src/functions/phantom.js - - - - - -defineFunction({ - type: "phantom", - names: ["\\phantom"], - props: { - numArgs: 1, - allowedInText: true - }, - handler: function handler(_ref, args) { - var parser = _ref.parser; - var body = args[0]; - return { - type: "phantom", - mode: parser.mode, - body: ordargument(body) - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - var elements = buildHTML_buildExpression(group.body, options.withPhantom(), false); // \phantom isn't supposed to affect the elements it contains. - // See "color" for more details. - - return buildCommon.makeFragment(elements); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var inner = buildMathML_buildExpression(group.body, options); - return new mathMLTree.MathNode("mphantom", inner); - } -}); -defineFunction({ - type: "hphantom", - names: ["\\hphantom"], - props: { - numArgs: 1, - allowedInText: true - }, - handler: function handler(_ref2, args) { - var parser = _ref2.parser; - var body = args[0]; - return { - type: "hphantom", - mode: parser.mode, - body: body - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - var node = buildCommon.makeSpan([], [buildHTML_buildGroup(group.body, options.withPhantom())]); - node.height = 0; - node.depth = 0; - - if (node.children) { - for (var i = 0; i < node.children.length; i++) { - node.children[i].height = 0; - node.children[i].depth = 0; - } - } // See smash for comment re: use of makeVList - - - node = buildCommon.makeVList({ - positionType: "firstBaseline", - children: [{ - type: "elem", - elem: node - }] - }, options); // For spacing, TeX treats \smash as a math group (same spacing as ord). - - return buildCommon.makeSpan(["mord"], [node], options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var inner = buildMathML_buildExpression(ordargument(group.body), options); - var phantom = new mathMLTree.MathNode("mphantom", inner); - var node = new mathMLTree.MathNode("mpadded", [phantom]); - node.setAttribute("height", "0px"); - node.setAttribute("depth", "0px"); - return node; - } -}); -defineFunction({ - type: "vphantom", - names: ["\\vphantom"], - props: { - numArgs: 1, - allowedInText: true - }, - handler: function handler(_ref3, args) { - var parser = _ref3.parser; - var body = args[0]; - return { - type: "vphantom", - mode: parser.mode, - body: body - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - var inner = buildCommon.makeSpan(["inner"], [buildHTML_buildGroup(group.body, options.withPhantom())]); - var fix = buildCommon.makeSpan(["fix"], []); - return buildCommon.makeSpan(["mord", "rlap"], [inner, fix], options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var inner = buildMathML_buildExpression(ordargument(group.body), options); - var phantom = new mathMLTree.MathNode("mphantom", inner); - var node = new mathMLTree.MathNode("mpadded", [phantom]); - node.setAttribute("width", "0px"); - return node; - } -}); -// CONCATENATED MODULE: ./src/functions/raisebox.js - - - - - - - // Box manipulation - -defineFunction({ - type: "raisebox", - names: ["\\raisebox"], - props: { - numArgs: 2, - argTypes: ["size", "hbox"], - allowedInText: true - }, - handler: function handler(_ref, args) { - var parser = _ref.parser; - var amount = assertNodeType(args[0], "size").value; - var body = args[1]; - return { - type: "raisebox", - mode: parser.mode, - dy: amount, - body: body - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - var body = buildHTML_buildGroup(group.body, options); - var dy = units_calculateSize(group.dy, options); - return buildCommon.makeVList({ - positionType: "shift", - positionData: -dy, - children: [{ - type: "elem", - elem: body - }] - }, options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var node = new mathMLTree.MathNode("mpadded", [buildMathML_buildGroup(group.body, options)]); - var dy = group.dy.number + group.dy.unit; - node.setAttribute("voffset", dy); - return node; - } -}); -// CONCATENATED MODULE: ./src/functions/rule.js - - - - - -defineFunction({ - type: "rule", - names: ["\\rule"], - props: { - numArgs: 2, - numOptionalArgs: 1, - argTypes: ["size", "size", "size"] - }, - handler: function handler(_ref, args, optArgs) { - var parser = _ref.parser; - var shift = optArgs[0]; - var width = assertNodeType(args[0], "size"); - var height = assertNodeType(args[1], "size"); - return { - type: "rule", - mode: parser.mode, - shift: shift && assertNodeType(shift, "size").value, - width: width.value, - height: height.value - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - // Make an empty span for the rule - var rule = buildCommon.makeSpan(["mord", "rule"], [], options); // Calculate the shift, width, and height of the rule, and account for units - - var width = units_calculateSize(group.width, options); - var height = units_calculateSize(group.height, options); - var shift = group.shift ? units_calculateSize(group.shift, options) : 0; // Style the rule to the right size - - rule.style.borderRightWidth = width + "em"; - rule.style.borderTopWidth = height + "em"; - rule.style.bottom = shift + "em"; // Record the height and width - - rule.width = width; - rule.height = height + shift; - rule.depth = -shift; // Font size is the number large enough that the browser will - // reserve at least `absHeight` space above the baseline. - // The 1.125 factor was empirically determined - - rule.maxFontSize = height * 1.125 * options.sizeMultiplier; - return rule; - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var width = units_calculateSize(group.width, options); - var height = units_calculateSize(group.height, options); - var shift = group.shift ? units_calculateSize(group.shift, options) : 0; - var color = options.color && options.getColor() || "black"; - var rule = new mathMLTree.MathNode("mspace"); - rule.setAttribute("mathbackground", color); - rule.setAttribute("width", width + "em"); - rule.setAttribute("height", height + "em"); - var wrapper = new mathMLTree.MathNode("mpadded", [rule]); - - if (shift >= 0) { - wrapper.setAttribute("height", "+" + shift + "em"); - } else { - wrapper.setAttribute("height", shift + "em"); - wrapper.setAttribute("depth", "+" + -shift + "em"); - } - - wrapper.setAttribute("voffset", shift + "em"); - return wrapper; - } -}); -// CONCATENATED MODULE: ./src/functions/sizing.js - - - - - -function sizingGroup(value, options, baseOptions) { - var inner = buildHTML_buildExpression(value, options, false); - var multiplier = options.sizeMultiplier / baseOptions.sizeMultiplier; // Add size-resetting classes to the inner list and set maxFontSize - // manually. Handle nested size changes. - - for (var i = 0; i < inner.length; i++) { - var pos = inner[i].classes.indexOf("sizing"); - - if (pos < 0) { - Array.prototype.push.apply(inner[i].classes, options.sizingClasses(baseOptions)); - } else if (inner[i].classes[pos + 1] === "reset-size" + options.size) { - // This is a nested size change: e.g., inner[i] is the "b" in - // `\Huge a \small b`. Override the old size (the `reset-` class) - // but not the new size. - inner[i].classes[pos + 1] = "reset-size" + baseOptions.size; - } - - inner[i].height *= multiplier; - inner[i].depth *= multiplier; - } - - return buildCommon.makeFragment(inner); -} -var sizeFuncs = ["\\tiny", "\\sixptsize", "\\scriptsize", "\\footnotesize", "\\small", "\\normalsize", "\\large", "\\Large", "\\LARGE", "\\huge", "\\Huge"]; -var sizing_htmlBuilder = function htmlBuilder(group, options) { - // Handle sizing operators like \Huge. Real TeX doesn't actually allow - // these functions inside of math expressions, so we do some special - // handling. - var newOptions = options.havingSize(group.size); - return sizingGroup(group.body, newOptions, options); -}; -defineFunction({ - type: "sizing", - names: sizeFuncs, - props: { - numArgs: 0, - allowedInText: true - }, - handler: function handler(_ref, args) { - var breakOnTokenText = _ref.breakOnTokenText, - funcName = _ref.funcName, - parser = _ref.parser; - var body = parser.parseExpression(false, breakOnTokenText); - return { - type: "sizing", - mode: parser.mode, - // Figure out what size to use based on the list of functions above - size: sizeFuncs.indexOf(funcName) + 1, - body: body - }; - }, - htmlBuilder: sizing_htmlBuilder, - mathmlBuilder: function mathmlBuilder(group, options) { - var newOptions = options.havingSize(group.size); - var inner = buildMathML_buildExpression(group.body, newOptions); - var node = new mathMLTree.MathNode("mstyle", inner); // TODO(emily): This doesn't produce the correct size for nested size - // changes, because we don't keep state of what style we're currently - // in, so we can't reset the size to normal before changing it. Now - // that we're passing an options parameter we should be able to fix - // this. - - node.setAttribute("mathsize", newOptions.sizeMultiplier + "em"); - return node; - } -}); -// CONCATENATED MODULE: ./src/functions/smash.js -// smash, with optional [tb], as in AMS - - - - - - -defineFunction({ - type: "smash", - names: ["\\smash"], - props: { - numArgs: 1, - numOptionalArgs: 1, - allowedInText: true - }, - handler: function handler(_ref, args, optArgs) { - var parser = _ref.parser; - var smashHeight = false; - var smashDepth = false; - var tbArg = optArgs[0] && assertNodeType(optArgs[0], "ordgroup"); - - if (tbArg) { - // Optional [tb] argument is engaged. - // ref: amsmath: \renewcommand{\smash}[1][tb]{% - // def\mb@t{\ht}\def\mb@b{\dp}\def\mb@tb{\ht\z@\z@\dp}% - var letter = ""; - - for (var i = 0; i < tbArg.body.length; ++i) { - var node = tbArg.body[i]; // $FlowFixMe: Not every node type has a `text` property. - - letter = node.text; - - if (letter === "t") { - smashHeight = true; - } else if (letter === "b") { - smashDepth = true; - } else { - smashHeight = false; - smashDepth = false; - break; - } - } - } else { - smashHeight = true; - smashDepth = true; - } - - var body = args[0]; - return { - type: "smash", - mode: parser.mode, - body: body, - smashHeight: smashHeight, - smashDepth: smashDepth - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - var node = buildCommon.makeSpan([], [buildHTML_buildGroup(group.body, options)]); - - if (!group.smashHeight && !group.smashDepth) { - return node; - } - - if (group.smashHeight) { - node.height = 0; // In order to influence makeVList, we have to reset the children. - - if (node.children) { - for (var i = 0; i < node.children.length; i++) { - node.children[i].height = 0; - } - } - } - - if (group.smashDepth) { - node.depth = 0; - - if (node.children) { - for (var _i = 0; _i < node.children.length; _i++) { - node.children[_i].depth = 0; - } - } - } // At this point, we've reset the TeX-like height and depth values. - // But the span still has an HTML line height. - // makeVList applies "display: table-cell", which prevents the browser - // from acting on that line height. So we'll call makeVList now. - - - var smashedNode = buildCommon.makeVList({ - positionType: "firstBaseline", - children: [{ - type: "elem", - elem: node - }] - }, options); // For spacing, TeX treats \hphantom as a math group (same spacing as ord). - - return buildCommon.makeSpan(["mord"], [smashedNode], options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var node = new mathMLTree.MathNode("mpadded", [buildMathML_buildGroup(group.body, options)]); - - if (group.smashHeight) { - node.setAttribute("height", "0px"); - } - - if (group.smashDepth) { - node.setAttribute("depth", "0px"); - } - - return node; - } -}); -// CONCATENATED MODULE: ./src/functions/sqrt.js - - - - - - - -defineFunction({ - type: "sqrt", - names: ["\\sqrt"], - props: { - numArgs: 1, - numOptionalArgs: 1 - }, - handler: function handler(_ref, args, optArgs) { - var parser = _ref.parser; - var index = optArgs[0]; - var body = args[0]; - return { - type: "sqrt", - mode: parser.mode, - body: body, - index: index - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - // Square roots are handled in the TeXbook pg. 443, Rule 11. - // First, we do the same steps as in overline to build the inner group - // and line - var inner = buildHTML_buildGroup(group.body, options.havingCrampedStyle()); - - if (inner.height === 0) { - // Render a small surd. - inner.height = options.fontMetrics().xHeight; - } // Some groups can return document fragments. Handle those by wrapping - // them in a span. - - - inner = buildCommon.wrapFragment(inner, options); // Calculate the minimum size for the \surd delimiter - - var metrics = options.fontMetrics(); - var theta = metrics.defaultRuleThickness; - var phi = theta; - - if (options.style.id < src_Style.TEXT.id) { - phi = options.fontMetrics().xHeight; - } // Calculate the clearance between the body and line - - - var lineClearance = theta + phi / 4; - var minDelimiterHeight = inner.height + inner.depth + lineClearance + theta; // Create a sqrt SVG of the required minimum size - - var _delimiter$sqrtImage = delimiter.sqrtImage(minDelimiterHeight, options), - img = _delimiter$sqrtImage.span, - ruleWidth = _delimiter$sqrtImage.ruleWidth, - advanceWidth = _delimiter$sqrtImage.advanceWidth; - - var delimDepth = img.height - ruleWidth; // Adjust the clearance based on the delimiter size - - if (delimDepth > inner.height + inner.depth + lineClearance) { - lineClearance = (lineClearance + delimDepth - inner.height - inner.depth) / 2; - } // Shift the sqrt image - - - var imgShift = img.height - inner.height - lineClearance - ruleWidth; - inner.style.paddingLeft = advanceWidth + "em"; // Overlay the image and the argument. - - var body = buildCommon.makeVList({ - positionType: "firstBaseline", - children: [{ - type: "elem", - elem: inner, - wrapperClasses: ["svg-align"] - }, { - type: "kern", - size: -(inner.height + imgShift) - }, { - type: "elem", - elem: img - }, { - type: "kern", - size: ruleWidth - }] - }, options); - - if (!group.index) { - return buildCommon.makeSpan(["mord", "sqrt"], [body], options); - } else { - // Handle the optional root index - // The index is always in scriptscript style - var newOptions = options.havingStyle(src_Style.SCRIPTSCRIPT); - var rootm = buildHTML_buildGroup(group.index, newOptions, options); // The amount the index is shifted by. This is taken from the TeX - // source, in the definition of `\r@@t`. - - var toShift = 0.6 * (body.height - body.depth); // Build a VList with the superscript shifted up correctly - - var rootVList = buildCommon.makeVList({ - positionType: "shift", - positionData: -toShift, - children: [{ - type: "elem", - elem: rootm - }] - }, options); // Add a class surrounding it so we can add on the appropriate - // kerning - - var rootVListWrap = buildCommon.makeSpan(["root"], [rootVList]); - return buildCommon.makeSpan(["mord", "sqrt"], [rootVListWrap, body], options); - } - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var body = group.body, - index = group.index; - return index ? new mathMLTree.MathNode("mroot", [buildMathML_buildGroup(body, options), buildMathML_buildGroup(index, options)]) : new mathMLTree.MathNode("msqrt", [buildMathML_buildGroup(body, options)]); - } -}); -// CONCATENATED MODULE: ./src/functions/styling.js - - - - - -var styling_styleMap = { - "display": src_Style.DISPLAY, - "text": src_Style.TEXT, - "script": src_Style.SCRIPT, - "scriptscript": src_Style.SCRIPTSCRIPT -}; -defineFunction({ - type: "styling", - names: ["\\displaystyle", "\\textstyle", "\\scriptstyle", "\\scriptscriptstyle"], - props: { - numArgs: 0, - allowedInText: true - }, - handler: function handler(_ref, args) { - var breakOnTokenText = _ref.breakOnTokenText, - funcName = _ref.funcName, - parser = _ref.parser; - // parse out the implicit body - var body = parser.parseExpression(true, breakOnTokenText); // TODO: Refactor to avoid duplicating styleMap in multiple places (e.g. - // here and in buildHTML and de-dupe the enumeration of all the styles). - // $FlowFixMe: The names above exactly match the styles. - - var style = funcName.slice(1, funcName.length - 5); - return { - type: "styling", - mode: parser.mode, - // Figure out what style to use by pulling out the style from - // the function name - style: style, - body: body - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - // Style changes are handled in the TeXbook on pg. 442, Rule 3. - var newStyle = styling_styleMap[group.style]; - var newOptions = options.havingStyle(newStyle).withFont(''); - return sizingGroup(group.body, newOptions, options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - // Figure out what style we're changing to. - var newStyle = styling_styleMap[group.style]; - var newOptions = options.havingStyle(newStyle); - var inner = buildMathML_buildExpression(group.body, newOptions); - var node = new mathMLTree.MathNode("mstyle", inner); - var styleAttributes = { - "display": ["0", "true"], - "text": ["0", "false"], - "script": ["1", "false"], - "scriptscript": ["2", "false"] - }; - var attr = styleAttributes[group.style]; - node.setAttribute("scriptlevel", attr[0]); - node.setAttribute("displaystyle", attr[1]); - return node; - } -}); -// CONCATENATED MODULE: ./src/functions/supsub.js - - - - - - - - - - - - - -/** - * Sometimes, groups perform special rules when they have superscripts or - * subscripts attached to them. This function lets the `supsub` group know that - * Sometimes, groups perform special rules when they have superscripts or - * its inner element should handle the superscripts and subscripts instead of - * handling them itself. - */ -var supsub_htmlBuilderDelegate = function htmlBuilderDelegate(group, options) { - var base = group.base; - - if (!base) { - return null; - } else if (base.type === "op") { - // Operators handle supsubs differently when they have limits - // (e.g. `\displaystyle\sum_2^3`) - var delegate = base.limits && (options.style.size === src_Style.DISPLAY.size || base.alwaysHandleSupSub); - return delegate ? op_htmlBuilder : null; - } else if (base.type === "operatorname") { - var _delegate = base.alwaysHandleSupSub && (options.style.size === src_Style.DISPLAY.size || base.limits); - - return _delegate ? operatorname_htmlBuilder : null; - } else if (base.type === "accent") { - return utils.isCharacterBox(base.base) ? accent_htmlBuilder : null; - } else if (base.type === "horizBrace") { - var isSup = !group.sub; - return isSup === base.isOver ? horizBrace_htmlBuilder : null; - } else { - return null; - } -}; // Super scripts and subscripts, whose precise placement can depend on other -// functions that precede them. - - -defineFunctionBuilders({ - type: "supsub", - htmlBuilder: function htmlBuilder(group, options) { - // Superscript and subscripts are handled in the TeXbook on page - // 445-446, rules 18(a-f). - // Here is where we defer to the inner group if it should handle - // superscripts and subscripts itself. - var builderDelegate = supsub_htmlBuilderDelegate(group, options); - - if (builderDelegate) { - return builderDelegate(group, options); - } - - var valueBase = group.base, - valueSup = group.sup, - valueSub = group.sub; - var base = buildHTML_buildGroup(valueBase, options); - var supm; - var subm; - var metrics = options.fontMetrics(); // Rule 18a - - var supShift = 0; - var subShift = 0; - var isCharacterBox = valueBase && utils.isCharacterBox(valueBase); - - if (valueSup) { - var newOptions = options.havingStyle(options.style.sup()); - supm = buildHTML_buildGroup(valueSup, newOptions, options); - - if (!isCharacterBox) { - supShift = base.height - newOptions.fontMetrics().supDrop * newOptions.sizeMultiplier / options.sizeMultiplier; - } - } - - if (valueSub) { - var _newOptions = options.havingStyle(options.style.sub()); - - subm = buildHTML_buildGroup(valueSub, _newOptions, options); - - if (!isCharacterBox) { - subShift = base.depth + _newOptions.fontMetrics().subDrop * _newOptions.sizeMultiplier / options.sizeMultiplier; - } - } // Rule 18c - - - var minSupShift; - - if (options.style === src_Style.DISPLAY) { - minSupShift = metrics.sup1; - } else if (options.style.cramped) { - minSupShift = metrics.sup3; - } else { - minSupShift = metrics.sup2; - } // scriptspace is a font-size-independent size, so scale it - // appropriately for use as the marginRight. - - - var multiplier = options.sizeMultiplier; - var marginRight = 0.5 / metrics.ptPerEm / multiplier + "em"; - var marginLeft = null; - - if (subm) { - // Subscripts shouldn't be shifted by the base's italic correction. - // Account for that by shifting the subscript back the appropriate - // amount. Note we only do this when the base is a single symbol. - var isOiint = group.base && group.base.type === "op" && group.base.name && (group.base.name === "\\oiint" || group.base.name === "\\oiiint"); - - if (base instanceof domTree_SymbolNode || isOiint) { - // $FlowFixMe - marginLeft = -base.italic + "em"; - } - } - - var supsub; - - if (supm && subm) { - supShift = Math.max(supShift, minSupShift, supm.depth + 0.25 * metrics.xHeight); - subShift = Math.max(subShift, metrics.sub2); - var ruleWidth = metrics.defaultRuleThickness; // Rule 18e - - var maxWidth = 4 * ruleWidth; - - if (supShift - supm.depth - (subm.height - subShift) < maxWidth) { - subShift = maxWidth - (supShift - supm.depth) + subm.height; - var psi = 0.8 * metrics.xHeight - (supShift - supm.depth); - - if (psi > 0) { - supShift += psi; - subShift -= psi; - } - } - - var vlistElem = [{ - type: "elem", - elem: subm, - shift: subShift, - marginRight: marginRight, - marginLeft: marginLeft - }, { - type: "elem", - elem: supm, - shift: -supShift, - marginRight: marginRight - }]; - supsub = buildCommon.makeVList({ - positionType: "individualShift", - children: vlistElem - }, options); - } else if (subm) { - // Rule 18b - subShift = Math.max(subShift, metrics.sub1, subm.height - 0.8 * metrics.xHeight); - var _vlistElem = [{ - type: "elem", - elem: subm, - marginLeft: marginLeft, - marginRight: marginRight - }]; - supsub = buildCommon.makeVList({ - positionType: "shift", - positionData: subShift, - children: _vlistElem - }, options); - } else if (supm) { - // Rule 18c, d - supShift = Math.max(supShift, minSupShift, supm.depth + 0.25 * metrics.xHeight); - supsub = buildCommon.makeVList({ - positionType: "shift", - positionData: -supShift, - children: [{ - type: "elem", - elem: supm, - marginRight: marginRight - }] - }, options); - } else { - throw new Error("supsub must have either sup or sub."); - } // Wrap the supsub vlist in a span.msupsub to reset text-align. - - - var mclass = getTypeOfDomTree(base, "right") || "mord"; - return buildCommon.makeSpan([mclass], [base, buildCommon.makeSpan(["msupsub"], [supsub])], options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - // Is the inner group a relevant horizonal brace? - var isBrace = false; - var isOver; - var isSup; - - if (group.base && group.base.type === "horizBrace") { - isSup = !!group.sup; - - if (isSup === group.base.isOver) { - isBrace = true; - isOver = group.base.isOver; - } - } - - if (group.base && (group.base.type === "op" || group.base.type === "operatorname")) { - group.base.parentIsSupSub = true; - } - - var children = [buildMathML_buildGroup(group.base, options)]; - - if (group.sub) { - children.push(buildMathML_buildGroup(group.sub, options)); - } - - if (group.sup) { - children.push(buildMathML_buildGroup(group.sup, options)); - } - - var nodeType; - - if (isBrace) { - nodeType = isOver ? "mover" : "munder"; - } else if (!group.sub) { - var base = group.base; - - if (base && base.type === "op" && base.limits && (options.style === src_Style.DISPLAY || base.alwaysHandleSupSub)) { - nodeType = "mover"; - } else if (base && base.type === "operatorname" && base.alwaysHandleSupSub && (base.limits || options.style === src_Style.DISPLAY)) { - nodeType = "mover"; - } else { - nodeType = "msup"; - } - } else if (!group.sup) { - var _base = group.base; - - if (_base && _base.type === "op" && _base.limits && (options.style === src_Style.DISPLAY || _base.alwaysHandleSupSub)) { - nodeType = "munder"; - } else if (_base && _base.type === "operatorname" && _base.alwaysHandleSupSub && (_base.limits || options.style === src_Style.DISPLAY)) { - nodeType = "munder"; - } else { - nodeType = "msub"; - } - } else { - var _base2 = group.base; - - if (_base2 && _base2.type === "op" && _base2.limits && options.style === src_Style.DISPLAY) { - nodeType = "munderover"; - } else if (_base2 && _base2.type === "operatorname" && _base2.alwaysHandleSupSub && (options.style === src_Style.DISPLAY || _base2.limits)) { - nodeType = "munderover"; - } else { - nodeType = "msubsup"; - } - } - - var node = new mathMLTree.MathNode(nodeType, children); - return node; - } -}); -// CONCATENATED MODULE: ./src/functions/symbolsOp.js - - - - // Operator ParseNodes created in Parser.js from symbol Groups in src/symbols.js. - -defineFunctionBuilders({ - type: "atom", - htmlBuilder: function htmlBuilder(group, options) { - return buildCommon.mathsym(group.text, group.mode, options, ["m" + group.family]); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var node = new mathMLTree.MathNode("mo", [buildMathML_makeText(group.text, group.mode)]); - - if (group.family === "bin") { - var variant = buildMathML_getVariant(group, options); - - if (variant === "bold-italic") { - node.setAttribute("mathvariant", variant); - } - } else if (group.family === "punct") { - node.setAttribute("separator", "true"); - } else if (group.family === "open" || group.family === "close") { - // Delims built here should not stretch vertically. - // See delimsizing.js for stretchy delims. - node.setAttribute("stretchy", "false"); - } - - return node; - } -}); -// CONCATENATED MODULE: ./src/functions/symbolsOrd.js - - - - -// "mathord" and "textord" ParseNodes created in Parser.js from symbol Groups in -var defaultVariant = { - "mi": "italic", - "mn": "normal", - "mtext": "normal" -}; -defineFunctionBuilders({ - type: "mathord", - htmlBuilder: function htmlBuilder(group, options) { - return buildCommon.makeOrd(group, options, "mathord"); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var node = new mathMLTree.MathNode("mi", [buildMathML_makeText(group.text, group.mode, options)]); - var variant = buildMathML_getVariant(group, options) || "italic"; - - if (variant !== defaultVariant[node.type]) { - node.setAttribute("mathvariant", variant); - } - - return node; - } -}); -defineFunctionBuilders({ - type: "textord", - htmlBuilder: function htmlBuilder(group, options) { - return buildCommon.makeOrd(group, options, "textord"); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var text = buildMathML_makeText(group.text, group.mode, options); - var variant = buildMathML_getVariant(group, options) || "normal"; - var node; - - if (group.mode === 'text') { - node = new mathMLTree.MathNode("mtext", [text]); - } else if (/[0-9]/.test(group.text)) { - // TODO(kevinb) merge adjacent nodes - // do it as a post processing step - node = new mathMLTree.MathNode("mn", [text]); - } else if (group.text === "\\prime") { - node = new mathMLTree.MathNode("mo", [text]); - } else { - node = new mathMLTree.MathNode("mi", [text]); - } - - if (variant !== defaultVariant[node.type]) { - node.setAttribute("mathvariant", variant); - } - - return node; - } -}); -// CONCATENATED MODULE: ./src/functions/symbolsSpacing.js - - - - // A map of CSS-based spacing functions to their CSS class. - -var cssSpace = { - "\\nobreak": "nobreak", - "\\allowbreak": "allowbreak" -}; // A lookup table to determine whether a spacing function/symbol should be -// treated like a regular space character. If a symbol or command is a key -// in this table, then it should be a regular space character. Furthermore, -// the associated value may have a `className` specifying an extra CSS class -// to add to the created `span`. - -var regularSpace = { - " ": {}, - "\\ ": {}, - "~": { - className: "nobreak" - }, - "\\space": {}, - "\\nobreakspace": { - className: "nobreak" - } -}; // ParseNode<"spacing"> created in Parser.js from the "spacing" symbol Groups in -// src/symbols.js. - -defineFunctionBuilders({ - type: "spacing", - htmlBuilder: function htmlBuilder(group, options) { - if (regularSpace.hasOwnProperty(group.text)) { - var className = regularSpace[group.text].className || ""; // Spaces are generated by adding an actual space. Each of these - // things has an entry in the symbols table, so these will be turned - // into appropriate outputs. - - if (group.mode === "text") { - var ord = buildCommon.makeOrd(group, options, "textord"); - ord.classes.push(className); - return ord; - } else { - return buildCommon.makeSpan(["mspace", className], [buildCommon.mathsym(group.text, group.mode, options)], options); - } - } else if (cssSpace.hasOwnProperty(group.text)) { - // Spaces based on just a CSS class. - return buildCommon.makeSpan(["mspace", cssSpace[group.text]], [], options); - } else { - throw new src_ParseError("Unknown type of space \"" + group.text + "\""); - } - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var node; - - if (regularSpace.hasOwnProperty(group.text)) { - node = new mathMLTree.MathNode("mtext", [new mathMLTree.TextNode("\xA0")]); - } else if (cssSpace.hasOwnProperty(group.text)) { - // CSS-based MathML spaces (\nobreak, \allowbreak) are ignored - return new mathMLTree.MathNode("mspace"); - } else { - throw new src_ParseError("Unknown type of space \"" + group.text + "\""); - } - - return node; - } -}); -// CONCATENATED MODULE: ./src/functions/tag.js - - - - -var tag_pad = function pad() { - var padNode = new mathMLTree.MathNode("mtd", []); - padNode.setAttribute("width", "50%"); - return padNode; -}; - -defineFunctionBuilders({ - type: "tag", - mathmlBuilder: function mathmlBuilder(group, options) { - var table = new mathMLTree.MathNode("mtable", [new mathMLTree.MathNode("mtr", [tag_pad(), new mathMLTree.MathNode("mtd", [buildExpressionRow(group.body, options)]), tag_pad(), new mathMLTree.MathNode("mtd", [buildExpressionRow(group.tag, options)])])]); - table.setAttribute("width", "100%"); - return table; // TODO: Left-aligned tags. - // Currently, the group and options passed here do not contain - // enough info to set tag alignment. `leqno` is in Settings but it is - // not passed to Options. On the HTML side, leqno is - // set by a CSS class applied in buildTree.js. That would have worked - // in MathML if browsers supported . Since they don't, we - // need to rewrite the way this function is called. - } -}); -// CONCATENATED MODULE: ./src/functions/text.js - - - - // Non-mathy text, possibly in a font - -var textFontFamilies = { - "\\text": undefined, - "\\textrm": "textrm", - "\\textsf": "textsf", - "\\texttt": "texttt", - "\\textnormal": "textrm" -}; -var textFontWeights = { - "\\textbf": "textbf", - "\\textmd": "textmd" -}; -var textFontShapes = { - "\\textit": "textit", - "\\textup": "textup" -}; - -var optionsWithFont = function optionsWithFont(group, options) { - var font = group.font; // Checks if the argument is a font family or a font style. - - if (!font) { - return options; - } else if (textFontFamilies[font]) { - return options.withTextFontFamily(textFontFamilies[font]); - } else if (textFontWeights[font]) { - return options.withTextFontWeight(textFontWeights[font]); - } else { - return options.withTextFontShape(textFontShapes[font]); - } -}; - -defineFunction({ - type: "text", - names: [// Font families - "\\text", "\\textrm", "\\textsf", "\\texttt", "\\textnormal", // Font weights - "\\textbf", "\\textmd", // Font Shapes - "\\textit", "\\textup"], - props: { - numArgs: 1, - argTypes: ["text"], - greediness: 2, - allowedInText: true - }, - handler: function handler(_ref, args) { - var parser = _ref.parser, - funcName = _ref.funcName; - var body = args[0]; - return { - type: "text", - mode: parser.mode, - body: ordargument(body), - font: funcName - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - var newOptions = optionsWithFont(group, options); - var inner = buildHTML_buildExpression(group.body, newOptions, true); - return buildCommon.makeSpan(["mord", "text"], buildCommon.tryCombineChars(inner), newOptions); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var newOptions = optionsWithFont(group, options); - return buildExpressionRow(group.body, newOptions); - } -}); -// CONCATENATED MODULE: ./src/functions/underline.js - - - - - -defineFunction({ - type: "underline", - names: ["\\underline"], - props: { - numArgs: 1, - allowedInText: true - }, - handler: function handler(_ref, args) { - var parser = _ref.parser; - return { - type: "underline", - mode: parser.mode, - body: args[0] - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - // Underlines are handled in the TeXbook pg 443, Rule 10. - // Build the inner group. - var innerGroup = buildHTML_buildGroup(group.body, options); // Create the line to go below the body - - var line = buildCommon.makeLineSpan("underline-line", options); // Generate the vlist, with the appropriate kerns - - var defaultRuleThickness = options.fontMetrics().defaultRuleThickness; - var vlist = buildCommon.makeVList({ - positionType: "top", - positionData: innerGroup.height, - children: [{ - type: "kern", - size: defaultRuleThickness - }, { - type: "elem", - elem: line - }, { - type: "kern", - size: 3 * defaultRuleThickness - }, { - type: "elem", - elem: innerGroup - }] - }, options); - return buildCommon.makeSpan(["mord", "underline"], [vlist], options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var operator = new mathMLTree.MathNode("mo", [new mathMLTree.TextNode("\u203E")]); - operator.setAttribute("stretchy", "true"); - var node = new mathMLTree.MathNode("munder", [buildMathML_buildGroup(group.body, options), operator]); - node.setAttribute("accentunder", "true"); - return node; - } -}); -// CONCATENATED MODULE: ./src/functions/verb.js - - - - -defineFunction({ - type: "verb", - names: ["\\verb"], - props: { - numArgs: 0, - allowedInText: true - }, - handler: function handler(context, args, optArgs) { - // \verb and \verb* are dealt with directly in Parser.js. - // If we end up here, it's because of a failure to match the two delimiters - // in the regex in Lexer.js. LaTeX raises the following error when \verb is - // terminated by end of line (or file). - throw new src_ParseError("\\verb ended by end of line instead of matching delimiter"); - }, - htmlBuilder: function htmlBuilder(group, options) { - var text = makeVerb(group); - var body = []; // \verb enters text mode and therefore is sized like \textstyle - - var newOptions = options.havingStyle(options.style.text()); - - for (var i = 0; i < text.length; i++) { - var c = text[i]; - - if (c === '~') { - c = '\\textasciitilde'; - } - - body.push(buildCommon.makeSymbol(c, "Typewriter-Regular", group.mode, newOptions, ["mord", "texttt"])); - } - - return buildCommon.makeSpan(["mord", "text"].concat(newOptions.sizingClasses(options)), buildCommon.tryCombineChars(body), newOptions); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var text = new mathMLTree.TextNode(makeVerb(group)); - var node = new mathMLTree.MathNode("mtext", [text]); - node.setAttribute("mathvariant", "monospace"); - return node; - } -}); -/** - * Converts verb group into body string. - * - * \verb* replaces each space with an open box \u2423 - * \verb replaces each space with a no-break space \xA0 - */ - -var makeVerb = function makeVerb(group) { - return group.body.replace(/ /g, group.star ? "\u2423" : '\xA0'); -}; -// CONCATENATED MODULE: ./src/functions.js -/** Include this to ensure that all functions are defined. */ - -var functions = _functions; -/* harmony default export */ var src_functions = (functions); // TODO(kevinb): have functions return an object and call defineFunction with -// that object in this file instead of relying on side-effects. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// CONCATENATED MODULE: ./src/Lexer.js -/** - * The Lexer class handles tokenizing the input in various ways. Since our - * parser expects us to be able to backtrack, the lexer allows lexing from any - * given starting point. - * - * Its main exposed function is the `lex` function, which takes a position to - * lex from and a type of token to lex. It defers to the appropriate `_innerLex` - * function. - * - * The various `_innerLex` functions perform the actual lexing of different - * kinds. - */ - - - - -/* The following tokenRegex - * - matches typical whitespace (but not NBSP etc.) using its first group - * - does not match any control character \x00-\x1f except whitespace - * - does not match a bare backslash - * - matches any ASCII character except those just mentioned - * - does not match the BMP private use area \uE000-\uF8FF - * - does not match bare surrogate code units - * - matches any BMP character except for those just described - * - matches any valid Unicode surrogate pair - * - matches a backslash followed by one or more letters - * - matches a backslash followed by any BMP character, including newline - * Just because the Lexer matches something doesn't mean it's valid input: - * If there is no matching function or symbol definition, the Parser will - * still reject the input. - */ -var spaceRegexString = "[ \r\n\t]"; -var controlWordRegexString = "\\\\[a-zA-Z@]+"; -var controlSymbolRegexString = "\\\\[^\uD800-\uDFFF]"; -var controlWordWhitespaceRegexString = "" + controlWordRegexString + spaceRegexString + "*"; -var controlWordWhitespaceRegex = new RegExp("^(" + controlWordRegexString + ")" + spaceRegexString + "*$"); -var combiningDiacriticalMarkString = "[\u0300-\u036F]"; -var combiningDiacriticalMarksEndRegex = new RegExp(combiningDiacriticalMarkString + "+$"); -var tokenRegexString = "(" + spaceRegexString + "+)|" + // whitespace -"([!-\\[\\]-\u2027\u202A-\uD7FF\uF900-\uFFFF]" + ( // single codepoint -combiningDiacriticalMarkString + "*") + // ...plus accents -"|[\uD800-\uDBFF][\uDC00-\uDFFF]" + ( // surrogate pair -combiningDiacriticalMarkString + "*") + // ...plus accents -"|\\\\verb\\*([^]).*?\\3" + // \verb* -"|\\\\verb([^*a-zA-Z]).*?\\4" + // \verb unstarred -"|\\\\operatorname\\*" + ( // \operatorname* -"|" + controlWordWhitespaceRegexString) + ( // \macroName + spaces -"|" + controlSymbolRegexString + ")"); // \\, \', etc. - -/** Main Lexer class */ - -var Lexer_Lexer = -/*#__PURE__*/ -function () { - // category codes, only supports comment characters (14) for now - function Lexer(input, settings) { - this.input = void 0; - this.settings = void 0; - this.tokenRegex = void 0; - this.catcodes = void 0; - // Separate accents from characters - this.input = input; - this.settings = settings; - this.tokenRegex = new RegExp(tokenRegexString, 'g'); - this.catcodes = { - "%": 14 // comment character - - }; - } - - var _proto = Lexer.prototype; - - _proto.setCatcode = function setCatcode(char, code) { - this.catcodes[char] = code; - } - /** - * This function lexes a single token. - */ - ; - - _proto.lex = function lex() { - var input = this.input; - var pos = this.tokenRegex.lastIndex; - - if (pos === input.length) { - return new Token_Token("EOF", new SourceLocation(this, pos, pos)); - } - - var match = this.tokenRegex.exec(input); - - if (match === null || match.index !== pos) { - throw new src_ParseError("Unexpected character: '" + input[pos] + "'", new Token_Token(input[pos], new SourceLocation(this, pos, pos + 1))); - } - - var text = match[2] || " "; - - if (this.catcodes[text] === 14) { - // comment character - var nlIndex = input.indexOf('\n', this.tokenRegex.lastIndex); - - if (nlIndex === -1) { - this.tokenRegex.lastIndex = input.length; // EOF - - this.settings.reportNonstrict("commentAtEnd", "% comment has no terminating newline; LaTeX would " + "fail because of commenting the end of math mode (e.g. $)"); - } else { - this.tokenRegex.lastIndex = nlIndex + 1; - } - - return this.lex(); - } // Trim any trailing whitespace from control word match - - - var controlMatch = text.match(controlWordWhitespaceRegex); - - if (controlMatch) { - text = controlMatch[1]; - } - - return new Token_Token(text, new SourceLocation(this, pos, this.tokenRegex.lastIndex)); - }; - - return Lexer; -}(); - - -// CONCATENATED MODULE: ./src/Namespace.js -/** - * A `Namespace` refers to a space of nameable things like macros or lengths, - * which can be `set` either globally or local to a nested group, using an - * undo stack similar to how TeX implements this functionality. - * Performance-wise, `get` and local `set` take constant time, while global - * `set` takes time proportional to the depth of group nesting. - */ - - -var Namespace_Namespace = -/*#__PURE__*/ -function () { - /** - * Both arguments are optional. The first argument is an object of - * built-in mappings which never change. The second argument is an object - * of initial (global-level) mappings, which will constantly change - * according to any global/top-level `set`s done. - */ - function Namespace(builtins, globalMacros) { - if (builtins === void 0) { - builtins = {}; - } - - if (globalMacros === void 0) { - globalMacros = {}; - } - - this.current = void 0; - this.builtins = void 0; - this.undefStack = void 0; - this.current = globalMacros; - this.builtins = builtins; - this.undefStack = []; - } - /** - * Start a new nested group, affecting future local `set`s. - */ - - - var _proto = Namespace.prototype; - - _proto.beginGroup = function beginGroup() { - this.undefStack.push({}); - } - /** - * End current nested group, restoring values before the group began. - */ - ; - - _proto.endGroup = function endGroup() { - if (this.undefStack.length === 0) { - throw new src_ParseError("Unbalanced namespace destruction: attempt " + "to pop global namespace; please report this as a bug"); - } - - var undefs = this.undefStack.pop(); - - for (var undef in undefs) { - if (undefs.hasOwnProperty(undef)) { - if (undefs[undef] === undefined) { - delete this.current[undef]; - } else { - this.current[undef] = undefs[undef]; - } - } - } - } - /** - * Detect whether `name` has a definition. Equivalent to - * `get(name) != null`. - */ - ; - - _proto.has = function has(name) { - return this.current.hasOwnProperty(name) || this.builtins.hasOwnProperty(name); - } - /** - * Get the current value of a name, or `undefined` if there is no value. - * - * Note: Do not use `if (namespace.get(...))` to detect whether a macro - * is defined, as the definition may be the empty string which evaluates - * to `false` in JavaScript. Use `if (namespace.get(...) != null)` or - * `if (namespace.has(...))`. - */ - ; - - _proto.get = function get(name) { - if (this.current.hasOwnProperty(name)) { - return this.current[name]; - } else { - return this.builtins[name]; - } - } - /** - * Set the current value of a name, and optionally set it globally too. - * Local set() sets the current value and (when appropriate) adds an undo - * operation to the undo stack. Global set() may change the undo - * operation at every level, so takes time linear in their number. - */ - ; - - _proto.set = function set(name, value, global) { - if (global === void 0) { - global = false; - } - - if (global) { - // Global set is equivalent to setting in all groups. Simulate this - // by destroying any undos currently scheduled for this name, - // and adding an undo with the *new* value (in case it later gets - // locally reset within this environment). - for (var i = 0; i < this.undefStack.length; i++) { - delete this.undefStack[i][name]; - } - - if (this.undefStack.length > 0) { - this.undefStack[this.undefStack.length - 1][name] = value; - } - } else { - // Undo this set at end of this group (possibly to `undefined`), - // unless an undo is already in place, in which case that older - // value is the correct one. - var top = this.undefStack[this.undefStack.length - 1]; - - if (top && !top.hasOwnProperty(name)) { - top[name] = this.current[name]; - } - } - - this.current[name] = value; - }; - - return Namespace; -}(); - - -// CONCATENATED MODULE: ./src/macros.js -/** - * Predefined macros for KaTeX. - * This can be used to define some commands in terms of others. - */ - - - - - - -var builtinMacros = {}; -/* harmony default export */ var macros = (builtinMacros); // This function might one day accept an additional argument and do more things. - -function defineMacro(name, body) { - builtinMacros[name] = body; -} ////////////////////////////////////////////////////////////////////// -// macro tools - -defineMacro("\\noexpand", function (context) { - // The expansion is the token itself; but that token is interpreted - // as if its meaning were ‘\relax’ if it is a control sequence that - // would ordinarily be expanded by TeX’s expansion rules. - var t = context.popToken(); - - if (context.isExpandable(t.text)) { - t.noexpand = true; - t.treatAsRelax = true; - } - - return { - tokens: [t], - numArgs: 0 - }; -}); -defineMacro("\\expandafter", function (context) { - // TeX first reads the token that comes immediately after \expandafter, - // without expanding it; let’s call this token t. Then TeX reads the - // token that comes after t (and possibly more tokens, if that token - // has an argument), replacing it by its expansion. Finally TeX puts - // t back in front of that expansion. - var t = context.popToken(); - context.expandOnce(true); // expand only an expandable token - - return { - tokens: [t], - numArgs: 0 - }; -}); // LaTeX's \@firstoftwo{#1}{#2} expands to #1, skipping #2 -// TeX source: \long\def\@firstoftwo#1#2{#1} - -defineMacro("\\@firstoftwo", function (context) { - var args = context.consumeArgs(2); - return { - tokens: args[0], - numArgs: 0 - }; -}); // LaTeX's \@secondoftwo{#1}{#2} expands to #2, skipping #1 -// TeX source: \long\def\@secondoftwo#1#2{#2} - -defineMacro("\\@secondoftwo", function (context) { - var args = context.consumeArgs(2); - return { - tokens: args[1], - numArgs: 0 - }; -}); // LaTeX's \@ifnextchar{#1}{#2}{#3} looks ahead to the next (unexpanded) -// symbol that isn't a space, consuming any spaces but not consuming the -// first nonspace character. If that nonspace character matches #1, then -// the macro expands to #2; otherwise, it expands to #3. - -defineMacro("\\@ifnextchar", function (context) { - var args = context.consumeArgs(3); // symbol, if, else - - context.consumeSpaces(); - var nextToken = context.future(); - - if (args[0].length === 1 && args[0][0].text === nextToken.text) { - return { - tokens: args[1], - numArgs: 0 - }; - } else { - return { - tokens: args[2], - numArgs: 0 - }; - } -}); // LaTeX's \@ifstar{#1}{#2} looks ahead to the next (unexpanded) symbol. -// If it is `*`, then it consumes the symbol, and the macro expands to #1; -// otherwise, the macro expands to #2 (without consuming the symbol). -// TeX source: \def\@ifstar#1{\@ifnextchar *{\@firstoftwo{#1}}} - -defineMacro("\\@ifstar", "\\@ifnextchar *{\\@firstoftwo{#1}}"); // LaTeX's \TextOrMath{#1}{#2} expands to #1 in text mode, #2 in math mode - -defineMacro("\\TextOrMath", function (context) { - var args = context.consumeArgs(2); - - if (context.mode === 'text') { - return { - tokens: args[0], - numArgs: 0 - }; - } else { - return { - tokens: args[1], - numArgs: 0 - }; - } -}); // Lookup table for parsing numbers in base 8 through 16 - -var digitToNumber = { - "0": 0, - "1": 1, - "2": 2, - "3": 3, - "4": 4, - "5": 5, - "6": 6, - "7": 7, - "8": 8, - "9": 9, - "a": 10, - "A": 10, - "b": 11, - "B": 11, - "c": 12, - "C": 12, - "d": 13, - "D": 13, - "e": 14, - "E": 14, - "f": 15, - "F": 15 -}; // TeX \char makes a literal character (catcode 12) using the following forms: -// (see The TeXBook, p. 43) -// \char123 -- decimal -// \char'123 -- octal -// \char"123 -- hex -// \char`x -- character that can be written (i.e. isn't active) -// \char`\x -- character that cannot be written (e.g. %) -// These all refer to characters from the font, so we turn them into special -// calls to a function \@char dealt with in the Parser. - -defineMacro("\\char", function (context) { - var token = context.popToken(); - var base; - var number = ''; - - if (token.text === "'") { - base = 8; - token = context.popToken(); - } else if (token.text === '"') { - base = 16; - token = context.popToken(); - } else if (token.text === "`") { - token = context.popToken(); - - if (token.text[0] === "\\") { - number = token.text.charCodeAt(1); - } else if (token.text === "EOF") { - throw new src_ParseError("\\char` missing argument"); - } else { - number = token.text.charCodeAt(0); - } - } else { - base = 10; - } - - if (base) { - // Parse a number in the given base, starting with first `token`. - number = digitToNumber[token.text]; - - if (number == null || number >= base) { - throw new src_ParseError("Invalid base-" + base + " digit " + token.text); - } - - var digit; - - while ((digit = digitToNumber[context.future().text]) != null && digit < base) { - number *= base; - number += digit; - context.popToken(); - } - } - - return "\\@char{" + number + "}"; -}); // \newcommand{\macro}[args]{definition} -// \renewcommand{\macro}[args]{definition} -// TODO: Optional arguments: \newcommand{\macro}[args][default]{definition} - -var macros_newcommand = function newcommand(context, existsOK, nonexistsOK) { - var arg = context.consumeArgs(1)[0]; - - if (arg.length !== 1) { - throw new src_ParseError("\\newcommand's first argument must be a macro name"); - } - - var name = arg[0].text; - var exists = context.isDefined(name); - - if (exists && !existsOK) { - throw new src_ParseError("\\newcommand{" + name + "} attempting to redefine " + (name + "; use \\renewcommand")); - } - - if (!exists && !nonexistsOK) { - throw new src_ParseError("\\renewcommand{" + name + "} when command " + name + " " + "does not yet exist; use \\newcommand"); - } - - var numArgs = 0; - arg = context.consumeArgs(1)[0]; - - if (arg.length === 1 && arg[0].text === "[") { - var argText = ''; - var token = context.expandNextToken(); - - while (token.text !== "]" && token.text !== "EOF") { - // TODO: Should properly expand arg, e.g., ignore {}s - argText += token.text; - token = context.expandNextToken(); - } - - if (!argText.match(/^\s*[0-9]+\s*$/)) { - throw new src_ParseError("Invalid number of arguments: " + argText); - } - - numArgs = parseInt(argText); - arg = context.consumeArgs(1)[0]; - } // Final arg is the expansion of the macro - - - context.macros.set(name, { - tokens: arg, - numArgs: numArgs - }); - return ''; -}; - -defineMacro("\\newcommand", function (context) { - return macros_newcommand(context, false, true); -}); -defineMacro("\\renewcommand", function (context) { - return macros_newcommand(context, true, false); -}); -defineMacro("\\providecommand", function (context) { - return macros_newcommand(context, true, true); -}); // terminal (console) tools - -defineMacro("\\message", function (context) { - var arg = context.consumeArgs(1)[0]; // eslint-disable-next-line no-console - - console.log(arg.reverse().map(function (token) { - return token.text; - }).join("")); - return ''; -}); -defineMacro("\\errmessage", function (context) { - var arg = context.consumeArgs(1)[0]; // eslint-disable-next-line no-console - - console.error(arg.reverse().map(function (token) { - return token.text; - }).join("")); - return ''; -}); -defineMacro("\\show", function (context) { - var tok = context.popToken(); - var name = tok.text; // eslint-disable-next-line no-console - - console.log(tok, context.macros.get(name), src_functions[name], src_symbols.math[name], src_symbols.text[name]); - return ''; -}); ////////////////////////////////////////////////////////////////////// -// Grouping -// \let\bgroup={ \let\egroup=} - -defineMacro("\\bgroup", "{"); -defineMacro("\\egroup", "}"); // Symbols from latex.ltx: -// \def\lq{`} -// \def\rq{'} -// \def \aa {\r a} -// \def \AA {\r A} - -defineMacro("\\lq", "`"); -defineMacro("\\rq", "'"); -defineMacro("\\aa", "\\r a"); -defineMacro("\\AA", "\\r A"); // Copyright (C) and registered (R) symbols. Use raw symbol in MathML. -// \DeclareTextCommandDefault{\textcopyright}{\textcircled{c}} -// \DeclareTextCommandDefault{\textregistered}{\textcircled{% -// \check@mathfonts\fontsize\sf@size\z@\math@fontsfalse\selectfont R}} -// \DeclareRobustCommand{\copyright}{% -// \ifmmode{\nfss@text{\textcopyright}}\else\textcopyright\fi} - -defineMacro("\\textcopyright", "\\html@mathml{\\textcircled{c}}{\\char`©}"); -defineMacro("\\copyright", "\\TextOrMath{\\textcopyright}{\\text{\\textcopyright}}"); -defineMacro("\\textregistered", "\\html@mathml{\\textcircled{\\scriptsize R}}{\\char`®}"); // Characters omitted from Unicode range 1D400–1D7FF - -defineMacro("\u212C", "\\mathscr{B}"); // script - -defineMacro("\u2130", "\\mathscr{E}"); -defineMacro("\u2131", "\\mathscr{F}"); -defineMacro("\u210B", "\\mathscr{H}"); -defineMacro("\u2110", "\\mathscr{I}"); -defineMacro("\u2112", "\\mathscr{L}"); -defineMacro("\u2133", "\\mathscr{M}"); -defineMacro("\u211B", "\\mathscr{R}"); -defineMacro("\u212D", "\\mathfrak{C}"); // Fraktur - -defineMacro("\u210C", "\\mathfrak{H}"); -defineMacro("\u2128", "\\mathfrak{Z}"); // Define \Bbbk with a macro that works in both HTML and MathML. - -defineMacro("\\Bbbk", "\\Bbb{k}"); // Unicode middle dot -// The KaTeX fonts do not contain U+00B7. Instead, \cdotp displays -// the dot at U+22C5 and gives it punct spacing. - -defineMacro("\xB7", "\\cdotp"); // \llap and \rlap render their contents in text mode - -defineMacro("\\llap", "\\mathllap{\\textrm{#1}}"); -defineMacro("\\rlap", "\\mathrlap{\\textrm{#1}}"); -defineMacro("\\clap", "\\mathclap{\\textrm{#1}}"); // \not is defined by base/fontmath.ltx via -// \DeclareMathSymbol{\not}{\mathrel}{symbols}{"36} -// It's thus treated like a \mathrel, but defined by a symbol that has zero -// width but extends to the right. We use \rlap to get that spacing. -// For MathML we write U+0338 here. buildMathML.js will then do the overlay. - -defineMacro("\\not", '\\html@mathml{\\mathrel{\\mathrlap\\@not}}{\\char"338}'); // Negated symbols from base/fontmath.ltx: -// \def\neq{\not=} \let\ne=\neq -// \DeclareRobustCommand -// \notin{\mathrel{\m@th\mathpalette\c@ncel\in}} -// \def\c@ncel#1#2{\m@th\ooalign{$\hfil#1\mkern1mu/\hfil$\crcr$#1#2$}} - -defineMacro("\\neq", "\\html@mathml{\\mathrel{\\not=}}{\\mathrel{\\char`≠}}"); -defineMacro("\\ne", "\\neq"); -defineMacro("\u2260", "\\neq"); -defineMacro("\\notin", "\\html@mathml{\\mathrel{{\\in}\\mathllap{/\\mskip1mu}}}" + "{\\mathrel{\\char`∉}}"); -defineMacro("\u2209", "\\notin"); // Unicode stacked relations - -defineMacro("\u2258", "\\html@mathml{" + "\\mathrel{=\\kern{-1em}\\raisebox{0.4em}{$\\scriptsize\\frown$}}" + "}{\\mathrel{\\char`\u2258}}"); -defineMacro("\u2259", "\\html@mathml{\\stackrel{\\tiny\\wedge}{=}}{\\mathrel{\\char`\u2258}}"); -defineMacro("\u225A", "\\html@mathml{\\stackrel{\\tiny\\vee}{=}}{\\mathrel{\\char`\u225A}}"); -defineMacro("\u225B", "\\html@mathml{\\stackrel{\\scriptsize\\star}{=}}" + "{\\mathrel{\\char`\u225B}}"); -defineMacro("\u225D", "\\html@mathml{\\stackrel{\\tiny\\mathrm{def}}{=}}" + "{\\mathrel{\\char`\u225D}}"); -defineMacro("\u225E", "\\html@mathml{\\stackrel{\\tiny\\mathrm{m}}{=}}" + "{\\mathrel{\\char`\u225E}}"); -defineMacro("\u225F", "\\html@mathml{\\stackrel{\\tiny?}{=}}{\\mathrel{\\char`\u225F}}"); // Misc Unicode - -defineMacro("\u27C2", "\\perp"); -defineMacro("\u203C", "\\mathclose{!\\mkern-0.8mu!}"); -defineMacro("\u220C", "\\notni"); -defineMacro("\u231C", "\\ulcorner"); -defineMacro("\u231D", "\\urcorner"); -defineMacro("\u231E", "\\llcorner"); -defineMacro("\u231F", "\\lrcorner"); -defineMacro("\xA9", "\\copyright"); -defineMacro("\xAE", "\\textregistered"); -defineMacro("\uFE0F", "\\textregistered"); // The KaTeX fonts have corners at codepoints that don't match Unicode. -// For MathML purposes, use the Unicode code point. - -defineMacro("\\ulcorner", "\\html@mathml{\\@ulcorner}{\\mathop{\\char\"231c}}"); -defineMacro("\\urcorner", "\\html@mathml{\\@urcorner}{\\mathop{\\char\"231d}}"); -defineMacro("\\llcorner", "\\html@mathml{\\@llcorner}{\\mathop{\\char\"231e}}"); -defineMacro("\\lrcorner", "\\html@mathml{\\@lrcorner}{\\mathop{\\char\"231f}}"); ////////////////////////////////////////////////////////////////////// -// LaTeX_2ε -// \vdots{\vbox{\baselineskip4\p@ \lineskiplimit\z@ -// \kern6\p@\hbox{.}\hbox{.}\hbox{.}}} -// We'll call \varvdots, which gets a glyph from symbols.js. -// The zero-width rule gets us an equivalent to the vertical 6pt kern. - -defineMacro("\\vdots", "\\mathord{\\varvdots\\rule{0pt}{15pt}}"); -defineMacro("\u22EE", "\\vdots"); ////////////////////////////////////////////////////////////////////// -// amsmath.sty -// http://mirrors.concertpass.com/tex-archive/macros/latex/required/amsmath/amsmath.pdf -// Italic Greek capital letters. AMS defines these with \DeclareMathSymbol, -// but they are equivalent to \mathit{\Letter}. - -defineMacro("\\varGamma", "\\mathit{\\Gamma}"); -defineMacro("\\varDelta", "\\mathit{\\Delta}"); -defineMacro("\\varTheta", "\\mathit{\\Theta}"); -defineMacro("\\varLambda", "\\mathit{\\Lambda}"); -defineMacro("\\varXi", "\\mathit{\\Xi}"); -defineMacro("\\varPi", "\\mathit{\\Pi}"); -defineMacro("\\varSigma", "\\mathit{\\Sigma}"); -defineMacro("\\varUpsilon", "\\mathit{\\Upsilon}"); -defineMacro("\\varPhi", "\\mathit{\\Phi}"); -defineMacro("\\varPsi", "\\mathit{\\Psi}"); -defineMacro("\\varOmega", "\\mathit{\\Omega}"); //\newcommand{\substack}[1]{\subarray{c}#1\endsubarray} - -defineMacro("\\substack", "\\begin{subarray}{c}#1\\end{subarray}"); // \renewcommand{\colon}{\nobreak\mskip2mu\mathpunct{}\nonscript -// \mkern-\thinmuskip{:}\mskip6muplus1mu\relax} - -defineMacro("\\colon", "\\nobreak\\mskip2mu\\mathpunct{}" + "\\mathchoice{\\mkern-3mu}{\\mkern-3mu}{}{}{:}\\mskip6mu"); // \newcommand{\boxed}[1]{\fbox{\m@th$\displaystyle#1$}} - -defineMacro("\\boxed", "\\fbox{$\\displaystyle{#1}$}"); // \def\iff{\DOTSB\;\Longleftrightarrow\;} -// \def\implies{\DOTSB\;\Longrightarrow\;} -// \def\impliedby{\DOTSB\;\Longleftarrow\;} - -defineMacro("\\iff", "\\DOTSB\\;\\Longleftrightarrow\\;"); -defineMacro("\\implies", "\\DOTSB\\;\\Longrightarrow\\;"); -defineMacro("\\impliedby", "\\DOTSB\\;\\Longleftarrow\\;"); // AMSMath's automatic \dots, based on \mdots@@ macro. - -var dotsByToken = { - ',': '\\dotsc', - '\\not': '\\dotsb', - // \keybin@ checks for the following: - '+': '\\dotsb', - '=': '\\dotsb', - '<': '\\dotsb', - '>': '\\dotsb', - '-': '\\dotsb', - '*': '\\dotsb', - ':': '\\dotsb', - // Symbols whose definition starts with \DOTSB: - '\\DOTSB': '\\dotsb', - '\\coprod': '\\dotsb', - '\\bigvee': '\\dotsb', - '\\bigwedge': '\\dotsb', - '\\biguplus': '\\dotsb', - '\\bigcap': '\\dotsb', - '\\bigcup': '\\dotsb', - '\\prod': '\\dotsb', - '\\sum': '\\dotsb', - '\\bigotimes': '\\dotsb', - '\\bigoplus': '\\dotsb', - '\\bigodot': '\\dotsb', - '\\bigsqcup': '\\dotsb', - '\\And': '\\dotsb', - '\\longrightarrow': '\\dotsb', - '\\Longrightarrow': '\\dotsb', - '\\longleftarrow': '\\dotsb', - '\\Longleftarrow': '\\dotsb', - '\\longleftrightarrow': '\\dotsb', - '\\Longleftrightarrow': '\\dotsb', - '\\mapsto': '\\dotsb', - '\\longmapsto': '\\dotsb', - '\\hookrightarrow': '\\dotsb', - '\\doteq': '\\dotsb', - // Symbols whose definition starts with \mathbin: - '\\mathbin': '\\dotsb', - // Symbols whose definition starts with \mathrel: - '\\mathrel': '\\dotsb', - '\\relbar': '\\dotsb', - '\\Relbar': '\\dotsb', - '\\xrightarrow': '\\dotsb', - '\\xleftarrow': '\\dotsb', - // Symbols whose definition starts with \DOTSI: - '\\DOTSI': '\\dotsi', - '\\int': '\\dotsi', - '\\oint': '\\dotsi', - '\\iint': '\\dotsi', - '\\iiint': '\\dotsi', - '\\iiiint': '\\dotsi', - '\\idotsint': '\\dotsi', - // Symbols whose definition starts with \DOTSX: - '\\DOTSX': '\\dotsx' -}; -defineMacro("\\dots", function (context) { - // TODO: If used in text mode, should expand to \textellipsis. - // However, in KaTeX, \textellipsis and \ldots behave the same - // (in text mode), and it's unlikely we'd see any of the math commands - // that affect the behavior of \dots when in text mode. So fine for now - // (until we support \ifmmode ... \else ... \fi). - var thedots = '\\dotso'; - var next = context.expandAfterFuture().text; - - if (next in dotsByToken) { - thedots = dotsByToken[next]; - } else if (next.substr(0, 4) === '\\not') { - thedots = '\\dotsb'; - } else if (next in src_symbols.math) { - if (utils.contains(['bin', 'rel'], src_symbols.math[next].group)) { - thedots = '\\dotsb'; - } - } - - return thedots; -}); -var spaceAfterDots = { - // \rightdelim@ checks for the following: - ')': true, - ']': true, - '\\rbrack': true, - '\\}': true, - '\\rbrace': true, - '\\rangle': true, - '\\rceil': true, - '\\rfloor': true, - '\\rgroup': true, - '\\rmoustache': true, - '\\right': true, - '\\bigr': true, - '\\biggr': true, - '\\Bigr': true, - '\\Biggr': true, - // \extra@ also tests for the following: - '$': true, - // \extrap@ checks for the following: - ';': true, - '.': true, - ',': true -}; -defineMacro("\\dotso", function (context) { - var next = context.future().text; - - if (next in spaceAfterDots) { - return "\\ldots\\,"; - } else { - return "\\ldots"; - } -}); -defineMacro("\\dotsc", function (context) { - var next = context.future().text; // \dotsc uses \extra@ but not \extrap@, instead specially checking for - // ';' and '.', but doesn't check for ','. - - if (next in spaceAfterDots && next !== ',') { - return "\\ldots\\,"; - } else { - return "\\ldots"; - } -}); -defineMacro("\\cdots", function (context) { - var next = context.future().text; - - if (next in spaceAfterDots) { - return "\\@cdots\\,"; - } else { - return "\\@cdots"; - } -}); -defineMacro("\\dotsb", "\\cdots"); -defineMacro("\\dotsm", "\\cdots"); -defineMacro("\\dotsi", "\\!\\cdots"); // amsmath doesn't actually define \dotsx, but \dots followed by a macro -// starting with \DOTSX implies \dotso, and then \extra@ detects this case -// and forces the added `\,`. - -defineMacro("\\dotsx", "\\ldots\\,"); // \let\DOTSI\relax -// \let\DOTSB\relax -// \let\DOTSX\relax - -defineMacro("\\DOTSI", "\\relax"); -defineMacro("\\DOTSB", "\\relax"); -defineMacro("\\DOTSX", "\\relax"); // Spacing, based on amsmath.sty's override of LaTeX defaults -// \DeclareRobustCommand{\tmspace}[3]{% -// \ifmmode\mskip#1#2\else\kern#1#3\fi\relax} - -defineMacro("\\tmspace", "\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax"); // \renewcommand{\,}{\tmspace+\thinmuskip{.1667em}} -// TODO: math mode should use \thinmuskip - -defineMacro("\\,", "\\tmspace+{3mu}{.1667em}"); // \let\thinspace\, - -defineMacro("\\thinspace", "\\,"); // \def\>{\mskip\medmuskip} -// \renewcommand{\:}{\tmspace+\medmuskip{.2222em}} -// TODO: \> and math mode of \: should use \medmuskip = 4mu plus 2mu minus 4mu - -defineMacro("\\>", "\\mskip{4mu}"); -defineMacro("\\:", "\\tmspace+{4mu}{.2222em}"); // \let\medspace\: - -defineMacro("\\medspace", "\\:"); // \renewcommand{\;}{\tmspace+\thickmuskip{.2777em}} -// TODO: math mode should use \thickmuskip = 5mu plus 5mu - -defineMacro("\\;", "\\tmspace+{5mu}{.2777em}"); // \let\thickspace\; - -defineMacro("\\thickspace", "\\;"); // \renewcommand{\!}{\tmspace-\thinmuskip{.1667em}} -// TODO: math mode should use \thinmuskip - -defineMacro("\\!", "\\tmspace-{3mu}{.1667em}"); // \let\negthinspace\! - -defineMacro("\\negthinspace", "\\!"); // \newcommand{\negmedspace}{\tmspace-\medmuskip{.2222em}} -// TODO: math mode should use \medmuskip - -defineMacro("\\negmedspace", "\\tmspace-{4mu}{.2222em}"); // \newcommand{\negthickspace}{\tmspace-\thickmuskip{.2777em}} -// TODO: math mode should use \thickmuskip - -defineMacro("\\negthickspace", "\\tmspace-{5mu}{.277em}"); // \def\enspace{\kern.5em } - -defineMacro("\\enspace", "\\kern.5em "); // \def\enskip{\hskip.5em\relax} - -defineMacro("\\enskip", "\\hskip.5em\\relax"); // \def\quad{\hskip1em\relax} - -defineMacro("\\quad", "\\hskip1em\\relax"); // \def\qquad{\hskip2em\relax} - -defineMacro("\\qquad", "\\hskip2em\\relax"); // \tag@in@display form of \tag - -defineMacro("\\tag", "\\@ifstar\\tag@literal\\tag@paren"); -defineMacro("\\tag@paren", "\\tag@literal{({#1})}"); -defineMacro("\\tag@literal", function (context) { - if (context.macros.get("\\df@tag")) { - throw new src_ParseError("Multiple \\tag"); - } - - return "\\gdef\\df@tag{\\text{#1}}"; -}); // \renewcommand{\bmod}{\nonscript\mskip-\medmuskip\mkern5mu\mathbin -// {\operator@font mod}\penalty900 -// \mkern5mu\nonscript\mskip-\medmuskip} -// \newcommand{\pod}[1]{\allowbreak -// \if@display\mkern18mu\else\mkern8mu\fi(#1)} -// \renewcommand{\pmod}[1]{\pod{{\operator@font mod}\mkern6mu#1}} -// \newcommand{\mod}[1]{\allowbreak\if@display\mkern18mu -// \else\mkern12mu\fi{\operator@font mod}\,\,#1} -// TODO: math mode should use \medmuskip = 4mu plus 2mu minus 4mu - -defineMacro("\\bmod", "\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}" + "\\mathbin{\\rm mod}" + "\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}"); -defineMacro("\\pod", "\\allowbreak" + "\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)"); -defineMacro("\\pmod", "\\pod{{\\rm mod}\\mkern6mu#1}"); -defineMacro("\\mod", "\\allowbreak" + "\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}" + "{\\rm mod}\\,\\,#1"); // \pmb -- A simulation of bold. -// The version in ambsy.sty works by typesetting three copies of the argument -// with small offsets. We use two copies. We omit the vertical offset because -// of rendering problems that makeVList encounters in Safari. - -defineMacro("\\pmb", "\\html@mathml{" + "\\@binrel{#1}{\\mathrlap{#1}\\kern0.5px#1}}" + "{\\mathbf{#1}}"); ////////////////////////////////////////////////////////////////////// -// LaTeX source2e -// \\ defaults to \newline, but changes to \cr within array environment - -defineMacro("\\\\", "\\newline"); // \def\TeX{T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX\@} -// TODO: Doesn't normally work in math mode because \@ fails. KaTeX doesn't -// support \@ yet, so that's omitted, and we add \text so that the result -// doesn't look funny in math mode. - -defineMacro("\\TeX", "\\textrm{\\html@mathml{" + "T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX" + "}{TeX}}"); // \DeclareRobustCommand{\LaTeX}{L\kern-.36em% -// {\sbox\z@ T% -// \vbox to\ht\z@{\hbox{\check@mathfonts -// \fontsize\sf@size\z@ -// \math@fontsfalse\selectfont -// A}% -// \vss}% -// }% -// \kern-.15em% -// \TeX} -// This code aligns the top of the A with the T (from the perspective of TeX's -// boxes, though visually the A appears to extend above slightly). -// We compute the corresponding \raisebox when A is rendered in \normalsize -// \scriptstyle, which has a scale factor of 0.7 (see Options.js). - -var latexRaiseA = fontMetricsData['Main-Regular']["T".charCodeAt(0)][1] - 0.7 * fontMetricsData['Main-Regular']["A".charCodeAt(0)][1] + "em"; -defineMacro("\\LaTeX", "\\textrm{\\html@mathml{" + ("L\\kern-.36em\\raisebox{" + latexRaiseA + "}{\\scriptstyle A}") + "\\kern-.15em\\TeX}{LaTeX}}"); // New KaTeX logo based on tweaking LaTeX logo - -defineMacro("\\KaTeX", "\\textrm{\\html@mathml{" + ("K\\kern-.17em\\raisebox{" + latexRaiseA + "}{\\scriptstyle A}") + "\\kern-.15em\\TeX}{KaTeX}}"); // \DeclareRobustCommand\hspace{\@ifstar\@hspacer\@hspace} -// \def\@hspace#1{\hskip #1\relax} -// \def\@hspacer#1{\vrule \@width\z@\nobreak -// \hskip #1\hskip \z@skip} - -defineMacro("\\hspace", "\\@ifstar\\@hspacer\\@hspace"); -defineMacro("\\@hspace", "\\hskip #1\\relax"); -defineMacro("\\@hspacer", "\\rule{0pt}{0pt}\\hskip #1\\relax"); ////////////////////////////////////////////////////////////////////// -// mathtools.sty -//\providecommand\ordinarycolon{:} - -defineMacro("\\ordinarycolon", ":"); //\def\vcentcolon{\mathrel{\mathop\ordinarycolon}} -//TODO(edemaine): Not yet centered. Fix via \raisebox or #726 - -defineMacro("\\vcentcolon", "\\mathrel{\\mathop\\ordinarycolon}"); // \providecommand*\dblcolon{\vcentcolon\mathrel{\mkern-.9mu}\vcentcolon} - -defineMacro("\\dblcolon", "\\html@mathml{" + "\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}" + "{\\mathop{\\char\"2237}}"); // \providecommand*\coloneqq{\vcentcolon\mathrel{\mkern-1.2mu}=} - -defineMacro("\\coloneqq", "\\html@mathml{" + "\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}" + "{\\mathop{\\char\"2254}}"); // ≔ -// \providecommand*\Coloneqq{\dblcolon\mathrel{\mkern-1.2mu}=} - -defineMacro("\\Coloneqq", "\\html@mathml{" + "\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}" + "{\\mathop{\\char\"2237\\char\"3d}}"); // \providecommand*\coloneq{\vcentcolon\mathrel{\mkern-1.2mu}\mathrel{-}} - -defineMacro("\\coloneq", "\\html@mathml{" + "\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}" + "{\\mathop{\\char\"3a\\char\"2212}}"); // \providecommand*\Coloneq{\dblcolon\mathrel{\mkern-1.2mu}\mathrel{-}} - -defineMacro("\\Coloneq", "\\html@mathml{" + "\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}" + "{\\mathop{\\char\"2237\\char\"2212}}"); // \providecommand*\eqqcolon{=\mathrel{\mkern-1.2mu}\vcentcolon} - -defineMacro("\\eqqcolon", "\\html@mathml{" + "\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}" + "{\\mathop{\\char\"2255}}"); // ≕ -// \providecommand*\Eqqcolon{=\mathrel{\mkern-1.2mu}\dblcolon} - -defineMacro("\\Eqqcolon", "\\html@mathml{" + "\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}" + "{\\mathop{\\char\"3d\\char\"2237}}"); // \providecommand*\eqcolon{\mathrel{-}\mathrel{\mkern-1.2mu}\vcentcolon} - -defineMacro("\\eqcolon", "\\html@mathml{" + "\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}" + "{\\mathop{\\char\"2239}}"); // \providecommand*\Eqcolon{\mathrel{-}\mathrel{\mkern-1.2mu}\dblcolon} - -defineMacro("\\Eqcolon", "\\html@mathml{" + "\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}" + "{\\mathop{\\char\"2212\\char\"2237}}"); // \providecommand*\colonapprox{\vcentcolon\mathrel{\mkern-1.2mu}\approx} - -defineMacro("\\colonapprox", "\\html@mathml{" + "\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}" + "{\\mathop{\\char\"3a\\char\"2248}}"); // \providecommand*\Colonapprox{\dblcolon\mathrel{\mkern-1.2mu}\approx} - -defineMacro("\\Colonapprox", "\\html@mathml{" + "\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}" + "{\\mathop{\\char\"2237\\char\"2248}}"); // \providecommand*\colonsim{\vcentcolon\mathrel{\mkern-1.2mu}\sim} - -defineMacro("\\colonsim", "\\html@mathml{" + "\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}" + "{\\mathop{\\char\"3a\\char\"223c}}"); // \providecommand*\Colonsim{\dblcolon\mathrel{\mkern-1.2mu}\sim} - -defineMacro("\\Colonsim", "\\html@mathml{" + "\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}" + "{\\mathop{\\char\"2237\\char\"223c}}"); // Some Unicode characters are implemented with macros to mathtools functions. - -defineMacro("\u2237", "\\dblcolon"); // :: - -defineMacro("\u2239", "\\eqcolon"); // -: - -defineMacro("\u2254", "\\coloneqq"); // := - -defineMacro("\u2255", "\\eqqcolon"); // =: - -defineMacro("\u2A74", "\\Coloneqq"); // ::= -////////////////////////////////////////////////////////////////////// -// colonequals.sty -// Alternate names for mathtools's macros: - -defineMacro("\\ratio", "\\vcentcolon"); -defineMacro("\\coloncolon", "\\dblcolon"); -defineMacro("\\colonequals", "\\coloneqq"); -defineMacro("\\coloncolonequals", "\\Coloneqq"); -defineMacro("\\equalscolon", "\\eqqcolon"); -defineMacro("\\equalscoloncolon", "\\Eqqcolon"); -defineMacro("\\colonminus", "\\coloneq"); -defineMacro("\\coloncolonminus", "\\Coloneq"); -defineMacro("\\minuscolon", "\\eqcolon"); -defineMacro("\\minuscoloncolon", "\\Eqcolon"); // \colonapprox name is same in mathtools and colonequals. - -defineMacro("\\coloncolonapprox", "\\Colonapprox"); // \colonsim name is same in mathtools and colonequals. - -defineMacro("\\coloncolonsim", "\\Colonsim"); // Additional macros, implemented by analogy with mathtools definitions: - -defineMacro("\\simcolon", "\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}"); -defineMacro("\\simcoloncolon", "\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}"); -defineMacro("\\approxcolon", "\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}"); -defineMacro("\\approxcoloncolon", "\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}"); // Present in newtxmath, pxfonts and txfonts - -defineMacro("\\notni", "\\html@mathml{\\not\\ni}{\\mathrel{\\char`\u220C}}"); -defineMacro("\\limsup", "\\DOTSB\\operatorname*{lim\\,sup}"); -defineMacro("\\liminf", "\\DOTSB\\operatorname*{lim\\,inf}"); ////////////////////////////////////////////////////////////////////// -// MathML alternates for KaTeX glyphs in the Unicode private area - -defineMacro("\\gvertneqq", "\\html@mathml{\\@gvertneqq}{\u2269}"); -defineMacro("\\lvertneqq", "\\html@mathml{\\@lvertneqq}{\u2268}"); -defineMacro("\\ngeqq", "\\html@mathml{\\@ngeqq}{\u2271}"); -defineMacro("\\ngeqslant", "\\html@mathml{\\@ngeqslant}{\u2271}"); -defineMacro("\\nleqq", "\\html@mathml{\\@nleqq}{\u2270}"); -defineMacro("\\nleqslant", "\\html@mathml{\\@nleqslant}{\u2270}"); -defineMacro("\\nshortmid", "\\html@mathml{\\@nshortmid}{∤}"); -defineMacro("\\nshortparallel", "\\html@mathml{\\@nshortparallel}{∦}"); -defineMacro("\\nsubseteqq", "\\html@mathml{\\@nsubseteqq}{\u2288}"); -defineMacro("\\nsupseteqq", "\\html@mathml{\\@nsupseteqq}{\u2289}"); -defineMacro("\\varsubsetneq", "\\html@mathml{\\@varsubsetneq}{⊊}"); -defineMacro("\\varsubsetneqq", "\\html@mathml{\\@varsubsetneqq}{⫋}"); -defineMacro("\\varsupsetneq", "\\html@mathml{\\@varsupsetneq}{⊋}"); -defineMacro("\\varsupsetneqq", "\\html@mathml{\\@varsupsetneqq}{⫌}"); -defineMacro("\\imath", "\\html@mathml{\\@imath}{\u0131}"); -defineMacro("\\jmath", "\\html@mathml{\\@jmath}{\u0237}"); ////////////////////////////////////////////////////////////////////// -// stmaryrd and semantic -// The stmaryrd and semantic packages render the next four items by calling a -// glyph. Those glyphs do not exist in the KaTeX fonts. Hence the macros. - -defineMacro("\\llbracket", "\\html@mathml{" + "\\mathopen{[\\mkern-3.2mu[}}" + "{\\mathopen{\\char`\u27E6}}"); -defineMacro("\\rrbracket", "\\html@mathml{" + "\\mathclose{]\\mkern-3.2mu]}}" + "{\\mathclose{\\char`\u27E7}}"); -defineMacro("\u27E6", "\\llbracket"); // blackboard bold [ - -defineMacro("\u27E7", "\\rrbracket"); // blackboard bold ] - -defineMacro("\\lBrace", "\\html@mathml{" + "\\mathopen{\\{\\mkern-3.2mu[}}" + "{\\mathopen{\\char`\u2983}}"); -defineMacro("\\rBrace", "\\html@mathml{" + "\\mathclose{]\\mkern-3.2mu\\}}}" + "{\\mathclose{\\char`\u2984}}"); -defineMacro("\u2983", "\\lBrace"); // blackboard bold { - -defineMacro("\u2984", "\\rBrace"); // blackboard bold } -// TODO: Create variable sized versions of the last two items. I believe that -// will require new font glyphs. -// The stmaryrd function `\minuso` provides a "Plimsoll" symbol that -// superimposes the characters \circ and \mathminus. Used in chemistry. - -defineMacro("\\minuso", "\\mathbin{\\html@mathml{" + "{\\mathrlap{\\mathchoice{\\kern{0.145em}}{\\kern{0.145em}}" + "{\\kern{0.1015em}}{\\kern{0.0725em}}\\circ}{-}}}" + "{\\char`⦵}}"); -defineMacro("⦵", "\\minuso"); ////////////////////////////////////////////////////////////////////// -// texvc.sty -// The texvc package contains macros available in mediawiki pages. -// We omit the functions deprecated at -// https://en.wikipedia.org/wiki/Help:Displaying_a_formula#Deprecated_syntax -// We also omit texvc's \O, which conflicts with \text{\O} - -defineMacro("\\darr", "\\downarrow"); -defineMacro("\\dArr", "\\Downarrow"); -defineMacro("\\Darr", "\\Downarrow"); -defineMacro("\\lang", "\\langle"); -defineMacro("\\rang", "\\rangle"); -defineMacro("\\uarr", "\\uparrow"); -defineMacro("\\uArr", "\\Uparrow"); -defineMacro("\\Uarr", "\\Uparrow"); -defineMacro("\\N", "\\mathbb{N}"); -defineMacro("\\R", "\\mathbb{R}"); -defineMacro("\\Z", "\\mathbb{Z}"); -defineMacro("\\alef", "\\aleph"); -defineMacro("\\alefsym", "\\aleph"); -defineMacro("\\Alpha", "\\mathrm{A}"); -defineMacro("\\Beta", "\\mathrm{B}"); -defineMacro("\\bull", "\\bullet"); -defineMacro("\\Chi", "\\mathrm{X}"); -defineMacro("\\clubs", "\\clubsuit"); -defineMacro("\\cnums", "\\mathbb{C}"); -defineMacro("\\Complex", "\\mathbb{C}"); -defineMacro("\\Dagger", "\\ddagger"); -defineMacro("\\diamonds", "\\diamondsuit"); -defineMacro("\\empty", "\\emptyset"); -defineMacro("\\Epsilon", "\\mathrm{E}"); -defineMacro("\\Eta", "\\mathrm{H}"); -defineMacro("\\exist", "\\exists"); -defineMacro("\\harr", "\\leftrightarrow"); -defineMacro("\\hArr", "\\Leftrightarrow"); -defineMacro("\\Harr", "\\Leftrightarrow"); -defineMacro("\\hearts", "\\heartsuit"); -defineMacro("\\image", "\\Im"); -defineMacro("\\infin", "\\infty"); -defineMacro("\\Iota", "\\mathrm{I}"); -defineMacro("\\isin", "\\in"); -defineMacro("\\Kappa", "\\mathrm{K}"); -defineMacro("\\larr", "\\leftarrow"); -defineMacro("\\lArr", "\\Leftarrow"); -defineMacro("\\Larr", "\\Leftarrow"); -defineMacro("\\lrarr", "\\leftrightarrow"); -defineMacro("\\lrArr", "\\Leftrightarrow"); -defineMacro("\\Lrarr", "\\Leftrightarrow"); -defineMacro("\\Mu", "\\mathrm{M}"); -defineMacro("\\natnums", "\\mathbb{N}"); -defineMacro("\\Nu", "\\mathrm{N}"); -defineMacro("\\Omicron", "\\mathrm{O}"); -defineMacro("\\plusmn", "\\pm"); -defineMacro("\\rarr", "\\rightarrow"); -defineMacro("\\rArr", "\\Rightarrow"); -defineMacro("\\Rarr", "\\Rightarrow"); -defineMacro("\\real", "\\Re"); -defineMacro("\\reals", "\\mathbb{R}"); -defineMacro("\\Reals", "\\mathbb{R}"); -defineMacro("\\Rho", "\\mathrm{P}"); -defineMacro("\\sdot", "\\cdot"); -defineMacro("\\sect", "\\S"); -defineMacro("\\spades", "\\spadesuit"); -defineMacro("\\sub", "\\subset"); -defineMacro("\\sube", "\\subseteq"); -defineMacro("\\supe", "\\supseteq"); -defineMacro("\\Tau", "\\mathrm{T}"); -defineMacro("\\thetasym", "\\vartheta"); // TODO: defineMacro("\\varcoppa", "\\\mbox{\\coppa}"); - -defineMacro("\\weierp", "\\wp"); -defineMacro("\\Zeta", "\\mathrm{Z}"); ////////////////////////////////////////////////////////////////////// -// statmath.sty -// https://ctan.math.illinois.edu/macros/latex/contrib/statmath/statmath.pdf - -defineMacro("\\argmin", "\\DOTSB\\operatorname*{arg\\,min}"); -defineMacro("\\argmax", "\\DOTSB\\operatorname*{arg\\,max}"); -defineMacro("\\plim", "\\DOTSB\\mathop{\\operatorname{plim}}\\limits"); ////////////////////////////////////////////////////////////////////// -// braket.sty -// http://ctan.math.washington.edu/tex-archive/macros/latex/contrib/braket/braket.pdf - -defineMacro("\\bra", "\\mathinner{\\langle{#1}|}"); -defineMacro("\\ket", "\\mathinner{|{#1}\\rangle}"); -defineMacro("\\braket", "\\mathinner{\\langle{#1}\\rangle}"); -defineMacro("\\Bra", "\\left\\langle#1\\right|"); -defineMacro("\\Ket", "\\left|#1\\right\\rangle"); // Custom Khan Academy colors, should be moved to an optional package - -defineMacro("\\blue", "\\textcolor{##6495ed}{#1}"); -defineMacro("\\orange", "\\textcolor{##ffa500}{#1}"); -defineMacro("\\pink", "\\textcolor{##ff00af}{#1}"); -defineMacro("\\red", "\\textcolor{##df0030}{#1}"); -defineMacro("\\green", "\\textcolor{##28ae7b}{#1}"); -defineMacro("\\gray", "\\textcolor{gray}{#1}"); -defineMacro("\\purple", "\\textcolor{##9d38bd}{#1}"); -defineMacro("\\blueA", "\\textcolor{##ccfaff}{#1}"); -defineMacro("\\blueB", "\\textcolor{##80f6ff}{#1}"); -defineMacro("\\blueC", "\\textcolor{##63d9ea}{#1}"); -defineMacro("\\blueD", "\\textcolor{##11accd}{#1}"); -defineMacro("\\blueE", "\\textcolor{##0c7f99}{#1}"); -defineMacro("\\tealA", "\\textcolor{##94fff5}{#1}"); -defineMacro("\\tealB", "\\textcolor{##26edd5}{#1}"); -defineMacro("\\tealC", "\\textcolor{##01d1c1}{#1}"); -defineMacro("\\tealD", "\\textcolor{##01a995}{#1}"); -defineMacro("\\tealE", "\\textcolor{##208170}{#1}"); -defineMacro("\\greenA", "\\textcolor{##b6ffb0}{#1}"); -defineMacro("\\greenB", "\\textcolor{##8af281}{#1}"); -defineMacro("\\greenC", "\\textcolor{##74cf70}{#1}"); -defineMacro("\\greenD", "\\textcolor{##1fab54}{#1}"); -defineMacro("\\greenE", "\\textcolor{##0d923f}{#1}"); -defineMacro("\\goldA", "\\textcolor{##ffd0a9}{#1}"); -defineMacro("\\goldB", "\\textcolor{##ffbb71}{#1}"); -defineMacro("\\goldC", "\\textcolor{##ff9c39}{#1}"); -defineMacro("\\goldD", "\\textcolor{##e07d10}{#1}"); -defineMacro("\\goldE", "\\textcolor{##a75a05}{#1}"); -defineMacro("\\redA", "\\textcolor{##fca9a9}{#1}"); -defineMacro("\\redB", "\\textcolor{##ff8482}{#1}"); -defineMacro("\\redC", "\\textcolor{##f9685d}{#1}"); -defineMacro("\\redD", "\\textcolor{##e84d39}{#1}"); -defineMacro("\\redE", "\\textcolor{##bc2612}{#1}"); -defineMacro("\\maroonA", "\\textcolor{##ffbde0}{#1}"); -defineMacro("\\maroonB", "\\textcolor{##ff92c6}{#1}"); -defineMacro("\\maroonC", "\\textcolor{##ed5fa6}{#1}"); -defineMacro("\\maroonD", "\\textcolor{##ca337c}{#1}"); -defineMacro("\\maroonE", "\\textcolor{##9e034e}{#1}"); -defineMacro("\\purpleA", "\\textcolor{##ddd7ff}{#1}"); -defineMacro("\\purpleB", "\\textcolor{##c6b9fc}{#1}"); -defineMacro("\\purpleC", "\\textcolor{##aa87ff}{#1}"); -defineMacro("\\purpleD", "\\textcolor{##7854ab}{#1}"); -defineMacro("\\purpleE", "\\textcolor{##543b78}{#1}"); -defineMacro("\\mintA", "\\textcolor{##f5f9e8}{#1}"); -defineMacro("\\mintB", "\\textcolor{##edf2df}{#1}"); -defineMacro("\\mintC", "\\textcolor{##e0e5cc}{#1}"); -defineMacro("\\grayA", "\\textcolor{##f6f7f7}{#1}"); -defineMacro("\\grayB", "\\textcolor{##f0f1f2}{#1}"); -defineMacro("\\grayC", "\\textcolor{##e3e5e6}{#1}"); -defineMacro("\\grayD", "\\textcolor{##d6d8da}{#1}"); -defineMacro("\\grayE", "\\textcolor{##babec2}{#1}"); -defineMacro("\\grayF", "\\textcolor{##888d93}{#1}"); -defineMacro("\\grayG", "\\textcolor{##626569}{#1}"); -defineMacro("\\grayH", "\\textcolor{##3b3e40}{#1}"); -defineMacro("\\grayI", "\\textcolor{##21242c}{#1}"); -defineMacro("\\kaBlue", "\\textcolor{##314453}{#1}"); -defineMacro("\\kaGreen", "\\textcolor{##71B307}{#1}"); -// CONCATENATED MODULE: ./src/MacroExpander.js -/** - * This file contains the “gullet” where macros are expanded - * until only non-macro tokens remain. - */ - - - - - - - -// List of commands that act like macros but aren't defined as a macro, -// function, or symbol. Used in `isDefined`. -var implicitCommands = { - "\\relax": true, - // MacroExpander.js - "^": true, - // Parser.js - "_": true, - // Parser.js - "\\limits": true, - // Parser.js - "\\nolimits": true // Parser.js - -}; - -var MacroExpander_MacroExpander = -/*#__PURE__*/ -function () { - function MacroExpander(input, settings, mode) { - this.settings = void 0; - this.expansionCount = void 0; - this.lexer = void 0; - this.macros = void 0; - this.stack = void 0; - this.mode = void 0; - this.settings = settings; - this.expansionCount = 0; - this.feed(input); // Make new global namespace - - this.macros = new Namespace_Namespace(macros, settings.macros); - this.mode = mode; - this.stack = []; // contains tokens in REVERSE order - } - /** - * Feed a new input string to the same MacroExpander - * (with existing macros etc.). - */ - - - var _proto = MacroExpander.prototype; - - _proto.feed = function feed(input) { - this.lexer = new Lexer_Lexer(input, this.settings); - } - /** - * Switches between "text" and "math" modes. - */ - ; - - _proto.switchMode = function switchMode(newMode) { - this.mode = newMode; - } - /** - * Start a new group nesting within all namespaces. - */ - ; - - _proto.beginGroup = function beginGroup() { - this.macros.beginGroup(); - } - /** - * End current group nesting within all namespaces. - */ - ; - - _proto.endGroup = function endGroup() { - this.macros.endGroup(); - } - /** - * Returns the topmost token on the stack, without expanding it. - * Similar in behavior to TeX's `\futurelet`. - */ - ; - - _proto.future = function future() { - if (this.stack.length === 0) { - this.pushToken(this.lexer.lex()); - } - - return this.stack[this.stack.length - 1]; - } - /** - * Remove and return the next unexpanded token. - */ - ; - - _proto.popToken = function popToken() { - this.future(); // ensure non-empty stack - - return this.stack.pop(); - } - /** - * Add a given token to the token stack. In particular, this get be used - * to put back a token returned from one of the other methods. - */ - ; - - _proto.pushToken = function pushToken(token) { - this.stack.push(token); - } - /** - * Append an array of tokens to the token stack. - */ - ; - - _proto.pushTokens = function pushTokens(tokens) { - var _this$stack; - - (_this$stack = this.stack).push.apply(_this$stack, tokens); - } - /** - * Consume all following space tokens, without expansion. - */ - ; - - _proto.consumeSpaces = function consumeSpaces() { - for (;;) { - var token = this.future(); - - if (token.text === " ") { - this.stack.pop(); - } else { - break; - } - } - } - /** - * Consume the specified number of arguments from the token stream, - * and return the resulting array of arguments. - */ - ; - - _proto.consumeArgs = function consumeArgs(numArgs) { - var args = []; // obtain arguments, either single token or balanced {…} group - - for (var i = 0; i < numArgs; ++i) { - this.consumeSpaces(); // ignore spaces before each argument - - var startOfArg = this.popToken(); - - if (startOfArg.text === "{") { - var arg = []; - var depth = 1; - - while (depth !== 0) { - var tok = this.popToken(); - arg.push(tok); - - if (tok.text === "{") { - ++depth; - } else if (tok.text === "}") { - --depth; - } else if (tok.text === "EOF") { - throw new src_ParseError("End of input in macro argument", startOfArg); - } - } - - arg.pop(); // remove last } - - arg.reverse(); // like above, to fit in with stack order - - args[i] = arg; - } else if (startOfArg.text === "EOF") { - throw new src_ParseError("End of input expecting macro argument"); - } else { - args[i] = [startOfArg]; - } - } - - return args; - } - /** - * Expand the next token only once if possible. - * - * If the token is expanded, the resulting tokens will be pushed onto - * the stack in reverse order and will be returned as an array, - * also in reverse order. - * - * If not, the next token will be returned without removing it - * from the stack. This case can be detected by a `Token` return value - * instead of an `Array` return value. - * - * In either case, the next token will be on the top of the stack, - * or the stack will be empty. - * - * Used to implement `expandAfterFuture` and `expandNextToken`. - * - * At the moment, macro expansion doesn't handle delimited macros, - * i.e. things like those defined by \def\foo#1\end{…}. - * See the TeX book page 202ff. for details on how those should behave. - * - * If expandableOnly, only expandable tokens are expanded and - * an undefined control sequence results in an error. - */ - ; - - _proto.expandOnce = function expandOnce(expandableOnly) { - var topToken = this.popToken(); - var name = topToken.text; - var expansion = !topToken.noexpand ? this._getExpansion(name) : null; - - if (expansion == null || expandableOnly && expansion.unexpandable) { - if (expandableOnly && expansion == null && name[0] === "\\" && !this.isDefined(name)) { - throw new src_ParseError("Undefined control sequence: " + name); - } - - this.pushToken(topToken); - return topToken; - } - - this.expansionCount++; - - if (this.expansionCount > this.settings.maxExpand) { - throw new src_ParseError("Too many expansions: infinite loop or " + "need to increase maxExpand setting"); - } - - var tokens = expansion.tokens; - - if (expansion.numArgs) { - var args = this.consumeArgs(expansion.numArgs); // paste arguments in place of the placeholders - - tokens = tokens.slice(); // make a shallow copy - - for (var i = tokens.length - 1; i >= 0; --i) { - var tok = tokens[i]; - - if (tok.text === "#") { - if (i === 0) { - throw new src_ParseError("Incomplete placeholder at end of macro body", tok); - } - - tok = tokens[--i]; // next token on stack - - if (tok.text === "#") { - // ## → # - tokens.splice(i + 1, 1); // drop first # - } else if (/^[1-9]$/.test(tok.text)) { - var _tokens; - - // replace the placeholder with the indicated argument - (_tokens = tokens).splice.apply(_tokens, [i, 2].concat(args[+tok.text - 1])); - } else { - throw new src_ParseError("Not a valid argument number", tok); - } - } - } - } // Concatenate expansion onto top of stack. - - - this.pushTokens(tokens); - return tokens; - } - /** - * Expand the next token only once (if possible), and return the resulting - * top token on the stack (without removing anything from the stack). - * Similar in behavior to TeX's `\expandafter\futurelet`. - * Equivalent to expandOnce() followed by future(). - */ - ; - - _proto.expandAfterFuture = function expandAfterFuture() { - this.expandOnce(); - return this.future(); - } - /** - * Recursively expand first token, then return first non-expandable token. - */ - ; - - _proto.expandNextToken = function expandNextToken() { - for (;;) { - var expanded = this.expandOnce(); // expandOnce returns Token if and only if it's fully expanded. - - if (expanded instanceof Token_Token) { - // \relax stops the expansion, but shouldn't get returned (a - // null return value couldn't get implemented as a function). - // the token after \noexpand is interpreted as if its meaning - // were ‘\relax’ - if (expanded.text === "\\relax" || expanded.treatAsRelax) { - this.stack.pop(); - } else { - return this.stack.pop(); // === expanded - } - } - } // Flow unable to figure out that this pathway is impossible. - // https://github.com/facebook/flow/issues/4808 - - - throw new Error(); // eslint-disable-line no-unreachable - } - /** - * Fully expand the given macro name and return the resulting list of - * tokens, or return `undefined` if no such macro is defined. - */ - ; - - _proto.expandMacro = function expandMacro(name) { - return this.macros.has(name) ? this.expandTokens([new Token_Token(name)]) : undefined; - } - /** - * Fully expand the given token stream and return the resulting list of tokens - */ - ; - - _proto.expandTokens = function expandTokens(tokens) { - var output = []; - var oldStackLength = this.stack.length; - this.pushTokens(tokens); - - while (this.stack.length > oldStackLength) { - var expanded = this.expandOnce(true); // expand only expandable tokens - // expandOnce returns Token if and only if it's fully expanded. - - if (expanded instanceof Token_Token) { - if (expanded.treatAsRelax) { - // the expansion of \noexpand is the token itself - expanded.noexpand = false; - expanded.treatAsRelax = false; - } - - output.push(this.stack.pop()); - } - } - - return output; - } - /** - * Fully expand the given macro name and return the result as a string, - * or return `undefined` if no such macro is defined. - */ - ; - - _proto.expandMacroAsText = function expandMacroAsText(name) { - var tokens = this.expandMacro(name); - - if (tokens) { - return tokens.map(function (token) { - return token.text; - }).join(""); - } else { - return tokens; - } - } - /** - * Returns the expanded macro as a reversed array of tokens and a macro - * argument count. Or returns `null` if no such macro. - */ - ; - - _proto._getExpansion = function _getExpansion(name) { - var definition = this.macros.get(name); - - if (definition == null) { - // mainly checking for undefined here - return definition; - } - - var expansion = typeof definition === "function" ? definition(this) : definition; - - if (typeof expansion === "string") { - var numArgs = 0; - - if (expansion.indexOf("#") !== -1) { - var stripped = expansion.replace(/##/g, ""); - - while (stripped.indexOf("#" + (numArgs + 1)) !== -1) { - ++numArgs; - } - } - - var bodyLexer = new Lexer_Lexer(expansion, this.settings); - var tokens = []; - var tok = bodyLexer.lex(); - - while (tok.text !== "EOF") { - tokens.push(tok); - tok = bodyLexer.lex(); - } - - tokens.reverse(); // to fit in with stack using push and pop - - var expanded = { - tokens: tokens, - numArgs: numArgs - }; - return expanded; - } - - return expansion; - } - /** - * Determine whether a command is currently "defined" (has some - * functionality), meaning that it's a macro (in the current group), - * a function, a symbol, or one of the special commands listed in - * `implicitCommands`. - */ - ; - - _proto.isDefined = function isDefined(name) { - return this.macros.has(name) || src_functions.hasOwnProperty(name) || src_symbols.math.hasOwnProperty(name) || src_symbols.text.hasOwnProperty(name) || implicitCommands.hasOwnProperty(name); - } - /** - * Determine whether a command is expandable. - */ - ; - - _proto.isExpandable = function isExpandable(name) { - var macro = this.macros.get(name); - return macro != null ? typeof macro === "string" || typeof macro === "function" || !macro.unexpandable // TODO(ylem): #2085 - : src_functions.hasOwnProperty(name) - /* && !functions[name].primitive*/ - ; - }; - - return MacroExpander; -}(); - - -// CONCATENATED MODULE: ./src/Parser.js -/* eslint no-constant-condition:0 */ - - - - - - - - - - // Pre-evaluate both modules as unicodeSymbols require String.normalize() - -var unicodeAccents = { - "́": { - "text": "\\'", - "math": "\\acute" - }, - "̀": { - "text": "\\`", - "math": "\\grave" - }, - "̈": { - "text": "\\\"", - "math": "\\ddot" - }, - "̃": { - "text": "\\~", - "math": "\\tilde" - }, - "̄": { - "text": "\\=", - "math": "\\bar" - }, - "̆": { - "text": "\\u", - "math": "\\breve" - }, - "̌": { - "text": "\\v", - "math": "\\check" - }, - "̂": { - "text": "\\^", - "math": "\\hat" - }, - "̇": { - "text": "\\.", - "math": "\\dot" - }, - "̊": { - "text": "\\r", - "math": "\\mathring" - }, - "̋": { - "text": "\\H" - } -}; -var unicodeSymbols = { - "á": "á", - "à": "à", - "ä": "ä", - "ǟ": "ǟ", - "ã": "ã", - "ā": "ā", - "ă": "ă", - "ắ": "ắ", - "ằ": "ằ", - "ẵ": "ẵ", - "ǎ": "ǎ", - "â": "â", - "ấ": "ấ", - "ầ": "ầ", - "ẫ": "ẫ", - "ȧ": "ȧ", - "ǡ": "ǡ", - "å": "å", - "ǻ": "ǻ", - "ḃ": "ḃ", - "ć": "ć", - "č": "č", - "ĉ": "ĉ", - "ċ": "ċ", - "ď": "ď", - "ḋ": "ḋ", - "é": "é", - "è": "è", - "ë": "ë", - "ẽ": "ẽ", - "ē": "ē", - "ḗ": "ḗ", - "ḕ": "ḕ", - "ĕ": "ĕ", - "ě": "ě", - "ê": "ê", - "ế": "ế", - "ề": "ề", - "ễ": "ễ", - "ė": "ė", - "ḟ": "ḟ", - "ǵ": "ǵ", - "ḡ": "ḡ", - "ğ": "ğ", - "ǧ": "ǧ", - "ĝ": "ĝ", - "ġ": "ġ", - "ḧ": "ḧ", - "ȟ": "ȟ", - "ĥ": "ĥ", - "ḣ": "ḣ", - "í": "í", - "ì": "ì", - "ï": "ï", - "ḯ": "ḯ", - "ĩ": "ĩ", - "ī": "ī", - "ĭ": "ĭ", - "ǐ": "ǐ", - "î": "î", - "ǰ": "ǰ", - "ĵ": "ĵ", - "ḱ": "ḱ", - "ǩ": "ǩ", - "ĺ": "ĺ", - "ľ": "ľ", - "ḿ": "ḿ", - "ṁ": "ṁ", - "ń": "ń", - "ǹ": "ǹ", - "ñ": "ñ", - "ň": "ň", - "ṅ": "ṅ", - "ó": "ó", - "ò": "ò", - "ö": "ö", - "ȫ": "ȫ", - "õ": "õ", - "ṍ": "ṍ", - "ṏ": "ṏ", - "ȭ": "ȭ", - "ō": "ō", - "ṓ": "ṓ", - "ṑ": "ṑ", - "ŏ": "ŏ", - "ǒ": "ǒ", - "ô": "ô", - "ố": "ố", - "ồ": "ồ", - "ỗ": "ỗ", - "ȯ": "ȯ", - "ȱ": "ȱ", - "ő": "ő", - "ṕ": "ṕ", - "ṗ": "ṗ", - "ŕ": "ŕ", - "ř": "ř", - "ṙ": "ṙ", - "ś": "ś", - "ṥ": "ṥ", - "š": "š", - "ṧ": "ṧ", - "ŝ": "ŝ", - "ṡ": "ṡ", - "ẗ": "ẗ", - "ť": "ť", - "ṫ": "ṫ", - "ú": "ú", - "ù": "ù", - "ü": "ü", - "ǘ": "ǘ", - "ǜ": "ǜ", - "ǖ": "ǖ", - "ǚ": "ǚ", - "ũ": "ũ", - "ṹ": "ṹ", - "ū": "ū", - "ṻ": "ṻ", - "ŭ": "ŭ", - "ǔ": "ǔ", - "û": "û", - "ů": "ů", - "ű": "ű", - "ṽ": "ṽ", - "ẃ": "ẃ", - "ẁ": "ẁ", - "ẅ": "ẅ", - "ŵ": "ŵ", - "ẇ": "ẇ", - "ẘ": "ẘ", - "ẍ": "ẍ", - "ẋ": "ẋ", - "ý": "ý", - "ỳ": "ỳ", - "ÿ": "ÿ", - "ỹ": "ỹ", - "ȳ": "ȳ", - "ŷ": "ŷ", - "ẏ": "ẏ", - "ẙ": "ẙ", - "ź": "ź", - "ž": "ž", - "ẑ": "ẑ", - "ż": "ż", - "Á": "Á", - "À": "À", - "Ä": "Ä", - "Ǟ": "Ǟ", - "Ã": "Ã", - "Ā": "Ā", - "Ă": "Ă", - "Ắ": "Ắ", - "Ằ": "Ằ", - "Ẵ": "Ẵ", - "Ǎ": "Ǎ", - "Â": "Â", - "Ấ": "Ấ", - "Ầ": "Ầ", - "Ẫ": "Ẫ", - "Ȧ": "Ȧ", - "Ǡ": "Ǡ", - "Å": "Å", - "Ǻ": "Ǻ", - "Ḃ": "Ḃ", - "Ć": "Ć", - "Č": "Č", - "Ĉ": "Ĉ", - "Ċ": "Ċ", - "Ď": "Ď", - "Ḋ": "Ḋ", - "É": "É", - "È": "È", - "Ë": "Ë", - "Ẽ": "Ẽ", - "Ē": "Ē", - "Ḗ": "Ḗ", - "Ḕ": "Ḕ", - "Ĕ": "Ĕ", - "Ě": "Ě", - "Ê": "Ê", - "Ế": "Ế", - "Ề": "Ề", - "Ễ": "Ễ", - "Ė": "Ė", - "Ḟ": "Ḟ", - "Ǵ": "Ǵ", - "Ḡ": "Ḡ", - "Ğ": "Ğ", - "Ǧ": "Ǧ", - "Ĝ": "Ĝ", - "Ġ": "Ġ", - "Ḧ": "Ḧ", - "Ȟ": "Ȟ", - "Ĥ": "Ĥ", - "Ḣ": "Ḣ", - "Í": "Í", - "Ì": "Ì", - "Ï": "Ï", - "Ḯ": "Ḯ", - "Ĩ": "Ĩ", - "Ī": "Ī", - "Ĭ": "Ĭ", - "Ǐ": "Ǐ", - "Î": "Î", - "İ": "İ", - "Ĵ": "Ĵ", - "Ḱ": "Ḱ", - "Ǩ": "Ǩ", - "Ĺ": "Ĺ", - "Ľ": "Ľ", - "Ḿ": "Ḿ", - "Ṁ": "Ṁ", - "Ń": "Ń", - "Ǹ": "Ǹ", - "Ñ": "Ñ", - "Ň": "Ň", - "Ṅ": "Ṅ", - "Ó": "Ó", - "Ò": "Ò", - "Ö": "Ö", - "Ȫ": "Ȫ", - "Õ": "Õ", - "Ṍ": "Ṍ", - "Ṏ": "Ṏ", - "Ȭ": "Ȭ", - "Ō": "Ō", - "Ṓ": "Ṓ", - "Ṑ": "Ṑ", - "Ŏ": "Ŏ", - "Ǒ": "Ǒ", - "Ô": "Ô", - "Ố": "Ố", - "Ồ": "Ồ", - "Ỗ": "Ỗ", - "Ȯ": "Ȯ", - "Ȱ": "Ȱ", - "Ő": "Ő", - "Ṕ": "Ṕ", - "Ṗ": "Ṗ", - "Ŕ": "Ŕ", - "Ř": "Ř", - "Ṙ": "Ṙ", - "Ś": "Ś", - "Ṥ": "Ṥ", - "Š": "Š", - "Ṧ": "Ṧ", - "Ŝ": "Ŝ", - "Ṡ": "Ṡ", - "Ť": "Ť", - "Ṫ": "Ṫ", - "Ú": "Ú", - "Ù": "Ù", - "Ü": "Ü", - "Ǘ": "Ǘ", - "Ǜ": "Ǜ", - "Ǖ": "Ǖ", - "Ǚ": "Ǚ", - "Ũ": "Ũ", - "Ṹ": "Ṹ", - "Ū": "Ū", - "Ṻ": "Ṻ", - "Ŭ": "Ŭ", - "Ǔ": "Ǔ", - "Û": "Û", - "Ů": "Ů", - "Ű": "Ű", - "Ṽ": "Ṽ", - "Ẃ": "Ẃ", - "Ẁ": "Ẁ", - "Ẅ": "Ẅ", - "Ŵ": "Ŵ", - "Ẇ": "Ẇ", - "Ẍ": "Ẍ", - "Ẋ": "Ẋ", - "Ý": "Ý", - "Ỳ": "Ỳ", - "Ÿ": "Ÿ", - "Ỹ": "Ỹ", - "Ȳ": "Ȳ", - "Ŷ": "Ŷ", - "Ẏ": "Ẏ", - "Ź": "Ź", - "Ž": "Ž", - "Ẑ": "Ẑ", - "Ż": "Ż", - "ά": "ά", - "ὰ": "ὰ", - "ᾱ": "ᾱ", - "ᾰ": "ᾰ", - "έ": "έ", - "ὲ": "ὲ", - "ή": "ή", - "ὴ": "ὴ", - "ί": "ί", - "ὶ": "ὶ", - "ϊ": "ϊ", - "ΐ": "ΐ", - "ῒ": "ῒ", - "ῑ": "ῑ", - "ῐ": "ῐ", - "ό": "ό", - "ὸ": "ὸ", - "ύ": "ύ", - "ὺ": "ὺ", - "ϋ": "ϋ", - "ΰ": "ΰ", - "ῢ": "ῢ", - "ῡ": "ῡ", - "ῠ": "ῠ", - "ώ": "ώ", - "ὼ": "ὼ", - "Ύ": "Ύ", - "Ὺ": "Ὺ", - "Ϋ": "Ϋ", - "Ῡ": "Ῡ", - "Ῠ": "Ῠ", - "Ώ": "Ώ", - "Ὼ": "Ὼ" -}; - -/** - * This file contains the parser used to parse out a TeX expression from the - * input. Since TeX isn't context-free, standard parsers don't work particularly - * well. - * - * The strategy of this parser is as such: - * - * The main functions (the `.parse...` ones) take a position in the current - * parse string to parse tokens from. The lexer (found in Lexer.js, stored at - * this.gullet.lexer) also supports pulling out tokens at arbitrary places. When - * individual tokens are needed at a position, the lexer is called to pull out a - * token, which is then used. - * - * The parser has a property called "mode" indicating the mode that - * the parser is currently in. Currently it has to be one of "math" or - * "text", which denotes whether the current environment is a math-y - * one or a text-y one (e.g. inside \text). Currently, this serves to - * limit the functions which can be used in text mode. - * - * The main functions then return an object which contains the useful data that - * was parsed at its given point, and a new position at the end of the parsed - * data. The main functions can call each other and continue the parsing by - * using the returned position as a new starting point. - * - * There are also extra `.handle...` functions, which pull out some reused - * functionality into self-contained functions. - * - * The functions return ParseNodes. - */ -var Parser_Parser = -/*#__PURE__*/ -function () { - function Parser(input, settings) { - this.mode = void 0; - this.gullet = void 0; - this.settings = void 0; - this.leftrightDepth = void 0; - this.nextToken = void 0; - // Start in math mode - this.mode = "math"; // Create a new macro expander (gullet) and (indirectly via that) also a - // new lexer (mouth) for this parser (stomach, in the language of TeX) - - this.gullet = new MacroExpander_MacroExpander(input, settings, this.mode); // Store the settings for use in parsing - - this.settings = settings; // Count leftright depth (for \middle errors) - - this.leftrightDepth = 0; - } - /** - * Checks a result to make sure it has the right type, and throws an - * appropriate error otherwise. - */ - - - var _proto = Parser.prototype; - - _proto.expect = function expect(text, consume) { - if (consume === void 0) { - consume = true; - } - - if (this.fetch().text !== text) { - throw new src_ParseError("Expected '" + text + "', got '" + this.fetch().text + "'", this.fetch()); - } - - if (consume) { - this.consume(); - } - } - /** - * Discards the current lookahead token, considering it consumed. - */ - ; - - _proto.consume = function consume() { - this.nextToken = null; - } - /** - * Return the current lookahead token, or if there isn't one (at the - * beginning, or if the previous lookahead token was consume()d), - * fetch the next token as the new lookahead token and return it. - */ - ; - - _proto.fetch = function fetch() { - if (this.nextToken == null) { - this.nextToken = this.gullet.expandNextToken(); - } - - return this.nextToken; - } - /** - * Switches between "text" and "math" modes. - */ - ; - - _proto.switchMode = function switchMode(newMode) { - this.mode = newMode; - this.gullet.switchMode(newMode); - } - /** - * Main parsing function, which parses an entire input. - */ - ; - - _proto.parse = function parse() { - if (!this.settings.globalGroup) { - // Create a group namespace for the math expression. - // (LaTeX creates a new group for every $...$, $$...$$, \[...\].) - this.gullet.beginGroup(); - } // Use old \color behavior (same as LaTeX's \textcolor) if requested. - // We do this within the group for the math expression, so it doesn't - // pollute settings.macros. - - - if (this.settings.colorIsTextColor) { - this.gullet.macros.set("\\color", "\\textcolor"); - } // Try to parse the input - - - var parse = this.parseExpression(false); // If we succeeded, make sure there's an EOF at the end - - this.expect("EOF"); // End the group namespace for the expression - - if (!this.settings.globalGroup) { - this.gullet.endGroup(); - } - - return parse; - }; - - _proto.parseExpression = function parseExpression(breakOnInfix, breakOnTokenText) { - var body = []; // Keep adding atoms to the body until we can't parse any more atoms (either - // we reached the end, a }, or a \right) - - while (true) { - // Ignore spaces in math mode - if (this.mode === "math") { - this.consumeSpaces(); - } - - var lex = this.fetch(); - - if (Parser.endOfExpression.indexOf(lex.text) !== -1) { - break; - } - - if (breakOnTokenText && lex.text === breakOnTokenText) { - break; - } - - if (breakOnInfix && src_functions[lex.text] && src_functions[lex.text].infix) { - break; - } - - var atom = this.parseAtom(breakOnTokenText); - - if (!atom) { - break; - } else if (atom.type === "internal") { - continue; - } - - body.push(atom); - } - - if (this.mode === "text") { - this.formLigatures(body); - } - - return this.handleInfixNodes(body); - } - /** - * Rewrites infix operators such as \over with corresponding commands such - * as \frac. - * - * There can only be one infix operator per group. If there's more than one - * then the expression is ambiguous. This can be resolved by adding {}. - */ - ; - - _proto.handleInfixNodes = function handleInfixNodes(body) { - var overIndex = -1; - var funcName; - - for (var i = 0; i < body.length; i++) { - if (body[i].type === "infix") { - if (overIndex !== -1) { - throw new src_ParseError("only one infix operator per group", body[i].token); - } - - overIndex = i; - funcName = body[i].replaceWith; - } - } - - if (overIndex !== -1 && funcName) { - var numerNode; - var denomNode; - var numerBody = body.slice(0, overIndex); - var denomBody = body.slice(overIndex + 1); - - if (numerBody.length === 1 && numerBody[0].type === "ordgroup") { - numerNode = numerBody[0]; - } else { - numerNode = { - type: "ordgroup", - mode: this.mode, - body: numerBody - }; - } - - if (denomBody.length === 1 && denomBody[0].type === "ordgroup") { - denomNode = denomBody[0]; - } else { - denomNode = { - type: "ordgroup", - mode: this.mode, - body: denomBody - }; - } - - var node; - - if (funcName === "\\\\abovefrac") { - node = this.callFunction(funcName, [numerNode, body[overIndex], denomNode], []); - } else { - node = this.callFunction(funcName, [numerNode, denomNode], []); - } - - return [node]; - } else { - return body; - } - } // The greediness of a superscript or subscript - ; - - /** - * Handle a subscript or superscript with nice errors. - */ - _proto.handleSupSubscript = function handleSupSubscript(name) { - var symbolToken = this.fetch(); - var symbol = symbolToken.text; - this.consume(); - var group = this.parseGroup(name, false, Parser.SUPSUB_GREEDINESS, undefined, undefined, true); // ignore spaces before sup/subscript argument - - if (!group) { - throw new src_ParseError("Expected group after '" + symbol + "'", symbolToken); - } - - return group; - } - /** - * Converts the textual input of an unsupported command into a text node - * contained within a color node whose color is determined by errorColor - */ - ; - - _proto.formatUnsupportedCmd = function formatUnsupportedCmd(text) { - var textordArray = []; - - for (var i = 0; i < text.length; i++) { - textordArray.push({ - type: "textord", - mode: "text", - text: text[i] - }); - } - - var textNode = { - type: "text", - mode: this.mode, - body: textordArray - }; - var colorNode = { - type: "color", - mode: this.mode, - color: this.settings.errorColor, - body: [textNode] - }; - return colorNode; - } - /** - * Parses a group with optional super/subscripts. - */ - ; - - _proto.parseAtom = function parseAtom(breakOnTokenText) { - // The body of an atom is an implicit group, so that things like - // \left(x\right)^2 work correctly. - var base = this.parseGroup("atom", false, null, breakOnTokenText); // In text mode, we don't have superscripts or subscripts - - if (this.mode === "text") { - return base; - } // Note that base may be empty (i.e. null) at this point. - - - var superscript; - var subscript; - - while (true) { - // Guaranteed in math mode, so eat any spaces first. - this.consumeSpaces(); // Lex the first token - - var lex = this.fetch(); - - if (lex.text === "\\limits" || lex.text === "\\nolimits") { - // We got a limit control - if (base && base.type === "op") { - var limits = lex.text === "\\limits"; - base.limits = limits; - base.alwaysHandleSupSub = true; - } else if (base && base.type === "operatorname" && base.alwaysHandleSupSub) { - var _limits = lex.text === "\\limits"; - - base.limits = _limits; - } else { - throw new src_ParseError("Limit controls must follow a math operator", lex); - } - - this.consume(); - } else if (lex.text === "^") { - // We got a superscript start - if (superscript) { - throw new src_ParseError("Double superscript", lex); - } - - superscript = this.handleSupSubscript("superscript"); - } else if (lex.text === "_") { - // We got a subscript start - if (subscript) { - throw new src_ParseError("Double subscript", lex); - } - - subscript = this.handleSupSubscript("subscript"); - } else if (lex.text === "'") { - // We got a prime - if (superscript) { - throw new src_ParseError("Double superscript", lex); - } - - var prime = { - type: "textord", - mode: this.mode, - text: "\\prime" - }; // Many primes can be grouped together, so we handle this here - - var primes = [prime]; - this.consume(); // Keep lexing tokens until we get something that's not a prime - - while (this.fetch().text === "'") { - // For each one, add another prime to the list - primes.push(prime); - this.consume(); - } // If there's a superscript following the primes, combine that - // superscript in with the primes. - - - if (this.fetch().text === "^") { - primes.push(this.handleSupSubscript("superscript")); - } // Put everything into an ordgroup as the superscript - - - superscript = { - type: "ordgroup", - mode: this.mode, - body: primes - }; - } else { - // If it wasn't ^, _, or ', stop parsing super/subscripts - break; - } - } // Base must be set if superscript or subscript are set per logic above, - // but need to check here for type check to pass. - - - if (superscript || subscript) { - // If we got either a superscript or subscript, create a supsub - return { - type: "supsub", - mode: this.mode, - base: base, - sup: superscript, - sub: subscript - }; - } else { - // Otherwise return the original body - return base; - } - } - /** - * Parses an entire function, including its base and all of its arguments. - */ - ; - - _proto.parseFunction = function parseFunction(breakOnTokenText, name, // For error reporting. - greediness) { - var token = this.fetch(); - var func = token.text; - var funcData = src_functions[func]; - - if (!funcData) { - return null; - } - - this.consume(); // consume command token - - if (greediness != null && funcData.greediness <= greediness) { - throw new src_ParseError("Got function '" + func + "' with no arguments" + (name ? " as " + name : ""), token); - } else if (this.mode === "text" && !funcData.allowedInText) { - throw new src_ParseError("Can't use function '" + func + "' in text mode", token); - } else if (this.mode === "math" && funcData.allowedInMath === false) { - throw new src_ParseError("Can't use function '" + func + "' in math mode", token); - } - - var _this$parseArguments = this.parseArguments(func, funcData), - args = _this$parseArguments.args, - optArgs = _this$parseArguments.optArgs; - - return this.callFunction(func, args, optArgs, token, breakOnTokenText); - } - /** - * Call a function handler with a suitable context and arguments. - */ - ; - - _proto.callFunction = function callFunction(name, args, optArgs, token, breakOnTokenText) { - var context = { - funcName: name, - parser: this, - token: token, - breakOnTokenText: breakOnTokenText - }; - var func = src_functions[name]; - - if (func && func.handler) { - return func.handler(context, args, optArgs); - } else { - throw new src_ParseError("No function handler for " + name); - } - } - /** - * Parses the arguments of a function or environment - */ - ; - - _proto.parseArguments = function parseArguments(func, // Should look like "\name" or "\begin{name}". - funcData) { - var totalArgs = funcData.numArgs + funcData.numOptionalArgs; - - if (totalArgs === 0) { - return { - args: [], - optArgs: [] - }; - } - - var baseGreediness = funcData.greediness; - var args = []; - var optArgs = []; - - for (var i = 0; i < totalArgs; i++) { - var argType = funcData.argTypes && funcData.argTypes[i]; - var isOptional = i < funcData.numOptionalArgs; // Ignore spaces between arguments. As the TeXbook says: - // "After you have said ‘\def\row#1#2{...}’, you are allowed to - // put spaces between the arguments (e.g., ‘\row x n’), because - // TeX doesn’t use single spaces as undelimited arguments." - - var consumeSpaces = i > 0 && !isOptional || // Also consume leading spaces in math mode, as parseSymbol - // won't know what to do with them. This can only happen with - // macros, e.g. \frac\foo\foo where \foo expands to a space symbol. - // In LaTeX, the \foo's get treated as (blank) arguments. - // In KaTeX, for now, both spaces will get consumed. - // TODO(edemaine) - i === 0 && !isOptional && this.mode === "math"; - var arg = this.parseGroupOfType("argument to '" + func + "'", argType, isOptional, baseGreediness, consumeSpaces); - - if (!arg) { - if (isOptional) { - optArgs.push(null); - continue; - } - - throw new src_ParseError("Expected group after '" + func + "'", this.fetch()); - } - - (isOptional ? optArgs : args).push(arg); - } - - return { - args: args, - optArgs: optArgs - }; - } - /** - * Parses a group when the mode is changing. - */ - ; - - _proto.parseGroupOfType = function parseGroupOfType(name, type, optional, greediness, consumeSpaces) { - switch (type) { - case "color": - if (consumeSpaces) { - this.consumeSpaces(); - } - - return this.parseColorGroup(optional); - - case "size": - if (consumeSpaces) { - this.consumeSpaces(); - } - - return this.parseSizeGroup(optional); - - case "url": - return this.parseUrlGroup(optional, consumeSpaces); - - case "math": - case "text": - return this.parseGroup(name, optional, greediness, undefined, type, consumeSpaces); - - case "hbox": - { - // hbox argument type wraps the argument in the equivalent of - // \hbox, which is like \text but switching to \textstyle size. - var group = this.parseGroup(name, optional, greediness, undefined, "text", consumeSpaces); - - if (!group) { - return group; - } - - var styledGroup = { - type: "styling", - mode: group.mode, - body: [group], - style: "text" // simulate \textstyle - - }; - return styledGroup; - } - - case "raw": - { - if (consumeSpaces) { - this.consumeSpaces(); - } - - if (optional && this.fetch().text === "{") { - return null; - } - - var token = this.parseStringGroup("raw", optional, true); - - if (token) { - return { - type: "raw", - mode: "text", - string: token.text - }; - } else { - throw new src_ParseError("Expected raw group", this.fetch()); - } - } - - case "original": - case null: - case undefined: - return this.parseGroup(name, optional, greediness, undefined, undefined, consumeSpaces); - - default: - throw new src_ParseError("Unknown group type as " + name, this.fetch()); - } - } - /** - * Discard any space tokens, fetching the next non-space token. - */ - ; - - _proto.consumeSpaces = function consumeSpaces() { - while (this.fetch().text === " ") { - this.consume(); - } - } - /** - * Parses a group, essentially returning the string formed by the - * brace-enclosed tokens plus some position information. - */ - ; - - _proto.parseStringGroup = function parseStringGroup(modeName, // Used to describe the mode in error messages. - optional, raw) { - var groupBegin = optional ? "[" : "{"; - var groupEnd = optional ? "]" : "}"; - var beginToken = this.fetch(); - - if (beginToken.text !== groupBegin) { - if (optional) { - return null; - } else if (raw && beginToken.text !== "EOF" && /[^{}[\]]/.test(beginToken.text)) { - this.consume(); - return beginToken; - } - } - - var outerMode = this.mode; - this.mode = "text"; - this.expect(groupBegin); - var str = ""; - var firstToken = this.fetch(); - var nested = 0; // allow nested braces in raw string group - - var lastToken = firstToken; - var nextToken; - - while ((nextToken = this.fetch()).text !== groupEnd || raw && nested > 0) { - switch (nextToken.text) { - case "EOF": - throw new src_ParseError("Unexpected end of input in " + modeName, firstToken.range(lastToken, str)); - - case groupBegin: - nested++; - break; - - case groupEnd: - nested--; - break; - } - - lastToken = nextToken; - str += lastToken.text; - this.consume(); - } - - this.expect(groupEnd); - this.mode = outerMode; - return firstToken.range(lastToken, str); - } - /** - * Parses a regex-delimited group: the largest sequence of tokens - * whose concatenated strings match `regex`. Returns the string - * formed by the tokens plus some position information. - */ - ; - - _proto.parseRegexGroup = function parseRegexGroup(regex, modeName) { - var outerMode = this.mode; - this.mode = "text"; - var firstToken = this.fetch(); - var lastToken = firstToken; - var str = ""; - var nextToken; - - while ((nextToken = this.fetch()).text !== "EOF" && regex.test(str + nextToken.text)) { - lastToken = nextToken; - str += lastToken.text; - this.consume(); - } - - if (str === "") { - throw new src_ParseError("Invalid " + modeName + ": '" + firstToken.text + "'", firstToken); - } - - this.mode = outerMode; - return firstToken.range(lastToken, str); - } - /** - * Parses a color description. - */ - ; - - _proto.parseColorGroup = function parseColorGroup(optional) { - var res = this.parseStringGroup("color", optional); - - if (!res) { - return null; - } - - var match = /^(#[a-f0-9]{3}|#?[a-f0-9]{6}|[a-z]+)$/i.exec(res.text); - - if (!match) { - throw new src_ParseError("Invalid color: '" + res.text + "'", res); - } - - var color = match[0]; - - if (/^[0-9a-f]{6}$/i.test(color)) { - // We allow a 6-digit HTML color spec without a leading "#". - // This follows the xcolor package's HTML color model. - // Predefined color names are all missed by this RegEx pattern. - color = "#" + color; - } - - return { - type: "color-token", - mode: this.mode, - color: color - }; - } - /** - * Parses a size specification, consisting of magnitude and unit. - */ - ; - - _proto.parseSizeGroup = function parseSizeGroup(optional) { - var res; - var isBlank = false; - - if (!optional && this.fetch().text !== "{") { - res = this.parseRegexGroup(/^[-+]? *(?:$|\d+|\d+\.\d*|\.\d*) *[a-z]{0,2} *$/, "size"); - } else { - res = this.parseStringGroup("size", optional); - } - - if (!res) { - return null; - } - - if (!optional && res.text.length === 0) { - // Because we've tested for what is !optional, this block won't - // affect \kern, \hspace, etc. It will capture the mandatory arguments - // to \genfrac and \above. - res.text = "0pt"; // Enable \above{} - - isBlank = true; // This is here specifically for \genfrac - } - - var match = /([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(res.text); - - if (!match) { - throw new src_ParseError("Invalid size: '" + res.text + "'", res); - } - - var data = { - number: +(match[1] + match[2]), - // sign + magnitude, cast to number - unit: match[3] - }; - - if (!validUnit(data)) { - throw new src_ParseError("Invalid unit: '" + data.unit + "'", res); - } - - return { - type: "size", - mode: this.mode, - value: data, - isBlank: isBlank - }; - } - /** - * Parses an URL, checking escaped letters and allowed protocols, - * and setting the catcode of % as an active character (as in \hyperref). - */ - ; - - _proto.parseUrlGroup = function parseUrlGroup(optional, consumeSpaces) { - this.gullet.lexer.setCatcode("%", 13); // active character - - var res = this.parseStringGroup("url", optional, true); // get raw string - - this.gullet.lexer.setCatcode("%", 14); // comment character - - if (!res) { - return null; - } // hyperref package allows backslashes alone in href, but doesn't - // generate valid links in such cases; we interpret this as - // "undefined" behaviour, and keep them as-is. Some browser will - // replace backslashes with forward slashes. - - - var url = res.text.replace(/\\([#$%&~_^{}])/g, '$1'); - return { - type: "url", - mode: this.mode, - url: url - }; - } - /** - * If `optional` is false or absent, this parses an ordinary group, - * which is either a single nucleus (like "x") or an expression - * in braces (like "{x+y}") or an implicit group, a group that starts - * at the current position, and ends right before a higher explicit - * group ends, or at EOF. - * If `optional` is true, it parses either a bracket-delimited expression - * (like "[x+y]") or returns null to indicate the absence of a - * bracket-enclosed group. - * If `mode` is present, switches to that mode while parsing the group, - * and switches back after. - */ - ; - - _proto.parseGroup = function parseGroup(name, // For error reporting. - optional, greediness, breakOnTokenText, mode, consumeSpaces) { - // Switch to specified mode - var outerMode = this.mode; - - if (mode) { - this.switchMode(mode); - } // Consume spaces if requested, crucially *after* we switch modes, - // so that the next non-space token is parsed in the correct mode. - - - if (consumeSpaces) { - this.consumeSpaces(); - } // Get first token - - - var firstToken = this.fetch(); - var text = firstToken.text; - var result; // Try to parse an open brace or \begingroup - - if (optional ? text === "[" : text === "{" || text === "\\begingroup") { - this.consume(); - var groupEnd = Parser.endOfGroup[text]; // Start a new group namespace - - this.gullet.beginGroup(); // If we get a brace, parse an expression - - var expression = this.parseExpression(false, groupEnd); - var lastToken = this.fetch(); // Check that we got a matching closing brace - - this.expect(groupEnd); // End group namespace - - this.gullet.endGroup(); - result = { - type: "ordgroup", - mode: this.mode, - loc: SourceLocation.range(firstToken, lastToken), - body: expression, - // A group formed by \begingroup...\endgroup is a semi-simple group - // which doesn't affect spacing in math mode, i.e., is transparent. - // https://tex.stackexchange.com/questions/1930/when-should-one- - // use-begingroup-instead-of-bgroup - semisimple: text === "\\begingroup" || undefined - }; - } else if (optional) { - // Return nothing for an optional group - result = null; - } else { - // If there exists a function with this name, parse the function. - // Otherwise, just return a nucleus - result = this.parseFunction(breakOnTokenText, name, greediness) || this.parseSymbol(); - - if (result == null && text[0] === "\\" && !implicitCommands.hasOwnProperty(text)) { - if (this.settings.throwOnError) { - throw new src_ParseError("Undefined control sequence: " + text, firstToken); - } - - result = this.formatUnsupportedCmd(text); - this.consume(); - } - } // Switch mode back - - - if (mode) { - this.switchMode(outerMode); - } - - return result; - } - /** - * Form ligature-like combinations of characters for text mode. - * This includes inputs like "--", "---", "``" and "''". - * The result will simply replace multiple textord nodes with a single - * character in each value by a single textord node having multiple - * characters in its value. The representation is still ASCII source. - * The group will be modified in place. - */ - ; - - _proto.formLigatures = function formLigatures(group) { - var n = group.length - 1; - - for (var i = 0; i < n; ++i) { - var a = group[i]; // $FlowFixMe: Not every node type has a `text` property. - - var v = a.text; - - if (v === "-" && group[i + 1].text === "-") { - if (i + 1 < n && group[i + 2].text === "-") { - group.splice(i, 3, { - type: "textord", - mode: "text", - loc: SourceLocation.range(a, group[i + 2]), - text: "---" - }); - n -= 2; - } else { - group.splice(i, 2, { - type: "textord", - mode: "text", - loc: SourceLocation.range(a, group[i + 1]), - text: "--" - }); - n -= 1; - } - } - - if ((v === "'" || v === "`") && group[i + 1].text === v) { - group.splice(i, 2, { - type: "textord", - mode: "text", - loc: SourceLocation.range(a, group[i + 1]), - text: v + v - }); - n -= 1; - } - } - } - /** - * Parse a single symbol out of the string. Here, we handle single character - * symbols and special functions like \verb. - */ - ; - - _proto.parseSymbol = function parseSymbol() { - var nucleus = this.fetch(); - var text = nucleus.text; - - if (/^\\verb[^a-zA-Z]/.test(text)) { - this.consume(); - var arg = text.slice(5); - var star = arg.charAt(0) === "*"; - - if (star) { - arg = arg.slice(1); - } // Lexer's tokenRegex is constructed to always have matching - // first/last characters. - - - if (arg.length < 2 || arg.charAt(0) !== arg.slice(-1)) { - throw new src_ParseError("\\verb assertion failed --\n please report what input caused this bug"); - } - - arg = arg.slice(1, -1); // remove first and last char - - return { - type: "verb", - mode: "text", - body: arg, - star: star - }; - } // At this point, we should have a symbol, possibly with accents. - // First expand any accented base symbol according to unicodeSymbols. - - - if (unicodeSymbols.hasOwnProperty(text[0]) && !src_symbols[this.mode][text[0]]) { - // This behavior is not strict (XeTeX-compatible) in math mode. - if (this.settings.strict && this.mode === "math") { - this.settings.reportNonstrict("unicodeTextInMathMode", "Accented Unicode text character \"" + text[0] + "\" used in " + "math mode", nucleus); - } - - text = unicodeSymbols[text[0]] + text.substr(1); - } // Strip off any combining characters - - - var match = combiningDiacriticalMarksEndRegex.exec(text); - - if (match) { - text = text.substring(0, match.index); - - if (text === 'i') { - text = "\u0131"; // dotless i, in math and text mode - } else if (text === 'j') { - text = "\u0237"; // dotless j, in math and text mode - } - } // Recognize base symbol - - - var symbol; - - if (src_symbols[this.mode][text]) { - if (this.settings.strict && this.mode === 'math' && extraLatin.indexOf(text) >= 0) { - this.settings.reportNonstrict("unicodeTextInMathMode", "Latin-1/Unicode text character \"" + text[0] + "\" used in " + "math mode", nucleus); - } - - var group = src_symbols[this.mode][text].group; - var loc = SourceLocation.range(nucleus); - var s; - - if (ATOMS.hasOwnProperty(group)) { - // $FlowFixMe - var family = group; - s = { - type: "atom", - mode: this.mode, - family: family, - loc: loc, - text: text - }; - } else { - // $FlowFixMe - s = { - type: group, - mode: this.mode, - loc: loc, - text: text - }; - } - - symbol = s; - } else if (text.charCodeAt(0) >= 0x80) { - // no symbol for e.g. ^ - if (this.settings.strict) { - if (!supportedCodepoint(text.charCodeAt(0))) { - this.settings.reportNonstrict("unknownSymbol", "Unrecognized Unicode character \"" + text[0] + "\"" + (" (" + text.charCodeAt(0) + ")"), nucleus); - } else if (this.mode === "math") { - this.settings.reportNonstrict("unicodeTextInMathMode", "Unicode text character \"" + text[0] + "\" used in math mode", nucleus); - } - } // All nonmathematical Unicode characters are rendered as if they - // are in text mode (wrapped in \text) because that's what it - // takes to render them in LaTeX. Setting `mode: this.mode` is - // another natural choice (the user requested math mode), but - // this makes it more difficult for getCharacterMetrics() to - // distinguish Unicode characters without metrics and those for - // which we want to simulate the letter M. - - - symbol = { - type: "textord", - mode: "text", - loc: SourceLocation.range(nucleus), - text: text - }; - } else { - return null; // EOF, ^, _, {, }, etc. - } - - this.consume(); // Transform combining characters into accents - - if (match) { - for (var i = 0; i < match[0].length; i++) { - var accent = match[0][i]; - - if (!unicodeAccents[accent]) { - throw new src_ParseError("Unknown accent ' " + accent + "'", nucleus); - } - - var command = unicodeAccents[accent][this.mode]; - - if (!command) { - throw new src_ParseError("Accent " + accent + " unsupported in " + this.mode + " mode", nucleus); - } - - symbol = { - type: "accent", - mode: this.mode, - loc: SourceLocation.range(nucleus), - label: command, - isStretchy: false, - isShifty: true, - base: symbol - }; - } - } - - return symbol; - }; - - return Parser; -}(); - -Parser_Parser.endOfExpression = ["}", "\\endgroup", "\\end", "\\right", "&"]; -Parser_Parser.endOfGroup = { - "[": "]", - "{": "}", - "\\begingroup": "\\endgroup" - /** - * Parses an "expression", which is a list of atoms. - * - * `breakOnInfix`: Should the parsing stop when we hit infix nodes? This - * happens when functions have higher precendence han infix - * nodes in implicit parses. - * - * `breakOnTokenText`: The text of the token that the expression should end - * with, or `null` if something else should end the - * expression. - */ - -}; -Parser_Parser.SUPSUB_GREEDINESS = 1; - -// CONCATENATED MODULE: ./src/parseTree.js -/** - * Provides a single function for parsing an expression using a Parser - * TODO(emily): Remove this - */ - - - -/** - * Parses an expression using a Parser, then returns the parsed result. - */ -var parseTree_parseTree = function parseTree(toParse, settings) { - if (!(typeof toParse === 'string' || toParse instanceof String)) { - throw new TypeError('KaTeX can only parse string typed expression'); - } - - var parser = new Parser_Parser(toParse, settings); // Blank out any \df@tag to avoid spurious "Duplicate \tag" errors - - delete parser.gullet.macros.current["\\df@tag"]; - var tree = parser.parse(); // If the input used \tag, it will set the \df@tag macro to the tag. - // In this case, we separately parse the tag and wrap the tree. - - if (parser.gullet.macros.get("\\df@tag")) { - if (!settings.displayMode) { - throw new src_ParseError("\\tag works only in display equations"); - } - - parser.gullet.feed("\\df@tag"); - tree = [{ - type: "tag", - mode: "text", - body: tree, - tag: parser.parse() - }]; - } - - return tree; -}; - -/* harmony default export */ var src_parseTree = (parseTree_parseTree); -// CONCATENATED MODULE: ./katex.js -/* eslint no-console:0 */ - -/** - * This is the main entry point for KaTeX. Here, we expose functions for - * rendering expressions either to DOM nodes or to markup strings. - * - * We also expose the ParseError class to check if errors thrown from KaTeX are - * errors in the expression, or errors in javascript handling. - */ - - - - - - - - - - -/** - * Parse and build an expression, and place that expression in the DOM node - * given. - */ -var katex_render = function render(expression, baseNode, options) { - baseNode.textContent = ""; - var node = katex_renderToDomTree(expression, options).toNode(); - baseNode.appendChild(node); -}; // KaTeX's styles don't work properly in quirks mode. Print out an error, and -// disable rendering. - - -if (typeof document !== "undefined") { - if (document.compatMode !== "CSS1Compat") { - typeof console !== "undefined" && console.warn("Warning: KaTeX doesn't work in quirks mode. Make sure your " + "website has a suitable doctype."); - - katex_render = function render() { - throw new src_ParseError("KaTeX doesn't work in quirks mode."); - }; - } -} -/** - * Parse and build an expression, and return the markup for that. - */ - - -var renderToString = function renderToString(expression, options) { - var markup = katex_renderToDomTree(expression, options).toMarkup(); - return markup; -}; -/** - * Parse an expression and return the parse tree. - */ - - -var katex_generateParseTree = function generateParseTree(expression, options) { - var settings = new Settings_Settings(options); - return src_parseTree(expression, settings); -}; -/** - * If the given error is a KaTeX ParseError and options.throwOnError is false, - * renders the invalid LaTeX as a span with hover title giving the KaTeX - * error message. Otherwise, simply throws the error. - */ - - -var katex_renderError = function renderError(error, expression, options) { - if (options.throwOnError || !(error instanceof src_ParseError)) { - throw error; - } - - var node = buildCommon.makeSpan(["katex-error"], [new domTree_SymbolNode(expression)]); - node.setAttribute("title", error.toString()); - node.setAttribute("style", "color:" + options.errorColor); - return node; -}; -/** - * Generates and returns the katex build tree. This is used for advanced - * use cases (like rendering to custom output). - */ - - -var katex_renderToDomTree = function renderToDomTree(expression, options) { - var settings = new Settings_Settings(options); - - try { - var tree = src_parseTree(expression, settings); - return buildTree_buildTree(tree, expression, settings); - } catch (error) { - return katex_renderError(error, expression, settings); - } -}; -/** - * Generates and returns the katex build tree, with just HTML (no MathML). - * This is used for advanced use cases (like rendering to custom output). - */ - - -var katex_renderToHTMLTree = function renderToHTMLTree(expression, options) { - var settings = new Settings_Settings(options); - - try { - var tree = src_parseTree(expression, settings); - return buildTree_buildHTMLTree(tree, expression, settings); - } catch (error) { - return katex_renderError(error, expression, settings); - } -}; - -/* harmony default export */ var katex_0 = ({ - /** - * Current KaTeX version - */ - version: "0.12.0", - - /** - * Renders the given LaTeX into an HTML+MathML combination, and adds - * it as a child to the specified DOM node. - */ - render: katex_render, - - /** - * Renders the given LaTeX into an HTML+MathML combination string, - * for sending to the client. - */ - renderToString: renderToString, - - /** - * KaTeX error, usually during parsing. - */ - ParseError: src_ParseError, - - /** - * Parses the given LaTeX into KaTeX's internal parse tree structure, - * without rendering to HTML or MathML. - * - * NOTE: This method is not currently recommended for public use. - * The internal tree representation is unstable and is very likely - * to change. Use at your own risk. - */ - __parse: katex_generateParseTree, - - /** - * Renders the given LaTeX into an HTML+MathML internal DOM tree - * representation, without flattening that representation to a string. - * - * NOTE: This method is not currently recommended for public use. - * The internal tree representation is unstable and is very likely - * to change. Use at your own risk. - */ - __renderToDomTree: katex_renderToDomTree, - - /** - * Renders the given LaTeX into an HTML internal DOM tree representation, - * without MathML and without flattening that representation to a string. - * - * NOTE: This method is not currently recommended for public use. - * The internal tree representation is unstable and is very likely - * to change. Use at your own risk. - */ - __renderToHTMLTree: katex_renderToHTMLTree, - - /** - * extends internal font metrics object with a new object - * each key in the new object represents a font name - */ - __setFontMetrics: setFontMetrics, - - /** - * adds a new symbol to builtin symbols table - */ - __defineSymbol: defineSymbol, - - /** - * adds a new macro to builtin macro list - */ - __defineMacro: defineMacro, - - /** - * Expose the dom tree node types, which can be useful for type checking nodes. - * - * NOTE: This method is not currently recommended for public use. - * The internal tree representation is unstable and is very likely - * to change. Use at your own risk. - */ - __domTree: { - Span: domTree_Span, - Anchor: domTree_Anchor, - SymbolNode: domTree_SymbolNode, - SvgNode: SvgNode, - PathNode: domTree_PathNode, - LineNode: LineNode - } -}); -// CONCATENATED MODULE: ./katex.webpack.js -/** - * This is the webpack entry point for KaTeX. As ECMAScript, flow[1] and jest[2] - * doesn't support CSS modules natively, a separate entry point is used and - * it is not flowtyped. - * - * [1] https://gist.github.com/lambdahands/d19e0da96285b749f0ef - * [2] https://facebook.github.io/jest/docs/en/webpack.html - */ - - -/* harmony default export */ var katex_webpack = __webpack_exports__["default"] = (katex_0); - -/***/ }) -/******/ ])["default"]; -}); -}); - -/** - * Plugin for Remarkable Markdown processor which transforms $..$ and $$..$$ sequences into math HTML using the - * Katex package. - */ -const rkatex = (md, options) => { - const dollar = '$'; - const opts = options || {}; - const delimiter = opts.delimiter || dollar; - if (delimiter.length !== 1) { throw new Error('invalid delimiter'); } - - const katex$1 = katex; - - /** - * Render the contents as KaTeX - */ - const renderKatex = (source, displayMode) => katex$1.renderToString(source, - {displayMode: displayMode, - throwOnError: false}); - - /** - * Parse '$$' as a block. Based off of similar method in remarkable. - */ - const parseBlockKatex = (state, startLine, endLine) => { - let haveEndMarker = false; - let pos = state.bMarks[startLine] + state.tShift[startLine]; - let max = state.eMarks[startLine]; - - if (pos + 1 > max) { return false; } - - const marker = state.src.charAt(pos); - if (marker !== delimiter) { return false; } - - // scan marker length - let mem = pos; - pos = state.skipChars(pos, marker); - let len = pos - mem; - - if (len !== 2) { return false; } - - // search end of block - let nextLine = startLine; - - for (;;) { - ++nextLine; - if (nextLine >= endLine) { break; } - - pos = mem = state.bMarks[nextLine] + state.tShift[nextLine]; - max = state.eMarks[nextLine]; - - if (pos < max && state.tShift[nextLine] < state.blkIndent) { break; } - if (state.src.charAt(pos) !== delimiter) { continue; } - if (state.tShift[nextLine] - state.blkIndent >= 4) { continue; } - - pos = state.skipChars(pos, marker); - if (pos - mem < len) { continue; } - - pos = state.skipSpaces(pos); - if (pos < max) { continue; } - - haveEndMarker = true; - break; - } - - // If a fence has heading spaces, they should be removed from its inner block - len = state.tShift[startLine]; - state.line = nextLine + (haveEndMarker ? 1 : 0); - const content = state.getLines(startLine + 1, nextLine, len, true) - .replace(/[ \n]+/g, ' ') - .trim(); - - state.tokens.push({type: 'katex', params: null, content: content, lines: [startLine, state.line], - level: state.level, block: true}); - return true; - }; - - /** - * Look for '$' or '$$' spans in Markdown text. Based off of the 'fenced' parser in remarkable. - */ - const parseInlineKatex = (state, silent) => { - const start = state.pos; - const max = state.posMax; - let pos = start; - - // Unexpected starting character - if (state.src.charAt(pos) !== delimiter) { return false; } - - ++pos; - while (pos < max && state.src.charAt(pos) === delimiter) { ++pos; } - - // Capture the length of the starting delimiter -- closing one must match in size - const marker = state.src.slice(start, pos); - if (marker.length > 2) { return false; } - - const spanStart = pos; - let escapedDepth = 0; - while (pos < max) { - const char = state.src.charAt(pos); - if (char === '{') { - escapedDepth += 1; - } else if (char === '}') { - escapedDepth -= 1; - if (escapedDepth < 0) { return false; } - } else if (char === delimiter && escapedDepth === 0) { - const matchStart = pos; - let matchEnd = pos + 1; - while (matchEnd < max && state.src.charAt(matchEnd) === delimiter) { ++matchEnd; } - - if (matchEnd - matchStart === marker.length) { - if (!silent) { - const content = state.src.slice(spanStart, matchStart) - .replace(/[ \n]+/g, ' ') - .trim(); - state.push({type: 'katex', content: content, block: marker.length > 1, level: state.level}); - } - state.pos = matchEnd; - return true; - } - } - pos += 1; - } - - if (!silent) { state.pending += marker; } - state.pos += marker.length; - - return true; - }; - - md.inline.ruler.push('katex', parseInlineKatex, options); - md.block.ruler.push('katex', parseBlockKatex, options); - md.renderer.rules.katex = (tokens, idx) => renderKatex(tokens[idx].content, tokens[idx].block); - md.renderer.rules.katex.delimiter = delimiter; -}; - -var remarkableKatex = rkatex; - -var prism = createCommonjsModule(function (module) { -/* ********************************************** - Begin prism-core.js -********************************************** */ - -/// - -var _self = (typeof window !== 'undefined') - ? window // if in browser - : ( - (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope) - ? self // if in worker - : {} // if in node js - ); - -/** - * Prism: Lightweight, robust, elegant syntax highlighting - * - * @license MIT - * @author Lea Verou - * @namespace - * @public - */ -var Prism = (function (_self){ - -// Private helper vars -var lang = /\blang(?:uage)?-([\w-]+)\b/i; -var uniqueId = 0; - - -var _ = { - /** - * By default, Prism will attempt to highlight all code elements (by calling {@link Prism.highlightAll}) on the - * current page after the page finished loading. This might be a problem if e.g. you wanted to asynchronously load - * additional languages or plugins yourself. - * - * By setting this value to `true`, Prism will not automatically highlight all code elements on the page. - * - * You obviously have to change this value before the automatic highlighting started. To do this, you can add an - * empty Prism object into the global scope before loading the Prism script like this: - * - * ```js - * window.Prism = window.Prism || {}; - * Prism.manual = true; - * // add a new {#if metadata} -function create_catch_block(ctx) { - return { - c: noop, - m: noop, - p: noop, - i: noop, - o: noop, - d: noop - }; -} - -// (8:37) ; export let metadata; {#if metadata} -function create_pending_block(ctx) { - return { - c: noop, - m: noop, - p: noop, - i: noop, - o: noop, - d: noop - }; -} - -function create_fragment$5(ctx) { - let current_block_type_index; - let if_block; - let if_block_anchor; - let current; - const if_block_creators = [create_if_block$1, create_else_block]; - const if_blocks = []; - - function select_block_type(ctx, dirty) { - if (/*metadata*/ ctx[0]) return 0; - return 1; - } - - current_block_type_index = select_block_type(ctx); - if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); - - return { - c() { - if_block.c(); - if_block_anchor = empty(); - }, - m(target, anchor) { - if_blocks[current_block_type_index].m(target, anchor); - insert(target, if_block_anchor, anchor); - current = true; - }, - p(ctx, [dirty]) { - let previous_block_index = current_block_type_index; - current_block_type_index = select_block_type(ctx); - - if (current_block_type_index === previous_block_index) { - if_blocks[current_block_type_index].p(ctx, dirty); - } else { - group_outros(); - - transition_out(if_blocks[previous_block_index], 1, 1, () => { - if_blocks[previous_block_index] = null; - }); - - check_outros(); - if_block = if_blocks[current_block_type_index]; - - if (!if_block) { - if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); - if_block.c(); - } else { - if_block.p(ctx, dirty); - } - - transition_in(if_block, 1); - if_block.m(if_block_anchor.parentNode, if_block_anchor); - } - }, - i(local) { - if (current) return; - transition_in(if_block); - current = true; - }, - o(local) { - transition_out(if_block); - current = false; - }, - d(detaching) { - if_blocks[current_block_type_index].d(detaching); - if (detaching) detach(if_block_anchor); - } - }; -} - -function instance$5($$self, $$props, $$invalidate) { - let { $$slots: slots = {}, $$scope } = $$props; - - let { metadata } = $$props; - - $$self.$$set = $$props => { - if ("metadata" in $$props) $$invalidate(0, metadata = $$props.metadata); - if ("$$scope" in $$props) $$invalidate(1, $$scope = $$props.$$scope); - }; - - return [metadata, $$scope, slots]; -} - -class MetadataResolver extends SvelteComponent { - constructor(options) { - super(); - init(this, options, instance$5, create_fragment$5, not_equal, { metadata: 0 }); - } -} - -function isMacOS() { - return navigator.appVersion.indexOf("Mac") !== -1; -} -function isMetaPressed(e) { - return isMacOS() ? e.metaKey : e.ctrlKey; -} -function getDaysOfWeek(..._args) { - return window.moment.weekdaysShort(true); -} -function isWeekend(date) { - return date.isoWeekday() === 6 || date.isoWeekday() === 7; -} -function getStartOfWeek(days) { - return days[0].weekday(0); -} -/** - * Generate a 2D array of daily information to power - * the calendar view. - */ -function getMonth(displayedMonth, ..._args) { - const locale = window.moment().locale(); - const month = []; - let week; - const startOfMonth = displayedMonth.clone().locale(locale).date(1); - const startOffset = startOfMonth.weekday(); - let date = startOfMonth.clone().subtract(startOffset, "days"); - for (let _day = 0; _day < 42; _day++) { - if (_day % 7 === 0) { - week = { - days: [], - weekNum: date.week(), - }; - month.push(week); - } - week.days.push(date); - date = date.clone().add(1, "days"); - } - return month; -} - -/* src/components/Day.svelte generated by Svelte v3.35.0 */ - -function add_css$4() { - var style = element("style"); - style.id = "svelte-q3wqg9-style"; - style.textContent = ".day.svelte-q3wqg9{background-color:var(--color-background-day);border-radius:4px;color:var(--color-text-day);cursor:pointer;font-size:0.8em;height:100%;padding:4px;position:relative;text-align:center;transition:background-color 0.1s ease-in, color 0.1s ease-in;vertical-align:baseline}.day.svelte-q3wqg9:hover{background-color:var(--interactive-hover)}.day.active.svelte-q3wqg9:hover{background-color:var(--interactive-accent-hover)}.adjacent-month.svelte-q3wqg9{opacity:0.25}.today.svelte-q3wqg9{color:var(--color-text-today)}.day.svelte-q3wqg9:active,.active.svelte-q3wqg9,.active.today.svelte-q3wqg9{color:var(--text-on-accent);background-color:var(--interactive-accent)}.dot-container.svelte-q3wqg9{display:flex;flex-wrap:wrap;justify-content:center;line-height:6px;min-height:6px}"; - append(document.head, style); -} - -function get_each_context$2(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[11] = list[i]; - return child_ctx; -} - -// (36:8) {#each metadata.dots as dot} -function create_each_block$2(ctx) { - let dot; - let current; - const dot_spread_levels = [/*dot*/ ctx[11]]; - let dot_props = {}; - - for (let i = 0; i < dot_spread_levels.length; i += 1) { - dot_props = assign(dot_props, dot_spread_levels[i]); - } - - dot = new Dot({ props: dot_props }); - - return { - c() { - create_component(dot.$$.fragment); - }, - m(target, anchor) { - mount_component(dot, target, anchor); - current = true; - }, - p(ctx, dirty) { - const dot_changes = (dirty & /*metadata*/ 128) - ? get_spread_update(dot_spread_levels, [get_spread_object(/*dot*/ ctx[11])]) - : {}; - - dot.$set(dot_changes); - }, - i(local) { - if (current) return; - transition_in(dot.$$.fragment, local); - current = true; - }, - o(local) { - transition_out(dot.$$.fragment, local); - current = false; - }, - d(detaching) { - destroy_component(dot, detaching); - } - }; -} - -// (22:2) -function create_default_slot$1(ctx) { - let div1; - let t0_value = /*date*/ ctx[0].format("D") + ""; - let t0; - let t1; - let div0; - let div1_class_value; - let current; - let mounted; - let dispose; - let each_value = /*metadata*/ ctx[7].dots; - let each_blocks = []; - - for (let i = 0; i < each_value.length; i += 1) { - each_blocks[i] = create_each_block$2(get_each_context$2(ctx, each_value, i)); - } - - const out = i => transition_out(each_blocks[i], 1, 1, () => { - each_blocks[i] = null; - }); - - let div1_levels = [ - { - class: div1_class_value = `day ${/*metadata*/ ctx[7].classes.join(" ")}` - }, - /*metadata*/ ctx[7].dataAttributes || {} - ]; - - let div1_data = {}; - - for (let i = 0; i < div1_levels.length; i += 1) { - div1_data = assign(div1_data, div1_levels[i]); - } - - return { - c() { - div1 = element("div"); - t0 = text(t0_value); - t1 = space(); - div0 = element("div"); - - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].c(); - } - - attr(div0, "class", "dot-container svelte-q3wqg9"); - set_attributes(div1, div1_data); - toggle_class(div1, "active", /*selectedId*/ ctx[6] === getDateUID_1(/*date*/ ctx[0], "day")); - toggle_class(div1, "adjacent-month", !/*date*/ ctx[0].isSame(/*displayedMonth*/ ctx[5], "month")); - toggle_class(div1, "today", /*date*/ ctx[0].isSame(/*today*/ ctx[4], "day")); - toggle_class(div1, "svelte-q3wqg9", true); - }, - m(target, anchor) { - insert(target, div1, anchor); - append(div1, t0); - append(div1, t1); - append(div1, div0); - - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].m(div0, null); - } - - current = true; - - if (!mounted) { - dispose = [ - listen(div1, "click", function () { - if (is_function(/*onClick*/ ctx[2] && /*click_handler*/ ctx[8])) (/*onClick*/ ctx[2] && /*click_handler*/ ctx[8]).apply(this, arguments); - }), - listen(div1, "contextmenu", function () { - if (is_function(/*onContextMenu*/ ctx[3] && /*contextmenu_handler*/ ctx[9])) (/*onContextMenu*/ ctx[3] && /*contextmenu_handler*/ ctx[9]).apply(this, arguments); - }), - listen(div1, "pointerover", function () { - if (is_function(/*onHover*/ ctx[1] && /*pointerover_handler*/ ctx[10])) (/*onHover*/ ctx[1] && /*pointerover_handler*/ ctx[10]).apply(this, arguments); - }) - ]; - - mounted = true; - } - }, - p(new_ctx, dirty) { - ctx = new_ctx; - if ((!current || dirty & /*date*/ 1) && t0_value !== (t0_value = /*date*/ ctx[0].format("D") + "")) set_data(t0, t0_value); - - if (dirty & /*metadata*/ 128) { - each_value = /*metadata*/ ctx[7].dots; - let i; - - for (i = 0; i < each_value.length; i += 1) { - const child_ctx = get_each_context$2(ctx, each_value, i); - - if (each_blocks[i]) { - each_blocks[i].p(child_ctx, dirty); - transition_in(each_blocks[i], 1); - } else { - each_blocks[i] = create_each_block$2(child_ctx); - each_blocks[i].c(); - transition_in(each_blocks[i], 1); - each_blocks[i].m(div0, null); - } - } - - group_outros(); - - for (i = each_value.length; i < each_blocks.length; i += 1) { - out(i); - } - - check_outros(); - } - - set_attributes(div1, div1_data = get_spread_update(div1_levels, [ - (!current || dirty & /*metadata*/ 128 && div1_class_value !== (div1_class_value = `day ${/*metadata*/ ctx[7].classes.join(" ")}`)) && { class: div1_class_value }, - dirty & /*metadata*/ 128 && (/*metadata*/ ctx[7].dataAttributes || {}) - ])); - - toggle_class(div1, "active", /*selectedId*/ ctx[6] === getDateUID_1(/*date*/ ctx[0], "day")); - toggle_class(div1, "adjacent-month", !/*date*/ ctx[0].isSame(/*displayedMonth*/ ctx[5], "month")); - toggle_class(div1, "today", /*date*/ ctx[0].isSame(/*today*/ ctx[4], "day")); - toggle_class(div1, "svelte-q3wqg9", true); - }, - i(local) { - if (current) return; - - for (let i = 0; i < each_value.length; i += 1) { - transition_in(each_blocks[i]); - } - - current = true; - }, - o(local) { - each_blocks = each_blocks.filter(Boolean); - - for (let i = 0; i < each_blocks.length; i += 1) { - transition_out(each_blocks[i]); - } - - current = false; - }, - d(detaching) { - if (detaching) detach(div1); - destroy_each(each_blocks, detaching); - mounted = false; - run_all(dispose); - } - }; -} - -function create_fragment$4(ctx) { - let td; - let metadataresolver; - let current; - - metadataresolver = new MetadataResolver({ - props: { - metadata: /*metadata*/ ctx[7], - $$slots: { - default: [ - create_default_slot$1, - ({ metadata }) => ({ 7: metadata }), - ({ metadata }) => metadata ? 128 : 0 - ] - }, - $$scope: { ctx } - } - }); - - return { - c() { - td = element("td"); - create_component(metadataresolver.$$.fragment); - }, - m(target, anchor) { - insert(target, td, anchor); - mount_component(metadataresolver, td, null); - current = true; - }, - p(ctx, [dirty]) { - const metadataresolver_changes = {}; - if (dirty & /*metadata*/ 128) metadataresolver_changes.metadata = /*metadata*/ ctx[7]; - - if (dirty & /*$$scope, metadata, selectedId, date, displayedMonth, today, onClick, onContextMenu, onHover*/ 16639) { - metadataresolver_changes.$$scope = { dirty, ctx }; - } - - metadataresolver.$set(metadataresolver_changes); - }, - i(local) { - if (current) return; - transition_in(metadataresolver.$$.fragment, local); - current = true; - }, - o(local) { - transition_out(metadataresolver.$$.fragment, local); - current = false; - }, - d(detaching) { - if (detaching) detach(td); - destroy_component(metadataresolver); - } - }; -} - -function instance$4($$self, $$props, $$invalidate) { - - - let { date } = $$props; - let { metadata } = $$props; - let { onHover } = $$props; - let { onClick } = $$props; - let { onContextMenu } = $$props; - let { today } = $$props; - let { displayedMonth = null } = $$props; - let { selectedId = null } = $$props; - const click_handler = e => onClick(date, isMetaPressed(e)); - const contextmenu_handler = e => onContextMenu(date, e); - const pointerover_handler = e => onHover(date, e.target, isMetaPressed(e)); - - $$self.$$set = $$props => { - if ("date" in $$props) $$invalidate(0, date = $$props.date); - if ("metadata" in $$props) $$invalidate(7, metadata = $$props.metadata); - if ("onHover" in $$props) $$invalidate(1, onHover = $$props.onHover); - if ("onClick" in $$props) $$invalidate(2, onClick = $$props.onClick); - if ("onContextMenu" in $$props) $$invalidate(3, onContextMenu = $$props.onContextMenu); - if ("today" in $$props) $$invalidate(4, today = $$props.today); - if ("displayedMonth" in $$props) $$invalidate(5, displayedMonth = $$props.displayedMonth); - if ("selectedId" in $$props) $$invalidate(6, selectedId = $$props.selectedId); - }; - - return [ - date, - onHover, - onClick, - onContextMenu, - today, - displayedMonth, - selectedId, - metadata, - click_handler, - contextmenu_handler, - pointerover_handler - ]; -} - -class Day extends SvelteComponent { - constructor(options) { - super(); - if (!document.getElementById("svelte-q3wqg9-style")) add_css$4(); - - init(this, options, instance$4, create_fragment$4, not_equal, { - date: 0, - metadata: 7, - onHover: 1, - onClick: 2, - onContextMenu: 3, - today: 4, - displayedMonth: 5, - selectedId: 6 - }); - } -} - -/* src/components/Arrow.svelte generated by Svelte v3.35.0 */ - -function add_css$3() { - var style = element("style"); - style.id = "svelte-156w7na-style"; - style.textContent = ".arrow.svelte-156w7na.svelte-156w7na{align-items:center;cursor:pointer;display:flex;justify-content:center;width:24px}.arrow.is-mobile.svelte-156w7na.svelte-156w7na{width:32px}.right.svelte-156w7na.svelte-156w7na{transform:rotate(180deg)}.arrow.svelte-156w7na svg.svelte-156w7na{color:var(--color-arrow);height:16px;width:16px}"; - append(document.head, style); -} - -function create_fragment$3(ctx) { - let div; - let svg; - let path; - let mounted; - let dispose; - - return { - c() { - div = element("div"); - svg = svg_element("svg"); - path = svg_element("path"); - attr(path, "fill", "currentColor"); - attr(path, "d", "M34.52 239.03L228.87 44.69c9.37-9.37 24.57-9.37 33.94 0l22.67 22.67c9.36 9.36 9.37 24.52.04 33.9L131.49 256l154.02 154.75c9.34 9.38 9.32 24.54-.04 33.9l-22.67 22.67c-9.37 9.37-24.57 9.37-33.94 0L34.52 272.97c-9.37-9.37-9.37-24.57 0-33.94z"); - attr(svg, "focusable", "false"); - attr(svg, "role", "img"); - attr(svg, "xmlns", "http://www.w3.org/2000/svg"); - attr(svg, "viewBox", "0 0 320 512"); - attr(svg, "class", "svelte-156w7na"); - attr(div, "class", "arrow svelte-156w7na"); - attr(div, "aria-label", /*tooltip*/ ctx[1]); - toggle_class(div, "is-mobile", /*isMobile*/ ctx[3]); - toggle_class(div, "right", /*direction*/ ctx[2] === "right"); - }, - m(target, anchor) { - insert(target, div, anchor); - append(div, svg); - append(svg, path); - - if (!mounted) { - dispose = listen(div, "click", function () { - if (is_function(/*onClick*/ ctx[0])) /*onClick*/ ctx[0].apply(this, arguments); - }); - - mounted = true; - } - }, - p(new_ctx, [dirty]) { - ctx = new_ctx; - - if (dirty & /*tooltip*/ 2) { - attr(div, "aria-label", /*tooltip*/ ctx[1]); - } - - if (dirty & /*direction*/ 4) { - toggle_class(div, "right", /*direction*/ ctx[2] === "right"); - } - }, - i: noop, - o: noop, - d(detaching) { - if (detaching) detach(div); - mounted = false; - dispose(); - } - }; -} - -function instance$3($$self, $$props, $$invalidate) { - let { onClick } = $$props; - let { tooltip } = $$props; - let { direction } = $$props; - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - let isMobile = window.app.isMobile; - - $$self.$$set = $$props => { - if ("onClick" in $$props) $$invalidate(0, onClick = $$props.onClick); - if ("tooltip" in $$props) $$invalidate(1, tooltip = $$props.tooltip); - if ("direction" in $$props) $$invalidate(2, direction = $$props.direction); - }; - - return [onClick, tooltip, direction, isMobile]; -} - -class Arrow extends SvelteComponent { - constructor(options) { - super(); - if (!document.getElementById("svelte-156w7na-style")) add_css$3(); - init(this, options, instance$3, create_fragment$3, safe_not_equal, { onClick: 0, tooltip: 1, direction: 2 }); - } -} - -/* src/components/Nav.svelte generated by Svelte v3.35.0 */ - -function add_css$2() { - var style = element("style"); - style.id = "svelte-1vwr9dd-style"; - style.textContent = ".nav.svelte-1vwr9dd.svelte-1vwr9dd{align-items:center;display:flex;margin:0.6em 0 1em;padding:0 8px;width:100%}.nav.is-mobile.svelte-1vwr9dd.svelte-1vwr9dd{padding:0}.title.svelte-1vwr9dd.svelte-1vwr9dd{color:var(--color-text-title);font-size:1.5em;margin:0}.is-mobile.svelte-1vwr9dd .title.svelte-1vwr9dd{font-size:1.3em}.month.svelte-1vwr9dd.svelte-1vwr9dd{font-weight:500;text-transform:capitalize}.year.svelte-1vwr9dd.svelte-1vwr9dd{color:var(--interactive-accent)}.right-nav.svelte-1vwr9dd.svelte-1vwr9dd{display:flex;justify-content:center;margin-left:auto}.reset-button.svelte-1vwr9dd.svelte-1vwr9dd{cursor:pointer;border-radius:4px;color:var(--text-muted);font-size:0.7em;font-weight:600;letter-spacing:1px;margin:0 4px;padding:0px 4px;text-transform:uppercase}.is-mobile.svelte-1vwr9dd .reset-button.svelte-1vwr9dd{display:none}"; - append(document.head, style); -} - -function create_fragment$2(ctx) { - let div2; - let h3; - let span0; - let t0_value = /*displayedMonth*/ ctx[0].format("MMM") + ""; - let t0; - let t1; - let span1; - let t2_value = /*displayedMonth*/ ctx[0].format("YYYY") + ""; - let t2; - let t3; - let div1; - let arrow0; - let t4; - let div0; - let t6; - let arrow1; - let current; - let mounted; - let dispose; - - arrow0 = new Arrow({ - props: { - direction: "left", - onClick: /*decrementDisplayedMonth*/ ctx[3], - tooltip: "Previous Month" - } - }); - - arrow1 = new Arrow({ - props: { - direction: "right", - onClick: /*incrementDisplayedMonth*/ ctx[2], - tooltip: "Next Month" - } - }); - - return { - c() { - div2 = element("div"); - h3 = element("h3"); - span0 = element("span"); - t0 = text(t0_value); - t1 = space(); - span1 = element("span"); - t2 = text(t2_value); - t3 = space(); - div1 = element("div"); - create_component(arrow0.$$.fragment); - t4 = space(); - div0 = element("div"); - div0.textContent = `${/*todayDisplayStr*/ ctx[4]}`; - t6 = space(); - create_component(arrow1.$$.fragment); - attr(span0, "class", "month svelte-1vwr9dd"); - attr(span1, "class", "year svelte-1vwr9dd"); - attr(h3, "class", "title svelte-1vwr9dd"); - attr(div0, "class", "reset-button svelte-1vwr9dd"); - attr(div1, "class", "right-nav svelte-1vwr9dd"); - attr(div2, "class", "nav svelte-1vwr9dd"); - toggle_class(div2, "is-mobile", /*isMobile*/ ctx[5]); - }, - m(target, anchor) { - insert(target, div2, anchor); - append(div2, h3); - append(h3, span0); - append(span0, t0); - append(h3, t1); - append(h3, span1); - append(span1, t2); - append(div2, t3); - append(div2, div1); - mount_component(arrow0, div1, null); - append(div1, t4); - append(div1, div0); - append(div1, t6); - mount_component(arrow1, div1, null); - current = true; - - if (!mounted) { - dispose = [ - listen(h3, "click", function () { - if (is_function(/*resetDisplayedMonth*/ ctx[1])) /*resetDisplayedMonth*/ ctx[1].apply(this, arguments); - }), - listen(div0, "click", function () { - if (is_function(/*resetDisplayedMonth*/ ctx[1])) /*resetDisplayedMonth*/ ctx[1].apply(this, arguments); - }) - ]; - - mounted = true; - } - }, - p(new_ctx, [dirty]) { - ctx = new_ctx; - if ((!current || dirty & /*displayedMonth*/ 1) && t0_value !== (t0_value = /*displayedMonth*/ ctx[0].format("MMM") + "")) set_data(t0, t0_value); - if ((!current || dirty & /*displayedMonth*/ 1) && t2_value !== (t2_value = /*displayedMonth*/ ctx[0].format("YYYY") + "")) set_data(t2, t2_value); - const arrow0_changes = {}; - if (dirty & /*decrementDisplayedMonth*/ 8) arrow0_changes.onClick = /*decrementDisplayedMonth*/ ctx[3]; - arrow0.$set(arrow0_changes); - const arrow1_changes = {}; - if (dirty & /*incrementDisplayedMonth*/ 4) arrow1_changes.onClick = /*incrementDisplayedMonth*/ ctx[2]; - arrow1.$set(arrow1_changes); - }, - i(local) { - if (current) return; - transition_in(arrow0.$$.fragment, local); - transition_in(arrow1.$$.fragment, local); - current = true; - }, - o(local) { - transition_out(arrow0.$$.fragment, local); - transition_out(arrow1.$$.fragment, local); - current = false; - }, - d(detaching) { - if (detaching) detach(div2); - destroy_component(arrow0); - destroy_component(arrow1); - mounted = false; - run_all(dispose); - } - }; -} - -function instance$2($$self, $$props, $$invalidate) { - - let { displayedMonth } = $$props; - let { today } = $$props; - let { resetDisplayedMonth } = $$props; - let { incrementDisplayedMonth } = $$props; - let { decrementDisplayedMonth } = $$props; - - // Get the word 'Today' but localized to the current language - const todayDisplayStr = today.calendar().split(/\d|\s/)[0]; - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - let isMobile = window.app.isMobile; - - $$self.$$set = $$props => { - if ("displayedMonth" in $$props) $$invalidate(0, displayedMonth = $$props.displayedMonth); - if ("today" in $$props) $$invalidate(6, today = $$props.today); - if ("resetDisplayedMonth" in $$props) $$invalidate(1, resetDisplayedMonth = $$props.resetDisplayedMonth); - if ("incrementDisplayedMonth" in $$props) $$invalidate(2, incrementDisplayedMonth = $$props.incrementDisplayedMonth); - if ("decrementDisplayedMonth" in $$props) $$invalidate(3, decrementDisplayedMonth = $$props.decrementDisplayedMonth); - }; - - return [ - displayedMonth, - resetDisplayedMonth, - incrementDisplayedMonth, - decrementDisplayedMonth, - todayDisplayStr, - isMobile, - today - ]; -} - -class Nav extends SvelteComponent { - constructor(options) { - super(); - if (!document.getElementById("svelte-1vwr9dd-style")) add_css$2(); - - init(this, options, instance$2, create_fragment$2, safe_not_equal, { - displayedMonth: 0, - today: 6, - resetDisplayedMonth: 1, - incrementDisplayedMonth: 2, - decrementDisplayedMonth: 3 - }); - } -} - -/* src/components/WeekNum.svelte generated by Svelte v3.35.0 */ - -function add_css$1() { - var style = element("style"); - style.id = "svelte-egt0yd-style"; - style.textContent = "td.svelte-egt0yd{border-right:1px solid var(--background-modifier-border)}.week-num.svelte-egt0yd{background-color:var(--color-background-weeknum);border-radius:4px;color:var(--color-text-weeknum);cursor:pointer;font-size:0.65em;height:100%;padding:4px;text-align:center;transition:background-color 0.1s ease-in, color 0.1s ease-in;vertical-align:baseline}.week-num.svelte-egt0yd:hover{background-color:var(--interactive-hover)}.week-num.active.svelte-egt0yd:hover{background-color:var(--interactive-accent-hover)}.active.svelte-egt0yd{color:var(--text-on-accent);background-color:var(--interactive-accent)}.dot-container.svelte-egt0yd{display:flex;flex-wrap:wrap;justify-content:center;line-height:6px;min-height:6px}"; - append(document.head, style); -} - -function get_each_context$1(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[11] = list[i]; - return child_ctx; -} - -// (35:8) {#each metadata.dots as dot} -function create_each_block$1(ctx) { - let dot; - let current; - const dot_spread_levels = [/*dot*/ ctx[11]]; - let dot_props = {}; - - for (let i = 0; i < dot_spread_levels.length; i += 1) { - dot_props = assign(dot_props, dot_spread_levels[i]); - } - - dot = new Dot({ props: dot_props }); - - return { - c() { - create_component(dot.$$.fragment); - }, - m(target, anchor) { - mount_component(dot, target, anchor); - current = true; - }, - p(ctx, dirty) { - const dot_changes = (dirty & /*metadata*/ 64) - ? get_spread_update(dot_spread_levels, [get_spread_object(/*dot*/ ctx[11])]) - : {}; - - dot.$set(dot_changes); - }, - i(local) { - if (current) return; - transition_in(dot.$$.fragment, local); - current = true; - }, - o(local) { - transition_out(dot.$$.fragment, local); - current = false; - }, - d(detaching) { - destroy_component(dot, detaching); - } - }; -} - -// (24:2) -function create_default_slot(ctx) { - let div1; - let t0; - let t1; - let div0; - let div1_class_value; - let current; - let mounted; - let dispose; - let each_value = /*metadata*/ ctx[6].dots; - let each_blocks = []; - - for (let i = 0; i < each_value.length; i += 1) { - each_blocks[i] = create_each_block$1(get_each_context$1(ctx, each_value, i)); - } - - const out = i => transition_out(each_blocks[i], 1, 1, () => { - each_blocks[i] = null; - }); - - return { - c() { - div1 = element("div"); - t0 = text(/*weekNum*/ ctx[0]); - t1 = space(); - div0 = element("div"); - - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].c(); - } - - attr(div0, "class", "dot-container svelte-egt0yd"); - attr(div1, "class", div1_class_value = "" + (null_to_empty(`week-num ${/*metadata*/ ctx[6].classes.join(" ")}`) + " svelte-egt0yd")); - toggle_class(div1, "active", /*selectedId*/ ctx[5] === getDateUID_1(/*days*/ ctx[1][0], "week")); - }, - m(target, anchor) { - insert(target, div1, anchor); - append(div1, t0); - append(div1, t1); - append(div1, div0); - - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].m(div0, null); - } - - current = true; - - if (!mounted) { - dispose = [ - listen(div1, "click", function () { - if (is_function(/*onClick*/ ctx[3] && /*click_handler*/ ctx[8])) (/*onClick*/ ctx[3] && /*click_handler*/ ctx[8]).apply(this, arguments); - }), - listen(div1, "contextmenu", function () { - if (is_function(/*onContextMenu*/ ctx[4] && /*contextmenu_handler*/ ctx[9])) (/*onContextMenu*/ ctx[4] && /*contextmenu_handler*/ ctx[9]).apply(this, arguments); - }), - listen(div1, "pointerover", function () { - if (is_function(/*onHover*/ ctx[2] && /*pointerover_handler*/ ctx[10])) (/*onHover*/ ctx[2] && /*pointerover_handler*/ ctx[10]).apply(this, arguments); - }) - ]; - - mounted = true; - } - }, - p(new_ctx, dirty) { - ctx = new_ctx; - if (!current || dirty & /*weekNum*/ 1) set_data(t0, /*weekNum*/ ctx[0]); - - if (dirty & /*metadata*/ 64) { - each_value = /*metadata*/ ctx[6].dots; - let i; - - for (i = 0; i < each_value.length; i += 1) { - const child_ctx = get_each_context$1(ctx, each_value, i); - - if (each_blocks[i]) { - each_blocks[i].p(child_ctx, dirty); - transition_in(each_blocks[i], 1); - } else { - each_blocks[i] = create_each_block$1(child_ctx); - each_blocks[i].c(); - transition_in(each_blocks[i], 1); - each_blocks[i].m(div0, null); - } - } - - group_outros(); - - for (i = each_value.length; i < each_blocks.length; i += 1) { - out(i); - } - - check_outros(); - } - - if (!current || dirty & /*metadata*/ 64 && div1_class_value !== (div1_class_value = "" + (null_to_empty(`week-num ${/*metadata*/ ctx[6].classes.join(" ")}`) + " svelte-egt0yd"))) { - attr(div1, "class", div1_class_value); - } - - if (dirty & /*metadata, selectedId, getDateUID, days*/ 98) { - toggle_class(div1, "active", /*selectedId*/ ctx[5] === getDateUID_1(/*days*/ ctx[1][0], "week")); - } - }, - i(local) { - if (current) return; - - for (let i = 0; i < each_value.length; i += 1) { - transition_in(each_blocks[i]); - } - - current = true; - }, - o(local) { - each_blocks = each_blocks.filter(Boolean); - - for (let i = 0; i < each_blocks.length; i += 1) { - transition_out(each_blocks[i]); - } - - current = false; - }, - d(detaching) { - if (detaching) detach(div1); - destroy_each(each_blocks, detaching); - mounted = false; - run_all(dispose); - } - }; -} - -function create_fragment$1(ctx) { - let td; - let metadataresolver; - let current; - - metadataresolver = new MetadataResolver({ - props: { - metadata: /*metadata*/ ctx[6], - $$slots: { - default: [ - create_default_slot, - ({ metadata }) => ({ 6: metadata }), - ({ metadata }) => metadata ? 64 : 0 - ] - }, - $$scope: { ctx } - } - }); - - return { - c() { - td = element("td"); - create_component(metadataresolver.$$.fragment); - attr(td, "class", "svelte-egt0yd"); - }, - m(target, anchor) { - insert(target, td, anchor); - mount_component(metadataresolver, td, null); - current = true; - }, - p(ctx, [dirty]) { - const metadataresolver_changes = {}; - if (dirty & /*metadata*/ 64) metadataresolver_changes.metadata = /*metadata*/ ctx[6]; - - if (dirty & /*$$scope, metadata, selectedId, days, onClick, startOfWeek, onContextMenu, onHover, weekNum*/ 16639) { - metadataresolver_changes.$$scope = { dirty, ctx }; - } - - metadataresolver.$set(metadataresolver_changes); - }, - i(local) { - if (current) return; - transition_in(metadataresolver.$$.fragment, local); - current = true; - }, - o(local) { - transition_out(metadataresolver.$$.fragment, local); - current = false; - }, - d(detaching) { - if (detaching) detach(td); - destroy_component(metadataresolver); - } - }; -} - -function instance$1($$self, $$props, $$invalidate) { - - - let { weekNum } = $$props; - let { days } = $$props; - let { metadata } = $$props; - let { onHover } = $$props; - let { onClick } = $$props; - let { onContextMenu } = $$props; - let { selectedId = null } = $$props; - let startOfWeek; - const click_handler = e => onClick(startOfWeek, isMetaPressed(e)); - const contextmenu_handler = e => onContextMenu(days[0], e); - const pointerover_handler = e => onHover(startOfWeek, e.target, isMetaPressed(e)); - - $$self.$$set = $$props => { - if ("weekNum" in $$props) $$invalidate(0, weekNum = $$props.weekNum); - if ("days" in $$props) $$invalidate(1, days = $$props.days); - if ("metadata" in $$props) $$invalidate(6, metadata = $$props.metadata); - if ("onHover" in $$props) $$invalidate(2, onHover = $$props.onHover); - if ("onClick" in $$props) $$invalidate(3, onClick = $$props.onClick); - if ("onContextMenu" in $$props) $$invalidate(4, onContextMenu = $$props.onContextMenu); - if ("selectedId" in $$props) $$invalidate(5, selectedId = $$props.selectedId); - }; - - $$self.$$.update = () => { - if ($$self.$$.dirty & /*days*/ 2) { - $$invalidate(7, startOfWeek = getStartOfWeek(days)); - } - }; - - return [ - weekNum, - days, - onHover, - onClick, - onContextMenu, - selectedId, - metadata, - startOfWeek, - click_handler, - contextmenu_handler, - pointerover_handler - ]; -} - -class WeekNum extends SvelteComponent { - constructor(options) { - super(); - if (!document.getElementById("svelte-egt0yd-style")) add_css$1(); - - init(this, options, instance$1, create_fragment$1, not_equal, { - weekNum: 0, - days: 1, - metadata: 6, - onHover: 2, - onClick: 3, - onContextMenu: 4, - selectedId: 5 - }); - } -} - -async function metadataReducer(promisedMetadata) { - const meta = { - dots: [], - classes: [], - dataAttributes: {}, - }; - const metas = await Promise.all(promisedMetadata); - return metas.reduce((acc, meta) => ({ - classes: [...acc.classes, ...(meta.classes || [])], - dataAttributes: Object.assign(acc.dataAttributes, meta.dataAttributes), - dots: [...acc.dots, ...(meta.dots || [])], - }), meta); -} -function getDailyMetadata(sources, date, ..._args) { - return metadataReducer(sources.map((source) => source.getDailyMetadata(date))); -} -function getWeeklyMetadata(sources, date, ..._args) { - return metadataReducer(sources.map((source) => source.getWeeklyMetadata(date))); -} - -/* src/components/Calendar.svelte generated by Svelte v3.35.0 */ - -function add_css() { - var style = element("style"); - style.id = "svelte-pcimu8-style"; - style.textContent = ".container.svelte-pcimu8{--color-background-heading:transparent;--color-background-day:transparent;--color-background-weeknum:transparent;--color-background-weekend:transparent;--color-dot:var(--text-muted);--color-arrow:var(--text-muted);--color-button:var(--text-muted);--color-text-title:var(--text-normal);--color-text-heading:var(--text-muted);--color-text-day:var(--text-normal);--color-text-today:var(--interactive-accent);--color-text-weeknum:var(--text-muted)}.container.svelte-pcimu8{padding:0 8px}.container.is-mobile.svelte-pcimu8{padding:0}th.svelte-pcimu8{text-align:center}.weekend.svelte-pcimu8{background-color:var(--color-background-weekend)}.calendar.svelte-pcimu8{border-collapse:collapse;width:100%}th.svelte-pcimu8{background-color:var(--color-background-heading);color:var(--color-text-heading);font-size:0.6em;letter-spacing:1px;padding:4px;text-transform:uppercase}"; - append(document.head, style); -} - -function get_each_context(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[18] = list[i]; - return child_ctx; -} - -function get_each_context_1(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[21] = list[i]; - return child_ctx; -} - -function get_each_context_2(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[24] = list[i]; - return child_ctx; -} - -function get_each_context_3(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[27] = list[i]; - return child_ctx; -} - -// (55:6) {#if showWeekNums} -function create_if_block_2(ctx) { - let col; - - return { - c() { - col = element("col"); - }, - m(target, anchor) { - insert(target, col, anchor); - }, - d(detaching) { - if (detaching) detach(col); - } - }; -} - -// (58:6) {#each month[1].days as date} -function create_each_block_3(ctx) { - let col; - - return { - c() { - col = element("col"); - attr(col, "class", "svelte-pcimu8"); - toggle_class(col, "weekend", isWeekend(/*date*/ ctx[27])); - }, - m(target, anchor) { - insert(target, col, anchor); - }, - p(ctx, dirty) { - if (dirty & /*isWeekend, month*/ 16384) { - toggle_class(col, "weekend", isWeekend(/*date*/ ctx[27])); - } - }, - d(detaching) { - if (detaching) detach(col); - } - }; -} - -// (64:8) {#if showWeekNums} -function create_if_block_1(ctx) { - let th; - - return { - c() { - th = element("th"); - th.textContent = "W"; - attr(th, "class", "svelte-pcimu8"); - }, - m(target, anchor) { - insert(target, th, anchor); - }, - d(detaching) { - if (detaching) detach(th); - } - }; -} - -// (67:8) {#each daysOfWeek as dayOfWeek} -function create_each_block_2(ctx) { - let th; - let t_value = /*dayOfWeek*/ ctx[24] + ""; - let t; - - return { - c() { - th = element("th"); - t = text(t_value); - attr(th, "class", "svelte-pcimu8"); - }, - m(target, anchor) { - insert(target, th, anchor); - append(th, t); - }, - p(ctx, dirty) { - if (dirty & /*daysOfWeek*/ 32768 && t_value !== (t_value = /*dayOfWeek*/ ctx[24] + "")) set_data(t, t_value); - }, - d(detaching) { - if (detaching) detach(th); - } - }; -} - -// (75:10) {#if showWeekNums} -function create_if_block(ctx) { - let weeknum; - let current; - - const weeknum_spread_levels = [ - /*week*/ ctx[18], - { - metadata: getWeeklyMetadata(/*sources*/ ctx[8], /*week*/ ctx[18].days[0], /*today*/ ctx[10]) - }, - { onClick: /*onClickWeek*/ ctx[7] }, - { - onContextMenu: /*onContextMenuWeek*/ ctx[5] - }, - { onHover: /*onHoverWeek*/ ctx[3] }, - { selectedId: /*selectedId*/ ctx[9] } - ]; - - let weeknum_props = {}; - - for (let i = 0; i < weeknum_spread_levels.length; i += 1) { - weeknum_props = assign(weeknum_props, weeknum_spread_levels[i]); - } - - weeknum = new WeekNum({ props: weeknum_props }); - - return { - c() { - create_component(weeknum.$$.fragment); - }, - m(target, anchor) { - mount_component(weeknum, target, anchor); - current = true; - }, - p(ctx, dirty) { - const weeknum_changes = (dirty & /*month, getWeeklyMetadata, sources, today, onClickWeek, onContextMenuWeek, onHoverWeek, selectedId*/ 18344) - ? get_spread_update(weeknum_spread_levels, [ - dirty & /*month*/ 16384 && get_spread_object(/*week*/ ctx[18]), - dirty & /*getWeeklyMetadata, sources, month, today*/ 17664 && { - metadata: getWeeklyMetadata(/*sources*/ ctx[8], /*week*/ ctx[18].days[0], /*today*/ ctx[10]) - }, - dirty & /*onClickWeek*/ 128 && { onClick: /*onClickWeek*/ ctx[7] }, - dirty & /*onContextMenuWeek*/ 32 && { - onContextMenu: /*onContextMenuWeek*/ ctx[5] - }, - dirty & /*onHoverWeek*/ 8 && { onHover: /*onHoverWeek*/ ctx[3] }, - dirty & /*selectedId*/ 512 && { selectedId: /*selectedId*/ ctx[9] } - ]) - : {}; - - weeknum.$set(weeknum_changes); - }, - i(local) { - if (current) return; - transition_in(weeknum.$$.fragment, local); - current = true; - }, - o(local) { - transition_out(weeknum.$$.fragment, local); - current = false; - }, - d(detaching) { - destroy_component(weeknum, detaching); - } - }; -} - -// (85:10) {#each week.days as day (day.format())} -function create_each_block_1(key_1, ctx) { - let first; - let day; - let current; - - day = new Day({ - props: { - date: /*day*/ ctx[21], - today: /*today*/ ctx[10], - displayedMonth: /*displayedMonth*/ ctx[0], - onClick: /*onClickDay*/ ctx[6], - onContextMenu: /*onContextMenuDay*/ ctx[4], - onHover: /*onHoverDay*/ ctx[2], - metadata: getDailyMetadata(/*sources*/ ctx[8], /*day*/ ctx[21], /*today*/ ctx[10]), - selectedId: /*selectedId*/ ctx[9] - } - }); - - return { - key: key_1, - first: null, - c() { - first = empty(); - create_component(day.$$.fragment); - this.first = first; - }, - m(target, anchor) { - insert(target, first, anchor); - mount_component(day, target, anchor); - current = true; - }, - p(new_ctx, dirty) { - ctx = new_ctx; - const day_changes = {}; - if (dirty & /*month*/ 16384) day_changes.date = /*day*/ ctx[21]; - if (dirty & /*today*/ 1024) day_changes.today = /*today*/ ctx[10]; - if (dirty & /*displayedMonth*/ 1) day_changes.displayedMonth = /*displayedMonth*/ ctx[0]; - if (dirty & /*onClickDay*/ 64) day_changes.onClick = /*onClickDay*/ ctx[6]; - if (dirty & /*onContextMenuDay*/ 16) day_changes.onContextMenu = /*onContextMenuDay*/ ctx[4]; - if (dirty & /*onHoverDay*/ 4) day_changes.onHover = /*onHoverDay*/ ctx[2]; - if (dirty & /*sources, month, today*/ 17664) day_changes.metadata = getDailyMetadata(/*sources*/ ctx[8], /*day*/ ctx[21], /*today*/ ctx[10]); - if (dirty & /*selectedId*/ 512) day_changes.selectedId = /*selectedId*/ ctx[9]; - day.$set(day_changes); - }, - i(local) { - if (current) return; - transition_in(day.$$.fragment, local); - current = true; - }, - o(local) { - transition_out(day.$$.fragment, local); - current = false; - }, - d(detaching) { - if (detaching) detach(first); - destroy_component(day, detaching); - } - }; -} - -// (73:6) {#each month as week (week.weekNum)} -function create_each_block(key_1, ctx) { - let tr; - let t0; - let each_blocks = []; - let each_1_lookup = new Map(); - let t1; - let current; - let if_block = /*showWeekNums*/ ctx[1] && create_if_block(ctx); - let each_value_1 = /*week*/ ctx[18].days; - const get_key = ctx => /*day*/ ctx[21].format(); - - for (let i = 0; i < each_value_1.length; i += 1) { - let child_ctx = get_each_context_1(ctx, each_value_1, i); - let key = get_key(child_ctx); - each_1_lookup.set(key, each_blocks[i] = create_each_block_1(key, child_ctx)); - } - - return { - key: key_1, - first: null, - c() { - tr = element("tr"); - if (if_block) if_block.c(); - t0 = space(); - - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].c(); - } - - t1 = space(); - this.first = tr; - }, - m(target, anchor) { - insert(target, tr, anchor); - if (if_block) if_block.m(tr, null); - append(tr, t0); - - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].m(tr, null); - } - - append(tr, t1); - current = true; - }, - p(new_ctx, dirty) { - ctx = new_ctx; - - if (/*showWeekNums*/ ctx[1]) { - if (if_block) { - if_block.p(ctx, dirty); - - if (dirty & /*showWeekNums*/ 2) { - transition_in(if_block, 1); - } - } else { - if_block = create_if_block(ctx); - if_block.c(); - transition_in(if_block, 1); - if_block.m(tr, t0); - } - } else if (if_block) { - group_outros(); - - transition_out(if_block, 1, 1, () => { - if_block = null; - }); - - check_outros(); - } - - if (dirty & /*month, today, displayedMonth, onClickDay, onContextMenuDay, onHoverDay, getDailyMetadata, sources, selectedId*/ 18261) { - each_value_1 = /*week*/ ctx[18].days; - group_outros(); - each_blocks = update_keyed_each(each_blocks, dirty, get_key, 1, ctx, each_value_1, each_1_lookup, tr, outro_and_destroy_block, create_each_block_1, t1, get_each_context_1); - check_outros(); - } - }, - i(local) { - if (current) return; - transition_in(if_block); - - for (let i = 0; i < each_value_1.length; i += 1) { - transition_in(each_blocks[i]); - } - - current = true; - }, - o(local) { - transition_out(if_block); - - for (let i = 0; i < each_blocks.length; i += 1) { - transition_out(each_blocks[i]); - } - - current = false; - }, - d(detaching) { - if (detaching) detach(tr); - if (if_block) if_block.d(); - - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].d(); - } - } - }; -} - -function create_fragment(ctx) { - let div; - let nav; - let t0; - let table; - let colgroup; - let t1; - let t2; - let thead; - let tr; - let t3; - let t4; - let tbody; - let each_blocks = []; - let each2_lookup = new Map(); - let current; - - nav = new Nav({ - props: { - today: /*today*/ ctx[10], - displayedMonth: /*displayedMonth*/ ctx[0], - incrementDisplayedMonth: /*incrementDisplayedMonth*/ ctx[11], - decrementDisplayedMonth: /*decrementDisplayedMonth*/ ctx[12], - resetDisplayedMonth: /*resetDisplayedMonth*/ ctx[13] - } - }); - - let if_block0 = /*showWeekNums*/ ctx[1] && create_if_block_2(); - let each_value_3 = /*month*/ ctx[14][1].days; - let each_blocks_2 = []; - - for (let i = 0; i < each_value_3.length; i += 1) { - each_blocks_2[i] = create_each_block_3(get_each_context_3(ctx, each_value_3, i)); - } - - let if_block1 = /*showWeekNums*/ ctx[1] && create_if_block_1(); - let each_value_2 = /*daysOfWeek*/ ctx[15]; - let each_blocks_1 = []; - - for (let i = 0; i < each_value_2.length; i += 1) { - each_blocks_1[i] = create_each_block_2(get_each_context_2(ctx, each_value_2, i)); - } - - let each_value = /*month*/ ctx[14]; - const get_key = ctx => /*week*/ ctx[18].weekNum; - - for (let i = 0; i < each_value.length; i += 1) { - let child_ctx = get_each_context(ctx, each_value, i); - let key = get_key(child_ctx); - each2_lookup.set(key, each_blocks[i] = create_each_block(key, child_ctx)); - } - - return { - c() { - div = element("div"); - create_component(nav.$$.fragment); - t0 = space(); - table = element("table"); - colgroup = element("colgroup"); - if (if_block0) if_block0.c(); - t1 = space(); - - for (let i = 0; i < each_blocks_2.length; i += 1) { - each_blocks_2[i].c(); - } - - t2 = space(); - thead = element("thead"); - tr = element("tr"); - if (if_block1) if_block1.c(); - t3 = space(); - - for (let i = 0; i < each_blocks_1.length; i += 1) { - each_blocks_1[i].c(); - } - - t4 = space(); - tbody = element("tbody"); - - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].c(); - } - - attr(table, "class", "calendar svelte-pcimu8"); - attr(div, "id", "calendar-container"); - attr(div, "class", "container svelte-pcimu8"); - toggle_class(div, "is-mobile", /*isMobile*/ ctx[16]); - }, - m(target, anchor) { - insert(target, div, anchor); - mount_component(nav, div, null); - append(div, t0); - append(div, table); - append(table, colgroup); - if (if_block0) if_block0.m(colgroup, null); - append(colgroup, t1); - - for (let i = 0; i < each_blocks_2.length; i += 1) { - each_blocks_2[i].m(colgroup, null); - } - - append(table, t2); - append(table, thead); - append(thead, tr); - if (if_block1) if_block1.m(tr, null); - append(tr, t3); - - for (let i = 0; i < each_blocks_1.length; i += 1) { - each_blocks_1[i].m(tr, null); - } - - append(table, t4); - append(table, tbody); - - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].m(tbody, null); - } - - current = true; - }, - p(ctx, [dirty]) { - const nav_changes = {}; - if (dirty & /*today*/ 1024) nav_changes.today = /*today*/ ctx[10]; - if (dirty & /*displayedMonth*/ 1) nav_changes.displayedMonth = /*displayedMonth*/ ctx[0]; - nav.$set(nav_changes); - - if (/*showWeekNums*/ ctx[1]) { - if (if_block0) ; else { - if_block0 = create_if_block_2(); - if_block0.c(); - if_block0.m(colgroup, t1); - } - } else if (if_block0) { - if_block0.d(1); - if_block0 = null; - } - - if (dirty & /*isWeekend, month*/ 16384) { - each_value_3 = /*month*/ ctx[14][1].days; - let i; - - for (i = 0; i < each_value_3.length; i += 1) { - const child_ctx = get_each_context_3(ctx, each_value_3, i); - - if (each_blocks_2[i]) { - each_blocks_2[i].p(child_ctx, dirty); - } else { - each_blocks_2[i] = create_each_block_3(child_ctx); - each_blocks_2[i].c(); - each_blocks_2[i].m(colgroup, null); - } - } - - for (; i < each_blocks_2.length; i += 1) { - each_blocks_2[i].d(1); - } - - each_blocks_2.length = each_value_3.length; - } - - if (/*showWeekNums*/ ctx[1]) { - if (if_block1) ; else { - if_block1 = create_if_block_1(); - if_block1.c(); - if_block1.m(tr, t3); - } - } else if (if_block1) { - if_block1.d(1); - if_block1 = null; - } - - if (dirty & /*daysOfWeek*/ 32768) { - each_value_2 = /*daysOfWeek*/ ctx[15]; - let i; - - for (i = 0; i < each_value_2.length; i += 1) { - const child_ctx = get_each_context_2(ctx, each_value_2, i); - - if (each_blocks_1[i]) { - each_blocks_1[i].p(child_ctx, dirty); - } else { - each_blocks_1[i] = create_each_block_2(child_ctx); - each_blocks_1[i].c(); - each_blocks_1[i].m(tr, null); - } - } - - for (; i < each_blocks_1.length; i += 1) { - each_blocks_1[i].d(1); - } - - each_blocks_1.length = each_value_2.length; - } - - if (dirty & /*month, today, displayedMonth, onClickDay, onContextMenuDay, onHoverDay, getDailyMetadata, sources, selectedId, getWeeklyMetadata, onClickWeek, onContextMenuWeek, onHoverWeek, showWeekNums*/ 18431) { - each_value = /*month*/ ctx[14]; - group_outros(); - each_blocks = update_keyed_each(each_blocks, dirty, get_key, 1, ctx, each_value, each2_lookup, tbody, outro_and_destroy_block, create_each_block, null, get_each_context); - check_outros(); - } - }, - i(local) { - if (current) return; - transition_in(nav.$$.fragment, local); - - for (let i = 0; i < each_value.length; i += 1) { - transition_in(each_blocks[i]); - } - - current = true; - }, - o(local) { - transition_out(nav.$$.fragment, local); - - for (let i = 0; i < each_blocks.length; i += 1) { - transition_out(each_blocks[i]); - } - - current = false; - }, - d(detaching) { - if (detaching) detach(div); - destroy_component(nav); - if (if_block0) if_block0.d(); - destroy_each(each_blocks_2, detaching); - if (if_block1) if_block1.d(); - destroy_each(each_blocks_1, detaching); - - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].d(); - } - } - }; -} - -function instance($$self, $$props, $$invalidate) { - - - let { localeData } = $$props; - let { showWeekNums = false } = $$props; - let { onHoverDay } = $$props; - let { onHoverWeek } = $$props; - let { onContextMenuDay } = $$props; - let { onContextMenuWeek } = $$props; - let { onClickDay } = $$props; - let { onClickWeek } = $$props; - let { sources = [] } = $$props; - let { selectedId } = $$props; - let { today = window.moment() } = $$props; - let { displayedMonth = today } = $$props; - let month; - let daysOfWeek; - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - let isMobile = window.app.isMobile; - - function incrementDisplayedMonth() { - $$invalidate(0, displayedMonth = displayedMonth.clone().add(1, "month")); - } - - function decrementDisplayedMonth() { - $$invalidate(0, displayedMonth = displayedMonth.clone().subtract(1, "month")); - } - - function resetDisplayedMonth() { - $$invalidate(0, displayedMonth = today.clone()); - } - - $$self.$$set = $$props => { - if ("localeData" in $$props) $$invalidate(17, localeData = $$props.localeData); - if ("showWeekNums" in $$props) $$invalidate(1, showWeekNums = $$props.showWeekNums); - if ("onHoverDay" in $$props) $$invalidate(2, onHoverDay = $$props.onHoverDay); - if ("onHoverWeek" in $$props) $$invalidate(3, onHoverWeek = $$props.onHoverWeek); - if ("onContextMenuDay" in $$props) $$invalidate(4, onContextMenuDay = $$props.onContextMenuDay); - if ("onContextMenuWeek" in $$props) $$invalidate(5, onContextMenuWeek = $$props.onContextMenuWeek); - if ("onClickDay" in $$props) $$invalidate(6, onClickDay = $$props.onClickDay); - if ("onClickWeek" in $$props) $$invalidate(7, onClickWeek = $$props.onClickWeek); - if ("sources" in $$props) $$invalidate(8, sources = $$props.sources); - if ("selectedId" in $$props) $$invalidate(9, selectedId = $$props.selectedId); - if ("today" in $$props) $$invalidate(10, today = $$props.today); - if ("displayedMonth" in $$props) $$invalidate(0, displayedMonth = $$props.displayedMonth); - }; - - $$self.$$.update = () => { - if ($$self.$$.dirty & /*displayedMonth, localeData*/ 131073) { - $$invalidate(14, month = getMonth(displayedMonth, localeData)); - } - - if ($$self.$$.dirty & /*today, localeData*/ 132096) { - $$invalidate(15, daysOfWeek = getDaysOfWeek(today, localeData)); - } - }; - - return [ - displayedMonth, - showWeekNums, - onHoverDay, - onHoverWeek, - onContextMenuDay, - onContextMenuWeek, - onClickDay, - onClickWeek, - sources, - selectedId, - today, - incrementDisplayedMonth, - decrementDisplayedMonth, - resetDisplayedMonth, - month, - daysOfWeek, - isMobile, - localeData - ]; -} - -class Calendar extends SvelteComponent { - constructor(options) { - super(); - if (!document.getElementById("svelte-pcimu8-style")) add_css(); - - init(this, options, instance, create_fragment, not_equal, { - localeData: 17, - showWeekNums: 1, - onHoverDay: 2, - onHoverWeek: 3, - onContextMenuDay: 4, - onContextMenuWeek: 5, - onClickDay: 6, - onClickWeek: 7, - sources: 8, - selectedId: 9, - today: 10, - displayedMonth: 0, - incrementDisplayedMonth: 11, - decrementDisplayedMonth: 12, - resetDisplayedMonth: 13 - }); - } - - get incrementDisplayedMonth() { - return this.$$.ctx[11]; - } - - get decrementDisplayedMonth() { - return this.$$.ctx[12]; - } - - get resetDisplayedMonth() { - return this.$$.ctx[13]; - } -} - -const langToMomentLocale = { - en: "en-gb", - zh: "zh-cn", - "zh-TW": "zh-tw", - ru: "ru", - ko: "ko", - it: "it", - id: "id", - ro: "ro", - "pt-BR": "pt-br", - cz: "cs", - da: "da", - de: "de", - es: "es", - fr: "fr", - no: "nn", - pl: "pl", - pt: "pt", - tr: "tr", - hi: "hi", - nl: "nl", - ar: "ar", - ja: "ja", -}; -const weekdays = [ - "sunday", - "monday", - "tuesday", - "wednesday", - "thursday", - "friday", - "saturday", -]; -function overrideGlobalMomentWeekStart(weekStart) { - const { moment } = window; - const currentLocale = moment.locale(); - // Save the initial locale weekspec so that we can restore - // it when toggling between the different options in settings. - if (!window._bundledLocaleWeekSpec) { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - window._bundledLocaleWeekSpec = moment.localeData()._week; - } - if (weekStart === "locale") { - moment.updateLocale(currentLocale, { - week: window._bundledLocaleWeekSpec, - }); - } - else { - moment.updateLocale(currentLocale, { - week: { - dow: weekdays.indexOf(weekStart) || 0, - }, - }); - } -} -/** - * Sets the locale used by the calendar. This allows the calendar to - * default to the user's locale (e.g. Start Week on Sunday/Monday/Friday) - * - * @param localeOverride locale string (e.g. "en-US") - */ -function configureGlobalMomentLocale(localeOverride = "system-default", weekStart = "locale") { - var _a; - const obsidianLang = localStorage.getItem("language") || "en"; - const systemLang = (_a = navigator.language) === null || _a === void 0 ? void 0 : _a.toLowerCase(); - let momentLocale = langToMomentLocale[obsidianLang]; - if (localeOverride !== "system-default") { - momentLocale = localeOverride; - } - else if (systemLang.startsWith(obsidianLang)) { - // If the system locale is more specific (en-gb vs en), use the system locale. - momentLocale = systemLang; - } - const currentLocale = window.moment.locale(momentLocale); - console.debug(`[Calendar] Trying to switch Moment.js global locale to ${momentLocale}, got ${currentLocale}`); - overrideGlobalMomentWeekStart(weekStart); - return currentLocale; -} - -const shouldConfigureGlobalMoment = (app) => { var _a; -// XXX: If the calendar plugin is installed, just use those settings. -// Otherwise, we are responsible for configuring weekStart and localeOverride. -return !((_a = app.plugins.getPlugin('calendar')) === null || _a === void 0 ? void 0 : _a._loaded); }; -const tryToConfigureGlobalMoment = (app, settings) => { - // XXX: If the calendar plugin is installed, just use those settings. - // Otherwise, we are responsible for configuring weekStart and localeOverride. - if (shouldConfigureGlobalMoment(app)) { - configureGlobalMomentLocale(settings.localeOverride, settings.weekStart); - } -}; - -const defaultSettings = { - tasksHeader: '## Tasks', - blankLineAfterHeader: true, - preserveMovedTasks: false, - localeOverride: 'system-default', - weekStart: 'locale', -}; -const settingsWithDefaults = (settings) => (Object.assign(Object.assign({}, defaultSettings), settings)); - -var NoteType; -(function (NoteType) { - NoteType[NoteType["Day"] = 1] = "Day"; - NoteType[NoteType["Week"] = 2] = "Week"; - NoteType[NoteType["Month"] = 3] = "Month"; -})(NoteType || (NoteType = {})); -class TaskCache { - constructor(taskHandler, vault) { - /** - * The subscribe function implements the Store interface in Svelte. The - * subscribers must be called any time there is a change to the task. - */ - this.subscribe = (subscription) => { - const maxID = this.subscriptions.reduce((prev, { id }) => Math.max(prev, id), 0); - const newID = maxID + 1; - this.subscriptions.push({ id: newID, hook: subscription }); - subscription(this); - // Return an unsubscribe function - return () => { - this.subscriptions = this.subscriptions.filter(({ id }) => id !== newID); - console.log(`Removing subscription ${newID}`); - }; - }; - /** - * The set function implements the Store interface in Svelte. We are not - * actually using it to store new values, but it is needed when binding to - * properties. - */ - this.set = (_) => { }; - this.fileOpenHook = (file) => __awaiter(this, void 0, void 0, function* () { - const cache = this.taskLineCache.find((ft) => ft.file === file); - if (cache) { - cache.tasks = yield this.taskHandler.getFileTasks(file); - this.notify(); - } - }); - this.fileCreateHook = (file) => { - // TODO: A more granular addition of the new file would be more efficient - // Cannot call initialize on every file-create event because Obsidian fires - // that event for ever single file when first starting. - // this.initialize(); // non-blocking - }; - this.fileDeleteHook = (file) => { - // TODO: A more granular removal of the file would be more efficient - this.initialize(); // non-blocking - }; - this.fileRenameHook = (file, oldPath) => { - // TODO: A more granular update of the file would be more efficient - this.initialize(); // non-blocking - }; - /** - * Notify subscriptions of a change. - */ - this.notify = () => { - this.subscriptions.forEach(({ hook }) => hook(this)); - }; - /** - * Load any necessary state asynchronously - */ - this.initialize = () => __awaiter(this, void 0, void 0, function* () { - console.log('initializing'); - this.dailyNotes = this.vault.getDailyNotes(); - this.weeklyNotes = this.vault.getWeeklyNotes(); - this.monthlyNotes = this.vault.getMonthlyNotes(); - this.periodicNoteList = this.listFiles(); - yield this.populateTaskLineCache(); - this.hasLoaded = true; - this.notify(); - }); - this.getFileForPeriodicNote = (id) => { - switch (id.split('-', 1)[0]) { - case 'day': - return this.dailyNotes[id]; - case 'week': - return this.weeklyNotes[id]; - case 'month': - return this.monthlyNotes[id]; - } - return undefined; - }; - this.noteTypeForPeriodicNote = (id) => { - switch (id.split('-', 1)[0]) { - case 'day': - return NoteType.Day; - case 'week': - return NoteType.Week; - case 'month': - return NoteType.Month; - } - return undefined; - }; - this.populateTaskLineCache = () => __awaiter(this, void 0, void 0, function* () { - const files = yield Promise.all(this.periodicNoteList.map((periodicNoteID) => __awaiter(this, void 0, void 0, function* () { - const file = this.getFileForPeriodicNote(periodicNoteID); - return { - file, - type: this.noteTypeForPeriodicNote(periodicNoteID), - tasks: file ? yield this.taskHandler.getFileTasks(file) : [], - }; - }))); - this.taskLineCache = files.filter((f) => f.tasks.length > 0); - this.hasLoaded = true; - }); - /** - * Returns a list of daily/weekly/monthly note files. - * NOTE: The values returned are not actually file names, but values similar to: - * - day-2021-02-12T00:00:00-08:00 - * - week-2021-02-21T00:00:00-08:00 - * - month-2021-02-01T00:00:00-08:00 - */ - this.listFiles = () => { - const dailyNoteKeys = Object.keys(this.dailyNotes).reverse(); - const weeklyNoteKeys = Object.keys(this.weeklyNotes).reverse(); - const monthlyNoteKeys = Object.keys(this.monthlyNotes).reverse(); - let weeklyI = 0; - let monthlyI = 0; - const orderedNoteNames = []; - for (const currentDailyNote of dailyNoteKeys) { - if (monthlyNoteKeys.length > monthlyI && - this.after(currentDailyNote, monthlyNoteKeys[monthlyI])) { - orderedNoteNames.push(monthlyNoteKeys[monthlyI]); - monthlyI++; - } - if (weeklyNoteKeys.length > weeklyI && - this.after(currentDailyNote, weeklyNoteKeys[weeklyI])) { - orderedNoteNames.push(weeklyNoteKeys[weeklyI]); - weeklyI++; - } - orderedNoteNames.push(currentDailyNote); - } - for (; weeklyI < weeklyNoteKeys.length; weeklyI++) { - const currentWeeklyNote = weeklyNoteKeys[weeklyI]; - if (monthlyNoteKeys.length > monthlyI && - this.after(currentWeeklyNote, monthlyNoteKeys[monthlyI])) { - orderedNoteNames.push(monthlyNoteKeys[monthlyI]); - monthlyI++; - } - orderedNoteNames.push(currentWeeklyNote); - } - for (; monthlyI < monthlyNoteKeys.length; monthlyI++) { - orderedNoteNames.push(monthlyNoteKeys[monthlyI]); - } - return orderedNoteNames; - }; - /** - * Returns true if the first note name is later chronologically than the first. - * Expects note names to be similar to: - * - day-2021-02-12T00:00:00-08:00 - * - week-2021-02-21T00:00:00-08:00 - * - month-2021-02-01T00:00:00-08:00 - */ - this.after = (name1, name2) => { - const d1 = window.moment(name1.substring(name1.indexOf('-') + 1)); - const d2 = window.moment(name2.substring(name2.indexOf('-') + 1)); - return d1.isAfter(d2); - }; - this.vault = vault; - this.taskHandler = taskHandler; - this.subscriptions = []; - this.taskLineCache = []; - this.hasLoaded = false; - // this.initialize(); // non-blocking, calls notify when complete - } - get loading() { - return !this.hasLoaded; - } - get files() { - return this.taskLineCache; - } -} - -/** - * Adds a line for the provided task to the specified file in the tasks section. - */ -const addTaskRepetition = (file, task, settings, vault) => __awaiter(void 0, void 0, void 0, function* () { - console.debug('Slated: Ensuring repeating task exists in file: ' + file.basename); - return withFileContents(file, vault, (lines) => { - const taskSectionIndex = getIndexTasksHeading(lines, task.headings, settings); - const taskSectionEndIndex = getIndexSectionLastContent(lines, taskSectionIndex); - const linesToInsert = task.subContent.slice(); - linesToInsert.unshift(task.lineAsRepeated()); - insertLines(lines, linesToInsert, taskSectionEndIndex + 1, settings); - return true; - }); -}); -const addTaskMove = (file, task, settings, vault) => __awaiter(void 0, void 0, void 0, function* () { - console.debug('Slated: Moving task to file: ' + file.basename); - const linesToInsert = task.subContent.slice(); - linesToInsert.unshift(task.line); - return withFileContents(file, vault, (lines) => { - const taskSectionIndex = getIndexTasksHeading(lines, task.headings, settings); - const taskSectionEndIndex = getIndexSectionLastContent(lines, taskSectionIndex); - insertLines(lines, linesToInsert, taskSectionEndIndex + 1, settings); - return true; - }); -}); -const removeLines = (file, start, count, vault) => __awaiter(void 0, void 0, void 0, function* () { - return withFileContents(file, vault, (lines) => { - lines.splice(start, count); - return true; - }); -}); -/** - * @description marks {count} the tasks starting on line {start} as copied by inserting '>' between brackets - * @param {TFile} file - * @param {number} start -- the line number of the first task to mark as copied - * @param {number} count -- the number of tasks to mark as copied - * @param {VaultIntermediate} vault - * @returns - */ -const markTaskAsCopied = (file, start, count, vault) => __awaiter(void 0, void 0, void 0, function* () { - return withFileContents(file, vault, (lines) => { - const tasksToMark = lines.slice(start, start + count); - const markedTasks = tasksToMark.map((t) => t.replace('[ ]', '[>]')); - lines.splice(start, count, ...markedTasks); - return true; - }); -}); -/** - * Read the file contents and pass to the provided function as a list of lines. - * If the provided function returns true, write the array back to the file. - * NOTE: If useCache is true, the fn is not allowed to update the file! - */ -const withFileContents = (file, vault, fn, useCache = false) => __awaiter(void 0, void 0, void 0, function* () { - const fileContents = (yield vault.readFile(file, useCache)) || ''; - const lines = fileContents.split('\n'); - const updated = fn(lines); - if (!useCache && updated) { - return vault.writeFile(file, lines.join('\n')); - } -}); -/** - * Search the provided lines for the index of the tasks section heading. - * NOTE: This may modifiy the array to add the header if missing. - */ -const getIndexTasksHeading = (lines, headings, settings) => { - if (headings.length === 0) { - headings.push(settings.tasksHeader); - } - let startIdx = 0; - let endIdx = lines.length; - headings.forEach((heading) => { - startIdx = getIndexHeadingHelper(lines, startIdx, endIdx, heading, settings); - endIdx = getIndexSectionNextSibling(lines, startIdx); - }); - return startIdx; -}; -const getIndexHeadingHelper = (lines, startIdx, endIdx, heading, settings) => { - const actualEndIdx = Math.min(endIdx, lines.length); - for (let i = startIdx; i < actualEndIdx; i++) { - if (lines[i] === heading) { - return i; - } - } - // Tasks section not found, so add it - if (lines.length === 1 && lines[0] === '') { - // Empty file, just replace the first line - lines[0] = heading; - return 0; - } - if (settings.blankLineAfterHeader && lines[endIdx - 1] !== '') { - lines.splice(endIdx, 0, '', heading); - return endIdx + 1; - } - lines.splice(endIdx, 0, heading); - return endIdx; -}; -const getIndexSectionNextSibling = (lines, sectionHeader) => { - const desiredHeaderDepth = getHeaderDepth(lines[sectionHeader]); - // Start on the line after the header. - // NOTE: That could be the end of the file! - for (let i = sectionHeader + 1; i < lines.length; i++) { - const line = lines[i]; - if (line.startsWith('#') && getHeaderDepth(line) <= desiredHeaderDepth) { - return i; - } - } - return lines.length; -}; -/** - * Search the provided lines for the index of the last line of content starting - * after the provided section header index. - */ -const getIndexSectionLastContent = (lines, sectionHeader) => { - let lastContentLine = -1; - // Start on the line after the header. - // NOTE: That could be the end of the file! - for (let i = sectionHeader + 1; i < lines.length; i++) { - const line = lines[i]; - if (line.startsWith('#')) { - break; - } - if (line.trim() !== '') { - lastContentLine = i; - } - } - if (lastContentLine === -1) { - // There is no content in this section, so return the header index - return sectionHeader; - } - // There is content in this section, return the last line of it. - return lastContentLine; -}; -/** - * Insert the provided line before the provided index. If the settings call - * for a blank line around headings, insert blank lines as necessary. - */ -const insertLines = (fileLines, linesToAdd, i, settings) => { - if (!settings.blankLineAfterHeader) { - fileLines.splice(i, 0, ...linesToAdd); - return; - } - if (i > 0 && fileLines[i - 1].startsWith('#')) { - // Line before is a heading, leave a space - linesToAdd.unshift(''); - } - if (i < fileLines.length && fileLines[i].startsWith('#')) { - // Next line is a heading, leave a space - linesToAdd.push(''); - } - else if (i === fileLines.length) { - // Last line of the file, leave a space - linesToAdd.push(''); - } - fileLines.splice(i, 0, ...linesToAdd); -}; -/** - * Return true if the name of this daily note can be parsed into a date using - * the configured daily note naming settings. - */ -const fileIsDailyNote = (file, vault) => vault.findMomentForDailyNote(file) !== undefined; -const getHeaderDepth = (line) => { - const trimmedLine = line.trimStart(); - for (let i = 0; i < trimmedLine.length; i++) { - if (trimmedLine[i] === '#') { - continue; - } - return i; - } - return trimmedLine.length; -}; - -// ============================================================================= -// Weekday -// ============================================================================= -var ALL_WEEKDAYS = ['MO', 'TU', 'WE', 'TH', 'FR', 'SA', 'SU']; -var Weekday = /** @class */ (function () { - function Weekday(weekday, n) { - if (n === 0) - throw new Error("Can't create weekday with n == 0"); - this.weekday = weekday; - this.n = n; - } - Weekday.fromStr = function (str) { - return new Weekday(ALL_WEEKDAYS.indexOf(str)); - }; - // __call__ - Cannot call the object directly, do it through - // e.g. RRule.TH.nth(-1) instead, - Weekday.prototype.nth = function (n) { - return this.n === n ? this : new Weekday(this.weekday, n); - }; - // __eq__ - Weekday.prototype.equals = function (other) { - return this.weekday === other.weekday && this.n === other.n; - }; - // __repr__ - Weekday.prototype.toString = function () { - var s = ALL_WEEKDAYS[this.weekday]; - if (this.n) - s = (this.n > 0 ? '+' : '') + String(this.n) + s; - return s; - }; - Weekday.prototype.getJsWeekday = function () { - return this.weekday === 6 ? 0 : this.weekday + 1; - }; - return Weekday; -}()); - -// ============================================================================= -var isPresent = function (value) { - return value !== null && value !== undefined; -}; -var isNumber = function (value) { - return typeof value === 'number'; -}; -var isWeekdayStr = function (value) { - return ALL_WEEKDAYS.indexOf(value) >= 0; -}; -var isArray = Array.isArray; -/** - * Simplified version of python's range() - */ -var range = function (start, end) { - if (end === void 0) { end = start; } - if (arguments.length === 1) { - end = start; - start = 0; - } - var rang = []; - for (var i = start; i < end; i++) - rang.push(i); - return rang; -}; -var repeat = function (value, times) { - var i = 0; - var array = []; - if (isArray(value)) { - for (; i < times; i++) - array[i] = [].concat(value); - } - else { - for (; i < times; i++) - array[i] = value; - } - return array; -}; -var toArray = function (item) { - if (isArray(item)) { - return item; - } - return [item]; -}; -function padStart(item, targetLength, padString) { - if (padString === void 0) { padString = ' '; } - var str = String(item); - targetLength = targetLength >> 0; - if (str.length > targetLength) { - return String(str); - } - targetLength = targetLength - str.length; - if (targetLength > padString.length) { - padString += repeat(padString, targetLength / padString.length); - } - return padString.slice(0, targetLength) + String(str); -} -/** - * Python like split - */ -var split = function (str, sep, num) { - var splits = str.split(sep); - return num - ? splits.slice(0, num).concat([splits.slice(num).join(sep)]) - : splits; -}; -/** - * closure/goog/math/math.js:modulo - * Copyright 2006 The Closure Library Authors. - * The % operator in JavaScript returns the remainder of a / b, but differs from - * some other languages in that the result will have the same sign as the - * dividend. For example, -1 % 8 == -1, whereas in some other languages - * (such as Python) the result would be 7. This function emulates the more - * correct modulo behavior, which is useful for certain applications such as - * calculating an offset index in a circular list. - * - * @param {number} a The dividend. - * @param {number} b The divisor. - * @return {number} a % b where the result is between 0 and b (either 0 <= x < b - * or b < x <= 0, depending on the sign of b). - */ -var pymod = function (a, b) { - var r = a % b; - // If r and b differ in sign, add b to wrap the result to the correct sign. - return r * b < 0 ? r + b : r; -}; -/** - * @see: - */ -var divmod = function (a, b) { - return { div: Math.floor(a / b), mod: pymod(a, b) }; -}; -var empty$1 = function (obj) { - return !isPresent(obj) || obj.length === 0; -}; -/** - * Python-like boolean - * @return {Boolean} value of an object/primitive, taking into account - * the fact that in Python an empty list's/tuple's - * boolean value is False, whereas in JS it's true - */ -var notEmpty = function (obj) { - return !empty$1(obj); -}; -/** - * Return true if a value is in an array - */ -var includes = function (arr, val) { - return notEmpty(arr) && arr.indexOf(val) !== -1; -}; - -/** - * General date-related utilities. - * Also handles several incompatibilities between JavaScript and Python - * - */ -var dateutil; -(function (dateutil) { - dateutil.MONTH_DAYS = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; - /** - * Number of milliseconds of one day - */ - dateutil.ONE_DAY = 1000 * 60 * 60 * 24; - /** - * @see: - */ - dateutil.MAXYEAR = 9999; - /** - * Python uses 1-Jan-1 as the base for calculating ordinals but we don't - * want to confuse the JS engine with milliseconds > Number.MAX_NUMBER, - * therefore we use 1-Jan-1970 instead - */ - dateutil.ORDINAL_BASE = new Date(Date.UTC(1970, 0, 1)); - /** - * Python: MO-SU: 0 - 6 - * JS: SU-SAT 0 - 6 - */ - dateutil.PY_WEEKDAYS = [6, 0, 1, 2, 3, 4, 5]; - /** - * py_date.timetuple()[7] - */ - dateutil.getYearDay = function (date) { - var dateNoTime = new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()); - return (Math.ceil((dateNoTime.valueOf() - - new Date(date.getUTCFullYear(), 0, 1).valueOf()) / - dateutil.ONE_DAY) + 1); - }; - dateutil.isLeapYear = function (year) { - return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; - }; - dateutil.isDate = function (value) { - return value instanceof Date; - }; - dateutil.isValidDate = function (value) { - return dateutil.isDate(value) && !isNaN(value.getTime()); - }; - /** - * @return {Number} the date's timezone offset in ms - */ - dateutil.tzOffset = function (date) { - return date.getTimezoneOffset() * 60 * 1000; - }; - /** - * @see: - */ - dateutil.daysBetween = function (date1, date2) { - // The number of milliseconds in one day - // Convert both dates to milliseconds - var date1ms = date1.getTime() - dateutil.tzOffset(date1); - var date2ms = date2.getTime() - dateutil.tzOffset(date2); - // Calculate the difference in milliseconds - var differencems = date1ms - date2ms; - // Convert back to days and return - return Math.round(differencems / dateutil.ONE_DAY); - }; - /** - * @see: - */ - dateutil.toOrdinal = function (date) { - return dateutil.daysBetween(date, dateutil.ORDINAL_BASE); - }; - /** - * @see - - */ - dateutil.fromOrdinal = function (ordinal) { - return new Date(dateutil.ORDINAL_BASE.getTime() + ordinal * dateutil.ONE_DAY); - }; - dateutil.getMonthDays = function (date) { - var month = date.getUTCMonth(); - return month === 1 && dateutil.isLeapYear(date.getUTCFullYear()) - ? 29 - : dateutil.MONTH_DAYS[month]; - }; - /** - * @return {Number} python-like weekday - */ - dateutil.getWeekday = function (date) { - return dateutil.PY_WEEKDAYS[date.getUTCDay()]; - }; - /** - * @see: - */ - dateutil.monthRange = function (year, month) { - var date = new Date(Date.UTC(year, month, 1)); - return [dateutil.getWeekday(date), dateutil.getMonthDays(date)]; - }; - /** - * @see: - */ - dateutil.combine = function (date, time) { - time = time || date; - return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), time.getHours(), time.getMinutes(), time.getSeconds(), time.getMilliseconds())); - }; - dateutil.clone = function (date) { - var dolly = new Date(date.getTime()); - return dolly; - }; - dateutil.cloneDates = function (dates) { - var clones = []; - for (var i = 0; i < dates.length; i++) { - clones.push(dateutil.clone(dates[i])); - } - return clones; - }; - /** - * Sorts an array of Date or dateutil.Time objects - */ - dateutil.sort = function (dates) { - dates.sort(function (a, b) { - return a.getTime() - b.getTime(); - }); - }; - dateutil.timeToUntilString = function (time, utc) { - if (utc === void 0) { utc = true; } - var date = new Date(time); - return [ - padStart(date.getUTCFullYear().toString(), 4, '0'), - padStart(date.getUTCMonth() + 1, 2, '0'), - padStart(date.getUTCDate(), 2, '0'), - 'T', - padStart(date.getUTCHours(), 2, '0'), - padStart(date.getUTCMinutes(), 2, '0'), - padStart(date.getUTCSeconds(), 2, '0'), - utc ? 'Z' : '' - ].join(''); - }; - dateutil.untilStringToDate = function (until) { - var re = /^(\d{4})(\d{2})(\d{2})(T(\d{2})(\d{2})(\d{2})Z?)?$/; - var bits = re.exec(until); - if (!bits) - throw new Error("Invalid UNTIL value: " + until); - return new Date(Date.UTC(parseInt(bits[1], 10), parseInt(bits[2], 10) - 1, parseInt(bits[3], 10), parseInt(bits[5], 10) || 0, parseInt(bits[6], 10) || 0, parseInt(bits[7], 10) || 0)); - }; -})(dateutil || (dateutil = {})); -var dateutil$1 = dateutil; - -/** - * This class helps us to emulate python's generators, sorta. - */ -var IterResult = /** @class */ (function () { - function IterResult(method, args) { - this.minDate = null; - this.maxDate = null; - this._result = []; - this.total = 0; - this.method = method; - this.args = args; - if (method === 'between') { - this.maxDate = args.inc - ? args.before - : new Date(args.before.getTime() - 1); - this.minDate = args.inc ? args.after : new Date(args.after.getTime() + 1); - } - else if (method === 'before') { - this.maxDate = args.inc ? args.dt : new Date(args.dt.getTime() - 1); - } - else if (method === 'after') { - this.minDate = args.inc ? args.dt : new Date(args.dt.getTime() + 1); - } - } - /** - * Possibly adds a date into the result. - * - * @param {Date} date - the date isn't necessarly added to the result - * list (if it is too late/too early) - * @return {Boolean} true if it makes sense to continue the iteration - * false if we're done. - */ - IterResult.prototype.accept = function (date) { - ++this.total; - var tooEarly = this.minDate && date < this.minDate; - var tooLate = this.maxDate && date > this.maxDate; - if (this.method === 'between') { - if (tooEarly) - return true; - if (tooLate) - return false; - } - else if (this.method === 'before') { - if (tooLate) - return false; - } - else if (this.method === 'after') { - if (tooEarly) - return true; - this.add(date); - return false; - } - return this.add(date); - }; - /** - * - * @param {Date} date that is part of the result. - * @return {Boolean} whether we are interested in more values. - */ - IterResult.prototype.add = function (date) { - this._result.push(date); - return true; - }; - /** - * 'before' and 'after' return only one date, whereas 'all' - * and 'between' an array. - * @return {Date,Array?} - */ - IterResult.prototype.getValue = function () { - var res = this._result; - switch (this.method) { - case 'all': - case 'between': - return res; - case 'before': - case 'after': - default: - return (res.length ? res[res.length - 1] : null); - } - }; - IterResult.prototype.clone = function () { - return new IterResult(this.method, this.args); - }; - return IterResult; -}()); - -/** - * IterResult subclass that calls a callback function on each add, - * and stops iterating when the callback returns false. - */ -var CallbackIterResult = /** @class */ (function (_super) { - __extends(CallbackIterResult, _super); - function CallbackIterResult(method, args, iterator) { - var _this = _super.call(this, method, args) || this; - _this.iterator = iterator; - return _this; - } - CallbackIterResult.prototype.add = function (date) { - if (this.iterator(date, this._result.length)) { - this._result.push(date); - return true; - } - return false; - }; - return CallbackIterResult; -}(IterResult)); - -// ============================================================================= -// i18n -// ============================================================================= -var ENGLISH = { - dayNames: [ - 'Sunday', 'Monday', 'Tuesday', 'Wednesday', - 'Thursday', 'Friday', 'Saturday' - ], - monthNames: [ - 'January', 'February', 'March', 'April', 'May', - 'June', 'July', 'August', 'September', 'October', - 'November', 'December' - ], - tokens: { - 'SKIP': /^[ \r\n\t]+|^\.$/, - 'number': /^[1-9][0-9]*/, - 'numberAsText': /^(one|two|three)/i, - 'every': /^every/i, - 'day(s)': /^days?/i, - 'weekday(s)': /^weekdays?/i, - 'week(s)': /^weeks?/i, - 'hour(s)': /^hours?/i, - 'minute(s)': /^minutes?/i, - 'month(s)': /^months?/i, - 'year(s)': /^years?/i, - 'on': /^(on|in)/i, - 'at': /^(at)/i, - 'the': /^the/i, - 'first': /^first/i, - 'second': /^second/i, - 'third': /^third/i, - 'nth': /^([1-9][0-9]*)(\.|th|nd|rd|st)/i, - 'last': /^last/i, - 'for': /^for/i, - 'time(s)': /^times?/i, - 'until': /^(un)?til/i, - 'monday': /^mo(n(day)?)?/i, - 'tuesday': /^tu(e(s(day)?)?)?/i, - 'wednesday': /^we(d(n(esday)?)?)?/i, - 'thursday': /^th(u(r(sday)?)?)?/i, - 'friday': /^fr(i(day)?)?/i, - 'saturday': /^sa(t(urday)?)?/i, - 'sunday': /^su(n(day)?)?/i, - 'january': /^jan(uary)?/i, - 'february': /^feb(ruary)?/i, - 'march': /^mar(ch)?/i, - 'april': /^apr(il)?/i, - 'may': /^may/i, - 'june': /^june?/i, - 'july': /^july?/i, - 'august': /^aug(ust)?/i, - 'september': /^sep(t(ember)?)?/i, - 'october': /^oct(ober)?/i, - 'november': /^nov(ember)?/i, - 'december': /^dec(ember)?/i, - 'comma': /^(,\s*|(and|or)\s*)+/i - } -}; - -// ============================================================================= -// Helper functions -// ============================================================================= -/** - * Return true if a value is in an array - */ -var contains = function (arr, val) { - return arr.indexOf(val) !== -1; -}; -var defaultGetText = function (id) { return id.toString(); }; -var defaultDateFormatter = function (year, month, day) { return month + " " + day + ", " + year; }; -/** - * - * @param {RRule} rrule - * Optional: - * @param {Function} gettext function - * @param {Object} language definition - * @constructor - */ -var ToText = /** @class */ (function () { - function ToText(rrule, gettext, language, dateFormatter) { - if (gettext === void 0) { gettext = defaultGetText; } - if (language === void 0) { language = ENGLISH; } - if (dateFormatter === void 0) { dateFormatter = defaultDateFormatter; } - this.text = []; - this.language = language || ENGLISH; - this.gettext = gettext; - this.dateFormatter = dateFormatter; - this.rrule = rrule; - this.options = rrule.options; - this.origOptions = rrule.origOptions; - if (this.origOptions.bymonthday) { - var bymonthday = [].concat(this.options.bymonthday); - var bynmonthday = [].concat(this.options.bynmonthday); - bymonthday.sort(function (a, b) { return a - b; }); - bynmonthday.sort(function (a, b) { return b - a; }); - // 1, 2, 3, .., -5, -4, -3, .. - this.bymonthday = bymonthday.concat(bynmonthday); - if (!this.bymonthday.length) - this.bymonthday = null; - } - if (isPresent(this.origOptions.byweekday)) { - var byweekday = !isArray(this.origOptions.byweekday) - ? [this.origOptions.byweekday] - : this.origOptions.byweekday; - var days = String(byweekday); - this.byweekday = { - allWeeks: byweekday.filter(function (weekday) { - return !weekday.n; - }), - someWeeks: byweekday.filter(function (weekday) { - return Boolean(weekday.n); - }), - isWeekdays: days.indexOf('MO') !== -1 && - days.indexOf('TU') !== -1 && - days.indexOf('WE') !== -1 && - days.indexOf('TH') !== -1 && - days.indexOf('FR') !== -1 && - days.indexOf('SA') === -1 && - days.indexOf('SU') === -1, - isEveryDay: days.indexOf('MO') !== -1 && - days.indexOf('TU') !== -1 && - days.indexOf('WE') !== -1 && - days.indexOf('TH') !== -1 && - days.indexOf('FR') !== -1 && - days.indexOf('SA') !== -1 && - days.indexOf('SU') !== -1 - }; - var sortWeekDays = function (a, b) { - return a.weekday - b.weekday; - }; - this.byweekday.allWeeks.sort(sortWeekDays); - this.byweekday.someWeeks.sort(sortWeekDays); - if (!this.byweekday.allWeeks.length) - this.byweekday.allWeeks = null; - if (!this.byweekday.someWeeks.length) - this.byweekday.someWeeks = null; - } - else { - this.byweekday = null; - } - } - /** - * Test whether the rrule can be fully converted to text. - * @param {RRule} rrule - * @return {Boolean} - */ - ToText.isFullyConvertible = function (rrule) { - var canConvert = true; - if (!(rrule.options.freq in ToText.IMPLEMENTED)) - return false; - if (rrule.origOptions.until && rrule.origOptions.count) - return false; - for (var key in rrule.origOptions) { - if (contains(['dtstart', 'wkst', 'freq'], key)) - return true; - if (!contains(ToText.IMPLEMENTED[rrule.options.freq], key)) - return false; - } - return canConvert; - }; - ToText.prototype.isFullyConvertible = function () { - return ToText.isFullyConvertible(this.rrule); - }; - /** - * Perform the conversion. Only some of the frequencies are supported. - * If some of the rrule's options aren't supported, they'll - * be omitted from the output an "(~ approximate)" will be appended. - * @return {*} - */ - ToText.prototype.toString = function () { - var gettext = this.gettext; - if (!(this.options.freq in ToText.IMPLEMENTED)) { - return gettext('RRule error: Unable to fully convert this rrule to text'); - } - this.text = [gettext('every')]; - // @ts-ignore - this[RRule.FREQUENCIES[this.options.freq]](); - if (this.options.until) { - this.add(gettext('until')); - var until = this.options.until; - this.add(this.dateFormatter(until.getUTCFullYear(), this.language.monthNames[until.getUTCMonth()], until.getUTCDate())); - } - else if (this.options.count) { - this.add(gettext('for')) - .add(this.options.count.toString()) - .add(this.plural(this.options.count) ? gettext('times') : gettext('time')); - } - if (!this.isFullyConvertible()) - this.add(gettext('(~ approximate)')); - return this.text.join(''); - }; - ToText.prototype.HOURLY = function () { - var gettext = this.gettext; - if (this.options.interval !== 1) - this.add(this.options.interval.toString()); - this.add(this.plural(this.options.interval) ? gettext('hours') : gettext('hour')); - }; - ToText.prototype.MINUTELY = function () { - var gettext = this.gettext; - if (this.options.interval !== 1) - this.add(this.options.interval.toString()); - this.add(this.plural(this.options.interval) - ? gettext('minutes') - : gettext('minute')); - }; - ToText.prototype.DAILY = function () { - var gettext = this.gettext; - if (this.options.interval !== 1) - this.add(this.options.interval.toString()); - if (this.byweekday && this.byweekday.isWeekdays) { - this.add(this.plural(this.options.interval) - ? gettext('weekdays') - : gettext('weekday')); - } - else { - this.add(this.plural(this.options.interval) ? gettext('days') : gettext('day')); - } - if (this.origOptions.bymonth) { - this.add(gettext('in')); - this._bymonth(); - } - if (this.bymonthday) { - this._bymonthday(); - } - else if (this.byweekday) { - this._byweekday(); - } - else if (this.origOptions.byhour) { - this._byhour(); - } - }; - ToText.prototype.WEEKLY = function () { - var gettext = this.gettext; - if (this.options.interval !== 1) { - this.add(this.options.interval.toString()).add(this.plural(this.options.interval) ? gettext('weeks') : gettext('week')); - } - if (this.byweekday && this.byweekday.isWeekdays) { - if (this.options.interval === 1) { - this.add(this.plural(this.options.interval) - ? gettext('weekdays') - : gettext('weekday')); - } - else { - this.add(gettext('on')).add(gettext('weekdays')); - } - } - else if (this.byweekday && this.byweekday.isEveryDay) { - this.add(this.plural(this.options.interval) ? gettext('days') : gettext('day')); - } - else { - if (this.options.interval === 1) - this.add(gettext('week')); - if (this.origOptions.bymonth) { - this.add(gettext('in')); - this._bymonth(); - } - if (this.bymonthday) { - this._bymonthday(); - } - else if (this.byweekday) { - this._byweekday(); - } - } - }; - ToText.prototype.MONTHLY = function () { - var gettext = this.gettext; - if (this.origOptions.bymonth) { - if (this.options.interval !== 1) { - this.add(this.options.interval.toString()).add(gettext('months')); - if (this.plural(this.options.interval)) - this.add(gettext('in')); - } - this._bymonth(); - } - else { - if (this.options.interval !== 1) - this.add(this.options.interval.toString()); - this.add(this.plural(this.options.interval) - ? gettext('months') - : gettext('month')); - } - if (this.bymonthday) { - this._bymonthday(); - } - else if (this.byweekday && this.byweekday.isWeekdays) { - this.add(gettext('on')).add(gettext('weekdays')); - } - else if (this.byweekday) { - this._byweekday(); - } - }; - ToText.prototype.YEARLY = function () { - var gettext = this.gettext; - if (this.origOptions.bymonth) { - if (this.options.interval !== 1) { - this.add(this.options.interval.toString()); - this.add(gettext('years')); - } - this._bymonth(); - } - else { - if (this.options.interval !== 1) - this.add(this.options.interval.toString()); - this.add(this.plural(this.options.interval) ? gettext('years') : gettext('year')); - } - if (this.bymonthday) { - this._bymonthday(); - } - else if (this.byweekday) { - this._byweekday(); - } - if (this.options.byyearday) { - this.add(gettext('on the')) - .add(this.list(this.options.byyearday, this.nth, gettext('and'))) - .add(gettext('day')); - } - if (this.options.byweekno) { - this.add(gettext('in')) - .add(this.plural(this.options.byweekno.length) - ? gettext('weeks') - : gettext('week')) - .add(this.list(this.options.byweekno, undefined, gettext('and'))); - } - }; - ToText.prototype._bymonthday = function () { - var gettext = this.gettext; - if (this.byweekday && this.byweekday.allWeeks) { - this.add(gettext('on')) - .add(this.list(this.byweekday.allWeeks, this.weekdaytext, gettext('or'))) - .add(gettext('the')) - .add(this.list(this.bymonthday, this.nth, gettext('or'))); - } - else { - this.add(gettext('on the')).add(this.list(this.bymonthday, this.nth, gettext('and'))); - } - // this.add(gettext('DAY')) - }; - ToText.prototype._byweekday = function () { - var gettext = this.gettext; - if (this.byweekday.allWeeks && !this.byweekday.isWeekdays) { - this.add(gettext('on')).add(this.list(this.byweekday.allWeeks, this.weekdaytext)); - } - if (this.byweekday.someWeeks) { - if (this.byweekday.allWeeks) - this.add(gettext('and')); - this.add(gettext('on the')).add(this.list(this.byweekday.someWeeks, this.weekdaytext, gettext('and'))); - } - }; - ToText.prototype._byhour = function () { - var gettext = this.gettext; - this.add(gettext('at')).add(this.list(this.origOptions.byhour, undefined, gettext('and'))); - }; - ToText.prototype._bymonth = function () { - this.add(this.list(this.options.bymonth, this.monthtext, this.gettext('and'))); - }; - ToText.prototype.nth = function (n) { - n = parseInt(n.toString(), 10); - var nth; - var npos; - var gettext = this.gettext; - if (n === -1) - return gettext('last'); - npos = Math.abs(n); - switch (npos) { - case 1: - case 21: - case 31: - nth = npos + gettext('st'); - break; - case 2: - case 22: - nth = npos + gettext('nd'); - break; - case 3: - case 23: - nth = npos + gettext('rd'); - break; - default: - nth = npos + gettext('th'); - } - return n < 0 ? nth + ' ' + gettext('last') : nth; - }; - ToText.prototype.monthtext = function (m) { - return this.language.monthNames[m - 1]; - }; - ToText.prototype.weekdaytext = function (wday) { - var weekday = isNumber(wday) ? (wday + 1) % 7 : wday.getJsWeekday(); - return ((wday.n ? this.nth(wday.n) + ' ' : '') + this.language.dayNames[weekday]); - }; - ToText.prototype.plural = function (n) { - return n % 100 !== 1; - }; - ToText.prototype.add = function (s) { - this.text.push(' '); - this.text.push(s); - return this; - }; - ToText.prototype.list = function (arr, callback, finalDelim, delim) { - if (delim === void 0) { delim = ','; } - if (!isArray(arr)) { - arr = [arr]; - } - var delimJoin = function (array, delimiter, finalDelimiter) { - var list = ''; - for (var i = 0; i < array.length; i++) { - if (i !== 0) { - if (i === array.length - 1) { - list += ' ' + finalDelimiter + ' '; - } - else { - list += delimiter + ' '; - } - } - list += array[i]; - } - return list; - }; - callback = - callback || - function (o) { - return o.toString(); - }; - var self = this; - var realCallback = function (arg) { - return callback && callback.call(self, arg); - }; - if (finalDelim) { - return delimJoin(arr.map(realCallback), delim, finalDelim); - } - else { - return arr.map(realCallback).join(delim + ' '); - } - }; - return ToText; -}()); - -// ============================================================================= -// Parser -// ============================================================================= -var Parser = /** @class */ (function () { - function Parser(rules) { - this.done = true; - this.rules = rules; - } - Parser.prototype.start = function (text) { - this.text = text; - this.done = false; - return this.nextSymbol(); - }; - Parser.prototype.isDone = function () { - return this.done && this.symbol === null; - }; - Parser.prototype.nextSymbol = function () { - var best; - var bestSymbol; - var p = this; - this.symbol = null; - this.value = null; - do { - if (this.done) - return false; - var rule = void 0; - best = null; - for (var name_1 in this.rules) { - rule = this.rules[name_1]; - var match = rule.exec(p.text); - if (match) { - if (best === null || match[0].length > best[0].length) { - best = match; - bestSymbol = name_1; - } - } - } - if (best != null) { - this.text = this.text.substr(best[0].length); - if (this.text === '') - this.done = true; - } - if (best == null) { - this.done = true; - this.symbol = null; - this.value = null; - return; - } - // @ts-ignore - } while (bestSymbol === 'SKIP'); - // @ts-ignore - this.symbol = bestSymbol; - this.value = best; - return true; - }; - Parser.prototype.accept = function (name) { - if (this.symbol === name) { - if (this.value) { - var v = this.value; - this.nextSymbol(); - return v; - } - this.nextSymbol(); - return true; - } - return false; - }; - Parser.prototype.acceptNumber = function () { - return this.accept('number'); - }; - Parser.prototype.expect = function (name) { - if (this.accept(name)) - return true; - throw new Error('expected ' + name + ' but found ' + this.symbol); - }; - return Parser; -}()); -function parseText(text, language) { - if (language === void 0) { language = ENGLISH; } - var options = {}; - var ttr = new Parser(language.tokens); - if (!ttr.start(text)) - return null; - S(); - return options; - function S() { - // every [n] - ttr.expect('every'); - var n = ttr.acceptNumber(); - if (n) - options.interval = parseInt(n[0], 10); - if (ttr.isDone()) - throw new Error('Unexpected end'); - switch (ttr.symbol) { - case 'day(s)': - options.freq = RRule.DAILY; - if (ttr.nextSymbol()) { - AT(); - F(); - } - break; - // FIXME Note: every 2 weekdays != every two weeks on weekdays. - // DAILY on weekdays is not a valid rule - case 'weekday(s)': - options.freq = RRule.WEEKLY; - options.byweekday = [ - RRule.MO, - RRule.TU, - RRule.WE, - RRule.TH, - RRule.FR - ]; - ttr.nextSymbol(); - F(); - break; - case 'week(s)': - options.freq = RRule.WEEKLY; - if (ttr.nextSymbol()) { - ON(); - F(); - } - break; - case 'hour(s)': - options.freq = RRule.HOURLY; - if (ttr.nextSymbol()) { - ON(); - F(); - } - break; - case 'minute(s)': - options.freq = RRule.MINUTELY; - if (ttr.nextSymbol()) { - ON(); - F(); - } - break; - case 'month(s)': - options.freq = RRule.MONTHLY; - if (ttr.nextSymbol()) { - ON(); - F(); - } - break; - case 'year(s)': - options.freq = RRule.YEARLY; - if (ttr.nextSymbol()) { - ON(); - F(); - } - break; - case 'monday': - case 'tuesday': - case 'wednesday': - case 'thursday': - case 'friday': - case 'saturday': - case 'sunday': - options.freq = RRule.WEEKLY; - var key = ttr.symbol.substr(0, 2).toUpperCase(); - options.byweekday = [RRule[key]]; - if (!ttr.nextSymbol()) - return; - // TODO check for duplicates - while (ttr.accept('comma')) { - if (ttr.isDone()) - throw new Error('Unexpected end'); - var wkd = decodeWKD(); - if (!wkd) { - throw new Error('Unexpected symbol ' + ttr.symbol + ', expected weekday'); - } - // @ts-ignore - options.byweekday.push(RRule[wkd]); - ttr.nextSymbol(); - } - MDAYs(); - F(); - break; - case 'january': - case 'february': - case 'march': - case 'april': - case 'may': - case 'june': - case 'july': - case 'august': - case 'september': - case 'october': - case 'november': - case 'december': - options.freq = RRule.YEARLY; - options.bymonth = [decodeM()]; - if (!ttr.nextSymbol()) - return; - // TODO check for duplicates - while (ttr.accept('comma')) { - if (ttr.isDone()) - throw new Error('Unexpected end'); - var m = decodeM(); - if (!m) { - throw new Error('Unexpected symbol ' + ttr.symbol + ', expected month'); - } - options.bymonth.push(m); - ttr.nextSymbol(); - } - ON(); - F(); - break; - default: - throw new Error('Unknown symbol'); - } - } - function ON() { - var on = ttr.accept('on'); - var the = ttr.accept('the'); - if (!(on || the)) - return; - do { - var nth = decodeNTH(); - var wkd = decodeWKD(); - var m = decodeM(); - // nth | - if (nth) { - // ttr.nextSymbol() - if (wkd) { - ttr.nextSymbol(); - if (!options.byweekday) - options.byweekday = []; - // @ts-ignore - options.byweekday.push(RRule[wkd].nth(nth)); - } - else { - if (!options.bymonthday) - options.bymonthday = []; - // @ts-ignore - options.bymonthday.push(nth); - ttr.accept('day(s)'); - } - // - } - else if (wkd) { - ttr.nextSymbol(); - if (!options.byweekday) - options.byweekday = []; - // @ts-ignore - options.byweekday.push(RRule[wkd]); - } - else if (ttr.symbol === 'weekday(s)') { - ttr.nextSymbol(); - if (!options.byweekday) { - options.byweekday = [ - RRule.MO, - RRule.TU, - RRule.WE, - RRule.TH, - RRule.FR - ]; - } - } - else if (ttr.symbol === 'week(s)') { - ttr.nextSymbol(); - var n = ttr.acceptNumber(); - if (!n) { - throw new Error('Unexpected symbol ' + ttr.symbol + ', expected week number'); - } - options.byweekno = [parseInt(n[0], 10)]; - while (ttr.accept('comma')) { - n = ttr.acceptNumber(); - if (!n) { - throw new Error('Unexpected symbol ' + ttr.symbol + '; expected monthday'); - } - options.byweekno.push(parseInt(n[0], 10)); - } - } - else if (m) { - ttr.nextSymbol(); - if (!options.bymonth) - options.bymonth = []; - // @ts-ignore - options.bymonth.push(m); - } - else { - return; - } - } while (ttr.accept('comma') || ttr.accept('the') || ttr.accept('on')); - } - function AT() { - var at = ttr.accept('at'); - if (!at) - return; - do { - var n = ttr.acceptNumber(); - if (!n) { - throw new Error('Unexpected symbol ' + ttr.symbol + ', expected hour'); - } - options.byhour = [parseInt(n[0], 10)]; - while (ttr.accept('comma')) { - n = ttr.acceptNumber(); - if (!n) { - throw new Error('Unexpected symbol ' + ttr.symbol + '; expected hour'); - } - options.byhour.push(parseInt(n[0], 10)); - } - } while (ttr.accept('comma') || ttr.accept('at')); - } - function decodeM() { - switch (ttr.symbol) { - case 'january': - return 1; - case 'february': - return 2; - case 'march': - return 3; - case 'april': - return 4; - case 'may': - return 5; - case 'june': - return 6; - case 'july': - return 7; - case 'august': - return 8; - case 'september': - return 9; - case 'october': - return 10; - case 'november': - return 11; - case 'december': - return 12; - default: - return false; - } - } - function decodeWKD() { - switch (ttr.symbol) { - case 'monday': - case 'tuesday': - case 'wednesday': - case 'thursday': - case 'friday': - case 'saturday': - case 'sunday': - return ttr.symbol.substr(0, 2).toUpperCase(); - default: - return false; - } - } - function decodeNTH() { - switch (ttr.symbol) { - case 'last': - ttr.nextSymbol(); - return -1; - case 'first': - ttr.nextSymbol(); - return 1; - case 'second': - ttr.nextSymbol(); - return ttr.accept('last') ? -2 : 2; - case 'third': - ttr.nextSymbol(); - return ttr.accept('last') ? -3 : 3; - case 'nth': - var v = parseInt(ttr.value[1], 10); - if (v < -366 || v > 366) - throw new Error('Nth out of range: ' + v); - ttr.nextSymbol(); - return ttr.accept('last') ? -v : v; - default: - return false; - } - } - function MDAYs() { - ttr.accept('on'); - ttr.accept('the'); - var nth = decodeNTH(); - if (!nth) - return; - options.bymonthday = [nth]; - ttr.nextSymbol(); - while (ttr.accept('comma')) { - nth = decodeNTH(); - if (!nth) { - throw new Error('Unexpected symbol ' + ttr.symbol + '; expected monthday'); - } - options.bymonthday.push(nth); - ttr.nextSymbol(); - } - } - function F() { - if (ttr.symbol === 'until') { - var date = Date.parse(ttr.text); - if (!date) - throw new Error('Cannot parse until date:' + ttr.text); - options.until = new Date(date); - } - else if (ttr.accept('for')) { - options.count = parseInt(ttr.value[0], 10); - ttr.expect('number'); - // ttr.expect('times') - } - } -} - -var Frequency; -(function (Frequency) { - Frequency[Frequency["YEARLY"] = 0] = "YEARLY"; - Frequency[Frequency["MONTHLY"] = 1] = "MONTHLY"; - Frequency[Frequency["WEEKLY"] = 2] = "WEEKLY"; - Frequency[Frequency["DAILY"] = 3] = "DAILY"; - Frequency[Frequency["HOURLY"] = 4] = "HOURLY"; - Frequency[Frequency["MINUTELY"] = 5] = "MINUTELY"; - Frequency[Frequency["SECONDLY"] = 6] = "SECONDLY"; -})(Frequency || (Frequency = {})); -function freqIsDailyOrGreater(freq) { - return freq < Frequency.HOURLY; -} - -/*! -* rrule.js - Library for working with recurrence rules for calendar dates. -* https://github.com/jakubroztocil/rrule -* -* Copyright 2010, Jakub Roztocil and Lars Schoning -* Licenced under the BSD licence. -* https://github.com/jakubroztocil/rrule/blob/master/LICENCE -* -*/ -/** - * - * Implementation of RRule.fromText() and RRule::toText(). - * - * - * On the client side, this file needs to be included - * when those functions are used. - * - */ -// ============================================================================= -// fromText -// ============================================================================= -/** - * Will be able to convert some of the below described rules from - * text format to a rule object. - * - * - * RULES - * - * Every ([n]) - * day(s) - * | [weekday], ..., (and) [weekday] - * | weekday(s) - * | week(s) - * | month(s) - * | [month], ..., (and) [month] - * | year(s) - * - * - * Plus 0, 1, or multiple of these: - * - * on [weekday], ..., (or) [weekday] the [monthday], [monthday], ... (or) [monthday] - * - * on [weekday], ..., (and) [weekday] - * - * on the [monthday], [monthday], ... (and) [monthday] (day of the month) - * - * on the [nth-weekday], ..., (and) [nth-weekday] (of the month/year) - * - * - * Plus 0 or 1 of these: - * - * for [n] time(s) - * - * until [date] - * - * Plus (.) - * - * - * Definitely no supported for parsing: - * - * (for year): - * in week(s) [n], ..., (and) [n] - * - * on the [yearday], ..., (and) [n] day of the year - * on day [yearday], ..., (and) [n] - * - * - * NON-TERMINALS - * - * [n]: 1, 2 ..., one, two, three .. - * [month]: January, February, March, April, May, ... December - * [weekday]: Monday, ... Sunday - * [nth-weekday]: first [weekday], 2nd [weekday], ... last [weekday], ... - * [monthday]: first, 1., 2., 1st, 2nd, second, ... 31st, last day, 2nd last day, .. - * [date]: - * [month] (0-31(,) ([year])), - * (the) 0-31.(1-12.([year])), - * (the) 0-31/(1-12/([year])), - * [weekday] - * - * [year]: 0000, 0001, ... 01, 02, .. - * - * Definitely not supported for parsing: - * - * [yearday]: first, 1., 2., 1st, 2nd, second, ... 366th, last day, 2nd last day, .. - * - * @param {String} text - * @return {Object, Boolean} the rule, or null. - */ -var fromText = function (text, language) { - if (language === void 0) { language = ENGLISH; } - return new RRule(parseText(text, language) || undefined); -}; -var common = [ - 'count', - 'until', - 'interval', - 'byweekday', - 'bymonthday', - 'bymonth' -]; -ToText.IMPLEMENTED = []; -ToText.IMPLEMENTED[Frequency.HOURLY] = common; -ToText.IMPLEMENTED[Frequency.MINUTELY] = common; -ToText.IMPLEMENTED[Frequency.DAILY] = ['byhour'].concat(common); -ToText.IMPLEMENTED[Frequency.WEEKLY] = common; -ToText.IMPLEMENTED[Frequency.MONTHLY] = common; -ToText.IMPLEMENTED[Frequency.YEARLY] = ['byweekno', 'byyearday'].concat(common); -// ============================================================================= -// Export -// ============================================================================= -var toText = function (rrule, gettext, language, dateFormatter) { - return new ToText(rrule, gettext, language, dateFormatter).toString(); -}; -var isFullyConvertible = ToText.isFullyConvertible; - -var Time = /** @class */ (function () { - function Time(hour, minute, second, millisecond) { - this.hour = hour; - this.minute = minute; - this.second = second; - this.millisecond = millisecond || 0; - } - Time.prototype.getHours = function () { - return this.hour; - }; - Time.prototype.getMinutes = function () { - return this.minute; - }; - Time.prototype.getSeconds = function () { - return this.second; - }; - Time.prototype.getMilliseconds = function () { - return this.millisecond; - }; - Time.prototype.getTime = function () { - return ((this.hour * 60 * 60 + this.minute * 60 + this.second) * 1000 + - this.millisecond); - }; - return Time; -}()); -var DateTime = /** @class */ (function (_super) { - __extends(DateTime, _super); - function DateTime(year, month, day, hour, minute, second, millisecond) { - var _this = _super.call(this, hour, minute, second, millisecond) || this; - _this.year = year; - _this.month = month; - _this.day = day; - return _this; - } - DateTime.fromDate = function (date) { - return new this(date.getUTCFullYear(), date.getUTCMonth() + 1, date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds(), date.valueOf() % 1000); - }; - DateTime.prototype.getWeekday = function () { - return dateutil.getWeekday(new Date(this.getTime())); - }; - DateTime.prototype.getTime = function () { - return new Date(Date.UTC(this.year, this.month - 1, this.day, this.hour, this.minute, this.second, this.millisecond)).getTime(); - }; - DateTime.prototype.getDay = function () { - return this.day; - }; - DateTime.prototype.getMonth = function () { - return this.month; - }; - DateTime.prototype.getYear = function () { - return this.year; - }; - DateTime.prototype.addYears = function (years) { - this.year += years; - }; - DateTime.prototype.addMonths = function (months) { - this.month += months; - if (this.month > 12) { - var yearDiv = Math.floor(this.month / 12); - var monthMod = pymod(this.month, 12); - this.month = monthMod; - this.year += yearDiv; - if (this.month === 0) { - this.month = 12; - --this.year; - } - } - }; - DateTime.prototype.addWeekly = function (days, wkst) { - if (wkst > this.getWeekday()) { - this.day += -(this.getWeekday() + 1 + (6 - wkst)) + days * 7; - } - else { - this.day += -(this.getWeekday() - wkst) + days * 7; - } - this.fixDay(); - }; - DateTime.prototype.addDaily = function (days) { - this.day += days; - this.fixDay(); - }; - DateTime.prototype.addHours = function (hours, filtered, byhour) { - if (filtered) { - // Jump to one iteration before next day - this.hour += Math.floor((23 - this.hour) / hours) * hours; - } - while (true) { - this.hour += hours; - var _a = divmod(this.hour, 24), dayDiv = _a.div, hourMod = _a.mod; - if (dayDiv) { - this.hour = hourMod; - this.addDaily(dayDiv); - } - if (empty$1(byhour) || includes(byhour, this.hour)) - break; - } - }; - DateTime.prototype.addMinutes = function (minutes, filtered, byhour, byminute) { - if (filtered) { - // Jump to one iteration before next day - this.minute += - Math.floor((1439 - (this.hour * 60 + this.minute)) / minutes) * minutes; - } - while (true) { - this.minute += minutes; - var _a = divmod(this.minute, 60), hourDiv = _a.div, minuteMod = _a.mod; - if (hourDiv) { - this.minute = minuteMod; - this.addHours(hourDiv, false, byhour); - } - if ((empty$1(byhour) || includes(byhour, this.hour)) && - (empty$1(byminute) || includes(byminute, this.minute))) { - break; - } - } - }; - DateTime.prototype.addSeconds = function (seconds, filtered, byhour, byminute, bysecond) { - if (filtered) { - // Jump to one iteration before next day - this.second += - Math.floor((86399 - (this.hour * 3600 + this.minute * 60 + this.second)) / seconds) * seconds; - } - while (true) { - this.second += seconds; - var _a = divmod(this.second, 60), minuteDiv = _a.div, secondMod = _a.mod; - if (minuteDiv) { - this.second = secondMod; - this.addMinutes(minuteDiv, false, byhour, byminute); - } - if ((empty$1(byhour) || includes(byhour, this.hour)) && - (empty$1(byminute) || includes(byminute, this.minute)) && - (empty$1(bysecond) || includes(bysecond, this.second))) { - break; - } - } - }; - DateTime.prototype.fixDay = function () { - if (this.day <= 28) { - return; - } - var daysinmonth = dateutil.monthRange(this.year, this.month - 1)[1]; - if (this.day <= daysinmonth) { - return; - } - while (this.day > daysinmonth) { - this.day -= daysinmonth; - ++this.month; - if (this.month === 13) { - this.month = 1; - ++this.year; - if (this.year > dateutil.MAXYEAR) { - return; - } - } - daysinmonth = dateutil.monthRange(this.year, this.month - 1)[1]; - } - }; - DateTime.prototype.add = function (options, filtered) { - var freq = options.freq, interval = options.interval, wkst = options.wkst, byhour = options.byhour, byminute = options.byminute, bysecond = options.bysecond; - switch (freq) { - case Frequency.YEARLY: return this.addYears(interval); - case Frequency.MONTHLY: return this.addMonths(interval); - case Frequency.WEEKLY: return this.addWeekly(interval, wkst); - case Frequency.DAILY: return this.addDaily(interval); - case Frequency.HOURLY: return this.addHours(interval, filtered, byhour); - case Frequency.MINUTELY: return this.addMinutes(interval, filtered, byhour, byminute); - case Frequency.SECONDLY: return this.addSeconds(interval, filtered, byhour, byminute, bysecond); - } - }; - return DateTime; -}(Time)); - -function initializeOptions(options) { - var invalid = []; - var keys = Object.keys(options); - // Shallow copy for options and origOptions and check for invalid - for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) { - var key = keys_1[_i]; - if (!includes(defaultKeys, key)) - invalid.push(key); - if (dateutil$1.isDate(options[key]) && !dateutil$1.isValidDate(options[key])) - invalid.push(key); - } - if (invalid.length) { - throw new Error('Invalid options: ' + invalid.join(', ')); - } - return __assign({}, options); -} -function parseOptions(options) { - var opts = __assign(__assign({}, DEFAULT_OPTIONS), initializeOptions(options)); - if (isPresent(opts.byeaster)) - opts.freq = RRule.YEARLY; - if (!(isPresent(opts.freq) && RRule.FREQUENCIES[opts.freq])) { - throw new Error("Invalid frequency: " + opts.freq + " " + options.freq); - } - if (!opts.dtstart) - opts.dtstart = new Date(new Date().setMilliseconds(0)); - if (!isPresent(opts.wkst)) { - opts.wkst = RRule.MO.weekday; - } - else if (isNumber(opts.wkst)) ; - else { - opts.wkst = opts.wkst.weekday; - } - if (isPresent(opts.bysetpos)) { - if (isNumber(opts.bysetpos)) - opts.bysetpos = [opts.bysetpos]; - for (var i = 0; i < opts.bysetpos.length; i++) { - var v = opts.bysetpos[i]; - if (v === 0 || !(v >= -366 && v <= 366)) { - throw new Error('bysetpos must be between 1 and 366,' + ' or between -366 and -1'); - } - } - } - if (!(Boolean(opts.byweekno) || - notEmpty(opts.byweekno) || - notEmpty(opts.byyearday) || - Boolean(opts.bymonthday) || - notEmpty(opts.bymonthday) || - isPresent(opts.byweekday) || - isPresent(opts.byeaster))) { - switch (opts.freq) { - case RRule.YEARLY: - if (!opts.bymonth) - opts.bymonth = opts.dtstart.getUTCMonth() + 1; - opts.bymonthday = opts.dtstart.getUTCDate(); - break; - case RRule.MONTHLY: - opts.bymonthday = opts.dtstart.getUTCDate(); - break; - case RRule.WEEKLY: - opts.byweekday = [dateutil$1.getWeekday(opts.dtstart)]; - break; - } - } - // bymonth - if (isPresent(opts.bymonth) && !isArray(opts.bymonth)) { - opts.bymonth = [opts.bymonth]; - } - // byyearday - if (isPresent(opts.byyearday) && - !isArray(opts.byyearday) && - isNumber(opts.byyearday)) { - opts.byyearday = [opts.byyearday]; - } - // bymonthday - if (!isPresent(opts.bymonthday)) { - opts.bymonthday = []; - opts.bynmonthday = []; - } - else if (isArray(opts.bymonthday)) { - var bymonthday = []; - var bynmonthday = []; - for (var i = 0; i < opts.bymonthday.length; i++) { - var v = opts.bymonthday[i]; - if (v > 0) { - bymonthday.push(v); - } - else if (v < 0) { - bynmonthday.push(v); - } - } - opts.bymonthday = bymonthday; - opts.bynmonthday = bynmonthday; - } - else if (opts.bymonthday < 0) { - opts.bynmonthday = [opts.bymonthday]; - opts.bymonthday = []; - } - else { - opts.bynmonthday = []; - opts.bymonthday = [opts.bymonthday]; - } - // byweekno - if (isPresent(opts.byweekno) && !isArray(opts.byweekno)) { - opts.byweekno = [opts.byweekno]; - } - // byweekday / bynweekday - if (!isPresent(opts.byweekday)) { - opts.bynweekday = null; - } - else if (isNumber(opts.byweekday)) { - opts.byweekday = [opts.byweekday]; - opts.bynweekday = null; - } - else if (isWeekdayStr(opts.byweekday)) { - opts.byweekday = [Weekday.fromStr(opts.byweekday).weekday]; - opts.bynweekday = null; - } - else if (opts.byweekday instanceof Weekday) { - if (!opts.byweekday.n || opts.freq > RRule.MONTHLY) { - opts.byweekday = [opts.byweekday.weekday]; - opts.bynweekday = null; - } - else { - opts.bynweekday = [[opts.byweekday.weekday, opts.byweekday.n]]; - opts.byweekday = null; - } - } - else { - var byweekday = []; - var bynweekday = []; - for (var i = 0; i < opts.byweekday.length; i++) { - var wday = opts.byweekday[i]; - if (isNumber(wday)) { - byweekday.push(wday); - continue; - } - else if (isWeekdayStr(wday)) { - byweekday.push(Weekday.fromStr(wday).weekday); - continue; - } - if (!wday.n || opts.freq > RRule.MONTHLY) { - byweekday.push(wday.weekday); - } - else { - bynweekday.push([wday.weekday, wday.n]); - } - } - opts.byweekday = notEmpty(byweekday) ? byweekday : null; - opts.bynweekday = notEmpty(bynweekday) ? bynweekday : null; - } - // byhour - if (!isPresent(opts.byhour)) { - opts.byhour = - opts.freq < RRule.HOURLY ? [opts.dtstart.getUTCHours()] : null; - } - else if (isNumber(opts.byhour)) { - opts.byhour = [opts.byhour]; - } - // byminute - if (!isPresent(opts.byminute)) { - opts.byminute = - opts.freq < RRule.MINUTELY ? [opts.dtstart.getUTCMinutes()] : null; - } - else if (isNumber(opts.byminute)) { - opts.byminute = [opts.byminute]; - } - // bysecond - if (!isPresent(opts.bysecond)) { - opts.bysecond = - opts.freq < RRule.SECONDLY ? [opts.dtstart.getUTCSeconds()] : null; - } - else if (isNumber(opts.bysecond)) { - opts.bysecond = [opts.bysecond]; - } - return { parsedOptions: opts }; -} -function buildTimeset(opts) { - var millisecondModulo = opts.dtstart.getTime() % 1000; - if (!freqIsDailyOrGreater(opts.freq)) { - return []; - } - var timeset = []; - opts.byhour.forEach(function (hour) { - opts.byminute.forEach(function (minute) { - opts.bysecond.forEach(function (second) { - timeset.push(new Time(hour, minute, second, millisecondModulo)); - }); - }); - }); - return timeset; -} - -function parseString(rfcString) { - var options = rfcString.split('\n').map(parseLine).filter(function (x) { return x !== null; }); - return __assign(__assign({}, options[0]), options[1]); -} -function parseDtstart(line) { - var options = {}; - var dtstartWithZone = /DTSTART(?:;TZID=([^:=]+?))?(?::|=)([^;\s]+)/i.exec(line); - if (!dtstartWithZone) { - return options; - } - var _ = dtstartWithZone[0], tzid = dtstartWithZone[1], dtstart = dtstartWithZone[2]; - if (tzid) { - options.tzid = tzid; - } - options.dtstart = dateutil$1.untilStringToDate(dtstart); - return options; -} -function parseLine(rfcString) { - rfcString = rfcString.replace(/^\s+|\s+$/, ''); - if (!rfcString.length) - return null; - var header = /^([A-Z]+?)[:;]/.exec(rfcString.toUpperCase()); - if (!header) { - return parseRrule(rfcString); - } - var _ = header[0], key = header[1]; - switch (key.toUpperCase()) { - case 'RRULE': - case 'EXRULE': - return parseRrule(rfcString); - case 'DTSTART': - return parseDtstart(rfcString); - default: - throw new Error("Unsupported RFC prop " + key + " in " + rfcString); - } -} -function parseRrule(line) { - var strippedLine = line.replace(/^RRULE:/i, ''); - var options = parseDtstart(strippedLine); - var attrs = line.replace(/^(?:RRULE|EXRULE):/i, '').split(';'); - attrs.forEach(function (attr) { - var _a = attr.split('='), key = _a[0], value = _a[1]; - switch (key.toUpperCase()) { - case 'FREQ': - options.freq = Frequency[value.toUpperCase()]; - break; - case 'WKST': - options.wkst = Days[value.toUpperCase()]; - break; - case 'COUNT': - case 'INTERVAL': - case 'BYSETPOS': - case 'BYMONTH': - case 'BYMONTHDAY': - case 'BYYEARDAY': - case 'BYWEEKNO': - case 'BYHOUR': - case 'BYMINUTE': - case 'BYSECOND': - var num = parseNumber(value); - var optionKey = key.toLowerCase(); - // @ts-ignore - options[optionKey] = num; - break; - case 'BYWEEKDAY': - case 'BYDAY': - options.byweekday = parseWeekday(value); - break; - case 'DTSTART': - case 'TZID': - // for backwards compatibility - var dtstart = parseDtstart(line); - options.tzid = dtstart.tzid; - options.dtstart = dtstart.dtstart; - break; - case 'UNTIL': - options.until = dateutil$1.untilStringToDate(value); - break; - case 'BYEASTER': - options.byeaster = Number(value); - break; - default: - throw new Error("Unknown RRULE property '" + key + "'"); - } - }); - return options; -} -function parseNumber(value) { - if (value.indexOf(',') !== -1) { - var values = value.split(','); - return values.map(parseIndividualNumber); - } - return parseIndividualNumber(value); -} -function parseIndividualNumber(value) { - if (/^[+-]?\d+$/.test(value)) { - return Number(value); - } - return value; -} -function parseWeekday(value) { - var days = value.split(','); - return days.map(function (day) { - if (day.length === 2) { - // MO, TU, ... - return Days[day]; // wday instanceof Weekday - } - // -1MO, +3FR, 1SO, 13TU ... - var parts = day.match(/^([+-]?\d{1,2})([A-Z]{2})$/); - var n = Number(parts[1]); - var wdaypart = parts[2]; - var wday = Days[wdaypart].weekday; - return new Weekday(wday, n); - }); -} - -// these aren't really private, but nor are they really useful to document - -/** - * @private - */ -class LuxonError extends Error {} -/** - * @private - */ - - -class InvalidDateTimeError extends LuxonError { - constructor(reason) { - super(`Invalid DateTime: ${reason.toMessage()}`); - } - -} -/** - * @private - */ - -class InvalidIntervalError extends LuxonError { - constructor(reason) { - super(`Invalid Interval: ${reason.toMessage()}`); - } - -} -/** - * @private - */ - -class InvalidDurationError extends LuxonError { - constructor(reason) { - super(`Invalid Duration: ${reason.toMessage()}`); - } - -} -/** - * @private - */ - -class ConflictingSpecificationError extends LuxonError {} -/** - * @private - */ - -class InvalidUnitError extends LuxonError { - constructor(unit) { - super(`Invalid unit ${unit}`); - } - -} -/** - * @private - */ - -class InvalidArgumentError extends LuxonError {} -/** - * @private - */ - -class ZoneIsAbstractError extends LuxonError { - constructor() { - super("Zone is an abstract class"); - } - -} - -/** - * @private - */ -const n = "numeric", - s = "short", - l = "long"; -const DATE_SHORT = { - year: n, - month: n, - day: n -}; -const DATE_MED = { - year: n, - month: s, - day: n -}; -const DATE_MED_WITH_WEEKDAY = { - year: n, - month: s, - day: n, - weekday: s -}; -const DATE_FULL = { - year: n, - month: l, - day: n -}; -const DATE_HUGE = { - year: n, - month: l, - day: n, - weekday: l -}; -const TIME_SIMPLE = { - hour: n, - minute: n -}; -const TIME_WITH_SECONDS = { - hour: n, - minute: n, - second: n -}; -const TIME_WITH_SHORT_OFFSET = { - hour: n, - minute: n, - second: n, - timeZoneName: s -}; -const TIME_WITH_LONG_OFFSET = { - hour: n, - minute: n, - second: n, - timeZoneName: l -}; -const TIME_24_SIMPLE = { - hour: n, - minute: n, - hour12: false -}; -/** - * {@link toLocaleString}; format like '09:30:23', always 24-hour. - */ - -const TIME_24_WITH_SECONDS = { - hour: n, - minute: n, - second: n, - hour12: false -}; -/** - * {@link toLocaleString}; format like '09:30:23 EDT', always 24-hour. - */ - -const TIME_24_WITH_SHORT_OFFSET = { - hour: n, - minute: n, - second: n, - hour12: false, - timeZoneName: s -}; -/** - * {@link toLocaleString}; format like '09:30:23 Eastern Daylight Time', always 24-hour. - */ - -const TIME_24_WITH_LONG_OFFSET = { - hour: n, - minute: n, - second: n, - hour12: false, - timeZoneName: l -}; -/** - * {@link toLocaleString}; format like '10/14/1983, 9:30 AM'. Only 12-hour if the locale is. - */ - -const DATETIME_SHORT = { - year: n, - month: n, - day: n, - hour: n, - minute: n -}; -/** - * {@link toLocaleString}; format like '10/14/1983, 9:30:33 AM'. Only 12-hour if the locale is. - */ - -const DATETIME_SHORT_WITH_SECONDS = { - year: n, - month: n, - day: n, - hour: n, - minute: n, - second: n -}; -const DATETIME_MED = { - year: n, - month: s, - day: n, - hour: n, - minute: n -}; -const DATETIME_MED_WITH_SECONDS = { - year: n, - month: s, - day: n, - hour: n, - minute: n, - second: n -}; -const DATETIME_MED_WITH_WEEKDAY = { - year: n, - month: s, - day: n, - weekday: s, - hour: n, - minute: n -}; -const DATETIME_FULL = { - year: n, - month: l, - day: n, - hour: n, - minute: n, - timeZoneName: s -}; -const DATETIME_FULL_WITH_SECONDS = { - year: n, - month: l, - day: n, - hour: n, - minute: n, - second: n, - timeZoneName: s -}; -const DATETIME_HUGE = { - year: n, - month: l, - day: n, - weekday: l, - hour: n, - minute: n, - timeZoneName: l -}; -const DATETIME_HUGE_WITH_SECONDS = { - year: n, - month: l, - day: n, - weekday: l, - hour: n, - minute: n, - second: n, - timeZoneName: l -}; - -/* - This is just a junk drawer, containing anything used across multiple classes. - Because Luxon is small(ish), this should stay small and we won't worry about splitting - it up into, say, parsingUtil.js and basicUtil.js and so on. But they are divided up by feature area. -*/ -/** - * @private - */ -// TYPES - -function isUndefined(o) { - return typeof o === "undefined"; -} -function isNumber$1(o) { - return typeof o === "number"; -} -function isInteger(o) { - return typeof o === "number" && o % 1 === 0; -} -function isString(o) { - return typeof o === "string"; -} -function isDate(o) { - return Object.prototype.toString.call(o) === "[object Date]"; -} // CAPABILITIES - -function hasIntl() { - try { - return typeof Intl !== "undefined" && Intl.DateTimeFormat; - } catch (e) { - return false; - } -} -function hasFormatToParts() { - return !isUndefined(Intl.DateTimeFormat.prototype.formatToParts); -} -function hasRelative() { - try { - return typeof Intl !== "undefined" && !!Intl.RelativeTimeFormat; - } catch (e) { - return false; - } -} // OBJECTS AND ARRAYS - -function maybeArray(thing) { - return Array.isArray(thing) ? thing : [thing]; -} -function bestBy(arr, by, compare) { - if (arr.length === 0) { - return undefined; - } - - return arr.reduce((best, next) => { - const pair = [by(next), next]; - - if (!best) { - return pair; - } else if (compare(best[0], pair[0]) === best[0]) { - return best; - } else { - return pair; - } - }, null)[1]; -} -function pick(obj, keys) { - return keys.reduce((a, k) => { - a[k] = obj[k]; - return a; - }, {}); -} -function hasOwnProperty(obj, prop) { - return Object.prototype.hasOwnProperty.call(obj, prop); -} // NUMBERS AND STRINGS - -function integerBetween(thing, bottom, top) { - return isInteger(thing) && thing >= bottom && thing <= top; -} // x % n but takes the sign of n instead of x - -function floorMod(x, n) { - return x - n * Math.floor(x / n); -} -function padStart$1(input, n = 2) { - const minus = input < 0 ? "-" : ""; - const target = minus ? input * -1 : input; - let result; - - if (target.toString().length < n) { - result = ("0".repeat(n) + target).slice(-n); - } else { - result = target.toString(); - } - - return `${minus}${result}`; -} -function parseInteger(string) { - if (isUndefined(string) || string === null || string === "") { - return undefined; - } else { - return parseInt(string, 10); - } -} -function parseMillis(fraction) { - // Return undefined (instead of 0) in these cases, where fraction is not set - if (isUndefined(fraction) || fraction === null || fraction === "") { - return undefined; - } else { - const f = parseFloat("0." + fraction) * 1000; - return Math.floor(f); - } -} -function roundTo(number, digits, towardZero = false) { - const factor = Math.pow(10, digits), - rounder = towardZero ? Math.trunc : Math.round; - return rounder(number * factor) / factor; -} // DATE BASICS - -function isLeapYear(year) { - return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); -} -function daysInYear(year) { - return isLeapYear(year) ? 366 : 365; -} -function daysInMonth(year, month) { - const modMonth = floorMod(month - 1, 12) + 1, - modYear = year + (month - modMonth) / 12; - - if (modMonth === 2) { - return isLeapYear(modYear) ? 29 : 28; - } else { - return [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][modMonth - 1]; - } -} // covert a calendar object to a local timestamp (epoch, but with the offset baked in) - -function objToLocalTS(obj) { - let d = Date.UTC(obj.year, obj.month - 1, obj.day, obj.hour, obj.minute, obj.second, obj.millisecond); // for legacy reasons, years between 0 and 99 are interpreted as 19XX; revert that - - if (obj.year < 100 && obj.year >= 0) { - d = new Date(d); - d.setUTCFullYear(d.getUTCFullYear() - 1900); - } - - return +d; -} -function weeksInWeekYear(weekYear) { - const p1 = (weekYear + Math.floor(weekYear / 4) - Math.floor(weekYear / 100) + Math.floor(weekYear / 400)) % 7, - last = weekYear - 1, - p2 = (last + Math.floor(last / 4) - Math.floor(last / 100) + Math.floor(last / 400)) % 7; - return p1 === 4 || p2 === 3 ? 53 : 52; -} -function untruncateYear(year) { - if (year > 99) { - return year; - } else return year > 60 ? 1900 + year : 2000 + year; -} // PARSING - -function parseZoneInfo(ts, offsetFormat, locale, timeZone = null) { - const date = new Date(ts), - intlOpts = { - hour12: false, - year: "numeric", - month: "2-digit", - day: "2-digit", - hour: "2-digit", - minute: "2-digit" - }; - - if (timeZone) { - intlOpts.timeZone = timeZone; - } - - const modified = Object.assign({ - timeZoneName: offsetFormat - }, intlOpts), - intl = hasIntl(); - - if (intl && hasFormatToParts()) { - const parsed = new Intl.DateTimeFormat(locale, modified).formatToParts(date).find(m => m.type.toLowerCase() === "timezonename"); - return parsed ? parsed.value : null; - } else if (intl) { - // this probably doesn't work for all locales - const without = new Intl.DateTimeFormat(locale, intlOpts).format(date), - included = new Intl.DateTimeFormat(locale, modified).format(date), - diffed = included.substring(without.length), - trimmed = diffed.replace(/^[, \u200e]+/, ""); - return trimmed; - } else { - return null; - } -} // signedOffset('-5', '30') -> -330 - -function signedOffset(offHourStr, offMinuteStr) { - let offHour = parseInt(offHourStr, 10); // don't || this because we want to preserve -0 - - if (Number.isNaN(offHour)) { - offHour = 0; - } - - const offMin = parseInt(offMinuteStr, 10) || 0, - offMinSigned = offHour < 0 || Object.is(offHour, -0) ? -offMin : offMin; - return offHour * 60 + offMinSigned; -} // COERCION - -function asNumber(value) { - const numericValue = Number(value); - if (typeof value === "boolean" || value === "" || Number.isNaN(numericValue)) throw new InvalidArgumentError(`Invalid unit value ${value}`); - return numericValue; -} -function normalizeObject(obj, normalizer, nonUnitKeys) { - const normalized = {}; - - for (const u in obj) { - if (hasOwnProperty(obj, u)) { - if (nonUnitKeys.indexOf(u) >= 0) continue; - const v = obj[u]; - if (v === undefined || v === null) continue; - normalized[normalizer(u)] = asNumber(v); - } - } - - return normalized; -} -function formatOffset(offset, format) { - const hours = Math.trunc(Math.abs(offset / 60)), - minutes = Math.trunc(Math.abs(offset % 60)), - sign = offset >= 0 ? "+" : "-"; - - switch (format) { - case "short": - return `${sign}${padStart$1(hours, 2)}:${padStart$1(minutes, 2)}`; - - case "narrow": - return `${sign}${hours}${minutes > 0 ? `:${minutes}` : ""}`; - - case "techie": - return `${sign}${padStart$1(hours, 2)}${padStart$1(minutes, 2)}`; - - default: - throw new RangeError(`Value format ${format} is out of range for property format`); - } -} -function timeObject(obj) { - return pick(obj, ["hour", "minute", "second", "millisecond"]); -} -const ianaRegex = /[A-Za-z_+-]{1,256}(:?\/[A-Za-z_+-]{1,256}(\/[A-Za-z_+-]{1,256})?)?/; - -function stringify(obj) { - return JSON.stringify(obj, Object.keys(obj).sort()); -} -/** - * @private - */ - - -const monthsLong = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; -const monthsShort = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; -const monthsNarrow = ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"]; -function months(length) { - switch (length) { - case "narrow": - return monthsNarrow; - - case "short": - return monthsShort; - - case "long": - return monthsLong; - - case "numeric": - return ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"]; - - case "2-digit": - return ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"]; - - default: - return null; - } -} -const weekdaysLong = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]; -const weekdaysShort = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]; -const weekdaysNarrow = ["M", "T", "W", "T", "F", "S", "S"]; -function weekdays$1(length) { - switch (length) { - case "narrow": - return weekdaysNarrow; - - case "short": - return weekdaysShort; - - case "long": - return weekdaysLong; - - case "numeric": - return ["1", "2", "3", "4", "5", "6", "7"]; - - default: - return null; - } -} -const meridiems = ["AM", "PM"]; -const erasLong = ["Before Christ", "Anno Domini"]; -const erasShort = ["BC", "AD"]; -const erasNarrow = ["B", "A"]; -function eras(length) { - switch (length) { - case "narrow": - return erasNarrow; - - case "short": - return erasShort; - - case "long": - return erasLong; - - default: - return null; - } -} -function meridiemForDateTime(dt) { - return meridiems[dt.hour < 12 ? 0 : 1]; -} -function weekdayForDateTime(dt, length) { - return weekdays$1(length)[dt.weekday - 1]; -} -function monthForDateTime(dt, length) { - return months(length)[dt.month - 1]; -} -function eraForDateTime(dt, length) { - return eras(length)[dt.year < 0 ? 0 : 1]; -} -function formatRelativeTime(unit, count, numeric = "always", narrow = false) { - const units = { - years: ["year", "yr."], - quarters: ["quarter", "qtr."], - months: ["month", "mo."], - weeks: ["week", "wk."], - days: ["day", "day", "days"], - hours: ["hour", "hr."], - minutes: ["minute", "min."], - seconds: ["second", "sec."] - }; - const lastable = ["hours", "minutes", "seconds"].indexOf(unit) === -1; - - if (numeric === "auto" && lastable) { - const isDay = unit === "days"; - - switch (count) { - case 1: - return isDay ? "tomorrow" : `next ${units[unit][0]}`; - - case -1: - return isDay ? "yesterday" : `last ${units[unit][0]}`; - - case 0: - return isDay ? "today" : `this ${units[unit][0]}`; - - } - } - - const isInPast = Object.is(count, -0) || count < 0, - fmtValue = Math.abs(count), - singular = fmtValue === 1, - lilUnits = units[unit], - fmtUnit = narrow ? singular ? lilUnits[1] : lilUnits[2] || lilUnits[1] : singular ? units[unit][0] : unit; - return isInPast ? `${fmtValue} ${fmtUnit} ago` : `in ${fmtValue} ${fmtUnit}`; -} -function formatString(knownFormat) { - // these all have the offsets removed because we don't have access to them - // without all the intl stuff this is backfilling - const filtered = pick(knownFormat, ["weekday", "era", "year", "month", "day", "hour", "minute", "second", "timeZoneName", "hour12"]), - key = stringify(filtered), - dateTimeHuge = "EEEE, LLLL d, yyyy, h:mm a"; - - switch (key) { - case stringify(DATE_SHORT): - return "M/d/yyyy"; - - case stringify(DATE_MED): - return "LLL d, yyyy"; - - case stringify(DATE_MED_WITH_WEEKDAY): - return "EEE, LLL d, yyyy"; - - case stringify(DATE_FULL): - return "LLLL d, yyyy"; - - case stringify(DATE_HUGE): - return "EEEE, LLLL d, yyyy"; - - case stringify(TIME_SIMPLE): - return "h:mm a"; - - case stringify(TIME_WITH_SECONDS): - return "h:mm:ss a"; - - case stringify(TIME_WITH_SHORT_OFFSET): - return "h:mm a"; - - case stringify(TIME_WITH_LONG_OFFSET): - return "h:mm a"; - - case stringify(TIME_24_SIMPLE): - return "HH:mm"; - - case stringify(TIME_24_WITH_SECONDS): - return "HH:mm:ss"; - - case stringify(TIME_24_WITH_SHORT_OFFSET): - return "HH:mm"; - - case stringify(TIME_24_WITH_LONG_OFFSET): - return "HH:mm"; - - case stringify(DATETIME_SHORT): - return "M/d/yyyy, h:mm a"; - - case stringify(DATETIME_MED): - return "LLL d, yyyy, h:mm a"; - - case stringify(DATETIME_FULL): - return "LLLL d, yyyy, h:mm a"; - - case stringify(DATETIME_HUGE): - return dateTimeHuge; - - case stringify(DATETIME_SHORT_WITH_SECONDS): - return "M/d/yyyy, h:mm:ss a"; - - case stringify(DATETIME_MED_WITH_SECONDS): - return "LLL d, yyyy, h:mm:ss a"; - - case stringify(DATETIME_MED_WITH_WEEKDAY): - return "EEE, d LLL yyyy, h:mm a"; - - case stringify(DATETIME_FULL_WITH_SECONDS): - return "LLLL d, yyyy, h:mm:ss a"; - - case stringify(DATETIME_HUGE_WITH_SECONDS): - return "EEEE, LLLL d, yyyy, h:mm:ss a"; - - default: - return dateTimeHuge; - } -} - -function stringifyTokens(splits, tokenToString) { - let s = ""; - - for (const token of splits) { - if (token.literal) { - s += token.val; - } else { - s += tokenToString(token.val); - } - } - - return s; -} - -const macroTokenToFormatOpts = { - D: DATE_SHORT, - DD: DATE_MED, - DDD: DATE_FULL, - DDDD: DATE_HUGE, - t: TIME_SIMPLE, - tt: TIME_WITH_SECONDS, - ttt: TIME_WITH_SHORT_OFFSET, - tttt: TIME_WITH_LONG_OFFSET, - T: TIME_24_SIMPLE, - TT: TIME_24_WITH_SECONDS, - TTT: TIME_24_WITH_SHORT_OFFSET, - TTTT: TIME_24_WITH_LONG_OFFSET, - f: DATETIME_SHORT, - ff: DATETIME_MED, - fff: DATETIME_FULL, - ffff: DATETIME_HUGE, - F: DATETIME_SHORT_WITH_SECONDS, - FF: DATETIME_MED_WITH_SECONDS, - FFF: DATETIME_FULL_WITH_SECONDS, - FFFF: DATETIME_HUGE_WITH_SECONDS -}; -/** - * @private - */ - -class Formatter { - static create(locale, opts = {}) { - return new Formatter(locale, opts); - } - - static parseFormat(fmt) { - let current = null, - currentFull = "", - bracketed = false; - const splits = []; - - for (let i = 0; i < fmt.length; i++) { - const c = fmt.charAt(i); - - if (c === "'") { - if (currentFull.length > 0) { - splits.push({ - literal: bracketed, - val: currentFull - }); - } - - current = null; - currentFull = ""; - bracketed = !bracketed; - } else if (bracketed) { - currentFull += c; - } else if (c === current) { - currentFull += c; - } else { - if (currentFull.length > 0) { - splits.push({ - literal: false, - val: currentFull - }); - } - - currentFull = c; - current = c; - } - } - - if (currentFull.length > 0) { - splits.push({ - literal: bracketed, - val: currentFull - }); - } - - return splits; - } - - static macroTokenToFormatOpts(token) { - return macroTokenToFormatOpts[token]; - } - - constructor(locale, formatOpts) { - this.opts = formatOpts; - this.loc = locale; - this.systemLoc = null; - } - - formatWithSystemDefault(dt, opts) { - if (this.systemLoc === null) { - this.systemLoc = this.loc.redefaultToSystem(); - } - - const df = this.systemLoc.dtFormatter(dt, Object.assign({}, this.opts, opts)); - return df.format(); - } - - formatDateTime(dt, opts = {}) { - const df = this.loc.dtFormatter(dt, Object.assign({}, this.opts, opts)); - return df.format(); - } - - formatDateTimeParts(dt, opts = {}) { - const df = this.loc.dtFormatter(dt, Object.assign({}, this.opts, opts)); - return df.formatToParts(); - } - - resolvedOptions(dt, opts = {}) { - const df = this.loc.dtFormatter(dt, Object.assign({}, this.opts, opts)); - return df.resolvedOptions(); - } - - num(n, p = 0) { - // we get some perf out of doing this here, annoyingly - if (this.opts.forceSimple) { - return padStart$1(n, p); - } - - const opts = Object.assign({}, this.opts); - - if (p > 0) { - opts.padTo = p; - } - - return this.loc.numberFormatter(opts).format(n); - } - - formatDateTimeFromString(dt, fmt) { - const knownEnglish = this.loc.listingMode() === "en", - useDateTimeFormatter = this.loc.outputCalendar && this.loc.outputCalendar !== "gregory" && hasFormatToParts(), - string = (opts, extract) => this.loc.extract(dt, opts, extract), - formatOffset = opts => { - if (dt.isOffsetFixed && dt.offset === 0 && opts.allowZ) { - return "Z"; - } - - return dt.isValid ? dt.zone.formatOffset(dt.ts, opts.format) : ""; - }, - meridiem = () => knownEnglish ? meridiemForDateTime(dt) : string({ - hour: "numeric", - hour12: true - }, "dayperiod"), - month = (length, standalone) => knownEnglish ? monthForDateTime(dt, length) : string(standalone ? { - month: length - } : { - month: length, - day: "numeric" - }, "month"), - weekday = (length, standalone) => knownEnglish ? weekdayForDateTime(dt, length) : string(standalone ? { - weekday: length - } : { - weekday: length, - month: "long", - day: "numeric" - }, "weekday"), - maybeMacro = token => { - const formatOpts = Formatter.macroTokenToFormatOpts(token); - - if (formatOpts) { - return this.formatWithSystemDefault(dt, formatOpts); - } else { - return token; - } - }, - era = length => knownEnglish ? eraForDateTime(dt, length) : string({ - era: length - }, "era"), - tokenToString = token => { - // Where possible: http://cldr.unicode.org/translation/date-time-1/date-time#TOC-Standalone-vs.-Format-Styles - switch (token) { - // ms - case "S": - return this.num(dt.millisecond); - - case "u": // falls through - - case "SSS": - return this.num(dt.millisecond, 3); - // seconds - - case "s": - return this.num(dt.second); - - case "ss": - return this.num(dt.second, 2); - // minutes - - case "m": - return this.num(dt.minute); - - case "mm": - return this.num(dt.minute, 2); - // hours - - case "h": - return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12); - - case "hh": - return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12, 2); - - case "H": - return this.num(dt.hour); - - case "HH": - return this.num(dt.hour, 2); - // offset - - case "Z": - // like +6 - return formatOffset({ - format: "narrow", - allowZ: this.opts.allowZ - }); - - case "ZZ": - // like +06:00 - return formatOffset({ - format: "short", - allowZ: this.opts.allowZ - }); - - case "ZZZ": - // like +0600 - return formatOffset({ - format: "techie", - allowZ: this.opts.allowZ - }); - - case "ZZZZ": - // like EST - return dt.zone.offsetName(dt.ts, { - format: "short", - locale: this.loc.locale - }); - - case "ZZZZZ": - // like Eastern Standard Time - return dt.zone.offsetName(dt.ts, { - format: "long", - locale: this.loc.locale - }); - // zone - - case "z": - // like America/New_York - return dt.zoneName; - // meridiems - - case "a": - return meridiem(); - // dates - - case "d": - return useDateTimeFormatter ? string({ - day: "numeric" - }, "day") : this.num(dt.day); - - case "dd": - return useDateTimeFormatter ? string({ - day: "2-digit" - }, "day") : this.num(dt.day, 2); - // weekdays - standalone - - case "c": - // like 1 - return this.num(dt.weekday); - - case "ccc": - // like 'Tues' - return weekday("short", true); - - case "cccc": - // like 'Tuesday' - return weekday("long", true); - - case "ccccc": - // like 'T' - return weekday("narrow", true); - // weekdays - format - - case "E": - // like 1 - return this.num(dt.weekday); - - case "EEE": - // like 'Tues' - return weekday("short", false); - - case "EEEE": - // like 'Tuesday' - return weekday("long", false); - - case "EEEEE": - // like 'T' - return weekday("narrow", false); - // months - standalone - - case "L": - // like 1 - return useDateTimeFormatter ? string({ - month: "numeric", - day: "numeric" - }, "month") : this.num(dt.month); - - case "LL": - // like 01, doesn't seem to work - return useDateTimeFormatter ? string({ - month: "2-digit", - day: "numeric" - }, "month") : this.num(dt.month, 2); - - case "LLL": - // like Jan - return month("short", true); - - case "LLLL": - // like January - return month("long", true); - - case "LLLLL": - // like J - return month("narrow", true); - // months - format - - case "M": - // like 1 - return useDateTimeFormatter ? string({ - month: "numeric" - }, "month") : this.num(dt.month); - - case "MM": - // like 01 - return useDateTimeFormatter ? string({ - month: "2-digit" - }, "month") : this.num(dt.month, 2); - - case "MMM": - // like Jan - return month("short", false); - - case "MMMM": - // like January - return month("long", false); - - case "MMMMM": - // like J - return month("narrow", false); - // years - - case "y": - // like 2014 - return useDateTimeFormatter ? string({ - year: "numeric" - }, "year") : this.num(dt.year); - - case "yy": - // like 14 - return useDateTimeFormatter ? string({ - year: "2-digit" - }, "year") : this.num(dt.year.toString().slice(-2), 2); - - case "yyyy": - // like 0012 - return useDateTimeFormatter ? string({ - year: "numeric" - }, "year") : this.num(dt.year, 4); - - case "yyyyyy": - // like 000012 - return useDateTimeFormatter ? string({ - year: "numeric" - }, "year") : this.num(dt.year, 6); - // eras - - case "G": - // like AD - return era("short"); - - case "GG": - // like Anno Domini - return era("long"); - - case "GGGGG": - return era("narrow"); - - case "kk": - return this.num(dt.weekYear.toString().slice(-2), 2); - - case "kkkk": - return this.num(dt.weekYear, 4); - - case "W": - return this.num(dt.weekNumber); - - case "WW": - return this.num(dt.weekNumber, 2); - - case "o": - return this.num(dt.ordinal); - - case "ooo": - return this.num(dt.ordinal, 3); - - case "q": - // like 1 - return this.num(dt.quarter); - - case "qq": - // like 01 - return this.num(dt.quarter, 2); - - case "X": - return this.num(Math.floor(dt.ts / 1000)); - - case "x": - return this.num(dt.ts); - - default: - return maybeMacro(token); - } - }; - - return stringifyTokens(Formatter.parseFormat(fmt), tokenToString); - } - - formatDurationFromString(dur, fmt) { - const tokenToField = token => { - switch (token[0]) { - case "S": - return "millisecond"; - - case "s": - return "second"; - - case "m": - return "minute"; - - case "h": - return "hour"; - - case "d": - return "day"; - - case "M": - return "month"; - - case "y": - return "year"; - - default: - return null; - } - }, - tokenToString = lildur => token => { - const mapped = tokenToField(token); - - if (mapped) { - return this.num(lildur.get(mapped), token.length); - } else { - return token; - } - }, - tokens = Formatter.parseFormat(fmt), - realTokens = tokens.reduce((found, { - literal, - val - }) => literal ? found : found.concat(val), []), - collapsed = dur.shiftTo(...realTokens.map(tokenToField).filter(t => t)); - - return stringifyTokens(tokens, tokenToString(collapsed)); - } - -} - -class Invalid { - constructor(reason, explanation) { - this.reason = reason; - this.explanation = explanation; - } - - toMessage() { - if (this.explanation) { - return `${this.reason}: ${this.explanation}`; - } else { - return this.reason; - } - } - -} - -function _objectWithoutPropertiesLoose(source, excluded) { - if (source == null) return {}; - var target = {}; - var sourceKeys = Object.keys(source); - var key, i; - - for (i = 0; i < sourceKeys.length; i++) { - key = sourceKeys[i]; - if (excluded.indexOf(key) >= 0) continue; - target[key] = source[key]; - } - - return target; -} - -/* eslint no-unused-vars: "off" */ -/** - * @interface - */ - -class Zone { - /** - * The type of zone - * @abstract - * @type {string} - */ - get type() { - throw new ZoneIsAbstractError(); - } - /** - * The name of this zone. - * @abstract - * @type {string} - */ - - - get name() { - throw new ZoneIsAbstractError(); - } - /** - * Returns whether the offset is known to be fixed for the whole year. - * @abstract - * @type {boolean} - */ - - - get universal() { - throw new ZoneIsAbstractError(); - } - /** - * Returns the offset's common name (such as EST) at the specified timestamp - * @abstract - * @param {number} ts - Epoch milliseconds for which to get the name - * @param {Object} opts - Options to affect the format - * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'. - * @param {string} opts.locale - What locale to return the offset name in. - * @return {string} - */ - - - offsetName(ts, opts) { - throw new ZoneIsAbstractError(); - } - /** - * Returns the offset's value as a string - * @abstract - * @param {number} ts - Epoch milliseconds for which to get the offset - * @param {string} format - What style of offset to return. - * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively - * @return {string} - */ - - - formatOffset(ts, format) { - throw new ZoneIsAbstractError(); - } - /** - * Return the offset in minutes for this zone at the specified timestamp. - * @abstract - * @param {number} ts - Epoch milliseconds for which to compute the offset - * @return {number} - */ - - - offset(ts) { - throw new ZoneIsAbstractError(); - } - /** - * Return whether this Zone is equal to another zone - * @abstract - * @param {Zone} otherZone - the zone to compare - * @return {boolean} - */ - - - equals(otherZone) { - throw new ZoneIsAbstractError(); - } - /** - * Return whether this Zone is valid. - * @abstract - * @type {boolean} - */ - - - get isValid() { - throw new ZoneIsAbstractError(); - } - -} - -let singleton = null; -/** - * Represents the local zone for this JavaScript environment. - * @implements {Zone} - */ - -class LocalZone extends Zone { - /** - * Get a singleton instance of the local zone - * @return {LocalZone} - */ - static get instance() { - if (singleton === null) { - singleton = new LocalZone(); - } - - return singleton; - } - /** @override **/ - - - get type() { - return "local"; - } - /** @override **/ - - - get name() { - if (hasIntl()) { - return new Intl.DateTimeFormat().resolvedOptions().timeZone; - } else return "local"; - } - /** @override **/ - - - get universal() { - return false; - } - /** @override **/ - - - offsetName(ts, { - format, - locale - }) { - return parseZoneInfo(ts, format, locale); - } - /** @override **/ - - - formatOffset(ts, format) { - return formatOffset(this.offset(ts), format); - } - /** @override **/ - - - offset(ts) { - return -new Date(ts).getTimezoneOffset(); - } - /** @override **/ - - - equals(otherZone) { - return otherZone.type === "local"; - } - /** @override **/ - - - get isValid() { - return true; - } - -} - -const matchingRegex = RegExp(`^${ianaRegex.source}$`); -let dtfCache = {}; - -function makeDTF(zone) { - if (!dtfCache[zone]) { - dtfCache[zone] = new Intl.DateTimeFormat("en-US", { - hour12: false, - timeZone: zone, - year: "numeric", - month: "2-digit", - day: "2-digit", - hour: "2-digit", - minute: "2-digit", - second: "2-digit" - }); - } - - return dtfCache[zone]; -} - -const typeToPos = { - year: 0, - month: 1, - day: 2, - hour: 3, - minute: 4, - second: 5 -}; - -function hackyOffset(dtf, date) { - const formatted = dtf.format(date).replace(/\u200E/g, ""), - parsed = /(\d+)\/(\d+)\/(\d+),? (\d+):(\d+):(\d+)/.exec(formatted), - [, fMonth, fDay, fYear, fHour, fMinute, fSecond] = parsed; - return [fYear, fMonth, fDay, fHour, fMinute, fSecond]; -} - -function partsOffset(dtf, date) { - const formatted = dtf.formatToParts(date), - filled = []; - - for (let i = 0; i < formatted.length; i++) { - const { - type, - value - } = formatted[i], - pos = typeToPos[type]; - - if (!isUndefined(pos)) { - filled[pos] = parseInt(value, 10); - } - } - - return filled; -} - -let ianaZoneCache = {}; -/** - * A zone identified by an IANA identifier, like America/New_York - * @implements {Zone} - */ - -class IANAZone extends Zone { - /** - * @param {string} name - Zone name - * @return {IANAZone} - */ - static create(name) { - if (!ianaZoneCache[name]) { - ianaZoneCache[name] = new IANAZone(name); - } - - return ianaZoneCache[name]; - } - /** - * Reset local caches. Should only be necessary in testing scenarios. - * @return {void} - */ - - - static resetCache() { - ianaZoneCache = {}; - dtfCache = {}; - } - /** - * Returns whether the provided string is a valid specifier. This only checks the string's format, not that the specifier identifies a known zone; see isValidZone for that. - * @param {string} s - The string to check validity on - * @example IANAZone.isValidSpecifier("America/New_York") //=> true - * @example IANAZone.isValidSpecifier("Fantasia/Castle") //=> true - * @example IANAZone.isValidSpecifier("Sport~~blorp") //=> false - * @return {boolean} - */ - - - static isValidSpecifier(s) { - return !!(s && s.match(matchingRegex)); - } - /** - * Returns whether the provided string identifies a real zone - * @param {string} zone - The string to check - * @example IANAZone.isValidZone("America/New_York") //=> true - * @example IANAZone.isValidZone("Fantasia/Castle") //=> false - * @example IANAZone.isValidZone("Sport~~blorp") //=> false - * @return {boolean} - */ - - - static isValidZone(zone) { - try { - new Intl.DateTimeFormat("en-US", { - timeZone: zone - }).format(); - return true; - } catch (e) { - return false; - } - } // Etc/GMT+8 -> -480 - - /** @ignore */ - - - static parseGMTOffset(specifier) { - if (specifier) { - const match = specifier.match(/^Etc\/GMT([+-]\d{1,2})$/i); - - if (match) { - return -60 * parseInt(match[1]); - } - } - - return null; - } - - constructor(name) { - super(); - /** @private **/ - - this.zoneName = name; - /** @private **/ - - this.valid = IANAZone.isValidZone(name); - } - /** @override **/ - - - get type() { - return "iana"; - } - /** @override **/ - - - get name() { - return this.zoneName; - } - /** @override **/ - - - get universal() { - return false; - } - /** @override **/ - - - offsetName(ts, { - format, - locale - }) { - return parseZoneInfo(ts, format, locale, this.name); - } - /** @override **/ - - - formatOffset(ts, format) { - return formatOffset(this.offset(ts), format); - } - /** @override **/ - - - offset(ts) { - const date = new Date(ts), - dtf = makeDTF(this.name), - [year, month, day, hour, minute, second] = dtf.formatToParts ? partsOffset(dtf, date) : hackyOffset(dtf, date), - // work around https://bugs.chromium.org/p/chromium/issues/detail?id=1025564&can=2&q=%2224%3A00%22%20datetimeformat - adjustedHour = hour === 24 ? 0 : hour; - const asUTC = objToLocalTS({ - year, - month, - day, - hour: adjustedHour, - minute, - second, - millisecond: 0 - }); - let asTS = +date; - const over = asTS % 1000; - asTS -= over >= 0 ? over : 1000 + over; - return (asUTC - asTS) / (60 * 1000); - } - /** @override **/ - - - equals(otherZone) { - return otherZone.type === "iana" && otherZone.name === this.name; - } - /** @override **/ - - - get isValid() { - return this.valid; - } - -} - -let singleton$1 = null; -/** - * A zone with a fixed offset (meaning no DST) - * @implements {Zone} - */ - -class FixedOffsetZone extends Zone { - /** - * Get a singleton instance of UTC - * @return {FixedOffsetZone} - */ - static get utcInstance() { - if (singleton$1 === null) { - singleton$1 = new FixedOffsetZone(0); - } - - return singleton$1; - } - /** - * Get an instance with a specified offset - * @param {number} offset - The offset in minutes - * @return {FixedOffsetZone} - */ - - - static instance(offset) { - return offset === 0 ? FixedOffsetZone.utcInstance : new FixedOffsetZone(offset); - } - /** - * Get an instance of FixedOffsetZone from a UTC offset string, like "UTC+6" - * @param {string} s - The offset string to parse - * @example FixedOffsetZone.parseSpecifier("UTC+6") - * @example FixedOffsetZone.parseSpecifier("UTC+06") - * @example FixedOffsetZone.parseSpecifier("UTC-6:00") - * @return {FixedOffsetZone} - */ - - - static parseSpecifier(s) { - if (s) { - const r = s.match(/^utc(?:([+-]\d{1,2})(?::(\d{2}))?)?$/i); - - if (r) { - return new FixedOffsetZone(signedOffset(r[1], r[2])); - } - } - - return null; - } - - constructor(offset) { - super(); - /** @private **/ - - this.fixed = offset; - } - /** @override **/ - - - get type() { - return "fixed"; - } - /** @override **/ - - - get name() { - return this.fixed === 0 ? "UTC" : `UTC${formatOffset(this.fixed, "narrow")}`; - } - /** @override **/ - - - offsetName() { - return this.name; - } - /** @override **/ - - - formatOffset(ts, format) { - return formatOffset(this.fixed, format); - } - /** @override **/ - - - get universal() { - return true; - } - /** @override **/ - - - offset() { - return this.fixed; - } - /** @override **/ - - - equals(otherZone) { - return otherZone.type === "fixed" && otherZone.fixed === this.fixed; - } - /** @override **/ - - - get isValid() { - return true; - } - -} - -/** - * A zone that failed to parse. You should never need to instantiate this. - * @implements {Zone} - */ - -class InvalidZone extends Zone { - constructor(zoneName) { - super(); - /** @private */ - - this.zoneName = zoneName; - } - /** @override **/ - - - get type() { - return "invalid"; - } - /** @override **/ - - - get name() { - return this.zoneName; - } - /** @override **/ - - - get universal() { - return false; - } - /** @override **/ - - - offsetName() { - return null; - } - /** @override **/ - - - formatOffset() { - return ""; - } - /** @override **/ - - - offset() { - return NaN; - } - /** @override **/ - - - equals() { - return false; - } - /** @override **/ - - - get isValid() { - return false; - } - -} - -/** - * @private - */ -function normalizeZone(input, defaultZone) { - let offset; - - if (isUndefined(input) || input === null) { - return defaultZone; - } else if (input instanceof Zone) { - return input; - } else if (isString(input)) { - const lowered = input.toLowerCase(); - if (lowered === "local") return defaultZone;else if (lowered === "utc" || lowered === "gmt") return FixedOffsetZone.utcInstance;else if ((offset = IANAZone.parseGMTOffset(input)) != null) { - // handle Etc/GMT-4, which V8 chokes on - return FixedOffsetZone.instance(offset); - } else if (IANAZone.isValidSpecifier(lowered)) return IANAZone.create(input);else return FixedOffsetZone.parseSpecifier(lowered) || new InvalidZone(input); - } else if (isNumber$1(input)) { - return FixedOffsetZone.instance(input); - } else if (typeof input === "object" && input.offset && typeof input.offset === "number") { - // This is dumb, but the instanceof check above doesn't seem to really work - // so we're duck checking it - return input; - } else { - return new InvalidZone(input); - } -} - -let now = () => Date.now(), - defaultZone = null, - // not setting this directly to LocalZone.instance bc loading order issues -defaultLocale = null, - defaultNumberingSystem = null, - defaultOutputCalendar = null, - throwOnInvalid = false; -/** - * Settings contains static getters and setters that control Luxon's overall behavior. Luxon is a simple library with few options, but the ones it does have live here. - */ - - -class Settings { - /** - * Get the callback for returning the current timestamp. - * @type {function} - */ - static get now() { - return now; - } - /** - * Set the callback for returning the current timestamp. - * The function should return a number, which will be interpreted as an Epoch millisecond count - * @type {function} - * @example Settings.now = () => Date.now() + 3000 // pretend it is 3 seconds in the future - * @example Settings.now = () => 0 // always pretend it's Jan 1, 1970 at midnight in UTC time - */ - - - static set now(n) { - now = n; - } - /** - * Get the default time zone to create DateTimes in. - * @type {string} - */ - - - static get defaultZoneName() { - return Settings.defaultZone.name; - } - /** - * Set the default time zone to create DateTimes in. Does not affect existing instances. - * @type {string} - */ - - - static set defaultZoneName(z) { - if (!z) { - defaultZone = null; - } else { - defaultZone = normalizeZone(z); - } - } - /** - * Get the default time zone object to create DateTimes in. Does not affect existing instances. - * @type {Zone} - */ - - - static get defaultZone() { - return defaultZone || LocalZone.instance; - } - /** - * Get the default locale to create DateTimes with. Does not affect existing instances. - * @type {string} - */ - - - static get defaultLocale() { - return defaultLocale; - } - /** - * Set the default locale to create DateTimes with. Does not affect existing instances. - * @type {string} - */ - - - static set defaultLocale(locale) { - defaultLocale = locale; - } - /** - * Get the default numbering system to create DateTimes with. Does not affect existing instances. - * @type {string} - */ - - - static get defaultNumberingSystem() { - return defaultNumberingSystem; - } - /** - * Set the default numbering system to create DateTimes with. Does not affect existing instances. - * @type {string} - */ - - - static set defaultNumberingSystem(numberingSystem) { - defaultNumberingSystem = numberingSystem; - } - /** - * Get the default output calendar to create DateTimes with. Does not affect existing instances. - * @type {string} - */ - - - static get defaultOutputCalendar() { - return defaultOutputCalendar; - } - /** - * Set the default output calendar to create DateTimes with. Does not affect existing instances. - * @type {string} - */ - - - static set defaultOutputCalendar(outputCalendar) { - defaultOutputCalendar = outputCalendar; - } - /** - * Get whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals - * @type {boolean} - */ - - - static get throwOnInvalid() { - return throwOnInvalid; - } - /** - * Set whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals - * @type {boolean} - */ - - - static set throwOnInvalid(t) { - throwOnInvalid = t; - } - /** - * Reset Luxon's global caches. Should only be necessary in testing scenarios. - * @return {void} - */ - - - static resetCaches() { - Locale.resetCache(); - IANAZone.resetCache(); - } - -} - -let intlDTCache = {}; - -function getCachedDTF(locString, opts = {}) { - const key = JSON.stringify([locString, opts]); - let dtf = intlDTCache[key]; - - if (!dtf) { - dtf = new Intl.DateTimeFormat(locString, opts); - intlDTCache[key] = dtf; - } - - return dtf; -} - -let intlNumCache = {}; - -function getCachedINF(locString, opts = {}) { - const key = JSON.stringify([locString, opts]); - let inf = intlNumCache[key]; - - if (!inf) { - inf = new Intl.NumberFormat(locString, opts); - intlNumCache[key] = inf; - } - - return inf; -} - -let intlRelCache = {}; - -function getCachedRTF(locString, opts = {}) { - const cacheKeyOpts = _objectWithoutPropertiesLoose(opts, ["base"]); // exclude `base` from the options - - - const key = JSON.stringify([locString, cacheKeyOpts]); - let inf = intlRelCache[key]; - - if (!inf) { - inf = new Intl.RelativeTimeFormat(locString, opts); - intlRelCache[key] = inf; - } - - return inf; -} - -let sysLocaleCache = null; - -function systemLocale() { - if (sysLocaleCache) { - return sysLocaleCache; - } else if (hasIntl()) { - const computedSys = new Intl.DateTimeFormat().resolvedOptions().locale; // node sometimes defaults to "und". Override that because that is dumb - - sysLocaleCache = !computedSys || computedSys === "und" ? "en-US" : computedSys; - return sysLocaleCache; - } else { - sysLocaleCache = "en-US"; - return sysLocaleCache; - } -} - -function parseLocaleString(localeStr) { - // I really want to avoid writing a BCP 47 parser - // see, e.g. https://github.com/wooorm/bcp-47 - // Instead, we'll do this: - // a) if the string has no -u extensions, just leave it alone - // b) if it does, use Intl to resolve everything - // c) if Intl fails, try again without the -u - const uIndex = localeStr.indexOf("-u-"); - - if (uIndex === -1) { - return [localeStr]; - } else { - let options; - const smaller = localeStr.substring(0, uIndex); - - try { - options = getCachedDTF(localeStr).resolvedOptions(); - } catch (e) { - options = getCachedDTF(smaller).resolvedOptions(); - } - - const { - numberingSystem, - calendar - } = options; // return the smaller one so that we can append the calendar and numbering overrides to it - - return [smaller, numberingSystem, calendar]; - } -} - -function intlConfigString(localeStr, numberingSystem, outputCalendar) { - if (hasIntl()) { - if (outputCalendar || numberingSystem) { - localeStr += "-u"; - - if (outputCalendar) { - localeStr += `-ca-${outputCalendar}`; - } - - if (numberingSystem) { - localeStr += `-nu-${numberingSystem}`; - } - - return localeStr; - } else { - return localeStr; - } - } else { - return []; - } -} - -function mapMonths(f) { - const ms = []; - - for (let i = 1; i <= 12; i++) { - const dt = DateTime$1.utc(2016, i, 1); - ms.push(f(dt)); - } - - return ms; -} - -function mapWeekdays(f) { - const ms = []; - - for (let i = 1; i <= 7; i++) { - const dt = DateTime$1.utc(2016, 11, 13 + i); - ms.push(f(dt)); - } - - return ms; -} - -function listStuff(loc, length, defaultOK, englishFn, intlFn) { - const mode = loc.listingMode(defaultOK); - - if (mode === "error") { - return null; - } else if (mode === "en") { - return englishFn(length); - } else { - return intlFn(length); - } -} - -function supportsFastNumbers(loc) { - if (loc.numberingSystem && loc.numberingSystem !== "latn") { - return false; - } else { - return loc.numberingSystem === "latn" || !loc.locale || loc.locale.startsWith("en") || hasIntl() && new Intl.DateTimeFormat(loc.intl).resolvedOptions().numberingSystem === "latn"; - } -} -/** - * @private - */ - - -class PolyNumberFormatter { - constructor(intl, forceSimple, opts) { - this.padTo = opts.padTo || 0; - this.floor = opts.floor || false; - - if (!forceSimple && hasIntl()) { - const intlOpts = { - useGrouping: false - }; - if (opts.padTo > 0) intlOpts.minimumIntegerDigits = opts.padTo; - this.inf = getCachedINF(intl, intlOpts); - } - } - - format(i) { - if (this.inf) { - const fixed = this.floor ? Math.floor(i) : i; - return this.inf.format(fixed); - } else { - // to match the browser's numberformatter defaults - const fixed = this.floor ? Math.floor(i) : roundTo(i, 3); - return padStart$1(fixed, this.padTo); - } - } - -} -/** - * @private - */ - - -class PolyDateFormatter { - constructor(dt, intl, opts) { - this.opts = opts; - this.hasIntl = hasIntl(); - let z; - - if (dt.zone.universal && this.hasIntl) { - // UTC-8 or Etc/UTC-8 are not part of tzdata, only Etc/GMT+8 and the like. - // That is why fixed-offset TZ is set to that unless it is: - // 1. Outside of the supported range Etc/GMT-14 to Etc/GMT+12. - // 2. Not a whole hour, e.g. UTC+4:30. - const gmtOffset = -1 * (dt.offset / 60); - - if (gmtOffset >= -14 && gmtOffset <= 12 && gmtOffset % 1 === 0) { - z = gmtOffset >= 0 ? `Etc/GMT+${gmtOffset}` : `Etc/GMT${gmtOffset}`; - this.dt = dt; - } else { - // Not all fixed-offset zones like Etc/+4:30 are present in tzdata. - // So we have to make do. Two cases: - // 1. The format options tell us to show the zone. We can't do that, so the best - // we can do is format the date in UTC. - // 2. The format options don't tell us to show the zone. Then we can adjust them - // the time and tell the formatter to show it to us in UTC, so that the time is right - // and the bad zone doesn't show up. - z = "UTC"; - - if (opts.timeZoneName) { - this.dt = dt; - } else { - this.dt = dt.offset === 0 ? dt : DateTime$1.fromMillis(dt.ts + dt.offset * 60 * 1000); - } - } - } else if (dt.zone.type === "local") { - this.dt = dt; - } else { - this.dt = dt; - z = dt.zone.name; - } - - if (this.hasIntl) { - const intlOpts = Object.assign({}, this.opts); - - if (z) { - intlOpts.timeZone = z; - } - - this.dtf = getCachedDTF(intl, intlOpts); - } - } - - format() { - if (this.hasIntl) { - return this.dtf.format(this.dt.toJSDate()); - } else { - const tokenFormat = formatString(this.opts), - loc = Locale.create("en-US"); - return Formatter.create(loc).formatDateTimeFromString(this.dt, tokenFormat); - } - } - - formatToParts() { - if (this.hasIntl && hasFormatToParts()) { - return this.dtf.formatToParts(this.dt.toJSDate()); - } else { - // This is kind of a cop out. We actually could do this for English. However, we couldn't do it for intl strings - // and IMO it's too weird to have an uncanny valley like that - return []; - } - } - - resolvedOptions() { - if (this.hasIntl) { - return this.dtf.resolvedOptions(); - } else { - return { - locale: "en-US", - numberingSystem: "latn", - outputCalendar: "gregory" - }; - } - } - -} -/** - * @private - */ - - -class PolyRelFormatter { - constructor(intl, isEnglish, opts) { - this.opts = Object.assign({ - style: "long" - }, opts); - - if (!isEnglish && hasRelative()) { - this.rtf = getCachedRTF(intl, opts); - } - } - - format(count, unit) { - if (this.rtf) { - return this.rtf.format(count, unit); - } else { - return formatRelativeTime(unit, count, this.opts.numeric, this.opts.style !== "long"); - } - } - - formatToParts(count, unit) { - if (this.rtf) { - return this.rtf.formatToParts(count, unit); - } else { - return []; - } - } - -} -/** - * @private - */ - - -class Locale { - static fromOpts(opts) { - return Locale.create(opts.locale, opts.numberingSystem, opts.outputCalendar, opts.defaultToEN); - } - - static create(locale, numberingSystem, outputCalendar, defaultToEN = false) { - const specifiedLocale = locale || Settings.defaultLocale, - // the system locale is useful for human readable strings but annoying for parsing/formatting known formats - localeR = specifiedLocale || (defaultToEN ? "en-US" : systemLocale()), - numberingSystemR = numberingSystem || Settings.defaultNumberingSystem, - outputCalendarR = outputCalendar || Settings.defaultOutputCalendar; - return new Locale(localeR, numberingSystemR, outputCalendarR, specifiedLocale); - } - - static resetCache() { - sysLocaleCache = null; - intlDTCache = {}; - intlNumCache = {}; - intlRelCache = {}; - } - - static fromObject({ - locale, - numberingSystem, - outputCalendar - } = {}) { - return Locale.create(locale, numberingSystem, outputCalendar); - } - - constructor(locale, numbering, outputCalendar, specifiedLocale) { - const [parsedLocale, parsedNumberingSystem, parsedOutputCalendar] = parseLocaleString(locale); - this.locale = parsedLocale; - this.numberingSystem = numbering || parsedNumberingSystem || null; - this.outputCalendar = outputCalendar || parsedOutputCalendar || null; - this.intl = intlConfigString(this.locale, this.numberingSystem, this.outputCalendar); - this.weekdaysCache = { - format: {}, - standalone: {} - }; - this.monthsCache = { - format: {}, - standalone: {} - }; - this.meridiemCache = null; - this.eraCache = {}; - this.specifiedLocale = specifiedLocale; - this.fastNumbersCached = null; - } - - get fastNumbers() { - if (this.fastNumbersCached == null) { - this.fastNumbersCached = supportsFastNumbers(this); - } - - return this.fastNumbersCached; - } - - listingMode(defaultOK = true) { - const intl = hasIntl(), - hasFTP = intl && hasFormatToParts(), - isActuallyEn = this.isEnglish(), - hasNoWeirdness = (this.numberingSystem === null || this.numberingSystem === "latn") && (this.outputCalendar === null || this.outputCalendar === "gregory"); - - if (!hasFTP && !(isActuallyEn && hasNoWeirdness) && !defaultOK) { - return "error"; - } else if (!hasFTP || isActuallyEn && hasNoWeirdness) { - return "en"; - } else { - return "intl"; - } - } - - clone(alts) { - if (!alts || Object.getOwnPropertyNames(alts).length === 0) { - return this; - } else { - return Locale.create(alts.locale || this.specifiedLocale, alts.numberingSystem || this.numberingSystem, alts.outputCalendar || this.outputCalendar, alts.defaultToEN || false); - } - } - - redefaultToEN(alts = {}) { - return this.clone(Object.assign({}, alts, { - defaultToEN: true - })); - } - - redefaultToSystem(alts = {}) { - return this.clone(Object.assign({}, alts, { - defaultToEN: false - })); - } - - months(length, format = false, defaultOK = true) { - return listStuff(this, length, defaultOK, months, () => { - const intl = format ? { - month: length, - day: "numeric" - } : { - month: length - }, - formatStr = format ? "format" : "standalone"; - - if (!this.monthsCache[formatStr][length]) { - this.monthsCache[formatStr][length] = mapMonths(dt => this.extract(dt, intl, "month")); - } - - return this.monthsCache[formatStr][length]; - }); - } - - weekdays(length, format = false, defaultOK = true) { - return listStuff(this, length, defaultOK, weekdays$1, () => { - const intl = format ? { - weekday: length, - year: "numeric", - month: "long", - day: "numeric" - } : { - weekday: length - }, - formatStr = format ? "format" : "standalone"; - - if (!this.weekdaysCache[formatStr][length]) { - this.weekdaysCache[formatStr][length] = mapWeekdays(dt => this.extract(dt, intl, "weekday")); - } - - return this.weekdaysCache[formatStr][length]; - }); - } - - meridiems(defaultOK = true) { - return listStuff(this, undefined, defaultOK, () => meridiems, () => { - // In theory there could be aribitrary day periods. We're gonna assume there are exactly two - // for AM and PM. This is probably wrong, but it's makes parsing way easier. - if (!this.meridiemCache) { - const intl = { - hour: "numeric", - hour12: true - }; - this.meridiemCache = [DateTime$1.utc(2016, 11, 13, 9), DateTime$1.utc(2016, 11, 13, 19)].map(dt => this.extract(dt, intl, "dayperiod")); - } - - return this.meridiemCache; - }); - } - - eras(length, defaultOK = true) { - return listStuff(this, length, defaultOK, eras, () => { - const intl = { - era: length - }; // This is problematic. Different calendars are going to define eras totally differently. What I need is the minimum set of dates - // to definitely enumerate them. - - if (!this.eraCache[length]) { - this.eraCache[length] = [DateTime$1.utc(-40, 1, 1), DateTime$1.utc(2017, 1, 1)].map(dt => this.extract(dt, intl, "era")); - } - - return this.eraCache[length]; - }); - } - - extract(dt, intlOpts, field) { - const df = this.dtFormatter(dt, intlOpts), - results = df.formatToParts(), - matching = results.find(m => m.type.toLowerCase() === field); - return matching ? matching.value : null; - } - - numberFormatter(opts = {}) { - // this forcesimple option is never used (the only caller short-circuits on it, but it seems safer to leave) - // (in contrast, the rest of the condition is used heavily) - return new PolyNumberFormatter(this.intl, opts.forceSimple || this.fastNumbers, opts); - } - - dtFormatter(dt, intlOpts = {}) { - return new PolyDateFormatter(dt, this.intl, intlOpts); - } - - relFormatter(opts = {}) { - return new PolyRelFormatter(this.intl, this.isEnglish(), opts); - } - - isEnglish() { - return this.locale === "en" || this.locale.toLowerCase() === "en-us" || hasIntl() && new Intl.DateTimeFormat(this.intl).resolvedOptions().locale.startsWith("en-us"); - } - - equals(other) { - return this.locale === other.locale && this.numberingSystem === other.numberingSystem && this.outputCalendar === other.outputCalendar; - } - -} - -/* - * This file handles parsing for well-specified formats. Here's how it works: - * Two things go into parsing: a regex to match with and an extractor to take apart the groups in the match. - * An extractor is just a function that takes a regex match array and returns a { year: ..., month: ... } object - * parse() does the work of executing the regex and applying the extractor. It takes multiple regex/extractor pairs to try in sequence. - * Extractors can take a "cursor" representing the offset in the match to look at. This makes it easy to combine extractors. - * combineExtractors() does the work of combining them, keeping track of the cursor through multiple extractions. - * Some extractions are super dumb and simpleParse and fromStrings help DRY them. - */ - -function combineRegexes(...regexes) { - const full = regexes.reduce((f, r) => f + r.source, ""); - return RegExp(`^${full}$`); -} - -function combineExtractors(...extractors) { - return m => extractors.reduce(([mergedVals, mergedZone, cursor], ex) => { - const [val, zone, next] = ex(m, cursor); - return [Object.assign(mergedVals, val), mergedZone || zone, next]; - }, [{}, null, 1]).slice(0, 2); -} - -function parse(s, ...patterns) { - if (s == null) { - return [null, null]; - } - - for (const [regex, extractor] of patterns) { - const m = regex.exec(s); - - if (m) { - return extractor(m); - } - } - - return [null, null]; -} - -function simpleParse(...keys) { - return (match, cursor) => { - const ret = {}; - let i; - - for (i = 0; i < keys.length; i++) { - ret[keys[i]] = parseInteger(match[cursor + i]); - } - - return [ret, null, cursor + i]; - }; -} // ISO and SQL parsing - - -const offsetRegex = /(?:(Z)|([+-]\d\d)(?::?(\d\d))?)/, - isoTimeBaseRegex = /(\d\d)(?::?(\d\d)(?::?(\d\d)(?:[.,](\d{1,30}))?)?)?/, - isoTimeRegex = RegExp(`${isoTimeBaseRegex.source}${offsetRegex.source}?`), - isoTimeExtensionRegex = RegExp(`(?:T${isoTimeRegex.source})?`), - isoYmdRegex = /([+-]\d{6}|\d{4})(?:-?(\d\d)(?:-?(\d\d))?)?/, - isoWeekRegex = /(\d{4})-?W(\d\d)(?:-?(\d))?/, - isoOrdinalRegex = /(\d{4})-?(\d{3})/, - extractISOWeekData = simpleParse("weekYear", "weekNumber", "weekDay"), - extractISOOrdinalData = simpleParse("year", "ordinal"), - sqlYmdRegex = /(\d{4})-(\d\d)-(\d\d)/, - // dumbed-down version of the ISO one -sqlTimeRegex = RegExp(`${isoTimeBaseRegex.source} ?(?:${offsetRegex.source}|(${ianaRegex.source}))?`), - sqlTimeExtensionRegex = RegExp(`(?: ${sqlTimeRegex.source})?`); - -function int(match, pos, fallback) { - const m = match[pos]; - return isUndefined(m) ? fallback : parseInteger(m); -} - -function extractISOYmd(match, cursor) { - const item = { - year: int(match, cursor), - month: int(match, cursor + 1, 1), - day: int(match, cursor + 2, 1) - }; - return [item, null, cursor + 3]; -} - -function extractISOTime(match, cursor) { - const item = { - hours: int(match, cursor, 0), - minutes: int(match, cursor + 1, 0), - seconds: int(match, cursor + 2, 0), - milliseconds: parseMillis(match[cursor + 3]) - }; - return [item, null, cursor + 4]; -} - -function extractISOOffset(match, cursor) { - const local = !match[cursor] && !match[cursor + 1], - fullOffset = signedOffset(match[cursor + 1], match[cursor + 2]), - zone = local ? null : FixedOffsetZone.instance(fullOffset); - return [{}, zone, cursor + 3]; -} - -function extractIANAZone(match, cursor) { - const zone = match[cursor] ? IANAZone.create(match[cursor]) : null; - return [{}, zone, cursor + 1]; -} // ISO time parsing - - -const isoTimeOnly = RegExp(`^T?${isoTimeBaseRegex.source}$`); // ISO duration parsing - -const isoDuration = /^-?P(?:(?:(-?\d{1,9})Y)?(?:(-?\d{1,9})M)?(?:(-?\d{1,9})W)?(?:(-?\d{1,9})D)?(?:T(?:(-?\d{1,9})H)?(?:(-?\d{1,9})M)?(?:(-?\d{1,20})(?:[.,](-?\d{1,9}))?S)?)?)$/; - -function extractISODuration(match) { - const [s, yearStr, monthStr, weekStr, dayStr, hourStr, minuteStr, secondStr, millisecondsStr] = match; - const hasNegativePrefix = s[0] === "-"; - - const maybeNegate = num => num && hasNegativePrefix ? -num : num; - - return [{ - years: maybeNegate(parseInteger(yearStr)), - months: maybeNegate(parseInteger(monthStr)), - weeks: maybeNegate(parseInteger(weekStr)), - days: maybeNegate(parseInteger(dayStr)), - hours: maybeNegate(parseInteger(hourStr)), - minutes: maybeNegate(parseInteger(minuteStr)), - seconds: maybeNegate(parseInteger(secondStr)), - milliseconds: maybeNegate(parseMillis(millisecondsStr)) - }]; -} // These are a little braindead. EDT *should* tell us that we're in, say, America/New_York -// and not just that we're in -240 *right now*. But since I don't think these are used that often -// I'm just going to ignore that - - -const obsOffsets = { - GMT: 0, - EDT: -4 * 60, - EST: -5 * 60, - CDT: -5 * 60, - CST: -6 * 60, - MDT: -6 * 60, - MST: -7 * 60, - PDT: -7 * 60, - PST: -8 * 60 -}; - -function fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) { - const result = { - year: yearStr.length === 2 ? untruncateYear(parseInteger(yearStr)) : parseInteger(yearStr), - month: monthsShort.indexOf(monthStr) + 1, - day: parseInteger(dayStr), - hour: parseInteger(hourStr), - minute: parseInteger(minuteStr) - }; - if (secondStr) result.second = parseInteger(secondStr); - - if (weekdayStr) { - result.weekday = weekdayStr.length > 3 ? weekdaysLong.indexOf(weekdayStr) + 1 : weekdaysShort.indexOf(weekdayStr) + 1; - } - - return result; -} // RFC 2822/5322 - - -const rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\d\d)(\d\d)))$/; - -function extractRFC2822(match) { - const [, weekdayStr, dayStr, monthStr, yearStr, hourStr, minuteStr, secondStr, obsOffset, milOffset, offHourStr, offMinuteStr] = match, - result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); - let offset; - - if (obsOffset) { - offset = obsOffsets[obsOffset]; - } else if (milOffset) { - offset = 0; - } else { - offset = signedOffset(offHourStr, offMinuteStr); - } - - return [result, new FixedOffsetZone(offset)]; -} - -function preprocessRFC2822(s) { - // Remove comments and folding whitespace and replace multiple-spaces with a single space - return s.replace(/\([^)]*\)|[\n\t]/g, " ").replace(/(\s\s+)/g, " ").trim(); -} // http date - - -const rfc1123 = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\d\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{4}) (\d\d):(\d\d):(\d\d) GMT$/, - rfc850 = /^(Monday|Tuesday|Wedsday|Thursday|Friday|Saturday|Sunday), (\d\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d\d) (\d\d):(\d\d):(\d\d) GMT$/, - ascii = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \d|\d\d) (\d\d):(\d\d):(\d\d) (\d{4})$/; - -function extractRFC1123Or850(match) { - const [, weekdayStr, dayStr, monthStr, yearStr, hourStr, minuteStr, secondStr] = match, - result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); - return [result, FixedOffsetZone.utcInstance]; -} - -function extractASCII(match) { - const [, weekdayStr, monthStr, dayStr, hourStr, minuteStr, secondStr, yearStr] = match, - result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); - return [result, FixedOffsetZone.utcInstance]; -} - -const isoYmdWithTimeExtensionRegex = combineRegexes(isoYmdRegex, isoTimeExtensionRegex); -const isoWeekWithTimeExtensionRegex = combineRegexes(isoWeekRegex, isoTimeExtensionRegex); -const isoOrdinalWithTimeExtensionRegex = combineRegexes(isoOrdinalRegex, isoTimeExtensionRegex); -const isoTimeCombinedRegex = combineRegexes(isoTimeRegex); -const extractISOYmdTimeAndOffset = combineExtractors(extractISOYmd, extractISOTime, extractISOOffset); -const extractISOWeekTimeAndOffset = combineExtractors(extractISOWeekData, extractISOTime, extractISOOffset); -const extractISOOrdinalDataAndTime = combineExtractors(extractISOOrdinalData, extractISOTime); -const extractISOTimeAndOffset = combineExtractors(extractISOTime, extractISOOffset); -/** - * @private - */ - -function parseISODate(s) { - return parse(s, [isoYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset], [isoWeekWithTimeExtensionRegex, extractISOWeekTimeAndOffset], [isoOrdinalWithTimeExtensionRegex, extractISOOrdinalDataAndTime], [isoTimeCombinedRegex, extractISOTimeAndOffset]); -} -function parseRFC2822Date(s) { - return parse(preprocessRFC2822(s), [rfc2822, extractRFC2822]); -} -function parseHTTPDate(s) { - return parse(s, [rfc1123, extractRFC1123Or850], [rfc850, extractRFC1123Or850], [ascii, extractASCII]); -} -function parseISODuration(s) { - return parse(s, [isoDuration, extractISODuration]); -} -const extractISOTimeOnly = combineExtractors(extractISOTime); -function parseISOTimeOnly(s) { - return parse(s, [isoTimeOnly, extractISOTimeOnly]); -} -const sqlYmdWithTimeExtensionRegex = combineRegexes(sqlYmdRegex, sqlTimeExtensionRegex); -const sqlTimeCombinedRegex = combineRegexes(sqlTimeRegex); -const extractISOYmdTimeOffsetAndIANAZone = combineExtractors(extractISOYmd, extractISOTime, extractISOOffset, extractIANAZone); -const extractISOTimeOffsetAndIANAZone = combineExtractors(extractISOTime, extractISOOffset, extractIANAZone); -function parseSQL(s) { - return parse(s, [sqlYmdWithTimeExtensionRegex, extractISOYmdTimeOffsetAndIANAZone], [sqlTimeCombinedRegex, extractISOTimeOffsetAndIANAZone]); -} - -const INVALID = "Invalid Duration"; // unit conversion constants - -const lowOrderMatrix = { - weeks: { - days: 7, - hours: 7 * 24, - minutes: 7 * 24 * 60, - seconds: 7 * 24 * 60 * 60, - milliseconds: 7 * 24 * 60 * 60 * 1000 - }, - days: { - hours: 24, - minutes: 24 * 60, - seconds: 24 * 60 * 60, - milliseconds: 24 * 60 * 60 * 1000 - }, - hours: { - minutes: 60, - seconds: 60 * 60, - milliseconds: 60 * 60 * 1000 - }, - minutes: { - seconds: 60, - milliseconds: 60 * 1000 - }, - seconds: { - milliseconds: 1000 - } -}, - casualMatrix = Object.assign({ - years: { - quarters: 4, - months: 12, - weeks: 52, - days: 365, - hours: 365 * 24, - minutes: 365 * 24 * 60, - seconds: 365 * 24 * 60 * 60, - milliseconds: 365 * 24 * 60 * 60 * 1000 - }, - quarters: { - months: 3, - weeks: 13, - days: 91, - hours: 91 * 24, - minutes: 91 * 24 * 60, - seconds: 91 * 24 * 60 * 60, - milliseconds: 91 * 24 * 60 * 60 * 1000 - }, - months: { - weeks: 4, - days: 30, - hours: 30 * 24, - minutes: 30 * 24 * 60, - seconds: 30 * 24 * 60 * 60, - milliseconds: 30 * 24 * 60 * 60 * 1000 - } -}, lowOrderMatrix), - daysInYearAccurate = 146097.0 / 400, - daysInMonthAccurate = 146097.0 / 4800, - accurateMatrix = Object.assign({ - years: { - quarters: 4, - months: 12, - weeks: daysInYearAccurate / 7, - days: daysInYearAccurate, - hours: daysInYearAccurate * 24, - minutes: daysInYearAccurate * 24 * 60, - seconds: daysInYearAccurate * 24 * 60 * 60, - milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1000 - }, - quarters: { - months: 3, - weeks: daysInYearAccurate / 28, - days: daysInYearAccurate / 4, - hours: daysInYearAccurate * 24 / 4, - minutes: daysInYearAccurate * 24 * 60 / 4, - seconds: daysInYearAccurate * 24 * 60 * 60 / 4, - milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1000 / 4 - }, - months: { - weeks: daysInMonthAccurate / 7, - days: daysInMonthAccurate, - hours: daysInMonthAccurate * 24, - minutes: daysInMonthAccurate * 24 * 60, - seconds: daysInMonthAccurate * 24 * 60 * 60, - milliseconds: daysInMonthAccurate * 24 * 60 * 60 * 1000 - } -}, lowOrderMatrix); // units ordered by size - -const orderedUnits = ["years", "quarters", "months", "weeks", "days", "hours", "minutes", "seconds", "milliseconds"]; -const reverseUnits = orderedUnits.slice(0).reverse(); // clone really means "create another instance just like this one, but with these changes" - -function clone(dur, alts, clear = false) { - // deep merge for vals - const conf = { - values: clear ? alts.values : Object.assign({}, dur.values, alts.values || {}), - loc: dur.loc.clone(alts.loc), - conversionAccuracy: alts.conversionAccuracy || dur.conversionAccuracy - }; - return new Duration(conf); -} - -function antiTrunc(n) { - return n < 0 ? Math.floor(n) : Math.ceil(n); -} // NB: mutates parameters - - -function convert(matrix, fromMap, fromUnit, toMap, toUnit) { - const conv = matrix[toUnit][fromUnit], - raw = fromMap[fromUnit] / conv, - sameSign = Math.sign(raw) === Math.sign(toMap[toUnit]), - // ok, so this is wild, but see the matrix in the tests - added = !sameSign && toMap[toUnit] !== 0 && Math.abs(raw) <= 1 ? antiTrunc(raw) : Math.trunc(raw); - toMap[toUnit] += added; - fromMap[fromUnit] -= added * conv; -} // NB: mutates parameters - - -function normalizeValues(matrix, vals) { - reverseUnits.reduce((previous, current) => { - if (!isUndefined(vals[current])) { - if (previous) { - convert(matrix, vals, previous, vals, current); - } - - return current; - } else { - return previous; - } - }, null); -} -/** - * A Duration object represents a period of time, like "2 months" or "1 day, 1 hour". Conceptually, it's just a map of units to their quantities, accompanied by some additional configuration and methods for creating, parsing, interrogating, transforming, and formatting them. They can be used on their own or in conjunction with other Luxon types; for example, you can use {@link DateTime.plus} to add a Duration object to a DateTime, producing another DateTime. - * - * Here is a brief overview of commonly used methods and getters in Duration: - * - * * **Creation** To create a Duration, use {@link Duration.fromMillis}, {@link Duration.fromObject}, or {@link Duration.fromISO}. - * * **Unit values** See the {@link Duration.years}, {@link Duration.months}, {@link Duration.weeks}, {@link Duration.days}, {@link Duration.hours}, {@link Duration.minutes}, {@link Duration.seconds}, {@link Duration.milliseconds} accessors. - * * **Configuration** See {@link Duration.locale} and {@link Duration.numberingSystem} accessors. - * * **Transformation** To create new Durations out of old ones use {@link Duration.plus}, {@link Duration.minus}, {@link Duration.normalize}, {@link Duration.set}, {@link Duration.reconfigure}, {@link Duration.shiftTo}, and {@link Duration.negate}. - * * **Output** To convert the Duration into other representations, see {@link Duration.as}, {@link Duration.toISO}, {@link Duration.toFormat}, and {@link Duration.toJSON} - * - * There's are more methods documented below. In addition, for more information on subtler topics like internationalization and validity, see the external documentation. - */ - - -class Duration { - /** - * @private - */ - constructor(config) { - const accurate = config.conversionAccuracy === "longterm" || false; - /** - * @access private - */ - - this.values = config.values; - /** - * @access private - */ - - this.loc = config.loc || Locale.create(); - /** - * @access private - */ - - this.conversionAccuracy = accurate ? "longterm" : "casual"; - /** - * @access private - */ - - this.invalid = config.invalid || null; - /** - * @access private - */ - - this.matrix = accurate ? accurateMatrix : casualMatrix; - /** - * @access private - */ - - this.isLuxonDuration = true; - } - /** - * Create Duration from a number of milliseconds. - * @param {number} count of milliseconds - * @param {Object} opts - options for parsing - * @param {string} [opts.locale='en-US'] - the locale to use - * @param {string} opts.numberingSystem - the numbering system to use - * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use - * @return {Duration} - */ - - - static fromMillis(count, opts) { - return Duration.fromObject(Object.assign({ - milliseconds: count - }, opts)); - } - /** - * Create a Duration from a JavaScript object with keys like 'years' and 'hours. - * If this object is empty then a zero milliseconds duration is returned. - * @param {Object} obj - the object to create the DateTime from - * @param {number} obj.years - * @param {number} obj.quarters - * @param {number} obj.months - * @param {number} obj.weeks - * @param {number} obj.days - * @param {number} obj.hours - * @param {number} obj.minutes - * @param {number} obj.seconds - * @param {number} obj.milliseconds - * @param {string} [obj.locale='en-US'] - the locale to use - * @param {string} obj.numberingSystem - the numbering system to use - * @param {string} [obj.conversionAccuracy='casual'] - the conversion system to use - * @return {Duration} - */ - - - static fromObject(obj) { - if (obj == null || typeof obj !== "object") { - throw new InvalidArgumentError(`Duration.fromObject: argument expected to be an object, got ${obj === null ? "null" : typeof obj}`); - } - - return new Duration({ - values: normalizeObject(obj, Duration.normalizeUnit, ["locale", "numberingSystem", "conversionAccuracy", "zone" // a bit of debt; it's super inconvenient internally not to be able to blindly pass this - ]), - loc: Locale.fromObject(obj), - conversionAccuracy: obj.conversionAccuracy - }); - } - /** - * Create a Duration from an ISO 8601 duration string. - * @param {string} text - text to parse - * @param {Object} opts - options for parsing - * @param {string} [opts.locale='en-US'] - the locale to use - * @param {string} opts.numberingSystem - the numbering system to use - * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use - * @see https://en.wikipedia.org/wiki/ISO_8601#Durations - * @example Duration.fromISO('P3Y6M1W4DT12H30M5S').toObject() //=> { years: 3, months: 6, weeks: 1, days: 4, hours: 12, minutes: 30, seconds: 5 } - * @example Duration.fromISO('PT23H').toObject() //=> { hours: 23 } - * @example Duration.fromISO('P5Y3M').toObject() //=> { years: 5, months: 3 } - * @return {Duration} - */ - - - static fromISO(text, opts) { - const [parsed] = parseISODuration(text); - - if (parsed) { - const obj = Object.assign(parsed, opts); - return Duration.fromObject(obj); - } else { - return Duration.invalid("unparsable", `the input "${text}" can't be parsed as ISO 8601`); - } - } - /** - * Create a Duration from an ISO 8601 time string. - * @param {string} text - text to parse - * @param {Object} opts - options for parsing - * @param {string} [opts.locale='en-US'] - the locale to use - * @param {string} opts.numberingSystem - the numbering system to use - * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use - * @see https://en.wikipedia.org/wiki/ISO_8601#Times - * @example Duration.fromISOTime('11:22:33.444').toObject() //=> { hours: 11, minutes: 22, seconds: 33, milliseconds: 444 } - * @example Duration.fromISOTime('11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } - * @example Duration.fromISOTime('T11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } - * @example Duration.fromISOTime('1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } - * @example Duration.fromISOTime('T1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } - * @return {Duration} - */ - - - static fromISOTime(text, opts) { - const [parsed] = parseISOTimeOnly(text); - - if (parsed) { - const obj = Object.assign(parsed, opts); - return Duration.fromObject(obj); - } else { - return Duration.invalid("unparsable", `the input "${text}" can't be parsed as ISO 8601`); - } - } - /** - * Create an invalid Duration. - * @param {string} reason - simple string of why this datetime is invalid. Should not contain parameters or anything else data-dependent - * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information - * @return {Duration} - */ - - - static invalid(reason, explanation = null) { - if (!reason) { - throw new InvalidArgumentError("need to specify a reason the Duration is invalid"); - } - - const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation); - - if (Settings.throwOnInvalid) { - throw new InvalidDurationError(invalid); - } else { - return new Duration({ - invalid - }); - } - } - /** - * @private - */ - - - static normalizeUnit(unit) { - const normalized = { - year: "years", - years: "years", - quarter: "quarters", - quarters: "quarters", - month: "months", - months: "months", - week: "weeks", - weeks: "weeks", - day: "days", - days: "days", - hour: "hours", - hours: "hours", - minute: "minutes", - minutes: "minutes", - second: "seconds", - seconds: "seconds", - millisecond: "milliseconds", - milliseconds: "milliseconds" - }[unit ? unit.toLowerCase() : unit]; - if (!normalized) throw new InvalidUnitError(unit); - return normalized; - } - /** - * Check if an object is a Duration. Works across context boundaries - * @param {object} o - * @return {boolean} - */ - - - static isDuration(o) { - return o && o.isLuxonDuration || false; - } - /** - * Get the locale of a Duration, such 'en-GB' - * @type {string} - */ - - - get locale() { - return this.isValid ? this.loc.locale : null; - } - /** - * Get the numbering system of a Duration, such 'beng'. The numbering system is used when formatting the Duration - * - * @type {string} - */ - - - get numberingSystem() { - return this.isValid ? this.loc.numberingSystem : null; - } - /** - * Returns a string representation of this Duration formatted according to the specified format string. You may use these tokens: - * * `S` for milliseconds - * * `s` for seconds - * * `m` for minutes - * * `h` for hours - * * `d` for days - * * `M` for months - * * `y` for years - * Notes: - * * Add padding by repeating the token, e.g. "yy" pads the years to two digits, "hhhh" pads the hours out to four digits - * * The duration will be converted to the set of units in the format string using {@link Duration.shiftTo} and the Durations's conversion accuracy setting. - * @param {string} fmt - the format string - * @param {Object} opts - options - * @param {boolean} [opts.floor=true] - floor numerical values - * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("y d s") //=> "1 6 2" - * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("yy dd sss") //=> "01 06 002" - * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("M S") //=> "12 518402000" - * @return {string} - */ - - - toFormat(fmt, opts = {}) { - // reverse-compat since 1.2; we always round down now, never up, and we do it by default - const fmtOpts = Object.assign({}, opts, { - floor: opts.round !== false && opts.floor !== false - }); - return this.isValid ? Formatter.create(this.loc, fmtOpts).formatDurationFromString(this, fmt) : INVALID; - } - /** - * Returns a JavaScript object with this Duration's values. - * @param opts - options for generating the object - * @param {boolean} [opts.includeConfig=false] - include configuration attributes in the output - * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toObject() //=> { years: 1, days: 6, seconds: 2 } - * @return {Object} - */ - - - toObject(opts = {}) { - if (!this.isValid) return {}; - const base = Object.assign({}, this.values); - - if (opts.includeConfig) { - base.conversionAccuracy = this.conversionAccuracy; - base.numberingSystem = this.loc.numberingSystem; - base.locale = this.loc.locale; - } - - return base; - } - /** - * Returns an ISO 8601-compliant string representation of this Duration. - * @see https://en.wikipedia.org/wiki/ISO_8601#Durations - * @example Duration.fromObject({ years: 3, seconds: 45 }).toISO() //=> 'P3YT45S' - * @example Duration.fromObject({ months: 4, seconds: 45 }).toISO() //=> 'P4MT45S' - * @example Duration.fromObject({ months: 5 }).toISO() //=> 'P5M' - * @example Duration.fromObject({ minutes: 5 }).toISO() //=> 'PT5M' - * @example Duration.fromObject({ milliseconds: 6 }).toISO() //=> 'PT0.006S' - * @return {string} - */ - - - toISO() { - // we could use the formatter, but this is an easier way to get the minimum string - if (!this.isValid) return null; - let s = "P"; - if (this.years !== 0) s += this.years + "Y"; - if (this.months !== 0 || this.quarters !== 0) s += this.months + this.quarters * 3 + "M"; - if (this.weeks !== 0) s += this.weeks + "W"; - if (this.days !== 0) s += this.days + "D"; - if (this.hours !== 0 || this.minutes !== 0 || this.seconds !== 0 || this.milliseconds !== 0) s += "T"; - if (this.hours !== 0) s += this.hours + "H"; - if (this.minutes !== 0) s += this.minutes + "M"; - if (this.seconds !== 0 || this.milliseconds !== 0) // this will handle "floating point madness" by removing extra decimal places - // https://stackoverflow.com/questions/588004/is-floating-point-math-broken - s += roundTo(this.seconds + this.milliseconds / 1000, 3) + "S"; - if (s === "P") s += "T0S"; - return s; - } - /** - * Returns an ISO 8601-compliant string representation of this Duration, formatted as a time of day. - * Note that this will return null if the duration is invalid, negative, or equal to or greater than 24 hours. - * @see https://en.wikipedia.org/wiki/ISO_8601#Times - * @param {Object} opts - options - * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0 - * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0 - * @param {boolean} [opts.includePrefix=false] - include the `T` prefix - * @param {string} [opts.format='extended'] - choose between the basic and extended format - * @example Duration.fromObject({ hours: 11 }).toISOTime() //=> '11:00:00.000' - * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressMilliseconds: true }) //=> '11:00:00' - * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressSeconds: true }) //=> '11:00' - * @example Duration.fromObject({ hours: 11 }).toISOTime({ includePrefix: true }) //=> 'T11:00:00.000' - * @example Duration.fromObject({ hours: 11 }).toISOTime({ format: 'basic' }) //=> '110000.000' - * @return {string} - */ - - - toISOTime(opts = {}) { - if (!this.isValid) return null; - const millis = this.toMillis(); - if (millis < 0 || millis >= 86400000) return null; - opts = Object.assign({ - suppressMilliseconds: false, - suppressSeconds: false, - includePrefix: false, - format: "extended" - }, opts); - const value = this.shiftTo("hours", "minutes", "seconds", "milliseconds"); - let fmt = opts.format === "basic" ? "hhmm" : "hh:mm"; - - if (!opts.suppressSeconds || value.seconds !== 0 || value.milliseconds !== 0) { - fmt += opts.format === "basic" ? "ss" : ":ss"; - - if (!opts.suppressMilliseconds || value.milliseconds !== 0) { - fmt += ".SSS"; - } - } - - let str = value.toFormat(fmt); - - if (opts.includePrefix) { - str = "T" + str; - } - - return str; - } - /** - * Returns an ISO 8601 representation of this Duration appropriate for use in JSON. - * @return {string} - */ - - - toJSON() { - return this.toISO(); - } - /** - * Returns an ISO 8601 representation of this Duration appropriate for use in debugging. - * @return {string} - */ - - - toString() { - return this.toISO(); - } - /** - * Returns an milliseconds value of this Duration. - * @return {number} - */ - - - toMillis() { - return this.as("milliseconds"); - } - /** - * Returns an milliseconds value of this Duration. Alias of {@link toMillis} - * @return {number} - */ - - - valueOf() { - return this.toMillis(); - } - /** - * Make this Duration longer by the specified amount. Return a newly-constructed Duration. - * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() - * @return {Duration} - */ - - - plus(duration) { - if (!this.isValid) return this; - const dur = friendlyDuration(duration), - result = {}; - - for (const k of orderedUnits) { - if (hasOwnProperty(dur.values, k) || hasOwnProperty(this.values, k)) { - result[k] = dur.get(k) + this.get(k); - } - } - - return clone(this, { - values: result - }, true); - } - /** - * Make this Duration shorter by the specified amount. Return a newly-constructed Duration. - * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() - * @return {Duration} - */ - - - minus(duration) { - if (!this.isValid) return this; - const dur = friendlyDuration(duration); - return this.plus(dur.negate()); - } - /** - * Scale this Duration by the specified amount. Return a newly-constructed Duration. - * @param {function} fn - The function to apply to each unit. Arity is 1 or 2: the value of the unit and, optionally, the unit name. Must return a number. - * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnit(x => x * 2) //=> { hours: 2, minutes: 60 } - * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnit((x, u) => u === "hour" ? x * 2 : x) //=> { hours: 2, minutes: 30 } - * @return {Duration} - */ - - - mapUnits(fn) { - if (!this.isValid) return this; - const result = {}; - - for (const k of Object.keys(this.values)) { - result[k] = asNumber(fn(this.values[k], k)); - } - - return clone(this, { - values: result - }, true); - } - /** - * Get the value of unit. - * @param {string} unit - a unit such as 'minute' or 'day' - * @example Duration.fromObject({years: 2, days: 3}).years //=> 2 - * @example Duration.fromObject({years: 2, days: 3}).months //=> 0 - * @example Duration.fromObject({years: 2, days: 3}).days //=> 3 - * @return {number} - */ - - - get(unit) { - return this[Duration.normalizeUnit(unit)]; - } - /** - * "Set" the values of specified units. Return a newly-constructed Duration. - * @param {Object} values - a mapping of units to numbers - * @example dur.set({ years: 2017 }) - * @example dur.set({ hours: 8, minutes: 30 }) - * @return {Duration} - */ - - - set(values) { - if (!this.isValid) return this; - const mixed = Object.assign(this.values, normalizeObject(values, Duration.normalizeUnit, [])); - return clone(this, { - values: mixed - }); - } - /** - * "Set" the locale and/or numberingSystem. Returns a newly-constructed Duration. - * @example dur.reconfigure({ locale: 'en-GB' }) - * @return {Duration} - */ - - - reconfigure({ - locale, - numberingSystem, - conversionAccuracy - } = {}) { - const loc = this.loc.clone({ - locale, - numberingSystem - }), - opts = { - loc - }; - - if (conversionAccuracy) { - opts.conversionAccuracy = conversionAccuracy; - } - - return clone(this, opts); - } - /** - * Return the length of the duration in the specified unit. - * @param {string} unit - a unit such as 'minutes' or 'days' - * @example Duration.fromObject({years: 1}).as('days') //=> 365 - * @example Duration.fromObject({years: 1}).as('months') //=> 12 - * @example Duration.fromObject({hours: 60}).as('days') //=> 2.5 - * @return {number} - */ - - - as(unit) { - return this.isValid ? this.shiftTo(unit).get(unit) : NaN; - } - /** - * Reduce this Duration to its canonical representation in its current units. - * @example Duration.fromObject({ years: 2, days: 5000 }).normalize().toObject() //=> { years: 15, days: 255 } - * @example Duration.fromObject({ hours: 12, minutes: -45 }).normalize().toObject() //=> { hours: 11, minutes: 15 } - * @return {Duration} - */ - - - normalize() { - if (!this.isValid) return this; - const vals = this.toObject(); - normalizeValues(this.matrix, vals); - return clone(this, { - values: vals - }, true); - } - /** - * Convert this Duration into its representation in a different set of units. - * @example Duration.fromObject({ hours: 1, seconds: 30 }).shiftTo('minutes', 'milliseconds').toObject() //=> { minutes: 60, milliseconds: 30000 } - * @return {Duration} - */ - - - shiftTo(...units) { - if (!this.isValid) return this; - - if (units.length === 0) { - return this; - } - - units = units.map(u => Duration.normalizeUnit(u)); - const built = {}, - accumulated = {}, - vals = this.toObject(); - let lastUnit; - - for (const k of orderedUnits) { - if (units.indexOf(k) >= 0) { - lastUnit = k; - let own = 0; // anything we haven't boiled down yet should get boiled to this unit - - for (const ak in accumulated) { - own += this.matrix[ak][k] * accumulated[ak]; - accumulated[ak] = 0; - } // plus anything that's already in this unit - - - if (isNumber$1(vals[k])) { - own += vals[k]; - } - - const i = Math.trunc(own); - built[k] = i; - accumulated[k] = own - i; // we'd like to absorb these fractions in another unit - // plus anything further down the chain that should be rolled up in to this - - for (const down in vals) { - if (orderedUnits.indexOf(down) > orderedUnits.indexOf(k)) { - convert(this.matrix, vals, down, built, k); - } - } // otherwise, keep it in the wings to boil it later - - } else if (isNumber$1(vals[k])) { - accumulated[k] = vals[k]; - } - } // anything leftover becomes the decimal for the last unit - // lastUnit must be defined since units is not empty - - - for (const key in accumulated) { - if (accumulated[key] !== 0) { - built[lastUnit] += key === lastUnit ? accumulated[key] : accumulated[key] / this.matrix[lastUnit][key]; - } - } - - return clone(this, { - values: built - }, true).normalize(); - } - /** - * Return the negative of this Duration. - * @example Duration.fromObject({ hours: 1, seconds: 30 }).negate().toObject() //=> { hours: -1, seconds: -30 } - * @return {Duration} - */ - - - negate() { - if (!this.isValid) return this; - const negated = {}; - - for (const k of Object.keys(this.values)) { - negated[k] = -this.values[k]; - } - - return clone(this, { - values: negated - }, true); - } - /** - * Get the years. - * @type {number} - */ - - - get years() { - return this.isValid ? this.values.years || 0 : NaN; - } - /** - * Get the quarters. - * @type {number} - */ - - - get quarters() { - return this.isValid ? this.values.quarters || 0 : NaN; - } - /** - * Get the months. - * @type {number} - */ - - - get months() { - return this.isValid ? this.values.months || 0 : NaN; - } - /** - * Get the weeks - * @type {number} - */ - - - get weeks() { - return this.isValid ? this.values.weeks || 0 : NaN; - } - /** - * Get the days. - * @type {number} - */ - - - get days() { - return this.isValid ? this.values.days || 0 : NaN; - } - /** - * Get the hours. - * @type {number} - */ - - - get hours() { - return this.isValid ? this.values.hours || 0 : NaN; - } - /** - * Get the minutes. - * @type {number} - */ - - - get minutes() { - return this.isValid ? this.values.minutes || 0 : NaN; - } - /** - * Get the seconds. - * @return {number} - */ - - - get seconds() { - return this.isValid ? this.values.seconds || 0 : NaN; - } - /** - * Get the milliseconds. - * @return {number} - */ - - - get milliseconds() { - return this.isValid ? this.values.milliseconds || 0 : NaN; - } - /** - * Returns whether the Duration is invalid. Invalid durations are returned by diff operations - * on invalid DateTimes or Intervals. - * @return {boolean} - */ - - - get isValid() { - return this.invalid === null; - } - /** - * Returns an error code if this Duration became invalid, or null if the Duration is valid - * @return {string} - */ - - - get invalidReason() { - return this.invalid ? this.invalid.reason : null; - } - /** - * Returns an explanation of why this Duration became invalid, or null if the Duration is valid - * @type {string} - */ - - - get invalidExplanation() { - return this.invalid ? this.invalid.explanation : null; - } - /** - * Equality check - * Two Durations are equal iff they have the same units and the same values for each unit. - * @param {Duration} other - * @return {boolean} - */ - - - equals(other) { - if (!this.isValid || !other.isValid) { - return false; - } - - if (!this.loc.equals(other.loc)) { - return false; - } - - function eq(v1, v2) { - // Consider 0 and undefined as equal - if (v1 === undefined || v1 === 0) return v2 === undefined || v2 === 0; - return v1 === v2; - } - - for (const u of orderedUnits) { - if (!eq(this.values[u], other.values[u])) { - return false; - } - } - - return true; - } - -} -/** - * @private - */ - -function friendlyDuration(durationish) { - if (isNumber$1(durationish)) { - return Duration.fromMillis(durationish); - } else if (Duration.isDuration(durationish)) { - return durationish; - } else if (typeof durationish === "object") { - return Duration.fromObject(durationish); - } else { - throw new InvalidArgumentError(`Unknown duration argument ${durationish} of type ${typeof durationish}`); - } -} - -const INVALID$1 = "Invalid Interval"; // checks if the start is equal to or before the end - -function validateStartEnd(start, end) { - if (!start || !start.isValid) { - return Interval.invalid("missing or invalid start"); - } else if (!end || !end.isValid) { - return Interval.invalid("missing or invalid end"); - } else if (end < start) { - return Interval.invalid("end before start", `The end of an interval must be after its start, but you had start=${start.toISO()} and end=${end.toISO()}`); - } else { - return null; - } -} -/** - * An Interval object represents a half-open interval of time, where each endpoint is a {@link DateTime}. Conceptually, it's a container for those two endpoints, accompanied by methods for creating, parsing, interrogating, comparing, transforming, and formatting them. - * - * Here is a brief overview of the most commonly used methods and getters in Interval: - * - * * **Creation** To create an Interval, use {@link fromDateTimes}, {@link after}, {@link before}, or {@link fromISO}. - * * **Accessors** Use {@link start} and {@link end} to get the start and end. - * * **Interrogation** To analyze the Interval, use {@link count}, {@link length}, {@link hasSame}, {@link contains}, {@link isAfter}, or {@link isBefore}. - * * **Transformation** To create other Intervals out of this one, use {@link set}, {@link splitAt}, {@link splitBy}, {@link divideEqually}, {@link merge}, {@link xor}, {@link union}, {@link intersection}, or {@link difference}. - * * **Comparison** To compare this Interval to another one, use {@link equals}, {@link overlaps}, {@link abutsStart}, {@link abutsEnd}, {@link engulfs}. - * * **Output** To convert the Interval into other representations, see {@link toString}, {@link toISO}, {@link toISODate}, {@link toISOTime}, {@link toFormat}, and {@link toDuration}. - */ - - -class Interval { - /** - * @private - */ - constructor(config) { - /** - * @access private - */ - this.s = config.start; - /** - * @access private - */ - - this.e = config.end; - /** - * @access private - */ - - this.invalid = config.invalid || null; - /** - * @access private - */ - - this.isLuxonInterval = true; - } - /** - * Create an invalid Interval. - * @param {string} reason - simple string of why this Interval is invalid. Should not contain parameters or anything else data-dependent - * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information - * @return {Interval} - */ - - - static invalid(reason, explanation = null) { - if (!reason) { - throw new InvalidArgumentError("need to specify a reason the Interval is invalid"); - } - - const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation); - - if (Settings.throwOnInvalid) { - throw new InvalidIntervalError(invalid); - } else { - return new Interval({ - invalid - }); - } - } - /** - * Create an Interval from a start DateTime and an end DateTime. Inclusive of the start but not the end. - * @param {DateTime|Date|Object} start - * @param {DateTime|Date|Object} end - * @return {Interval} - */ - - - static fromDateTimes(start, end) { - const builtStart = friendlyDateTime(start), - builtEnd = friendlyDateTime(end); - const validateError = validateStartEnd(builtStart, builtEnd); - - if (validateError == null) { - return new Interval({ - start: builtStart, - end: builtEnd - }); - } else { - return validateError; - } - } - /** - * Create an Interval from a start DateTime and a Duration to extend to. - * @param {DateTime|Date|Object} start - * @param {Duration|Object|number} duration - the length of the Interval. - * @return {Interval} - */ - - - static after(start, duration) { - const dur = friendlyDuration(duration), - dt = friendlyDateTime(start); - return Interval.fromDateTimes(dt, dt.plus(dur)); - } - /** - * Create an Interval from an end DateTime and a Duration to extend backwards to. - * @param {DateTime|Date|Object} end - * @param {Duration|Object|number} duration - the length of the Interval. - * @return {Interval} - */ - - - static before(end, duration) { - const dur = friendlyDuration(duration), - dt = friendlyDateTime(end); - return Interval.fromDateTimes(dt.minus(dur), dt); - } - /** - * Create an Interval from an ISO 8601 string. - * Accepts `/`, `/`, and `/` formats. - * @param {string} text - the ISO string to parse - * @param {Object} [opts] - options to pass {@link DateTime.fromISO} and optionally {@link Duration.fromISO} - * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals - * @return {Interval} - */ - - - static fromISO(text, opts) { - const [s, e] = (text || "").split("/", 2); - - if (s && e) { - let start, startIsValid; - - try { - start = DateTime$1.fromISO(s, opts); - startIsValid = start.isValid; - } catch (e) { - startIsValid = false; - } - - let end, endIsValid; - - try { - end = DateTime$1.fromISO(e, opts); - endIsValid = end.isValid; - } catch (e) { - endIsValid = false; - } - - if (startIsValid && endIsValid) { - return Interval.fromDateTimes(start, end); - } - - if (startIsValid) { - const dur = Duration.fromISO(e, opts); - - if (dur.isValid) { - return Interval.after(start, dur); - } - } else if (endIsValid) { - const dur = Duration.fromISO(s, opts); - - if (dur.isValid) { - return Interval.before(end, dur); - } - } - } - - return Interval.invalid("unparsable", `the input "${text}" can't be parsed as ISO 8601`); - } - /** - * Check if an object is an Interval. Works across context boundaries - * @param {object} o - * @return {boolean} - */ - - - static isInterval(o) { - return o && o.isLuxonInterval || false; - } - /** - * Returns the start of the Interval - * @type {DateTime} - */ - - - get start() { - return this.isValid ? this.s : null; - } - /** - * Returns the end of the Interval - * @type {DateTime} - */ - - - get end() { - return this.isValid ? this.e : null; - } - /** - * Returns whether this Interval's end is at least its start, meaning that the Interval isn't 'backwards'. - * @type {boolean} - */ - - - get isValid() { - return this.invalidReason === null; - } - /** - * Returns an error code if this Interval is invalid, or null if the Interval is valid - * @type {string} - */ - - - get invalidReason() { - return this.invalid ? this.invalid.reason : null; - } - /** - * Returns an explanation of why this Interval became invalid, or null if the Interval is valid - * @type {string} - */ - - - get invalidExplanation() { - return this.invalid ? this.invalid.explanation : null; - } - /** - * Returns the length of the Interval in the specified unit. - * @param {string} unit - the unit (such as 'hours' or 'days') to return the length in. - * @return {number} - */ - - - length(unit = "milliseconds") { - return this.isValid ? this.toDuration(...[unit]).get(unit) : NaN; - } - /** - * Returns the count of minutes, hours, days, months, or years included in the Interval, even in part. - * Unlike {@link length} this counts sections of the calendar, not periods of time, e.g. specifying 'day' - * asks 'what dates are included in this interval?', not 'how many days long is this interval?' - * @param {string} [unit='milliseconds'] - the unit of time to count. - * @return {number} - */ - - - count(unit = "milliseconds") { - if (!this.isValid) return NaN; - const start = this.start.startOf(unit), - end = this.end.startOf(unit); - return Math.floor(end.diff(start, unit).get(unit)) + 1; - } - /** - * Returns whether this Interval's start and end are both in the same unit of time - * @param {string} unit - the unit of time to check sameness on - * @return {boolean} - */ - - - hasSame(unit) { - return this.isValid ? this.isEmpty() || this.e.minus(1).hasSame(this.s, unit) : false; - } - /** - * Return whether this Interval has the same start and end DateTimes. - * @return {boolean} - */ - - - isEmpty() { - return this.s.valueOf() === this.e.valueOf(); - } - /** - * Return whether this Interval's start is after the specified DateTime. - * @param {DateTime} dateTime - * @return {boolean} - */ - - - isAfter(dateTime) { - if (!this.isValid) return false; - return this.s > dateTime; - } - /** - * Return whether this Interval's end is before the specified DateTime. - * @param {DateTime} dateTime - * @return {boolean} - */ - - - isBefore(dateTime) { - if (!this.isValid) return false; - return this.e <= dateTime; - } - /** - * Return whether this Interval contains the specified DateTime. - * @param {DateTime} dateTime - * @return {boolean} - */ - - - contains(dateTime) { - if (!this.isValid) return false; - return this.s <= dateTime && this.e > dateTime; - } - /** - * "Sets" the start and/or end dates. Returns a newly-constructed Interval. - * @param {Object} values - the values to set - * @param {DateTime} values.start - the starting DateTime - * @param {DateTime} values.end - the ending DateTime - * @return {Interval} - */ - - - set({ - start, - end - } = {}) { - if (!this.isValid) return this; - return Interval.fromDateTimes(start || this.s, end || this.e); - } - /** - * Split this Interval at each of the specified DateTimes - * @param {...[DateTime]} dateTimes - the unit of time to count. - * @return {[Interval]} - */ - - - splitAt(...dateTimes) { - if (!this.isValid) return []; - const sorted = dateTimes.map(friendlyDateTime).filter(d => this.contains(d)).sort(), - results = []; - let { - s - } = this, - i = 0; - - while (s < this.e) { - const added = sorted[i] || this.e, - next = +added > +this.e ? this.e : added; - results.push(Interval.fromDateTimes(s, next)); - s = next; - i += 1; - } - - return results; - } - /** - * Split this Interval into smaller Intervals, each of the specified length. - * Left over time is grouped into a smaller interval - * @param {Duration|Object|number} duration - The length of each resulting interval. - * @return {[Interval]} - */ - - - splitBy(duration) { - const dur = friendlyDuration(duration); - - if (!this.isValid || !dur.isValid || dur.as("milliseconds") === 0) { - return []; - } - - let { - s - } = this, - added, - next; - const results = []; - - while (s < this.e) { - added = s.plus(dur); - next = +added > +this.e ? this.e : added; - results.push(Interval.fromDateTimes(s, next)); - s = next; - } - - return results; - } - /** - * Split this Interval into the specified number of smaller intervals. - * @param {number} numberOfParts - The number of Intervals to divide the Interval into. - * @return {[Interval]} - */ - - - divideEqually(numberOfParts) { - if (!this.isValid) return []; - return this.splitBy(this.length() / numberOfParts).slice(0, numberOfParts); - } - /** - * Return whether this Interval overlaps with the specified Interval - * @param {Interval} other - * @return {boolean} - */ - - - overlaps(other) { - return this.e > other.s && this.s < other.e; - } - /** - * Return whether this Interval's end is adjacent to the specified Interval's start. - * @param {Interval} other - * @return {boolean} - */ - - - abutsStart(other) { - if (!this.isValid) return false; - return +this.e === +other.s; - } - /** - * Return whether this Interval's start is adjacent to the specified Interval's end. - * @param {Interval} other - * @return {boolean} - */ - - - abutsEnd(other) { - if (!this.isValid) return false; - return +other.e === +this.s; - } - /** - * Return whether this Interval engulfs the start and end of the specified Interval. - * @param {Interval} other - * @return {boolean} - */ - - - engulfs(other) { - if (!this.isValid) return false; - return this.s <= other.s && this.e >= other.e; - } - /** - * Return whether this Interval has the same start and end as the specified Interval. - * @param {Interval} other - * @return {boolean} - */ - - - equals(other) { - if (!this.isValid || !other.isValid) { - return false; - } - - return this.s.equals(other.s) && this.e.equals(other.e); - } - /** - * Return an Interval representing the intersection of this Interval and the specified Interval. - * Specifically, the resulting Interval has the maximum start time and the minimum end time of the two Intervals. - * Returns null if the intersection is empty, meaning, the intervals don't intersect. - * @param {Interval} other - * @return {Interval} - */ - - - intersection(other) { - if (!this.isValid) return this; - const s = this.s > other.s ? this.s : other.s, - e = this.e < other.e ? this.e : other.e; - - if (s > e) { - return null; - } else { - return Interval.fromDateTimes(s, e); - } - } - /** - * Return an Interval representing the union of this Interval and the specified Interval. - * Specifically, the resulting Interval has the minimum start time and the maximum end time of the two Intervals. - * @param {Interval} other - * @return {Interval} - */ - - - union(other) { - if (!this.isValid) return this; - const s = this.s < other.s ? this.s : other.s, - e = this.e > other.e ? this.e : other.e; - return Interval.fromDateTimes(s, e); - } - /** - * Merge an array of Intervals into a equivalent minimal set of Intervals. - * Combines overlapping and adjacent Intervals. - * @param {[Interval]} intervals - * @return {[Interval]} - */ - - - static merge(intervals) { - const [found, final] = intervals.sort((a, b) => a.s - b.s).reduce(([sofar, current], item) => { - if (!current) { - return [sofar, item]; - } else if (current.overlaps(item) || current.abutsStart(item)) { - return [sofar, current.union(item)]; - } else { - return [sofar.concat([current]), item]; - } - }, [[], null]); - - if (final) { - found.push(final); - } - - return found; - } - /** - * Return an array of Intervals representing the spans of time that only appear in one of the specified Intervals. - * @param {[Interval]} intervals - * @return {[Interval]} - */ - - - static xor(intervals) { - let start = null, - currentCount = 0; - const results = [], - ends = intervals.map(i => [{ - time: i.s, - type: "s" - }, { - time: i.e, - type: "e" - }]), - flattened = Array.prototype.concat(...ends), - arr = flattened.sort((a, b) => a.time - b.time); - - for (const i of arr) { - currentCount += i.type === "s" ? 1 : -1; - - if (currentCount === 1) { - start = i.time; - } else { - if (start && +start !== +i.time) { - results.push(Interval.fromDateTimes(start, i.time)); - } - - start = null; - } - } - - return Interval.merge(results); - } - /** - * Return an Interval representing the span of time in this Interval that doesn't overlap with any of the specified Intervals. - * @param {...Interval} intervals - * @return {[Interval]} - */ - - - difference(...intervals) { - return Interval.xor([this].concat(intervals)).map(i => this.intersection(i)).filter(i => i && !i.isEmpty()); - } - /** - * Returns a string representation of this Interval appropriate for debugging. - * @return {string} - */ - - - toString() { - if (!this.isValid) return INVALID$1; - return `[${this.s.toISO()} – ${this.e.toISO()})`; - } - /** - * Returns an ISO 8601-compliant string representation of this Interval. - * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals - * @param {Object} opts - The same options as {@link DateTime.toISO} - * @return {string} - */ - - - toISO(opts) { - if (!this.isValid) return INVALID$1; - return `${this.s.toISO(opts)}/${this.e.toISO(opts)}`; - } - /** - * Returns an ISO 8601-compliant string representation of date of this Interval. - * The time components are ignored. - * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals - * @return {string} - */ - - - toISODate() { - if (!this.isValid) return INVALID$1; - return `${this.s.toISODate()}/${this.e.toISODate()}`; - } - /** - * Returns an ISO 8601-compliant string representation of time of this Interval. - * The date components are ignored. - * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals - * @param {Object} opts - The same options as {@link DateTime.toISO} - * @return {string} - */ - - - toISOTime(opts) { - if (!this.isValid) return INVALID$1; - return `${this.s.toISOTime(opts)}/${this.e.toISOTime(opts)}`; - } - /** - * Returns a string representation of this Interval formatted according to the specified format string. - * @param {string} dateFormat - the format string. This string formats the start and end time. See {@link DateTime.toFormat} for details. - * @param {Object} opts - options - * @param {string} [opts.separator = ' – '] - a separator to place between the start and end representations - * @return {string} - */ - - - toFormat(dateFormat, { - separator = " – " - } = {}) { - if (!this.isValid) return INVALID$1; - return `${this.s.toFormat(dateFormat)}${separator}${this.e.toFormat(dateFormat)}`; - } - /** - * Return a Duration representing the time spanned by this interval. - * @param {string|string[]} [unit=['milliseconds']] - the unit or units (such as 'hours' or 'days') to include in the duration. - * @param {Object} opts - options that affect the creation of the Duration - * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use - * @example Interval.fromDateTimes(dt1, dt2).toDuration().toObject() //=> { milliseconds: 88489257 } - * @example Interval.fromDateTimes(dt1, dt2).toDuration('days').toObject() //=> { days: 1.0241812152777778 } - * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes']).toObject() //=> { hours: 24, minutes: 34.82095 } - * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes', 'seconds']).toObject() //=> { hours: 24, minutes: 34, seconds: 49.257 } - * @example Interval.fromDateTimes(dt1, dt2).toDuration('seconds').toObject() //=> { seconds: 88489.257 } - * @return {Duration} - */ - - - toDuration(unit, opts) { - if (!this.isValid) { - return Duration.invalid(this.invalidReason); - } - - return this.e.diff(this.s, unit, opts); - } - /** - * Run mapFn on the interval start and end, returning a new Interval from the resulting DateTimes - * @param {function} mapFn - * @return {Interval} - * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.toUTC()) - * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.plus({ hours: 2 })) - */ - - - mapEndpoints(mapFn) { - return Interval.fromDateTimes(mapFn(this.s), mapFn(this.e)); - } - -} - -/** - * The Info class contains static methods for retrieving general time and date related data. For example, it has methods for finding out if a time zone has a DST, for listing the months in any supported locale, and for discovering which of Luxon features are available in the current environment. - */ - -class Info { - /** - * Return whether the specified zone contains a DST. - * @param {string|Zone} [zone='local'] - Zone to check. Defaults to the environment's local zone. - * @return {boolean} - */ - static hasDST(zone = Settings.defaultZone) { - const proto = DateTime$1.now().setZone(zone).set({ - month: 12 - }); - return !zone.universal && proto.offset !== proto.set({ - month: 6 - }).offset; - } - /** - * Return whether the specified zone is a valid IANA specifier. - * @param {string} zone - Zone to check - * @return {boolean} - */ - - - static isValidIANAZone(zone) { - return IANAZone.isValidSpecifier(zone) && IANAZone.isValidZone(zone); - } - /** - * Converts the input into a {@link Zone} instance. - * - * * If `input` is already a Zone instance, it is returned unchanged. - * * If `input` is a string containing a valid time zone name, a Zone instance - * with that name is returned. - * * If `input` is a string that doesn't refer to a known time zone, a Zone - * instance with {@link Zone.isValid} == false is returned. - * * If `input is a number, a Zone instance with the specified fixed offset - * in minutes is returned. - * * If `input` is `null` or `undefined`, the default zone is returned. - * @param {string|Zone|number} [input] - the value to be converted - * @return {Zone} - */ - - - static normalizeZone(input) { - return normalizeZone(input, Settings.defaultZone); - } - /** - * Return an array of standalone month names. - * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat - * @param {string} [length='long'] - the length of the month representation, such as "numeric", "2-digit", "narrow", "short", "long" - * @param {Object} opts - options - * @param {string} [opts.locale] - the locale code - * @param {string} [opts.numberingSystem=null] - the numbering system - * @param {string} [opts.outputCalendar='gregory'] - the calendar - * @example Info.months()[0] //=> 'January' - * @example Info.months('short')[0] //=> 'Jan' - * @example Info.months('numeric')[0] //=> '1' - * @example Info.months('short', { locale: 'fr-CA' } )[0] //=> 'janv.' - * @example Info.months('numeric', { locale: 'ar' })[0] //=> '١' - * @example Info.months('long', { outputCalendar: 'islamic' })[0] //=> 'Rabiʻ I' - * @return {[string]} - */ - - - static months(length = "long", { - locale = null, - numberingSystem = null, - outputCalendar = "gregory" - } = {}) { - return Locale.create(locale, numberingSystem, outputCalendar).months(length); - } - /** - * Return an array of format month names. - * Format months differ from standalone months in that they're meant to appear next to the day of the month. In some languages, that - * changes the string. - * See {@link months} - * @param {string} [length='long'] - the length of the month representation, such as "numeric", "2-digit", "narrow", "short", "long" - * @param {Object} opts - options - * @param {string} [opts.locale] - the locale code - * @param {string} [opts.numberingSystem=null] - the numbering system - * @param {string} [opts.outputCalendar='gregory'] - the calendar - * @return {[string]} - */ - - - static monthsFormat(length = "long", { - locale = null, - numberingSystem = null, - outputCalendar = "gregory" - } = {}) { - return Locale.create(locale, numberingSystem, outputCalendar).months(length, true); - } - /** - * Return an array of standalone week names. - * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat - * @param {string} [length='long'] - the length of the weekday representation, such as "narrow", "short", "long". - * @param {Object} opts - options - * @param {string} [opts.locale] - the locale code - * @param {string} [opts.numberingSystem=null] - the numbering system - * @example Info.weekdays()[0] //=> 'Monday' - * @example Info.weekdays('short')[0] //=> 'Mon' - * @example Info.weekdays('short', { locale: 'fr-CA' })[0] //=> 'lun.' - * @example Info.weekdays('short', { locale: 'ar' })[0] //=> 'الاثنين' - * @return {[string]} - */ - - - static weekdays(length = "long", { - locale = null, - numberingSystem = null - } = {}) { - return Locale.create(locale, numberingSystem, null).weekdays(length); - } - /** - * Return an array of format week names. - * Format weekdays differ from standalone weekdays in that they're meant to appear next to more date information. In some languages, that - * changes the string. - * See {@link weekdays} - * @param {string} [length='long'] - the length of the weekday representation, such as "narrow", "short", "long". - * @param {Object} opts - options - * @param {string} [opts.locale=null] - the locale code - * @param {string} [opts.numberingSystem=null] - the numbering system - * @return {[string]} - */ - - - static weekdaysFormat(length = "long", { - locale = null, - numberingSystem = null - } = {}) { - return Locale.create(locale, numberingSystem, null).weekdays(length, true); - } - /** - * Return an array of meridiems. - * @param {Object} opts - options - * @param {string} [opts.locale] - the locale code - * @example Info.meridiems() //=> [ 'AM', 'PM' ] - * @example Info.meridiems({ locale: 'my' }) //=> [ 'နံနက်', 'ညနေ' ] - * @return {[string]} - */ - - - static meridiems({ - locale = null - } = {}) { - return Locale.create(locale).meridiems(); - } - /** - * Return an array of eras, such as ['BC', 'AD']. The locale can be specified, but the calendar system is always Gregorian. - * @param {string} [length='short'] - the length of the era representation, such as "short" or "long". - * @param {Object} opts - options - * @param {string} [opts.locale] - the locale code - * @example Info.eras() //=> [ 'BC', 'AD' ] - * @example Info.eras('long') //=> [ 'Before Christ', 'Anno Domini' ] - * @example Info.eras('long', { locale: 'fr' }) //=> [ 'avant Jésus-Christ', 'après Jésus-Christ' ] - * @return {[string]} - */ - - - static eras(length = "short", { - locale = null - } = {}) { - return Locale.create(locale, null, "gregory").eras(length); - } - /** - * Return the set of available features in this environment. - * Some features of Luxon are not available in all environments. For example, on older browsers, timezone support is not available. Use this function to figure out if that's the case. - * Keys: - * * `zones`: whether this environment supports IANA timezones - * * `intlTokens`: whether this environment supports internationalized token-based formatting/parsing - * * `intl`: whether this environment supports general internationalization - * * `relative`: whether this environment supports relative time formatting - * @example Info.features() //=> { intl: true, intlTokens: false, zones: true, relative: false } - * @return {Object} - */ - - - static features() { - let intl = false, - intlTokens = false, - zones = false, - relative = false; - - if (hasIntl()) { - intl = true; - intlTokens = hasFormatToParts(); - relative = hasRelative(); - - try { - zones = new Intl.DateTimeFormat("en", { - timeZone: "America/New_York" - }).resolvedOptions().timeZone === "America/New_York"; - } catch (e) { - zones = false; - } - } - - return { - intl, - intlTokens, - zones, - relative - }; - } - -} - -function dayDiff(earlier, later) { - const utcDayStart = dt => dt.toUTC(0, { - keepLocalTime: true - }).startOf("day").valueOf(), - ms = utcDayStart(later) - utcDayStart(earlier); - - return Math.floor(Duration.fromMillis(ms).as("days")); -} - -function highOrderDiffs(cursor, later, units) { - const differs = [["years", (a, b) => b.year - a.year], ["quarters", (a, b) => b.quarter - a.quarter], ["months", (a, b) => b.month - a.month + (b.year - a.year) * 12], ["weeks", (a, b) => { - const days = dayDiff(a, b); - return (days - days % 7) / 7; - }], ["days", dayDiff]]; - const results = {}; - let lowestOrder, highWater; - - for (const [unit, differ] of differs) { - if (units.indexOf(unit) >= 0) { - lowestOrder = unit; - let delta = differ(cursor, later); - highWater = cursor.plus({ - [unit]: delta - }); - - if (highWater > later) { - cursor = cursor.plus({ - [unit]: delta - 1 - }); - delta -= 1; - } else { - cursor = highWater; - } - - results[unit] = delta; - } - } - - return [cursor, results, highWater, lowestOrder]; -} - -function diff (earlier, later, units, opts) { - let [cursor, results, highWater, lowestOrder] = highOrderDiffs(earlier, later, units); - const remainingMillis = later - cursor; - const lowerOrderUnits = units.filter(u => ["hours", "minutes", "seconds", "milliseconds"].indexOf(u) >= 0); - - if (lowerOrderUnits.length === 0) { - if (highWater < later) { - highWater = cursor.plus({ - [lowestOrder]: 1 - }); - } - - if (highWater !== cursor) { - results[lowestOrder] = (results[lowestOrder] || 0) + remainingMillis / (highWater - cursor); - } - } - - const duration = Duration.fromObject(Object.assign(results, opts)); - - if (lowerOrderUnits.length > 0) { - return Duration.fromMillis(remainingMillis, opts).shiftTo(...lowerOrderUnits).plus(duration); - } else { - return duration; - } -} - -const numberingSystems = { - arab: "[\u0660-\u0669]", - arabext: "[\u06F0-\u06F9]", - bali: "[\u1B50-\u1B59]", - beng: "[\u09E6-\u09EF]", - deva: "[\u0966-\u096F]", - fullwide: "[\uFF10-\uFF19]", - gujr: "[\u0AE6-\u0AEF]", - hanidec: "[〇|一|二|三|四|五|六|七|八|九]", - khmr: "[\u17E0-\u17E9]", - knda: "[\u0CE6-\u0CEF]", - laoo: "[\u0ED0-\u0ED9]", - limb: "[\u1946-\u194F]", - mlym: "[\u0D66-\u0D6F]", - mong: "[\u1810-\u1819]", - mymr: "[\u1040-\u1049]", - orya: "[\u0B66-\u0B6F]", - tamldec: "[\u0BE6-\u0BEF]", - telu: "[\u0C66-\u0C6F]", - thai: "[\u0E50-\u0E59]", - tibt: "[\u0F20-\u0F29]", - latn: "\\d" -}; -const numberingSystemsUTF16 = { - arab: [1632, 1641], - arabext: [1776, 1785], - bali: [6992, 7001], - beng: [2534, 2543], - deva: [2406, 2415], - fullwide: [65296, 65303], - gujr: [2790, 2799], - khmr: [6112, 6121], - knda: [3302, 3311], - laoo: [3792, 3801], - limb: [6470, 6479], - mlym: [3430, 3439], - mong: [6160, 6169], - mymr: [4160, 4169], - orya: [2918, 2927], - tamldec: [3046, 3055], - telu: [3174, 3183], - thai: [3664, 3673], - tibt: [3872, 3881] -}; // eslint-disable-next-line - -const hanidecChars = numberingSystems.hanidec.replace(/[\[|\]]/g, "").split(""); -function parseDigits(str) { - let value = parseInt(str, 10); - - if (isNaN(value)) { - value = ""; - - for (let i = 0; i < str.length; i++) { - const code = str.charCodeAt(i); - - if (str[i].search(numberingSystems.hanidec) !== -1) { - value += hanidecChars.indexOf(str[i]); - } else { - for (const key in numberingSystemsUTF16) { - const [min, max] = numberingSystemsUTF16[key]; - - if (code >= min && code <= max) { - value += code - min; - } - } - } - } - - return parseInt(value, 10); - } else { - return value; - } -} -function digitRegex({ - numberingSystem -}, append = "") { - return new RegExp(`${numberingSystems[numberingSystem || "latn"]}${append}`); -} - -const MISSING_FTP = "missing Intl.DateTimeFormat.formatToParts support"; - -function intUnit(regex, post = i => i) { - return { - regex, - deser: ([s]) => post(parseDigits(s)) - }; -} - -const NBSP = String.fromCharCode(160); -const spaceOrNBSP = `( |${NBSP})`; -const spaceOrNBSPRegExp = new RegExp(spaceOrNBSP, "g"); - -function fixListRegex(s) { - // make dots optional and also make them literal - // make space and non breakable space characters interchangeable - return s.replace(/\./g, "\\.?").replace(spaceOrNBSPRegExp, spaceOrNBSP); -} - -function stripInsensitivities(s) { - return s.replace(/\./g, "") // ignore dots that were made optional - .replace(spaceOrNBSPRegExp, " ") // interchange space and nbsp - .toLowerCase(); -} - -function oneOf(strings, startIndex) { - if (strings === null) { - return null; - } else { - return { - regex: RegExp(strings.map(fixListRegex).join("|")), - deser: ([s]) => strings.findIndex(i => stripInsensitivities(s) === stripInsensitivities(i)) + startIndex - }; - } -} - -function offset(regex, groups) { - return { - regex, - deser: ([, h, m]) => signedOffset(h, m), - groups - }; -} - -function simple(regex) { - return { - regex, - deser: ([s]) => s - }; -} - -function escapeToken(value) { - // eslint-disable-next-line no-useless-escape - return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&"); -} - -function unitForToken(token, loc) { - const one = digitRegex(loc), - two = digitRegex(loc, "{2}"), - three = digitRegex(loc, "{3}"), - four = digitRegex(loc, "{4}"), - six = digitRegex(loc, "{6}"), - oneOrTwo = digitRegex(loc, "{1,2}"), - oneToThree = digitRegex(loc, "{1,3}"), - oneToSix = digitRegex(loc, "{1,6}"), - oneToNine = digitRegex(loc, "{1,9}"), - twoToFour = digitRegex(loc, "{2,4}"), - fourToSix = digitRegex(loc, "{4,6}"), - literal = t => ({ - regex: RegExp(escapeToken(t.val)), - deser: ([s]) => s, - literal: true - }), - unitate = t => { - if (token.literal) { - return literal(t); - } - - switch (t.val) { - // era - case "G": - return oneOf(loc.eras("short", false), 0); - - case "GG": - return oneOf(loc.eras("long", false), 0); - // years - - case "y": - return intUnit(oneToSix); - - case "yy": - return intUnit(twoToFour, untruncateYear); - - case "yyyy": - return intUnit(four); - - case "yyyyy": - return intUnit(fourToSix); - - case "yyyyyy": - return intUnit(six); - // months - - case "M": - return intUnit(oneOrTwo); - - case "MM": - return intUnit(two); - - case "MMM": - return oneOf(loc.months("short", true, false), 1); - - case "MMMM": - return oneOf(loc.months("long", true, false), 1); - - case "L": - return intUnit(oneOrTwo); - - case "LL": - return intUnit(two); - - case "LLL": - return oneOf(loc.months("short", false, false), 1); - - case "LLLL": - return oneOf(loc.months("long", false, false), 1); - // dates - - case "d": - return intUnit(oneOrTwo); - - case "dd": - return intUnit(two); - // ordinals - - case "o": - return intUnit(oneToThree); - - case "ooo": - return intUnit(three); - // time - - case "HH": - return intUnit(two); - - case "H": - return intUnit(oneOrTwo); - - case "hh": - return intUnit(two); - - case "h": - return intUnit(oneOrTwo); - - case "mm": - return intUnit(two); - - case "m": - return intUnit(oneOrTwo); - - case "q": - return intUnit(oneOrTwo); - - case "qq": - return intUnit(two); - - case "s": - return intUnit(oneOrTwo); - - case "ss": - return intUnit(two); - - case "S": - return intUnit(oneToThree); - - case "SSS": - return intUnit(three); - - case "u": - return simple(oneToNine); - // meridiem - - case "a": - return oneOf(loc.meridiems(), 0); - // weekYear (k) - - case "kkkk": - return intUnit(four); - - case "kk": - return intUnit(twoToFour, untruncateYear); - // weekNumber (W) - - case "W": - return intUnit(oneOrTwo); - - case "WW": - return intUnit(two); - // weekdays - - case "E": - case "c": - return intUnit(one); - - case "EEE": - return oneOf(loc.weekdays("short", false, false), 1); - - case "EEEE": - return oneOf(loc.weekdays("long", false, false), 1); - - case "ccc": - return oneOf(loc.weekdays("short", true, false), 1); - - case "cccc": - return oneOf(loc.weekdays("long", true, false), 1); - // offset/zone - - case "Z": - case "ZZ": - return offset(new RegExp(`([+-]${oneOrTwo.source})(?::(${two.source}))?`), 2); - - case "ZZZ": - return offset(new RegExp(`([+-]${oneOrTwo.source})(${two.source})?`), 2); - // we don't support ZZZZ (PST) or ZZZZZ (Pacific Standard Time) in parsing - // because we don't have any way to figure out what they are - - case "z": - return simple(/[a-z_+-/]{1,256}?/i); - - default: - return literal(t); - } - }; - - const unit = unitate(token) || { - invalidReason: MISSING_FTP - }; - unit.token = token; - return unit; -} - -const partTypeStyleToTokenVal = { - year: { - "2-digit": "yy", - numeric: "yyyyy" - }, - month: { - numeric: "M", - "2-digit": "MM", - short: "MMM", - long: "MMMM" - }, - day: { - numeric: "d", - "2-digit": "dd" - }, - weekday: { - short: "EEE", - long: "EEEE" - }, - dayperiod: "a", - dayPeriod: "a", - hour: { - numeric: "h", - "2-digit": "hh" - }, - minute: { - numeric: "m", - "2-digit": "mm" - }, - second: { - numeric: "s", - "2-digit": "ss" - } -}; - -function tokenForPart(part, locale, formatOpts) { - const { - type, - value - } = part; - - if (type === "literal") { - return { - literal: true, - val: value - }; - } - - const style = formatOpts[type]; - let val = partTypeStyleToTokenVal[type]; - - if (typeof val === "object") { - val = val[style]; - } - - if (val) { - return { - literal: false, - val - }; - } - - return undefined; -} - -function buildRegex(units) { - const re = units.map(u => u.regex).reduce((f, r) => `${f}(${r.source})`, ""); - return [`^${re}$`, units]; -} - -function match(input, regex, handlers) { - const matches = input.match(regex); - - if (matches) { - const all = {}; - let matchIndex = 1; - - for (const i in handlers) { - if (hasOwnProperty(handlers, i)) { - const h = handlers[i], - groups = h.groups ? h.groups + 1 : 1; - - if (!h.literal && h.token) { - all[h.token.val[0]] = h.deser(matches.slice(matchIndex, matchIndex + groups)); - } - - matchIndex += groups; - } - } - - return [matches, all]; - } else { - return [matches, {}]; - } -} - -function dateTimeFromMatches(matches) { - const toField = token => { - switch (token) { - case "S": - return "millisecond"; - - case "s": - return "second"; - - case "m": - return "minute"; - - case "h": - case "H": - return "hour"; - - case "d": - return "day"; - - case "o": - return "ordinal"; - - case "L": - case "M": - return "month"; - - case "y": - return "year"; - - case "E": - case "c": - return "weekday"; - - case "W": - return "weekNumber"; - - case "k": - return "weekYear"; - - case "q": - return "quarter"; - - default: - return null; - } - }; - - let zone; - - if (!isUndefined(matches.Z)) { - zone = new FixedOffsetZone(matches.Z); - } else if (!isUndefined(matches.z)) { - zone = IANAZone.create(matches.z); - } else { - zone = null; - } - - if (!isUndefined(matches.q)) { - matches.M = (matches.q - 1) * 3 + 1; - } - - if (!isUndefined(matches.h)) { - if (matches.h < 12 && matches.a === 1) { - matches.h += 12; - } else if (matches.h === 12 && matches.a === 0) { - matches.h = 0; - } - } - - if (matches.G === 0 && matches.y) { - matches.y = -matches.y; - } - - if (!isUndefined(matches.u)) { - matches.S = parseMillis(matches.u); - } - - const vals = Object.keys(matches).reduce((r, k) => { - const f = toField(k); - - if (f) { - r[f] = matches[k]; - } - - return r; - }, {}); - return [vals, zone]; -} - -let dummyDateTimeCache = null; - -function getDummyDateTime() { - if (!dummyDateTimeCache) { - dummyDateTimeCache = DateTime$1.fromMillis(1555555555555); - } - - return dummyDateTimeCache; -} - -function maybeExpandMacroToken(token, locale) { - if (token.literal) { - return token; - } - - const formatOpts = Formatter.macroTokenToFormatOpts(token.val); - - if (!formatOpts) { - return token; - } - - const formatter = Formatter.create(locale, formatOpts); - const parts = formatter.formatDateTimeParts(getDummyDateTime()); - const tokens = parts.map(p => tokenForPart(p, locale, formatOpts)); - - if (tokens.includes(undefined)) { - return token; - } - - return tokens; -} - -function expandMacroTokens(tokens, locale) { - return Array.prototype.concat(...tokens.map(t => maybeExpandMacroToken(t, locale))); -} -/** - * @private - */ - - -function explainFromTokens(locale, input, format) { - const tokens = expandMacroTokens(Formatter.parseFormat(format), locale), - units = tokens.map(t => unitForToken(t, locale)), - disqualifyingUnit = units.find(t => t.invalidReason); - - if (disqualifyingUnit) { - return { - input, - tokens, - invalidReason: disqualifyingUnit.invalidReason - }; - } else { - const [regexString, handlers] = buildRegex(units), - regex = RegExp(regexString, "i"), - [rawMatches, matches] = match(input, regex, handlers), - [result, zone] = matches ? dateTimeFromMatches(matches) : [null, null]; - - if (hasOwnProperty(matches, "a") && hasOwnProperty(matches, "H")) { - throw new ConflictingSpecificationError("Can't include meridiem when specifying 24-hour format"); - } - - return { - input, - tokens, - regex, - rawMatches, - matches, - result, - zone - }; - } -} -function parseFromTokens(locale, input, format) { - const { - result, - zone, - invalidReason - } = explainFromTokens(locale, input, format); - return [result, zone, invalidReason]; -} - -const nonLeapLadder = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334], - leapLadder = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335]; - -function unitOutOfRange(unit, value) { - return new Invalid("unit out of range", `you specified ${value} (of type ${typeof value}) as a ${unit}, which is invalid`); -} - -function dayOfWeek(year, month, day) { - const js = new Date(Date.UTC(year, month - 1, day)).getUTCDay(); - return js === 0 ? 7 : js; -} - -function computeOrdinal(year, month, day) { - return day + (isLeapYear(year) ? leapLadder : nonLeapLadder)[month - 1]; -} - -function uncomputeOrdinal(year, ordinal) { - const table = isLeapYear(year) ? leapLadder : nonLeapLadder, - month0 = table.findIndex(i => i < ordinal), - day = ordinal - table[month0]; - return { - month: month0 + 1, - day - }; -} -/** - * @private - */ - - -function gregorianToWeek(gregObj) { - const { - year, - month, - day - } = gregObj, - ordinal = computeOrdinal(year, month, day), - weekday = dayOfWeek(year, month, day); - let weekNumber = Math.floor((ordinal - weekday + 10) / 7), - weekYear; - - if (weekNumber < 1) { - weekYear = year - 1; - weekNumber = weeksInWeekYear(weekYear); - } else if (weekNumber > weeksInWeekYear(year)) { - weekYear = year + 1; - weekNumber = 1; - } else { - weekYear = year; - } - - return Object.assign({ - weekYear, - weekNumber, - weekday - }, timeObject(gregObj)); -} -function weekToGregorian(weekData) { - const { - weekYear, - weekNumber, - weekday - } = weekData, - weekdayOfJan4 = dayOfWeek(weekYear, 1, 4), - yearInDays = daysInYear(weekYear); - let ordinal = weekNumber * 7 + weekday - weekdayOfJan4 - 3, - year; - - if (ordinal < 1) { - year = weekYear - 1; - ordinal += daysInYear(year); - } else if (ordinal > yearInDays) { - year = weekYear + 1; - ordinal -= daysInYear(weekYear); - } else { - year = weekYear; - } - - const { - month, - day - } = uncomputeOrdinal(year, ordinal); - return Object.assign({ - year, - month, - day - }, timeObject(weekData)); -} -function gregorianToOrdinal(gregData) { - const { - year, - month, - day - } = gregData, - ordinal = computeOrdinal(year, month, day); - return Object.assign({ - year, - ordinal - }, timeObject(gregData)); -} -function ordinalToGregorian(ordinalData) { - const { - year, - ordinal - } = ordinalData, - { - month, - day - } = uncomputeOrdinal(year, ordinal); - return Object.assign({ - year, - month, - day - }, timeObject(ordinalData)); -} -function hasInvalidWeekData(obj) { - const validYear = isInteger(obj.weekYear), - validWeek = integerBetween(obj.weekNumber, 1, weeksInWeekYear(obj.weekYear)), - validWeekday = integerBetween(obj.weekday, 1, 7); - - if (!validYear) { - return unitOutOfRange("weekYear", obj.weekYear); - } else if (!validWeek) { - return unitOutOfRange("week", obj.week); - } else if (!validWeekday) { - return unitOutOfRange("weekday", obj.weekday); - } else return false; -} -function hasInvalidOrdinalData(obj) { - const validYear = isInteger(obj.year), - validOrdinal = integerBetween(obj.ordinal, 1, daysInYear(obj.year)); - - if (!validYear) { - return unitOutOfRange("year", obj.year); - } else if (!validOrdinal) { - return unitOutOfRange("ordinal", obj.ordinal); - } else return false; -} -function hasInvalidGregorianData(obj) { - const validYear = isInteger(obj.year), - validMonth = integerBetween(obj.month, 1, 12), - validDay = integerBetween(obj.day, 1, daysInMonth(obj.year, obj.month)); - - if (!validYear) { - return unitOutOfRange("year", obj.year); - } else if (!validMonth) { - return unitOutOfRange("month", obj.month); - } else if (!validDay) { - return unitOutOfRange("day", obj.day); - } else return false; -} -function hasInvalidTimeData(obj) { - const { - hour, - minute, - second, - millisecond - } = obj; - const validHour = integerBetween(hour, 0, 23) || hour === 24 && minute === 0 && second === 0 && millisecond === 0, - validMinute = integerBetween(minute, 0, 59), - validSecond = integerBetween(second, 0, 59), - validMillisecond = integerBetween(millisecond, 0, 999); - - if (!validHour) { - return unitOutOfRange("hour", hour); - } else if (!validMinute) { - return unitOutOfRange("minute", minute); - } else if (!validSecond) { - return unitOutOfRange("second", second); - } else if (!validMillisecond) { - return unitOutOfRange("millisecond", millisecond); - } else return false; -} - -const INVALID$2 = "Invalid DateTime"; -const MAX_DATE = 8.64e15; - -function unsupportedZone(zone) { - return new Invalid("unsupported zone", `the zone "${zone.name}" is not supported`); -} // we cache week data on the DT object and this intermediates the cache - - -function possiblyCachedWeekData(dt) { - if (dt.weekData === null) { - dt.weekData = gregorianToWeek(dt.c); - } - - return dt.weekData; -} // clone really means, "make a new object with these modifications". all "setters" really use this -// to create a new object while only changing some of the properties - - -function clone$1(inst, alts) { - const current = { - ts: inst.ts, - zone: inst.zone, - c: inst.c, - o: inst.o, - loc: inst.loc, - invalid: inst.invalid - }; - return new DateTime$1(Object.assign({}, current, alts, { - old: current - })); -} // find the right offset a given local time. The o input is our guess, which determines which -// offset we'll pick in ambiguous cases (e.g. there are two 3 AMs b/c Fallback DST) - - -function fixOffset(localTS, o, tz) { - // Our UTC time is just a guess because our offset is just a guess - let utcGuess = localTS - o * 60 * 1000; // Test whether the zone matches the offset for this ts - - const o2 = tz.offset(utcGuess); // If so, offset didn't change and we're done - - if (o === o2) { - return [utcGuess, o]; - } // If not, change the ts by the difference in the offset - - - utcGuess -= (o2 - o) * 60 * 1000; // If that gives us the local time we want, we're done - - const o3 = tz.offset(utcGuess); - - if (o2 === o3) { - return [utcGuess, o2]; - } // If it's different, we're in a hole time. The offset has changed, but the we don't adjust the time - - - return [localTS - Math.min(o2, o3) * 60 * 1000, Math.max(o2, o3)]; -} // convert an epoch timestamp into a calendar object with the given offset - - -function tsToObj(ts, offset) { - ts += offset * 60 * 1000; - const d = new Date(ts); - return { - year: d.getUTCFullYear(), - month: d.getUTCMonth() + 1, - day: d.getUTCDate(), - hour: d.getUTCHours(), - minute: d.getUTCMinutes(), - second: d.getUTCSeconds(), - millisecond: d.getUTCMilliseconds() - }; -} // convert a calendar object to a epoch timestamp - - -function objToTS(obj, offset, zone) { - return fixOffset(objToLocalTS(obj), offset, zone); -} // create a new DT instance by adding a duration, adjusting for DSTs - - -function adjustTime(inst, dur) { - const oPre = inst.o, - year = inst.c.year + Math.trunc(dur.years), - month = inst.c.month + Math.trunc(dur.months) + Math.trunc(dur.quarters) * 3, - c = Object.assign({}, inst.c, { - year, - month, - day: Math.min(inst.c.day, daysInMonth(year, month)) + Math.trunc(dur.days) + Math.trunc(dur.weeks) * 7 - }), - millisToAdd = Duration.fromObject({ - years: dur.years - Math.trunc(dur.years), - quarters: dur.quarters - Math.trunc(dur.quarters), - months: dur.months - Math.trunc(dur.months), - weeks: dur.weeks - Math.trunc(dur.weeks), - days: dur.days - Math.trunc(dur.days), - hours: dur.hours, - minutes: dur.minutes, - seconds: dur.seconds, - milliseconds: dur.milliseconds - }).as("milliseconds"), - localTS = objToLocalTS(c); - let [ts, o] = fixOffset(localTS, oPre, inst.zone); - - if (millisToAdd !== 0) { - ts += millisToAdd; // that could have changed the offset by going over a DST, but we want to keep the ts the same - - o = inst.zone.offset(ts); - } - - return { - ts, - o - }; -} // helper useful in turning the results of parsing into real dates -// by handling the zone options - - -function parseDataToDateTime(parsed, parsedZone, opts, format, text) { - const { - setZone, - zone - } = opts; - - if (parsed && Object.keys(parsed).length !== 0) { - const interpretationZone = parsedZone || zone, - inst = DateTime$1.fromObject(Object.assign(parsed, opts, { - zone: interpretationZone, - // setZone is a valid option in the calling methods, but not in fromObject - setZone: undefined - })); - return setZone ? inst : inst.setZone(zone); - } else { - return DateTime$1.invalid(new Invalid("unparsable", `the input "${text}" can't be parsed as ${format}`)); - } -} // if you want to output a technical format (e.g. RFC 2822), this helper -// helps handle the details - - -function toTechFormat(dt, format, allowZ = true) { - return dt.isValid ? Formatter.create(Locale.create("en-US"), { - allowZ, - forceSimple: true - }).formatDateTimeFromString(dt, format) : null; -} // technical time formats (e.g. the time part of ISO 8601), take some options -// and this commonizes their handling - - -function toTechTimeFormat(dt, { - suppressSeconds = false, - suppressMilliseconds = false, - includeOffset, - includePrefix = false, - includeZone = false, - spaceZone = false, - format = "extended" -}) { - let fmt = format === "basic" ? "HHmm" : "HH:mm"; - - if (!suppressSeconds || dt.second !== 0 || dt.millisecond !== 0) { - fmt += format === "basic" ? "ss" : ":ss"; - - if (!suppressMilliseconds || dt.millisecond !== 0) { - fmt += ".SSS"; - } - } - - if ((includeZone || includeOffset) && spaceZone) { - fmt += " "; - } - - if (includeZone) { - fmt += "z"; - } else if (includeOffset) { - fmt += format === "basic" ? "ZZZ" : "ZZ"; - } - - let str = toTechFormat(dt, fmt); - - if (includePrefix) { - str = "T" + str; - } - - return str; -} // defaults for unspecified units in the supported calendars - - -const defaultUnitValues = { - month: 1, - day: 1, - hour: 0, - minute: 0, - second: 0, - millisecond: 0 -}, - defaultWeekUnitValues = { - weekNumber: 1, - weekday: 1, - hour: 0, - minute: 0, - second: 0, - millisecond: 0 -}, - defaultOrdinalUnitValues = { - ordinal: 1, - hour: 0, - minute: 0, - second: 0, - millisecond: 0 -}; // Units in the supported calendars, sorted by bigness - -const orderedUnits$1 = ["year", "month", "day", "hour", "minute", "second", "millisecond"], - orderedWeekUnits = ["weekYear", "weekNumber", "weekday", "hour", "minute", "second", "millisecond"], - orderedOrdinalUnits = ["year", "ordinal", "hour", "minute", "second", "millisecond"]; // standardize case and plurality in units - -function normalizeUnit(unit) { - const normalized = { - year: "year", - years: "year", - month: "month", - months: "month", - day: "day", - days: "day", - hour: "hour", - hours: "hour", - minute: "minute", - minutes: "minute", - quarter: "quarter", - quarters: "quarter", - second: "second", - seconds: "second", - millisecond: "millisecond", - milliseconds: "millisecond", - weekday: "weekday", - weekdays: "weekday", - weeknumber: "weekNumber", - weeksnumber: "weekNumber", - weeknumbers: "weekNumber", - weekyear: "weekYear", - weekyears: "weekYear", - ordinal: "ordinal" - }[unit.toLowerCase()]; - if (!normalized) throw new InvalidUnitError(unit); - return normalized; -} // this is a dumbed down version of fromObject() that runs about 60% faster -// but doesn't do any validation, makes a bunch of assumptions about what units -// are present, and so on. - - -function quickDT(obj, zone) { - // assume we have the higher-order units - for (const u of orderedUnits$1) { - if (isUndefined(obj[u])) { - obj[u] = defaultUnitValues[u]; - } - } - - const invalid = hasInvalidGregorianData(obj) || hasInvalidTimeData(obj); - - if (invalid) { - return DateTime$1.invalid(invalid); - } - - const tsNow = Settings.now(), - offsetProvis = zone.offset(tsNow), - [ts, o] = objToTS(obj, offsetProvis, zone); - return new DateTime$1({ - ts, - zone, - o - }); -} - -function diffRelative(start, end, opts) { - const round = isUndefined(opts.round) ? true : opts.round, - format = (c, unit) => { - c = roundTo(c, round || opts.calendary ? 0 : 2, true); - const formatter = end.loc.clone(opts).relFormatter(opts); - return formatter.format(c, unit); - }, - differ = unit => { - if (opts.calendary) { - if (!end.hasSame(start, unit)) { - return end.startOf(unit).diff(start.startOf(unit), unit).get(unit); - } else return 0; - } else { - return end.diff(start, unit).get(unit); - } - }; - - if (opts.unit) { - return format(differ(opts.unit), opts.unit); - } - - for (const unit of opts.units) { - const count = differ(unit); - - if (Math.abs(count) >= 1) { - return format(count, unit); - } - } - - return format(0, opts.units[opts.units.length - 1]); -} -/** - * A DateTime is an immutable data structure representing a specific date and time and accompanying methods. It contains class and instance methods for creating, parsing, interrogating, transforming, and formatting them. - * - * A DateTime comprises of: - * * A timestamp. Each DateTime instance refers to a specific millisecond of the Unix epoch. - * * A time zone. Each instance is considered in the context of a specific zone (by default the local system's zone). - * * Configuration properties that effect how output strings are formatted, such as `locale`, `numberingSystem`, and `outputCalendar`. - * - * Here is a brief overview of the most commonly used functionality it provides: - * - * * **Creation**: To create a DateTime from its components, use one of its factory class methods: {@link local}, {@link utc}, and (most flexibly) {@link fromObject}. To create one from a standard string format, use {@link fromISO}, {@link fromHTTP}, and {@link fromRFC2822}. To create one from a custom string format, use {@link fromFormat}. To create one from a native JS date, use {@link fromJSDate}. - * * **Gregorian calendar and time**: To examine the Gregorian properties of a DateTime individually (i.e as opposed to collectively through {@link toObject}), use the {@link year}, {@link month}, - * {@link day}, {@link hour}, {@link minute}, {@link second}, {@link millisecond} accessors. - * * **Week calendar**: For ISO week calendar attributes, see the {@link weekYear}, {@link weekNumber}, and {@link weekday} accessors. - * * **Configuration** See the {@link locale} and {@link numberingSystem} accessors. - * * **Transformation**: To transform the DateTime into other DateTimes, use {@link set}, {@link reconfigure}, {@link setZone}, {@link setLocale}, {@link plus}, {@link minus}, {@link endOf}, {@link startOf}, {@link toUTC}, and {@link toLocal}. - * * **Output**: To convert the DateTime to other representations, use the {@link toRelative}, {@link toRelativeCalendar}, {@link toJSON}, {@link toISO}, {@link toHTTP}, {@link toObject}, {@link toRFC2822}, {@link toString}, {@link toLocaleString}, {@link toFormat}, {@link toMillis} and {@link toJSDate}. - * - * There's plenty others documented below. In addition, for more information on subtler topics like internationalization, time zones, alternative calendars, validity, and so on, see the external documentation. - */ - - -class DateTime$1 { - /** - * @access private - */ - constructor(config) { - const zone = config.zone || Settings.defaultZone; - let invalid = config.invalid || (Number.isNaN(config.ts) ? new Invalid("invalid input") : null) || (!zone.isValid ? unsupportedZone(zone) : null); - /** - * @access private - */ - - this.ts = isUndefined(config.ts) ? Settings.now() : config.ts; - let c = null, - o = null; - - if (!invalid) { - const unchanged = config.old && config.old.ts === this.ts && config.old.zone.equals(zone); - - if (unchanged) { - [c, o] = [config.old.c, config.old.o]; - } else { - const ot = zone.offset(this.ts); - c = tsToObj(this.ts, ot); - invalid = Number.isNaN(c.year) ? new Invalid("invalid input") : null; - c = invalid ? null : c; - o = invalid ? null : ot; - } - } - /** - * @access private - */ - - - this._zone = zone; - /** - * @access private - */ - - this.loc = config.loc || Locale.create(); - /** - * @access private - */ - - this.invalid = invalid; - /** - * @access private - */ - - this.weekData = null; - /** - * @access private - */ - - this.c = c; - /** - * @access private - */ - - this.o = o; - /** - * @access private - */ - - this.isLuxonDateTime = true; - } // CONSTRUCT - - /** - * Create a DateTime for the current instant, in the system's time zone. - * - * Use Settings to override these default values if needed. - * @example DateTime.now().toISO() //~> now in the ISO format - * @return {DateTime} - */ - - - static now() { - return new DateTime$1({}); - } - /** - * Create a local DateTime - * @param {number} [year] - The calendar year. If omitted (as in, call `local()` with no arguments), the current time will be used - * @param {number} [month=1] - The month, 1-indexed - * @param {number} [day=1] - The day of the month, 1-indexed - * @param {number} [hour=0] - The hour of the day, in 24-hour time - * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59 - * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59 - * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999 - * @example DateTime.local() //~> now - * @example DateTime.local(2017) //~> 2017-01-01T00:00:00 - * @example DateTime.local(2017, 3) //~> 2017-03-01T00:00:00 - * @example DateTime.local(2017, 3, 12) //~> 2017-03-12T00:00:00 - * @example DateTime.local(2017, 3, 12, 5) //~> 2017-03-12T05:00:00 - * @example DateTime.local(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00 - * @example DateTime.local(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10 - * @example DateTime.local(2017, 3, 12, 5, 45, 10, 765) //~> 2017-03-12T05:45:10.765 - * @return {DateTime} - */ - - - static local(year, month, day, hour, minute, second, millisecond) { - if (isUndefined(year)) { - return new DateTime$1({}); - } else { - return quickDT({ - year, - month, - day, - hour, - minute, - second, - millisecond - }, Settings.defaultZone); - } - } - /** - * Create a DateTime in UTC - * @param {number} [year] - The calendar year. If omitted (as in, call `utc()` with no arguments), the current time will be used - * @param {number} [month=1] - The month, 1-indexed - * @param {number} [day=1] - The day of the month - * @param {number} [hour=0] - The hour of the day, in 24-hour time - * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59 - * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59 - * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999 - * @example DateTime.utc() //~> now - * @example DateTime.utc(2017) //~> 2017-01-01T00:00:00Z - * @example DateTime.utc(2017, 3) //~> 2017-03-01T00:00:00Z - * @example DateTime.utc(2017, 3, 12) //~> 2017-03-12T00:00:00Z - * @example DateTime.utc(2017, 3, 12, 5) //~> 2017-03-12T05:00:00Z - * @example DateTime.utc(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00Z - * @example DateTime.utc(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10Z - * @example DateTime.utc(2017, 3, 12, 5, 45, 10, 765) //~> 2017-03-12T05:45:10.765Z - * @return {DateTime} - */ - - - static utc(year, month, day, hour, minute, second, millisecond) { - if (isUndefined(year)) { - return new DateTime$1({ - ts: Settings.now(), - zone: FixedOffsetZone.utcInstance - }); - } else { - return quickDT({ - year, - month, - day, - hour, - minute, - second, - millisecond - }, FixedOffsetZone.utcInstance); - } - } - /** - * Create a DateTime from a JavaScript Date object. Uses the default zone. - * @param {Date} date - a JavaScript Date object - * @param {Object} options - configuration options for the DateTime - * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into - * @return {DateTime} - */ - - - static fromJSDate(date, options = {}) { - const ts = isDate(date) ? date.valueOf() : NaN; - - if (Number.isNaN(ts)) { - return DateTime$1.invalid("invalid input"); - } - - const zoneToUse = normalizeZone(options.zone, Settings.defaultZone); - - if (!zoneToUse.isValid) { - return DateTime$1.invalid(unsupportedZone(zoneToUse)); - } - - return new DateTime$1({ - ts: ts, - zone: zoneToUse, - loc: Locale.fromObject(options) - }); - } - /** - * Create a DateTime from a number of milliseconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone. - * @param {number} milliseconds - a number of milliseconds since 1970 UTC - * @param {Object} options - configuration options for the DateTime - * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into - * @param {string} [options.locale] - a locale to set on the resulting DateTime instance - * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance - * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance - * @return {DateTime} - */ - - - static fromMillis(milliseconds, options = {}) { - if (!isNumber$1(milliseconds)) { - throw new InvalidArgumentError(`fromMillis requires a numerical input, but received a ${typeof milliseconds} with value ${milliseconds}`); - } else if (milliseconds < -MAX_DATE || milliseconds > MAX_DATE) { - // this isn't perfect because because we can still end up out of range because of additional shifting, but it's a start - return DateTime$1.invalid("Timestamp out of range"); - } else { - return new DateTime$1({ - ts: milliseconds, - zone: normalizeZone(options.zone, Settings.defaultZone), - loc: Locale.fromObject(options) - }); - } - } - /** - * Create a DateTime from a number of seconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone. - * @param {number} seconds - a number of seconds since 1970 UTC - * @param {Object} options - configuration options for the DateTime - * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into - * @param {string} [options.locale] - a locale to set on the resulting DateTime instance - * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance - * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance - * @return {DateTime} - */ - - - static fromSeconds(seconds, options = {}) { - if (!isNumber$1(seconds)) { - throw new InvalidArgumentError("fromSeconds requires a numerical input"); - } else { - return new DateTime$1({ - ts: seconds * 1000, - zone: normalizeZone(options.zone, Settings.defaultZone), - loc: Locale.fromObject(options) - }); - } - } - /** - * Create a DateTime from a JavaScript object with keys like 'year' and 'hour' with reasonable defaults. - * @param {Object} obj - the object to create the DateTime from - * @param {number} obj.year - a year, such as 1987 - * @param {number} obj.month - a month, 1-12 - * @param {number} obj.day - a day of the month, 1-31, depending on the month - * @param {number} obj.ordinal - day of the year, 1-365 or 366 - * @param {number} obj.weekYear - an ISO week year - * @param {number} obj.weekNumber - an ISO week number, between 1 and 52 or 53, depending on the year - * @param {number} obj.weekday - an ISO weekday, 1-7, where 1 is Monday and 7 is Sunday - * @param {number} obj.hour - hour of the day, 0-23 - * @param {number} obj.minute - minute of the hour, 0-59 - * @param {number} obj.second - second of the minute, 0-59 - * @param {number} obj.millisecond - millisecond of the second, 0-999 - * @param {string|Zone} [obj.zone='local'] - interpret the numbers in the context of a particular zone. Can take any value taken as the first argument to setZone() - * @param {string} [obj.locale='system's locale'] - a locale to set on the resulting DateTime instance - * @param {string} obj.outputCalendar - the output calendar to set on the resulting DateTime instance - * @param {string} obj.numberingSystem - the numbering system to set on the resulting DateTime instance - * @example DateTime.fromObject({ year: 1982, month: 5, day: 25}).toISODate() //=> '1982-05-25' - * @example DateTime.fromObject({ year: 1982 }).toISODate() //=> '1982-01-01' - * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }) //~> today at 10:26:06 - * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6, zone: 'utc' }), - * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6, zone: 'local' }) - * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6, zone: 'America/New_York' }) - * @example DateTime.fromObject({ weekYear: 2016, weekNumber: 2, weekday: 3 }).toISODate() //=> '2016-01-13' - * @return {DateTime} - */ - - - static fromObject(obj) { - const zoneToUse = normalizeZone(obj.zone, Settings.defaultZone); - - if (!zoneToUse.isValid) { - return DateTime$1.invalid(unsupportedZone(zoneToUse)); - } - - const tsNow = Settings.now(), - offsetProvis = zoneToUse.offset(tsNow), - normalized = normalizeObject(obj, normalizeUnit, ["zone", "locale", "outputCalendar", "numberingSystem"]), - containsOrdinal = !isUndefined(normalized.ordinal), - containsGregorYear = !isUndefined(normalized.year), - containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day), - containsGregor = containsGregorYear || containsGregorMD, - definiteWeekDef = normalized.weekYear || normalized.weekNumber, - loc = Locale.fromObject(obj); // cases: - // just a weekday -> this week's instance of that weekday, no worries - // (gregorian data or ordinal) + (weekYear or weekNumber) -> error - // (gregorian month or day) + ordinal -> error - // otherwise just use weeks or ordinals or gregorian, depending on what's specified - - if ((containsGregor || containsOrdinal) && definiteWeekDef) { - throw new ConflictingSpecificationError("Can't mix weekYear/weekNumber units with year/month/day or ordinals"); - } - - if (containsGregorMD && containsOrdinal) { - throw new ConflictingSpecificationError("Can't mix ordinal dates with month/day"); - } - - const useWeekData = definiteWeekDef || normalized.weekday && !containsGregor; // configure ourselves to deal with gregorian dates or week stuff - - let units, - defaultValues, - objNow = tsToObj(tsNow, offsetProvis); - - if (useWeekData) { - units = orderedWeekUnits; - defaultValues = defaultWeekUnitValues; - objNow = gregorianToWeek(objNow); - } else if (containsOrdinal) { - units = orderedOrdinalUnits; - defaultValues = defaultOrdinalUnitValues; - objNow = gregorianToOrdinal(objNow); - } else { - units = orderedUnits$1; - defaultValues = defaultUnitValues; - } // set default values for missing stuff - - - let foundFirst = false; - - for (const u of units) { - const v = normalized[u]; - - if (!isUndefined(v)) { - foundFirst = true; - } else if (foundFirst) { - normalized[u] = defaultValues[u]; - } else { - normalized[u] = objNow[u]; - } - } // make sure the values we have are in range - - - const higherOrderInvalid = useWeekData ? hasInvalidWeekData(normalized) : containsOrdinal ? hasInvalidOrdinalData(normalized) : hasInvalidGregorianData(normalized), - invalid = higherOrderInvalid || hasInvalidTimeData(normalized); - - if (invalid) { - return DateTime$1.invalid(invalid); - } // compute the actual time - - - const gregorian = useWeekData ? weekToGregorian(normalized) : containsOrdinal ? ordinalToGregorian(normalized) : normalized, - [tsFinal, offsetFinal] = objToTS(gregorian, offsetProvis, zoneToUse), - inst = new DateTime$1({ - ts: tsFinal, - zone: zoneToUse, - o: offsetFinal, - loc - }); // gregorian data + weekday serves only to validate - - if (normalized.weekday && containsGregor && obj.weekday !== inst.weekday) { - return DateTime$1.invalid("mismatched weekday", `you can't specify both a weekday of ${normalized.weekday} and a date of ${inst.toISO()}`); - } - - return inst; - } - /** - * Create a DateTime from an ISO 8601 string - * @param {string} text - the ISO string - * @param {Object} opts - options to affect the creation - * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the time to this zone - * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one - * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance - * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance - * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance - * @example DateTime.fromISO('2016-05-25T09:08:34.123') - * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00') - * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00', {setZone: true}) - * @example DateTime.fromISO('2016-05-25T09:08:34.123', {zone: 'utc'}) - * @example DateTime.fromISO('2016-W05-4') - * @return {DateTime} - */ - - - static fromISO(text, opts = {}) { - const [vals, parsedZone] = parseISODate(text); - return parseDataToDateTime(vals, parsedZone, opts, "ISO 8601", text); - } - /** - * Create a DateTime from an RFC 2822 string - * @param {string} text - the RFC 2822 string - * @param {Object} opts - options to affect the creation - * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since the offset is always specified in the string itself, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in. - * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one - * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance - * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance - * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance - * @example DateTime.fromRFC2822('25 Nov 2016 13:23:12 GMT') - * @example DateTime.fromRFC2822('Fri, 25 Nov 2016 13:23:12 +0600') - * @example DateTime.fromRFC2822('25 Nov 2016 13:23 Z') - * @return {DateTime} - */ - - - static fromRFC2822(text, opts = {}) { - const [vals, parsedZone] = parseRFC2822Date(text); - return parseDataToDateTime(vals, parsedZone, opts, "RFC 2822", text); - } - /** - * Create a DateTime from an HTTP header date - * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1 - * @param {string} text - the HTTP header date - * @param {Object} opts - options to affect the creation - * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since HTTP dates are always in UTC, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in. - * @param {boolean} [opts.setZone=false] - override the zone with the fixed-offset zone specified in the string. For HTTP dates, this is always UTC, so this option is equivalent to setting the `zone` option to 'utc', but this option is included for consistency with similar methods. - * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance - * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance - * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance - * @example DateTime.fromHTTP('Sun, 06 Nov 1994 08:49:37 GMT') - * @example DateTime.fromHTTP('Sunday, 06-Nov-94 08:49:37 GMT') - * @example DateTime.fromHTTP('Sun Nov 6 08:49:37 1994') - * @return {DateTime} - */ - - - static fromHTTP(text, opts = {}) { - const [vals, parsedZone] = parseHTTPDate(text); - return parseDataToDateTime(vals, parsedZone, opts, "HTTP", opts); - } - /** - * Create a DateTime from an input string and format string. - * Defaults to en-US if no locale has been specified, regardless of the system's locale. - * @see https://moment.github.io/luxon/docs/manual/parsing.html#table-of-tokens - * @param {string} text - the string to parse - * @param {string} fmt - the format the string is expected to be in (see the link below for the formats) - * @param {Object} opts - options to affect the creation - * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone - * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one - * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale - * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system - * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance - * @return {DateTime} - */ - - - static fromFormat(text, fmt, opts = {}) { - if (isUndefined(text) || isUndefined(fmt)) { - throw new InvalidArgumentError("fromFormat requires an input string and a format"); - } - - const { - locale = null, - numberingSystem = null - } = opts, - localeToUse = Locale.fromOpts({ - locale, - numberingSystem, - defaultToEN: true - }), - [vals, parsedZone, invalid] = parseFromTokens(localeToUse, text, fmt); - - if (invalid) { - return DateTime$1.invalid(invalid); - } else { - return parseDataToDateTime(vals, parsedZone, opts, `format ${fmt}`, text); - } - } - /** - * @deprecated use fromFormat instead - */ - - - static fromString(text, fmt, opts = {}) { - return DateTime$1.fromFormat(text, fmt, opts); - } - /** - * Create a DateTime from a SQL date, time, or datetime - * Defaults to en-US if no locale has been specified, regardless of the system's locale - * @param {string} text - the string to parse - * @param {Object} opts - options to affect the creation - * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone - * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one - * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale - * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system - * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance - * @example DateTime.fromSQL('2017-05-15') - * @example DateTime.fromSQL('2017-05-15 09:12:34') - * @example DateTime.fromSQL('2017-05-15 09:12:34.342') - * @example DateTime.fromSQL('2017-05-15 09:12:34.342+06:00') - * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles') - * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles', { setZone: true }) - * @example DateTime.fromSQL('2017-05-15 09:12:34.342', { zone: 'America/Los_Angeles' }) - * @example DateTime.fromSQL('09:12:34.342') - * @return {DateTime} - */ - - - static fromSQL(text, opts = {}) { - const [vals, parsedZone] = parseSQL(text); - return parseDataToDateTime(vals, parsedZone, opts, "SQL", text); - } - /** - * Create an invalid DateTime. - * @param {string} reason - simple string of why this DateTime is invalid. Should not contain parameters or anything else data-dependent - * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information - * @return {DateTime} - */ - - - static invalid(reason, explanation = null) { - if (!reason) { - throw new InvalidArgumentError("need to specify a reason the DateTime is invalid"); - } - - const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation); - - if (Settings.throwOnInvalid) { - throw new InvalidDateTimeError(invalid); - } else { - return new DateTime$1({ - invalid - }); - } - } - /** - * Check if an object is a DateTime. Works across context boundaries - * @param {object} o - * @return {boolean} - */ - - - static isDateTime(o) { - return o && o.isLuxonDateTime || false; - } // INFO - - /** - * Get the value of unit. - * @param {string} unit - a unit such as 'minute' or 'day' - * @example DateTime.local(2017, 7, 4).get('month'); //=> 7 - * @example DateTime.local(2017, 7, 4).get('day'); //=> 4 - * @return {number} - */ - - - get(unit) { - return this[unit]; - } - /** - * Returns whether the DateTime is valid. Invalid DateTimes occur when: - * * The DateTime was created from invalid calendar information, such as the 13th month or February 30 - * * The DateTime was created by an operation on another invalid date - * @type {boolean} - */ - - - get isValid() { - return this.invalid === null; - } - /** - * Returns an error code if this DateTime is invalid, or null if the DateTime is valid - * @type {string} - */ - - - get invalidReason() { - return this.invalid ? this.invalid.reason : null; - } - /** - * Returns an explanation of why this DateTime became invalid, or null if the DateTime is valid - * @type {string} - */ - - - get invalidExplanation() { - return this.invalid ? this.invalid.explanation : null; - } - /** - * Get the locale of a DateTime, such 'en-GB'. The locale is used when formatting the DateTime - * - * @type {string} - */ - - - get locale() { - return this.isValid ? this.loc.locale : null; - } - /** - * Get the numbering system of a DateTime, such 'beng'. The numbering system is used when formatting the DateTime - * - * @type {string} - */ - - - get numberingSystem() { - return this.isValid ? this.loc.numberingSystem : null; - } - /** - * Get the output calendar of a DateTime, such 'islamic'. The output calendar is used when formatting the DateTime - * - * @type {string} - */ - - - get outputCalendar() { - return this.isValid ? this.loc.outputCalendar : null; - } - /** - * Get the time zone associated with this DateTime. - * @type {Zone} - */ - - - get zone() { - return this._zone; - } - /** - * Get the name of the time zone. - * @type {string} - */ - - - get zoneName() { - return this.isValid ? this.zone.name : null; - } - /** - * Get the year - * @example DateTime.local(2017, 5, 25).year //=> 2017 - * @type {number} - */ - - - get year() { - return this.isValid ? this.c.year : NaN; - } - /** - * Get the quarter - * @example DateTime.local(2017, 5, 25).quarter //=> 2 - * @type {number} - */ - - - get quarter() { - return this.isValid ? Math.ceil(this.c.month / 3) : NaN; - } - /** - * Get the month (1-12). - * @example DateTime.local(2017, 5, 25).month //=> 5 - * @type {number} - */ - - - get month() { - return this.isValid ? this.c.month : NaN; - } - /** - * Get the day of the month (1-30ish). - * @example DateTime.local(2017, 5, 25).day //=> 25 - * @type {number} - */ - - - get day() { - return this.isValid ? this.c.day : NaN; - } - /** - * Get the hour of the day (0-23). - * @example DateTime.local(2017, 5, 25, 9).hour //=> 9 - * @type {number} - */ - - - get hour() { - return this.isValid ? this.c.hour : NaN; - } - /** - * Get the minute of the hour (0-59). - * @example DateTime.local(2017, 5, 25, 9, 30).minute //=> 30 - * @type {number} - */ - - - get minute() { - return this.isValid ? this.c.minute : NaN; - } - /** - * Get the second of the minute (0-59). - * @example DateTime.local(2017, 5, 25, 9, 30, 52).second //=> 52 - * @type {number} - */ - - - get second() { - return this.isValid ? this.c.second : NaN; - } - /** - * Get the millisecond of the second (0-999). - * @example DateTime.local(2017, 5, 25, 9, 30, 52, 654).millisecond //=> 654 - * @type {number} - */ - - - get millisecond() { - return this.isValid ? this.c.millisecond : NaN; - } - /** - * Get the week year - * @see https://en.wikipedia.org/wiki/ISO_week_date - * @example DateTime.local(2014, 11, 31).weekYear //=> 2015 - * @type {number} - */ - - - get weekYear() { - return this.isValid ? possiblyCachedWeekData(this).weekYear : NaN; - } - /** - * Get the week number of the week year (1-52ish). - * @see https://en.wikipedia.org/wiki/ISO_week_date - * @example DateTime.local(2017, 5, 25).weekNumber //=> 21 - * @type {number} - */ - - - get weekNumber() { - return this.isValid ? possiblyCachedWeekData(this).weekNumber : NaN; - } - /** - * Get the day of the week. - * 1 is Monday and 7 is Sunday - * @see https://en.wikipedia.org/wiki/ISO_week_date - * @example DateTime.local(2014, 11, 31).weekday //=> 4 - * @type {number} - */ - - - get weekday() { - return this.isValid ? possiblyCachedWeekData(this).weekday : NaN; - } - /** - * Get the ordinal (meaning the day of the year) - * @example DateTime.local(2017, 5, 25).ordinal //=> 145 - * @type {number|DateTime} - */ - - - get ordinal() { - return this.isValid ? gregorianToOrdinal(this.c).ordinal : NaN; - } - /** - * Get the human readable short month name, such as 'Oct'. - * Defaults to the system's locale if no locale has been specified - * @example DateTime.local(2017, 10, 30).monthShort //=> Oct - * @type {string} - */ - - - get monthShort() { - return this.isValid ? Info.months("short", { - locale: this.locale - })[this.month - 1] : null; - } - /** - * Get the human readable long month name, such as 'October'. - * Defaults to the system's locale if no locale has been specified - * @example DateTime.local(2017, 10, 30).monthLong //=> October - * @type {string} - */ - - - get monthLong() { - return this.isValid ? Info.months("long", { - locale: this.locale - })[this.month - 1] : null; - } - /** - * Get the human readable short weekday, such as 'Mon'. - * Defaults to the system's locale if no locale has been specified - * @example DateTime.local(2017, 10, 30).weekdayShort //=> Mon - * @type {string} - */ - - - get weekdayShort() { - return this.isValid ? Info.weekdays("short", { - locale: this.locale - })[this.weekday - 1] : null; - } - /** - * Get the human readable long weekday, such as 'Monday'. - * Defaults to the system's locale if no locale has been specified - * @example DateTime.local(2017, 10, 30).weekdayLong //=> Monday - * @type {string} - */ - - - get weekdayLong() { - return this.isValid ? Info.weekdays("long", { - locale: this.locale - })[this.weekday - 1] : null; - } - /** - * Get the UTC offset of this DateTime in minutes - * @example DateTime.now().offset //=> -240 - * @example DateTime.utc().offset //=> 0 - * @type {number} - */ - - - get offset() { - return this.isValid ? +this.o : NaN; - } - /** - * Get the short human name for the zone's current offset, for example "EST" or "EDT". - * Defaults to the system's locale if no locale has been specified - * @type {string} - */ - - - get offsetNameShort() { - if (this.isValid) { - return this.zone.offsetName(this.ts, { - format: "short", - locale: this.locale - }); - } else { - return null; - } - } - /** - * Get the long human name for the zone's current offset, for example "Eastern Standard Time" or "Eastern Daylight Time". - * Defaults to the system's locale if no locale has been specified - * @type {string} - */ - - - get offsetNameLong() { - if (this.isValid) { - return this.zone.offsetName(this.ts, { - format: "long", - locale: this.locale - }); - } else { - return null; - } - } - /** - * Get whether this zone's offset ever changes, as in a DST. - * @type {boolean} - */ - - - get isOffsetFixed() { - return this.isValid ? this.zone.universal : null; - } - /** - * Get whether the DateTime is in a DST. - * @type {boolean} - */ - - - get isInDST() { - if (this.isOffsetFixed) { - return false; - } else { - return this.offset > this.set({ - month: 1 - }).offset || this.offset > this.set({ - month: 5 - }).offset; - } - } - /** - * Returns true if this DateTime is in a leap year, false otherwise - * @example DateTime.local(2016).isInLeapYear //=> true - * @example DateTime.local(2013).isInLeapYear //=> false - * @type {boolean} - */ - - - get isInLeapYear() { - return isLeapYear(this.year); - } - /** - * Returns the number of days in this DateTime's month - * @example DateTime.local(2016, 2).daysInMonth //=> 29 - * @example DateTime.local(2016, 3).daysInMonth //=> 31 - * @type {number} - */ - - - get daysInMonth() { - return daysInMonth(this.year, this.month); - } - /** - * Returns the number of days in this DateTime's year - * @example DateTime.local(2016).daysInYear //=> 366 - * @example DateTime.local(2013).daysInYear //=> 365 - * @type {number} - */ - - - get daysInYear() { - return this.isValid ? daysInYear(this.year) : NaN; - } - /** - * Returns the number of weeks in this DateTime's year - * @see https://en.wikipedia.org/wiki/ISO_week_date - * @example DateTime.local(2004).weeksInWeekYear //=> 53 - * @example DateTime.local(2013).weeksInWeekYear //=> 52 - * @type {number} - */ - - - get weeksInWeekYear() { - return this.isValid ? weeksInWeekYear(this.weekYear) : NaN; - } - /** - * Returns the resolved Intl options for this DateTime. - * This is useful in understanding the behavior of formatting methods - * @param {Object} opts - the same options as toLocaleString - * @return {Object} - */ - - - resolvedLocaleOpts(opts = {}) { - const { - locale, - numberingSystem, - calendar - } = Formatter.create(this.loc.clone(opts), opts).resolvedOptions(this); - return { - locale, - numberingSystem, - outputCalendar: calendar - }; - } // TRANSFORM - - /** - * "Set" the DateTime's zone to UTC. Returns a newly-constructed DateTime. - * - * Equivalent to {@link setZone}('utc') - * @param {number} [offset=0] - optionally, an offset from UTC in minutes - * @param {Object} [opts={}] - options to pass to `setZone()` - * @return {DateTime} - */ - - - toUTC(offset = 0, opts = {}) { - return this.setZone(FixedOffsetZone.instance(offset), opts); - } - /** - * "Set" the DateTime's zone to the host's local zone. Returns a newly-constructed DateTime. - * - * Equivalent to `setZone('local')` - * @return {DateTime} - */ - - - toLocal() { - return this.setZone(Settings.defaultZone); - } - /** - * "Set" the DateTime's zone to specified zone. Returns a newly-constructed DateTime. - * - * By default, the setter keeps the underlying time the same (as in, the same timestamp), but the new instance will report different local times and consider DSTs when making computations, as with {@link plus}. You may wish to use {@link toLocal} and {@link toUTC} which provide simple convenience wrappers for commonly used zones. - * @param {string|Zone} [zone='local'] - a zone identifier. As a string, that can be any IANA zone supported by the host environment, or a fixed-offset name of the form 'UTC+3', or the strings 'local' or 'utc'. You may also supply an instance of a {@link Zone} class. - * @param {Object} opts - options - * @param {boolean} [opts.keepLocalTime=false] - If true, adjust the underlying time so that the local time stays the same, but in the target zone. You should rarely need this. - * @return {DateTime} - */ - - - setZone(zone, { - keepLocalTime = false, - keepCalendarTime = false - } = {}) { - zone = normalizeZone(zone, Settings.defaultZone); - - if (zone.equals(this.zone)) { - return this; - } else if (!zone.isValid) { - return DateTime$1.invalid(unsupportedZone(zone)); - } else { - let newTS = this.ts; - - if (keepLocalTime || keepCalendarTime) { - const offsetGuess = zone.offset(this.ts); - const asObj = this.toObject(); - [newTS] = objToTS(asObj, offsetGuess, zone); - } - - return clone$1(this, { - ts: newTS, - zone - }); - } - } - /** - * "Set" the locale, numberingSystem, or outputCalendar. Returns a newly-constructed DateTime. - * @param {Object} properties - the properties to set - * @example DateTime.local(2017, 5, 25).reconfigure({ locale: 'en-GB' }) - * @return {DateTime} - */ - - - reconfigure({ - locale, - numberingSystem, - outputCalendar - } = {}) { - const loc = this.loc.clone({ - locale, - numberingSystem, - outputCalendar - }); - return clone$1(this, { - loc - }); - } - /** - * "Set" the locale. Returns a newly-constructed DateTime. - * Just a convenient alias for reconfigure({ locale }) - * @example DateTime.local(2017, 5, 25).setLocale('en-GB') - * @return {DateTime} - */ - - - setLocale(locale) { - return this.reconfigure({ - locale - }); - } - /** - * "Set" the values of specified units. Returns a newly-constructed DateTime. - * You can only set units with this method; for "setting" metadata, see {@link reconfigure} and {@link setZone}. - * @param {Object} values - a mapping of units to numbers - * @example dt.set({ year: 2017 }) - * @example dt.set({ hour: 8, minute: 30 }) - * @example dt.set({ weekday: 5 }) - * @example dt.set({ year: 2005, ordinal: 234 }) - * @return {DateTime} - */ - - - set(values) { - if (!this.isValid) return this; - const normalized = normalizeObject(values, normalizeUnit, []), - settingWeekStuff = !isUndefined(normalized.weekYear) || !isUndefined(normalized.weekNumber) || !isUndefined(normalized.weekday); - let mixed; - - if (settingWeekStuff) { - mixed = weekToGregorian(Object.assign(gregorianToWeek(this.c), normalized)); - } else if (!isUndefined(normalized.ordinal)) { - mixed = ordinalToGregorian(Object.assign(gregorianToOrdinal(this.c), normalized)); - } else { - mixed = Object.assign(this.toObject(), normalized); // if we didn't set the day but we ended up on an overflow date, - // use the last day of the right month - - if (isUndefined(normalized.day)) { - mixed.day = Math.min(daysInMonth(mixed.year, mixed.month), mixed.day); - } - } - - const [ts, o] = objToTS(mixed, this.o, this.zone); - return clone$1(this, { - ts, - o - }); - } - /** - * Add a period of time to this DateTime and return the resulting DateTime - * - * Adding hours, minutes, seconds, or milliseconds increases the timestamp by the right number of milliseconds. Adding days, months, or years shifts the calendar, accounting for DSTs and leap years along the way. Thus, `dt.plus({ hours: 24 })` may result in a different time than `dt.plus({ days: 1 })` if there's a DST shift in between. - * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() - * @example DateTime.now().plus(123) //~> in 123 milliseconds - * @example DateTime.now().plus({ minutes: 15 }) //~> in 15 minutes - * @example DateTime.now().plus({ days: 1 }) //~> this time tomorrow - * @example DateTime.now().plus({ days: -1 }) //~> this time yesterday - * @example DateTime.now().plus({ hours: 3, minutes: 13 }) //~> in 3 hr, 13 min - * @example DateTime.now().plus(Duration.fromObject({ hours: 3, minutes: 13 })) //~> in 3 hr, 13 min - * @return {DateTime} - */ - - - plus(duration) { - if (!this.isValid) return this; - const dur = friendlyDuration(duration); - return clone$1(this, adjustTime(this, dur)); - } - /** - * Subtract a period of time to this DateTime and return the resulting DateTime - * See {@link plus} - * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() - @return {DateTime} - */ - - - minus(duration) { - if (!this.isValid) return this; - const dur = friendlyDuration(duration).negate(); - return clone$1(this, adjustTime(this, dur)); - } - /** - * "Set" this DateTime to the beginning of a unit of time. - * @param {string} unit - The unit to go to the beginning of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'. - * @example DateTime.local(2014, 3, 3).startOf('month').toISODate(); //=> '2014-03-01' - * @example DateTime.local(2014, 3, 3).startOf('year').toISODate(); //=> '2014-01-01' - * @example DateTime.local(2014, 3, 3).startOf('week').toISODate(); //=> '2014-03-03', weeks always start on Mondays - * @example DateTime.local(2014, 3, 3, 5, 30).startOf('day').toISOTime(); //=> '00:00.000-05:00' - * @example DateTime.local(2014, 3, 3, 5, 30).startOf('hour').toISOTime(); //=> '05:00:00.000-05:00' - * @return {DateTime} - */ - - - startOf(unit) { - if (!this.isValid) return this; - const o = {}, - normalizedUnit = Duration.normalizeUnit(unit); - - switch (normalizedUnit) { - case "years": - o.month = 1; - // falls through - - case "quarters": - case "months": - o.day = 1; - // falls through - - case "weeks": - case "days": - o.hour = 0; - // falls through - - case "hours": - o.minute = 0; - // falls through - - case "minutes": - o.second = 0; - // falls through - - case "seconds": - o.millisecond = 0; - break; - // no default, invalid units throw in normalizeUnit() - } - - if (normalizedUnit === "weeks") { - o.weekday = 1; - } - - if (normalizedUnit === "quarters") { - const q = Math.ceil(this.month / 3); - o.month = (q - 1) * 3 + 1; - } - - return this.set(o); - } - /** - * "Set" this DateTime to the end (meaning the last millisecond) of a unit of time - * @param {string} unit - The unit to go to the end of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'. - * @example DateTime.local(2014, 3, 3).endOf('month').toISO(); //=> '2014-03-31T23:59:59.999-05:00' - * @example DateTime.local(2014, 3, 3).endOf('year').toISO(); //=> '2014-12-31T23:59:59.999-05:00' - * @example DateTime.local(2014, 3, 3).endOf('week').toISO(); // => '2014-03-09T23:59:59.999-05:00', weeks start on Mondays - * @example DateTime.local(2014, 3, 3, 5, 30).endOf('day').toISO(); //=> '2014-03-03T23:59:59.999-05:00' - * @example DateTime.local(2014, 3, 3, 5, 30).endOf('hour').toISO(); //=> '2014-03-03T05:59:59.999-05:00' - * @return {DateTime} - */ - - - endOf(unit) { - return this.isValid ? this.plus({ - [unit]: 1 - }).startOf(unit).minus(1) : this; - } // OUTPUT - - /** - * Returns a string representation of this DateTime formatted according to the specified format string. - * **You may not want this.** See {@link toLocaleString} for a more flexible formatting tool. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/docs/manual/formatting.html#table-of-tokens). - * Defaults to en-US if no locale has been specified, regardless of the system's locale. - * @see https://moment.github.io/luxon/docs/manual/formatting.html#table-of-tokens - * @param {string} fmt - the format string - * @param {Object} opts - opts to override the configuration options - * @example DateTime.now().toFormat('yyyy LLL dd') //=> '2017 Apr 22' - * @example DateTime.now().setLocale('fr').toFormat('yyyy LLL dd') //=> '2017 avr. 22' - * @example DateTime.now().toFormat('yyyy LLL dd', { locale: "fr" }) //=> '2017 avr. 22' - * @example DateTime.now().toFormat("HH 'hours and' mm 'minutes'") //=> '20 hours and 55 minutes' - * @return {string} - */ - - - toFormat(fmt, opts = {}) { - return this.isValid ? Formatter.create(this.loc.redefaultToEN(opts)).formatDateTimeFromString(this, fmt) : INVALID$2; - } - /** - * Returns a localized string representing this date. Accepts the same options as the Intl.DateTimeFormat constructor and any presets defined by Luxon, such as `DateTime.DATE_FULL` or `DateTime.TIME_SIMPLE`. - * The exact behavior of this method is browser-specific, but in general it will return an appropriate representation - * of the DateTime in the assigned locale. - * Defaults to the system's locale if no locale has been specified - * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat - * @param opts {Object} - Intl.DateTimeFormat constructor options and configuration options - * @example DateTime.now().toLocaleString(); //=> 4/20/2017 - * @example DateTime.now().setLocale('en-gb').toLocaleString(); //=> '20/04/2017' - * @example DateTime.now().toLocaleString({ locale: 'en-gb' }); //=> '20/04/2017' - * @example DateTime.now().toLocaleString(DateTime.DATE_FULL); //=> 'April 20, 2017' - * @example DateTime.now().toLocaleString(DateTime.TIME_SIMPLE); //=> '11:32 AM' - * @example DateTime.now().toLocaleString(DateTime.DATETIME_SHORT); //=> '4/20/2017, 11:32 AM' - * @example DateTime.now().toLocaleString({ weekday: 'long', month: 'long', day: '2-digit' }); //=> 'Thursday, April 20' - * @example DateTime.now().toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> 'Thu, Apr 20, 11:27 AM' - * @example DateTime.now().toLocaleString({ hour: '2-digit', minute: '2-digit', hour12: false }); //=> '11:32' - * @return {string} - */ - - - toLocaleString(opts = DATE_SHORT) { - return this.isValid ? Formatter.create(this.loc.clone(opts), opts).formatDateTime(this) : INVALID$2; - } - /** - * Returns an array of format "parts", meaning individual tokens along with metadata. This is allows callers to post-process individual sections of the formatted output. - * Defaults to the system's locale if no locale has been specified - * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/formatToParts - * @param opts {Object} - Intl.DateTimeFormat constructor options, same as `toLocaleString`. - * @example DateTime.now().toLocaleParts(); //=> [ - * //=> { type: 'day', value: '25' }, - * //=> { type: 'literal', value: '/' }, - * //=> { type: 'month', value: '05' }, - * //=> { type: 'literal', value: '/' }, - * //=> { type: 'year', value: '1982' } - * //=> ] - */ - - - toLocaleParts(opts = {}) { - return this.isValid ? Formatter.create(this.loc.clone(opts), opts).formatDateTimeParts(this) : []; - } - /** - * Returns an ISO 8601-compliant string representation of this DateTime - * @param {Object} opts - options - * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0 - * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0 - * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' - * @param {string} [opts.format='extended'] - choose between the basic and extended format - * @example DateTime.utc(1982, 5, 25).toISO() //=> '1982-05-25T00:00:00.000Z' - * @example DateTime.now().toISO() //=> '2017-04-22T20:47:05.335-04:00' - * @example DateTime.now().toISO({ includeOffset: false }) //=> '2017-04-22T20:47:05.335' - * @example DateTime.now().toISO({ format: 'basic' }) //=> '20170422T204705.335-0400' - * @return {string} - */ - - - toISO(opts = {}) { - if (!this.isValid) { - return null; - } - - return `${this.toISODate(opts)}T${this.toISOTime(opts)}`; - } - /** - * Returns an ISO 8601-compliant string representation of this DateTime's date component - * @param {Object} opts - options - * @param {string} [opts.format='extended'] - choose between the basic and extended format - * @example DateTime.utc(1982, 5, 25).toISODate() //=> '1982-05-25' - * @example DateTime.utc(1982, 5, 25).toISODate({ format: 'basic' }) //=> '19820525' - * @return {string} - */ - - - toISODate({ - format = "extended" - } = {}) { - let fmt = format === "basic" ? "yyyyMMdd" : "yyyy-MM-dd"; - - if (this.year > 9999) { - fmt = "+" + fmt; - } - - return toTechFormat(this, fmt); - } - /** - * Returns an ISO 8601-compliant string representation of this DateTime's week date - * @example DateTime.utc(1982, 5, 25).toISOWeekDate() //=> '1982-W21-2' - * @return {string} - */ - - - toISOWeekDate() { - return toTechFormat(this, "kkkk-'W'WW-c"); - } - /** - * Returns an ISO 8601-compliant string representation of this DateTime's time component - * @param {Object} opts - options - * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0 - * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0 - * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' - * @param {boolean} [opts.includePrefix=false] - include the `T` prefix - * @param {string} [opts.format='extended'] - choose between the basic and extended format - * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime() //=> '07:34:19.361Z' - * @example DateTime.utc().set({ hour: 7, minute: 34, seconds: 0, milliseconds: 0 }).toISOTime({ suppressSeconds: true }) //=> '07:34Z' - * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ format: 'basic' }) //=> '073419.361Z' - * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ includePrefix: true }) //=> 'T07:34:19.361Z' - * @return {string} - */ - - - toISOTime({ - suppressMilliseconds = false, - suppressSeconds = false, - includeOffset = true, - includePrefix = false, - format = "extended" - } = {}) { - return toTechTimeFormat(this, { - suppressSeconds, - suppressMilliseconds, - includeOffset, - includePrefix, - format - }); - } - /** - * Returns an RFC 2822-compatible string representation of this DateTime, always in UTC - * @example DateTime.utc(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 +0000' - * @example DateTime.local(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 -0400' - * @return {string} - */ - - - toRFC2822() { - return toTechFormat(this, "EEE, dd LLL yyyy HH:mm:ss ZZZ", false); - } - /** - * Returns a string representation of this DateTime appropriate for use in HTTP headers. - * Specifically, the string conforms to RFC 1123. - * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1 - * @example DateTime.utc(2014, 7, 13).toHTTP() //=> 'Sun, 13 Jul 2014 00:00:00 GMT' - * @example DateTime.utc(2014, 7, 13, 19).toHTTP() //=> 'Sun, 13 Jul 2014 19:00:00 GMT' - * @return {string} - */ - - - toHTTP() { - return toTechFormat(this.toUTC(), "EEE, dd LLL yyyy HH:mm:ss 'GMT'"); - } - /** - * Returns a string representation of this DateTime appropriate for use in SQL Date - * @example DateTime.utc(2014, 7, 13).toSQLDate() //=> '2014-07-13' - * @return {string} - */ - - - toSQLDate() { - return toTechFormat(this, "yyyy-MM-dd"); - } - /** - * Returns a string representation of this DateTime appropriate for use in SQL Time - * @param {Object} opts - options - * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset. - * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' - * @example DateTime.utc().toSQL() //=> '05:15:16.345' - * @example DateTime.now().toSQL() //=> '05:15:16.345 -04:00' - * @example DateTime.now().toSQL({ includeOffset: false }) //=> '05:15:16.345' - * @example DateTime.now().toSQL({ includeZone: false }) //=> '05:15:16.345 America/New_York' - * @return {string} - */ - - - toSQLTime({ - includeOffset = true, - includeZone = false - } = {}) { - return toTechTimeFormat(this, { - includeOffset, - includeZone, - spaceZone: true - }); - } - /** - * Returns a string representation of this DateTime appropriate for use in SQL DateTime - * @param {Object} opts - options - * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset. - * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' - * @example DateTime.utc(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 Z' - * @example DateTime.local(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 -04:00' - * @example DateTime.local(2014, 7, 13).toSQL({ includeOffset: false }) //=> '2014-07-13 00:00:00.000' - * @example DateTime.local(2014, 7, 13).toSQL({ includeZone: true }) //=> '2014-07-13 00:00:00.000 America/New_York' - * @return {string} - */ - - - toSQL(opts = {}) { - if (!this.isValid) { - return null; - } - - return `${this.toSQLDate()} ${this.toSQLTime(opts)}`; - } - /** - * Returns a string representation of this DateTime appropriate for debugging - * @return {string} - */ - - - toString() { - return this.isValid ? this.toISO() : INVALID$2; - } - /** - * Returns the epoch milliseconds of this DateTime. Alias of {@link toMillis} - * @return {number} - */ - - - valueOf() { - return this.toMillis(); - } - /** - * Returns the epoch milliseconds of this DateTime. - * @return {number} - */ - - - toMillis() { - return this.isValid ? this.ts : NaN; - } - /** - * Returns the epoch seconds of this DateTime. - * @return {number} - */ - - - toSeconds() { - return this.isValid ? this.ts / 1000 : NaN; - } - /** - * Returns an ISO 8601 representation of this DateTime appropriate for use in JSON. - * @return {string} - */ - - - toJSON() { - return this.toISO(); - } - /** - * Returns a BSON serializable equivalent to this DateTime. - * @return {Date} - */ - - - toBSON() { - return this.toJSDate(); - } - /** - * Returns a JavaScript object with this DateTime's year, month, day, and so on. - * @param opts - options for generating the object - * @param {boolean} [opts.includeConfig=false] - include configuration attributes in the output - * @example DateTime.now().toObject() //=> { year: 2017, month: 4, day: 22, hour: 20, minute: 49, second: 42, millisecond: 268 } - * @return {Object} - */ - - - toObject(opts = {}) { - if (!this.isValid) return {}; - const base = Object.assign({}, this.c); - - if (opts.includeConfig) { - base.outputCalendar = this.outputCalendar; - base.numberingSystem = this.loc.numberingSystem; - base.locale = this.loc.locale; - } - - return base; - } - /** - * Returns a JavaScript Date equivalent to this DateTime. - * @return {Date} - */ - - - toJSDate() { - return new Date(this.isValid ? this.ts : NaN); - } // COMPARE - - /** - * Return the difference between two DateTimes as a Duration. - * @param {DateTime} otherDateTime - the DateTime to compare this one to - * @param {string|string[]} [unit=['milliseconds']] - the unit or array of units (such as 'hours' or 'days') to include in the duration. - * @param {Object} opts - options that affect the creation of the Duration - * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use - * @example - * var i1 = DateTime.fromISO('1982-05-25T09:45'), - * i2 = DateTime.fromISO('1983-10-14T10:30'); - * i2.diff(i1).toObject() //=> { milliseconds: 43807500000 } - * i2.diff(i1, 'hours').toObject() //=> { hours: 12168.75 } - * i2.diff(i1, ['months', 'days']).toObject() //=> { months: 16, days: 19.03125 } - * i2.diff(i1, ['months', 'days', 'hours']).toObject() //=> { months: 16, days: 19, hours: 0.75 } - * @return {Duration} - */ - - - diff(otherDateTime, unit = "milliseconds", opts = {}) { - if (!this.isValid || !otherDateTime.isValid) { - return Duration.invalid(this.invalid || otherDateTime.invalid, "created by diffing an invalid DateTime"); - } - - const durOpts = Object.assign({ - locale: this.locale, - numberingSystem: this.numberingSystem - }, opts); - const units = maybeArray(unit).map(Duration.normalizeUnit), - otherIsLater = otherDateTime.valueOf() > this.valueOf(), - earlier = otherIsLater ? this : otherDateTime, - later = otherIsLater ? otherDateTime : this, - diffed = diff(earlier, later, units, durOpts); - return otherIsLater ? diffed.negate() : diffed; - } - /** - * Return the difference between this DateTime and right now. - * See {@link diff} - * @param {string|string[]} [unit=['milliseconds']] - the unit or units units (such as 'hours' or 'days') to include in the duration - * @param {Object} opts - options that affect the creation of the Duration - * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use - * @return {Duration} - */ - - - diffNow(unit = "milliseconds", opts = {}) { - return this.diff(DateTime$1.now(), unit, opts); - } - /** - * Return an Interval spanning between this DateTime and another DateTime - * @param {DateTime} otherDateTime - the other end point of the Interval - * @return {Interval} - */ - - - until(otherDateTime) { - return this.isValid ? Interval.fromDateTimes(this, otherDateTime) : this; - } - /** - * Return whether this DateTime is in the same unit of time as another DateTime. - * Higher-order units must also be identical for this function to return `true`. - * Note that time zones are **ignored** in this comparison, which compares the **local** calendar time. Use {@link setZone} to convert one of the dates if needed. - * @param {DateTime} otherDateTime - the other DateTime - * @param {string} unit - the unit of time to check sameness on - * @example DateTime.now().hasSame(otherDT, 'day'); //~> true if otherDT is in the same current calendar day - * @return {boolean} - */ - - - hasSame(otherDateTime, unit) { - if (!this.isValid) return false; - const inputMs = otherDateTime.valueOf(); - const otherZoneDateTime = this.setZone(otherDateTime.zone, { - keepLocalTime: true - }); - return otherZoneDateTime.startOf(unit) <= inputMs && inputMs <= otherZoneDateTime.endOf(unit); - } - /** - * Equality check - * Two DateTimes are equal iff they represent the same millisecond, have the same zone and location, and are both valid. - * To compare just the millisecond values, use `+dt1 === +dt2`. - * @param {DateTime} other - the other DateTime - * @return {boolean} - */ - - - equals(other) { - return this.isValid && other.isValid && this.valueOf() === other.valueOf() && this.zone.equals(other.zone) && this.loc.equals(other.loc); - } - /** - * Returns a string representation of a this time relative to now, such as "in two days". Can only internationalize if your - * platform supports Intl.RelativeTimeFormat. Rounds down by default. - * @param {Object} options - options that affect the output - * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now. - * @param {string} [options.style="long"] - the style of units, must be "long", "short", or "narrow" - * @param {string} options.unit - use a specific unit; if omitted, the method will pick the unit. Use one of "years", "quarters", "months", "weeks", "days", "hours", "minutes", or "seconds" - * @param {boolean} [options.round=true] - whether to round the numbers in the output. - * @param {number} [options.padding=0] - padding in milliseconds. This allows you to round up the result if it fits inside the threshold. Don't use in combination with {round: false} because the decimal output will include the padding. - * @param {string} options.locale - override the locale of this DateTime - * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this - * @example DateTime.now().plus({ days: 1 }).toRelative() //=> "in 1 day" - * @example DateTime.now().setLocale("es").toRelative({ days: 1 }) //=> "dentro de 1 día" - * @example DateTime.now().plus({ days: 1 }).toRelative({ locale: "fr" }) //=> "dans 23 heures" - * @example DateTime.now().minus({ days: 2 }).toRelative() //=> "2 days ago" - * @example DateTime.now().minus({ days: 2 }).toRelative({ unit: "hours" }) //=> "48 hours ago" - * @example DateTime.now().minus({ hours: 36 }).toRelative({ round: false }) //=> "1.5 days ago" - */ - - - toRelative(options = {}) { - if (!this.isValid) return null; - const base = options.base || DateTime$1.fromObject({ - zone: this.zone - }), - padding = options.padding ? this < base ? -options.padding : options.padding : 0; - return diffRelative(base, this.plus(padding), Object.assign(options, { - numeric: "always", - units: ["years", "months", "days", "hours", "minutes", "seconds"] - })); - } - /** - * Returns a string representation of this date relative to today, such as "yesterday" or "next month". - * Only internationalizes on platforms that supports Intl.RelativeTimeFormat. - * @param {Object} options - options that affect the output - * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now. - * @param {string} options.locale - override the locale of this DateTime - * @param {string} options.unit - use a specific unit; if omitted, the method will pick the unit. Use one of "years", "quarters", "months", "weeks", or "days" - * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this - * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar() //=> "tomorrow" - * @example DateTime.now().setLocale("es").plus({ days: 1 }).toRelative() //=> ""mañana" - * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar({ locale: "fr" }) //=> "demain" - * @example DateTime.now().minus({ days: 2 }).toRelativeCalendar() //=> "2 days ago" - */ - - - toRelativeCalendar(options = {}) { - if (!this.isValid) return null; - return diffRelative(options.base || DateTime$1.fromObject({ - zone: this.zone - }), this, Object.assign(options, { - numeric: "auto", - units: ["years", "months", "days"], - calendary: true - })); - } - /** - * Return the min of several date times - * @param {...DateTime} dateTimes - the DateTimes from which to choose the minimum - * @return {DateTime} the min DateTime, or undefined if called with no argument - */ - - - static min(...dateTimes) { - if (!dateTimes.every(DateTime$1.isDateTime)) { - throw new InvalidArgumentError("min requires all arguments be DateTimes"); - } - - return bestBy(dateTimes, i => i.valueOf(), Math.min); - } - /** - * Return the max of several date times - * @param {...DateTime} dateTimes - the DateTimes from which to choose the maximum - * @return {DateTime} the max DateTime, or undefined if called with no argument - */ - - - static max(...dateTimes) { - if (!dateTimes.every(DateTime$1.isDateTime)) { - throw new InvalidArgumentError("max requires all arguments be DateTimes"); - } - - return bestBy(dateTimes, i => i.valueOf(), Math.max); - } // MISC - - /** - * Explain how a string would be parsed by fromFormat() - * @param {string} text - the string to parse - * @param {string} fmt - the format the string is expected to be in (see description) - * @param {Object} options - options taken by fromFormat() - * @return {Object} - */ - - - static fromFormatExplain(text, fmt, options = {}) { - const { - locale = null, - numberingSystem = null - } = options, - localeToUse = Locale.fromOpts({ - locale, - numberingSystem, - defaultToEN: true - }); - return explainFromTokens(localeToUse, text, fmt); - } - /** - * @deprecated use fromFormatExplain instead - */ - - - static fromStringExplain(text, fmt, options = {}) { - return DateTime$1.fromFormatExplain(text, fmt, options); - } // FORMAT PRESETS - - /** - * {@link toLocaleString} format like 10/14/1983 - * @type {Object} - */ - - - static get DATE_SHORT() { - return DATE_SHORT; - } - /** - * {@link toLocaleString} format like 'Oct 14, 1983' - * @type {Object} - */ - - - static get DATE_MED() { - return DATE_MED; - } - /** - * {@link toLocaleString} format like 'Fri, Oct 14, 1983' - * @type {Object} - */ - - - static get DATE_MED_WITH_WEEKDAY() { - return DATE_MED_WITH_WEEKDAY; - } - /** - * {@link toLocaleString} format like 'October 14, 1983' - * @type {Object} - */ - - - static get DATE_FULL() { - return DATE_FULL; - } - /** - * {@link toLocaleString} format like 'Tuesday, October 14, 1983' - * @type {Object} - */ - - - static get DATE_HUGE() { - return DATE_HUGE; - } - /** - * {@link toLocaleString} format like '09:30 AM'. Only 12-hour if the locale is. - * @type {Object} - */ - - - static get TIME_SIMPLE() { - return TIME_SIMPLE; - } - /** - * {@link toLocaleString} format like '09:30:23 AM'. Only 12-hour if the locale is. - * @type {Object} - */ - - - static get TIME_WITH_SECONDS() { - return TIME_WITH_SECONDS; - } - /** - * {@link toLocaleString} format like '09:30:23 AM EDT'. Only 12-hour if the locale is. - * @type {Object} - */ - - - static get TIME_WITH_SHORT_OFFSET() { - return TIME_WITH_SHORT_OFFSET; - } - /** - * {@link toLocaleString} format like '09:30:23 AM Eastern Daylight Time'. Only 12-hour if the locale is. - * @type {Object} - */ - - - static get TIME_WITH_LONG_OFFSET() { - return TIME_WITH_LONG_OFFSET; - } - /** - * {@link toLocaleString} format like '09:30', always 24-hour. - * @type {Object} - */ - - - static get TIME_24_SIMPLE() { - return TIME_24_SIMPLE; - } - /** - * {@link toLocaleString} format like '09:30:23', always 24-hour. - * @type {Object} - */ - - - static get TIME_24_WITH_SECONDS() { - return TIME_24_WITH_SECONDS; - } - /** - * {@link toLocaleString} format like '09:30:23 EDT', always 24-hour. - * @type {Object} - */ - - - static get TIME_24_WITH_SHORT_OFFSET() { - return TIME_24_WITH_SHORT_OFFSET; - } - /** - * {@link toLocaleString} format like '09:30:23 Eastern Daylight Time', always 24-hour. - * @type {Object} - */ - - - static get TIME_24_WITH_LONG_OFFSET() { - return TIME_24_WITH_LONG_OFFSET; - } - /** - * {@link toLocaleString} format like '10/14/1983, 9:30 AM'. Only 12-hour if the locale is. - * @type {Object} - */ - - - static get DATETIME_SHORT() { - return DATETIME_SHORT; - } - /** - * {@link toLocaleString} format like '10/14/1983, 9:30:33 AM'. Only 12-hour if the locale is. - * @type {Object} - */ - - - static get DATETIME_SHORT_WITH_SECONDS() { - return DATETIME_SHORT_WITH_SECONDS; - } - /** - * {@link toLocaleString} format like 'Oct 14, 1983, 9:30 AM'. Only 12-hour if the locale is. - * @type {Object} - */ - - - static get DATETIME_MED() { - return DATETIME_MED; - } - /** - * {@link toLocaleString} format like 'Oct 14, 1983, 9:30:33 AM'. Only 12-hour if the locale is. - * @type {Object} - */ - - - static get DATETIME_MED_WITH_SECONDS() { - return DATETIME_MED_WITH_SECONDS; - } - /** - * {@link toLocaleString} format like 'Fri, 14 Oct 1983, 9:30 AM'. Only 12-hour if the locale is. - * @type {Object} - */ - - - static get DATETIME_MED_WITH_WEEKDAY() { - return DATETIME_MED_WITH_WEEKDAY; - } - /** - * {@link toLocaleString} format like 'October 14, 1983, 9:30 AM EDT'. Only 12-hour if the locale is. - * @type {Object} - */ - - - static get DATETIME_FULL() { - return DATETIME_FULL; - } - /** - * {@link toLocaleString} format like 'October 14, 1983, 9:30:33 AM EDT'. Only 12-hour if the locale is. - * @type {Object} - */ - - - static get DATETIME_FULL_WITH_SECONDS() { - return DATETIME_FULL_WITH_SECONDS; - } - /** - * {@link toLocaleString} format like 'Friday, October 14, 1983, 9:30 AM Eastern Daylight Time'. Only 12-hour if the locale is. - * @type {Object} - */ - - - static get DATETIME_HUGE() { - return DATETIME_HUGE; - } - /** - * {@link toLocaleString} format like 'Friday, October 14, 1983, 9:30:33 AM Eastern Daylight Time'. Only 12-hour if the locale is. - * @type {Object} - */ - - - static get DATETIME_HUGE_WITH_SECONDS() { - return DATETIME_HUGE_WITH_SECONDS; - } - -} -/** - * @private - */ - -function friendlyDateTime(dateTimeish) { - if (DateTime$1.isDateTime(dateTimeish)) { - return dateTimeish; - } else if (dateTimeish && dateTimeish.valueOf && isNumber$1(dateTimeish.valueOf())) { - return DateTime$1.fromJSDate(dateTimeish); - } else if (dateTimeish && typeof dateTimeish === "object") { - return DateTime$1.fromObject(dateTimeish); - } else { - throw new InvalidArgumentError(`Unknown datetime argument: ${dateTimeish}, of type ${typeof dateTimeish}`); - } -} - -var DateTime_1 = DateTime$1; - -var DateWithZone = /** @class */ (function () { - function DateWithZone(date, tzid) { - this.date = date; - this.tzid = tzid; - } - Object.defineProperty(DateWithZone.prototype, "isUTC", { - get: function () { - return !this.tzid || this.tzid.toUpperCase() === 'UTC'; - }, - enumerable: true, - configurable: true - }); - DateWithZone.prototype.toString = function () { - var datestr = dateutil$1.timeToUntilString(this.date.getTime(), this.isUTC); - if (!this.isUTC) { - return ";TZID=" + this.tzid + ":" + datestr; - } - return ":" + datestr; - }; - DateWithZone.prototype.getTime = function () { - return this.date.getTime(); - }; - DateWithZone.prototype.rezonedDate = function () { - if (this.isUTC) { - return this.date; - } - try { - var datetime = DateTime_1 - .fromJSDate(this.date); - var rezoned = datetime.setZone(this.tzid, { keepLocalTime: true }); - return rezoned.toJSDate(); - } - catch (e) { - if (e instanceof TypeError) { - console.error('Using TZID without Luxon available is unsupported. Returned times are in UTC, not the requested time zone'); - } - return this.date; - } - }; - return DateWithZone; -}()); - -function optionsToString(options) { - var rrule = []; - var dtstart = ''; - var keys = Object.keys(options); - var defaultKeys = Object.keys(DEFAULT_OPTIONS); - for (var i = 0; i < keys.length; i++) { - if (keys[i] === 'tzid') - continue; - if (!includes(defaultKeys, keys[i])) - continue; - var key = keys[i].toUpperCase(); - var value = options[keys[i]]; - var outValue = ''; - if (!isPresent(value) || (isArray(value) && !value.length)) - continue; - switch (key) { - case 'FREQ': - outValue = RRule.FREQUENCIES[options.freq]; - break; - case 'WKST': - if (isNumber(value)) { - outValue = new Weekday(value).toString(); - } - else { - outValue = value.toString(); - } - break; - case 'BYWEEKDAY': - /* - NOTE: BYWEEKDAY is a special case. - RRule() deconstructs the rule.options.byweekday array - into an array of Weekday arguments. - On the other hand, rule.origOptions is an array of Weekdays. - We need to handle both cases here. - It might be worth change RRule to keep the Weekdays. - - Also, BYWEEKDAY (used by RRule) vs. BYDAY (RFC) - - */ - key = 'BYDAY'; - outValue = toArray(value).map(function (wday) { - if (wday instanceof Weekday) { - return wday; - } - if (isArray(wday)) { - return new Weekday(wday[0], wday[1]); - } - return new Weekday(wday); - }).toString(); - break; - case 'DTSTART': - dtstart = buildDtstart(value, options.tzid); - break; - case 'UNTIL': - outValue = dateutil$1.timeToUntilString(value, !options.tzid); - break; - default: - if (isArray(value)) { - var strValues = []; - for (var j = 0; j < value.length; j++) { - strValues[j] = String(value[j]); - } - outValue = strValues.toString(); - } - else { - outValue = String(value); - } - } - if (outValue) { - rrule.push([key, outValue]); - } - } - var rules = rrule.map(function (_a) { - var key = _a[0], value = _a[1]; - return key + "=" + value.toString(); - }).join(';'); - var ruleString = ''; - if (rules !== '') { - ruleString = "RRULE:" + rules; - } - return [dtstart, ruleString].filter(function (x) { return !!x; }).join('\n'); -} -function buildDtstart(dtstart, tzid) { - if (!dtstart) { - return ''; - } - return 'DTSTART' + new DateWithZone(new Date(dtstart), tzid).toString(); -} - -var Cache = /** @class */ (function () { - function Cache() { - this.all = false; - this.before = []; - this.after = []; - this.between = []; - } - /** - * @param {String} what - all/before/after/between - * @param {Array,Date} value - an array of dates, one date, or null - * @param {Object?} args - _iter arguments - */ - Cache.prototype._cacheAdd = function (what, value, args) { - if (value) { - value = - value instanceof Date - ? dateutil$1.clone(value) - : dateutil$1.cloneDates(value); - } - if (what === 'all') { - this.all = value; - } - else { - args._value = value; - this[what].push(args); - } - }; - /** - * @return false - not in the cache - * null - cached, but zero occurrences (before/after) - * Date - cached (before/after) - * [] - cached, but zero occurrences (all/between) - * [Date1, DateN] - cached (all/between) - */ - Cache.prototype._cacheGet = function (what, args) { - var cached = false; - var argsKeys = args ? Object.keys(args) : []; - var findCacheDiff = function (item) { - for (var i = 0; i < argsKeys.length; i++) { - var key = argsKeys[i]; - if (String(args[key]) !== String(item[key])) { - return true; - } - } - return false; - }; - var cachedObject = this[what]; - if (what === 'all') { - cached = this.all; - } - else if (isArray(cachedObject)) { - // Let's see whether we've already called the - // 'what' method with the same 'args' - for (var i = 0; i < cachedObject.length; i++) { - var item = cachedObject[i]; - if (argsKeys.length && findCacheDiff(item)) - continue; - cached = item._value; - break; - } - } - if (!cached && this.all) { - // Not in the cache, but we already know all the occurrences, - // so we can find the correct dates from the cached ones. - var iterResult = new IterResult(what, args); - for (var i = 0; i < this.all.length; i++) { - if (!iterResult.accept(this.all[i])) - break; - } - cached = iterResult.getValue(); - this._cacheAdd(what, cached, args); - } - return isArray(cached) - ? dateutil$1.cloneDates(cached) - : cached instanceof Date - ? dateutil$1.clone(cached) - : cached; - }; - return Cache; -}()); - -// ============================================================================= -// Date masks -// ============================================================================= -// Every mask is 7 days longer to handle cross-year weekly periods. -var M365MASK = __spreadArrays(repeat(1, 31), repeat(2, 28), repeat(3, 31), repeat(4, 30), repeat(5, 31), repeat(6, 30), repeat(7, 31), repeat(8, 31), repeat(9, 30), repeat(10, 31), repeat(11, 30), repeat(12, 31), repeat(1, 7)); -var M366MASK = __spreadArrays(repeat(1, 31), repeat(2, 29), repeat(3, 31), repeat(4, 30), repeat(5, 31), repeat(6, 30), repeat(7, 31), repeat(8, 31), repeat(9, 30), repeat(10, 31), repeat(11, 30), repeat(12, 31), repeat(1, 7)); -var M28 = range(1, 29); -var M29 = range(1, 30); -var M30 = range(1, 31); -var M31 = range(1, 32); -var MDAY366MASK = __spreadArrays(M31, M29, M31, M30, M31, M30, M31, M31, M30, M31, M30, M31, M31.slice(0, 7)); -var MDAY365MASK = __spreadArrays(M31, M28, M31, M30, M31, M30, M31, M31, M30, M31, M30, M31, M31.slice(0, 7)); -var NM28 = range(-28, 0); -var NM29 = range(-29, 0); -var NM30 = range(-30, 0); -var NM31 = range(-31, 0); -var NMDAY366MASK = __spreadArrays(NM31, NM29, NM31, NM30, NM31, NM30, NM31, NM31, NM30, NM31, NM30, NM31, NM31.slice(0, 7)); -var NMDAY365MASK = __spreadArrays(NM31, NM28, NM31, NM30, NM31, NM30, NM31, NM31, NM30, NM31, NM30, NM31, NM31.slice(0, 7)); -var M366RANGE = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366]; -var M365RANGE = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365]; -var WDAYMASK = (function () { - var wdaymask = []; - for (var i = 0; i < 55; i++) - wdaymask = wdaymask.concat(range(7)); - return wdaymask; -})(); - -function rebuildYear(year, options) { - var firstyday = new Date(Date.UTC(year, 0, 1)); - var yearlen = dateutil$1.isLeapYear(year) ? 366 : 365; - var nextyearlen = dateutil$1.isLeapYear(year + 1) ? 366 : 365; - var yearordinal = dateutil$1.toOrdinal(firstyday); - var yearweekday = dateutil$1.getWeekday(firstyday); - var result = __assign(__assign({ yearlen: yearlen, - nextyearlen: nextyearlen, - yearordinal: yearordinal, - yearweekday: yearweekday }, baseYearMasks(year)), { wnomask: null }); - if (empty$1(options.byweekno)) { - return result; - } - result.wnomask = repeat(0, yearlen + 7); - var firstwkst; - var wyearlen; - var no1wkst = firstwkst = pymod(7 - yearweekday + options.wkst, 7); - if (no1wkst >= 4) { - no1wkst = 0; - // Number of days in the year, plus the days we got - // from last year. - wyearlen = - result.yearlen + pymod(yearweekday - options.wkst, 7); - } - else { - // Number of days in the year, minus the days we - // left in last year. - wyearlen = yearlen - no1wkst; - } - var div = Math.floor(wyearlen / 7); - var mod = pymod(wyearlen, 7); - var numweeks = Math.floor(div + mod / 4); - for (var j = 0; j < options.byweekno.length; j++) { - var n = options.byweekno[j]; - if (n < 0) { - n += numweeks + 1; - } - if (!(n > 0 && n <= numweeks)) { - continue; - } - var i = void 0; - if (n > 1) { - i = no1wkst + (n - 1) * 7; - if (no1wkst !== firstwkst) { - i -= 7 - firstwkst; - } - } - else { - i = no1wkst; - } - for (var k = 0; k < 7; k++) { - result.wnomask[i] = 1; - i++; - if (result.wdaymask[i] === options.wkst) - break; - } - } - if (includes(options.byweekno, 1)) { - // Check week number 1 of next year as well - // orig-TODO : Check -numweeks for next year. - var i = no1wkst + numweeks * 7; - if (no1wkst !== firstwkst) - i -= 7 - firstwkst; - if (i < yearlen) { - // If week starts in next year, we - // don't care about it. - for (var j = 0; j < 7; j++) { - result.wnomask[i] = 1; - i += 1; - if (result.wdaymask[i] === options.wkst) - break; - } - } - } - if (no1wkst) { - // Check last week number of last year as - // well. If no1wkst is 0, either the year - // started on week start, or week number 1 - // got days from last year, so there are no - // days from last year's last week number in - // this year. - var lnumweeks = void 0; - if (!includes(options.byweekno, -1)) { - var lyearweekday = dateutil$1.getWeekday(new Date(Date.UTC(year - 1, 0, 1))); - var lno1wkst = pymod(7 - lyearweekday.valueOf() + options.wkst, 7); - var lyearlen = dateutil$1.isLeapYear(year - 1) ? 366 : 365; - var weekst = void 0; - if (lno1wkst >= 4) { - lno1wkst = 0; - weekst = lyearlen + pymod(lyearweekday - options.wkst, 7); - } - else { - weekst = yearlen - no1wkst; - } - lnumweeks = Math.floor(52 + pymod(weekst, 7) / 4); - } - else { - lnumweeks = -1; - } - if (includes(options.byweekno, lnumweeks)) { - for (var i = 0; i < no1wkst; i++) - result.wnomask[i] = 1; - } - } - return result; -} -function baseYearMasks(year) { - var yearlen = dateutil$1.isLeapYear(year) ? 366 : 365; - var firstyday = new Date(Date.UTC(year, 0, 1)); - var wday = dateutil$1.getWeekday(firstyday); - if (yearlen === 365) { - return { - mmask: M365MASK, - mdaymask: MDAY365MASK, - nmdaymask: NMDAY365MASK, - wdaymask: WDAYMASK.slice(wday), - mrange: M365RANGE - }; - } - return { - mmask: M366MASK, - mdaymask: MDAY366MASK, - nmdaymask: NMDAY366MASK, - wdaymask: WDAYMASK.slice(wday), - mrange: M366RANGE - }; -} - -function rebuildMonth(year, month, yearlen, mrange, wdaymask, options) { - var result = { - lastyear: year, - lastmonth: month, - nwdaymask: [] - }; - var ranges = []; - if (options.freq === RRule.YEARLY) { - if (empty$1(options.bymonth)) { - ranges = [[0, yearlen]]; - } - else { - for (var j = 0; j < options.bymonth.length; j++) { - month = options.bymonth[j]; - ranges.push(mrange.slice(month - 1, month + 1)); - } - } - } - else if (options.freq === RRule.MONTHLY) { - ranges = [mrange.slice(month - 1, month + 1)]; - } - if (empty$1(ranges)) { - return result; - } - // Weekly frequency won't get here, so we may not - // care about cross-year weekly periods. - result.nwdaymask = repeat(0, yearlen); - for (var j = 0; j < ranges.length; j++) { - var rang = ranges[j]; - var first = rang[0]; - var last = rang[1] - 1; - for (var k = 0; k < options.bynweekday.length; k++) { - var i = void 0; - var _a = options.bynweekday[k], wday = _a[0], n = _a[1]; - if (n < 0) { - i = last + (n + 1) * 7; - i -= pymod(wdaymask[i] - wday, 7); - } - else { - i = first + (n - 1) * 7; - i += pymod(7 - wdaymask[i] + wday, 7); - } - if (first <= i && i <= last) - result.nwdaymask[i] = 1; - } - } - return result; -} - -function easter(y, offset) { - if (offset === void 0) { offset = 0; } - var a = y % 19; - var b = Math.floor(y / 100); - var c = y % 100; - var d = Math.floor(b / 4); - var e = b % 4; - var f = Math.floor((b + 8) / 25); - var g = Math.floor((b - f + 1) / 3); - var h = Math.floor(19 * a + b - d - g + 15) % 30; - var i = Math.floor(c / 4); - var k = c % 4; - var l = Math.floor(32 + 2 * e + 2 * i - h - k) % 7; - var m = Math.floor((a + 11 * h + 22 * l) / 451); - var month = Math.floor((h + l - 7 * m + 114) / 31); - var day = ((h + l - 7 * m + 114) % 31) + 1; - var date = Date.UTC(y, month - 1, day + offset); - var yearStart = Date.UTC(y, 0, 1); - return [Math.ceil((date - yearStart) / (1000 * 60 * 60 * 24))]; -} - -// ============================================================================= -// Iterinfo -// ============================================================================= -var Iterinfo = /** @class */ (function () { - function Iterinfo(options) { - this.options = options; - } - Iterinfo.prototype.rebuild = function (year, month) { - var options = this.options; - if (year !== this.lastyear) { - this.yearinfo = rebuildYear(year, options); - } - if (notEmpty(options.bynweekday) && - (month !== this.lastmonth || year !== this.lastyear)) { - var _a = this.yearinfo, yearlen = _a.yearlen, mrange = _a.mrange, wdaymask = _a.wdaymask; - this.monthinfo = rebuildMonth(year, month, yearlen, mrange, wdaymask, options); - } - if (isPresent(options.byeaster)) { - this.eastermask = easter(year, options.byeaster); - } - }; - Object.defineProperty(Iterinfo.prototype, "lastyear", { - get: function () { - return this.monthinfo ? this.monthinfo.lastyear : null; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Iterinfo.prototype, "lastmonth", { - get: function () { - return this.monthinfo ? this.monthinfo.lastmonth : null; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Iterinfo.prototype, "yearlen", { - get: function () { - return this.yearinfo.yearlen; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Iterinfo.prototype, "yearordinal", { - get: function () { - return this.yearinfo.yearordinal; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Iterinfo.prototype, "mrange", { - get: function () { - return this.yearinfo.mrange; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Iterinfo.prototype, "wdaymask", { - get: function () { - return this.yearinfo.wdaymask; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Iterinfo.prototype, "mmask", { - get: function () { - return this.yearinfo.mmask; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Iterinfo.prototype, "wnomask", { - get: function () { - return this.yearinfo.wnomask; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Iterinfo.prototype, "nwdaymask", { - get: function () { - return this.monthinfo ? this.monthinfo.nwdaymask : []; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Iterinfo.prototype, "nextyearlen", { - get: function () { - return this.yearinfo.nextyearlen; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Iterinfo.prototype, "mdaymask", { - get: function () { - return this.yearinfo.mdaymask; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Iterinfo.prototype, "nmdaymask", { - get: function () { - return this.yearinfo.nmdaymask; - }, - enumerable: true, - configurable: true - }); - Iterinfo.prototype.ydayset = function () { - return [range(this.yearlen), 0, this.yearlen]; - }; - Iterinfo.prototype.mdayset = function (_, month, __) { - var start = this.mrange[month - 1]; - var end = this.mrange[month]; - var set = repeat(null, this.yearlen); - for (var i = start; i < end; i++) - set[i] = i; - return [set, start, end]; - }; - Iterinfo.prototype.wdayset = function (year, month, day) { - // We need to handle cross-year weeks here. - var set = repeat(null, this.yearlen + 7); - var i = dateutil$1.toOrdinal(new Date(Date.UTC(year, month - 1, day))) - - this.yearordinal; - var start = i; - for (var j = 0; j < 7; j++) { - set[i] = i; - ++i; - if (this.wdaymask[i] === this.options.wkst) - break; - } - return [set, start, i]; - }; - Iterinfo.prototype.ddayset = function (year, month, day) { - var set = repeat(null, this.yearlen); - var i = dateutil$1.toOrdinal(new Date(Date.UTC(year, month - 1, day))) - - this.yearordinal; - set[i] = i; - return [set, i, i + 1]; - }; - Iterinfo.prototype.htimeset = function (hour, _, second, millisecond) { - var _this = this; - var set = []; - this.options.byminute.forEach(function (minute) { - set = set.concat(_this.mtimeset(hour, minute, second, millisecond)); - }); - dateutil$1.sort(set); - return set; - }; - Iterinfo.prototype.mtimeset = function (hour, minute, _, millisecond) { - var set = this.options.bysecond.map(function (second) { - return new Time(hour, minute, second, millisecond); - }); - dateutil$1.sort(set); - return set; - }; - Iterinfo.prototype.stimeset = function (hour, minute, second, millisecond) { - return [new Time(hour, minute, second, millisecond)]; - }; - Iterinfo.prototype.getdayset = function (freq) { - switch (freq) { - case Frequency.YEARLY: return this.ydayset.bind(this); - case Frequency.MONTHLY: return this.mdayset.bind(this); - case Frequency.WEEKLY: return this.wdayset.bind(this); - case Frequency.DAILY: return this.ddayset.bind(this); - default: return this.ddayset.bind(this); - } - }; - Iterinfo.prototype.gettimeset = function (freq) { - switch (freq) { - case Frequency.HOURLY: return this.htimeset.bind(this); - case Frequency.MINUTELY: return this.mtimeset.bind(this); - case Frequency.SECONDLY: return this.stimeset.bind(this); - } - }; - return Iterinfo; -}()); - -function buildPoslist(bysetpos, timeset, start, end, ii, dayset) { - var poslist = []; - for (var j = 0; j < bysetpos.length; j++) { - var daypos = void 0; - var timepos = void 0; - var pos = bysetpos[j]; - if (pos < 0) { - daypos = Math.floor(pos / timeset.length); - timepos = pymod(pos, timeset.length); - } - else { - daypos = Math.floor((pos - 1) / timeset.length); - timepos = pymod(pos - 1, timeset.length); - } - var tmp = []; - for (var k = start; k < end; k++) { - var val = dayset[k]; - if (!isPresent(val)) - continue; - tmp.push(val); - } - var i = void 0; - if (daypos < 0) { - i = tmp.slice(daypos)[0]; - } - else { - i = tmp[daypos]; - } - var time = timeset[timepos]; - var date = dateutil$1.fromOrdinal(ii.yearordinal + i); - var res = dateutil$1.combine(date, time); - // XXX: can this ever be in the array? - // - compare the actual date instead? - if (!includes(poslist, res)) - poslist.push(res); - } - dateutil$1.sort(poslist); - return poslist; -} - -function iter(iterResult, options) { - var dtstart = options.dtstart, freq = options.freq, interval = options.interval, until = options.until, bysetpos = options.bysetpos; - var count = options.count; - if (count === 0 || interval === 0) { - return emitResult(iterResult); - } - var counterDate = DateTime.fromDate(dtstart); - var ii = new Iterinfo(options); - ii.rebuild(counterDate.year, counterDate.month); - var timeset = makeTimeset(ii, counterDate, options); - while (true) { - var _a = ii.getdayset(freq)(counterDate.year, counterDate.month, counterDate.day), dayset = _a[0], start = _a[1], end = _a[2]; - var filtered = removeFilteredDays(dayset, start, end, ii, options); - if (notEmpty(bysetpos)) { - var poslist = buildPoslist(bysetpos, timeset, start, end, ii, dayset); - for (var j = 0; j < poslist.length; j++) { - var res = poslist[j]; - if (until && res > until) { - return emitResult(iterResult); - } - if (res >= dtstart) { - var rezonedDate = rezoneIfNeeded(res, options); - if (!iterResult.accept(rezonedDate)) { - return emitResult(iterResult); - } - if (count) { - --count; - if (!count) { - return emitResult(iterResult); - } - } - } - } - } - else { - for (var j = start; j < end; j++) { - var currentDay = dayset[j]; - if (!isPresent(currentDay)) { - continue; - } - var date = dateutil$1.fromOrdinal(ii.yearordinal + currentDay); - for (var k = 0; k < timeset.length; k++) { - var time = timeset[k]; - var res = dateutil$1.combine(date, time); - if (until && res > until) { - return emitResult(iterResult); - } - if (res >= dtstart) { - var rezonedDate = rezoneIfNeeded(res, options); - if (!iterResult.accept(rezonedDate)) { - return emitResult(iterResult); - } - if (count) { - --count; - if (!count) { - return emitResult(iterResult); - } - } - } - } - } - } - if (options.interval === 0) { - return emitResult(iterResult); - } - // Handle frequency and interval - counterDate.add(options, filtered); - if (counterDate.year > dateutil$1.MAXYEAR) { - return emitResult(iterResult); - } - if (!freqIsDailyOrGreater(freq)) { - timeset = ii.gettimeset(freq)(counterDate.hour, counterDate.minute, counterDate.second, 0); - } - ii.rebuild(counterDate.year, counterDate.month); - } -} -function isFiltered(ii, currentDay, options) { - var bymonth = options.bymonth, byweekno = options.byweekno, byweekday = options.byweekday, byeaster = options.byeaster, bymonthday = options.bymonthday, bynmonthday = options.bynmonthday, byyearday = options.byyearday; - return ((notEmpty(bymonth) && !includes(bymonth, ii.mmask[currentDay])) || - (notEmpty(byweekno) && !ii.wnomask[currentDay]) || - (notEmpty(byweekday) && !includes(byweekday, ii.wdaymask[currentDay])) || - (notEmpty(ii.nwdaymask) && !ii.nwdaymask[currentDay]) || - (byeaster !== null && !includes(ii.eastermask, currentDay)) || - ((notEmpty(bymonthday) || notEmpty(bynmonthday)) && - !includes(bymonthday, ii.mdaymask[currentDay]) && - !includes(bynmonthday, ii.nmdaymask[currentDay])) || - (notEmpty(byyearday) && - ((currentDay < ii.yearlen && - !includes(byyearday, currentDay + 1) && - !includes(byyearday, -ii.yearlen + currentDay)) || - (currentDay >= ii.yearlen && - !includes(byyearday, currentDay + 1 - ii.yearlen) && - !includes(byyearday, -ii.nextyearlen + currentDay - ii.yearlen))))); -} -function rezoneIfNeeded(date, options) { - return new DateWithZone(date, options.tzid).rezonedDate(); -} -function emitResult(iterResult) { - return iterResult.getValue(); -} -function removeFilteredDays(dayset, start, end, ii, options) { - var filtered = false; - for (var dayCounter = start; dayCounter < end; dayCounter++) { - var currentDay = dayset[dayCounter]; - filtered = isFiltered(ii, currentDay, options); - if (filtered) - dayset[currentDay] = null; - } - return filtered; -} -function makeTimeset(ii, counterDate, options) { - var freq = options.freq, byhour = options.byhour, byminute = options.byminute, bysecond = options.bysecond; - if (freqIsDailyOrGreater(freq)) { - return buildTimeset(options); - } - if ((freq >= RRule.HOURLY && - notEmpty(byhour) && - !includes(byhour, counterDate.hour)) || - (freq >= RRule.MINUTELY && - notEmpty(byminute) && - !includes(byminute, counterDate.minute)) || - (freq >= RRule.SECONDLY && - notEmpty(bysecond) && - !includes(bysecond, counterDate.second))) { - return []; - } - return ii.gettimeset(freq)(counterDate.hour, counterDate.minute, counterDate.second, counterDate.millisecond); -} - -// ============================================================================= -// RRule -// ============================================================================= -var Days = { - MO: new Weekday(0), - TU: new Weekday(1), - WE: new Weekday(2), - TH: new Weekday(3), - FR: new Weekday(4), - SA: new Weekday(5), - SU: new Weekday(6) -}; -var DEFAULT_OPTIONS = { - freq: Frequency.YEARLY, - dtstart: null, - interval: 1, - wkst: Days.MO, - count: null, - until: null, - tzid: null, - bysetpos: null, - bymonth: null, - bymonthday: null, - bynmonthday: null, - byyearday: null, - byweekno: null, - byweekday: null, - bynweekday: null, - byhour: null, - byminute: null, - bysecond: null, - byeaster: null -}; -var defaultKeys = Object.keys(DEFAULT_OPTIONS); -/** - * - * @param {Options?} options - see - * The only required option is `freq`, one of RRule.YEARLY, RRule.MONTHLY, ... - * @constructor - */ -var RRule = /** @class */ (function () { - function RRule(options, noCache) { - if (options === void 0) { options = {}; } - if (noCache === void 0) { noCache = false; } - // RFC string - this._cache = noCache ? null : new Cache(); - // used by toString() - this.origOptions = initializeOptions(options); - var parsedOptions = parseOptions(options).parsedOptions; - this.options = parsedOptions; - } - RRule.parseText = function (text, language) { - return parseText(text, language); - }; - RRule.fromText = function (text, language) { - return fromText(text, language); - }; - RRule.fromString = function (str) { - return new RRule(RRule.parseString(str) || undefined); - }; - RRule.prototype._iter = function (iterResult) { - return iter(iterResult, this.options); - }; - RRule.prototype._cacheGet = function (what, args) { - if (!this._cache) - return false; - return this._cache._cacheGet(what, args); - }; - RRule.prototype._cacheAdd = function (what, value, args) { - if (!this._cache) - return; - return this._cache._cacheAdd(what, value, args); - }; - /** - * @param {Function} iterator - optional function that will be called - * on each date that is added. It can return false - * to stop the iteration. - * @return Array containing all recurrences. - */ - RRule.prototype.all = function (iterator) { - if (iterator) { - return this._iter(new CallbackIterResult('all', {}, iterator)); - } - var result = this._cacheGet('all'); - if (result === false) { - result = this._iter(new IterResult('all', {})); - this._cacheAdd('all', result); - } - return result; - }; - /** - * Returns all the occurrences of the rrule between after and before. - * The inc keyword defines what happens if after and/or before are - * themselves occurrences. With inc == True, they will be included in the - * list, if they are found in the recurrence set. - * @return Array - */ - RRule.prototype.between = function (after, before, inc, iterator) { - if (inc === void 0) { inc = false; } - if (!dateutil$1.isValidDate(after) || !dateutil$1.isValidDate(before)) - throw new Error('Invalid date passed in to RRule.between'); - var args = { - before: before, - after: after, - inc: inc - }; - if (iterator) { - return this._iter(new CallbackIterResult('between', args, iterator)); - } - var result = this._cacheGet('between', args); - if (result === false) { - result = this._iter(new IterResult('between', args)); - this._cacheAdd('between', result, args); - } - return result; - }; - /** - * Returns the last recurrence before the given datetime instance. - * The inc keyword defines what happens if dt is an occurrence. - * With inc == True, if dt itself is an occurrence, it will be returned. - * @return Date or null - */ - RRule.prototype.before = function (dt, inc) { - if (inc === void 0) { inc = false; } - if (!dateutil$1.isValidDate(dt)) - throw new Error('Invalid date passed in to RRule.before'); - var args = { dt: dt, inc: inc }; - var result = this._cacheGet('before', args); - if (result === false) { - result = this._iter(new IterResult('before', args)); - this._cacheAdd('before', result, args); - } - return result; - }; - /** - * Returns the first recurrence after the given datetime instance. - * The inc keyword defines what happens if dt is an occurrence. - * With inc == True, if dt itself is an occurrence, it will be returned. - * @return Date or null - */ - RRule.prototype.after = function (dt, inc) { - if (inc === void 0) { inc = false; } - if (!dateutil$1.isValidDate(dt)) - throw new Error('Invalid date passed in to RRule.after'); - var args = { dt: dt, inc: inc }; - var result = this._cacheGet('after', args); - if (result === false) { - result = this._iter(new IterResult('after', args)); - this._cacheAdd('after', result, args); - } - return result; - }; - /** - * Returns the number of recurrences in this set. It will have go trough - * the whole recurrence, if this hasn't been done before. - */ - RRule.prototype.count = function () { - return this.all().length; - }; - /** - * Converts the rrule into its string representation - * @see - * @return String - */ - RRule.prototype.toString = function () { - return optionsToString(this.origOptions); - }; - /** - * Will convert all rules described in nlp:ToText - * to text. - */ - RRule.prototype.toText = function (gettext, language, dateFormatter) { - return toText(this, gettext, language, dateFormatter); - }; - RRule.prototype.isFullyConvertibleToText = function () { - return isFullyConvertible(this); - }; - /** - * @return a RRule instance with the same freq and options - * as this one (cache is not cloned) - */ - RRule.prototype.clone = function () { - return new RRule(this.origOptions); - }; - // RRule class 'constants' - RRule.FREQUENCIES = [ - 'YEARLY', - 'MONTHLY', - 'WEEKLY', - 'DAILY', - 'HOURLY', - 'MINUTELY', - 'SECONDLY' - ]; - RRule.YEARLY = Frequency.YEARLY; - RRule.MONTHLY = Frequency.MONTHLY; - RRule.WEEKLY = Frequency.WEEKLY; - RRule.DAILY = Frequency.DAILY; - RRule.HOURLY = Frequency.HOURLY; - RRule.MINUTELY = Frequency.MINUTELY; - RRule.SECONDLY = Frequency.SECONDLY; - RRule.MO = Days.MO; - RRule.TU = Days.TU; - RRule.WE = Days.WE; - RRule.TH = Days.TH; - RRule.FR = Days.FR; - RRule.SA = Days.SA; - RRule.SU = Days.SU; - RRule.parseString = parseString; - RRule.optionsToString = optionsToString; - return RRule; -}()); - -function iterSet(iterResult, _rrule, _exrule, _rdate, _exdate, tzid) { - var _exdateHash = {}; - var _accept = iterResult.accept; - function evalExdate(after, before) { - _exrule.forEach(function (rrule) { - rrule.between(after, before, true).forEach(function (date) { - _exdateHash[Number(date)] = true; - }); - }); - } - _exdate.forEach(function (date) { - var zonedDate = new DateWithZone(date, tzid).rezonedDate(); - _exdateHash[Number(zonedDate)] = true; - }); - iterResult.accept = function (date) { - var dt = Number(date); - if (isNaN(dt)) - return _accept.call(this, date); - if (!_exdateHash[dt]) { - evalExdate(new Date(dt - 1), new Date(dt + 1)); - if (!_exdateHash[dt]) { - _exdateHash[dt] = true; - return _accept.call(this, date); - } - } - return true; - }; - if (iterResult.method === 'between') { - evalExdate(iterResult.args.after, iterResult.args.before); - iterResult.accept = function (date) { - var dt = Number(date); - if (!_exdateHash[dt]) { - _exdateHash[dt] = true; - return _accept.call(this, date); - } - return true; - }; - } - for (var i = 0; i < _rdate.length; i++) { - var zonedDate = new DateWithZone(_rdate[i], tzid).rezonedDate(); - if (!iterResult.accept(new Date(zonedDate.getTime()))) - break; - } - _rrule.forEach(function (rrule) { - iter(iterResult, rrule.options); - }); - var res = iterResult._result; - dateutil$1.sort(res); - switch (iterResult.method) { - case 'all': - case 'between': - return res; - case 'before': - return ((res.length && res[res.length - 1]) || null); - case 'after': - default: - return ((res.length && res[0]) || null); - } -} - -/** - * RRuleStr - * To parse a set of rrule strings - */ -var DEFAULT_OPTIONS$1 = { - dtstart: null, - cache: false, - unfold: false, - forceset: false, - compatible: false, - tzid: null -}; -function parseInput(s, options) { - var rrulevals = []; - var rdatevals = []; - var exrulevals = []; - var exdatevals = []; - var _a = parseDtstart(s), dtstart = _a.dtstart, tzid = _a.tzid; - var lines = splitIntoLines(s, options.unfold); - lines.forEach(function (line) { - if (!line) - return; - var _a = breakDownLine(line), name = _a.name, parms = _a.parms, value = _a.value; - switch (name.toUpperCase()) { - case 'RRULE': - if (parms.length) { - throw new Error("unsupported RRULE parm: " + parms.join(',')); - } - rrulevals.push(parseString(line)); - break; - case 'RDATE': - var _b = /RDATE(?:;TZID=([^:=]+))?/i.exec(line), _ = _b[0], rdateTzid = _b[1]; - if (rdateTzid && !tzid) { - tzid = rdateTzid; - } - rdatevals = rdatevals.concat(parseRDate(value, parms)); - break; - case 'EXRULE': - if (parms.length) { - throw new Error("unsupported EXRULE parm: " + parms.join(',')); - } - exrulevals.push(parseString(value)); - break; - case 'EXDATE': - exdatevals = exdatevals.concat(parseRDate(value, parms)); - break; - case 'DTSTART': - break; - default: - throw new Error('unsupported property: ' + name); - } - }); - return { - dtstart: dtstart, - tzid: tzid, - rrulevals: rrulevals, - rdatevals: rdatevals, - exrulevals: exrulevals, - exdatevals: exdatevals - }; -} -function buildRule(s, options) { - var _a = parseInput(s, options), rrulevals = _a.rrulevals, rdatevals = _a.rdatevals, exrulevals = _a.exrulevals, exdatevals = _a.exdatevals, dtstart = _a.dtstart, tzid = _a.tzid; - var noCache = options.cache === false; - if (options.compatible) { - options.forceset = true; - options.unfold = true; - } - if (options.forceset || - rrulevals.length > 1 || - rdatevals.length || - exrulevals.length || - exdatevals.length) { - var rset_1 = new RRuleSet(noCache); - rset_1.dtstart(dtstart); - rset_1.tzid(tzid || undefined); - rrulevals.forEach(function (val) { - rset_1.rrule(new RRule(groomRruleOptions(val, dtstart, tzid), noCache)); - }); - rdatevals.forEach(function (date) { - rset_1.rdate(date); - }); - exrulevals.forEach(function (val) { - rset_1.exrule(new RRule(groomRruleOptions(val, dtstart, tzid), noCache)); - }); - exdatevals.forEach(function (date) { - rset_1.exdate(date); - }); - if (options.compatible && options.dtstart) - rset_1.rdate(dtstart); - return rset_1; - } - var val = rrulevals[0] || {}; - return new RRule(groomRruleOptions(val, val.dtstart || options.dtstart || dtstart, val.tzid || options.tzid || tzid), noCache); -} -function rrulestr(s, options) { - if (options === void 0) { options = {}; } - return buildRule(s, initializeOptions$1(options)); -} -function groomRruleOptions(val, dtstart, tzid) { - return __assign(__assign({}, val), { dtstart: dtstart, - tzid: tzid }); -} -function initializeOptions$1(options) { - var invalid = []; - var keys = Object.keys(options); - var defaultKeys = Object.keys(DEFAULT_OPTIONS$1); - keys.forEach(function (key) { - if (!includes(defaultKeys, key)) - invalid.push(key); - }); - if (invalid.length) { - throw new Error('Invalid options: ' + invalid.join(', ')); - } - return __assign(__assign({}, DEFAULT_OPTIONS$1), options); -} -function extractName(line) { - if (line.indexOf(':') === -1) { - return { - name: 'RRULE', - value: line - }; - } - var _a = split(line, ':', 1), name = _a[0], value = _a[1]; - return { - name: name, - value: value - }; -} -function breakDownLine(line) { - var _a = extractName(line), name = _a.name, value = _a.value; - var parms = name.split(';'); - if (!parms) - throw new Error('empty property name'); - return { - name: parms[0].toUpperCase(), - parms: parms.slice(1), - value: value - }; -} -function splitIntoLines(s, unfold) { - if (unfold === void 0) { unfold = false; } - s = s && s.trim(); - if (!s) - throw new Error('Invalid empty string'); - // More info about 'unfold' option - // Go head to http://www.ietf.org/rfc/rfc2445.txt - if (!unfold) { - return s.split(/\s/); - } - var lines = s.split('\n'); - var i = 0; - while (i < lines.length) { - // TODO - var line = (lines[i] = lines[i].replace(/\s+$/g, '')); - if (!line) { - lines.splice(i, 1); - } - else if (i > 0 && line[0] === ' ') { - lines[i - 1] += line.slice(1); - lines.splice(i, 1); - } - else { - i += 1; - } - } - return lines; -} -function validateDateParm(parms) { - parms.forEach(function (parm) { - if (!/(VALUE=DATE(-TIME)?)|(TZID=)/.test(parm)) { - throw new Error('unsupported RDATE/EXDATE parm: ' + parm); - } - }); -} -function parseRDate(rdateval, parms) { - validateDateParm(parms); - return rdateval - .split(',') - .map(function (datestr) { return dateutil$1.untilStringToDate(datestr); }); -} - -function createGetterSetter(fieldName) { - var _this = this; - return function (field) { - if (field !== undefined) { - _this["_" + fieldName] = field; - } - if (_this["_" + fieldName] !== undefined) { - return _this["_" + fieldName]; - } - for (var i = 0; i < _this._rrule.length; i++) { - var field_1 = _this._rrule[i].origOptions[fieldName]; - if (field_1) { - return field_1; - } - } - }; -} -var RRuleSet = /** @class */ (function (_super) { - __extends(RRuleSet, _super); - /** - * - * @param {Boolean?} noCache - * The same stratagy as RRule on cache, default to false - * @constructor - */ - function RRuleSet(noCache) { - if (noCache === void 0) { noCache = false; } - var _this = _super.call(this, {}, noCache) || this; - _this.dtstart = createGetterSetter.apply(_this, ['dtstart']); - _this.tzid = createGetterSetter.apply(_this, ['tzid']); - _this._rrule = []; - _this._rdate = []; - _this._exrule = []; - _this._exdate = []; - return _this; - } - RRuleSet.prototype._iter = function (iterResult) { - return iterSet(iterResult, this._rrule, this._exrule, this._rdate, this._exdate, this.tzid()); - }; - /** - * Adds an RRule to the set - * - * @param {RRule} - */ - RRuleSet.prototype.rrule = function (rrule) { - _addRule(rrule, this._rrule); - }; - /** - * Adds an EXRULE to the set - * - * @param {RRule} - */ - RRuleSet.prototype.exrule = function (rrule) { - _addRule(rrule, this._exrule); - }; - /** - * Adds an RDate to the set - * - * @param {Date} - */ - RRuleSet.prototype.rdate = function (date) { - _addDate(date, this._rdate); - }; - /** - * Adds an EXDATE to the set - * - * @param {Date} - */ - RRuleSet.prototype.exdate = function (date) { - _addDate(date, this._exdate); - }; - /** - * Get list of included rrules in this recurrence set. - * - * @return List of rrules - */ - RRuleSet.prototype.rrules = function () { - return this._rrule.map(function (e) { return rrulestr(e.toString()); }); - }; - /** - * Get list of excluded rrules in this recurrence set. - * - * @return List of exrules - */ - RRuleSet.prototype.exrules = function () { - return this._exrule.map(function (e) { return rrulestr(e.toString()); }); - }; - /** - * Get list of included datetimes in this recurrence set. - * - * @return List of rdates - */ - RRuleSet.prototype.rdates = function () { - return this._rdate.map(function (e) { return new Date(e.getTime()); }); - }; - /** - * Get list of included datetimes in this recurrence set. - * - * @return List of exdates - */ - RRuleSet.prototype.exdates = function () { - return this._exdate.map(function (e) { return new Date(e.getTime()); }); - }; - RRuleSet.prototype.valueOf = function () { - var result = []; - if (!this._rrule.length && this._dtstart) { - result = result.concat(optionsToString({ dtstart: this._dtstart })); - } - this._rrule.forEach(function (rrule) { - result = result.concat(rrule.toString().split('\n')); - }); - this._exrule.forEach(function (exrule) { - result = result.concat(exrule.toString().split('\n') - .map(function (line) { return line.replace(/^RRULE:/, 'EXRULE:'); }) - .filter(function (line) { return !/^DTSTART/.test(line); })); - }); - if (this._rdate.length) { - result.push(rdatesToString('RDATE', this._rdate, this.tzid())); - } - if (this._exdate.length) { - result.push(rdatesToString('EXDATE', this._exdate, this.tzid())); - } - return result; - }; - /** - * to generate recurrence field such as: - * DTSTART:19970902T010000Z - * RRULE:FREQ=YEARLY;COUNT=2;BYDAY=TU - * RRULE:FREQ=YEARLY;COUNT=1;BYDAY=TH - */ - RRuleSet.prototype.toString = function () { - return this.valueOf().join('\n'); - }; - /** - * Create a new RRuleSet Object completely base on current instance - */ - RRuleSet.prototype.clone = function () { - var rrs = new RRuleSet(!!this._cache); - this._rrule.forEach(function (rule) { return rrs.rrule(rule.clone()); }); - this._exrule.forEach(function (rule) { return rrs.exrule(rule.clone()); }); - this._rdate.forEach(function (date) { return rrs.rdate(new Date(date.getTime())); }); - this._exdate.forEach(function (date) { return rrs.exdate(new Date(date.getTime())); }); - return rrs; - }; - return RRuleSet; -}(RRule)); -function _addRule(rrule, collection) { - if (!(rrule instanceof RRule)) { - throw new TypeError(String(rrule) + ' is not RRule instance'); - } - if (!includes(collection.map(String), String(rrule))) { - collection.push(rrule); - } -} -function _addDate(date, collection) { - if (!(date instanceof Date)) { - throw new TypeError(String(date) + ' is not Date instance'); - } - if (!includes(collection.map(Number), Number(date))) { - collection.push(date); - dateutil$1.sort(collection); - } -} -function rdatesToString(param, rdates, tzid) { - var isUTC = !tzid || tzid.toUpperCase() === 'UTC'; - var header = isUTC ? param + ":" : param + ";TZID=" + tzid + ":"; - var dateString = rdates - .map(function (rdate) { return dateutil$1.timeToUntilString(rdate.valueOf(), isUTC); }) - .join(','); - return "" + header + dateString; -} - -var Frequency$1; -(function (Frequency) { - Frequency["None"] = "NONE"; - Frequency["Daily"] = "DAILY"; - Frequency["Weekly"] = "WEEKLY"; - Frequency["Monthly"] = "MONTHLY"; - Frequency["Yearly"] = "YEARLY"; -})(Frequency$1 || (Frequency$1 = {})); -class RepeatAdapter { - constructor(rrule) { - /** - * The subscribe function implements the Store interface in Svelte. The - * subscribers must be called any time there is a change to the task. - */ - this.subscribe = (subscription) => { - const maxID = this.subscriptions.reduce((prev, { id }) => Math.max(prev, id), 0); - const newID = maxID + 1; - this.subscriptions.push({ id: newID, hook: subscription }); - subscription(this); - // Return an unsubscribe function - return () => { - this.subscriptions = this.subscriptions.filter(({ id }) => id !== newID); - console.log(`Removing subscription ${newID}`); - }; - }; - /** - * The set function implements the Store interface in Svelte. We are not - * actually using it to store new values, but it is needed when binding to - * properties. - */ - this.set = (_) => { }; - this.isValid = () => this.rrule.toString() !== ''; - this.next = (count) => this.rrule.all((_, len) => len < count); - this.toText = () => this.rrule.isFullyConvertibleToText() - ? this.rrule.toText() - : this.rrule.toString(); - this.toString = () => this.rrule.toString(); - this.asRRule = () => RRule.fromText(this.toText()); - this.setDaysOfWeek = (ids) => { - const weekdayList = new Array(ids.length); - const numberList = new Array(ids.length); - for (let i = 0; i < ids.length; i++) { - weekdayList[i] = new Weekday(ids[i]); - numberList[i] = ids[i]; - } - this.rrule.origOptions.byweekday = weekdayList; - this.rrule.options.byweekday = numberList; - this.notify(); - }; - this.setWeekDaysOfMonth = (selected) => { - this.rrule.origOptions.byweekday = selected.map(({ week, weekDay }) => new Weekday(parseInt(weekDay, 10), parseInt(week, 10))); - // Incompatible with week days of month - this.rrule.origOptions.bymonthday = undefined; - this.rrule.options.bymonthday = []; - this.notify(); - }; - this.getWeekDaysOfMonth = () => { - const weekdays = this.rrule.origOptions.byweekday; - if (Array.isArray(weekdays)) { - return weekdays - .filter((day) => typeof day !== 'string' && typeof day !== 'number') - .filter((day) => day.n !== undefined) - .map((day) => ({ - week: day.n.toString(), - weekDay: day.weekday.toString(), - })); - } - // TODO: This might be overly restrictive, if people write custom RRule syntax. - return []; - }; - this.setMonthsOfYear = (ids) => { - this.rrule.origOptions.bymonth = ids; - this.rrule.options.bymonth = this.rrule.origOptions.bymonth; - this.notify(); - }; - /** - * Notify subscriptions of a change. - */ - this.notify = () => this.subscriptions.forEach(({ hook }) => hook(this)); - this.rrule = rrule; - this.subscriptions = []; - } - get frequency() { - switch (this.rrule.options.freq) { - case Frequency.YEARLY: - return Frequency$1.Yearly; - case Frequency.MONTHLY: - return Frequency$1.Monthly; - case Frequency.WEEKLY: - return Frequency$1.Weekly; - case Frequency.DAILY: - return Frequency$1.Daily; - default: - // TODO: Display a notification instead? - throw new Error(`Invalid frequency ${this.rrule.options.freq} in repetition`); - } - } - set frequency(frequency) { - switch (frequency) { - case Frequency$1.Yearly: - this.rrule.options.freq = Frequency.YEARLY; - this.rrule.origOptions.freq = Frequency.YEARLY; - break; - case Frequency$1.Monthly: - this.rrule.options.freq = Frequency.MONTHLY; - this.rrule.origOptions.freq = Frequency.MONTHLY; - break; - case Frequency$1.Weekly: - this.rrule.options.freq = Frequency.WEEKLY; - this.rrule.origOptions.freq = Frequency.WEEKLY; - break; - case Frequency$1.Daily: - this.rrule.options.freq = Frequency.DAILY; - this.rrule.origOptions.freq = Frequency.DAILY; - break; - default: - // TODO: Display a notification instead? - throw new Error(`Invalid frequency ${frequency} requested`); - } - // reset other config options - this.rrule.options.bymonth = undefined; - this.rrule.origOptions.bymonth = undefined; - this.rrule.options.bymonthday = undefined; - this.rrule.origOptions.bymonthday = undefined; - this.rrule.options.byweekday = undefined; - this.rrule.origOptions.byweekday = undefined; - this.notify(); - } - get interval() { - return this.rrule.options.interval; - } - set interval(n) { - // do not set to null or 0 - const newVal = n ? n : 1; - if (newVal !== this.rrule.options.interval) { - this.rrule.options.interval = n ? n : 1; - this.notify(); - } - } - get daysOfWeek() { - const weekdays = this.rrule.origOptions.byweekday; - if (!weekdays) { - return []; - } - else if (Array.isArray(weekdays)) { - return weekdays.map(this.ByWeekdayToNumber); - } - return [this.ByWeekdayToNumber(weekdays)]; - } - get dayOfMonth() { - const day = this.rrule.origOptions.bymonthday; - if (Array.isArray(day)) { - if (day.length > 0) { - return day[0]; - } - return null; - } - return day; - } - set dayOfMonth(n) { - this.rrule.origOptions.bymonthday = n; - this.rrule.options.bymonthday = [n]; - // Incompatible with day of month - this.rrule.origOptions.byweekday = []; - this.notify(); - } - set lastDayOfMonth(val) { - if (val) { - this.rrule.origOptions.bymonthday = -1; - this.rrule.options.bymonthday = [-1]; - } - else { - this.rrule.origOptions.bymonthday = []; - this.rrule.options.bymonthday = []; - } - this.notify(); - } - get lastDayOfMonth() { - const day = this.rrule.origOptions.bymonthday; - if (Array.isArray(day)) { - return day.length > 0 ? day[0] === -1 : false; - } - return day === -1; - } - get monthsOfYear() { - const months = this.rrule.origOptions.bymonth; - if (months === undefined) { - return []; - } - if (typeof months === 'number') { - return [months]; - } - return months; - } - ByWeekdayToNumber(wd) { - if (typeof wd === 'number') { - return wd; - } - else if (typeof wd === 'string') { - return 0; // TODO - } - return wd.weekday; - } -} - -const taskRe = /^\s*- \[[ xX>\-]\] /; -/** - * Matches the text following a semicolon or calendar emoji. - * Does not match links or <> - */ -const repeatScheduleRe = /[;📅]\s*([-a-zA-Z0-9 =;:\,]+)/; -class TaskLine { - constructor(lineNum, file, fileLines, // Can not use async in a constructor - vault, settings) { - // Converts the line to be used in places where it was copied to another note - // because it repeats. - // Something like: - // - [ ] This is the task ; Every Sunday - // - [ ] This is the task ; Every Sunday - this.lineAsRepeated = () => this.line.replace(/\[[xX]\]/, '[ ]'); - /** - * Return whether the line stored is actually a valid Markdown task. NOTE: - * This uses regex and is not quite as performant as TaskHandler.isLineTask() - */ - this.isTask = () => taskRe.test(this.line); - /** - * Save the contents of this TaskLine back to the file. - */ - this.save = () => __awaiter(this, void 0, void 0, function* () { - const fileContents = yield this.vault.readFile(this.file, false); - const lines = fileContents.split('\n'); - lines[this.lineNum] = this._line; - const newFileContents = lines.join('\n'); - yield this.vault.writeFile(this.file, newFileContents); - }); - this.createNextRepetition = () => __awaiter(this, void 0, void 0, function* () { - if (!this._repeats) { - return; - } - const currentNoteDate = this.vault.findMomentForDailyNote(this.file); - const nextDate = window - .moment(this.repeater.asRRule().after(currentNoteDate.endOf('day').toDate())) - .startOf('day'); - console.debug({ - msg: 'Creating next task repetition', - repeater: this.repeater.toString(), - completed_note_date: currentNoteDate, - next_note_date: nextDate, - }); - const nextOccurenceFile = yield this.vault.getDailyNote(nextDate); - return addTaskRepetition(nextOccurenceFile, this, this.settings, this.vault); - }); - this.move = (date) => __awaiter(this, void 0, void 0, function* () { - const newFile = yield this.vault.getDailyNote(date); - yield addTaskMove(newFile, this, this.settings, this.vault); - if (this.settings.preserveMovedTasks) { - // MARK WITH [>], and preserve - return markTaskAsCopied(this.file, this.lineNum, this.subContent.length + 1, this.vault); - } - // Remove this task and subcontent - return removeLines(this.file, this.lineNum, this.subContent.length + 1, this.vault); - }); - /** - * Apply the provided repeater to this task, updating the current value if - * there is already a repeat config, or creating one if not. A blockID will - * be generated if one does not already exist. - */ - this.handleRepeaterUpdated = (repeater) => { - if (!this._repeatConfig) { - // Adding a repeat config to a task that previously did not have one - this._line = this._line.trimRight() + ' 📅 ' + repeater.toText(); - } - else { - this._line = this._line - .replace(this._repeatConfig, repeater.toText() + ' ') - .trim(); - } - this._repeatConfig = repeater.toText(); - this._repeats = repeater.isValid(); - return this.save(); - }; - this.skipOccurence = () => __awaiter(this, void 0, void 0, function* () { - if (!this._repeatConfig) { - new obsidian.Notice('Cannot skip an occurence of a non-repeating task'); - return; - } - if (!this.incomplete) { - new obsidian.Notice('Cannot skip a task which has already been checked, moved, or skipped'); - return; - } - yield this.createNextRepetition(); - this._line = this._line.replace(/\[ \]/, '[-]'); - return this.save(); - }); - /** - * getSubContent checks for lines which are nested under this task. They may - * start with any character, they just must be indented more than this line. - * - * No blank lines are allowed between this line and the nested content. - */ - this.getSubContent = (lines) => { - const toReturn = []; - const taskIndentLevel = getLineIndentLevel(this._line); - // Starting on the line after task, look for sub lines - for (let i = this.lineNum + 1; i < lines.length; i++) { - const currentLine = lines[i]; - if (getLineIndentLevel(currentLine) > taskIndentLevel) { - toReturn.push(currentLine); - } - else { - break; - } - } - return toReturn; - }; - /** - * getHeadings returns all headings this task is under up to and including - * the settings.tasksHeader. If the task is not nested under - * settings.tasksHeader, no headings will be returned. - */ - this.getHeadings = (lines) => { - const headings = []; - // Search up through the file from this task, looking for the first heading - let nextHeading = -1; - for (let i = this.lineNum - 1; i >= 0; i--) { - if (getHeaderDepth(lines[i]) > 0) { - nextHeading = i; - break; - } - } - if (nextHeading === -1) { - // found no headings above this task line - return []; - } - do { - headings.push(lines[nextHeading]); - if (lines[nextHeading] === this.settings.tasksHeader) { - // This is the top level that we care about, so stop searching - break; - } - nextHeading = getParentHeaderIndex(nextHeading, lines); - } while (nextHeading > -1); - return headings.reverse(); - }; - this._line = fileLines[lineNum]; - this.lineNum = lineNum; - this.file = file; - this.vault = vault; - this.settings = settings; - if (!this.isTask()) { - return; - } - this.subContent = this.getSubContent(fileLines); - this.headings = this.getHeadings(fileLines); - const repeatMatches = repeatScheduleRe.exec(this._line); - if (repeatMatches && repeatMatches.length === 2) { - this._repeats = true; - this._repeatConfig = repeatMatches[1]; - } - else { - this._repeats = false; - } - } - /** - * line returns the current (possibly modified) value of this task line. - */ - get line() { - return this._line; - } - get repeats() { - return this._repeats; - } - get repeater() { - if (this._repeatConfig) { - return new RepeatAdapter(RRule.fromText(this._repeatConfig)); - } - return new RepeatAdapter(new RRule({ freq: Frequency.WEEKLY, interval: 1 })); - } - get complete() { - const matches = taskRe.exec(this._line); - if (!matches) { - return false; - } - const innerChar = matches[0].trimStart()[3]; - return innerChar === 'x' || innerChar === 'X'; - } - get incomplete() { - const matches = taskRe.exec(this._line); - if (!matches) { - return false; - } - const innerChar = matches[0].trimStart()[3]; - return innerChar === ' '; - } - get skipped() { - const matches = taskRe.exec(this._line); - if (!matches) { - return false; - } - const innerChar = matches[0].trimStart()[3]; - return innerChar === '-'; - } -} -const getParentHeaderIndex = (startingHeaderIdx, lines) => { - const startingHeaderDepth = getHeaderDepth(lines[startingHeaderIdx]); - for (let i = startingHeaderIdx - 1; i >= 0; i--) { - const currentHeaderDepth = getHeaderDepth(lines[i]); - if (currentHeaderDepth > 0 && currentHeaderDepth < startingHeaderDepth) { - return i; - } - } - return -1; -}; -const getLineIndentLevel = (line) => line.length - line.trimStart().length; - -// TODO: Switch taskCache to use the TaskCache class -class TaskHandler { - constructor(vault, metadataCache, settings) { - /** - * Scan the whole file, looking for tasks with repetition configs. - * For each task found, ensure that subsequent tasks have been created. - * - * This function will: - * - Modify the provided file to add block references to repeating tasks - * - Create missing daily notes needed by repeating tasks - * - Insert all occurences of a finite repeating task - * - Insert a configurable number of infinite repeating tasks - */ - this.processFile = (file) => __awaiter(this, void 0, void 0, function* () { - if (!fileIsDailyNote(file, this.vault)) { - console.debug('Slated: Not in a daily note, not processing contained tasks'); - return; - } - const tasks = yield this.getFileTasks(file); - const newlyCompletedTasks = this.filterNewlyCompletedTasks(file.basename, tasks); - this.taskCache[file.basename] = tasks; - return this.propogateCompletedTasks(newlyCompletedTasks); - }); - /** - * moveIncompleted moves all tasks in a file which are not complete to the - * daily note for the provided moment. - * - * Tasks are moved one at a time so that we do not duplicate sub-tasks, and - * so that we are not confused by changing line numbers in the source file as - * we remove tasks. It's not very efficient, but it does seem to work. - */ - this.moveIncompleted = (file, to) => __awaiter(this, void 0, void 0, function* () { - while (true) { - const tasks = yield this.getFileTasks(file); - if (!tasks || !tasks.length) { - return; - } - const firstIncomplete = tasks.find((task) => task.incomplete); - if (!firstIncomplete) { - return; - } - yield firstIncomplete.move(to); - } - }); - this.getCachedTasksForFile = (file) => this.taskCache[file.basename]; - this.getFileTasks = (file) => __awaiter(this, void 0, void 0, function* () { - const cachedListItems = this.metadataCache.getFileCache(file).listItems; - if (!cachedListItems || cachedListItems.length === 0) { - return []; - } - const fileContents = yield this.vault.readFile(file, false); - const splitFileContents = fileContents.split('\n'); - // TODO: Pass info about list start and parent - return cachedListItems - .filter((li) => li.task) - .map((li) => { - return new TaskLine(li.position.start.line, file, splitFileContents, this.vault, this.settings); - }); - }); - /** - * Test if this line is a task. This is called for every line in a file after - * every save, so performance is essential. - */ - this.isLineTask = (line) => { - const trimmed = line.trimStart(); - // We can rule out anything that is not a list by testing a single char - if (trimmed[0] !== '-') { - return false; - } - return (trimmed.startsWith('- [ ] ') || - trimmed.startsWith('- [x] ') || - trimmed.startsWith('- [X] ') || - trimmed.startsWith('- [-] ')); - }; - this.filterNewlyCompletedTasks = (filename, tasks) => { - const prevTasks = this.taskCache[filename]; - return tasks.filter((task) => { - if (!task.complete) { - return false; - } - if (!prevTasks) { - // it's complete and there were no previous tasks, so must be new - return true; - } - for (let i = 0; i < prevTasks.length; i++) { - const prevTask = prevTasks[i]; - if (task.line === prevTask.line) { - // if prevTask complete then not newly completed - return !prevTask.complete; - } - } - // A newly added task that is also complete. - return true; - }); - }; - /** - * Create the next occurence for each of the provided tasks. - */ - this.propogateCompletedTasks = (tasks) => __awaiter(this, void 0, void 0, function* () { - yield Promise.all(tasks - .filter((task) => task.repeats) - .map((task) => task.createNextRepetition())); - }); - this.vault = vault; - this.metadataCache = metadataCache; - this.settings = settings; - this.taskCache = {}; - } -} - -function noop$1() { } -function run$1(fn) { - return fn(); -} -function blank_object$1() { - return Object.create(null); -} -function run_all$1(fns) { - fns.forEach(run$1); -} -function is_function$1(thing) { - return typeof thing === 'function'; -} -function safe_not_equal$1(a, b) { - return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function'); -} -function is_empty$1(obj) { - return Object.keys(obj).length === 0; -} -function subscribe(store, ...callbacks) { - if (store == null) { - return noop$1; - } - const unsub = store.subscribe(...callbacks); - return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub; -} -function component_subscribe(component, store, callback) { - component.$$.on_destroy.push(subscribe(store, callback)); -} - -function append$1(target, node) { - target.appendChild(node); -} -function insert$1(target, node, anchor) { - target.insertBefore(node, anchor || null); -} -function detach$1(node) { - node.parentNode.removeChild(node); -} -function destroy_each$1(iterations, detaching) { - for (let i = 0; i < iterations.length; i += 1) { - if (iterations[i]) - iterations[i].d(detaching); - } -} -function element$1(name) { - return document.createElement(name); -} -function text$1(data) { - return document.createTextNode(data); -} -function space$1() { - return text$1(' '); -} -function empty$2() { - return text$1(''); -} -function listen$1(node, event, handler, options) { - node.addEventListener(event, handler, options); - return () => node.removeEventListener(event, handler, options); -} -function attr$1(node, attribute, value) { - if (value == null) - node.removeAttribute(attribute); - else if (node.getAttribute(attribute) !== value) - node.setAttribute(attribute, value); -} -function to_number(value) { - return value === '' ? null : +value; -} -function children$1(element) { - return Array.from(element.childNodes); -} -function set_data$1(text, data) { - data = '' + data; - if (text.wholeText !== data) - text.data = data; -} -function set_input_value(input, value) { - input.value = value == null ? '' : value; -} -function select_option(select, value) { - for (let i = 0; i < select.options.length; i += 1) { - const option = select.options[i]; - if (option.__value === value) { - option.selected = true; - return; - } - } -} -function select_value(select) { - const selected_option = select.querySelector(':checked') || select.options[0]; - return selected_option && selected_option.__value; -} -class HtmlTag { - constructor(anchor = null) { - this.a = anchor; - this.e = this.n = null; - } - m(html, target, anchor = null) { - if (!this.e) { - this.e = element$1(target.nodeName); - this.t = target; - this.h(html); - } - this.i(anchor); - } - h(html) { - this.e.innerHTML = html; - this.n = Array.from(this.e.childNodes); - } - i(anchor) { - for (let i = 0; i < this.n.length; i += 1) { - insert$1(this.t, this.n[i], anchor); - } - } - p(html) { - this.d(); - this.h(html); - this.i(this.a); - } - d() { - this.n.forEach(detach$1); - } -} - -let current_component$1; -function set_current_component$1(component) { - current_component$1 = component; -} - -const dirty_components$1 = []; -const binding_callbacks$1 = []; -const render_callbacks$1 = []; -const flush_callbacks$1 = []; -const resolved_promise$1 = Promise.resolve(); -let update_scheduled$1 = false; -function schedule_update$1() { - if (!update_scheduled$1) { - update_scheduled$1 = true; - resolved_promise$1.then(flush$1); - } -} -function add_render_callback$1(fn) { - render_callbacks$1.push(fn); -} -let flushing$1 = false; -const seen_callbacks$1 = new Set(); -function flush$1() { - if (flushing$1) - return; - flushing$1 = true; - do { - // first, call beforeUpdate functions - // and update components - for (let i = 0; i < dirty_components$1.length; i += 1) { - const component = dirty_components$1[i]; - set_current_component$1(component); - update$1(component.$$); - } - set_current_component$1(null); - dirty_components$1.length = 0; - while (binding_callbacks$1.length) - binding_callbacks$1.pop()(); - // then, once components are updated, call - // afterUpdate functions. This may cause - // subsequent updates... - for (let i = 0; i < render_callbacks$1.length; i += 1) { - const callback = render_callbacks$1[i]; - if (!seen_callbacks$1.has(callback)) { - // ...so guard against infinite loops - seen_callbacks$1.add(callback); - callback(); - } - } - render_callbacks$1.length = 0; - } while (dirty_components$1.length); - while (flush_callbacks$1.length) { - flush_callbacks$1.pop()(); - } - update_scheduled$1 = false; - flushing$1 = false; - seen_callbacks$1.clear(); -} -function update$1($$) { - if ($$.fragment !== null) { - $$.update(); - run_all$1($$.before_update); - const dirty = $$.dirty; - $$.dirty = [-1]; - $$.fragment && $$.fragment.p($$.ctx, dirty); - $$.after_update.forEach(add_render_callback$1); - } -} -const outroing$1 = new Set(); -let outros$1; -function group_outros$1() { - outros$1 = { - r: 0, - c: [], - p: outros$1 // parent group - }; -} -function check_outros$1() { - if (!outros$1.r) { - run_all$1(outros$1.c); - } - outros$1 = outros$1.p; -} -function transition_in$1(block, local) { - if (block && block.i) { - outroing$1.delete(block); - block.i(local); - } -} -function transition_out$1(block, local, detach, callback) { - if (block && block.o) { - if (outroing$1.has(block)) - return; - outroing$1.add(block); - outros$1.c.push(() => { - outroing$1.delete(block); - if (callback) { - if (detach) - block.d(1); - callback(); - } - }); - block.o(local); - } -} -function create_component$1(block) { - block && block.c(); -} -function mount_component$1(component, target, anchor) { - const { fragment, on_mount, on_destroy, after_update } = component.$$; - fragment && fragment.m(target, anchor); - // onMount happens before the initial afterUpdate - add_render_callback$1(() => { - const new_on_destroy = on_mount.map(run$1).filter(is_function$1); - if (on_destroy) { - on_destroy.push(...new_on_destroy); - } - else { - // Edge case - component was destroyed immediately, - // most likely as a result of a binding initialising - run_all$1(new_on_destroy); - } - component.$$.on_mount = []; - }); - after_update.forEach(add_render_callback$1); -} -function destroy_component$1(component, detaching) { - const $$ = component.$$; - if ($$.fragment !== null) { - run_all$1($$.on_destroy); - $$.fragment && $$.fragment.d(detaching); - // TODO null out other refs, including component.$$ (but need to - // preserve final state?) - $$.on_destroy = $$.fragment = null; - $$.ctx = []; - } -} -function make_dirty$1(component, i) { - if (component.$$.dirty[0] === -1) { - dirty_components$1.push(component); - schedule_update$1(); - component.$$.dirty.fill(0); - } - component.$$.dirty[(i / 31) | 0] |= (1 << (i % 31)); -} -function init$1(component, options, instance, create_fragment, not_equal, props, dirty = [-1]) { - const parent_component = current_component$1; - set_current_component$1(component); - const $$ = component.$$ = { - fragment: null, - ctx: null, - // state - props, - update: noop$1, - not_equal, - bound: blank_object$1(), - // lifecycle - on_mount: [], - on_destroy: [], - before_update: [], - after_update: [], - context: new Map(parent_component ? parent_component.$$.context : []), - // everything else - callbacks: blank_object$1(), - dirty, - skip_bound: false - }; - let ready = false; - $$.ctx = instance - ? instance(component, options.props || {}, (i, ret, ...rest) => { - const value = rest.length ? rest[0] : ret; - if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) { - if (!$$.skip_bound && $$.bound[i]) - $$.bound[i](value); - if (ready) - make_dirty$1(component, i); - } - return ret; - }) - : []; - $$.update(); - ready = true; - run_all$1($$.before_update); - // `false` as a special case of no DOM component - $$.fragment = create_fragment ? create_fragment($$.ctx) : false; - if (options.target) { - if (options.hydrate) { - const nodes = children$1(options.target); - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - $$.fragment && $$.fragment.l(nodes); - nodes.forEach(detach$1); - } - else { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - $$.fragment && $$.fragment.c(); - } - if (options.intro) - transition_in$1(component.$$.fragment); - mount_component$1(component, options.target, options.anchor); - flush$1(); - } - set_current_component$1(parent_component); -} -/** - * Base class for Svelte components. Used when dev=false. - */ -class SvelteComponent$1 { - $destroy() { - destroy_component$1(this, 1); - this.$destroy = noop$1; - } - $on(type, callback) { - const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = [])); - callbacks.push(callback); - return () => { - const index = callbacks.indexOf(callback); - if (index !== -1) - callbacks.splice(index, 1); - }; - } - $set($$props) { - if (this.$$set && !is_empty$1($$props)) { - this.$$.skip_bound = true; - this.$$set($$props); - this.$$.skip_bound = false; - } - } -} - -/* src/ui/TaskMove.svelte generated by Svelte v3.32.3 */ - -function create_fragment$7(ctx) { - let p; - let t1; - let calendar; - let current; - - calendar = new Calendar({ - props: { - onClickDay: /*onClickDay*/ ctx[1], - today: /*today*/ ctx[0], - showWeekNums: false, - localeData: /*today*/ ctx[0].localeData() - } - }); - - return { - c() { - p = element$1("p"); - p.textContent = "Select a day for the task to be moved to:"; - t1 = space$1(); - create_component$1(calendar.$$.fragment); - }, - m(target, anchor) { - insert$1(target, p, anchor); - insert$1(target, t1, anchor); - mount_component$1(calendar, target, anchor); - current = true; - }, - p: noop$1, - i(local) { - if (current) return; - transition_in$1(calendar.$$.fragment, local); - current = true; - }, - o(local) { - transition_out$1(calendar.$$.fragment, local); - current = false; - }, - d(detaching) { - if (detaching) detach$1(p); - if (detaching) detach$1(t1); - destroy_component$1(calendar, detaching); - } - }; -} - -function instance$7($$self, $$props, $$invalidate) { - - - let { task } = $$props; - let { close } = $$props; - - // Internal Properties - const today = window.moment(); - - const onClickDay = (date, isMetaPressed) => __awaiter(void 0, void 0, void 0, function* () { - yield task.move(date.startOf("day")); - close(); - }); - - $$self.$$set = $$props => { - if ("task" in $$props) $$invalidate(2, task = $$props.task); - if ("close" in $$props) $$invalidate(3, close = $$props.close); - }; - - return [today, onClickDay, task, close]; -} - -class TaskMove extends SvelteComponent$1 { - constructor(options) { - super(); - init$1(this, options, instance$7, create_fragment$7, safe_not_equal$1, { task: 2, close: 3 }); - } -} - -/* src/ui/ButtonGroup.svelte generated by Svelte v3.32.3 */ - -function get_each_context$3(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[8] = list[i]; - return child_ctx; -} - -// (35:4) {#if button.icon} -function create_if_block_1$1(ctx) { - let html_tag; - let raw_value = /*button*/ ctx[8].icon + ""; - let html_anchor; - - return { - c() { - html_anchor = empty$2(); - html_tag = new HtmlTag(html_anchor); - }, - m(target, anchor) { - html_tag.m(raw_value, target, anchor); - insert$1(target, html_anchor, anchor); - }, - p(ctx, dirty) { - if (dirty & /*_buttons*/ 4 && raw_value !== (raw_value = /*button*/ ctx[8].icon + "")) html_tag.p(raw_value); - }, - d(detaching) { - if (detaching) detach$1(html_anchor); - if (detaching) html_tag.d(); - } - }; -} - -// (38:4) {#if button.text} -function create_if_block$3(ctx) { - let t_value = /*button*/ ctx[8].text + ""; - let t; - - return { - c() { - t = text$1(t_value); - }, - m(target, anchor) { - insert$1(target, t, anchor); - }, - p(ctx, dirty) { - if (dirty & /*_buttons*/ 4 && t_value !== (t_value = /*button*/ ctx[8].text + "")) set_data$1(t, t_value); - }, - d(detaching) { - if (detaching) detach$1(t); - } - }; -} - -// (30:0) {#each _buttons as button} -function create_each_block$3(ctx) { - let button; - let t0; - let t1; - let button_class_value; - let mounted; - let dispose; - let if_block0 = /*button*/ ctx[8].icon && create_if_block_1$1(ctx); - let if_block1 = /*button*/ ctx[8].text && create_if_block$3(ctx); - - return { - c() { - button = element$1("button"); - if (if_block0) if_block0.c(); - t0 = space$1(); - if (if_block1) if_block1.c(); - t1 = space$1(); - - attr$1(button, "class", button_class_value = /*button*/ ctx[8].active - ? /*activeClass*/ ctx[0] - : /*inactiveClass*/ ctx[1]); - }, - m(target, anchor) { - insert$1(target, button, anchor); - if (if_block0) if_block0.m(button, null); - append$1(button, t0); - if (if_block1) if_block1.m(button, null); - append$1(button, t1); - - if (!mounted) { - dispose = listen$1(button, "click", function () { - if (is_function$1(/*newToggleButton*/ ctx[3](/*button*/ ctx[8]))) /*newToggleButton*/ ctx[3](/*button*/ ctx[8]).apply(this, arguments); - }); - - mounted = true; - } - }, - p(new_ctx, dirty) { - ctx = new_ctx; - - if (/*button*/ ctx[8].icon) { - if (if_block0) { - if_block0.p(ctx, dirty); - } else { - if_block0 = create_if_block_1$1(ctx); - if_block0.c(); - if_block0.m(button, t0); - } - } else if (if_block0) { - if_block0.d(1); - if_block0 = null; - } - - if (/*button*/ ctx[8].text) { - if (if_block1) { - if_block1.p(ctx, dirty); - } else { - if_block1 = create_if_block$3(ctx); - if_block1.c(); - if_block1.m(button, t1); - } - } else if (if_block1) { - if_block1.d(1); - if_block1 = null; - } - - if (dirty & /*_buttons, activeClass, inactiveClass*/ 7 && button_class_value !== (button_class_value = /*button*/ ctx[8].active - ? /*activeClass*/ ctx[0] - : /*inactiveClass*/ ctx[1])) { - attr$1(button, "class", button_class_value); - } - }, - d(detaching) { - if (detaching) detach$1(button); - if (if_block0) if_block0.d(); - if (if_block1) if_block1.d(); - mounted = false; - dispose(); - } - }; -} - -function create_fragment$8(ctx) { - let each_1_anchor; - let each_value = /*_buttons*/ ctx[2]; - let each_blocks = []; - - for (let i = 0; i < each_value.length; i += 1) { - each_blocks[i] = create_each_block$3(get_each_context$3(ctx, each_value, i)); - } - - return { - c() { - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].c(); - } - - each_1_anchor = empty$2(); - }, - m(target, anchor) { - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].m(target, anchor); - } - - insert$1(target, each_1_anchor, anchor); - }, - p(ctx, [dirty]) { - if (dirty & /*_buttons, activeClass, inactiveClass, newToggleButton*/ 15) { - each_value = /*_buttons*/ ctx[2]; - let i; - - for (i = 0; i < each_value.length; i += 1) { - const child_ctx = get_each_context$3(ctx, each_value, i); - - if (each_blocks[i]) { - each_blocks[i].p(child_ctx, dirty); - } else { - each_blocks[i] = create_each_block$3(child_ctx); - each_blocks[i].c(); - each_blocks[i].m(each_1_anchor.parentNode, each_1_anchor); - } - } - - for (; i < each_blocks.length; i += 1) { - each_blocks[i].d(1); - } - - each_blocks.length = each_value.length; - } - }, - i: noop$1, - o: noop$1, - d(detaching) { - destroy_each$1(each_blocks, detaching); - if (detaching) detach$1(each_1_anchor); - } - }; -} - -function instance$8($$self, $$props, $$invalidate) { - let activeClass; - let inactiveClass; - let _buttons; - let { buttons } = $$props; - let { activeButtonIDs } = $$props; - let { onUpdate } = $$props; - let { extraButtonClass = "" } = $$props; - - const newToggleButton = button => { - return e => { - button.active = !button.active; - const target = e.target; - - if (target.hasClass("mod-cta")) { - target.removeClass("mod-cta"); - } else { - target.addClass("mod-cta"); - } - - onUpdate(_buttons.filter(b => b.active).map(b => b.id)); - }; - }; - - $$self.$$set = $$props => { - if ("buttons" in $$props) $$invalidate(4, buttons = $$props.buttons); - if ("activeButtonIDs" in $$props) $$invalidate(5, activeButtonIDs = $$props.activeButtonIDs); - if ("onUpdate" in $$props) $$invalidate(6, onUpdate = $$props.onUpdate); - if ("extraButtonClass" in $$props) $$invalidate(7, extraButtonClass = $$props.extraButtonClass); - }; - - $$self.$$.update = () => { - if ($$self.$$.dirty & /*extraButtonClass*/ 128) { - $$invalidate(0, activeClass = "mod-cta " + extraButtonClass); - } - - if ($$self.$$.dirty & /*extraButtonClass*/ 128) { - $$invalidate(1, inactiveClass = extraButtonClass); - } - - if ($$self.$$.dirty & /*buttons, activeButtonIDs*/ 48) { - $$invalidate(2, _buttons = buttons.map(btn => { - return { - id: btn.id, - text: btn.text, - icon: btn.icon, - active: activeButtonIDs.includes(btn.id) - }; - })); - } - }; - - return [ - activeClass, - inactiveClass, - _buttons, - newToggleButton, - buttons, - activeButtonIDs, - onUpdate, - extraButtonClass - ]; -} - -class ButtonGroup extends SvelteComponent$1 { - constructor(options) { - super(); - - init$1(this, options, instance$8, create_fragment$8, safe_not_equal$1, { - buttons: 4, - activeButtonIDs: 5, - onUpdate: 6, - extraButtonClass: 7 - }); - } -} - -const subscriber_queue = []; -/** - * Create a `Writable` store that allows both updating and reading by subscription. - * @param {*=}value initial value - * @param {StartStopNotifier=}start start and stop notifications for subscriptions - */ -function writable(value, start = noop$1) { - let stop; - const subscribers = []; - function set(new_value) { - if (safe_not_equal$1(value, new_value)) { - value = new_value; - if (stop) { // store is ready - const run_queue = !subscriber_queue.length; - for (let i = 0; i < subscribers.length; i += 1) { - const s = subscribers[i]; - s[1](); - subscriber_queue.push(s, value); - } - if (run_queue) { - for (let i = 0; i < subscriber_queue.length; i += 2) { - subscriber_queue[i][0](subscriber_queue[i + 1]); - } - subscriber_queue.length = 0; - } - } - } - } - function update(fn) { - set(fn(value)); - } - function subscribe(run, invalidate = noop$1) { - const subscriber = [run, invalidate]; - subscribers.push(subscriber); - if (subscribers.length === 1) { - stop = start(set) || noop$1; - } - run(value); - return () => { - const index = subscribers.indexOf(subscriber); - if (index !== -1) { - subscribers.splice(index, 1); - } - if (subscribers.length === 0) { - stop(); - stop = null; - } - }; - } - return { set, update, subscribe }; -} - -/* src/ui/WeekDaysOfMonthSelector.svelte generated by Svelte v3.32.3 */ - -function get_each_context$4(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[8] = list[i]; - child_ctx[9] = list; - child_ctx[10] = i; - return child_ctx; -} - -// (63:8) {#if $selectedWeeks.length > 1} -function create_if_block$4(ctx) { - let button; - let mounted; - let dispose; - - return { - c() { - button = element$1("button"); - button.textContent = "-"; - }, - m(target, anchor) { - insert$1(target, button, anchor); - - if (!mounted) { - dispose = listen$1(button, "click", function () { - if (is_function$1(/*newRemoveWeek*/ ctx[2](/*week*/ ctx[8].id))) /*newRemoveWeek*/ ctx[2](/*week*/ ctx[8].id).apply(this, arguments); - }); - - mounted = true; - } - }, - p(new_ctx, dirty) { - ctx = new_ctx; - }, - d(detaching) { - if (detaching) detach$1(button); - mounted = false; - dispose(); - } - }; -} - -// (44:4) {#each $selectedWeeks as week} -function create_each_block$4(ctx) { - let li; - let select0; - let option0; - let option1; - let option2; - let option3; - let option4; - let option5; - let t6; - let select1; - let option6; - let option7; - let option8; - let option9; - let option10; - let option11; - let option12; - let t14; - let t15; - let mounted; - let dispose; - - function select0_change_handler() { - /*select0_change_handler*/ ctx[6].call(select0, /*each_value*/ ctx[9], /*week_index*/ ctx[10]); - } - - function select1_change_handler() { - /*select1_change_handler*/ ctx[7].call(select1, /*each_value*/ ctx[9], /*week_index*/ ctx[10]); - } - - let if_block = /*$selectedWeeks*/ ctx[0].length > 1 && create_if_block$4(ctx); - - return { - c() { - li = element$1("li"); - select0 = element$1("select"); - option0 = element$1("option"); - option0.textContent = "First"; - option1 = element$1("option"); - option1.textContent = "Second"; - option2 = element$1("option"); - option2.textContent = "Third"; - option3 = element$1("option"); - option3.textContent = "Fourth"; - option4 = element$1("option"); - option4.textContent = "Fifth"; - option5 = element$1("option"); - option5.textContent = "Last"; - t6 = space$1(); - select1 = element$1("select"); - option6 = element$1("option"); - option6.textContent = "Sunday"; - option7 = element$1("option"); - option7.textContent = "Monday"; - option8 = element$1("option"); - option8.textContent = "Tuesday"; - option9 = element$1("option"); - option9.textContent = "Wednesday"; - option10 = element$1("option"); - option10.textContent = "Thursday"; - option11 = element$1("option"); - option11.textContent = "Friday"; - option12 = element$1("option"); - option12.textContent = "Saturday"; - t14 = space$1(); - if (if_block) if_block.c(); - t15 = space$1(); - option0.__value = "1"; - option0.value = option0.__value; - option1.__value = "2"; - option1.value = option1.__value; - option2.__value = "3"; - option2.value = option2.__value; - option3.__value = "4"; - option3.value = option3.__value; - option4.__value = "5"; - option4.value = option4.__value; - option5.__value = "-1"; - option5.value = option5.__value; - attr$1(select0, "class", "dropdown"); - if (/*week*/ ctx[8].week === void 0) add_render_callback$1(select0_change_handler); - option6.__value = "6"; - option6.value = option6.__value; - option7.__value = "0"; - option7.value = option7.__value; - option8.__value = "1"; - option8.value = option8.__value; - option9.__value = "2"; - option9.value = option9.__value; - option10.__value = "3"; - option10.value = option10.__value; - option11.__value = "4"; - option11.value = option11.__value; - option12.__value = "5"; - option12.value = option12.__value; - attr$1(select1, "class", "dropdown"); - if (/*week*/ ctx[8].weekDay === void 0) add_render_callback$1(select1_change_handler); - }, - m(target, anchor) { - insert$1(target, li, anchor); - append$1(li, select0); - append$1(select0, option0); - append$1(select0, option1); - append$1(select0, option2); - append$1(select0, option3); - append$1(select0, option4); - append$1(select0, option5); - select_option(select0, /*week*/ ctx[8].week); - append$1(li, t6); - append$1(li, select1); - append$1(select1, option6); - append$1(select1, option7); - append$1(select1, option8); - append$1(select1, option9); - append$1(select1, option10); - append$1(select1, option11); - append$1(select1, option12); - select_option(select1, /*week*/ ctx[8].weekDay); - append$1(li, t14); - if (if_block) if_block.m(li, null); - append$1(li, t15); - - if (!mounted) { - dispose = [ - listen$1(select0, "change", select0_change_handler), - listen$1(select1, "change", select1_change_handler) - ]; - - mounted = true; - } - }, - p(new_ctx, dirty) { - ctx = new_ctx; - - if (dirty & /*$selectedWeeks*/ 1) { - select_option(select0, /*week*/ ctx[8].week); - } - - if (dirty & /*$selectedWeeks*/ 1) { - select_option(select1, /*week*/ ctx[8].weekDay); - } - - if (/*$selectedWeeks*/ ctx[0].length > 1) { - if (if_block) { - if_block.p(ctx, dirty); - } else { - if_block = create_if_block$4(ctx); - if_block.c(); - if_block.m(li, t15); - } - } else if (if_block) { - if_block.d(1); - if_block = null; - } - }, - d(detaching) { - if (detaching) detach$1(li); - if (if_block) if_block.d(); - mounted = false; - run_all$1(dispose); - } - }; -} - -function create_fragment$9(ctx) { - let div; - let ul; - let t0; - let button; - let mounted; - let dispose; - let each_value = /*$selectedWeeks*/ ctx[0]; - let each_blocks = []; - - for (let i = 0; i < each_value.length; i += 1) { - each_blocks[i] = create_each_block$4(get_each_context$4(ctx, each_value, i)); - } - - return { - c() { - div = element$1("div"); - ul = element$1("ul"); - - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].c(); - } - - t0 = space$1(); - button = element$1("button"); - button.textContent = "+"; - attr$1(div, "id", "slated-selected-weeks"); - }, - m(target, anchor) { - insert$1(target, div, anchor); - append$1(div, ul); - - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].m(ul, null); - } - - append$1(div, t0); - append$1(div, button); - - if (!mounted) { - dispose = listen$1(button, "click", /*addWeek*/ ctx[3]); - mounted = true; - } - }, - p(ctx, [dirty]) { - if (dirty & /*newRemoveWeek, $selectedWeeks*/ 5) { - each_value = /*$selectedWeeks*/ ctx[0]; - let i; - - for (i = 0; i < each_value.length; i += 1) { - const child_ctx = get_each_context$4(ctx, each_value, i); - - if (each_blocks[i]) { - each_blocks[i].p(child_ctx, dirty); - } else { - each_blocks[i] = create_each_block$4(child_ctx); - each_blocks[i].c(); - each_blocks[i].m(ul, null); - } - } - - for (; i < each_blocks.length; i += 1) { - each_blocks[i].d(1); - } - - each_blocks.length = each_value.length; - } - }, - i: noop$1, - o: noop$1, - d(detaching) { - if (detaching) detach$1(div); - destroy_each$1(each_blocks, detaching); - mounted = false; - dispose(); - } - }; -} - -function instance$9($$self, $$props, $$invalidate) { - let $selectedWeeks; - let { onUpdate } = $$props; - let { initialSelected } = $$props; - - // By using a Store, we can bind to it easier in the {#each} block below. - const selectedWeeks = writable(initialSelected.map(({ week, weekDay }, i) => { - return { id: i, week, weekDay }; - })); - - component_subscribe($$self, selectedWeeks, value => $$invalidate(0, $selectedWeeks = value)); - - // Send the updates back upstream. - selectedWeeks.subscribe(updatedVal => { - onUpdate(updatedVal.map(({ week, weekDay }) => { - return { week, weekDay }; - })); - }); - - // Create a function which when called will remove the provided ID from the - // list of selected weeks. - const newRemoveWeek = removeID => { - return () => { - selectedWeeks.update(curr => curr.filter(({ id }) => id !== removeID)); - }; - }; - - // Add a "First Monday" item to the list. - const addWeek = () => { - selectedWeeks.update(curr => { - const maxID = curr.reduce((prev, { id }) => Math.max(prev, id), 0); - curr.push({ id: maxID + 1, week: "1", weekDay: "0" }); - return curr; - }); - }; - - // If the list every has 0 items (only if initialized empty), then add one. - if ($selectedWeeks.length === 0) { - addWeek(); - } - - function select0_change_handler(each_value, week_index) { - each_value[week_index].week = select_value(this); - selectedWeeks.set($selectedWeeks); - } - - function select1_change_handler(each_value, week_index) { - each_value[week_index].weekDay = select_value(this); - selectedWeeks.set($selectedWeeks); - } - - $$self.$$set = $$props => { - if ("onUpdate" in $$props) $$invalidate(4, onUpdate = $$props.onUpdate); - if ("initialSelected" in $$props) $$invalidate(5, initialSelected = $$props.initialSelected); - }; - - return [ - $selectedWeeks, - selectedWeeks, - newRemoveWeek, - addWeek, - onUpdate, - initialSelected, - select0_change_handler, - select1_change_handler - ]; -} - -class WeekDaysOfMonthSelector extends SvelteComponent$1 { - constructor(options) { - super(); - init$1(this, options, instance$9, create_fragment$9, safe_not_equal$1, { onUpdate: 4, initialSelected: 5 }); - } -} - -/* src/ui/TaskRepeat.svelte generated by Svelte v3.32.3 */ - -function create_if_block_3(ctx) { - let div; - let buttongroup; - let current; - - buttongroup = new ButtonGroup({ - props: { - buttons: /*weekdays*/ ctx[2], - activeButtonIDs: /*repeater*/ ctx[4].daysOfWeek, - onUpdate: /*repeater*/ ctx[4].setDaysOfWeek - } - }); - - return { - c() { - div = element$1("div"); - create_component$1(buttongroup.$$.fragment); - attr$1(div, "class", "slated-days-btn-group"); - }, - m(target, anchor) { - insert$1(target, div, anchor); - mount_component$1(buttongroup, div, null); - current = true; - }, - p: noop$1, - i(local) { - if (current) return; - transition_in$1(buttongroup.$$.fragment, local); - current = true; - }, - o(local) { - transition_out$1(buttongroup.$$.fragment, local); - current = false; - }, - d(detaching) { - if (detaching) detach$1(div); - destroy_component$1(buttongroup); - } - }; -} - -// (95:4) {#if $repeater.frequency === Frequency.Yearly} -function create_if_block_2$1(ctx) { - let div; - let buttongroup; - let current; - - buttongroup = new ButtonGroup({ - props: { - buttons: /*months*/ ctx[3], - activeButtonIDs: /*repeater*/ ctx[4].monthsOfYear, - onUpdate: /*repeater*/ ctx[4].setMonthsOfYear - } - }); - - return { - c() { - div = element$1("div"); - create_component$1(buttongroup.$$.fragment); - attr$1(div, "class", "slated-months-btn-group"); - }, - m(target, anchor) { - insert$1(target, div, anchor); - mount_component$1(buttongroup, div, null); - current = true; - }, - p: noop$1, - i(local) { - if (current) return; - transition_in$1(buttongroup.$$.fragment, local); - current = true; - }, - o(local) { - transition_out$1(buttongroup.$$.fragment, local); - current = false; - }, - d(detaching) { - if (detaching) detach$1(div); - destroy_component$1(buttongroup); - } - }; -} - -// (104:4) {#if $repeater.frequency === Frequency.Monthly || $repeater.frequency === Frequency.Yearly} -function create_if_block$5(ctx) { - let div; - let select; - let option0; - let option0_value_value; - let option1; - let option1_value_value; - let t2; - let current_block_type_index; - let if_block; - let current; - let mounted; - let dispose; - const if_block_creators = [create_if_block_1$2, create_else_block$2]; - const if_blocks = []; - - function select_block_type(ctx, dirty) { - if (/*monthlyRepeatType*/ ctx[0] == "onThe") return 0; - return 1; - } - - current_block_type_index = select_block_type(ctx); - if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); - - return { - c() { - div = element$1("div"); - select = element$1("select"); - option0 = element$1("option"); - option0.textContent = "on the"; - option1 = element$1("option"); - option1.textContent = "every"; - t2 = space$1(); - if_block.c(); - option0.__value = option0_value_value = "onThe"; - option0.value = option0.__value; - option1.__value = option1_value_value = "every"; - option1.value = option1.__value; - attr$1(select, "class", "dropdown"); - if (/*monthlyRepeatType*/ ctx[0] === void 0) add_render_callback$1(() => /*select_change_handler_1*/ ctx[10].call(select)); - }, - m(target, anchor) { - insert$1(target, div, anchor); - append$1(div, select); - append$1(select, option0); - append$1(select, option1); - select_option(select, /*monthlyRepeatType*/ ctx[0]); - append$1(div, t2); - if_blocks[current_block_type_index].m(div, null); - current = true; - - if (!mounted) { - dispose = listen$1(select, "change", /*select_change_handler_1*/ ctx[10]); - mounted = true; - } - }, - p(ctx, dirty) { - if (dirty & /*monthlyRepeatType*/ 1) { - select_option(select, /*monthlyRepeatType*/ ctx[0]); - } - - let previous_block_index = current_block_type_index; - current_block_type_index = select_block_type(ctx); - - if (current_block_type_index === previous_block_index) { - if_blocks[current_block_type_index].p(ctx, dirty); - } else { - group_outros$1(); - - transition_out$1(if_blocks[previous_block_index], 1, 1, () => { - if_blocks[previous_block_index] = null; - }); - - check_outros$1(); - if_block = if_blocks[current_block_type_index]; - - if (!if_block) { - if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); - if_block.c(); - } else { - if_block.p(ctx, dirty); - } - - transition_in$1(if_block, 1); - if_block.m(div, null); - } - }, - i(local) { - if (current) return; - transition_in$1(if_block); - current = true; - }, - o(local) { - transition_out$1(if_block); - current = false; - }, - d(detaching) { - if (detaching) detach$1(div); - if_blocks[current_block_type_index].d(); - mounted = false; - dispose(); - } - }; -} - -// (122:8) {:else} -function create_else_block$2(ctx) { - let span; - let weekdaysofmonthselector; - let current; - - weekdaysofmonthselector = new WeekDaysOfMonthSelector({ - props: { - initialSelected: /*repeater*/ ctx[4].getWeekDaysOfMonth(), - onUpdate: /*repeater*/ ctx[4].setWeekDaysOfMonth - } - }); - - return { - c() { - span = element$1("span"); - create_component$1(weekdaysofmonthselector.$$.fragment); - }, - m(target, anchor) { - insert$1(target, span, anchor); - mount_component$1(weekdaysofmonthselector, span, null); - current = true; - }, - p: noop$1, - i(local) { - if (current) return; - transition_in$1(weekdaysofmonthselector.$$.fragment, local); - current = true; - }, - o(local) { - transition_out$1(weekdaysofmonthselector.$$.fragment, local); - current = false; - }, - d(detaching) { - if (detaching) detach$1(span); - destroy_component$1(weekdaysofmonthselector); - } - }; -} - -// (111:8) {#if monthlyRepeatType == 'onThe'} -function create_if_block_1$2(ctx) { - let input0; - let input0_disabled_value; - let t0; - let label; - let input1; - let t1; - let mounted; - let dispose; - - return { - c() { - input0 = element$1("input"); - t0 = space$1(); - label = element$1("label"); - input1 = element$1("input"); - t1 = text$1("\n Last Day"); - attr$1(input0, "id", "slated-onthe-selector"); - input0.disabled = input0_disabled_value = /*$repeater*/ ctx[1].dayOfMonth === -1; - attr$1(input0, "placeholder", "1"); - attr$1(input0, "type", "number"); - attr$1(input1, "type", "checkbox"); - }, - m(target, anchor) { - insert$1(target, input0, anchor); - set_input_value(input0, /*$repeater*/ ctx[1].dayOfMonth); - insert$1(target, t0, anchor); - insert$1(target, label, anchor); - append$1(label, input1); - input1.checked = /*$repeater*/ ctx[1].lastDayOfMonth; - append$1(label, t1); - - if (!mounted) { - dispose = [ - listen$1(input0, "input", /*input0_input_handler_1*/ ctx[11]), - listen$1(input1, "change", /*input1_change_handler*/ ctx[12]) - ]; - - mounted = true; - } - }, - p(ctx, dirty) { - if (dirty & /*$repeater, Frequency*/ 2 && input0_disabled_value !== (input0_disabled_value = /*$repeater*/ ctx[1].dayOfMonth === -1)) { - input0.disabled = input0_disabled_value; - } - - if (dirty & /*$repeater, Frequency*/ 2 && to_number(input0.value) !== /*$repeater*/ ctx[1].dayOfMonth) { - set_input_value(input0, /*$repeater*/ ctx[1].dayOfMonth); - } - - if (dirty & /*$repeater, Frequency*/ 2) { - input1.checked = /*$repeater*/ ctx[1].lastDayOfMonth; - } - }, - i: noop$1, - o: noop$1, - d(detaching) { - if (detaching) detach$1(input0); - if (detaching) detach$1(t0); - if (detaching) detach$1(label); - mounted = false; - run_all$1(dispose); - } - }; -} - -function create_fragment$a(ctx) { - let div1; - let h1; - let t1; - let div0; - let span; - let t3; - let input0; - let t4; - let select; - let option0; - let t5_value = (/*$repeater*/ ctx[1].interval > 1 ? "Days" : "Day") + ""; - let t5; - let t6; - let option0_value_value; - let option1; - let t7_value = (/*$repeater*/ ctx[1].interval > 1 ? "Weeks" : "Week") + ""; - let t7; - let t8; - let option1_value_value; - let option2; - let t9_value = (/*$repeater*/ ctx[1].interval > 1 ? "Months" : "Month") + ""; - let t9; - let t10; - let option2_value_value; - let option3; - let t11_value = (/*$repeater*/ ctx[1].interval > 1 ? "Years" : "Year") + ""; - let t11; - let option3_value_value; - let t12; - let t13; - let t14; - let t15; - let h2; - let t17; - let input1; - let input1_value_value; - let t18; - let button; - let current; - let mounted; - let dispose; - let if_block0 = /*$repeater*/ ctx[1].frequency === Frequency$1.Weekly && create_if_block_3(ctx); - let if_block1 = /*$repeater*/ ctx[1].frequency === Frequency$1.Yearly && create_if_block_2$1(ctx); - let if_block2 = (/*$repeater*/ ctx[1].frequency === Frequency$1.Monthly || /*$repeater*/ ctx[1].frequency === Frequency$1.Yearly) && create_if_block$5(ctx); - - return { - c() { - div1 = element$1("div"); - h1 = element$1("h1"); - h1.textContent = "Task Repetition"; - t1 = space$1(); - div0 = element$1("div"); - span = element$1("span"); - span.textContent = "Every"; - t3 = space$1(); - input0 = element$1("input"); - t4 = space$1(); - select = element$1("select"); - option0 = element$1("option"); - t5 = text$1(t5_value); - t6 = space$1(); - option1 = element$1("option"); - t7 = text$1(t7_value); - t8 = space$1(); - option2 = element$1("option"); - t9 = text$1(t9_value); - t10 = space$1(); - option3 = element$1("option"); - t11 = text$1(t11_value); - t12 = space$1(); - if (if_block0) if_block0.c(); - t13 = space$1(); - if (if_block1) if_block1.c(); - t14 = space$1(); - if (if_block2) if_block2.c(); - t15 = space$1(); - h2 = element$1("h2"); - h2.textContent = "Preview"; - t17 = space$1(); - input1 = element$1("input"); - t18 = space$1(); - button = element$1("button"); - button.textContent = "Save"; - attr$1(input0, "id", "slated-interval-selector"); - attr$1(input0, "type", "number"); - attr$1(input0, "min", "1"); - option0.__value = option0_value_value = Frequency$1.Daily; - option0.value = option0.__value; - option1.__value = option1_value_value = Frequency$1.Weekly; - option1.value = option1.__value; - option2.__value = option2_value_value = Frequency$1.Monthly; - option2.value = option2.__value; - option3.__value = option3_value_value = Frequency$1.Yearly; - option3.value = option3.__value; - attr$1(select, "id", "slated-frequency-selector"); - attr$1(select, "class", "dropdown"); - if (/*$repeater*/ ctx[1].frequency === void 0) add_render_callback$1(() => /*select_change_handler*/ ctx[9].call(select)); - attr$1(input1, "id", "slated-repetition-preview"); - input1.disabled = true; - attr$1(input1, "type", "text"); - input1.value = input1_value_value = /*$repeater*/ ctx[1].toText(); - attr$1(button, "id", "slated-save-repetition-config"); - attr$1(div1, "class", "slated-modal"); - }, - m(target, anchor) { - insert$1(target, div1, anchor); - append$1(div1, h1); - append$1(div1, t1); - append$1(div1, div0); - append$1(div0, span); - append$1(div0, t3); - append$1(div0, input0); - set_input_value(input0, /*$repeater*/ ctx[1].interval); - append$1(div0, t4); - append$1(div0, select); - append$1(select, option0); - append$1(option0, t5); - append$1(option0, t6); - append$1(select, option1); - append$1(option1, t7); - append$1(option1, t8); - append$1(select, option2); - append$1(option2, t9); - append$1(option2, t10); - append$1(select, option3); - append$1(option3, t11); - select_option(select, /*$repeater*/ ctx[1].frequency); - append$1(div0, t12); - if (if_block0) if_block0.m(div0, null); - append$1(div0, t13); - if (if_block1) if_block1.m(div0, null); - append$1(div0, t14); - if (if_block2) if_block2.m(div0, null); - append$1(div1, t15); - append$1(div1, h2); - append$1(div1, t17); - append$1(div1, input1); - append$1(div1, t18); - append$1(div1, button); - current = true; - - if (!mounted) { - dispose = [ - listen$1(input0, "input", /*input0_input_handler*/ ctx[8]), - listen$1(select, "change", /*select_change_handler*/ ctx[9]), - listen$1(button, "click", /*save*/ ctx[5]) - ]; - - mounted = true; - } - }, - p(ctx, [dirty]) { - if (dirty & /*$repeater, Frequency*/ 2 && to_number(input0.value) !== /*$repeater*/ ctx[1].interval) { - set_input_value(input0, /*$repeater*/ ctx[1].interval); - } - - if ((!current || dirty & /*$repeater*/ 2) && t5_value !== (t5_value = (/*$repeater*/ ctx[1].interval > 1 ? "Days" : "Day") + "")) set_data$1(t5, t5_value); - if ((!current || dirty & /*$repeater*/ 2) && t7_value !== (t7_value = (/*$repeater*/ ctx[1].interval > 1 ? "Weeks" : "Week") + "")) set_data$1(t7, t7_value); - if ((!current || dirty & /*$repeater*/ 2) && t9_value !== (t9_value = (/*$repeater*/ ctx[1].interval > 1 ? "Months" : "Month") + "")) set_data$1(t9, t9_value); - if ((!current || dirty & /*$repeater*/ 2) && t11_value !== (t11_value = (/*$repeater*/ ctx[1].interval > 1 ? "Years" : "Year") + "")) set_data$1(t11, t11_value); - - if (dirty & /*$repeater, Frequency*/ 2) { - select_option(select, /*$repeater*/ ctx[1].frequency); - } - - if (/*$repeater*/ ctx[1].frequency === Frequency$1.Weekly) { - if (if_block0) { - if_block0.p(ctx, dirty); - - if (dirty & /*$repeater*/ 2) { - transition_in$1(if_block0, 1); - } - } else { - if_block0 = create_if_block_3(ctx); - if_block0.c(); - transition_in$1(if_block0, 1); - if_block0.m(div0, t13); - } - } else if (if_block0) { - group_outros$1(); - - transition_out$1(if_block0, 1, 1, () => { - if_block0 = null; - }); - - check_outros$1(); - } - - if (/*$repeater*/ ctx[1].frequency === Frequency$1.Yearly) { - if (if_block1) { - if_block1.p(ctx, dirty); - - if (dirty & /*$repeater*/ 2) { - transition_in$1(if_block1, 1); - } - } else { - if_block1 = create_if_block_2$1(ctx); - if_block1.c(); - transition_in$1(if_block1, 1); - if_block1.m(div0, t14); - } - } else if (if_block1) { - group_outros$1(); - - transition_out$1(if_block1, 1, 1, () => { - if_block1 = null; - }); - - check_outros$1(); - } - - if (/*$repeater*/ ctx[1].frequency === Frequency$1.Monthly || /*$repeater*/ ctx[1].frequency === Frequency$1.Yearly) { - if (if_block2) { - if_block2.p(ctx, dirty); - - if (dirty & /*$repeater*/ 2) { - transition_in$1(if_block2, 1); - } - } else { - if_block2 = create_if_block$5(ctx); - if_block2.c(); - transition_in$1(if_block2, 1); - if_block2.m(div0, null); - } - } else if (if_block2) { - group_outros$1(); - - transition_out$1(if_block2, 1, 1, () => { - if_block2 = null; - }); - - check_outros$1(); - } - - if (!current || dirty & /*$repeater, Frequency*/ 2 && input1_value_value !== (input1_value_value = /*$repeater*/ ctx[1].toText()) && input1.value !== input1_value_value) { - input1.value = input1_value_value; - } - }, - i(local) { - if (current) return; - transition_in$1(if_block0); - transition_in$1(if_block1); - transition_in$1(if_block2); - current = true; - }, - o(local) { - transition_out$1(if_block0); - transition_out$1(if_block1); - transition_out$1(if_block2); - current = false; - }, - d(detaching) { - if (detaching) detach$1(div1); - if (if_block0) if_block0.d(); - if (if_block1) if_block1.d(); - if (if_block2) if_block2.d(); - mounted = false; - run_all$1(dispose); - } - }; -} - -function instance$a($$self, $$props, $$invalidate) { - let $repeater; - - let { task } = $$props; - let { close } = $$props; - - // TODO: Support localizations - const weekdays = [ - { id: 6, text: "S" }, - { id: 0, text: "M" }, - { id: 1, text: "T" }, - { id: 2, text: "W" }, - { id: 3, text: "T" }, - { id: 4, text: "F" }, - { id: 5, text: "S" } - ]; - - // TODO: Support localizations - const months = [ - { id: 1, text: "Jan" }, - { id: 2, text: "Feb" }, - { id: 3, text: "Mar" }, - { id: 4, text: "Apr" }, - { id: 5, text: "May" }, - { id: 6, text: "Jun" }, - { id: 7, text: "Jul" }, - { id: 8, text: "Aug" }, - { id: 9, text: "Sep" }, - { id: 10, text: "Oct" }, - { id: 11, text: "Nov" }, - { id: 12, text: "Dec" } - ]; - - const repeater = task.repeater; - component_subscribe($$self, repeater, value => $$invalidate(1, $repeater = value)); - - const save = () => { - console.debug("Updating task..."); - task.handleRepeaterUpdated(repeater); - close(); - }; - - const startingRepeatType = task.repeater.getWeekDaysOfMonth().length > 0 - ? "every" - : "onThe"; - - let monthlyRepeatType = startingRepeatType; - console.debug(task); - - function input0_input_handler() { - $repeater.interval = to_number(this.value); - repeater.set($repeater); - } - - function select_change_handler() { - $repeater.frequency = select_value(this); - repeater.set($repeater); - } - - function select_change_handler_1() { - monthlyRepeatType = select_value(this); - $$invalidate(0, monthlyRepeatType); - } - - function input0_input_handler_1() { - $repeater.dayOfMonth = to_number(this.value); - repeater.set($repeater); - } - - function input1_change_handler() { - $repeater.lastDayOfMonth = this.checked; - repeater.set($repeater); - } - - $$self.$$set = $$props => { - if ("task" in $$props) $$invalidate(6, task = $$props.task); - if ("close" in $$props) $$invalidate(7, close = $$props.close); - }; - - return [ - monthlyRepeatType, - $repeater, - weekdays, - months, - repeater, - save, - task, - close, - input0_input_handler, - select_change_handler, - select_change_handler_1, - input0_input_handler_1, - input1_change_handler - ]; -} - -class TaskRepeat extends SvelteComponent$1 { - constructor(options) { - super(); - init$1(this, options, instance$a, create_fragment$a, safe_not_equal$1, { task: 6, close: 7 }); - } -} - -const DEFAULT_DAILY_NOTE_FORMAT = "YYYY-MM-DD"; -const DEFAULT_WEEKLY_NOTE_FORMAT = "gggg-[W]ww"; -const DEFAULT_MONTHLY_NOTE_FORMAT = "YYYY-MM"; - -function shouldUsePeriodicNotesSettings(periodicity) { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const periodicNotes = window.app.plugins.getPlugin("periodic-notes"); - return periodicNotes && periodicNotes.settings?.[periodicity]?.enabled; -} -/** - * Read the user settings for the `daily-notes` plugin - * to keep behavior of creating a new note in-sync. - */ -function getDailyNoteSettings() { - try { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const { internalPlugins, plugins } = window.app; - if (shouldUsePeriodicNotesSettings("daily")) { - const { format, folder, template } = plugins.getPlugin("periodic-notes")?.settings?.daily || {}; - return { - format: format || DEFAULT_DAILY_NOTE_FORMAT, - folder: folder?.trim() || "", - template: template?.trim() || "", - }; - } - const { folder, format, template } = internalPlugins.getPluginById("daily-notes")?.instance?.options || {}; - return { - format: format || DEFAULT_DAILY_NOTE_FORMAT, - folder: folder?.trim() || "", - template: template?.trim() || "", - }; - } - catch (err) { - console.info("No custom daily note settings found!", err); - } -} -/** - * Read the user settings for the `weekly-notes` plugin - * to keep behavior of creating a new note in-sync. - */ -function getWeeklyNoteSettings() { - try { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const pluginManager = window.app.plugins; - const calendarSettings = pluginManager.getPlugin("calendar")?.options; - const periodicNotesSettings = pluginManager.getPlugin("periodic-notes") - ?.settings?.weekly; - if (shouldUsePeriodicNotesSettings("weekly")) { - return { - format: periodicNotesSettings.format || DEFAULT_WEEKLY_NOTE_FORMAT, - folder: periodicNotesSettings.folder?.trim() || "", - template: periodicNotesSettings.template?.trim() || "", - }; - } - const settings = calendarSettings || {}; - return { - format: settings.weeklyNoteFormat || DEFAULT_WEEKLY_NOTE_FORMAT, - folder: settings.weeklyNoteFolder?.trim() || "", - template: settings.weeklyNoteTemplate?.trim() || "", - }; - } - catch (err) { - console.info("No custom weekly note settings found!", err); - } -} -/** - * Read the user settings for the `periodic-notes` plugin - * to keep behavior of creating a new note in-sync. - */ -function getMonthlyNoteSettings() { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const pluginManager = window.app.plugins; - try { - const settings = (shouldUsePeriodicNotesSettings("monthly") && - pluginManager.getPlugin("periodic-notes")?.settings?.monthly) || - {}; - return { - format: settings.format || DEFAULT_MONTHLY_NOTE_FORMAT, - folder: settings.folder?.trim() || "", - template: settings.template?.trim() || "", - }; - } - catch (err) { - console.info("No custom monthly note settings found!", err); - } -} - -// Credit: @creationix/path.js -function join(...partSegments) { - // Split the inputs into a list of path commands. - let parts = []; - for (let i = 0, l = partSegments.length; i < l; i++) { - parts = parts.concat(partSegments[i].split("/")); - } - // Interpret the path commands to get the new resolved path. - const newParts = []; - for (let i = 0, l = parts.length; i < l; i++) { - const part = parts[i]; - // Remove leading and trailing slashes - // Also remove "." segments - if (!part || part === ".") - continue; - // Push new path segments. - else - newParts.push(part); - } - // Preserve the initial slash if there was one. - if (parts[0] === "") - newParts.unshift(""); - // Turn back into a single string path. - return newParts.join("/"); -} -async function ensureFolderExists(path) { - const dirs = path.replace(/\\/g, "/").split("/"); - dirs.pop(); // remove basename - if (dirs.length) { - const dir = join(...dirs); - if (!window.app.vault.getAbstractFileByPath(dir)) { - await window.app.vault.createFolder(dir); - } - } -} -async function getNotePath(directory, filename) { - if (!filename.endsWith(".md")) { - filename += ".md"; - } - const path = obsidian__default['default'].normalizePath(join(directory, filename)); - await ensureFolderExists(path); - return path; -} -async function getTemplateInfo(template) { - const { metadataCache, vault } = window.app; - const templatePath = obsidian__default['default'].normalizePath(template); - if (templatePath === "/") { - return Promise.resolve(["", null]); - } - try { - const templateFile = metadataCache.getFirstLinkpathDest(templatePath, ""); - const contents = await vault.cachedRead(templateFile); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const IFoldInfo = window.app.foldManager.load(templateFile); - return [contents, IFoldInfo]; - } - catch (err) { - console.error(`Failed to read the daily note template '${templatePath}'`, err); - new obsidian__default['default'].Notice("Failed to read the daily note template"); - return ["", null]; - } -} - -/** - * dateUID is a way of weekly identifying daily/weekly/monthly notes. - * They are prefixed with the granularity to avoid ambiguity. - */ -function getDateUID$1(date, granularity = "day") { - const ts = date.clone().startOf(granularity).format(); - return `${granularity}-${ts}`; -} -function removeEscapedCharacters(format) { - return format.replace(/\[[^\]]*\]/g, ""); // remove everything within brackets -} -/** - * XXX: When parsing dates that contain both week numbers and months, - * Moment choses to ignore the week numbers. For the week dateUID, we - * want the opposite behavior. Strip the MMM from the format to patch. - */ -function isFormatAmbiguous(format, granularity) { - if (granularity === "week") { - const cleanFormat = removeEscapedCharacters(format); - return (/w{1,2}/i.test(cleanFormat) && - (/M{1,4}/.test(cleanFormat) || /D{1,4}/.test(cleanFormat))); - } - return false; -} -function getDateFromFile(file, granularity) { - return getDateFromFilename(file.basename, granularity); -} -function getDateFromFilename(filename, granularity) { - const getSettings = { - day: getDailyNoteSettings, - week: getWeeklyNoteSettings, - month: getMonthlyNoteSettings, - }; - const format = getSettings[granularity]().format.split("/").pop(); - const noteDate = window.moment(filename, format, true); - if (!noteDate.isValid()) { - return null; - } - if (isFormatAmbiguous(format, granularity)) { - if (granularity === "week") { - const cleanFormat = removeEscapedCharacters(format); - if (/w{1,2}/i.test(cleanFormat)) { - return window.moment(filename, - // If format contains week, remove day & month formatting - format.replace(/M{1,4}/g, "").replace(/D{1,4}/g, ""), false); - } - } - } - return noteDate; -} - -class DailyNotesFolderMissingError extends Error { -} -/** - * This function mimics the behavior of the daily-notes plugin - * so it will replace {{date}}, {{title}}, and {{time}} with the - * formatted timestamp. - * - * Note: it has an added bonus that it's not 'today' specific. - */ -async function createDailyNote(date) { - const app = window.app; - const { vault } = app; - const moment = window.moment; - const { template, format, folder } = getDailyNoteSettings(); - const [templateContents, IFoldInfo] = await getTemplateInfo(template); - const filename = date.format(format); - const normalizedPath = await getNotePath(folder, filename); - try { - const createdFile = await vault.create(normalizedPath, templateContents - .replace(/{{\s*date\s*}}/gi, filename) - .replace(/{{\s*time\s*}}/gi, moment().format("HH:mm")) - .replace(/{{\s*title\s*}}/gi, filename) - .replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi, (_, _timeOrDate, calc, timeDelta, unit, momentFormat) => { - const now = moment(); - const currentDate = date.clone().set({ - hour: now.get("hour"), - minute: now.get("minute"), - second: now.get("second"), - }); - if (calc) { - currentDate.add(parseInt(timeDelta, 10), unit); - } - if (momentFormat) { - return currentDate.format(momentFormat.substring(1).trim()); - } - return currentDate.format(format); - }) - .replace(/{{\s*yesterday\s*}}/gi, date.clone().subtract(1, "day").format(format)) - .replace(/{{\s*tomorrow\s*}}/gi, date.clone().add(1, "d").format(format))); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - app.foldManager.save(createdFile, IFoldInfo); - return createdFile; - } - catch (err) { - console.error(`Failed to create file: '${normalizedPath}'`, err); - new obsidian__default['default'].Notice("Unable to create new file."); - } -} -function getDailyNote(date, dailyNotes) { - return dailyNotes[getDateUID$1(date, "day")] ?? null; -} -function getAllDailyNotes() { - /** - * Find all daily notes in the daily note folder - */ - const { vault } = window.app; - const { folder } = getDailyNoteSettings(); - const dailyNotesFolder = vault.getAbstractFileByPath(obsidian__default['default'].normalizePath(folder)); - if (!dailyNotesFolder) { - throw new DailyNotesFolderMissingError("Failed to find daily notes folder"); - } - const dailyNotes = {}; - obsidian__default['default'].Vault.recurseChildren(dailyNotesFolder, (note) => { - if (note instanceof obsidian__default['default'].TFile) { - const date = getDateFromFile(note, "day"); - if (date) { - const dateString = getDateUID$1(date, "day"); - dailyNotes[dateString] = note; - } - } - }); - return dailyNotes; -} - -class WeeklyNotesFolderMissingError extends Error { -} -function getAllWeeklyNotes() { - const weeklyNotes = {}; - if (!appHasWeeklyNotesPluginLoaded()) { - return weeklyNotes; - } - const { vault } = window.app; - const { folder } = getWeeklyNoteSettings(); - const weeklyNotesFolder = vault.getAbstractFileByPath(obsidian__default['default'].normalizePath(folder)); - if (!weeklyNotesFolder) { - throw new WeeklyNotesFolderMissingError("Failed to find weekly notes folder"); - } - obsidian__default['default'].Vault.recurseChildren(weeklyNotesFolder, (note) => { - if (note instanceof obsidian__default['default'].TFile) { - const date = getDateFromFile(note, "week"); - if (date) { - const dateString = getDateUID$1(date, "week"); - weeklyNotes[dateString] = note; - } - } - }); - return weeklyNotes; -} - -class MonthlyNotesFolderMissingError extends Error { -} -function getAllMonthlyNotes() { - const monthlyNotes = {}; - if (!appHasMonthlyNotesPluginLoaded()) { - return monthlyNotes; - } - const { vault } = window.app; - const { folder } = getMonthlyNoteSettings(); - const monthlyNotesFolder = vault.getAbstractFileByPath(obsidian__default['default'].normalizePath(folder)); - if (!monthlyNotesFolder) { - throw new MonthlyNotesFolderMissingError("Failed to find monthly notes folder"); - } - obsidian__default['default'].Vault.recurseChildren(monthlyNotesFolder, (note) => { - if (note instanceof obsidian__default['default'].TFile) { - const date = getDateFromFile(note, "month"); - if (date) { - const dateString = getDateUID$1(date, "month"); - monthlyNotes[dateString] = note; - } - } - }); - return monthlyNotes; -} -/** - * XXX: "Weekly Notes" live in either the Calendar plugin or the periodic-notes plugin. - * Check both until the weekly notes feature is removed from the Calendar plugin. - */ -function appHasWeeklyNotesPluginLoaded() { - const { app } = window; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - if (app.plugins.getPlugin("calendar")) { - return true; - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const periodicNotes = app.plugins.getPlugin("periodic-notes"); - return periodicNotes && periodicNotes.settings?.weekly?.enabled; -} -function appHasMonthlyNotesPluginLoaded() { - const { app } = window; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const periodicNotes = app.plugins.getPlugin("periodic-notes"); - return periodicNotes && periodicNotes.settings?.monthly?.enabled; -} -var createDailyNote_1 = createDailyNote; -var getAllDailyNotes_1 = getAllDailyNotes; -var getAllMonthlyNotes_1 = getAllMonthlyNotes; -var getAllWeeklyNotes_1 = getAllWeeklyNotes; -var getDailyNote_1 = getDailyNote; -var getDailyNoteSettings_1 = getDailyNoteSettings; -var getMonthlyNoteSettings_1 = getMonthlyNoteSettings; -var getWeeklyNoteSettings_1 = getWeeklyNoteSettings; - -class VaultIntermediate { - constructor(vault) { - this.getDailyNotes = () => getAllDailyNotes_1(); - this.getWeeklyNotes = () => getAllWeeklyNotes_1(); - this.getMonthlyNotes = () => getAllMonthlyNotes_1(); - this.getDailyNote = (date) => { - const desiredNote = getDailyNote_1(date, getAllDailyNotes_1()); - if (desiredNote) { - return Promise.resolve(desiredNote); - } - return this.createDailyNote(date); - }; - this.createDailyNote = (date) => createDailyNote_1(date); - this.findMomentForDailyNote = (file) => { - const { format } = getDailyNoteSettings_1(); - const date = window.moment(file.basename, format, true); - return date.isValid() ? date : null; - }; - this.fileNameForMoment = (date) => date.format(getDailyNoteSettings_1().format); - this.readFile = (file, useCache) => useCache ? this.vault.cachedRead(file) : this.vault.read(file); - this.writeFile = (file, data) => this.vault.modify(file, data); - /** - * NOTE: Untested, ended up needing after writing this, - * but it seemed useful so I kept it just in case. - * - * Returns a periodic note ID for the file. - * NOTE: The values returned are not actually file names, but values similar to: - * - day-2021-02-12T00:00:00-08:00 - * - week-2021-02-21T00:00:00-08:00 - * - month-2021-02-01T00:00:00-08:00 - */ - this.getPeriodicNoteIDForFile = (file) => { - const dSettings = getDailyNoteSettings_1(); - let uid = this.getDateUID(file, dSettings, 'day'); - if (uid) { - return uid; - } - const wSettings = getWeeklyNoteSettings_1(); - uid = this.getDateUID(file, wSettings, 'week'); - if (uid) { - return uid; - } - const mSettings = getMonthlyNoteSettings_1(); - uid = this.getDateUID(file, mSettings, 'month'); - if (uid) { - return uid; - } - }; - /** - * NOTE: Untested, ended up needing after writing this, - * but it seemed useful so I kept it just in case. - */ - this.getDateUID = (file, settings, granularity) => { - if (settings.folder && !file.path.startsWith(settings.folder)) { - return undefined; // Not in the right folder - } - const date = window.moment(file.basename, settings.format, true); - if (date.isValid()) { - return `${granularity}-${date.startOf(granularity).format()}`; - } - }; - this.vault = vault; - } -} - -class SlatedPlugin extends obsidian.Plugin { - constructor() { - super(...arguments); - this.taskChecker = () => { - if (this.app.workspace.activeLeaf === undefined || - !(this.app.workspace.activeLeaf.view instanceof obsidian.MarkdownView)) { - return false; - } - const activeLeaf = this.app.workspace.activeLeaf; - if (!(activeLeaf.view instanceof obsidian.MarkdownView)) { - return; - } - const editor = activeLeaf.view.sourceMode.cmEditor; - const currentLine = editor.getLine(editor.getCursor().line); - return this.taskHandler.isLineTask(currentLine); - }; - this.withTaskLine = (fn) => __awaiter(this, void 0, void 0, function* () { - const activeLeaf = this.app.workspace.activeLeaf; - if (!(activeLeaf.view instanceof obsidian.MarkdownView)) { - return; - } - const editor = activeLeaf.view.sourceMode.cmEditor; - const cursorPos = editor.getCursor(); - const task = new TaskLine(cursorPos.line, activeLeaf.view.file, (yield this.vault.readFile(activeLeaf.view.file, true)).split('\n'), this.vault, this.settings); - fn(task); - }); - this.renderMovedTasks = (el, ctx) => { - // TODO: When processing before rendering is possible in the Obsidian API, - // switch to using TaskLine.svelte - Object.values(el.getElementsByTagName('li')) - .filter((listItem) => !listItem.hasClass('task-list-item') && - listItem.getText().trimStart().startsWith('[-]')) - .forEach((listItem) => { - let innerEl = listItem; - const pElements = listItem.getElementsByTagName('p'); - if (pElements.length > 0) { - // If there are lines in the list which do not start with a `-` then - // the renderer will wrap everything in `p` elements. In this case - // look at the first text node in the p element. - innerEl = pElements[0]; - } - let removedPrefix = ''; - for (let i = 0; i < innerEl.childNodes.length; i++) { - const child = innerEl.childNodes[i]; - if (child.nodeType !== 3) { - continue; - } - removedPrefix = child.textContent.slice(0, 4); - child.textContent = child.textContent.slice(4); - break; // Only perform the replacement on the first textnode in an
  • - } - const icon = (() => { - switch (removedPrefix) { - case '[-] ': - return skippedIconSvg; - default: - console.error('Unrecognized task type: ' + removedPrefix); - return ''; - } - })(); - listItem.addClass('task-list-item'); - if (icon === skippedIconSvg) { - listItem.addClass('is-skipped'); - } - innerEl.insertBefore(Element(icon), innerEl.firstChild); - }); - }; - } - onload() { - return __awaiter(this, void 0, void 0, function* () { - yield this.loadSettings(); - this.vault = new VaultIntermediate(this.app.vault); - this.taskHandler = new TaskHandler(this.vault, this.app.metadataCache, this.settings); - this.taskCache = new TaskCache(this.taskHandler, this.vault); - this.app.workspace.onLayoutReady(() => { - this.taskCache.initialize(); - }); - obsidian.MarkdownPreviewRenderer.registerPostProcessor(this.renderMovedTasks); - this.registerEvent(this.app.workspace.on('file-open', (file) => { - if (!file || !file.basename) { - return; - } - // This callback is fired whenever a file receives focus - // not just when the file is first opened. - console.debug('Slated: File opened: ' + file.basename); - if (this.lastFile) { - this.taskHandler.processFile(this.lastFile); - this.taskCache.fileOpenHook(this.lastFile); - } - this.lastFile = file; - this.taskHandler.processFile(file); - this.taskCache.fileOpenHook(file); - })); - this.addCommand({ - id: 'task-skip', - name: 'Skip Task Occurence', - checkCallback: (checking) => { - if (checking) { - return this.taskChecker(); - } - this.withTaskLine((tl) => tl.skipOccurence()); - }, - }); - this.addCommand({ - id: 'task-move-modal', - name: 'Move Task', - checkCallback: (checking) => { - if (checking) { - return this.taskChecker(); - } - this.withTaskLine((task) => { - new TaskMoveModal(this.app, task).open(); - }); - }, - }); - this.addCommand({ - id: 'task-repeat-modal', - name: 'Configure Task Repetition', - checkCallback: (checking) => { - if (checking) { - return this.taskChecker(); - } - this.withTaskLine((task) => { - new TaskRepeatModal(this.app, task).open(); - }); - }, - }); - this.addCommand({ - id: 'move-incompleted-today', - name: 'Move incomplete tasks from current file to today', - checkCallback: (checking) => { - const activeLeaf = this.app.workspace.activeLeaf; - if (!(activeLeaf.view instanceof obsidian.MarkdownView)) { - return; - } - if (checking) { - // Disallow moving tasks if currently looking at today's note - const m = this.vault.findMomentForDailyNote(activeLeaf.view.file); - return !(m && m.isSame(new Date(), 'day')); - } - this.taskHandler.moveIncompleted(activeLeaf.view.file, window.moment().startOf('day')); - }, - }); - this.addSettingTab(new SettingsTab(this.app, this)); - }); - } - loadSettings() { - return __awaiter(this, void 0, void 0, function* () { - this.settings = settingsWithDefaults(yield this.loadData()); - if (shouldConfigureGlobalMoment(this.app)) { - tryToConfigureGlobalMoment(this.app, this.settings); - } - }); - } -} -class TaskMoveModal extends obsidian.Modal { - constructor(app, task) { - super(app); - this.onOpen = () => { - const { contentEl } = this; - new TaskMove({ - target: contentEl, - props: { - task: this.task, - close: () => this.close(), - }, - }); - }; - this.onClose = () => { - const { contentEl } = this; - contentEl.empty(); - }; - this.task = task; - } -} -class TaskRepeatModal extends obsidian.Modal { - constructor(app, task) { - super(app); - this.onOpen = () => { - const { contentEl } = this; - new TaskRepeat({ - target: contentEl, - props: { - task: this.task, - close: () => this.close(), - }, - }); - }; - this.onClose = () => { - const { contentEl } = this; - contentEl.empty(); - }; - this.task = task; - } -} -class SettingsTab extends obsidian.PluginSettingTab { - constructor(app, plugin) { - super(app, plugin); - this.plugin = plugin; - } - display() { - var _a, _b; - const { containerEl } = this; - containerEl.empty(); - containerEl.createEl('h2', { text: 'Slated Plugin - Settings' }); - containerEl.createEl('p', { - text: 'This plugin is in beta testing. Back up your data!', - }); - containerEl.createEl('p', { - text: 'If you encounter bugs, or have feature requests, please submit them on Github.', - }); - containerEl.createEl('p', { text: 'Thank you.' }); - new obsidian.Setting(containerEl) - .setName('Empty line after headings') - .setDesc('When creating headings or adding tasks, leave an empty line below any headings.') - .addToggle((toggle) => { - toggle - .setValue(this.plugin.settings.blankLineAfterHeader) - .onChange((value) => { - this.plugin.settings.blankLineAfterHeader = value; - this.plugin.saveData(this.plugin.settings); - }); - }); - new obsidian.Setting(containerEl) - .setName('Preserve incomplete tasks when moving') - .setDesc('When moving a task to a different note, mark the task as moved with [>] in the current note rather than deleting it.') - .addToggle((toggle) => { - toggle - .setValue(this.plugin.settings.preserveMovedTasks) - .onChange((value) => { - this.plugin.settings.preserveMovedTasks = value; - this.plugin.saveData(this.plugin.settings); - }); - }); - new obsidian.Setting(containerEl) - .setName('Tasks section header') - .setDesc('Markdown header to use when creating tasks section in a document') - .addText((text) => { - text.setValue(this.plugin.settings.tasksHeader).onChange((value) => { - if (!value.startsWith('#')) { - new obsidian.Notice('Tasks section header must start with "#"'); - } - this.plugin.settings.tasksHeader = value; - this.plugin.saveData(this.plugin.settings); - }); - }); - if (shouldConfigureGlobalMoment(this.app)) { - const sysLocale = (_a = navigator.language) === null || _a === void 0 ? void 0 : _a.toLowerCase(); - const localizedWeekdays = window.moment.weekdays(); - const localeWeekStartNum = (_b = window._bundledLocaleWeekSpec) === null || _b === void 0 ? void 0 : _b.dow; - const localeWeekStart = window.moment.weekdays()[localeWeekStartNum]; - const weekdays = [ - 'sunday', - 'monday', - 'tuesday', - 'wednesday', - 'thursday', - 'friday', - 'saturday', - ]; - new obsidian.Setting(this.containerEl) - .setName('Start week on:') - .setDesc("Choose what day of the week to start. Select 'Locale default' to use the default specified by moment.js") - .addDropdown((dropdown) => { - dropdown.addOption('locale', `Locale default (${localeWeekStart})`); - localizedWeekdays.forEach((day, i) => { - dropdown.addOption(weekdays[i], day); - }); - dropdown.setValue(this.plugin.settings.weekStart); - dropdown.onChange((value) => __awaiter(this, void 0, void 0, function* () { - this.plugin.settings.weekStart = value; - this.plugin.saveData(this.plugin.settings); - tryToConfigureGlobalMoment(this.app, this.plugin.settings); - })); - }); - new obsidian.Setting(containerEl) - .setName('Override locale:') - .setDesc('Set this if you want to use a locale different from the default') - .addDropdown((dropdown) => { - dropdown.addOption('system-default', `Same as system (${sysLocale})`); - window.moment.locales().forEach((locale) => { - dropdown.addOption(locale, locale); - }); - dropdown.setValue(this.plugin.settings.localeOverride); - dropdown.onChange((value) => __awaiter(this, void 0, void 0, function* () { - this.plugin.settings.localeOverride = value; - this.plugin.saveData(this.plugin.settings); - tryToConfigureGlobalMoment(this.app, this.plugin.settings); - })); - }); - } - const div = containerEl.createEl('div', { - cls: 'slated-donation', - }); - const donateText = document.createElement('p'); - donateText.appendText('If this plugin adds value for you and you would like to help support ' + - 'continued development, please use the buttons below:'); - div.appendChild(donateText); - const parser = new DOMParser(); - div.appendChild(createDonateButton('https://paypal.me/tgrosinger', parser.parseFromString(paypal, 'text/xml').documentElement)); - div.appendChild(createDonateButton('https://www.buymeacoffee.com/tgrosinger', parser.parseFromString(buyMeACoffee, 'text/xml').documentElement)); - } -} -const createDonateButton = (link, img) => { - const a = document.createElement('a'); - a.setAttribute('href', link); - a.addClass('slated-donate-button'); - a.appendChild(img); - return a; -}; - -module.exports = SlatedPlugin; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsInNyYy9ncmFwaGljcy50cyIsIm5vZGVfbW9kdWxlcy9vYnNpZGlhbi1jYWxlbmRhci11aS9kaXN0L2luZGV4Lm1qcyIsInNyYy9sb2NhbGl6YXRpb24udHMiLCJzcmMvc2V0dGluZ3MudHMiLCJzcmMvdGFzay1jYWNoZS50cyIsInNyYy9maWxlLWhlbHBlcnMudHMiLCJub2RlX21vZHVsZXMvcnJ1bGUvZGlzdC9lc20vc3JjL3dlZWtkYXkuanMiLCJub2RlX21vZHVsZXMvcnJ1bGUvZGlzdC9lc20vc3JjL2hlbHBlcnMuanMiLCJub2RlX21vZHVsZXMvcnJ1bGUvZGlzdC9lc20vc3JjL2RhdGV1dGlsLmpzIiwibm9kZV9tb2R1bGVzL3JydWxlL2Rpc3QvZXNtL3NyYy9pdGVycmVzdWx0LmpzIiwibm9kZV9tb2R1bGVzL3JydWxlL2Rpc3QvZXNtL3NyYy9jYWxsYmFja2l0ZXJyZXN1bHQuanMiLCJub2RlX21vZHVsZXMvcnJ1bGUvZGlzdC9lc20vc3JjL25scC9pMThuLmpzIiwibm9kZV9tb2R1bGVzL3JydWxlL2Rpc3QvZXNtL3NyYy9ubHAvdG90ZXh0LmpzIiwibm9kZV9tb2R1bGVzL3JydWxlL2Rpc3QvZXNtL3NyYy9ubHAvcGFyc2V0ZXh0LmpzIiwibm9kZV9tb2R1bGVzL3JydWxlL2Rpc3QvZXNtL3NyYy90eXBlcy5qcyIsIm5vZGVfbW9kdWxlcy9ycnVsZS9kaXN0L2VzbS9zcmMvbmxwL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JydWxlL2Rpc3QvZXNtL3NyYy9kYXRldGltZS5qcyIsIm5vZGVfbW9kdWxlcy9ycnVsZS9kaXN0L2VzbS9zcmMvcGFyc2VvcHRpb25zLmpzIiwibm9kZV9tb2R1bGVzL3JydWxlL2Rpc3QvZXNtL3NyYy9wYXJzZXN0cmluZy5qcyIsIm5vZGVfbW9kdWxlcy9sdXhvbi9idWlsZC9ub2RlL2x1eG9uLmpzIiwibm9kZV9tb2R1bGVzL3JydWxlL2Rpc3QvZXNtL3NyYy9kYXRld2l0aHpvbmUuanMiLCJub2RlX21vZHVsZXMvcnJ1bGUvZGlzdC9lc20vc3JjL29wdGlvbnN0b3N0cmluZy5qcyIsIm5vZGVfbW9kdWxlcy9ycnVsZS9kaXN0L2VzbS9zcmMvY2FjaGUuanMiLCJub2RlX21vZHVsZXMvcnJ1bGUvZGlzdC9lc20vc3JjL21hc2tzLmpzIiwibm9kZV9tb2R1bGVzL3JydWxlL2Rpc3QvZXNtL3NyYy9pdGVyaW5mby95ZWFyaW5mby5qcyIsIm5vZGVfbW9kdWxlcy9ycnVsZS9kaXN0L2VzbS9zcmMvaXRlcmluZm8vbW9udGhpbmZvLmpzIiwibm9kZV9tb2R1bGVzL3JydWxlL2Rpc3QvZXNtL3NyYy9pdGVyaW5mby9lYXN0ZXIuanMiLCJub2RlX21vZHVsZXMvcnJ1bGUvZGlzdC9lc20vc3JjL2l0ZXJpbmZvL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JydWxlL2Rpc3QvZXNtL3NyYy9pdGVyL3Bvc2xpc3QuanMiLCJub2RlX21vZHVsZXMvcnJ1bGUvZGlzdC9lc20vc3JjL2l0ZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcnJ1bGUvZGlzdC9lc20vc3JjL3JydWxlLmpzIiwibm9kZV9tb2R1bGVzL3JydWxlL2Rpc3QvZXNtL3NyYy9pdGVyc2V0LmpzIiwibm9kZV9tb2R1bGVzL3JydWxlL2Rpc3QvZXNtL3NyYy9ycnVsZXN0ci5qcyIsIm5vZGVfbW9kdWxlcy9ycnVsZS9kaXN0L2VzbS9zcmMvcnJ1bGVzZXQuanMiLCJzcmMvcmVwZWF0LnRzIiwic3JjL3Rhc2stbGluZS50cyIsInNyYy90YXNrLWhhbmRsZXIudHMiLCJub2RlX21vZHVsZXMvc3ZlbHRlL2ludGVybmFsL2luZGV4Lm1qcyIsInNyYy91aS9UYXNrTW92ZS5zdmVsdGUiLCJzcmMvdWkvQnV0dG9uR3JvdXAuc3ZlbHRlIiwibm9kZV9tb2R1bGVzL3N2ZWx0ZS9zdG9yZS9pbmRleC5tanMiLCJzcmMvdWkvV2Vla0RheXNPZk1vbnRoU2VsZWN0b3Iuc3ZlbHRlIiwic3JjL3VpL1Rhc2tSZXBlYXQuc3ZlbHRlIiwibm9kZV9tb2R1bGVzL29ic2lkaWFuLWRhaWx5LW5vdGVzLWludGVyZmFjZS9kaXN0L21haW4uanMiLCJzcmMvdmF1bHQudHMiLCJzcmMvbWFpbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXHJcblxyXG5QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcclxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxyXG5cclxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxyXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcclxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxyXG5JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cclxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1JcclxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxyXG5QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSAqL1xyXG5cclxudmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XHJcbiAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxyXG4gICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xyXG4gICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XHJcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcclxuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxyXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XHJcbiAgICAgICAgfVxyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XHJcbiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcclxuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XHJcbiAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcclxuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxyXG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XHJcbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XHJcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xyXG4gICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcclxuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XHJcbiAgICAgICAgd2hpbGUgKF8pIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcclxuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cclxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2NyZWF0ZUJpbmRpbmcgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xyXG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIG9bazJdID0gbVtrXTtcclxufSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIG8pIHtcclxuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgcCkpIF9fY3JlYXRlQmluZGluZyhvLCBtLCBwKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcclxuICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XHJcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcclxuICAgIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcclxuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcclxuICAgIGlmICghbSkgcmV0dXJuIG87XHJcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cclxuICAgIH1cclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuLyoqIEBkZXByZWNhdGVkICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcclxuICAgIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuLyoqIEBkZXByZWNhdGVkICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcclxuICAgIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xyXG4gICAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxyXG4gICAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxyXG4gICAgICAgICAgICByW2tdID0gYVtqXTtcclxuICAgIHJldHVybiByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheSh0bywgZnJvbSkge1xyXG4gICAgZm9yICh2YXIgaSA9IDAsIGlsID0gZnJvbS5sZW5ndGgsIGogPSB0by5sZW5ndGg7IGkgPCBpbDsgaSsrLCBqKyspXHJcbiAgICAgICAgdG9bal0gPSBmcm9tW2ldO1xyXG4gICAgcmV0dXJuIHRvO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XHJcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XHJcbiAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcclxuICAgIHZhciBpLCBwO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IG4gPT09IFwicmV0dXJuXCIgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XHJcbiAgICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xyXG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgIHJldHVybiBjb29rZWQ7XHJcbn07XHJcblxyXG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XHJcbn0pIDogZnVuY3Rpb24obywgdikge1xyXG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcclxuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XHJcbiAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XHJcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBwcml2YXRlTWFwKSB7XHJcbiAgICBpZiAoIXByaXZhdGVNYXAuaGFzKHJlY2VpdmVyKSkge1xyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhdHRlbXB0ZWQgdG8gZ2V0IHByaXZhdGUgZmllbGQgb24gbm9uLWluc3RhbmNlXCIpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHByaXZhdGVNYXAuZ2V0KHJlY2VpdmVyKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRTZXQocmVjZWl2ZXIsIHByaXZhdGVNYXAsIHZhbHVlKSB7XHJcbiAgICBpZiAoIXByaXZhdGVNYXAuaGFzKHJlY2VpdmVyKSkge1xyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhdHRlbXB0ZWQgdG8gc2V0IHByaXZhdGUgZmllbGQgb24gbm9uLWluc3RhbmNlXCIpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZU1hcC5zZXQocmVjZWl2ZXIsIHZhbHVlKTtcclxuICAgIHJldHVybiB2YWx1ZTtcclxufVxyXG4iLCJleHBvcnQgY29uc3QgRWxlbWVudCA9IChzdmdUZXh0OiBzdHJpbmcpOiBIVE1MRWxlbWVudCA9PiB7XG4gIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgcmV0dXJuIHBhcnNlci5wYXJzZUZyb21TdHJpbmcoc3ZnVGV4dCwgJ3RleHQveG1sJykuZG9jdW1lbnRFbGVtZW50O1xufTtcblxuLyoqXG4gKiBJY29uIHVzZWQgaW4gdGhlIHNpZGUgcmliYm9uXG4gKi9cbmV4cG9ydCBjb25zdCBjaGVja2JveEljb24gPSBgXG48c3ZnIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgdmVyc2lvbj1cIjEuMVwiIHZpZXdCb3g9XCIwIDAgMjkzIDI5MVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiA8cGF0aCBkPVwibTI2NiAxNDZjMC03IDYtMTMgMTMtMTNzMTIgNiAxMiAxM3Y5MGMwIDMwLTI1IDU1LTU1IDU1aC0xODFjLTMwIDAtNTUtMjUtNTUtNTV2LTE4MWMwLTMwIDI1LTU1IDU1LTU1aDkxYzcgMCAxMiA2IDEyIDEzcy01IDEyLTEyIDEyaC05MWMtMTYgMC0zMCAxNC0zMCAzMHYxODFjMCAxNiAxNCAzMCAzMCAzMGgxODFjMTYgMCAzMC0xNCAzMC0zMHYtOTB6XCIvPlxuIDxwYXRoIGQ9XCJtODEgMTA4Yy01LTUtNS0xMyAwLTE4czEzLTUgMTggMGw0NyA0NiAxMjUtMTI1YzUtNSAxMy01IDE4IDBzNSAxMyAwIDE4bC0xMzQgMTM0Yy01IDUtMTMgNS0xOCAwbC01Ni01NXpcIiBzdHJva2Utd2lkdGg9XCIxLjAwMDFcIi8+XG48L3N2Zz5gO1xuXG4vL1xuLy8gSWNvbnMgZm9yIHVzZSB3aGVuIHJlbmRlcmluZyBub3Rlc1xuLy8gU2l6ZWQgdG8gZml0IGlubGluZSB3aXRoIGFjdHVhbCBjaGVja2JveCBpbnB1dHNcbi8vXG5cbi8qKlxuICogU2l6ZWQgc28gdGhhdCB0aGlzIGZpdHMgaW5saW5lIHdpdGggYWN0dWFsIGNoZWNrYm94IGlucHV0c1xuICovXG5leHBvcnQgY29uc3Qgc2tpcHBlZEljb25TdmcgPSBgXG48c3ZnIGNsYXNzPVwic2xhdGVkLXRhc2staWNvblwiIHdpZHRoPVwiNjcuODY2bW1cIiBoZWlnaHQ9XCI1MC44NDhtbVwiIHZlcnNpb249XCIxLjFcIiB2aWV3Qm94PVwiMCAwIDY3Ljg2NiA1MC44NDhcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gPGcgZmlsbD1cIm5vbmVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj5cbiAgPHJlY3QgeD1cIjIuMTEyNlwiIHk9XCIyLjQwNjJcIiB3aWR0aD1cIjQxLjU5MlwiIGhlaWdodD1cIjQ2LjE2M1wiIHJ5PVwiNC42MzI4XCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIzMS41XCIgc3Ryb2tlLXdpZHRoPVwiNC4yMzMzXCIvPlxuICA8cGF0aCBkPVwibTEzLjgxOCAyNS40ODhoMTguMTgyXCIgc3Ryb2tlLXdpZHRoPVwiMy45MzA4XCIvPlxuIDwvZz5cbjwvc3ZnPmA7XG5cbi8vXG4vLyBJY29ucyBmb3IgdGhlIFRhc2tWaWV3IGhlYWRlclxuLy8gTk9UIHNpemVkIHRvIGZpdCBpbmxpbmUgd2l0aCBhY3R1YWwgY2hlY2tib3ggaW5wdXRzXG4vL1xuXG5leHBvcnQgY29uc3QgcmVwZWF0aW5nSWNvblN2ZyA9IGBcbjxzdmcgY2xhc3M9XCJzbGF0ZWQtdGFzay12aWV3LWZpbHRlci1pY29uXCIgdmVyc2lvbj1cIjEuMVwiIHZpZXdCb3g9XCIwIDAgMjU2IDI1NlwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiA8ZyBmaWxsPVwibm9uZVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS13aWR0aD1cIjEwXCI+XG4gIDxwYXRoIGQ9XCJtMjAwIDg5LjI3IDI1LjYxNS0yNS43NzljLTE4LjgzNS0wLjA0MDQ3My05OS45NjUgMC4yNzkxNS0xMzMuNzEgMC41NTg3NS0zMy41NDYgMC4yNzc5Ni01OC44MzggMjUuNzYyLTYwLjQxMyA2NS4yMm0xNjguNTEtOTAuMDMyYzcuNDQ1OCA3LjQxMDggMTYuMzMgMTUuMjggMjUuNjE1IDI0LjI1M1wiLz5cbiAgPHBhdGggZD1cIm01Ni4wNDYgMTY2LjI5LTI1LjYxNSAyNS43NzljMTguODM1IDAuMDQwNSA5OS45NjUtMC4yNzkxNSAxMzMuNzEtMC41NTg3NSAzMy41NDYtMC4yNzc5NiA1OC44MzgtMjUuNzYyIDYwLjQxMy02NS4yMm0tMTY4LjUxIDkwLjAzMmMtNy40NDU4LTcuNDEwOC0xNi4zMy0xNS4yOC0yNS42MTUtMjQuMjUzXCIvPlxuIDwvZz5cbjwvc3ZnPmA7XG5cbmV4cG9ydCBjb25zdCBub25SZXBlYXRpbmdJY29uU3ZnID0gYFxuPHN2ZyBjbGFzcz1cInNsYXRlZC10YXNrLXZpZXctZmlsdGVyLWljb25cIiB2ZXJzaW9uPVwiMS4xXCIgdmlld0JveD1cIjAgMCAyNTYgMjU2XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuIDxnIGZpbGw9XCJub25lXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLXdpZHRoPVwiMTBcIj5cbiAgPHBhdGggZD1cIm01Ni4wNDYgMTY2LjI5LTI1LjYxNSAyNS43NzljMTguODM1IDAuMDQwNSA4Ni4zNTEtMC4yNzkxNSAxMjAuMS0wLjU1ODc1bTQ0Ljk4LTkuMTcyM2MxOS4xODgtMTAuMDIgMjcuOTM5LTI4LjI5OSAyOS4wNDctNTYuMDQ4bS0xNjguNTEgOTAuMDMyYy03LjQ0NTgtNy40MTA4LTE2LjMzLTE1LjI4LTI1LjYxNS0yNC4yNTNcIi8+XG4gIDxwYXRoIGQ9XCJtMjAwIDg5LjI3IDI1LjYxNS0yNS43NzljLTE4LjgzNS0wLjA0MDQ3LTg1LjYzMyAwLjI3OTE1LTExOS4zOCAwLjU1ODc1bS00NS42OTkgOS4xNzIzYy0xOS4xODggMTAuMDItMjcuOTM5IDI4LjI5OS0yOS4wNDcgNTYuMDQ4bTE2OC41MS05MC4wMzJjNy40NDU4IDcuNDEwOCAxNi4zMyAxNS4yOCAyNS42MTUgMjQuMjUzXCIvPlxuICA8cGF0aCBkPVwibTU5LjUzOSAzOS4xOSAxMzkuNyAxNzcuMjJcIi8+XG4gPC9nPlxuPC9zdmc+YDtcblxuZXhwb3J0IGNvbnN0IGNiVW5jaGVja2VkSWNvblN2ZyA9IGBcbjxzdmcgY2xhc3M9XCJzbGF0ZWQtdGFzay12aWV3LWZpbHRlci1pY29uXCIgd2lkdGg9XCI0Ni4yMjJcIiBoZWlnaHQ9XCI1MC44MzJcIiB2ZXJzaW9uPVwiMS4xXCIgdmlld0JveD1cIjAgMCA0Ni4yMjIgNTAuODMyXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuIDxnIHRyYW5zZm9ybT1cIm1hdHJpeCgxLjAwODcgMCAwIDEuMDA4NyAuMDA0MDg1MSAtLjI5MjA1KVwiIGZpbGw9XCJub25lXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XG4gIDxyZWN0IHg9XCIyLjExMjZcIiB5PVwiMi40MDYyXCIgd2lkdGg9XCI0MS41OTJcIiBoZWlnaHQ9XCI0Ni4xNjNcIiByeT1cIjQuNjMyOFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMzEuNVwiIHN0cm9rZS13aWR0aD1cIjQuMjMzM1wiLz5cbiA8L2c+XG48L3N2Zz5gO1xuXG5leHBvcnQgY29uc3QgY2JDaGVja2VkSWNvblN2ZyA9IGBcbjxzdmcgY2xhc3M9XCJzbGF0ZWQtdGFzay12aWV3LWZpbHRlci1pY29uXCIgd2lkdGg9XCI0Ni4yMjJcIiBoZWlnaHQ9XCI1MC44MzJcIiB2ZXJzaW9uPVwiMS4xXCIgdmlld0JveD1cIjAgMCA0Ni4yMjIgNTAuODMyXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuIDxwYXRoIGQ9XCJtOC43OTAzIDI3LjM3OSA4LjI4MzYgOC4yMzQ5IDIwLjM1OC0yMC4zOTZcIiBmaWxsPVwibm9uZVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS13aWR0aD1cIjMuMTA2NFwiLz5cbiA8ZyB0cmFuc2Zvcm09XCJtYXRyaXgoMS4wMDg3IDAgMCAxLjAwODcgLjAwNDA4NTEgLS4yOTIwNSlcIiBmaWxsPVwibm9uZVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxuICA8cmVjdCB4PVwiMi4xMTI2XCIgeT1cIjIuNDA2MlwiIHdpZHRoPVwiNDEuNTkyXCIgaGVpZ2h0PVwiNDYuMTYzXCIgcnk9XCI0LjYzMjhcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjMxLjVcIiBzdHJva2Utd2lkdGg9XCI0LjIzMzNcIi8+XG4gPC9nPlxuPC9zdmc+YDtcblxuZXhwb3J0IGNvbnN0IG1vdmVkMkljb25TdmcgPSBgXG48c3ZnIGNsYXNzPVwic2xhdGVkLXRhc2stdmlldy1maWx0ZXItaWNvblwiIHdpZHRoPVwiNjcuODY2bW1cIiBoZWlnaHQ9XCI1MC44NDhtbVwiIHZlcnNpb249XCIxLjFcIiB2aWV3Qm94PVwiMCAwIDY3Ljg2NiA1MC44NDhcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gPGcgZmlsbD1cIm5vbmVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj5cbiAgPHBhdGggdHJhbnNmb3JtPVwic2NhbGUoLjI2NDU4KVwiIGQ9XCJtMTY1LjI2IDQ1LjQ4OXYtMTkuMTk2YzAtOS43MDA0LTcuODA5My0xNy41MS0xNy41MS0xNy41MWgtMTIyLjE4Yy05LjcwMDQgMC0xNy41MSA3LjgwOTMtMTcuNTEgMTcuNTF2MTM5LjQ1YzAgOS43MDA0IDcuODA5MyAxNy41MSAxNy41MSAxNy41MWgxMjIuMThjOS43MDA0IDAgMTcuNTEtNy44MDkzIDE3LjUxLTE3LjUxdi0xNy4xODZcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjMxLjVcIiBzdHJva2Utd2lkdGg9XCIxNlwiLz5cbiAgPHBhdGggZD1cIm01NC41NDIgMTUuMDgzIDExLjM1IDEwLjUxMi0xMS4yNzQgMTAuMTMxbS0yNi41MDktMTAuMDU1IDM3Ljc4My0wLjA3NjE3NlwiIHN0cm9rZS13aWR0aD1cIjQuMjMzM1wiLz5cbiA8L2c+XG48L3N2Zz5gO1xuXG5leHBvcnQgY29uc3QgZGFpbHlJY29uU3ZnID0gYFxuPHN2ZyBjbGFzcz1cInNsYXRlZC10YXNrLXZpZXctZmlsdGVyLWljb25cIiB3aWR0aD1cIjUycHhcIiBoZWlnaHQ9XCI1MnB4XCIgZW5hYmxlLWJhY2tncm91bmQ9XCJuZXcgMCAwIDUyIDUyXCIgdmVyc2lvbj1cIjEuMVwiIHZpZXdCb3g9XCIwIDAgNTIgNTJcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gPGcgc3Ryb2tlPVwibm9uZVwiPlxuICA8cGF0aCBkPVwibTQ2LjUgMjBoLTQxYy0wLjggMC0xLjUgMC43LTEuNSAxLjV2MjQuNWMwIDIuMiAxLjggNCA0IDRoMzZjMi4yIDAgNC0xLjggNC00di0yNC41YzAtMC44LTAuNy0xLjUtMS41LTEuNXptLTE2LjY1IDIyLjFjMCAwLjktMC41IDEuOS0xLjUgMS45LTAuOSAwLTEuNS0wLjktMS41LTEuOXYtMTAuM2wtMi4xIDEuOWMtMC4zIDAuMy0wLjcgMC40LTEuMSAwLjQtMC44IDAtMS41LTAuNi0xLjUtMS41IDAtMC40IDAuMS0wLjcgMC40LTFsMy44LTMuOGMwLjQtMC40IDAuOS0wLjcgMS41LTAuNyAxLjEgMCAyIDEgMiAyLjF6XCIvPlxuICA8cGF0aCBkPVwibTQ0IDdoLTV2LTJjMC0xLjYtMS4zLTMtMy0zLTEuNiAwLTMgMS4zLTMgM3YyaC0xNHYtMmMwLTEuNi0xLjMtMy0zLTMtMS42IDAtMyAxLjMtMyAzdjJoLTVjLTIuMiAwLTQgMS44LTQgNHYyLjVjMCAwLjggMC43IDEuNSAxLjUgMS41aDQxYzAuOCAwIDEuNS0wLjcgMS41LTEuNXYtMi41YzAtMi4yLTEuOC00LTQtNHpcIj5cbiA8L2c+XG48L3N2Zz5gO1xuXG5leHBvcnQgY29uc3Qgd2Vla2x5SWNvblN2ZyA9IGBcbjxzdmcgY2xhc3M9XCJzbGF0ZWQtdGFzay12aWV3LWZpbHRlci1pY29uXCIgd2lkdGg9XCI1MnB4XCIgaGVpZ2h0PVwiNTJweFwiIGVuYWJsZS1iYWNrZ3JvdW5kPVwibmV3IDAgMCA1MiA1MlwiIHZlcnNpb249XCIxLjFcIiB2aWV3Qm94PVwiMCAwIDUyIDUyXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuIDxnIHN0cm9rZT1cIm5vbmVcIj5cbiAgPHBhdGggZD1cIm00NCA3aC01di0yYzAtMS42LTEuMy0zLTMtMy0xLjYgMC0zIDEuMy0zIDN2MmgtMTR2LTJjMC0xLjYtMS4zLTMtMy0zLTEuNiAwLTMgMS4zLTMgM3YyaC01Yy0yLjIgMC00IDEuOC00IDR2Mi41YzAgMC44IDAuNyAxLjUgMS41IDEuNWg0MWMwLjggMCAxLjUtMC43IDEuNS0xLjV2LTIuNWMwLTIuMi0xLjgtNC00LTR6XCIvPlxuICA8cGF0aCBkPVwibTQ2LjUgMjBoLTQxYy0wLjggMC0xLjUgMC43LTEuNSAxLjV2MjQuNWMwIDIuMiAxLjggNCA0IDRoMzZjMi4yIDAgNC0xLjggNC00di0yNC41YzAtMC44LTAuNy0xLjUtMS41LTEuNXptLTEzLjcgOS41LTYuMyAxMy40Yy0wLjMgMC43LTEgMS4xLTEuOCAxLjEtMS4xIDAtMS45LTAuOS0xLjktMS44IDAtMC4yIDAuMS0wLjUgMC4yLTAuOGw1LjMtMTEuNGgtNy42Yy0wLjkgMC0xLjctMC42LTEuNy0xLjUgMC0wLjggMC44LTEuNSAxLjctMS41aDEwLjRjMSAwIDEuOSAwLjggMS45IDEuOCAwIDAuMy0wLjEgMC41LTAuMiAwLjd6XCIvPlxuIDwvZz5cbjwvc3ZnPlxuYDtcblxuZXhwb3J0IGNvbnN0IG1vbnRobHlJY29uU3ZnID0gYFxuPHN2ZyBjbGFzcz1cInNsYXRlZC10YXNrLXZpZXctZmlsdGVyLWljb25cIiB3aWR0aD1cIjUycHhcIiBoZWlnaHQ9XCI1MnB4XCIgZW5hYmxlLWJhY2tncm91bmQ9XCJuZXcgMCAwIDUyIDUyXCIgdmVyc2lvbj1cIjEuMVwiIHZpZXdCb3g9XCIwIDAgNTIgNTJcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gPGcgc3Ryb2tlPVwibm9uZVwiPlxuICA8cGF0aCBkPVwibTQ0IDdoLTV2LTJjMC0xLjYtMS4zLTMtMy0zLTEuNiAwLTMgMS4zLTMgM3YyaC0xNHYtMmMwLTEuNi0xLjMtMy0zLTMtMS42IDAtMyAxLjMtMyAzdjJoLTVjLTIuMiAwLTQgMS44LTQgNHYyLjVjMCAwLjggMC43IDEuNSAxLjUgMS41aDQxYzAuOCAwIDEuNS0wLjcgMS41LTEuNXYtMi41YzAtMi4yLTEuOC00LTQtNHpcIi8+XG4gIDxwYXRoIGQ9XCJtNDYuNSAyMGgtNDFjLTAuOCAwLTEuNSAwLjctMS41IDEuNXYyNC41YzAgMi4yIDEuOCA0IDQgNGgzNmMyLjIgMCA0LTEuOCA0LTR2LTI0LjVjMC0wLjgtMC43LTEuNS0xLjUtMS41em0tMjUuNCAyNGMtMi40IDAtNS4xLTAuOS01LjktMi4yLTAuMS0wLjItMC4yLTAuNC0wLjItMC43IDAtMC45IDAuOC0xLjYgMS42LTEuNiAwLjMgMCAwLjYgMC4xIDAuOSAwLjIgMS4xIDAuNiAyLjQgMSAzLjUgMSAyIDAgMy4xLTAuOSAzLjEtMi4xIDAtMS4zLTEtMS45LTMuMy0xLjktMS4zIDAuMi0yLjItMC40LTIuMi0xLjYgMC0wLjkgMC42LTEuNSAxLjYtMS41IDIuMSAwLjEgMy42LTAuNCAzLjYtMS44IDAtMS4zLTEuMy0xLjktMy0xLjktMS4xIDAtMi4yIDAuMy0zLjIgMC45LTAuMiAwLjItMC41IDAuMi0wLjggMC4yLTAuOCAwLTEuNS0wLjYtMS41LTEuNSAwLTAuNCAwLjItMC44IDAuNS0xLjEgMS4zLTEuMSAzLjEtMS44IDUuNC0xLjggMy44IDAgNi4yIDEuNyA2LjIgNC41IDAgMi4xLTEuOCAzLjQtMy42IDMuOCAxLjcgMC4yIDMuOCAxLjUgMy44IDMuOS0wLjEgMy4yLTIuNiA1LjItNi41IDUuMnptMTUuOS0xLjljMCAwLjktMC41IDEuOS0xLjUgMS45LTAuOSAwLTEuNS0wLjktMS41LTEuOXYtMTAuM2wtMi4xIDEuOWMtMC4zIDAuMy0wLjcgMC40LTEuMSAwLjQtMC44IDAtMS41LTAuNi0xLjUtMS41IDAtMC40IDAuMS0wLjcgMC40LTFsMy44LTMuOGMwLjQtMC40IDAuOS0wLjcgMS41LTAuNyAxLjEgMCAyIDEgMiAyLjF2MTIuOXpcIi8+XG4gPC9nPlxuPC9zdmc+XG5gO1xuXG5leHBvcnQgY29uc3QgYnV5TWVBQ29mZmVlID0gYFxuPHN2ZyB3aWR0aD1cIjE1MFwiIGhlaWdodD1cIjQyXCIgZmlsbD1cIm5vbmVcIiB2ZXJzaW9uPVwiMS4xXCIgdmlld0JveD1cIjAgMCAyNjAgNzNcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gPHBhdGggZD1cIk0wIDExLjY4QzAgNS4yMjkzMiA1LjIyOTMxIDAgMTEuNjggMEgyNDguMkMyNTQuNjUxIDAgMjU5Ljg4IDUuMjI5MzEgMjU5Ljg4IDExLjY4VjYxLjMyQzI1OS44OCA2Ny43NzA3IDI1NC42NTEgNzMgMjQ4LjIgNzNIMTEuNjhDNS4yMjkzMSA3MyAwIDY3Ljc3MDcgMCA2MS4zMlYxMS42OFpcIiBmaWxsPVwiI2ZkMFwiLz5cbiA8ZyBmaWxsPVwiIzBEMEMyMlwiPlxuICA8cGF0aCBkPVwibTUyLjI1NyAyNC4wMDgtMC4wMzItMC4wMTg5LTAuMDc0Mi0wLjAyMjZjMC4wMjk4IDAuMDI1MiAwLjA2NzIgMC4wMzk4IDAuMTA2MiAwLjA0MTV6XCIvPlxuICA8cGF0aCBkPVwibTUyLjcyNSAyNy4zNDYtMC4wMzUzIDAuMDA5OSAwLjAzNTMtMC4wMDk5elwiLz5cbiAgPHBhdGggZD1cIm01Mi4yNyAyNC4wMDJjLTAuMDA0MS01ZS00IC0wLjAwODItMC4wMDE1LTAuMDEyMS0wLjAwMjktMmUtNCAwLjAwMjctMmUtNCAwLjAwNTQgMCAwLjAwODEgMC4wMDQ0LTZlLTQgMC4wMDg2LTAuMDAyNCAwLjAxMjEtMC4wMDUyelwiLz5cbiAgPHBhdGggZD1cIm01Mi4yNTggMjQuMDA5aDAuMDA2NXYtNGUtM2wtMC4wMDY1IDRlLTN6XCIvPlxuICA8cGF0aCBkPVwibTUyLjY5NyAyNy4zMzkgMC4wNTQtMC4wMzA4IDAuMDIwMS0wLjAxMTMgMC4wMTgzLTAuMDE5NWMtMC4wMzQzIDAuMDE0OC0wLjA2NTYgMC4wMzU3LTAuMDkyNCAwLjA2MTZ6XCIvPlxuICA8cGF0aCBkPVwibTUyLjM0OCAyNC4wODEtMC4wNTI4LTAuMDUwMi0wLjAzNTgtMC4wMTk1YzAuMDE5MiAwLjAzMzkgMC4wNTEgMC4wNTkgMC4wODg2IDAuMDY5N3pcIi8+XG4gIDxwYXRoIGQ9XCJtMzkuMDY4IDU2LjQ2OWMtMC4wNDIyIDAuMDE4Mi0wLjA3OTEgMC4wNDY4LTAuMTA3NSAwLjA4M2wwLjAzMzQtMC4wMjE0YzAuMDIyNi0wLjAyMDggMC4wNTQ2LTAuMDQ1MyAwLjA3NDEtMC4wNjE2elwiLz5cbiAgPHBhdGggZD1cIm00Ni43OCA1NC45NTJjMC0wLjA0NzctMC4wMjMzLTAuMDM4OS0wLjAxNzYgMC4xMzA4IDAtMC4wMTM5IDAuMDA1Ny0wLjAyNzcgMC4wMDgyLTAuMDQwOSAwLjAwMzEtMC4wMzAyIDAuMDA1Ni0wLjA1OTcgMC4wMDk0LTAuMDg5OXpcIi8+XG4gIDxwYXRoIGQ9XCJtNDUuOTg0IDU2LjQ2OWMtMC4wNDIyIDAuMDE4Mi0wLjA3OTEgMC4wNDY4LTAuMTA3NCAwLjA4M2wwLjAzMzMtMC4wMjE0YzAuMDIyNi0wLjAyMDggMC4wNTQ2LTAuMDQ1MyAwLjA3NDEtMC4wNjE2elwiLz5cbiAgPHBhdGggZD1cIm0zMy42MzEgNTYuODNjLTAuMDMyLTAuMDI3OC0wLjA3MTItMC4wNDYxLTAuMTEzMS0wLjA1MjggMC4wMzM5IDAuMDE2NCAwLjA2NzkgMC4wMzI3IDAuMDkwNSAwLjA0NTNsMC4wMjI2IDAuMDA3NXpcIi8+XG4gIDxwYXRoIGQ9XCJtMzIuNDEyIDU1LjY2Yy01ZS0zIC0wLjA0OTUtMC4wMjAyLTAuMDk3NC0wLjA0NDYtMC4xNDA4IDAuMDE3MyAwLjA0NTIgMC4wMzE4IDAuMDkxNCAwLjA0MzQgMC4xMzgzbDAuMDAxMiAwLjAwMjV6XCIvPlxuIDwvZz5cbiA8cGF0aCBkPVwibTQwLjYyMyAzNC43MjJjLTEuNjc4MSAwLjcxODQtMy41ODI2IDEuNTMzLTYuMDUwOCAxLjUzMy0xLjAzMjUtMmUtMyAtMi4wNi0wLjE0MzctMy4wNTQ2LTAuNDIxMWwxLjcwNzEgMTcuNTI2YzAuMDYwNCAwLjczMjUgMC4zOTQxIDEuNDE1NiAwLjkzNDggMS45MTM0IDAuNTQwOCAwLjQ5NzkgMS4yNDkgMC43NzQzIDEuOTg0IDAuNzc0MSAwIDAgMi40MjA1IDAuMTI1NyAzLjIyODEgMC4xMjU3IDAuODY5MyAwIDMuNDc1OC0wLjEyNTcgMy40NzU4LTAuMTI1NyAwLjczNDkgMCAxLjQ0My0wLjI3NjQgMS45ODM2LTAuNzc0MyAwLjU0MDYtMC40OTc4IDAuODc0Mi0xLjE4MDggMC45MzQ2LTEuOTEzMmwxLjgyODQtMTkuMzY4Yy0wLjgxNzEtMC4yNzktMS42NDE3LTAuNDY0NC0yLjU3MTMtMC40NjQ0LTEuNjA3Ny03ZS00IC0yLjkwMzEgMC41NTMxLTQuMzk5NyAxLjE5MzV6XCIgZmlsbD1cIiNmZmZcIi8+XG4gPHBhdGggZD1cIm0yNi4yMzQgMjcuMjQ1IDAuMDI4OSAwLjAyNyAwLjAxODggMC4wMTEzYy0wLjAxNDUtMC4wMTQ0LTAuMDMwNS0wLjAyNzMtMC4wNDc3LTAuMDM4M3pcIiBmaWxsPVwiIzBEMEMyMlwiLz5cbiA8cGF0aCBkPVwibTU1LjQ5MSAyNS42MjctMC4yNTctMS4yOTY3Yy0wLjIzMDctMS4xNjM0LTAuNzU0My0yLjI2MjctMS45NDg1LTIuNjgzMi0wLjM4MjctMC4xMzQ1LTAuODE3MS0wLjE5MjMtMS4xMTA2LTAuNDcwNy0wLjI5MzUtMC4yNzg1LTAuMzgwMi0wLjcxMDktMC40NDgxLTEuMTExOS0wLjEyNTctMC43MzYtMC4yNDM5LTEuNDcyNi0wLjM3MjctMi4yMDc0LTAuMTExMy0wLjYzMTYtMC4xOTkzLTEuMzQxMi0wLjQ4OS0xLjkyMDctMC4zNzcxLTAuNzc4Mi0xLjE1OTctMS4yMzMyLTEuOTM3OC0xLjUzNDMtMC4zOTg3LTAuMTQ4OC0wLjgwNTYtMC4yNzQ3LTEuMjE4Ny0wLjM3NzEtMS45NDQtMC41MTI5LTMuOTg4LTAuNzAxNC01Ljk4OC0wLjgwODktMi40MDA1LTAuMTMyNS00LjgwNzQtMC4wOTI2LTcuMjAyMiAwLjExOTQtMS43ODI1IDAuMTYyMi0zLjY1OTkgMC4zNTgzLTUuMzUzOCAwLjk3NDktMC42MTkxIDAuMjI1Ni0xLjI1NzEgMC40OTY1LTEuNzI3OCAwLjk3NDgtMC41Nzc3IDAuNTg3Ny0wLjc2NjIgMS40OTY1LTAuMzQ0NSAyLjIyOTQgMC4yOTk4IDAuNTIwNCAwLjgwNzcgMC44ODgxIDEuMzQ2MyAxLjEzMTMgMC43MDE2IDAuMzEzNCAxLjQzNDQgMC41NTE5IDIuMTg2IDAuNzExNSAyLjA5MyAwLjQ2MjYgNC4yNjA4IDAuNjQ0MyA2LjM5OTEgMC43MjE2IDIuMzY5OSAwLjA5NTYgNC43NDM3IDAuMDE4MSA3LjEwMjMtMC4yMzIgMC41ODMzLTAuMDY0MSAxLjE2NTUtMC4xNDEgMS43NDY3LTAuMjMwNiAwLjY4NDUtMC4xMDUgMS4xMjM4LTEgMC45MjItMS42MjM1LTAuMjQxMy0wLjc0NTQtMC44ODk5LTEuMDM0Ni0xLjYyMzQtMC45MjIxLTAuOTAzODcgMC4xNDM5Ni0xLjg1MzQgMC4yMTE0LTIuNjkwOCAwLjI4MzUtMS4xNTUyIDAuMDgwNS0yLjMxMzYgMC4xMTc1LTMuNDcxMyAwLjExOTQtMS4xMzc2IDAtMi4yNzU5LTAuMDMyLTMuNDExLTAuMTA2OC0xLjU2ODktMC4xMzkzNy0yLjkxMjUtMC4zMDYyLTQuMjgyMS0wLjYwMjgtMC4xNjg0NC0wLjE1MjczLTAuMTAxNDgtMC4yNzI1IDAuMTE5My0wLjMzOTQgMC41Njc2OC0wLjEyMjc3IDEuMTEyMi0wLjE5NzUgMS42Mzg2LTAuMjg2NmgwLjAwMzhjMC4yNTU4LTAuMDE3IDAuNTEyOS0wLjA2MjggMC43Njc0LTAuMDkzIDIuMjE0Ny0wLjIzMDQgNC40NDI2LTAuMzA4OSA2LjY2OC0wLjIzNTEgMi4xMzQ5IDAuMDU0NDUgMy45NTA4IDAuMjU4MTYgNS45MjM5IDAuNjIzNSAwLjc2MyAwLjE2NiAxLjc0MjkgMC4yMiAyLjA4MjMgMS4wNTU5IDAuMzQ0NzMgMS4yMjE3IDAuNTg4ODEgMi41NzEyIDAuODM3MiAzLjcyNzIgMC4wNzY3NSAwLjM2NTggMC4wMTE2OSAwLjQ2NTY1LTAuMzg3MiAwLjU1MjUtNy40ODUzIDEuMjU0LTE1LjA1MyAwLjU5OTQ5LTIxLjMwOC0wLjQxOC0wLjc2MzYtMC4xMjU3LTEuNDk0LTAuMDYyOC0yLjE4NDcgMC4zMTQzLTAuNTY3IDAuMzEwMi0xLjAyNTkgMC43ODYtMS4zMTU1IDEuMzYzOS0wLjI5NzkgMC42MTU5LTAuMzg2NiAxLjI4NjYtMC41MTk4IDEuOTQ4NC0wLjEzMzMgMC42NjE4LTAuMzQwNyAxLjM3NC0wLjI2MjEgMi4wNTM0IDAuMTY5MSAxLjQ2NjQgMS4xOTQyIDIuNjU4IDIuNjY4NyAyLjkyNDUgMS4zODcyIDAuMjUxNCAyLjc4MTkgMC40NTUxIDQuMTgwMyAwLjYyODYgNi4zOTc1IDAuNTg1MjkgMTIuMzMgMC42NzA4OCAxNy44OTkgMC4xMDMgMC44NDcyOC0wLjA2MDg0IDEuMTM0MSAwLjE4MzQ1IDEuMDQwOCAxLjAzMzMtMC44NjAxOCA4LjIwOTUtMS42MDE2IDE1Ljc3Mi0yLjM2MzIgMjMuMDUtMC4yMzg5IDEuMjM5NC0xLjA3OCAyLjAwMDYtMi4zMDIzIDIuMjc5LTEuMTIxNyAwLjI1NTMtMi4yNjc2IDAuMzg5My0zLjQxNzkgMC4zOTk4LTEuMjc1MyAwLjAwNjktMi41NS0wLjA0OTctMy44MjUzLTAuMDQyOC0xLjM2MTMgMC4wMDc2LTMuMDI4OC0wLjExODItNC4wNzk3LTEuMTMxMy0wLjkyMzMtMC44OS0xLjA1MDktMi4yODM1LTEuMTc2Ni0zLjQ4ODQtMC43MzQ4MS03LjA0NjQtMS40NTYyLTEzLjk3Ny0yLjA0OTYtMTkuNjc1LTAuMDcxNy0wLjY4NDUtMC41NTYzLTEuMzU0NS0xLjMyLTEuMzE5OS0wLjY1MzYgMC4wMjg5LTEuMzk2NSAwLjU4NDUtMS4zMTk5IDEuMzE5OSAwLjgxNDM4IDcuODEzMiAxLjU4MTIgMTUuMTkyIDIuMjkxIDIxLjk5MSAwLjI4NzMgMi42MTcxIDIuMjg2IDQuMDI3NiA0Ljc2MTEgNC40MjQ4IDEuNDQ1NiAwLjIzMjUgMi45MjY0IDAuMjgwMyA0LjM5MzQgMC4zMDQyIDEuODgwNiAwLjAzMDIgMy43OCAwLjEwMjQgNS42Mjk3LTAuMjM4MiAyLjc0MS0wLjUwMjggNC43OTc2LTIuMzMzMSA1LjA5MTEtNS4xNzIyIDAuOTA5ODMtOC44ODA0IDEuNTc3OC0xNS4zOTIgMi40MTE2LTIzLjUxOSAwLjA1MzQ1LTAuNjQ3NjMgMC4xMTQyNC0wLjcxNDU2IDAuNzU5My0wLjgyOSAwLjc4MzgtMC4xNTI4IDEuNTMzLTAuNDEzNiAyLjA5MDUtMS4wMTAxIDAuODg3NS0wLjk0OTcgMS4wNjQxLTIuMTg3OSAwLjc1MDQtMy40MzYxem0tMi44Nzc0IDEuNTAyOGMtMC4yODE1IDAuMjY3Ny0wLjcwNTggMC4zOTIyLTEuMTI1IDAuNDU0NC00LjcwMTQgMC42OTc3LTkuNDcxMyAxLjA1MDktMTQuMjI0IDAuODk1LTMuNDAxNi0wLjExNjMtNi43NjczLTAuNDk0LTEwLjEzNS0wLjk2OTgtMS4yOTM1LTAuMzIyMTQtMS4xMTk1LTEuMDcxNS0xLjAyMDctMi4yODcyIDAuMTAxOC0wLjUwNzggMC4yOTY3LTEuMTg0OCAwLjkwMDctMS4yNTcgMC45NDI4LTAuMTEwNyAyLjAzNzYgMC4yODcyIDIuOTcwNCAwLjQyODYgMS4xMjI5IDAuMTcxNCAyLjI1MDEgMC4zMDg2IDMuMzgxNSAwLjQxMTcgNC44MjgzIDAuNDQgOS43Mzc3IDAuMzcxNSAxNC41NDUtMC4yNzIyIDAuODc2MS0wLjExNzcgMS43NDkyLTAuMjU0NSAyLjYxOS0wLjQxMDQgMC43NzUtMC4xMzg5IDEuNjM0Mi0wLjM5OTcgMi4xMDI1IDAuNDAyOSAwLjMyMTEgMC41NDY4IDAuMzYzOSAxLjI3ODQgMC4zMTQyIDEuODk2My0wLjAxNTMgMC4yNjkyLTAuMTMyOSAwLjUyMjMtMC4zMjg3IDAuNzA3N3pcIiBmaWxsPVwiIzBEMEMyMlwiLz5cbiA8ZyBjbGlwLXJ1bGU9XCJldmVub2RkXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiPlxuICA8ZyBmaWxsPVwiIzBkMGMyM1wiPlxuICAgPHBhdGggZD1cIm04MS4xMyA0MC4xOTNjLTAuMjc0NiAwLjUyNC0wLjY1MjEgMC45ODAzLTEuMTMyNCAxLjM2NzUtMC40ODAzIDAuMzg3NS0xLjA0MDcgMC43MDI5LTEuNjgxMiAwLjk0NTgtMC42NDA1IDAuMjQzNS0xLjI4NTEgMC40MDY5LTEuOTMzMSAwLjQ5MDItMC42NDgzIDAuMDgzNS0xLjI3NzUgMC4wNzYzLTEuODg3Mi0wLjAyMjktMC42MS0wLjA5ODYtMS4xMjg5LTAuMjk5OC0xLjU1NTUtMC42MDRsMC40ODA2LTQuOTkxNmMwLjQ0MTktMC4xNTE4IDAuOTk4My0wLjMwNzYgMS42Njk1LTAuNDY3MiAwLjY3MS0wLjE1OTQgMS4zNjExLTAuMjczNiAyLjA3MDQtMC4zNDE4IDAuNzA5Mi0wLjA2ODYgMS4zNzk5LTAuMDYwNSAyLjAxMzEgMC4wMjI4IDAuNjMyNCAwLjA4MzYgMS4xMzIxIDAuMjg0OCAxLjQ5ODEgMC42MDQxIDAuMTk4MiAwLjE4MjIgMC4zNjYyIDAuMzc5NiAwLjUwMzUgMC41OTI1IDAuMTM3IDAuMjEyOCAwLjIyMDkgMC40MzMxIDAuMjUxNiAwLjY2MSAwLjA3NjEgMC42MzgyLTAuMDIyOSAxLjIxOTQtMC4yOTc0IDEuNzQzNnptLTYuOTc3Mi0xMC42MzNjMC4zMjA0LTAuMTk3NSAwLjcwNTUtMC4zNzI1IDEuMTU1My0wLjUyNDYgMC40NDk4LTAuMTUxNSAwLjkxMTItMC4yNTgyIDEuMzg0LTAuMzE4OSAwLjQ3MjUtMC4wNjA1IDAuOTMzOS0wLjA2ODYgMS4zODQtMC4wMjI5IDAuNDQ5NSAwLjA0NTcgMC44NDY1IDAuMTcwOSAxLjE4OTYgMC4zNzU5IDAuMzQzIDAuMjA1NCAwLjU5ODQgMC41MDE3IDAuNzY2MSAwLjg4ODkgMC4xNjc3IDAuMzg3OCAwLjIxMzYgMC44Nzc5IDAuMTM3MyAxLjQ3MDQtMC4wNjEgMC40NzExLTAuMjQ4MiAwLjg3MDEtMC41NjA0IDEuMTk2Ni0wLjMxMjYgMC4zMjctMC42OTQyIDAuNjAwMy0xLjE0MzcgMC44MjA2LTAuOTM2NDUgMC40NzYxNS0xLjkyNDQgMC42MjY2Ni0yLjg4MjQgMC44MDkxLTAuNjU2NjUgMC4xMDU1NC0xLjIzNDIgMC4xMDA0Ny0xLjg4NzIgMC4xMzY4em05LjQ0NzcgNy40MDc0Yy0wLjI0NDEtMC41MzE1LTAuNTcyLTAuOTk4Ny0wLjk4MzUtMS40MDE4LTAuNDExOC0wLjQwMjUtMC45MDAyLTAuNjk0OS0xLjQ2NDEtMC44NzczIDAuMjQzOC0wLjE5NzUgMC40ODQtMC41MDkgMC43MjA2LTAuOTM0NiAwLjIzNjItMC40MjUxIDAuNDM4Mi0wLjg4ODkgMC42MDU5LTEuMzkwMyAwLjE2NzgtMC41MDE3IDAuMjgyNC0xLjAwNjYgMC4zNDMzLTEuNTE1OCAwLjA2MDctMC41MDg5IDAuMDM3OC0wLjk0NTgtMC4wNjg1LTEuMzEwOC0wLjI1OTctMC45MTE0LTAuNjY3NC0xLjYyNTYtMS4yMjQxLTIuMTQyNC0wLjU1NjktMC41MTY0LTEuMjA0Ni0wLjg3MzUtMS45NDQzLTEuMDcxMy0wLjczOTgtMC4xOTY5LTEuNTU1Ni0wLjIzOTEtMi40NDc3LTAuMTI1MnMtMS44MDM2IDAuMzM4LTIuNzMzNCAwLjY3MjNjMC0wLjA3NTggMC4wMDc1LTAuMTU1NiAwLjAyMjktMC4yMzkyIDAuMDE0OC0wLjA4MzIgMC4wMjI2LTAuMTcwOCAwLjAyMjYtMC4yNjIyIDAtMC4yMjc5LTAuMTE0My0wLjQyNTEtMC4zNDMtMC41OTI1LTAuMjI4Ny0wLjE2NzItMC40OTE5LTAuMjY1OC0wLjc4OTEtMC4yOTY0LTAuMjk3NC0wLjAzMDEtMC41ODczIDAuMDM0MS0wLjg2OTQgMC4xOTM3LTAuMjgyNCAwLjE1OTYtMC40NzY4IDAuNDUyNi0wLjU4MzMgMC44NzczLTAuNTMyMTkgNi4xNzEyLTEuMDIwMSAxMS44MDYtMS41Nzg1IDE3LjQ4MiAwLjA0NTkgMC40MTAzIDAuMTYwMiAwLjcyOTYgMC4zNDMzIDAuOTU3NCAwLjE4MjkgMC4yMjgyIDAuMzk2NCAwLjM2NDkgMC42NDA1IDAuNDEwMyAwLjI0MzggMC4wNDU3IDAuNDk5NSAwLjAwMzUgMC43NjYyLTAuMTI1NSAwLjI2NjctMC4xMjg2IDAuNDk5NC0wLjM1MzMgMC42OTc5LTAuNjcyMyAwLjYwOTcgMC4zMzQzIDEuMjk2MSAwLjU1MDkgMi4wNTg4IDAuNjQ5OCAwLjc2MjMgMC4wOTg2IDEuNTM2IDAuMDk4NiAyLjMyMTkgMCAwLjc4NS0wLjA5ODkgMS41NTktMC4yODQ4IDIuMzIxNy0wLjU1ODcgMC43NjIzLTAuMjczMiAxLjQ1NjItMC42MTUzIDIuMDgxNi0xLjAyNTMgMC42MjUxLTAuNDEwNCAxLjE1MTMtMC44Nzc5IDEuNTc4NS0xLjQwMTkgMC40MjY5LTAuNTI0NSAwLjcwOS0xLjA5MDQgMC44NDYyLTEuNjk4IDAuMTM3My0wLjYyMzEgMC4xNzUzLTEuMjQ2IDAuMTE0NC0xLjg2OTEtMC4wNjEtMC42MjI5LTAuMjEzNi0xLjItMC40NTc0LTEuNzMyNHpcIi8+XG4gICA8cGF0aCBkPVwibTEwNS41NiA1MC41ODZjLTAuMTUzIDAuNTU0My0wLjMzMiAxLjA1OTgtMC41MzggMS41MTU4LTAuMjA1IDAuNDU1Ny0wLjQzNCAwLjgyMzgtMC42ODYgMS4xMDUyLTAuMjUyIDAuMjgxLTAuNTIyIDAuMzk5LTAuODEyIDAuMzUzNi0wLjIyOS0wLjAzMDktMC4zNzQtMC4xNzUyLTAuNDM0LTAuNDMzMi0wLjA2Mi0wLjI1ODgtMC4wNjItMC41Nzc3IDAtMC45NTc0IDAuMjQ3MTgtMS41MDMzIDAuNzI0NzgtMi40ODkyIDEuODUyLTQuMDY4NSAwLjMyMS0wLjQzMjkgMC42NTYtMC43OTQgMS4wMDctMS4wODI2IDAuMDc2IDAuMDkxMSAwLjExIDAuMzE4OSAwLjEwMyAwLjY4MzktMC4wMjQgMS4wMTA1LTAuMjgxMTQgMS45NzctMC40OTIgMi44ODMyem04LjEwOS0xMS40NzZjLTAuMjA2LTAuMjI3OC0wLjQ1Ny0wLjM1NjgtMC43NTUtMC4zODc0LTAuMjk3LTAuMDMwNC0wLjU5OCAwLjEzNjctMC45MDMgMC41MDE0LTAuNjE5ODEgMS4xMzk2LTEuNzE0NCAxLjk0NC0yLjY0MiAyLjY2NjYtMC4yOTggMC4xOTc4LTAuNTMgMC4zNDIxLTAuNjk4IDAuNDMzMi0wLjA2MS0wLjQ4NjEtMC4wOTYtMS4wMTAzLTAuMTAzLTEuNTcyOC0wLjA1MTEtMS40MzAyLTAuMDQ3OS0yLjY5ODYgMC4zMi00LjE5MzcgMC4xNDUtMC44MzU3IDAuMzU1LTEuNjU2MyAwLjYyOS0yLjQ2MTkgMC0wLjQyNTEtMC4wOTktMC43NzA5LTAuMjk3LTEuMDM2OS0wLjE5OS0wLjI2NTgtMC40MzktMC40MzMyLTAuNzIxLTAuNTAxNS0wLjI4Mi0wLjA2ODItMC41NzEtMC4wMzAzLTAuODY5IDAuMTE0LTAuMjk3IDAuMTQ0Ni0wLjU1MyAwLjQwNjgtMC43NjYgMC43ODYyLTAuNDM2NTMgMS4yNTQ3LTAuOTQyMDggMi40NTY0LTEuNDMgMy41OS0wLjU1OTY4IDEuMzMwMS0xLjE3NjkgMi40Njc3LTIuMTk2IDMuNDk4OC0wLjQzNSAwLjQ3MTEtMC45MDggMC44Mzk3LTEuNDE4IDEuMTA1NS0wLjUxMSAwLjI2Ni0xLjA2NCAwLjM4MzctMS42NTkgMC4zNTMzLTAuMjc0NC0wLjA3Ni0wLjQ3MjctMC4yODEtMC41OTQ1LTAuNjE1Ni0wLjEyMjItMC4zMzQtMC4xOTQ1LTAuNzUyMS0wLjIxNzEtMS4yNTM1LTAuMDIyOS0wLjUwMTQgMC0xLjA1MjMgMC4wNjg1LTEuNjUyNiAwLjEyNDY4LTEuMjE0NiAwLjE3Nzc4LTEuODUxIDAuNjUyMS0zLjQ3NTcgMC4xMzctMC41MzE4IDAuMjY2LTAuOTgwMyAwLjM4OS0xLjM0NDkgMC4xODMtMC40NDA0IDAuMTgzLTAuODA5MyAwLTEuMTA1NS0wLjE4My0wLjI5NjMtMC40MzUtMC40OTM2LTAuNzU1LTAuNTkyNy0wLjMyMDQtMC4wOTg2LTAuNjU2MS0wLjA5NDYtMS4wMDY3IDAuMDExNS0wLjM1MDkgMC4xMDY0LTAuNjAyNSAwLjM0MTgtMC43NTQ4IDAuNzA2NS0wLjI1OTUgMC42MjM0LTAuNDk2IDEuMzIyLTAuNzA5MyAyLjA5Ny0wLjIxMzYgMC43NzQ5LTAuMzg1MSAxLjU3NjgtMC41MTQ1IDIuNDA0Ni0wLjEzMDEgMC44Mjg1LTAuMjAyNiAxLjY0OTEtMC4yMTc3IDIuNDYyLTllLTQgMC4wNTI5IDAuMDAxNyAwLjEwMzIgMC4wMDE0IDAuMTU1OC0wLjMzMjUgMC44ODM0LTAuNjQ5NCAxLjU1MTEtMC45NTA0IDEuOTk3OC0wLjM4ODkgMC41Nzc4LTAuODI3NyAwLjgyODUtMS4zMTU1IDAuNzUyMS0wLjIxMzktMC4wOTEtMC4zNTQzLTAuMzAzNi0wLjQyMjgtMC42MzgxLTAuMDY5NC0wLjMzNC0wLjA5Mi0wLjc0NDMtMC4wNjk0LTEuMjMxIDAuMDIzNS0wLjQ4NTggMC4wODA3LTEuMDM2NiAwLjE3MTgtMS42NTIzIDAuMzM4MzEtMi4wNjU3IDAuNzgwNjgtMy44OTk1IDEuMTg5OS01LjgwMDgtMC4wMTU0LTAuNTMxOC0wLjE3MTgtMC45MzgxLTAuNDY5My0xLjIxOTQtMC4yOTcyLTAuMjgwOC0wLjcxMy0wLjM5MS0xLjI0NjQtMC4zMzA2LTAuMzY2IDAuMTUyMS0wLjYzNzEgMC4zNDk5LTAuODEyMyAwLjU5MjgtMC4xNzU2IDAuMjQyOS0wLjMxNjcgMC41NTQ2LTAuNDIzMiAwLjkzNDMtMC4wNjEyIDAuMTk3OC0wLjE1MjYgMC41OTI4LTAuMjc0NSAxLjE4NTYtMC4zMDc5MyAxLjU0NjEtMC43MzY3IDMuMDQxOC0xLjE0MzcgNC40NDQ0LTAuMjU5NSAwLjgzNTctMC41NDkxIDEuNTkyMS0wLjg2OTIgMi4yNjc5LTAuMzIwNCAwLjY3Ni0wLjY3MTIgMS4yMTk0LTEuMDUyMyAxLjYyOTctMC4zODEzIDAuNDEtMC43OTMxIDAuNTc3NS0xLjIzNTQgMC41MDE0LTAuMjQ0MS0wLjA0NTctMC40MDAyLTAuMjk2NC0wLjQ2ODctMC43NTIxLTAuMDY4OC0wLjQ1Ni0wLjA4MDEtMS4wMTc4LTAuMDM0NS0xLjY4NjcgMC4xNzU4LTIuMTYyMSAwLjY4NDM4LTQuMzk2OCAxLjA5ODEtNi4zNTkyIDAuMTIxOS0wLjU0NzEgMC4yMDU4LTAuOTExOCAwLjI1MTYtMS4wOTM5IDAtMC40NDA3LTAuMDk5NS0wLjc5MzgtMC4yOTc0LTEuMDYwMS0wLjE5ODUtMC4yNjU0LTAuNDM4NS0wLjQzMjktMC43MjA2LTAuNTAxNC0wLjI4MjQtMC4wNjgyLTAuNTcyLTAuMDMwNC0wLjg2OTIgMC4xMTM5LTAuMjk3NCAwLjE0NDYtMC41NTI4IDAuNDA2OS0wLjc2NjQgMC43ODYzLTAuMDc2MyAwLjQxMDMtMC4xNzU2IDAuODg1NC0wLjI5NzUgMS40MjQ3LTAuNTIyMjEgMi4xMzY4LTAuNzY2MzYgNC4wMzg0LTAuOTk0OCA1Ljk0ODktMC4wMzgzIDAuNDYzOC0wLjA1NzUgMC45NTM2LTAuMDU3NSAxLjQ3MDEgMCAwLjUxNyAwLjAzOCAxLjAyOTcgMC4xMTQ3IDEuNTM4NiAwLjA3NiAwLjUwOTIgMC4yMTMzIDAuOTc2NSAwLjQxMTUgMS40MDE2IDAuMTk4MiAwLjQyNTYgMC40NzY1IDAuNzc0OSAwLjgzNTIgMS4wNDg1IDAuMzU4MSAwLjI3MzUgMC44MTIgMC40MjUzIDEuMzYxMSAwLjQ1NiAwLjU2MzggMC4wMzAxIDEuMDU1Ny0wLjAxMTMgMS40NzU0LTAuMTI1NSAwLjQxOTMtMC4xMTM5IDAuODAwNC0wLjI5MjYgMS4xNDM3LTAuNTM1OCAwLjM0My0wLjI0MjYgMC42NTU2LTAuNTMxNSAwLjkzNzktMC44NjYxIDAuMjgxOC0wLjMzMzkgMC41NjA0LTAuNjk4NiAwLjgzNS0xLjA5MzkgMC4yNTkxIDAuNTc3OCAwLjU5NDYgMS4wMjU3IDEuMDA2NCAxLjM0NDkgMC40MTE4IDAuMzE5IDAuODQ2NiAwLjUwOTIgMS4zMDM5IDAuNTY5NyAwLjQ1NzQgMC4wNjA0IDAuOTIyOS0wLjAwMzUgMS4zOTU2LTAuMTkzOCAwLjQ3MjUtMC4xODk2IDAuODk5NC0wLjUxMjYgMS4yODEtMC45Njg3IDAuMjUxLTAuMjc5NiAwLjQ4NzktMC41OTc0IDAuNzEwMi0wLjk0ODcgMC4wOTQzIDAuMTY0NSAwLjE5NDcgMC4zMjMzIDAuMzA3NiAwLjQ2OTkgMC4zNzM4IDAuNDg2NyAwLjg4MSAwLjgyMDYgMS41MjE1IDEuMDAzMSAwLjY4NjEgMC4xODI1IDEuMzU2NSAwLjIxMzEgMi4wMTI1IDAuMDkxNCAwLjY1Ni0wLjEyMTUgMS4yODEtMC4zNDIxIDEuODc2LTAuNjYxIDAuNTk1LTAuMzE5MyAxLjE0OC0wLjcwMjcgMS42NTktMS4xNTEyIDAuNTEtMC40NDgyIDAuOTU2LTAuOTE1MiAxLjMzOC0xLjQwMTktMC4wMTkzIDAuNjg1NjMtMC4wMzQ1IDEuMzgyNi0wLjA0NiAyLjAwNi0wLjc2MyAwLjUzMi0xLjQ4MyAxLjE3MDItMi4xNjIgMS45MTQ1LTEuNDEyIDEuNDcyOS0yLjM5NTMgMy4wMDAzLTIuOTg1IDQuOTQ1OC0wLjI5IDAuODY2Ni0wLjQzMSAxLjY3NTQtMC40MjMgMi40Mjc4IDdlLTMgMC43NTIxIDAuMTg3IDEuNDA5MSAwLjUzNyAxLjk3MTIgMC4zNTEgMC41NjI1IDAuOTIzIDAuOTY1IDEuNzE2IDEuMjA4MiAwLjgyNCAwLjI1ODUgMS41NDggMC4yNjU3IDIuMTczIDAuMDIyOCAwLjYyNi0wLjI0MzIgMS4xNzEtMC42NDYgMS42MzYtMS4yMDgxczAuODQ2LTEuMjQyIDEuMTQ0LTIuMDM5OGMwLjI5Ny0wLjc5NzggMC41MzMtMS42Mjk3IDAuNzA5LTIuNDk1NyAwLjE3NS0wLjg2NjEgMC4yODYtMS43MTc2IDAuMzMxLTIuNTUyNyAwLjA0Ni0wLjgzNiAwLjA0Ni0xLjU4MDkgMC0yLjIzNDEgMS4zMTItMC41NDY4IDIuMzg3LTEuMjM4MiAzLjIyNi0yLjA3NDIgMC44MzktMC44MzUxIDEuNTMyLTEuNzE2NyAyLjA4MS0yLjY0MzggMC4xNjgtMC4yMjc4IDAuMjI1LTAuNTAxNCAwLjE3Mi0wLjgyMDMtMC4wNTMtMC4zMTkzLTAuMTgzLTAuNTkyOC0wLjM4OS0wLjgyMDd6XCIvPlxuICAgPHBhdGggZD1cIm0xNDIuNTMgMzcuNjUyYzAuMDQ1LTAuMzQ5MyAwLjExNC0wLjcxOCAwLjIwNS0xLjEwNTUgMC4wOTItMC4zODc1IDAuMjA2LTAuNzYzNyAwLjM0NC0xLjEyODMgMC4xMzctMC4zNjQ2IDAuMjk3LTAuNjc5OCAwLjQ4LTAuOTQ1OSAwLjE4My0wLjI2NTcgMC4zNzgtMC40NTU3IDAuNTgzLTAuNTY5OSAwLjIwNi0wLjExMzYgMC40MTYtMC4xMDI0IDAuNjI5IDAuMDM0MSAwLjIyOSAwLjEzNzEgMC4zNyAwLjQyNTcgMC40MjQgMC44NjYxIDAuMDUzIDAuNDQxMiAwIDAuOTEyLTAuMTYxIDEuNDEzNC0wLjE2IDAuNTAxNy0wLjQ0NiAwLjk3MjQtMC44NTcgMS40MTMxLTAuNDEyIDAuNDQxLTAuOTY5IDAuNzI5My0xLjY3IDAuODY2MS0wLjAzMS0wLjIxMjMtMC4wMjMtMC40OTM2IDAuMDIzLTAuODQzMnptNy45MjYgMC45MzQyYy0wLjI1Mi0wLjA3NTQtMC40OTItMC4wODMyLTAuNzIxLTAuMDIyNXMtMC4zNzQgMC4yMjAzLTAuNDM0IDAuNDc4OGMtMC4xMjMgMC40ODYxLTAuMzE3IDAuOTgzOC0wLjU4NCAxLjQ5MjctMC4yNjcgMC41MDkyLTAuNTk1IDAuOTkxNS0wLjk4MyAxLjQ0NzUtMC4zODkgMC40NTU4LTAuODI4IDAuODU4Ni0xLjMxNiAxLjIwNzktMC40ODggMC4zNDk2LTAuOTk5IDAuNjAwMy0xLjUzMiAwLjc1MjEtMC41MzUgMC4xNjc0LTAuOTc2IDAuMTg2Mi0xLjMyNyAwLjA1NjktMC4zNTEtMC4xMjg2LTAuNjI5LTAuMzQ5My0wLjgzNS0wLjY2MDdzLTAuMzU1LTAuNjg3Ni0wLjQ0Ni0xLjEyODNjLTAuMDkyLTAuNDQwNy0wLjE0NS0wLjg5NjQtMC4xNi0xLjM2NzcgMC44NjkgMC4wNjEgMS42NDMtMC4wOTQ2IDIuMzIyLTAuNDY3MyAwLjY3OC0wLjM3MTkgMS4yNTQtMC44NjYxIDEuNzI3LTEuNDgxNCAwLjQ3Mi0wLjYxNTMgMC44MzEtMS4zMDY3IDEuMDc1LTIuMDc0MiAwLjI0My0wLjc2NzEgMC4zODEtMS41MzA4IDAuNDExLTIuMjkwNyAwLjAxNi0wLjcxNDItMC4wOTEtMS4zMTgtMC4zMi0xLjgxMTktMC4yMjgtMC40OTM2LTAuNTM3LTAuODc3OS0wLjkyNi0xLjE1MTEtMC4zODktMC4yNzM2LTAuODM1LTAuNDMzMi0xLjMzOC0wLjQ3ODYtMC41MDMtMC4wNDU3LTEuMDE1IDAuMDIyOC0xLjUzMyAwLjIwNS0wLjYyNiAwLjIxMjgtMS4xNTUgMC41NTg0LTEuNTkgMS4wMzcyLTAuNDM0IDAuNDc4Ni0wLjc5NyAxLjAzMzUtMS4wODYgMS42NjM5LTAuMjkgMC42MzA2LTAuNTE5IDEuMzEwNS0wLjY4NyAyLjAzOTctMC4xNjggMC43Mjk2LTAuMjkgMS40NDc2LTAuMzY2IDIuMTU0My0wLjA2OCAwLjYzNDEtMC4xMDUgMS4yNDA1LTAuMTE4IDEuODI1Ny0wLjI1NDY4IDAuNjM1NTYtMC42NDAyNCAxLjI4MDYtMC45MjMgMS44MDk2LTAuMzEyIDAuNTE2OC0wLjY1OSAwLjk0OTktMS4wNCAxLjI5OTItMC4zODIgMC4zNDk2LTAuNzc4IDAuNDcxMS0xLjE5IDAuMzY0Ny0wLjI0NC0wLjA2MDUtMC4zNzctMC4zNDIxLTAuNC0wLjg0MzItMC4wMjMtMC41MDE3IDNlLTMgLTEuMTI0NiAwLjA4LTEuODY5MiAwLjIwOTA4LTEuNjg1MiAwLjM0NTEtMy4zMDA0IDAuNDEyLTQuOTAwNCAwLTAuNjgzOS0wLjEzLTEuMzQwOC0wLjM4OS0xLjk3MTgtMC4yNi0wLjYzMDEtMC42MTQtMS4xNTQ2LTEuMDY0LTEuNTcyNS0wLjQ1LTAuNDE4MS0wLjk3Mi0wLjY5NTQtMS41NjctMC44MzE5LTAuNTk1LTAuMTM3LTEuMjM1LTAuMDQ1Ny0xLjkyMSAwLjI3MzMtMC42ODcgMC4zMTkyLTEuMjMyIDAuNzY3NC0xLjYzNiAxLjM0NDktMC40MDQgMC41Nzc3LTAuNzc0IDEuMTg1Mi0xLjEwOSAxLjgyMzQtMC4xMjMtMC40ODYzLTAuMzAxLTAuOTM4LTAuNTM4LTEuMzU2MS0wLjIzNy0wLjQxNzktMC41MjYtMC43ODI1LTAuODY5LTEuMDk0Mi0wLjM0NC0wLjMxMTItMC43MjktMC41NTQ0LTEuMTU1LTAuNzI5My0wLjQyNy0wLjE3NDQtMC44NzgtMC4yNjItMS4zNS0wLjI2Mi0wLjQ1OCAwLTAuODgxIDAuMDg3Ni0xLjI3IDAuMjYyLTAuMzg5IDAuMTc0OS0wLjc0MyAwLjM5ODgtMS4wNjQgMC42NzIzLTAuMzIgMC4yNzM4LTAuNjA5IDAuNTgxMi0wLjg2OSAwLjkyMzMtMC4yNTkgMC4zNDE4LTAuNDg4IDAuNjgwMS0wLjY4NiAxLjAxNDEtMC4wMzEtMC4zOTUtMC4wNjUtMC43NDA2LTAuMTAzLTEuMDM3Mi0wLjAzOC0wLjI5NjEtMC4xMDctMC41NDY4LTAuMjA2LTAuNzUxOS0wLjA5OS0wLjIwNTMtMC4yNC0wLjM2MDgtMC40MjMtMC40NjcyLTAuMTgzLTAuMTA2Mi0wLjQ0Mi0wLjE1OTctMC43NzctMC4xNTk3LTAuMTY4IDAtMC4zMzYgMC4wMzQyLTAuNTA0IDAuMTAyNC0wLjE2OCAwLjA2ODUtMC4zMTcgMC4xNjM3LTAuNDQ2IDAuMjg1MS0wLjEzIDAuMTIyLTAuMjI5IDAuMjY5OC0wLjI5NyAwLjQ0NDUtMC4wNjkgMC4xNzQ2LTAuMDg4IDAuMzc2Mi0wLjA1OCAwLjYwNCAwLjAxNSAwLjE2NzQgMC4wNTggMC4zNjg0IDAuMTI2IDAuNjA0MSAwLjA2OSAwLjIzNTYgMC4xMzQgMC41NDM2IDAuMTk1IDAuOTIzIDAuMDYgMC4zNzk5IDAuMTEgMC44Mzk3IDAuMTQ4IDEuMzc5IDAuMTE0MDcgMS42MTktMC4wMjkyIDMuMjYzMy0wLjEzNyA0LjcyOTUtMC4wOTkgMS4wNDg1LTAuMjU2IDIuMjY0Mi0wLjQ2OSAzLjY0NjYtMC4wMyAwLjMxOTMgMC4wOTIgMC41Nzc4IDAuMzY2IDAuNzc1MyAwLjI3NSAwLjE5NzIgMC41ODcgMC4zMTExIDAuOTM4IDAuMzQxOCAwLjM1MSAwLjAzMDMgMC42ODMtMC4wMzA3IDAuOTk1LTAuMTgyMiAwLjMxMy0wLjE1MjQgMC40OTItMC40MTgxIDAuNTM4LTAuNzk3OCAwLjA5MzktMS42MzExIDAuNDI1NTYtMy4xODUyIDAuNzQzLTQuNjcyNiAwLjMxNzc0LTEuNDk3MSAwLjY5OTk0LTIuNzE4MyAxLjQ2NC00LjE0ODMgMC4yOTgtMC41NDcxIDAuNjA2LTAuOTgzNyAwLjkyNy0xLjMxMDUgMC4zMi0wLjMyNjcgMC42NTUtMC40OTAxIDEuMDA2LTAuNDkwMSAwLjQyNyAwIDAuNzU5IDAuMTkzNSAwLjk5NSAwLjU4MDkgMC4yMzYgMC4zODc4IDAuNDA0IDAuODg1NyAwLjUwNCAxLjQ5MyAwLjA5OSAwLjYwODEgMC4xNDQgMS4yNzMyIDAuMTM3IDEuOTk0Ni04LjRlLTQgMS4zNDM3LTAuMTM5NjMgMi42MDY3LTAuMjc1IDMuODc0OC0wLjA2OCAwLjUyNDItMC4xMTggMC44ODU0LTAuMTQ4IDEuMDgyNiAwIDAuMzQ5NiAwLjEzMyAwLjYyNjYgMC40IDAuODMxOSAwLjI2NiAwLjIwNSAwLjU2NCAwLjMyNjggMC44OTIgMC4zNjQ3IDAuMzI4IDAuMDM4MSAwLjYzNy0wLjAyMjkgMC45MjYtMC4xODI1IDAuMjktMC4xNTk2IDAuNDU4LTAuNDI4OCAwLjUwNC0wLjgwOTEgMC4xNTItMS4wOTM5IDAuMzYyLTIuMTkxNSAwLjYyOS0zLjI5MzIgMC4yNjYtMS4xMDE3IDAuNTcyLTIuMDg5MiAwLjkxNS0yLjk2MzEgMC4zNDMtMC44NzM4IDAuNzI0LTEuNTg4MSAxLjE0NC0yLjE0MjcgMC40MTktMC41NTQzIDAuODY1LTAuODMxOSAxLjMzOC0wLjgzMTkgMC4yNDMgMCAwLjQzMSAwLjE2NzQgMC41NiAwLjUwMTQgMC4xMyAwLjMzNDMgMC4xOTUgMC43OSAwLjE5NSAxLjM2NzUtOWUtNCAwLjk0MDAzLTAuMTk0NTggMS44NDkzLTAuMzQzIDIuNzAxLTAuMDkyIDAuNDc4OS0wLjE3MiAwLjk2ODctMC4yNDEgMS40NzAxLTAuMTc1NTMgMS4wMS0wLjE4ODc0IDEuOTM0NCAwLjAxMiAyLjg5NDggMC4wNzYgMC41MDExIDAuMjIxIDAuOTc2NSAwLjQzNCAxLjQyNDQgMC4yMTQgMC40NDg1IDAuNTA3IDAuODI4MiAwLjg4MSAxLjEzOTYgMC4zNzQgMC4zMTE1IDAuODUgMC40NjczIDEuNDMgMC40NjczIDAuODY5IDAgMS42MzktMC4xODYyIDIuMzEtMC41NTg0IDAuNzc5OTgtMC40MDQ1MiAxLjI4MTktMS4wNDQ5IDEuNzk5LTEuNTU0OCAwLjI1NDI4IDAuNzkyMDcgMC45NjM0NyAxLjM2NjMgMS40NSAxLjgxNzEgMC41NjMgMC4zNjQ2IDEuMjI3IDAuNTY1OSAxLjk5IDAuNjA0MSAwLjc2MiAwLjAzNzYgMS41OTMtMC4xMDMgMi40OTMtMC40MjE5IDAuNjcxLTAuMjQzMiAxLjI1NC0wLjU0NzEgMS43NS0wLjkxMTcgMC40OTUtMC4zNjQ3IDAuOTQxLTAuODA5MSAxLjMzOC0xLjMzMzQgMC4zOTctMC41MjQyIDAuNzU5LTEuMTI4MyAxLjA4Ny0xLjgxMTkgMC4zMjgtMC42ODQxIDAuNjU5LTEuNDY2MyAwLjk5NS0yLjM0OCAwLjA2MS0wLjI0MjYgNGUtMyAtMC40NTkxLTAuMTcxLTAuNjQ5NC0wLjE3Ni0wLjE4OTctMC4zODktMC4zMjI3LTAuNjQxLTAuMzk5MXpcIi8+XG4gIDwvZz5cbiAgPHBhdGggZD1cIm0xNjIuODkgMzYuMDQzYy0wLjA3NyAwLjQ0ODQtMC4xOCAwLjk0MjYtMC4zMDkgMS40ODE2LTAuMTMgMC41Mzk2LTAuMjk0IDEuMDk4LTAuNDkyIDEuNjc1NC0wLjE5OCAwLjU3NzUtMC40NDIgMS4wOTgtMC43MzIgMS41NjEyLTAuMjkgMC40NjM4LTAuNjIxIDAuODMxOS0wLjk5NSAxLjEwNTUtMC4zNzQgMC4yNzM1LTAuODA0IDAuMzg3NS0xLjI5MyAwLjM0MTgtMC4yNDQtMC4wMzAxLTAuNDMxLTAuMTk3Mi0wLjU2LTAuNTAxNC0wLjEzLTAuMzAzNy0wLjE5OC0wLjY5MTQtMC4yMDYtMS4xNjI1LThlLTMgLTAuNDcwNyAwLjAzNC0wLjk4NzUgMC4xMjYtMS41NDk5IDAuMDkxLTAuNTYxOCAwLjIzMi0xLjExMyAwLjQyMy0xLjY1MjUgMC4xOTEtMC41MzkgMC40MjMtMS4wMzcgMC42OTgtMS40OTMgMC4yNzQtMC40NTU3IDAuNTkxLTAuODA5MSAwLjk0OS0xLjA1OThzMC43NTEtMC4zNjgxIDEuMTc4LTAuMzUzM2MwLjQyNyAwLjAxNTMgMC44ODUgMC4yMjc4IDEuMzczIDAuNjM4Mi0wLjAzMSAwLjE5NzgtMC4wODQgMC41MjA3LTAuMTYgMC45Njg3em04LjEzMiAxLjc0MzZjLTAuMjM3LTAuMTIxNC0wLjQ4MS0wLjE0NzgtMC43MzItMC4wNzk1LTAuMjUyIDAuMDY4Mi0wLjQzMSAwLjMwMDEtMC41MzggMC42OTUxLTAuMDYxIDAuNDI1Ny0wLjE5OCAwLjkyNjgtMC40MTEgMS41MDQzLTAuMjE0IDAuNTc3NC0wLjQ3NyAxLjEyNDgtMC43OSAxLjY0MDktMC4zMTIgMC41MTY4LTAuNjcxIDAuOTQ2Mi0xLjA3NSAxLjI4OC0wLjQwNCAwLjM0Mi0wLjgzNSAwLjQ5NzktMS4yOTIgMC40NjctMC4zODItMC4wMzAxLTAuNjQ5LTAuMjIzOC0wLjgwMS0wLjU4MS0wLjE1My0wLjM1NzEtMC4yMzMtMC44MDUtMC4yNC0xLjM0NDktOGUtMyAtMC41Mzg5IDAuMDQ2LTEuMTQ2OCAwLjE2LTEuODIzMSAwLjExNC0wLjY3NjEgMC4yNTItMS4zNDg0IDAuNDEyLTIuMDE3NSAwLjE2LTAuNjY4MyAwLjMyNC0xLjMxMDUgMC40OTItMS45MjU4IDAuMTY3LTAuNjE1NCAwLjMwNC0xLjEzNTggMC40MTItMS41NjEyIDAuMTIyLTAuMzggMC4wODMtMC43MDI3LTAuMTE1LTAuOTY5LTAuMTk4LTAuMjY1NC0wLjQ0Ni0wLjQ1NTctMC43NDMtMC41Njk2LTAuMjk4LTAuMTE0LTAuNTk5LTAuMTQ0My0wLjkwNC0wLjA5MTFzLTAuNTAzIDAuMjE2Ni0wLjU5NSAwLjQ4OThjLTAuOS0wLjc3NDktMS43NjUtMS4xOTI4LTIuNTk2LTEuMjUzNS0wLjgzMi0wLjA2MDctMS41OTggMC4xMjE3LTIuMjk5IDAuNTQ3MS0wLjcwMiAwLjQyNTQtMS4zMjMgMS4wNDA3LTEuODY0IDEuODQ2My0wLjU0MiAwLjgwNTYtMC45OCAxLjY4MjktMS4zMTYgMi42MzI1LTAuMzM1IDAuOTQ5Ni0wLjU0NSAxLjkxODYtMC42MjkgMi45MDYxLTAuMDg0IDAuOTg3OC0wLjAxOSAxLjg4ODIgMC4xOTUgMi43MDExIDAuMjEzIDAuODEyOCAwLjU5IDEuNDc3OSAxLjEzMiAxLjk5NCAwLjU0MSAwLjUxNjggMS4yNzcgMC43NzUzIDIuMjA3IDAuNzc1MyAwLjQxMiAwIDAuODA5LTAuMDgzNiAxLjE5LTAuMjUwNyAwLjM4MS0wLjE2NzUgMC43MzItMC4zNjUgMS4wNTItMC41OTI4IDAuMzItMC4yMjc5IDAuNjAyLTAuNDY3MyAwLjg0Ny0wLjcxOCAwLjI0My0wLjI1MDcgMC40MzQtMC40NTk1IDAuNTcxLTAuNjI2OSAwLjEwNyAwLjU0NzEgMC4yODMgMS4wMTA5IDAuNTI3IDEuMzkwNiAwLjI0MyAwLjM3OTYgMC41MjIgMC42OTE2IDAuODM1IDAuOTM0MyAwLjMxMiAwLjI0MjggMC42NCAwLjQyMTYgMC45ODMgMC41MzU4IDAuMzQzIDAuMTEzOSAwLjY3NSAwLjE3MDkgMC45OTUgMC4xNzA5IDAuNzE3IDAgMS4zODgtMC4yNDMyIDIuMDEzLTAuNzI5NiAwLjYyNS0wLjQ4NTggMS4xODYtMS4wODI2IDEuNjgyLTEuNzg5IDAuNDk1LTAuNzA2NyAwLjkwMy0xLjQ1MSAxLjIyMy0yLjIzMzggMC4zMjEtMC43ODI1IDAuNTM0LTEuNDc3NiAwLjY0MS0yLjA4NTcgMC4xMDctMC4yMjc5IDAuMDg3LTAuNDY3LTAuMDU3LTAuNzE3Ny0wLjE0NS0wLjI1MDctMC4zMzYtMC40MzY3LTAuNTcyLTAuNTU4N3pcIiBmaWxsPVwiIzBEMEMyM1wiLz5cbiAgPHBhdGggZD1cIm0yMTIuMTkgNTAuMzdjLTAuMTMgMC41MTY1LTAuMzMyIDAuOTUzNy0wLjYwNyAxLjMxMDUtMC4yNzQgMC4zNTcxLTAuNjE3IDAuNTQzMy0xLjAyOSAwLjU1ODctMC4yNTkgMC4wMTUtMC40NTctMC4xMjE4LTAuNTk1LTAuNDEwNC0wLjEzNy0wLjI4ODgtMC4yMzItMC42NjEtMC4yODUtMS4xMTY3LTAuMDU0LTAuNDU2LTAuMDc3LTAuOTY1Mi0wLjA2OS0xLjUyNzMgN2UtMyAtMC41NjIyIDAuMDMtMS4xMTY4IDAuMDY5LTEuNjYzOSAwLjAzNy0wLjU0NjggMC4wODMtMS4wNTYzIDAuMTM3LTEuNTI3MSAwLjA1My0wLjQ3MTMgMC4wOTUtMC44MzUzIDAuMTI1LTEuMDkzOSAwLjUxOSAwLjA2MDggMC45NSAwLjI4NDYgMS4yOTMgMC42NzIzIDAuMzQzIDAuMzg3NSAwLjYwNiAwLjg0NyAwLjc4OSAxLjM3OTEgMC4xODMgMC41MzE3IDAuMjkgMS4xMDU0IDAuMzIxIDEuNzIwOCAwLjAzIDAuNjE1My0wLjAyIDEuMTgxMi0wLjE0OSAxLjY5Nzl6bS04LjI4MSAwYy0wLjEzIDAuNTE2NS0wLjMzMiAwLjk1MzctMC42MDYgMS4zMTA1LTAuMjc1IDAuMzU3MS0wLjYxOCAwLjU0MzMtMS4wMyAwLjU1ODctMC4yNTkgMC4wMTUtMC40NTctMC4xMjE4LTAuNTk0LTAuNDEwNC0wLjEzOC0wLjI4ODgtMC4yMzMtMC42NjEtMC4yODYtMS4xMTY3LTAuMDU0LTAuNDU2LTAuMDc3LTAuOTY1Mi0wLjA2OS0xLjUyNzMgOGUtMyAtMC41NjIyIDAuMDMtMS4xMTY4IDAuMDY5LTEuNjYzOSAwLjAzNy0wLjU0NjggMC4wODMtMS4wNTYzIDAuMTM3LTEuNTI3MSAwLjA1My0wLjQ3MTMgMC4wOTUtMC44MzUzIDAuMTI2LTEuMDkzOSAwLjUxOCAwLjA2MDggMC45NDkgMC4yODQ2IDEuMjkyIDAuNjcyMyAwLjM0MyAwLjM4NzUgMC42MDYgMC44NDcgMC43ODkgMS4zNzkxIDAuMTgzIDAuNTMxNyAwLjI5IDEuMTA1NCAwLjMyMSAxLjcyMDggMC4wMyAwLjYxNTMtMC4wMiAxLjE4MTItMC4xNDkgMS42OTc5em0tOC40OTgtMTIuOTQ2Yy0wLjAxNiAwLjM2NDMtMC4wNSAwLjY4NzMtMC4xMDMgMC45Njg0LTAuMDU0IDAuMjgxNi0wLjEyNiAwLjQ1OTctMC4yMTcgMC41MzU4LTAuMTY4LTAuMDkxNC0wLjM3NC0wLjMyNjUtMC42MTgtMC43MDY3LTAuMjQ0LTAuMzc5Ny0wLjQzNS0wLjgwOTQtMC41NzItMS4yODgtMC4xMzctMC40Nzg1LTAuMTgtMC45NDkzLTAuMTI2LTEuNDEzMSAwLjA1My0wLjQ2MzIgMC4yOTQtMC44MjM4IDAuNzIxLTEuMDgyNiAwLjE2Ny0wLjA5MTEgMC4zMTItMC4wNTcgMC40MzQgMC4xMDI2czAuMjIxIDAuMzkxMyAwLjI5OCAwLjY5NTJjMC4wNzYgMC4zMDQyIDAuMTI5IDAuNjUzNSAwLjE2IDEuMDQ4NSAwLjAzIDAuMzk1MyAwLjAzOCAwLjc3NDkgMC4wMjMgMS4xMzk5em0tMi4wMjUgNC41NDdjLTAuMjM2IDAuMjUwNC0wLjUgMC40NjctMC43ODkgMC42NDk1LTAuMjkgMC4xODI0LTAuNTg3IDAuMzE5Mi0wLjg5MiAwLjQxMDMtMC4zMDUgMC4wOTE0LTAuNTggMC4xMTM5LTAuODI0IDAuMDY4Mi0wLjY4Ni0wLjEzNjQtMS4yMTItMC40MzMxLTEuNTc4LTAuODg4OC0wLjM2Ni0wLjQ1NTgtMC41OTktMC45OTEzLTAuNjk4LTEuNjA2Ni0wLjA5OS0wLjYxNTYtMC4wODgtMS4yNzI5IDAuMDM1LTEuOTcxOCAwLjEyMS0wLjY5ODkgMC4zMjctMS4zNDg0IDAuNjE3LTEuOTQ4N3MwLjY0MS0xLjExNyAxLjA1Mi0xLjU0OTljMC40MTItMC40MzMyIDAuODYyLTAuNzAyNyAxLjM1LTAuODA5NC0wLjE4MyAwLjc3NS0wLjI0NCAxLjU3NjgtMC4xODMgMi40MDQ3IDAuMDYxIDAuODI4MiAwLjI1OSAxLjYwNjkgMC41OTUgMi4zMzYyIDAuMjEzIDAuNDQxMiAwLjQ2OSAwLjg0MzQgMC43NjYgMS4yMDgxIDAuMjk4IDAuMzY0OSAwLjY2IDAuNjc2MyAxLjA4NyAwLjkzNDYtMC4xMjIgMC4yNTg1LTAuMzAyIDAuNTEyOS0wLjUzOCAwLjc2MzZ6bTI1LjMxMi00LjMxOTJjMC4wNDUtMC4zNDkzIDAuMTE0LTAuNzE4MyAwLjIwNi0xLjEwNTcgMC4wOTEtMC4zODcyIDAuMjA2LTAuNzYzNCAwLjM0My0xLjEyODEgMC4xMzctMC4zNjQ5IDAuMjk3LTAuNjgwMSAwLjQ4LTAuOTQ1OCAwLjE4My0wLjI2NTggMC4zNzctMC40NTYgMC41ODMtMC41Njk5IDAuMjA2LTAuMTE0IDAuNDE2LTAuMTAyNyAwLjYyOSAwLjAzNDEgMC4yMjkgMC4xMzcgMC4zNyAwLjQyNTYgMC40MjQgMC44NjYgMC4wNTMgMC40NDEgMCAwLjkxMTctMC4xNiAxLjQxMzQtMC4xNjEgMC41MDE0LTAuNDQ2IDAuOTcyNS0wLjg1OCAxLjQxMjktMC40MTIgMC40NDEyLTAuOTY5IDAuNzI5NS0xLjY3IDAuODY2My0wLjAzMS0wLjIxMjUtMC4wMjMtMC40OTM2IDAuMDIzLTAuODQzMnptOS4yMTkgMGMwLjA0NS0wLjM0OTMgMC4xMTQtMC43MTgzIDAuMjA1LTEuMTA1NyAwLjA5Mi0wLjM4NzIgMC4yMDYtMC43NjM0IDAuMzQ0LTEuMTI4MSAwLjEzNy0wLjM2NDkgMC4yOTctMC42ODAxIDAuNDgtMC45NDU4IDAuMTgzLTAuMjY1OCAwLjM3OC0wLjQ1NiAwLjU4My0wLjU2OTkgMC4yMDYtMC4xMTQgMC40MTYtMC4xMDI3IDAuNjI5IDAuMDM0MSAwLjIyOSAwLjEzNyAwLjM3IDAuNDI1NiAwLjQyNCAwLjg2NiAwLjA1MyAwLjQ0MSAwIDAuOTExNy0wLjE2MSAxLjQxMzQtMC4xNiAwLjUwMTQtMC40NDYgMC45NzI1LTAuODU3IDEuNDEyOS0wLjQxMiAwLjQ0MTItMC45NjkgMC43Mjk1LTEuNjcgMC44NjYzLTAuMDMxLTAuMjEyNS0wLjAyMy0wLjQ5MzYgMC4wMjMtMC44NDMyem04LjU2NyAxLjMzMzNjLTAuMTc2LTAuMTg5Ny0wLjM4OS0wLjMyMjctMC42NDEtMC4zOTktMC4yNTItMC4wNzU4LTAuNDkyLTAuMDgzMy0wLjcyMS0wLjAyMjYtMC4yMjkgMC4wNjA4LTAuMzc0IDAuMjIwNC0wLjQzNCAwLjQ3ODYtMC4xMjIgMC40ODY0LTAuMzE3IDAuOTg0LTAuNTg0IDEuNDkyNy0wLjI2NyAwLjUwOTUtMC41OTQgMC45OTE4LTAuOTgzIDEuNDQ3NXMtMC44MjggMC44NTg4LTEuMzE1IDEuMjA4MWMtMC40ODkgMC4zNDk2LTEgMC42MDAzLTEuNTMzIDAuNzUxOC0wLjUzNCAwLjE2NzgtMC45NzYgMC4xODY2LTEuMzI3IDAuMDU3My0wLjM1MS0wLjEyOS0wLjYyOS0wLjM0OTMtMC44MzUtMC42NjA3LTAuMjA2LTAuMzExOC0wLjM1NC0wLjY4NzctMC40NDYtMS4xMjg2LTAuMDkxLTAuNDQwNC0wLjE0NS0wLjg5NjEtMC4xNi0xLjM2NzUgMC44NjkgMC4wNjEgMS42NDMtMC4wOTQ1IDIuMzIyLTAuNDY3MyAwLjY3OC0wLjM3MjEgMS4yNTQtMC44NjYzIDEuNzI3LTEuNDgxNiAwLjQ3My0wLjYxNTEgMC44MzEtMS4zMDY1IDEuMDc1LTIuMDczOXMwLjM4MS0xLjUzMDggMC40MTItMi4yOTA3YzAuMDE1LTAuNzE0My0wLjA5Mi0xLjMxODMtMC4zMjEtMS44MTIyLTAuMjI4LTAuNDkzNi0wLjUzNy0wLjg3NzYtMC45MjYtMS4xNTA5LTAuMzg5LTAuMjczOC0wLjgzNS0wLjQzMzItMS4zMzgtMC40Nzg4LTAuNTAzLTAuMDQ1Ny0xLjAxNSAwLjAyMzEtMS41MzMgMC4yMDUtMC42MjUgMC4yMTMxLTEuMTU1IDAuNTU4Ni0xLjU4OSAxLjAzNzItMC40MzUgMC40Nzg5LTAuNzk4IDEuMDMzOC0xLjA4NyAxLjY2MzgtMC4yOSAwLjYzMS0wLjUxOSAxLjMxMDUtMC42ODcgMi4wNDAxLTAuMTY4IDAuNzI5Mi0wLjI5IDEuNDQ3NS0wLjM2NSAyLjE1MzktMC4wNzUgMC42ODU2LTAuMTE1IDEuMzQxOC0wLjEyNCAxLjk2OTgtMC4yODIxMyAwLjY3ODYtMC43OTg0OCAxLjMwMTItMS4xNjkgMS44MjUyLTAuMzg5IDAuNDU1Ny0wLjgyOCAwLjg1ODgtMS4zMTUgMS4yMDgxLTAuNDg5IDAuMzQ5Ni0wLjk5OSAwLjYwMDMtMS41MzMgMC43NTE4LTAuNTM0IDAuMTY3OC0wLjk3NiAwLjE4NjYtMS4zMjcgMC4wNTczLTAuMzUxLTAuMTI5LTAuNjI5LTAuMzQ5My0wLjgzNS0wLjY2MDctMC4yMDUtMC4zMTE4LTAuMzU0LTAuNjg3Ny0wLjQ0Ni0xLjEyODYtMC4wOTEtMC40NDA0LTAuMTQ1LTAuODk2MS0wLjE2LTEuMzY3NSAwLjg2OSAwLjA2MSAxLjY0My0wLjA5NDUgMi4zMjItMC40NjczIDAuNjc4LTAuMzcyMSAxLjI1NC0wLjg2NjMgMS43MjctMS40ODE2IDAuNDcyLTAuNjE1MSAwLjgzMS0xLjMwNjUgMS4wNzUtMi4wNzM5czAuMzgxLTEuNTMwOCAwLjQxMi0yLjI5MDdjMC4wMTUtMC43MTQzLTAuMDkyLTEuMzE4My0wLjMyLTEuODEyMi0wLjIyOS0wLjQ5MzYtMC41MzgtMC44Nzc2LTAuOTI3LTEuMTUwOS0wLjM4OS0wLjI3MzgtMC44MzUtMC40MzMyLTEuMzM4LTAuNDc4OC0wLjUwMy0wLjA0NTctMS4wMTQgMC4wMjMxLTEuNTMzIDAuMjA1LTAuNjI1IDAuMjEzMS0xLjE1NSAwLjU1ODYtMS41ODkgMS4wMzcyLTAuNDM1IDAuNDc4OS0wLjc5OCAxLjAzMzgtMS4wODcgMS42NjM4LTAuMjkgMC42MzEtMC41MTkgMS4zMTA1LTAuNjg2IDIuMDQwMS0wLjE2OCAwLjcyOTItMC4yOSAxLjQ0NzUtMC4zNjYgMi4xNTM5LTAuMDQ0IDAuMzk4NS0wLjA3MyAwLjc4NDgtMC4wOTQgMS4xNjQyLTAuNjQyNTEgMC41OTAwNC0xLjQ1MjcgMS4wOTE1LTIuMTAyIDEuNTI1My0wLjU4IDAuMzQyMS0xLjE4MyAwLjYyMzItMS44MDcgMC44NDM1LTAuNjI2IDAuMjIwNC0xLjI2NyAwLjM1MzQtMS45MjIgMC4zOTg4bDEuNDE4LTE1LjEzNGMwLjA5Mi0wLjMxOTIgMC4wNDYtMC42LTAuMTM3LTAuODQzMnMtMC40Mi0wLjQxMDMtMC43MDktMC41MDE0Yy0wLjI5LTAuMDkxMy0wLjU5OS0wLjA4MzUtMC45MjcgMC4wMjI2LTAuMzI4IDAuMTA2Ny0wLjU5OCAwLjM0OTktMC44MTIgMC43MjkyLTAuNjI0MDUgNC4yMTctMS4wMDA0IDkuMDAwNS0xLjMxNSAxMi44NTUtNGUtMyAwLjA0ODYtN2UtMyAwLjA5MjYtMC4wMTEgMC4xNDA2LTAuMTMzIDAuMTEyNy0wLjI2MyAwLjIyNjQtMC40MDEgMC4zMzgtMC41MjYgMC40MjU2LTEuMDc5IDAuODA5MS0xLjY1OCAxLjE1MTEtMC41OCAwLjM0MjEtMS4xODIgMC42MjMyLTEuODA3IDAuODQzNS0wLjYyNiAwLjIyMDQtMS4yNjcgMC4zNTM0LTEuOTIyIDAuMzk4OGwxLjQxOC0xNS4xMzRjMC4wOTItMC4zMTkyIDAuMDQ2LTAuNi0wLjEzNy0wLjg0MzJzLTAuNDItMC40MTAzLTAuNzA5LTAuNTAxNGMtMC4yOS0wLjA5MTMtMC41OTktMC4wODM1LTAuOTI3IDAuMDIyNi0wLjMyOCAwLjEwNjctMC41OTggMC4zNDk5LTAuODEyIDAuNzI5Mi0wLjYyMzMyIDQuMjE3MS0xLjAwMDQgOS4wMDA1LTEuMzE1IDEyLjg1NS0yZS0zIDAuMDIyLTNlLTMgMC4wNDE5LTVlLTMgMC4wNjM5LTAuMjM5IDAuMTEwOC0wLjUwMSAwLjIwNzktMC43ODQgMC4yODk1LTAuMjkgMC4wODM4LTAuNjE4IDAuMTMzMy0wLjk4NCAwLjE0ODMgMC4wNjEtMC4yNzM4IDAuMTExLTAuNTc3NyAwLjE0OS0wLjkxMiAwLjEwNDY1LTAuNzMyOTMgMC4wOTM5LTEuNDU1MyAwLjExNC0yLjE0MjQtOGUtMyAtMC4zNjQ5LTAuMDI3LTAuNjk4OS0wLjA1Ny0xLjAwMzEtMC4wNzYtMC42NTI5LTAuMjE3LTEuMjcyMy0wLjQyMy0xLjg1NzYtMC4yMDYtMC41ODQ3LTAuNDg0LTEuMDc0NS0wLjgzNS0xLjQ3MDEtMC4zNTEtMC4zOTUtMC43ODktMC42NjEtMS4zMTYtMC43OTc1LTAuNTI1LTAuMTM2OC0xLjEzOS0wLjA5MTQtMS44NDEgMC4xMzY1LTEuMDM3LTAuMTM2NS0xLjk3MS0wLjA0MTQtMi44MDIgMC4yODUxLTAuODMxIDAuMzI3MS0xLjU1MiAwLjgwMTYtMi4xNjIgMS40MjQ0LTAuNjEgMC42MjM1LTEuMTA5IDEuMzU2Mi0xLjQ5OCAyLjE5OTctMC4zODkgMC44NDMyLTAuNjQ4IDEuNzA5NS0wLjc3OCAyLjU5ODEtMC4wNTUgMC4zNzY4LTAuMDgyIDAuNzUxOC0wLjA5IDEuMTI2LTAuMjM2IDAuNDgxNy0wLjQ5NCAwLjkwMjgtMC43NzkgMS4yNTYxLTAuNDA0IDAuNTAxNC0wLjgyNCAwLjkxMTctMS4yNTggMS4yMzA3LTAuNDM1IDAuMzE5Mi0wLjg2NiAwLjU2MjQtMS4yOTMgMC43Mjk1LTAuNDI3IDAuMTY3NS0wLjgwOCAwLjI4MTQtMS4xNDMgMC4zNDE4LTAuMzk3IDAuMDc2MS0wLjc3OCAwLjA4MzktMS4xNDQgMC4wMjI5LTAuMzY2LTAuMDYwNS0wLjcwMi0wLjIzNTQtMS4wMDYtMC41MjQzLTAuMjQ1LTAuMjEyNS0wLjQzMi0wLjU1NDYtMC41NjEtMS4wMjU2LTAuMTMtMC40NzExLTAuMjA2LTEuMDA2My0wLjIyOS0xLjYwNjktMC4wMjMtMC42MDAzIDAtMS4yMjcyIDAuMDY5LTEuODgwNHMwLjE4Ni0xLjI3MjYgMC4zNTQtMS44NTc2IDAuMzgxLTEuMTA5MiAwLjY0MS0xLjU3M2MwLjI1OS0wLjQ2MyAwLjU2NC0wLjc5MzggMC45MTUtMC45OTEzIDAuMTk4IDAuMDMwNyAwLjMyIDAuMTQ4MSAwLjM2NiAwLjM1MzEgMC4wNDYgMC4yMDUzIDAuMDU3IDAuNDQ4NSAwLjAzNCAwLjcyOTUtMC4wMjMgMC4yODE0LTAuMDU3IDAuNTctMC4xMDMgMC44NjYxLTAuMDQ2IDAuMjk2NC0wLjA2OCAwLjU0MzYtMC4wNjggMC43NDA4IDAuMDc2IDAuNDEwMyAwLjIyNCAwLjcyOTYgMC40NDYgMC45NTc0IDAuMjIgMC4yMjc5IDAuNDY5IDAuMzYxMiAwLjc0MyAwLjM5ODggMC4yNzUgMC4wMzgxIDAuNTQ1LTAuMDI2MyAwLjgxMi0wLjE5MzggMC4yNjctMC4xNjY4IDAuNDg0LTAuNDMyOCAwLjY1Mi0wLjc5NzggMC4wMTUgMC4wMTU0IDAuMDM4IDAuMDIyOSAwLjA2OSAwLjAyMjlsMC4zMi0yLjg5NDVjMC4wOTItMC4zOTUzIDAuMDMtMC43NDQ2LTAuMTgzLTEuMDQ4NS0wLjIxNC0wLjMwMzktMC40OTYtMC40Nzg5LTAuODQ2LTAuNTI0My0wLjQ0My0wLjYzODItMS4wNDEtMC45NzYyLTEuNzk2LTEuMDE0NC0wLjc1NS0wLjAzNzgtMS41MjkgMC4yMDkxLTIuMzIyIDAuNzQwOS0wLjQ4OCAwLjM0OTktMC45MTkgMC44MzE5LTEuMjkyIDEuNDQ3Mi0wLjM3NCAwLjYxNTctMC42NzkgMS4yOTkyLTAuOTE1IDIuMDUxMy0wLjIzNyAwLjc1MjItMC40MDUgMS41NDY1LTAuNTA0IDIuMzgyMi0wLjA5OSAwLjgzNTYtMC4xMTggMS42NDg4LTAuMDU3IDIuNDM4NSAwLjA2MSAwLjc5MDUgMC4yMDIgMS41MzUxIDAuNDIzIDIuMjMzNyAwLjIyMSAwLjY5OTIgMC41MyAxLjI4NDIgMC45MjcgMS43NTUgMC4zMzUgMC40MTAzIDAuNzE2IDAuNzEwNyAxLjE0MyAwLjkwMDdzMC44NzMgMC4zMDc0IDEuMzM5IDAuMzUzMWMwLjQ2NSAwLjA0NTQgMC45MjYgMC4wMjYzIDEuMzg0LTAuMDU3IDAuNDU3LTAuMDgzMyAwLjg5Mi0wLjIwMSAxLjMwMy0wLjM1MzQgMC41MzQtMC4xOTcyIDEuMDg0LTAuNDQ4MiAxLjY0OC0wLjc1MjEgMC41NjQtMC4zMDM2IDEuMTA1LTAuNjY4NSAxLjYyNC0xLjA5NDIgMC4yNzMtMC4yMjM4IDAuNTM1LTAuNDY3OCAwLjc4OS0wLjcyOTUgMC4xMTYgMC4yODU3IDAuMjQ1IDAuNTYyMSAwLjQgMC44MjA5IDAuNDEyIDAuNjgzNiAwLjk2OCAxLjIzODUgMS42NyAxLjY2MzkgMC43MDEgMC40MjUzIDEuNTYzIDAuNjMgMi41ODUgMC42MTUzIDEuMDk4LTAuMDE1MyAyLjExMi0wLjI5MjMgMy4wNDMtMC44MzE5IDAuOTMtMC41MzkgMS42OTItMS4zMzM2IDIuMjg3LTIuMzgxOCAwLjg5MSAwIDEuNzY3LTAuMTQ2NCAyLjYyOS0wLjQzNy0wLjA1NzMgMC42MjkyLTAuMDc4OCAxLjI3NzEtMC4xMTMgMS45MTg2LTAuMDE1IDAuNTAxNC0wLjA0OSAxLjEyMDUtMC4xMDMgMS44NTczLTAuMDUzIDAuNzM3MS0wLjA4NyAxLjUxMi0wLjEwMiAyLjMyNDktMC4wMTUgMC44MTI4IDAuMDE1IDEuNjMzNCAwLjA5MSAyLjQ2MTkgMC4wNzYgMC44Mjc5IDAuMjM2IDEuNTgwMyAwLjQ4IDIuMjU2NiAwLjI0NCAwLjY3NTggMC41OTEgMS4yNDk1IDEuMDQxIDEuNzIwOCAwLjQ1IDAuNDcwOCAxLjA0MSAwLjc1MjEgMS43NzMgMC44NDMyIDAuNzc4IDAuMTA2MSAxLjQ0OS0wLjAzMDYgMi4wMTMtMC40MTAzIDAuNTY0LTAuMzggMS4wMjItMC45MDAyIDEuMzczLTEuNTYxMiAwLjM1LTAuNjYxMyAwLjU5OC0xLjQyNDcgMC43NDMtMi4yOTA3IDAuMTQ1LTAuODY2MSAwLjE4Ny0xLjczNjIgMC4xMjYtMi42MS0wLjA2MS0wLjg3MzktMC4yMjItMS42OTgtMC40ODEtMi40NzI2LTAuMjU5LTAuNzc1My0wLjYxOC0xLjQxMzUtMS4wNzUtMS45MTUyIDAuMjc1LTAuMDc1NCAwLjYwMy0wLjIxOTcgMC45ODQtMC40MzI4IDAuNTYxMDEtMC4zMDE1MyAwLjk5MzUyLTAuNjEyODQgMS40NzQtMC45MTkzLTAuMDM3IDAuNTM4NC0wLjA1NiAwLjkyMjQtMC4wNTYgMS4xNDc0LTAuMDE1IDAuNTAxNC0wLjA0OSAxLjEyMDUtMC4xMDMgMS44NTczLTAuMDUzIDAuNzM3MS0wLjA4OCAxLjUxMi0wLjEwMyAyLjMyNDktMC4wMTUgMC44MTI4IDAuMDE1IDEuNjMzNCAwLjA5MiAyLjQ2MTkgMC4wNzYgMC44Mjc5IDAuMjM2IDEuNTgwMyAwLjQ4IDIuMjU2NiAwLjI0NCAwLjY3NTggMC41OTEgMS4yNDk1IDEuMDQxIDEuNzIwOCAwLjQ1IDAuNDcwOCAxLjA0MSAwLjc1MjEgMS43NzMgMC44NDMyIDAuNzc3IDAuMTA2MSAxLjQ0OC0wLjAzMDYgMi4wMTMtMC40MTAzIDAuNTY0LTAuMzggMS4wMjEtMC45MDAyIDEuMzczLTEuNTYxMiAwLjM1LTAuNjYxMyAwLjU5OC0xLjQyNDcgMC43NDMtMi4yOTA3IDAuMTQ1LTAuODY2MSAwLjE4Ni0xLjczNjIgMC4xMjYtMi42MS0wLjA2Mi0wLjg3MzktMC4yMjItMS42OTgtMC40ODEtMi40NzI2LTAuMjU5LTAuNzc1My0wLjYxNy0xLjQxMzUtMS4wNzUtMS45MTUyIDAuMjc1LTAuMDc1NCAwLjYwMi0wLjIxOTcgMC45ODQtMC40MzI4IDAuMzgxLTAuMjEyNiAwLjc3My0wLjQ1MiAxLjE3OC0wLjcxOCAwLjIxLTAuMTM4MiAwLjQxOS0wLjI4MDggMC42MjctMC40Mjc0IDAuMDc4IDAuNzQzMSAwLjI0NyAxLjM5NDkgMC41MTYgMS45NDMyIDAuMzI4IDAuNjY4OCAwLjc3NCAxLjE4NTIgMS4zMzkgMS41NTAyIDAuNTY0IDAuMzY0MyAxLjIyNyAwLjU2NTkgMS45OSAwLjYwMzcgMC43NjIgMC4wMzc2IDEuNTkzLTAuMTAyNiAyLjQ5NC0wLjQyMTkgMC42Ny0wLjI0MjggMS4yNTQtMC41NDY4IDEuNzQ5LTAuOTExNCAwLjQ5Ni0wLjM2NDkgMC45NDItMC44MDk0IDEuMzM4LTEuMzMzMyAwLjAyMy0wLjAzMDQgMC4wNDUtMC4wNjMzIDAuMDY3LTAuMDk0IDAuMDcxIDAuMjEyOCAwLjE0OSAwLjQxNzMgMC4yNDIgMC42MDY3IDAuMzI4IDAuNjY4OCAwLjc3NCAxLjE4NTIgMS4zMzkgMS41NTAyIDAuNTYzIDAuMzY0MyAxLjIyNyAwLjU2NTkgMS45OSAwLjYwMzcgMC43NjIgMC4wMzc2IDEuNTkzLTAuMTAyNiAyLjQ5My0wLjQyMTkgMC42NzEtMC4yNDI4IDEuMjU1LTAuNTQ2OCAxLjc1LTAuOTExNCAwLjQ5Ni0wLjM2NDkgMC45NDItMC44MDk0IDEuMzM4LTEuMzMzMyAwLjM5Ny0wLjUyNDYgMC43NTktMS4xMjg2IDEuMDg3LTEuODEyMiAwLjMyOC0wLjY4MzkgMC42NTktMS40NjYgMC45OTUtMi4zNDc3IDAuMDYxLTAuMjQyOSA0ZS0zIC0wLjQ1OTUtMC4xNzEtMC42NDk1elwiIGZpbGw9XCIjMGQwYzIzXCIvPlxuIDwvZz5cbjwvc3ZnPmA7XG5cbmV4cG9ydCBjb25zdCBwYXlwYWwgPSBgXG48c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE1MFwiIGhlaWdodD1cIjQwXCI+XG48cGF0aCBmaWxsPVwiIzI1M0I4MFwiIGQ9XCJNNDYuMjExIDYuNzQ5aC02LjgzOWEuOTUuOTUgMCAwIDAtLjkzOS44MDJsLTIuNzY2IDE3LjUzN2EuNTcuNTcgMCAwIDAgLjU2NC42NThoMy4yNjVhLjk1Ljk1IDAgMCAwIC45MzktLjgwM2wuNzQ2LTQuNzNhLjk1Ljk1IDAgMCAxIC45MzgtLjgwM2gyLjE2NWM0LjUwNSAwIDcuMTA1LTIuMTggNy43ODQtNi41LjMwNi0xLjg5LjAxMy0zLjM3NS0uODcyLTQuNDE1LS45NzItMS4xNDItMi42OTYtMS43NDYtNC45ODUtMS43NDZ6TTQ3IDEzLjE1NGMtLjM3NCAyLjQ1NC0yLjI0OSAyLjQ1NC00LjA2MiAyLjQ1NGgtMS4wMzJsLjcyNC00LjU4M2EuNTcuNTcgMCAwIDEgLjU2My0uNDgxaC40NzNjMS4yMzUgMCAyLjQgMCAzLjAwMi43MDQuMzU5LjQyLjQ2OSAxLjA0NC4zMzIgMS45MDZ6TTY2LjY1NCAxMy4wNzVoLTMuMjc1YS41Ny41NyAwIDAgMC0uNTYzLjQ4MWwtLjE0NS45MTYtLjIyOS0uMzMyYy0uNzA5LTEuMDI5LTIuMjktMS4zNzMtMy44NjgtMS4zNzMtMy42MTkgMC02LjcxIDIuNzQxLTcuMzEyIDYuNTg2LS4zMTMgMS45MTguMTMyIDMuNzUyIDEuMjIgNS4wMzEuOTk4IDEuMTc2IDIuNDI2IDEuNjY2IDQuMTI1IDEuNjY2IDIuOTE2IDAgNC41MzMtMS44NzUgNC41MzMtMS44NzVsLS4xNDYuOTFhLjU3LjU3IDAgMCAwIC41NjIuNjZoMi45NWEuOTUuOTUgMCAwIDAgLjkzOS0uODAzbDEuNzctMTEuMjA5YS41NjguNTY4IDAgMCAwLS41NjEtLjY1OHptLTQuNTY1IDYuMzc0Yy0uMzE2IDEuODcxLTEuODAxIDMuMTI3LTMuNjk1IDMuMTI3LS45NTEgMC0xLjcxMS0uMzA1LTIuMTk5LS44ODMtLjQ4NC0uNTc0LS42NjgtMS4zOTEtLjUxNC0yLjMwMS4yOTUtMS44NTUgMS44MDUtMy4xNTIgMy42Ny0zLjE1Mi45MyAwIDEuNjg2LjMwOSAyLjE4NC44OTIuNDk5LjU4OS42OTcgMS40MTEuNTU0IDIuMzE3ek04NC4wOTYgMTMuMDc1aC0zLjI5MWEuOTU0Ljk1NCAwIDAgMC0uNzg3LjQxN2wtNC41MzkgNi42ODYtMS45MjQtNi40MjVhLjk1My45NTMgMCAwIDAtLjkxMi0uNjc4aC0zLjIzNGEuNTcuNTcgMCAwIDAtLjU0MS43NTRsMy42MjUgMTAuNjM4LTMuNDA4IDQuODExYS41Ny41NyAwIDAgMCAuNDY1LjloMy4yODdhLjk0OS45NDkgMCAwIDAgLjc4MS0uNDA4bDEwLjk0Ni0xNS44YS41Ny41NyAwIDAgMC0uNDY4LS44OTV6XCIvPlxuPHBhdGggZmlsbD1cIiMxNzlCRDdcIiBkPVwiTTk0Ljk5MiA2Ljc0OWgtNi44NGEuOTUuOTUgMCAwIDAtLjkzOC44MDJsLTIuNzY2IDE3LjUzN2EuNTY5LjU2OSAwIDAgMCAuNTYyLjY1OGgzLjUxYS42NjUuNjY1IDAgMCAwIC42NTYtLjU2MmwuNzg1LTQuOTcxYS45NS45NSAwIDAgMSAuOTM4LS44MDNoMi4xNjRjNC41MDYgMCA3LjEwNS0yLjE4IDcuNzg1LTYuNS4zMDctMS44OS4wMTItMy4zNzUtLjg3My00LjQxNS0uOTcxLTEuMTQyLTIuNjk0LTEuNzQ2LTQuOTgzLTEuNzQ2em0uNzg5IDYuNDA1Yy0uMzczIDIuNDU0LTIuMjQ4IDIuNDU0LTQuMDYyIDIuNDU0aC0xLjAzMWwuNzI1LTQuNTgzYS41NjguNTY4IDAgMCAxIC41NjItLjQ4MWguNDczYzEuMjM0IDAgMi40IDAgMy4wMDIuNzA0LjM1OS40Mi40NjggMS4wNDQuMzMxIDEuOTA2ek0xMTUuNDM0IDEzLjA3NWgtMy4yNzNhLjU2Ny41NjcgMCAwIDAtLjU2Mi40ODFsLS4xNDUuOTE2LS4yMy0uMzMyYy0uNzA5LTEuMDI5LTIuMjg5LTEuMzczLTMuODY3LTEuMzczLTMuNjE5IDAtNi43MDkgMi43NDEtNy4zMTEgNi41ODYtLjMxMiAxLjkxOC4xMzEgMy43NTIgMS4yMTkgNS4wMzEgMSAxLjE3NiAyLjQyNiAxLjY2NiA0LjEyNSAxLjY2NiAyLjkxNiAwIDQuNTMzLTEuODc1IDQuNTMzLTEuODc1bC0uMTQ2LjkxYS41Ny41NyAwIDAgMCAuNTY0LjY2aDIuOTQ5YS45NS45NSAwIDAgMCAuOTM4LS44MDNsMS43NzEtMTEuMjA5YS41NzEuNTcxIDAgMCAwLS41NjUtLjY1OHptLTQuNTY1IDYuMzc0Yy0uMzE0IDEuODcxLTEuODAxIDMuMTI3LTMuNjk1IDMuMTI3LS45NDkgMC0xLjcxMS0uMzA1LTIuMTk5LS44ODMtLjQ4NC0uNTc0LS42NjYtMS4zOTEtLjUxNC0yLjMwMS4yOTctMS44NTUgMS44MDUtMy4xNTIgMy42Ny0zLjE1Mi45MyAwIDEuNjg2LjMwOSAyLjE4NC44OTIuNTAxLjU4OS42OTkgMS40MTEuNTU0IDIuMzE3ek0xMTkuMjk1IDcuMjNsLTIuODA3IDE3Ljg1OGEuNTY5LjU2OSAwIDAgMCAuNTYyLjY1OGgyLjgyMmMuNDY5IDAgLjg2Ny0uMzQuOTM5LS44MDNsMi43NjgtMTcuNTM2YS41Ny41NyAwIDAgMC0uNTYyLS42NTloLTMuMTZhLjU3MS41NzEgMCAwIDAtLjU2Mi40ODJ6XCIvPlxuPHBhdGggZmlsbD1cIiMyNTNCODBcIiBkPVwiTTcuMjY2IDI5LjE1NGwuNTIzLTMuMzIyLTEuMTY1LS4wMjdIMS4wNjFMNC45MjcgMS4yOTJhLjMxNi4zMTYgMCAwIDEgLjMxNC0uMjY4aDkuMzhjMy4xMTQgMCA1LjI2My42NDggNi4zODUgMS45MjcuNTI2LjYuODYxIDEuMjI3IDEuMDIzIDEuOTE3LjE3LjcyNC4xNzMgMS41ODkuMDA3IDIuNjQ0bC0uMDEyLjA3N3YuNjc2bC41MjYuMjk4YTMuNjkgMy42OSAwIDAgMSAxLjA2NS44MTJjLjQ1LjUxMy43NDEgMS4xNjUuODY0IDEuOTM4LjEyNy43OTUuMDg1IDEuNzQxLS4xMjMgMi44MTItLjI0IDEuMjMyLS42MjggMi4zMDUtMS4xNTIgMy4xODNhNi41NDcgNi41NDcgMCAwIDEtMS44MjUgMmMtLjY5Ni40OTQtMS41MjMuODY5LTIuNDU4IDEuMTA5LS45MDYuMjM2LTEuOTM5LjM1NS0zLjA3Mi4zNTVoLS43M2MtLjUyMiAwLTEuMDI5LjE4OC0xLjQyNy41MjVhMi4yMSAyLjIxIDAgMCAwLS43NDQgMS4zMjhsLS4wNTUuMjk5LS45MjQgNS44NTUtLjA0Mi4yMTVjLS4wMTEuMDY4LS4wMy4xMDItLjA1OC4xMjVhLjE1NS4xNTUgMCAwIDEtLjA5Ni4wMzVINy4yNjZ6XCIvPlxuPHBhdGggZmlsbD1cIiMxNzlCRDdcIiBkPVwiTTIzLjA0OCA3LjY2N2MtLjAyOC4xNzktLjA2LjM2Mi0uMDk2LjU1LTEuMjM3IDYuMzUxLTUuNDY5IDguNTQ1LTEwLjg3NCA4LjU0NUg5LjMyNmMtLjY2MSAwLTEuMjE4LjQ4LTEuMzIxIDEuMTMyTDYuNTk2IDI2LjgzbC0uMzk5IDIuNTMzYS43MDQuNzA0IDAgMCAwIC42OTUuODE0aDQuODgxYy41NzggMCAxLjA2OS0uNDIgMS4xNi0uOTlsLjA0OC0uMjQ4LjkxOS01LjgzMi4wNTktLjMyYy4wOS0uNTcyLjU4Mi0uOTkyIDEuMTYtLjk5MmguNzNjNC43MjkgMCA4LjQzMS0xLjkyIDkuNTEzLTcuNDc2LjQ1Mi0yLjMyMS4yMTgtNC4yNTktLjk3OC01LjYyMmE0LjY2NyA0LjY2NyAwIDAgMC0xLjMzNi0xLjAzelwiLz5cbjxwYXRoIGZpbGw9XCIjMjIyRDY1XCIgZD1cIk0yMS43NTQgNy4xNTFhOS43NTcgOS43NTcgMCAwIDAtMS4yMDMtLjI2NyAxNS4yODQgMTUuMjg0IDAgMCAwLTIuNDI2LS4xNzdoLTcuMzUyYTEuMTcyIDEuMTcyIDAgMCAwLTEuMTU5Ljk5Mkw4LjA1IDE3LjYwNWwtLjA0NS4yODlhMS4zMzYgMS4zMzYgMCAwIDEgMS4zMjEtMS4xMzJoMi43NTJjNS40MDUgMCA5LjYzNy0yLjE5NSAxMC44NzQtOC41NDUuMDM3LS4xODguMDY4LS4zNzEuMDk2LS41NWE2LjU5NCA2LjU5NCAwIDAgMC0xLjAxNy0uNDI5IDkuMDQ1IDkuMDQ1IDAgMCAwLS4yNzctLjA4N3pcIi8+XG48cGF0aCBmaWxsPVwiIzI1M0I4MFwiIGQ9XCJNOS42MTQgNy42OTlhMS4xNjkgMS4xNjkgMCAwIDEgMS4xNTktLjk5MWg3LjM1MmMuODcxIDAgMS42ODQuMDU3IDIuNDI2LjE3N2E5Ljc1NyA5Ljc1NyAwIDAgMSAxLjQ4MS4zNTNjLjM2NS4xMjEuNzA0LjI2NCAxLjAxNy40MjkuMzY4LTIuMzQ3LS4wMDMtMy45NDUtMS4yNzItNS4zOTJDMjAuMzc4LjY4MiAxNy44NTMgMCAxNC42MjIgMGgtOS4zOGMtLjY2IDAtMS4yMjMuNDgtMS4zMjUgMS4xMzNMLjAxIDI1Ljg5OGEuODA2LjgwNiAwIDAgMCAuNzk1LjkzMmg1Ljc5MWwxLjQ1NC05LjIyNSAxLjU2NC05LjkwNnpcIi8+XG48L3N2Zz5gO1xuIiwiaW1wb3J0ICdvYnNpZGlhbic7XG5cbmZ1bmN0aW9uIG5vb3AoKSB7IH1cbmZ1bmN0aW9uIGFzc2lnbih0YXIsIHNyYykge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBmb3IgKGNvbnN0IGsgaW4gc3JjKVxuICAgICAgICB0YXJba10gPSBzcmNba107XG4gICAgcmV0dXJuIHRhcjtcbn1cbmZ1bmN0aW9uIGlzX3Byb21pc2UodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJztcbn1cbmZ1bmN0aW9uIHJ1bihmbikge1xuICAgIHJldHVybiBmbigpO1xufVxuZnVuY3Rpb24gYmxhbmtfb2JqZWN0KCkge1xuICAgIHJldHVybiBPYmplY3QuY3JlYXRlKG51bGwpO1xufVxuZnVuY3Rpb24gcnVuX2FsbChmbnMpIHtcbiAgICBmbnMuZm9yRWFjaChydW4pO1xufVxuZnVuY3Rpb24gaXNfZnVuY3Rpb24odGhpbmcpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaW5nID09PSAnZnVuY3Rpb24nO1xufVxuZnVuY3Rpb24gc2FmZV9ub3RfZXF1YWwoYSwgYikge1xuICAgIHJldHVybiBhICE9IGEgPyBiID09IGIgOiBhICE9PSBiIHx8ICgoYSAmJiB0eXBlb2YgYSA9PT0gJ29iamVjdCcpIHx8IHR5cGVvZiBhID09PSAnZnVuY3Rpb24nKTtcbn1cbmZ1bmN0aW9uIG5vdF9lcXVhbChhLCBiKSB7XG4gICAgcmV0dXJuIGEgIT0gYSA/IGIgPT0gYiA6IGEgIT09IGI7XG59XG5mdW5jdGlvbiBpc19lbXB0eShvYmopIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPT09IDA7XG59XG5mdW5jdGlvbiBjcmVhdGVfc2xvdChkZWZpbml0aW9uLCBjdHgsICQkc2NvcGUsIGZuKSB7XG4gICAgaWYgKGRlZmluaXRpb24pIHtcbiAgICAgICAgY29uc3Qgc2xvdF9jdHggPSBnZXRfc2xvdF9jb250ZXh0KGRlZmluaXRpb24sIGN0eCwgJCRzY29wZSwgZm4pO1xuICAgICAgICByZXR1cm4gZGVmaW5pdGlvblswXShzbG90X2N0eCk7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0X3Nsb3RfY29udGV4dChkZWZpbml0aW9uLCBjdHgsICQkc2NvcGUsIGZuKSB7XG4gICAgcmV0dXJuIGRlZmluaXRpb25bMV0gJiYgZm5cbiAgICAgICAgPyBhc3NpZ24oJCRzY29wZS5jdHguc2xpY2UoKSwgZGVmaW5pdGlvblsxXShmbihjdHgpKSlcbiAgICAgICAgOiAkJHNjb3BlLmN0eDtcbn1cbmZ1bmN0aW9uIGdldF9zbG90X2NoYW5nZXMoZGVmaW5pdGlvbiwgJCRzY29wZSwgZGlydHksIGZuKSB7XG4gICAgaWYgKGRlZmluaXRpb25bMl0gJiYgZm4pIHtcbiAgICAgICAgY29uc3QgbGV0cyA9IGRlZmluaXRpb25bMl0oZm4oZGlydHkpKTtcbiAgICAgICAgaWYgKCQkc2NvcGUuZGlydHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGxldHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBsZXRzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgY29uc3QgbWVyZ2VkID0gW107XG4gICAgICAgICAgICBjb25zdCBsZW4gPSBNYXRoLm1heCgkJHNjb3BlLmRpcnR5Lmxlbmd0aCwgbGV0cy5sZW5ndGgpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgICAgICAgICAgIG1lcmdlZFtpXSA9ICQkc2NvcGUuZGlydHlbaV0gfCBsZXRzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1lcmdlZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJCRzY29wZS5kaXJ0eSB8IGxldHM7XG4gICAgfVxuICAgIHJldHVybiAkJHNjb3BlLmRpcnR5O1xufVxuZnVuY3Rpb24gdXBkYXRlX3Nsb3Qoc2xvdCwgc2xvdF9kZWZpbml0aW9uLCBjdHgsICQkc2NvcGUsIGRpcnR5LCBnZXRfc2xvdF9jaGFuZ2VzX2ZuLCBnZXRfc2xvdF9jb250ZXh0X2ZuKSB7XG4gICAgY29uc3Qgc2xvdF9jaGFuZ2VzID0gZ2V0X3Nsb3RfY2hhbmdlcyhzbG90X2RlZmluaXRpb24sICQkc2NvcGUsIGRpcnR5LCBnZXRfc2xvdF9jaGFuZ2VzX2ZuKTtcbiAgICBpZiAoc2xvdF9jaGFuZ2VzKSB7XG4gICAgICAgIGNvbnN0IHNsb3RfY29udGV4dCA9IGdldF9zbG90X2NvbnRleHQoc2xvdF9kZWZpbml0aW9uLCBjdHgsICQkc2NvcGUsIGdldF9zbG90X2NvbnRleHRfZm4pO1xuICAgICAgICBzbG90LnAoc2xvdF9jb250ZXh0LCBzbG90X2NoYW5nZXMpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG51bGxfdG9fZW1wdHkodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICcnIDogdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZCh0YXJnZXQsIG5vZGUpIHtcbiAgICB0YXJnZXQuYXBwZW5kQ2hpbGQobm9kZSk7XG59XG5mdW5jdGlvbiBpbnNlcnQodGFyZ2V0LCBub2RlLCBhbmNob3IpIHtcbiAgICB0YXJnZXQuaW5zZXJ0QmVmb3JlKG5vZGUsIGFuY2hvciB8fCBudWxsKTtcbn1cbmZ1bmN0aW9uIGRldGFjaChub2RlKSB7XG4gICAgbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpO1xufVxuZnVuY3Rpb24gZGVzdHJveV9lYWNoKGl0ZXJhdGlvbnMsIGRldGFjaGluZykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlcmF0aW9ucy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBpZiAoaXRlcmF0aW9uc1tpXSlcbiAgICAgICAgICAgIGl0ZXJhdGlvbnNbaV0uZChkZXRhY2hpbmcpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGVsZW1lbnQobmFtZSkge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpO1xufVxuZnVuY3Rpb24gc3ZnX2VsZW1lbnQobmFtZSkge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgbmFtZSk7XG59XG5mdW5jdGlvbiB0ZXh0KGRhdGEpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZGF0YSk7XG59XG5mdW5jdGlvbiBzcGFjZSgpIHtcbiAgICByZXR1cm4gdGV4dCgnICcpO1xufVxuZnVuY3Rpb24gZW1wdHkoKSB7XG4gICAgcmV0dXJuIHRleHQoJycpO1xufVxuZnVuY3Rpb24gbGlzdGVuKG5vZGUsIGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKSB7XG4gICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKTtcbiAgICByZXR1cm4gKCkgPT4gbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKTtcbn1cbmZ1bmN0aW9uIGF0dHIobm9kZSwgYXR0cmlidXRlLCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKVxuICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGUpO1xuICAgIGVsc2UgaWYgKG5vZGUuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZSkgIT09IHZhbHVlKVxuICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIHZhbHVlKTtcbn1cbmZ1bmN0aW9uIHNldF9hdHRyaWJ1dGVzKG5vZGUsIGF0dHJpYnV0ZXMpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgZGVzY3JpcHRvcnMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhub2RlLl9fcHJvdG9fXyk7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gYXR0cmlidXRlcykge1xuICAgICAgICBpZiAoYXR0cmlidXRlc1trZXldID09IG51bGwpIHtcbiAgICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoa2V5ID09PSAnc3R5bGUnKSB7XG4gICAgICAgICAgICBub2RlLnN0eWxlLmNzc1RleHQgPSBhdHRyaWJ1dGVzW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoa2V5ID09PSAnX192YWx1ZScpIHtcbiAgICAgICAgICAgIG5vZGUudmFsdWUgPSBub2RlW2tleV0gPSBhdHRyaWJ1dGVzW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZGVzY3JpcHRvcnNba2V5XSAmJiBkZXNjcmlwdG9yc1trZXldLnNldCkge1xuICAgICAgICAgICAgbm9kZVtrZXldID0gYXR0cmlidXRlc1trZXldO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYXR0cihub2RlLCBrZXksIGF0dHJpYnV0ZXNba2V5XSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBjaGlsZHJlbihlbGVtZW50KSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oZWxlbWVudC5jaGlsZE5vZGVzKTtcbn1cbmZ1bmN0aW9uIHNldF9kYXRhKHRleHQsIGRhdGEpIHtcbiAgICBkYXRhID0gJycgKyBkYXRhO1xuICAgIGlmICh0ZXh0Lndob2xlVGV4dCAhPT0gZGF0YSlcbiAgICAgICAgdGV4dC5kYXRhID0gZGF0YTtcbn1cbmZ1bmN0aW9uIHRvZ2dsZV9jbGFzcyhlbGVtZW50LCBuYW1lLCB0b2dnbGUpIHtcbiAgICBlbGVtZW50LmNsYXNzTGlzdFt0b2dnbGUgPyAnYWRkJyA6ICdyZW1vdmUnXShuYW1lKTtcbn1cblxubGV0IGN1cnJlbnRfY29tcG9uZW50O1xuZnVuY3Rpb24gc2V0X2N1cnJlbnRfY29tcG9uZW50KGNvbXBvbmVudCkge1xuICAgIGN1cnJlbnRfY29tcG9uZW50ID0gY29tcG9uZW50O1xufVxuZnVuY3Rpb24gZ2V0X2N1cnJlbnRfY29tcG9uZW50KCkge1xuICAgIGlmICghY3VycmVudF9jb21wb25lbnQpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRnVuY3Rpb24gY2FsbGVkIG91dHNpZGUgY29tcG9uZW50IGluaXRpYWxpemF0aW9uJyk7XG4gICAgcmV0dXJuIGN1cnJlbnRfY29tcG9uZW50O1xufVxuXG5jb25zdCBkaXJ0eV9jb21wb25lbnRzID0gW107XG5jb25zdCBiaW5kaW5nX2NhbGxiYWNrcyA9IFtdO1xuY29uc3QgcmVuZGVyX2NhbGxiYWNrcyA9IFtdO1xuY29uc3QgZmx1c2hfY2FsbGJhY2tzID0gW107XG5jb25zdCByZXNvbHZlZF9wcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5sZXQgdXBkYXRlX3NjaGVkdWxlZCA9IGZhbHNlO1xuZnVuY3Rpb24gc2NoZWR1bGVfdXBkYXRlKCkge1xuICAgIGlmICghdXBkYXRlX3NjaGVkdWxlZCkge1xuICAgICAgICB1cGRhdGVfc2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgICAgcmVzb2x2ZWRfcHJvbWlzZS50aGVuKGZsdXNoKTtcbiAgICB9XG59XG5mdW5jdGlvbiBhZGRfcmVuZGVyX2NhbGxiYWNrKGZuKSB7XG4gICAgcmVuZGVyX2NhbGxiYWNrcy5wdXNoKGZuKTtcbn1cbmxldCBmbHVzaGluZyA9IGZhbHNlO1xuY29uc3Qgc2Vlbl9jYWxsYmFja3MgPSBuZXcgU2V0KCk7XG5mdW5jdGlvbiBmbHVzaCgpIHtcbiAgICBpZiAoZmx1c2hpbmcpXG4gICAgICAgIHJldHVybjtcbiAgICBmbHVzaGluZyA9IHRydWU7XG4gICAgZG8ge1xuICAgICAgICAvLyBmaXJzdCwgY2FsbCBiZWZvcmVVcGRhdGUgZnVuY3Rpb25zXG4gICAgICAgIC8vIGFuZCB1cGRhdGUgY29tcG9uZW50c1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpcnR5X2NvbXBvbmVudHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGRpcnR5X2NvbXBvbmVudHNbaV07XG4gICAgICAgICAgICBzZXRfY3VycmVudF9jb21wb25lbnQoY29tcG9uZW50KTtcbiAgICAgICAgICAgIHVwZGF0ZShjb21wb25lbnQuJCQpO1xuICAgICAgICB9XG4gICAgICAgIHNldF9jdXJyZW50X2NvbXBvbmVudChudWxsKTtcbiAgICAgICAgZGlydHlfY29tcG9uZW50cy5sZW5ndGggPSAwO1xuICAgICAgICB3aGlsZSAoYmluZGluZ19jYWxsYmFja3MubGVuZ3RoKVxuICAgICAgICAgICAgYmluZGluZ19jYWxsYmFja3MucG9wKCkoKTtcbiAgICAgICAgLy8gdGhlbiwgb25jZSBjb21wb25lbnRzIGFyZSB1cGRhdGVkLCBjYWxsXG4gICAgICAgIC8vIGFmdGVyVXBkYXRlIGZ1bmN0aW9ucy4gVGhpcyBtYXkgY2F1c2VcbiAgICAgICAgLy8gc3Vic2VxdWVudCB1cGRhdGVzLi4uXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVuZGVyX2NhbGxiYWNrcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgY29uc3QgY2FsbGJhY2sgPSByZW5kZXJfY2FsbGJhY2tzW2ldO1xuICAgICAgICAgICAgaWYgKCFzZWVuX2NhbGxiYWNrcy5oYXMoY2FsbGJhY2spKSB7XG4gICAgICAgICAgICAgICAgLy8gLi4uc28gZ3VhcmQgYWdhaW5zdCBpbmZpbml0ZSBsb29wc1xuICAgICAgICAgICAgICAgIHNlZW5fY2FsbGJhY2tzLmFkZChjYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZW5kZXJfY2FsbGJhY2tzLmxlbmd0aCA9IDA7XG4gICAgfSB3aGlsZSAoZGlydHlfY29tcG9uZW50cy5sZW5ndGgpO1xuICAgIHdoaWxlIChmbHVzaF9jYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgICAgIGZsdXNoX2NhbGxiYWNrcy5wb3AoKSgpO1xuICAgIH1cbiAgICB1cGRhdGVfc2NoZWR1bGVkID0gZmFsc2U7XG4gICAgZmx1c2hpbmcgPSBmYWxzZTtcbiAgICBzZWVuX2NhbGxiYWNrcy5jbGVhcigpO1xufVxuZnVuY3Rpb24gdXBkYXRlKCQkKSB7XG4gICAgaWYgKCQkLmZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgICAgICQkLnVwZGF0ZSgpO1xuICAgICAgICBydW5fYWxsKCQkLmJlZm9yZV91cGRhdGUpO1xuICAgICAgICBjb25zdCBkaXJ0eSA9ICQkLmRpcnR5O1xuICAgICAgICAkJC5kaXJ0eSA9IFstMV07XG4gICAgICAgICQkLmZyYWdtZW50ICYmICQkLmZyYWdtZW50LnAoJCQuY3R4LCBkaXJ0eSk7XG4gICAgICAgICQkLmFmdGVyX3VwZGF0ZS5mb3JFYWNoKGFkZF9yZW5kZXJfY2FsbGJhY2spO1xuICAgIH1cbn1cbmNvbnN0IG91dHJvaW5nID0gbmV3IFNldCgpO1xubGV0IG91dHJvcztcbmZ1bmN0aW9uIGdyb3VwX291dHJvcygpIHtcbiAgICBvdXRyb3MgPSB7XG4gICAgICAgIHI6IDAsXG4gICAgICAgIGM6IFtdLFxuICAgICAgICBwOiBvdXRyb3MgLy8gcGFyZW50IGdyb3VwXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNoZWNrX291dHJvcygpIHtcbiAgICBpZiAoIW91dHJvcy5yKSB7XG4gICAgICAgIHJ1bl9hbGwob3V0cm9zLmMpO1xuICAgIH1cbiAgICBvdXRyb3MgPSBvdXRyb3MucDtcbn1cbmZ1bmN0aW9uIHRyYW5zaXRpb25faW4oYmxvY2ssIGxvY2FsKSB7XG4gICAgaWYgKGJsb2NrICYmIGJsb2NrLmkpIHtcbiAgICAgICAgb3V0cm9pbmcuZGVsZXRlKGJsb2NrKTtcbiAgICAgICAgYmxvY2suaShsb2NhbCk7XG4gICAgfVxufVxuZnVuY3Rpb24gdHJhbnNpdGlvbl9vdXQoYmxvY2ssIGxvY2FsLCBkZXRhY2gsIGNhbGxiYWNrKSB7XG4gICAgaWYgKGJsb2NrICYmIGJsb2NrLm8pIHtcbiAgICAgICAgaWYgKG91dHJvaW5nLmhhcyhibG9jaykpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIG91dHJvaW5nLmFkZChibG9jayk7XG4gICAgICAgIG91dHJvcy5jLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgb3V0cm9pbmcuZGVsZXRlKGJsb2NrKTtcbiAgICAgICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIGlmIChkZXRhY2gpXG4gICAgICAgICAgICAgICAgICAgIGJsb2NrLmQoMSk7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGJsb2NrLm8obG9jYWwpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlX3Byb21pc2UocHJvbWlzZSwgaW5mbykge1xuICAgIGNvbnN0IHRva2VuID0gaW5mby50b2tlbiA9IHt9O1xuICAgIGZ1bmN0aW9uIHVwZGF0ZSh0eXBlLCBpbmRleCwga2V5LCB2YWx1ZSkge1xuICAgICAgICBpZiAoaW5mby50b2tlbiAhPT0gdG9rZW4pXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGluZm8ucmVzb2x2ZWQgPSB2YWx1ZTtcbiAgICAgICAgbGV0IGNoaWxkX2N0eCA9IGluZm8uY3R4O1xuICAgICAgICBpZiAoa2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNoaWxkX2N0eCA9IGNoaWxkX2N0eC5zbGljZSgpO1xuICAgICAgICAgICAgY2hpbGRfY3R4W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBibG9jayA9IHR5cGUgJiYgKGluZm8uY3VycmVudCA9IHR5cGUpKGNoaWxkX2N0eCk7XG4gICAgICAgIGxldCBuZWVkc19mbHVzaCA9IGZhbHNlO1xuICAgICAgICBpZiAoaW5mby5ibG9jaykge1xuICAgICAgICAgICAgaWYgKGluZm8uYmxvY2tzKSB7XG4gICAgICAgICAgICAgICAgaW5mby5ibG9ja3MuZm9yRWFjaCgoYmxvY2ssIGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgIT09IGluZGV4ICYmIGJsb2NrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cF9vdXRyb3MoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25fb3V0KGJsb2NrLCAxLCAxLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8uYmxvY2tzW2ldID09PSBibG9jaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmJsb2Nrc1tpXSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja19vdXRyb3MoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaW5mby5ibG9jay5kKDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYmxvY2suYygpO1xuICAgICAgICAgICAgdHJhbnNpdGlvbl9pbihibG9jaywgMSk7XG4gICAgICAgICAgICBibG9jay5tKGluZm8ubW91bnQoKSwgaW5mby5hbmNob3IpO1xuICAgICAgICAgICAgbmVlZHNfZmx1c2ggPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGluZm8uYmxvY2sgPSBibG9jaztcbiAgICAgICAgaWYgKGluZm8uYmxvY2tzKVxuICAgICAgICAgICAgaW5mby5ibG9ja3NbaW5kZXhdID0gYmxvY2s7XG4gICAgICAgIGlmIChuZWVkc19mbHVzaCkge1xuICAgICAgICAgICAgZmx1c2goKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNfcHJvbWlzZShwcm9taXNlKSkge1xuICAgICAgICBjb25zdCBjdXJyZW50X2NvbXBvbmVudCA9IGdldF9jdXJyZW50X2NvbXBvbmVudCgpO1xuICAgICAgICBwcm9taXNlLnRoZW4odmFsdWUgPT4ge1xuICAgICAgICAgICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KGN1cnJlbnRfY29tcG9uZW50KTtcbiAgICAgICAgICAgIHVwZGF0ZShpbmZvLnRoZW4sIDEsIGluZm8udmFsdWUsIHZhbHVlKTtcbiAgICAgICAgICAgIHNldF9jdXJyZW50X2NvbXBvbmVudChudWxsKTtcbiAgICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICAgICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KGN1cnJlbnRfY29tcG9uZW50KTtcbiAgICAgICAgICAgIHVwZGF0ZShpbmZvLmNhdGNoLCAyLCBpbmZvLmVycm9yLCBlcnJvcik7XG4gICAgICAgICAgICBzZXRfY3VycmVudF9jb21wb25lbnQobnVsbCk7XG4gICAgICAgICAgICBpZiAoIWluZm8uaGFzQ2F0Y2gpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGlmIHdlIHByZXZpb3VzbHkgaGFkIGEgdGhlbi9jYXRjaCBibG9jaywgZGVzdHJveSBpdFxuICAgICAgICBpZiAoaW5mby5jdXJyZW50ICE9PSBpbmZvLnBlbmRpbmcpIHtcbiAgICAgICAgICAgIHVwZGF0ZShpbmZvLnBlbmRpbmcsIDApO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmIChpbmZvLmN1cnJlbnQgIT09IGluZm8udGhlbikge1xuICAgICAgICAgICAgdXBkYXRlKGluZm8udGhlbiwgMSwgaW5mby52YWx1ZSwgcHJvbWlzZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpbmZvLnJlc29sdmVkID0gcHJvbWlzZTtcbiAgICB9XG59XG5mdW5jdGlvbiBvdXRyb19hbmRfZGVzdHJveV9ibG9jayhibG9jaywgbG9va3VwKSB7XG4gICAgdHJhbnNpdGlvbl9vdXQoYmxvY2ssIDEsIDEsICgpID0+IHtcbiAgICAgICAgbG9va3VwLmRlbGV0ZShibG9jay5rZXkpO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gdXBkYXRlX2tleWVkX2VhY2gob2xkX2Jsb2NrcywgZGlydHksIGdldF9rZXksIGR5bmFtaWMsIGN0eCwgbGlzdCwgbG9va3VwLCBub2RlLCBkZXN0cm95LCBjcmVhdGVfZWFjaF9ibG9jaywgbmV4dCwgZ2V0X2NvbnRleHQpIHtcbiAgICBsZXQgbyA9IG9sZF9ibG9ja3MubGVuZ3RoO1xuICAgIGxldCBuID0gbGlzdC5sZW5ndGg7XG4gICAgbGV0IGkgPSBvO1xuICAgIGNvbnN0IG9sZF9pbmRleGVzID0ge307XG4gICAgd2hpbGUgKGktLSlcbiAgICAgICAgb2xkX2luZGV4ZXNbb2xkX2Jsb2Nrc1tpXS5rZXldID0gaTtcbiAgICBjb25zdCBuZXdfYmxvY2tzID0gW107XG4gICAgY29uc3QgbmV3X2xvb2t1cCA9IG5ldyBNYXAoKTtcbiAgICBjb25zdCBkZWx0YXMgPSBuZXcgTWFwKCk7XG4gICAgaSA9IG47XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgICBjb25zdCBjaGlsZF9jdHggPSBnZXRfY29udGV4dChjdHgsIGxpc3QsIGkpO1xuICAgICAgICBjb25zdCBrZXkgPSBnZXRfa2V5KGNoaWxkX2N0eCk7XG4gICAgICAgIGxldCBibG9jayA9IGxvb2t1cC5nZXQoa2V5KTtcbiAgICAgICAgaWYgKCFibG9jaykge1xuICAgICAgICAgICAgYmxvY2sgPSBjcmVhdGVfZWFjaF9ibG9jayhrZXksIGNoaWxkX2N0eCk7XG4gICAgICAgICAgICBibG9jay5jKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZHluYW1pYykge1xuICAgICAgICAgICAgYmxvY2sucChjaGlsZF9jdHgsIGRpcnR5KTtcbiAgICAgICAgfVxuICAgICAgICBuZXdfbG9va3VwLnNldChrZXksIG5ld19ibG9ja3NbaV0gPSBibG9jayk7XG4gICAgICAgIGlmIChrZXkgaW4gb2xkX2luZGV4ZXMpXG4gICAgICAgICAgICBkZWx0YXMuc2V0KGtleSwgTWF0aC5hYnMoaSAtIG9sZF9pbmRleGVzW2tleV0pKTtcbiAgICB9XG4gICAgY29uc3Qgd2lsbF9tb3ZlID0gbmV3IFNldCgpO1xuICAgIGNvbnN0IGRpZF9tb3ZlID0gbmV3IFNldCgpO1xuICAgIGZ1bmN0aW9uIGluc2VydChibG9jaykge1xuICAgICAgICB0cmFuc2l0aW9uX2luKGJsb2NrLCAxKTtcbiAgICAgICAgYmxvY2subShub2RlLCBuZXh0KTtcbiAgICAgICAgbG9va3VwLnNldChibG9jay5rZXksIGJsb2NrKTtcbiAgICAgICAgbmV4dCA9IGJsb2NrLmZpcnN0O1xuICAgICAgICBuLS07XG4gICAgfVxuICAgIHdoaWxlIChvICYmIG4pIHtcbiAgICAgICAgY29uc3QgbmV3X2Jsb2NrID0gbmV3X2Jsb2Nrc1tuIC0gMV07XG4gICAgICAgIGNvbnN0IG9sZF9ibG9jayA9IG9sZF9ibG9ja3NbbyAtIDFdO1xuICAgICAgICBjb25zdCBuZXdfa2V5ID0gbmV3X2Jsb2NrLmtleTtcbiAgICAgICAgY29uc3Qgb2xkX2tleSA9IG9sZF9ibG9jay5rZXk7XG4gICAgICAgIGlmIChuZXdfYmxvY2sgPT09IG9sZF9ibG9jaykge1xuICAgICAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICAgICAgbmV4dCA9IG5ld19ibG9jay5maXJzdDtcbiAgICAgICAgICAgIG8tLTtcbiAgICAgICAgICAgIG4tLTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghbmV3X2xvb2t1cC5oYXMob2xkX2tleSkpIHtcbiAgICAgICAgICAgIC8vIHJlbW92ZSBvbGQgYmxvY2tcbiAgICAgICAgICAgIGRlc3Ryb3kob2xkX2Jsb2NrLCBsb29rdXApO1xuICAgICAgICAgICAgby0tO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFsb29rdXAuaGFzKG5ld19rZXkpIHx8IHdpbGxfbW92ZS5oYXMobmV3X2tleSkpIHtcbiAgICAgICAgICAgIGluc2VydChuZXdfYmxvY2spO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRpZF9tb3ZlLmhhcyhvbGRfa2V5KSkge1xuICAgICAgICAgICAgby0tO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRlbHRhcy5nZXQobmV3X2tleSkgPiBkZWx0YXMuZ2V0KG9sZF9rZXkpKSB7XG4gICAgICAgICAgICBkaWRfbW92ZS5hZGQobmV3X2tleSk7XG4gICAgICAgICAgICBpbnNlcnQobmV3X2Jsb2NrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHdpbGxfbW92ZS5hZGQob2xkX2tleSk7XG4gICAgICAgICAgICBvLS07XG4gICAgICAgIH1cbiAgICB9XG4gICAgd2hpbGUgKG8tLSkge1xuICAgICAgICBjb25zdCBvbGRfYmxvY2sgPSBvbGRfYmxvY2tzW29dO1xuICAgICAgICBpZiAoIW5ld19sb29rdXAuaGFzKG9sZF9ibG9jay5rZXkpKVxuICAgICAgICAgICAgZGVzdHJveShvbGRfYmxvY2ssIGxvb2t1cCk7XG4gICAgfVxuICAgIHdoaWxlIChuKVxuICAgICAgICBpbnNlcnQobmV3X2Jsb2Nrc1tuIC0gMV0pO1xuICAgIHJldHVybiBuZXdfYmxvY2tzO1xufVxuXG5mdW5jdGlvbiBnZXRfc3ByZWFkX3VwZGF0ZShsZXZlbHMsIHVwZGF0ZXMpIHtcbiAgICBjb25zdCB1cGRhdGUgPSB7fTtcbiAgICBjb25zdCB0b19udWxsX291dCA9IHt9O1xuICAgIGNvbnN0IGFjY291bnRlZF9mb3IgPSB7ICQkc2NvcGU6IDEgfTtcbiAgICBsZXQgaSA9IGxldmVscy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgICBjb25zdCBvID0gbGV2ZWxzW2ldO1xuICAgICAgICBjb25zdCBuID0gdXBkYXRlc1tpXTtcbiAgICAgICAgaWYgKG4pIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIG8pIHtcbiAgICAgICAgICAgICAgICBpZiAoIShrZXkgaW4gbikpXG4gICAgICAgICAgICAgICAgICAgIHRvX251bGxfb3V0W2tleV0gPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbikge1xuICAgICAgICAgICAgICAgIGlmICghYWNjb3VudGVkX2ZvcltrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVtrZXldID0gbltrZXldO1xuICAgICAgICAgICAgICAgICAgICBhY2NvdW50ZWRfZm9yW2tleV0gPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldmVsc1tpXSA9IG47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvKSB7XG4gICAgICAgICAgICAgICAgYWNjb3VudGVkX2ZvcltrZXldID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0b19udWxsX291dCkge1xuICAgICAgICBpZiAoIShrZXkgaW4gdXBkYXRlKSlcbiAgICAgICAgICAgIHVwZGF0ZVtrZXldID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gdXBkYXRlO1xufVxuZnVuY3Rpb24gZ2V0X3NwcmVhZF9vYmplY3Qoc3ByZWFkX3Byb3BzKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBzcHJlYWRfcHJvcHMgPT09ICdvYmplY3QnICYmIHNwcmVhZF9wcm9wcyAhPT0gbnVsbCA/IHNwcmVhZF9wcm9wcyA6IHt9O1xufVxuZnVuY3Rpb24gY3JlYXRlX2NvbXBvbmVudChibG9jaykge1xuICAgIGJsb2NrICYmIGJsb2NrLmMoKTtcbn1cbmZ1bmN0aW9uIG1vdW50X2NvbXBvbmVudChjb21wb25lbnQsIHRhcmdldCwgYW5jaG9yLCBjdXN0b21FbGVtZW50KSB7XG4gICAgY29uc3QgeyBmcmFnbWVudCwgb25fbW91bnQsIG9uX2Rlc3Ryb3ksIGFmdGVyX3VwZGF0ZSB9ID0gY29tcG9uZW50LiQkO1xuICAgIGZyYWdtZW50ICYmIGZyYWdtZW50Lm0odGFyZ2V0LCBhbmNob3IpO1xuICAgIGlmICghY3VzdG9tRWxlbWVudCkge1xuICAgICAgICAvLyBvbk1vdW50IGhhcHBlbnMgYmVmb3JlIHRoZSBpbml0aWFsIGFmdGVyVXBkYXRlXG4gICAgICAgIGFkZF9yZW5kZXJfY2FsbGJhY2soKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbmV3X29uX2Rlc3Ryb3kgPSBvbl9tb3VudC5tYXAocnVuKS5maWx0ZXIoaXNfZnVuY3Rpb24pO1xuICAgICAgICAgICAgaWYgKG9uX2Rlc3Ryb3kpIHtcbiAgICAgICAgICAgICAgICBvbl9kZXN0cm95LnB1c2goLi4ubmV3X29uX2Rlc3Ryb3kpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gRWRnZSBjYXNlIC0gY29tcG9uZW50IHdhcyBkZXN0cm95ZWQgaW1tZWRpYXRlbHksXG4gICAgICAgICAgICAgICAgLy8gbW9zdCBsaWtlbHkgYXMgYSByZXN1bHQgb2YgYSBiaW5kaW5nIGluaXRpYWxpc2luZ1xuICAgICAgICAgICAgICAgIHJ1bl9hbGwobmV3X29uX2Rlc3Ryb3kpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29tcG9uZW50LiQkLm9uX21vdW50ID0gW107XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhZnRlcl91cGRhdGUuZm9yRWFjaChhZGRfcmVuZGVyX2NhbGxiYWNrKTtcbn1cbmZ1bmN0aW9uIGRlc3Ryb3lfY29tcG9uZW50KGNvbXBvbmVudCwgZGV0YWNoaW5nKSB7XG4gICAgY29uc3QgJCQgPSBjb21wb25lbnQuJCQ7XG4gICAgaWYgKCQkLmZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgICAgIHJ1bl9hbGwoJCQub25fZGVzdHJveSk7XG4gICAgICAgICQkLmZyYWdtZW50ICYmICQkLmZyYWdtZW50LmQoZGV0YWNoaW5nKTtcbiAgICAgICAgLy8gVE9ETyBudWxsIG91dCBvdGhlciByZWZzLCBpbmNsdWRpbmcgY29tcG9uZW50LiQkIChidXQgbmVlZCB0b1xuICAgICAgICAvLyBwcmVzZXJ2ZSBmaW5hbCBzdGF0ZT8pXG4gICAgICAgICQkLm9uX2Rlc3Ryb3kgPSAkJC5mcmFnbWVudCA9IG51bGw7XG4gICAgICAgICQkLmN0eCA9IFtdO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG1ha2VfZGlydHkoY29tcG9uZW50LCBpKSB7XG4gICAgaWYgKGNvbXBvbmVudC4kJC5kaXJ0eVswXSA9PT0gLTEpIHtcbiAgICAgICAgZGlydHlfY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7XG4gICAgICAgIHNjaGVkdWxlX3VwZGF0ZSgpO1xuICAgICAgICBjb21wb25lbnQuJCQuZGlydHkuZmlsbCgwKTtcbiAgICB9XG4gICAgY29tcG9uZW50LiQkLmRpcnR5WyhpIC8gMzEpIHwgMF0gfD0gKDEgPDwgKGkgJSAzMSkpO1xufVxuZnVuY3Rpb24gaW5pdChjb21wb25lbnQsIG9wdGlvbnMsIGluc3RhbmNlLCBjcmVhdGVfZnJhZ21lbnQsIG5vdF9lcXVhbCwgcHJvcHMsIGRpcnR5ID0gWy0xXSkge1xuICAgIGNvbnN0IHBhcmVudF9jb21wb25lbnQgPSBjdXJyZW50X2NvbXBvbmVudDtcbiAgICBzZXRfY3VycmVudF9jb21wb25lbnQoY29tcG9uZW50KTtcbiAgICBjb25zdCAkJCA9IGNvbXBvbmVudC4kJCA9IHtcbiAgICAgICAgZnJhZ21lbnQ6IG51bGwsXG4gICAgICAgIGN0eDogbnVsbCxcbiAgICAgICAgLy8gc3RhdGVcbiAgICAgICAgcHJvcHMsXG4gICAgICAgIHVwZGF0ZTogbm9vcCxcbiAgICAgICAgbm90X2VxdWFsLFxuICAgICAgICBib3VuZDogYmxhbmtfb2JqZWN0KCksXG4gICAgICAgIC8vIGxpZmVjeWNsZVxuICAgICAgICBvbl9tb3VudDogW10sXG4gICAgICAgIG9uX2Rlc3Ryb3k6IFtdLFxuICAgICAgICBvbl9kaXNjb25uZWN0OiBbXSxcbiAgICAgICAgYmVmb3JlX3VwZGF0ZTogW10sXG4gICAgICAgIGFmdGVyX3VwZGF0ZTogW10sXG4gICAgICAgIGNvbnRleHQ6IG5ldyBNYXAocGFyZW50X2NvbXBvbmVudCA/IHBhcmVudF9jb21wb25lbnQuJCQuY29udGV4dCA6IFtdKSxcbiAgICAgICAgLy8gZXZlcnl0aGluZyBlbHNlXG4gICAgICAgIGNhbGxiYWNrczogYmxhbmtfb2JqZWN0KCksXG4gICAgICAgIGRpcnR5LFxuICAgICAgICBza2lwX2JvdW5kOiBmYWxzZVxuICAgIH07XG4gICAgbGV0IHJlYWR5ID0gZmFsc2U7XG4gICAgJCQuY3R4ID0gaW5zdGFuY2VcbiAgICAgICAgPyBpbnN0YW5jZShjb21wb25lbnQsIG9wdGlvbnMucHJvcHMgfHwge30sIChpLCByZXQsIC4uLnJlc3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcmVzdC5sZW5ndGggPyByZXN0WzBdIDogcmV0O1xuICAgICAgICAgICAgaWYgKCQkLmN0eCAmJiBub3RfZXF1YWwoJCQuY3R4W2ldLCAkJC5jdHhbaV0gPSB2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoISQkLnNraXBfYm91bmQgJiYgJCQuYm91bmRbaV0pXG4gICAgICAgICAgICAgICAgICAgICQkLmJvdW5kW2ldKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAocmVhZHkpXG4gICAgICAgICAgICAgICAgICAgIG1ha2VfZGlydHkoY29tcG9uZW50LCBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH0pXG4gICAgICAgIDogW107XG4gICAgJCQudXBkYXRlKCk7XG4gICAgcmVhZHkgPSB0cnVlO1xuICAgIHJ1bl9hbGwoJCQuYmVmb3JlX3VwZGF0ZSk7XG4gICAgLy8gYGZhbHNlYCBhcyBhIHNwZWNpYWwgY2FzZSBvZiBubyBET00gY29tcG9uZW50XG4gICAgJCQuZnJhZ21lbnQgPSBjcmVhdGVfZnJhZ21lbnQgPyBjcmVhdGVfZnJhZ21lbnQoJCQuY3R4KSA6IGZhbHNlO1xuICAgIGlmIChvcHRpb25zLnRhcmdldCkge1xuICAgICAgICBpZiAob3B0aW9ucy5oeWRyYXRlKSB7XG4gICAgICAgICAgICBjb25zdCBub2RlcyA9IGNoaWxkcmVuKG9wdGlvbnMudGFyZ2V0KTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgICAgICAgICAkJC5mcmFnbWVudCAmJiAkJC5mcmFnbWVudC5sKG5vZGVzKTtcbiAgICAgICAgICAgIG5vZGVzLmZvckVhY2goZGV0YWNoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgICAgICAgICAkJC5mcmFnbWVudCAmJiAkJC5mcmFnbWVudC5jKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuaW50cm8pXG4gICAgICAgICAgICB0cmFuc2l0aW9uX2luKGNvbXBvbmVudC4kJC5mcmFnbWVudCk7XG4gICAgICAgIG1vdW50X2NvbXBvbmVudChjb21wb25lbnQsIG9wdGlvbnMudGFyZ2V0LCBvcHRpb25zLmFuY2hvciwgb3B0aW9ucy5jdXN0b21FbGVtZW50KTtcbiAgICAgICAgZmx1c2goKTtcbiAgICB9XG4gICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KHBhcmVudF9jb21wb25lbnQpO1xufVxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBTdmVsdGUgY29tcG9uZW50cy4gVXNlZCB3aGVuIGRldj1mYWxzZS5cbiAqL1xuY2xhc3MgU3ZlbHRlQ29tcG9uZW50IHtcbiAgICAkZGVzdHJveSgpIHtcbiAgICAgICAgZGVzdHJveV9jb21wb25lbnQodGhpcywgMSk7XG4gICAgICAgIHRoaXMuJGRlc3Ryb3kgPSBub29wO1xuICAgIH1cbiAgICAkb24odHlwZSwgY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgY2FsbGJhY2tzID0gKHRoaXMuJCQuY2FsbGJhY2tzW3R5cGVdIHx8ICh0aGlzLiQkLmNhbGxiYWNrc1t0eXBlXSA9IFtdKSk7XG4gICAgICAgIGNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gY2FsbGJhY2tzLmluZGV4T2YoY2FsbGJhY2spO1xuICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSlcbiAgICAgICAgICAgICAgICBjYWxsYmFja3Muc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgJHNldCgkJHByb3BzKSB7XG4gICAgICAgIGlmICh0aGlzLiQkc2V0ICYmICFpc19lbXB0eSgkJHByb3BzKSkge1xuICAgICAgICAgICAgdGhpcy4kJC5za2lwX2JvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuJCRzZXQoJCRwcm9wcyk7XG4gICAgICAgICAgICB0aGlzLiQkLnNraXBfYm91bmQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBkYXRlVUlEIGlzIGEgd2F5IG9mIHdlZWtseSBpZGVudGlmeWluZyBkYWlseS93ZWVrbHkvbW9udGhseSBub3Rlcy5cbiAqIFRoZXkgYXJlIHByZWZpeGVkIHdpdGggdGhlIGdyYW51bGFyaXR5IHRvIGF2b2lkIGFtYmlndWl0eS5cbiAqL1xuZnVuY3Rpb24gZ2V0RGF0ZVVJRChkYXRlLCBncmFudWxhcml0eSA9IFwiZGF5XCIpIHtcbiAgICBjb25zdCB0cyA9IGRhdGUuY2xvbmUoKS5zdGFydE9mKGdyYW51bGFyaXR5KS5mb3JtYXQoKTtcbiAgICByZXR1cm4gYCR7Z3JhbnVsYXJpdHl9LSR7dHN9YDtcbn1cbnZhciBnZXREYXRlVUlEXzEgPSBnZXREYXRlVUlEO1xuXG4vKiBzcmMvY29tcG9uZW50cy9Eb3Quc3ZlbHRlIGdlbmVyYXRlZCBieSBTdmVsdGUgdjMuMzUuMCAqL1xuXG5mdW5jdGlvbiBhZGRfY3NzJDUoKSB7XG5cdHZhciBzdHlsZSA9IGVsZW1lbnQoXCJzdHlsZVwiKTtcblx0c3R5bGUuaWQgPSBcInN2ZWx0ZS0xd2lkdnpxLXN0eWxlXCI7XG5cdHN0eWxlLnRleHRDb250ZW50ID0gXCIuZG90LnN2ZWx0ZS0xd2lkdnpxLC5ob2xsb3cuc3ZlbHRlLTF3aWR2enF7ZGlzcGxheTppbmxpbmUtYmxvY2s7aGVpZ2h0OjZweDt3aWR0aDo2cHg7bWFyZ2luOjAgMXB4fS5maWxsZWQuc3ZlbHRlLTF3aWR2enF7ZmlsbDp2YXIoLS1jb2xvci1kb3QpfS5hY3RpdmUuZmlsbGVkLnN2ZWx0ZS0xd2lkdnpxe2ZpbGw6dmFyKC0tdGV4dC1vbi1hY2NlbnQpfS5ob2xsb3cuc3ZlbHRlLTF3aWR2enF7ZmlsbDpub25lO3N0cm9rZTp2YXIoLS1jb2xvci1kb3QpfS5hY3RpdmUuaG9sbG93LnN2ZWx0ZS0xd2lkdnpxe2ZpbGw6bm9uZTtzdHJva2U6dmFyKC0tdGV4dC1vbi1hY2NlbnQpfVwiO1xuXHRhcHBlbmQoZG9jdW1lbnQuaGVhZCwgc3R5bGUpO1xufVxuXG4vLyAoMTQ6MCkgezplbHNlfVxuZnVuY3Rpb24gY3JlYXRlX2Vsc2VfYmxvY2skMShjdHgpIHtcblx0bGV0IHN2Zztcblx0bGV0IGNpcmNsZTtcblx0bGV0IHN2Z19jbGFzc192YWx1ZTtcblxuXHRyZXR1cm4ge1xuXHRcdGMoKSB7XG5cdFx0XHRzdmcgPSBzdmdfZWxlbWVudChcInN2Z1wiKTtcblx0XHRcdGNpcmNsZSA9IHN2Z19lbGVtZW50KFwiY2lyY2xlXCIpO1xuXHRcdFx0YXR0cihjaXJjbGUsIFwiY3hcIiwgXCIzXCIpO1xuXHRcdFx0YXR0cihjaXJjbGUsIFwiY3lcIiwgXCIzXCIpO1xuXHRcdFx0YXR0cihjaXJjbGUsIFwiclwiLCBcIjJcIik7XG5cdFx0XHRhdHRyKHN2ZywgXCJjbGFzc1wiLCBzdmdfY2xhc3NfdmFsdWUgPSBcIlwiICsgKG51bGxfdG9fZW1wdHkoYGhvbGxvdyAkey8qY2xhc3NOYW1lKi8gY3R4WzBdfWApICsgXCIgc3ZlbHRlLTF3aWR2enFcIikpO1xuXHRcdFx0YXR0cihzdmcsIFwidmlld0JveFwiLCBcIjAgMCA2IDZcIik7XG5cdFx0XHRhdHRyKHN2ZywgXCJ4bWxuc1wiLCBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIpO1xuXHRcdFx0dG9nZ2xlX2NsYXNzKHN2ZywgXCJhY3RpdmVcIiwgLyppc0FjdGl2ZSovIGN0eFsyXSk7XG5cdFx0fSxcblx0XHRtKHRhcmdldCwgYW5jaG9yKSB7XG5cdFx0XHRpbnNlcnQodGFyZ2V0LCBzdmcsIGFuY2hvcik7XG5cdFx0XHRhcHBlbmQoc3ZnLCBjaXJjbGUpO1xuXHRcdH0sXG5cdFx0cChjdHgsIGRpcnR5KSB7XG5cdFx0XHRpZiAoZGlydHkgJiAvKmNsYXNzTmFtZSovIDEgJiYgc3ZnX2NsYXNzX3ZhbHVlICE9PSAoc3ZnX2NsYXNzX3ZhbHVlID0gXCJcIiArIChudWxsX3RvX2VtcHR5KGBob2xsb3cgJHsvKmNsYXNzTmFtZSovIGN0eFswXX1gKSArIFwiIHN2ZWx0ZS0xd2lkdnpxXCIpKSkge1xuXHRcdFx0XHRhdHRyKHN2ZywgXCJjbGFzc1wiLCBzdmdfY2xhc3NfdmFsdWUpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoZGlydHkgJiAvKmNsYXNzTmFtZSwgaXNBY3RpdmUqLyA1KSB7XG5cdFx0XHRcdHRvZ2dsZV9jbGFzcyhzdmcsIFwiYWN0aXZlXCIsIC8qaXNBY3RpdmUqLyBjdHhbMl0pO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0ZChkZXRhY2hpbmcpIHtcblx0XHRcdGlmIChkZXRhY2hpbmcpIGRldGFjaChzdmcpO1xuXHRcdH1cblx0fTtcbn1cblxuLy8gKDY6MCkgeyNpZiBpc0ZpbGxlZH1cbmZ1bmN0aW9uIGNyZWF0ZV9pZl9ibG9jayQyKGN0eCkge1xuXHRsZXQgc3ZnO1xuXHRsZXQgY2lyY2xlO1xuXHRsZXQgc3ZnX2NsYXNzX3ZhbHVlO1xuXG5cdHJldHVybiB7XG5cdFx0YygpIHtcblx0XHRcdHN2ZyA9IHN2Z19lbGVtZW50KFwic3ZnXCIpO1xuXHRcdFx0Y2lyY2xlID0gc3ZnX2VsZW1lbnQoXCJjaXJjbGVcIik7XG5cdFx0XHRhdHRyKGNpcmNsZSwgXCJjeFwiLCBcIjNcIik7XG5cdFx0XHRhdHRyKGNpcmNsZSwgXCJjeVwiLCBcIjNcIik7XG5cdFx0XHRhdHRyKGNpcmNsZSwgXCJyXCIsIFwiMlwiKTtcblx0XHRcdGF0dHIoc3ZnLCBcImNsYXNzXCIsIHN2Z19jbGFzc192YWx1ZSA9IFwiXCIgKyAobnVsbF90b19lbXB0eShgZG90IGZpbGxlZCAkey8qY2xhc3NOYW1lKi8gY3R4WzBdfWApICsgXCIgc3ZlbHRlLTF3aWR2enFcIikpO1xuXHRcdFx0YXR0cihzdmcsIFwidmlld0JveFwiLCBcIjAgMCA2IDZcIik7XG5cdFx0XHRhdHRyKHN2ZywgXCJ4bWxuc1wiLCBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIpO1xuXHRcdFx0dG9nZ2xlX2NsYXNzKHN2ZywgXCJhY3RpdmVcIiwgLyppc0FjdGl2ZSovIGN0eFsyXSk7XG5cdFx0fSxcblx0XHRtKHRhcmdldCwgYW5jaG9yKSB7XG5cdFx0XHRpbnNlcnQodGFyZ2V0LCBzdmcsIGFuY2hvcik7XG5cdFx0XHRhcHBlbmQoc3ZnLCBjaXJjbGUpO1xuXHRcdH0sXG5cdFx0cChjdHgsIGRpcnR5KSB7XG5cdFx0XHRpZiAoZGlydHkgJiAvKmNsYXNzTmFtZSovIDEgJiYgc3ZnX2NsYXNzX3ZhbHVlICE9PSAoc3ZnX2NsYXNzX3ZhbHVlID0gXCJcIiArIChudWxsX3RvX2VtcHR5KGBkb3QgZmlsbGVkICR7LypjbGFzc05hbWUqLyBjdHhbMF19YCkgKyBcIiBzdmVsdGUtMXdpZHZ6cVwiKSkpIHtcblx0XHRcdFx0YXR0cihzdmcsIFwiY2xhc3NcIiwgc3ZnX2NsYXNzX3ZhbHVlKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGRpcnR5ICYgLypjbGFzc05hbWUsIGlzQWN0aXZlKi8gNSkge1xuXHRcdFx0XHR0b2dnbGVfY2xhc3Moc3ZnLCBcImFjdGl2ZVwiLCAvKmlzQWN0aXZlKi8gY3R4WzJdKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdGQoZGV0YWNoaW5nKSB7XG5cdFx0XHRpZiAoZGV0YWNoaW5nKSBkZXRhY2goc3ZnKTtcblx0XHR9XG5cdH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZV9mcmFnbWVudCQ2KGN0eCkge1xuXHRsZXQgaWZfYmxvY2tfYW5jaG9yO1xuXG5cdGZ1bmN0aW9uIHNlbGVjdF9ibG9ja190eXBlKGN0eCwgZGlydHkpIHtcblx0XHRpZiAoLyppc0ZpbGxlZCovIGN0eFsxXSkgcmV0dXJuIGNyZWF0ZV9pZl9ibG9jayQyO1xuXHRcdHJldHVybiBjcmVhdGVfZWxzZV9ibG9jayQxO1xuXHR9XG5cblx0bGV0IGN1cnJlbnRfYmxvY2tfdHlwZSA9IHNlbGVjdF9ibG9ja190eXBlKGN0eCk7XG5cdGxldCBpZl9ibG9jayA9IGN1cnJlbnRfYmxvY2tfdHlwZShjdHgpO1xuXG5cdHJldHVybiB7XG5cdFx0YygpIHtcblx0XHRcdGlmX2Jsb2NrLmMoKTtcblx0XHRcdGlmX2Jsb2NrX2FuY2hvciA9IGVtcHR5KCk7XG5cdFx0fSxcblx0XHRtKHRhcmdldCwgYW5jaG9yKSB7XG5cdFx0XHRpZl9ibG9jay5tKHRhcmdldCwgYW5jaG9yKTtcblx0XHRcdGluc2VydCh0YXJnZXQsIGlmX2Jsb2NrX2FuY2hvciwgYW5jaG9yKTtcblx0XHR9LFxuXHRcdHAoY3R4LCBbZGlydHldKSB7XG5cdFx0XHRpZiAoY3VycmVudF9ibG9ja190eXBlID09PSAoY3VycmVudF9ibG9ja190eXBlID0gc2VsZWN0X2Jsb2NrX3R5cGUoY3R4KSkgJiYgaWZfYmxvY2spIHtcblx0XHRcdFx0aWZfYmxvY2sucChjdHgsIGRpcnR5KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmX2Jsb2NrLmQoMSk7XG5cdFx0XHRcdGlmX2Jsb2NrID0gY3VycmVudF9ibG9ja190eXBlKGN0eCk7XG5cblx0XHRcdFx0aWYgKGlmX2Jsb2NrKSB7XG5cdFx0XHRcdFx0aWZfYmxvY2suYygpO1xuXHRcdFx0XHRcdGlmX2Jsb2NrLm0oaWZfYmxvY2tfYW5jaG9yLnBhcmVudE5vZGUsIGlmX2Jsb2NrX2FuY2hvcik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdGk6IG5vb3AsXG5cdFx0bzogbm9vcCxcblx0XHRkKGRldGFjaGluZykge1xuXHRcdFx0aWZfYmxvY2suZChkZXRhY2hpbmcpO1xuXHRcdFx0aWYgKGRldGFjaGluZykgZGV0YWNoKGlmX2Jsb2NrX2FuY2hvcik7XG5cdFx0fVxuXHR9O1xufVxuXG5mdW5jdGlvbiBpbnN0YW5jZSQ2KCQkc2VsZiwgJCRwcm9wcywgJCRpbnZhbGlkYXRlKSB7XG5cdGxldCB7IGNsYXNzTmFtZSA9IFwiXCIgfSA9ICQkcHJvcHM7XG5cdGxldCB7IGlzRmlsbGVkIH0gPSAkJHByb3BzO1xuXHRsZXQgeyBpc0FjdGl2ZSB9ID0gJCRwcm9wcztcblxuXHQkJHNlbGYuJCRzZXQgPSAkJHByb3BzID0+IHtcblx0XHRpZiAoXCJjbGFzc05hbWVcIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoMCwgY2xhc3NOYW1lID0gJCRwcm9wcy5jbGFzc05hbWUpO1xuXHRcdGlmIChcImlzRmlsbGVkXCIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDEsIGlzRmlsbGVkID0gJCRwcm9wcy5pc0ZpbGxlZCk7XG5cdFx0aWYgKFwiaXNBY3RpdmVcIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoMiwgaXNBY3RpdmUgPSAkJHByb3BzLmlzQWN0aXZlKTtcblx0fTtcblxuXHRyZXR1cm4gW2NsYXNzTmFtZSwgaXNGaWxsZWQsIGlzQWN0aXZlXTtcbn1cblxuY2xhc3MgRG90IGV4dGVuZHMgU3ZlbHRlQ29tcG9uZW50IHtcblx0Y29uc3RydWN0b3Iob3B0aW9ucykge1xuXHRcdHN1cGVyKCk7XG5cdFx0aWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInN2ZWx0ZS0xd2lkdnpxLXN0eWxlXCIpKSBhZGRfY3NzJDUoKTtcblx0XHRpbml0KHRoaXMsIG9wdGlvbnMsIGluc3RhbmNlJDYsIGNyZWF0ZV9mcmFnbWVudCQ2LCBzYWZlX25vdF9lcXVhbCwgeyBjbGFzc05hbWU6IDAsIGlzRmlsbGVkOiAxLCBpc0FjdGl2ZTogMiB9KTtcblx0fVxufVxuXG4vKiBzcmMvY29tcG9uZW50cy9NZXRhZGF0YVJlc29sdmVyLnN2ZWx0ZSBnZW5lcmF0ZWQgYnkgU3ZlbHRlIHYzLjM1LjAgKi9cblxuY29uc3QgZ2V0X2RlZmF1bHRfc2xvdF9jaGFuZ2VzXzEgPSBkaXJ0eSA9PiAoe30pO1xuY29uc3QgZ2V0X2RlZmF1bHRfc2xvdF9jb250ZXh0XzEgPSBjdHggPT4gKHsgbWV0YWRhdGE6IG51bGwgfSk7XG5jb25zdCBnZXRfZGVmYXVsdF9zbG90X2NoYW5nZXMgPSBkaXJ0eSA9PiAoeyBtZXRhZGF0YTogZGlydHkgJiAvKm1ldGFkYXRhKi8gMSB9KTtcbmNvbnN0IGdldF9kZWZhdWx0X3Nsb3RfY29udGV4dCA9IGN0eCA9PiAoeyBtZXRhZGF0YTogLypyZXNvbHZlZE1ldGEqLyBjdHhbM10gfSk7XG5cbi8vICgxMTowKSB7OmVsc2V9XG5mdW5jdGlvbiBjcmVhdGVfZWxzZV9ibG9jayhjdHgpIHtcblx0bGV0IGN1cnJlbnQ7XG5cdGNvbnN0IGRlZmF1bHRfc2xvdF90ZW1wbGF0ZSA9IC8qI3Nsb3RzKi8gY3R4WzJdLmRlZmF1bHQ7XG5cdGNvbnN0IGRlZmF1bHRfc2xvdCA9IGNyZWF0ZV9zbG90KGRlZmF1bHRfc2xvdF90ZW1wbGF0ZSwgY3R4LCAvKiQkc2NvcGUqLyBjdHhbMV0sIGdldF9kZWZhdWx0X3Nsb3RfY29udGV4dF8xKTtcblxuXHRyZXR1cm4ge1xuXHRcdGMoKSB7XG5cdFx0XHRpZiAoZGVmYXVsdF9zbG90KSBkZWZhdWx0X3Nsb3QuYygpO1xuXHRcdH0sXG5cdFx0bSh0YXJnZXQsIGFuY2hvcikge1xuXHRcdFx0aWYgKGRlZmF1bHRfc2xvdCkge1xuXHRcdFx0XHRkZWZhdWx0X3Nsb3QubSh0YXJnZXQsIGFuY2hvcik7XG5cdFx0XHR9XG5cblx0XHRcdGN1cnJlbnQgPSB0cnVlO1xuXHRcdH0sXG5cdFx0cChjdHgsIGRpcnR5KSB7XG5cdFx0XHRpZiAoZGVmYXVsdF9zbG90KSB7XG5cdFx0XHRcdGlmIChkZWZhdWx0X3Nsb3QucCAmJiBkaXJ0eSAmIC8qJCRzY29wZSovIDIpIHtcblx0XHRcdFx0XHR1cGRhdGVfc2xvdChkZWZhdWx0X3Nsb3QsIGRlZmF1bHRfc2xvdF90ZW1wbGF0ZSwgY3R4LCAvKiQkc2NvcGUqLyBjdHhbMV0sIGRpcnR5LCBnZXRfZGVmYXVsdF9zbG90X2NoYW5nZXNfMSwgZ2V0X2RlZmF1bHRfc2xvdF9jb250ZXh0XzEpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRpKGxvY2FsKSB7XG5cdFx0XHRpZiAoY3VycmVudCkgcmV0dXJuO1xuXHRcdFx0dHJhbnNpdGlvbl9pbihkZWZhdWx0X3Nsb3QsIGxvY2FsKTtcblx0XHRcdGN1cnJlbnQgPSB0cnVlO1xuXHRcdH0sXG5cdFx0byhsb2NhbCkge1xuXHRcdFx0dHJhbnNpdGlvbl9vdXQoZGVmYXVsdF9zbG90LCBsb2NhbCk7XG5cdFx0XHRjdXJyZW50ID0gZmFsc2U7XG5cdFx0fSxcblx0XHRkKGRldGFjaGluZykge1xuXHRcdFx0aWYgKGRlZmF1bHRfc2xvdCkgZGVmYXVsdF9zbG90LmQoZGV0YWNoaW5nKTtcblx0XHR9XG5cdH07XG59XG5cbi8vICg3OjApIHsjaWYgbWV0YWRhdGF9XG5mdW5jdGlvbiBjcmVhdGVfaWZfYmxvY2skMShjdHgpIHtcblx0bGV0IGF3YWl0X2Jsb2NrX2FuY2hvcjtcblx0bGV0IHByb21pc2U7XG5cdGxldCBjdXJyZW50O1xuXG5cdGxldCBpbmZvID0ge1xuXHRcdGN0eCxcblx0XHRjdXJyZW50OiBudWxsLFxuXHRcdHRva2VuOiBudWxsLFxuXHRcdGhhc0NhdGNoOiBmYWxzZSxcblx0XHRwZW5kaW5nOiBjcmVhdGVfcGVuZGluZ19ibG9jayxcblx0XHR0aGVuOiBjcmVhdGVfdGhlbl9ibG9jayxcblx0XHRjYXRjaDogY3JlYXRlX2NhdGNoX2Jsb2NrLFxuXHRcdHZhbHVlOiAzLFxuXHRcdGJsb2NrczogWywsLF1cblx0fTtcblxuXHRoYW5kbGVfcHJvbWlzZShwcm9taXNlID0gLyptZXRhZGF0YSovIGN0eFswXSwgaW5mbyk7XG5cblx0cmV0dXJuIHtcblx0XHRjKCkge1xuXHRcdFx0YXdhaXRfYmxvY2tfYW5jaG9yID0gZW1wdHkoKTtcblx0XHRcdGluZm8uYmxvY2suYygpO1xuXHRcdH0sXG5cdFx0bSh0YXJnZXQsIGFuY2hvcikge1xuXHRcdFx0aW5zZXJ0KHRhcmdldCwgYXdhaXRfYmxvY2tfYW5jaG9yLCBhbmNob3IpO1xuXHRcdFx0aW5mby5ibG9jay5tKHRhcmdldCwgaW5mby5hbmNob3IgPSBhbmNob3IpO1xuXHRcdFx0aW5mby5tb3VudCA9ICgpID0+IGF3YWl0X2Jsb2NrX2FuY2hvci5wYXJlbnROb2RlO1xuXHRcdFx0aW5mby5hbmNob3IgPSBhd2FpdF9ibG9ja19hbmNob3I7XG5cdFx0XHRjdXJyZW50ID0gdHJ1ZTtcblx0XHR9LFxuXHRcdHAobmV3X2N0eCwgZGlydHkpIHtcblx0XHRcdGN0eCA9IG5ld19jdHg7XG5cdFx0XHRpbmZvLmN0eCA9IGN0eDtcblxuXHRcdFx0aWYgKGRpcnR5ICYgLyptZXRhZGF0YSovIDEgJiYgcHJvbWlzZSAhPT0gKHByb21pc2UgPSAvKm1ldGFkYXRhKi8gY3R4WzBdKSAmJiBoYW5kbGVfcHJvbWlzZShwcm9taXNlLCBpbmZvKSkgOyBlbHNlIHtcblx0XHRcdFx0Y29uc3QgY2hpbGRfY3R4ID0gY3R4LnNsaWNlKCk7XG5cdFx0XHRcdGNoaWxkX2N0eFszXSA9IGluZm8ucmVzb2x2ZWQ7XG5cdFx0XHRcdGluZm8uYmxvY2sucChjaGlsZF9jdHgsIGRpcnR5KTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdGkobG9jYWwpIHtcblx0XHRcdGlmIChjdXJyZW50KSByZXR1cm47XG5cdFx0XHR0cmFuc2l0aW9uX2luKGluZm8uYmxvY2spO1xuXHRcdFx0Y3VycmVudCA9IHRydWU7XG5cdFx0fSxcblx0XHRvKGxvY2FsKSB7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IDM7IGkgKz0gMSkge1xuXHRcdFx0XHRjb25zdCBibG9jayA9IGluZm8uYmxvY2tzW2ldO1xuXHRcdFx0XHR0cmFuc2l0aW9uX291dChibG9jayk7XG5cdFx0XHR9XG5cblx0XHRcdGN1cnJlbnQgPSBmYWxzZTtcblx0XHR9LFxuXHRcdGQoZGV0YWNoaW5nKSB7XG5cdFx0XHRpZiAoZGV0YWNoaW5nKSBkZXRhY2goYXdhaXRfYmxvY2tfYW5jaG9yKTtcblx0XHRcdGluZm8uYmxvY2suZChkZXRhY2hpbmcpO1xuXHRcdFx0aW5mby50b2tlbiA9IG51bGw7XG5cdFx0XHRpbmZvID0gbnVsbDtcblx0XHR9XG5cdH07XG59XG5cbi8vICgxOjApIDxzdmVsdGU6b3B0aW9ucyBpbW11dGFibGUgLz4gIDxzY3JpcHQgbGFuZz1cInRzXCI+OyBleHBvcnQgbGV0IG1ldGFkYXRhOyA8L3NjcmlwdD4gIHsjaWYgbWV0YWRhdGF9XG5mdW5jdGlvbiBjcmVhdGVfY2F0Y2hfYmxvY2soY3R4KSB7XG5cdHJldHVybiB7XG5cdFx0Yzogbm9vcCxcblx0XHRtOiBub29wLFxuXHRcdHA6IG5vb3AsXG5cdFx0aTogbm9vcCxcblx0XHRvOiBub29wLFxuXHRcdGQ6IG5vb3Bcblx0fTtcbn1cblxuLy8gKDg6MzcpICAgICAgPHNsb3QgbWV0YWRhdGE9XCJ7cmVzb2x2ZWRNZXRhfVxuZnVuY3Rpb24gY3JlYXRlX3RoZW5fYmxvY2soY3R4KSB7XG5cdGxldCBjdXJyZW50O1xuXHRjb25zdCBkZWZhdWx0X3Nsb3RfdGVtcGxhdGUgPSAvKiNzbG90cyovIGN0eFsyXS5kZWZhdWx0O1xuXHRjb25zdCBkZWZhdWx0X3Nsb3QgPSBjcmVhdGVfc2xvdChkZWZhdWx0X3Nsb3RfdGVtcGxhdGUsIGN0eCwgLyokJHNjb3BlKi8gY3R4WzFdLCBnZXRfZGVmYXVsdF9zbG90X2NvbnRleHQpO1xuXG5cdHJldHVybiB7XG5cdFx0YygpIHtcblx0XHRcdGlmIChkZWZhdWx0X3Nsb3QpIGRlZmF1bHRfc2xvdC5jKCk7XG5cdFx0fSxcblx0XHRtKHRhcmdldCwgYW5jaG9yKSB7XG5cdFx0XHRpZiAoZGVmYXVsdF9zbG90KSB7XG5cdFx0XHRcdGRlZmF1bHRfc2xvdC5tKHRhcmdldCwgYW5jaG9yKTtcblx0XHRcdH1cblxuXHRcdFx0Y3VycmVudCA9IHRydWU7XG5cdFx0fSxcblx0XHRwKGN0eCwgZGlydHkpIHtcblx0XHRcdGlmIChkZWZhdWx0X3Nsb3QpIHtcblx0XHRcdFx0aWYgKGRlZmF1bHRfc2xvdC5wICYmIGRpcnR5ICYgLyokJHNjb3BlLCBtZXRhZGF0YSovIDMpIHtcblx0XHRcdFx0XHR1cGRhdGVfc2xvdChkZWZhdWx0X3Nsb3QsIGRlZmF1bHRfc2xvdF90ZW1wbGF0ZSwgY3R4LCAvKiQkc2NvcGUqLyBjdHhbMV0sIGRpcnR5LCBnZXRfZGVmYXVsdF9zbG90X2NoYW5nZXMsIGdldF9kZWZhdWx0X3Nsb3RfY29udGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdGkobG9jYWwpIHtcblx0XHRcdGlmIChjdXJyZW50KSByZXR1cm47XG5cdFx0XHR0cmFuc2l0aW9uX2luKGRlZmF1bHRfc2xvdCwgbG9jYWwpO1xuXHRcdFx0Y3VycmVudCA9IHRydWU7XG5cdFx0fSxcblx0XHRvKGxvY2FsKSB7XG5cdFx0XHR0cmFuc2l0aW9uX291dChkZWZhdWx0X3Nsb3QsIGxvY2FsKTtcblx0XHRcdGN1cnJlbnQgPSBmYWxzZTtcblx0XHR9LFxuXHRcdGQoZGV0YWNoaW5nKSB7XG5cdFx0XHRpZiAoZGVmYXVsdF9zbG90KSBkZWZhdWx0X3Nsb3QuZChkZXRhY2hpbmcpO1xuXHRcdH1cblx0fTtcbn1cblxuLy8gKDE6MCkgPHN2ZWx0ZTpvcHRpb25zIGltbXV0YWJsZSAvPiAgPHNjcmlwdCBsYW5nPVwidHNcIj47IGV4cG9ydCBsZXQgbWV0YWRhdGE7IDwvc2NyaXB0PiAgeyNpZiBtZXRhZGF0YX1cbmZ1bmN0aW9uIGNyZWF0ZV9wZW5kaW5nX2Jsb2NrKGN0eCkge1xuXHRyZXR1cm4ge1xuXHRcdGM6IG5vb3AsXG5cdFx0bTogbm9vcCxcblx0XHRwOiBub29wLFxuXHRcdGk6IG5vb3AsXG5cdFx0bzogbm9vcCxcblx0XHRkOiBub29wXG5cdH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZV9mcmFnbWVudCQ1KGN0eCkge1xuXHRsZXQgY3VycmVudF9ibG9ja190eXBlX2luZGV4O1xuXHRsZXQgaWZfYmxvY2s7XG5cdGxldCBpZl9ibG9ja19hbmNob3I7XG5cdGxldCBjdXJyZW50O1xuXHRjb25zdCBpZl9ibG9ja19jcmVhdG9ycyA9IFtjcmVhdGVfaWZfYmxvY2skMSwgY3JlYXRlX2Vsc2VfYmxvY2tdO1xuXHRjb25zdCBpZl9ibG9ja3MgPSBbXTtcblxuXHRmdW5jdGlvbiBzZWxlY3RfYmxvY2tfdHlwZShjdHgsIGRpcnR5KSB7XG5cdFx0aWYgKC8qbWV0YWRhdGEqLyBjdHhbMF0pIHJldHVybiAwO1xuXHRcdHJldHVybiAxO1xuXHR9XG5cblx0Y3VycmVudF9ibG9ja190eXBlX2luZGV4ID0gc2VsZWN0X2Jsb2NrX3R5cGUoY3R4KTtcblx0aWZfYmxvY2sgPSBpZl9ibG9ja3NbY3VycmVudF9ibG9ja190eXBlX2luZGV4XSA9IGlmX2Jsb2NrX2NyZWF0b3JzW2N1cnJlbnRfYmxvY2tfdHlwZV9pbmRleF0oY3R4KTtcblxuXHRyZXR1cm4ge1xuXHRcdGMoKSB7XG5cdFx0XHRpZl9ibG9jay5jKCk7XG5cdFx0XHRpZl9ibG9ja19hbmNob3IgPSBlbXB0eSgpO1xuXHRcdH0sXG5cdFx0bSh0YXJnZXQsIGFuY2hvcikge1xuXHRcdFx0aWZfYmxvY2tzW2N1cnJlbnRfYmxvY2tfdHlwZV9pbmRleF0ubSh0YXJnZXQsIGFuY2hvcik7XG5cdFx0XHRpbnNlcnQodGFyZ2V0LCBpZl9ibG9ja19hbmNob3IsIGFuY2hvcik7XG5cdFx0XHRjdXJyZW50ID0gdHJ1ZTtcblx0XHR9LFxuXHRcdHAoY3R4LCBbZGlydHldKSB7XG5cdFx0XHRsZXQgcHJldmlvdXNfYmxvY2tfaW5kZXggPSBjdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXg7XG5cdFx0XHRjdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXggPSBzZWxlY3RfYmxvY2tfdHlwZShjdHgpO1xuXG5cdFx0XHRpZiAoY3VycmVudF9ibG9ja190eXBlX2luZGV4ID09PSBwcmV2aW91c19ibG9ja19pbmRleCkge1xuXHRcdFx0XHRpZl9ibG9ja3NbY3VycmVudF9ibG9ja190eXBlX2luZGV4XS5wKGN0eCwgZGlydHkpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Z3JvdXBfb3V0cm9zKCk7XG5cblx0XHRcdFx0dHJhbnNpdGlvbl9vdXQoaWZfYmxvY2tzW3ByZXZpb3VzX2Jsb2NrX2luZGV4XSwgMSwgMSwgKCkgPT4ge1xuXHRcdFx0XHRcdGlmX2Jsb2Nrc1twcmV2aW91c19ibG9ja19pbmRleF0gPSBudWxsO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRjaGVja19vdXRyb3MoKTtcblx0XHRcdFx0aWZfYmxvY2sgPSBpZl9ibG9ja3NbY3VycmVudF9ibG9ja190eXBlX2luZGV4XTtcblxuXHRcdFx0XHRpZiAoIWlmX2Jsb2NrKSB7XG5cdFx0XHRcdFx0aWZfYmxvY2sgPSBpZl9ibG9ja3NbY3VycmVudF9ibG9ja190eXBlX2luZGV4XSA9IGlmX2Jsb2NrX2NyZWF0b3JzW2N1cnJlbnRfYmxvY2tfdHlwZV9pbmRleF0oY3R4KTtcblx0XHRcdFx0XHRpZl9ibG9jay5jKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aWZfYmxvY2sucChjdHgsIGRpcnR5KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRyYW5zaXRpb25faW4oaWZfYmxvY2ssIDEpO1xuXHRcdFx0XHRpZl9ibG9jay5tKGlmX2Jsb2NrX2FuY2hvci5wYXJlbnROb2RlLCBpZl9ibG9ja19hbmNob3IpO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0aShsb2NhbCkge1xuXHRcdFx0aWYgKGN1cnJlbnQpIHJldHVybjtcblx0XHRcdHRyYW5zaXRpb25faW4oaWZfYmxvY2spO1xuXHRcdFx0Y3VycmVudCA9IHRydWU7XG5cdFx0fSxcblx0XHRvKGxvY2FsKSB7XG5cdFx0XHR0cmFuc2l0aW9uX291dChpZl9ibG9jayk7XG5cdFx0XHRjdXJyZW50ID0gZmFsc2U7XG5cdFx0fSxcblx0XHRkKGRldGFjaGluZykge1xuXHRcdFx0aWZfYmxvY2tzW2N1cnJlbnRfYmxvY2tfdHlwZV9pbmRleF0uZChkZXRhY2hpbmcpO1xuXHRcdFx0aWYgKGRldGFjaGluZykgZGV0YWNoKGlmX2Jsb2NrX2FuY2hvcik7XG5cdFx0fVxuXHR9O1xufVxuXG5mdW5jdGlvbiBpbnN0YW5jZSQ1KCQkc2VsZiwgJCRwcm9wcywgJCRpbnZhbGlkYXRlKSB7XG5cdGxldCB7ICQkc2xvdHM6IHNsb3RzID0ge30sICQkc2NvcGUgfSA9ICQkcHJvcHM7XG5cdFxuXHRsZXQgeyBtZXRhZGF0YSB9ID0gJCRwcm9wcztcblxuXHQkJHNlbGYuJCRzZXQgPSAkJHByb3BzID0+IHtcblx0XHRpZiAoXCJtZXRhZGF0YVwiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSgwLCBtZXRhZGF0YSA9ICQkcHJvcHMubWV0YWRhdGEpO1xuXHRcdGlmIChcIiQkc2NvcGVcIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoMSwgJCRzY29wZSA9ICQkcHJvcHMuJCRzY29wZSk7XG5cdH07XG5cblx0cmV0dXJuIFttZXRhZGF0YSwgJCRzY29wZSwgc2xvdHNdO1xufVxuXG5jbGFzcyBNZXRhZGF0YVJlc29sdmVyIGV4dGVuZHMgU3ZlbHRlQ29tcG9uZW50IHtcblx0Y29uc3RydWN0b3Iob3B0aW9ucykge1xuXHRcdHN1cGVyKCk7XG5cdFx0aW5pdCh0aGlzLCBvcHRpb25zLCBpbnN0YW5jZSQ1LCBjcmVhdGVfZnJhZ21lbnQkNSwgbm90X2VxdWFsLCB7IG1ldGFkYXRhOiAwIH0pO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGlzTWFjT1MoKSB7XG4gICAgcmV0dXJuIG5hdmlnYXRvci5hcHBWZXJzaW9uLmluZGV4T2YoXCJNYWNcIikgIT09IC0xO1xufVxuZnVuY3Rpb24gaXNNZXRhUHJlc3NlZChlKSB7XG4gICAgcmV0dXJuIGlzTWFjT1MoKSA/IGUubWV0YUtleSA6IGUuY3RybEtleTtcbn1cbmZ1bmN0aW9uIGdldERheXNPZldlZWsoLi4uX2FyZ3MpIHtcbiAgICByZXR1cm4gd2luZG93Lm1vbWVudC53ZWVrZGF5c1Nob3J0KHRydWUpO1xufVxuZnVuY3Rpb24gaXNXZWVrZW5kKGRhdGUpIHtcbiAgICByZXR1cm4gZGF0ZS5pc29XZWVrZGF5KCkgPT09IDYgfHwgZGF0ZS5pc29XZWVrZGF5KCkgPT09IDc7XG59XG5mdW5jdGlvbiBnZXRTdGFydE9mV2VlayhkYXlzKSB7XG4gICAgcmV0dXJuIGRheXNbMF0ud2Vla2RheSgwKTtcbn1cbi8qKlxuICogR2VuZXJhdGUgYSAyRCBhcnJheSBvZiBkYWlseSBpbmZvcm1hdGlvbiB0byBwb3dlclxuICogdGhlIGNhbGVuZGFyIHZpZXcuXG4gKi9cbmZ1bmN0aW9uIGdldE1vbnRoKGRpc3BsYXllZE1vbnRoLCAuLi5fYXJncykge1xuICAgIGNvbnN0IGxvY2FsZSA9IHdpbmRvdy5tb21lbnQoKS5sb2NhbGUoKTtcbiAgICBjb25zdCBtb250aCA9IFtdO1xuICAgIGxldCB3ZWVrO1xuICAgIGNvbnN0IHN0YXJ0T2ZNb250aCA9IGRpc3BsYXllZE1vbnRoLmNsb25lKCkubG9jYWxlKGxvY2FsZSkuZGF0ZSgxKTtcbiAgICBjb25zdCBzdGFydE9mZnNldCA9IHN0YXJ0T2ZNb250aC53ZWVrZGF5KCk7XG4gICAgbGV0IGRhdGUgPSBzdGFydE9mTW9udGguY2xvbmUoKS5zdWJ0cmFjdChzdGFydE9mZnNldCwgXCJkYXlzXCIpO1xuICAgIGZvciAobGV0IF9kYXkgPSAwOyBfZGF5IDwgNDI7IF9kYXkrKykge1xuICAgICAgICBpZiAoX2RheSAlIDcgPT09IDApIHtcbiAgICAgICAgICAgIHdlZWsgPSB7XG4gICAgICAgICAgICAgICAgZGF5czogW10sXG4gICAgICAgICAgICAgICAgd2Vla051bTogZGF0ZS53ZWVrKCksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbW9udGgucHVzaCh3ZWVrKTtcbiAgICAgICAgfVxuICAgICAgICB3ZWVrLmRheXMucHVzaChkYXRlKTtcbiAgICAgICAgZGF0ZSA9IGRhdGUuY2xvbmUoKS5hZGQoMSwgXCJkYXlzXCIpO1xuICAgIH1cbiAgICByZXR1cm4gbW9udGg7XG59XG5cbi8qIHNyYy9jb21wb25lbnRzL0RheS5zdmVsdGUgZ2VuZXJhdGVkIGJ5IFN2ZWx0ZSB2My4zNS4wICovXG5cbmZ1bmN0aW9uIGFkZF9jc3MkNCgpIHtcblx0dmFyIHN0eWxlID0gZWxlbWVudChcInN0eWxlXCIpO1xuXHRzdHlsZS5pZCA9IFwic3ZlbHRlLXEzd3FnOS1zdHlsZVwiO1xuXHRzdHlsZS50ZXh0Q29udGVudCA9IFwiLmRheS5zdmVsdGUtcTN3cWc5e2JhY2tncm91bmQtY29sb3I6dmFyKC0tY29sb3ItYmFja2dyb3VuZC1kYXkpO2JvcmRlci1yYWRpdXM6NHB4O2NvbG9yOnZhcigtLWNvbG9yLXRleHQtZGF5KTtjdXJzb3I6cG9pbnRlcjtmb250LXNpemU6MC44ZW07aGVpZ2h0OjEwMCU7cGFkZGluZzo0cHg7cG9zaXRpb246cmVsYXRpdmU7dGV4dC1hbGlnbjpjZW50ZXI7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDAuMXMgZWFzZS1pbiwgY29sb3IgMC4xcyBlYXNlLWluO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lfS5kYXkuc3ZlbHRlLXEzd3FnOTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWludGVyYWN0aXZlLWhvdmVyKX0uZGF5LmFjdGl2ZS5zdmVsdGUtcTN3cWc5OmhvdmVye2JhY2tncm91bmQtY29sb3I6dmFyKC0taW50ZXJhY3RpdmUtYWNjZW50LWhvdmVyKX0uYWRqYWNlbnQtbW9udGguc3ZlbHRlLXEzd3FnOXtvcGFjaXR5OjAuMjV9LnRvZGF5LnN2ZWx0ZS1xM3dxZzl7Y29sb3I6dmFyKC0tY29sb3ItdGV4dC10b2RheSl9LmRheS5zdmVsdGUtcTN3cWc5OmFjdGl2ZSwuYWN0aXZlLnN2ZWx0ZS1xM3dxZzksLmFjdGl2ZS50b2RheS5zdmVsdGUtcTN3cWc5e2NvbG9yOnZhcigtLXRleHQtb24tYWNjZW50KTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWludGVyYWN0aXZlLWFjY2VudCl9LmRvdC1jb250YWluZXIuc3ZlbHRlLXEzd3FnOXtkaXNwbGF5OmZsZXg7ZmxleC13cmFwOndyYXA7anVzdGlmeS1jb250ZW50OmNlbnRlcjtsaW5lLWhlaWdodDo2cHg7bWluLWhlaWdodDo2cHh9XCI7XG5cdGFwcGVuZChkb2N1bWVudC5oZWFkLCBzdHlsZSk7XG59XG5cbmZ1bmN0aW9uIGdldF9lYWNoX2NvbnRleHQkMihjdHgsIGxpc3QsIGkpIHtcblx0Y29uc3QgY2hpbGRfY3R4ID0gY3R4LnNsaWNlKCk7XG5cdGNoaWxkX2N0eFsxMV0gPSBsaXN0W2ldO1xuXHRyZXR1cm4gY2hpbGRfY3R4O1xufVxuXG4vLyAoMzY6OCkgeyNlYWNoIG1ldGFkYXRhLmRvdHMgYXMgZG90fVxuZnVuY3Rpb24gY3JlYXRlX2VhY2hfYmxvY2skMihjdHgpIHtcblx0bGV0IGRvdDtcblx0bGV0IGN1cnJlbnQ7XG5cdGNvbnN0IGRvdF9zcHJlYWRfbGV2ZWxzID0gWy8qZG90Ki8gY3R4WzExXV07XG5cdGxldCBkb3RfcHJvcHMgPSB7fTtcblxuXHRmb3IgKGxldCBpID0gMDsgaSA8IGRvdF9zcHJlYWRfbGV2ZWxzLmxlbmd0aDsgaSArPSAxKSB7XG5cdFx0ZG90X3Byb3BzID0gYXNzaWduKGRvdF9wcm9wcywgZG90X3NwcmVhZF9sZXZlbHNbaV0pO1xuXHR9XG5cblx0ZG90ID0gbmV3IERvdCh7IHByb3BzOiBkb3RfcHJvcHMgfSk7XG5cblx0cmV0dXJuIHtcblx0XHRjKCkge1xuXHRcdFx0Y3JlYXRlX2NvbXBvbmVudChkb3QuJCQuZnJhZ21lbnQpO1xuXHRcdH0sXG5cdFx0bSh0YXJnZXQsIGFuY2hvcikge1xuXHRcdFx0bW91bnRfY29tcG9uZW50KGRvdCwgdGFyZ2V0LCBhbmNob3IpO1xuXHRcdFx0Y3VycmVudCA9IHRydWU7XG5cdFx0fSxcblx0XHRwKGN0eCwgZGlydHkpIHtcblx0XHRcdGNvbnN0IGRvdF9jaGFuZ2VzID0gKGRpcnR5ICYgLyptZXRhZGF0YSovIDEyOClcblx0XHRcdD8gZ2V0X3NwcmVhZF91cGRhdGUoZG90X3NwcmVhZF9sZXZlbHMsIFtnZXRfc3ByZWFkX29iamVjdCgvKmRvdCovIGN0eFsxMV0pXSlcblx0XHRcdDoge307XG5cblx0XHRcdGRvdC4kc2V0KGRvdF9jaGFuZ2VzKTtcblx0XHR9LFxuXHRcdGkobG9jYWwpIHtcblx0XHRcdGlmIChjdXJyZW50KSByZXR1cm47XG5cdFx0XHR0cmFuc2l0aW9uX2luKGRvdC4kJC5mcmFnbWVudCwgbG9jYWwpO1xuXHRcdFx0Y3VycmVudCA9IHRydWU7XG5cdFx0fSxcblx0XHRvKGxvY2FsKSB7XG5cdFx0XHR0cmFuc2l0aW9uX291dChkb3QuJCQuZnJhZ21lbnQsIGxvY2FsKTtcblx0XHRcdGN1cnJlbnQgPSBmYWxzZTtcblx0XHR9LFxuXHRcdGQoZGV0YWNoaW5nKSB7XG5cdFx0XHRkZXN0cm95X2NvbXBvbmVudChkb3QsIGRldGFjaGluZyk7XG5cdFx0fVxuXHR9O1xufVxuXG4vLyAoMjI6MikgPE1ldGFkYXRhUmVzb2x2ZXIgbWV0YWRhdGE9XCJ7bWV0YWRhdGF9XCIgbGV0Om1ldGFkYXRhPlxuZnVuY3Rpb24gY3JlYXRlX2RlZmF1bHRfc2xvdCQxKGN0eCkge1xuXHRsZXQgZGl2MTtcblx0bGV0IHQwX3ZhbHVlID0gLypkYXRlKi8gY3R4WzBdLmZvcm1hdChcIkRcIikgKyBcIlwiO1xuXHRsZXQgdDA7XG5cdGxldCB0MTtcblx0bGV0IGRpdjA7XG5cdGxldCBkaXYxX2NsYXNzX3ZhbHVlO1xuXHRsZXQgY3VycmVudDtcblx0bGV0IG1vdW50ZWQ7XG5cdGxldCBkaXNwb3NlO1xuXHRsZXQgZWFjaF92YWx1ZSA9IC8qbWV0YWRhdGEqLyBjdHhbN10uZG90cztcblx0bGV0IGVhY2hfYmxvY2tzID0gW107XG5cblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBlYWNoX3ZhbHVlLmxlbmd0aDsgaSArPSAxKSB7XG5cdFx0ZWFjaF9ibG9ja3NbaV0gPSBjcmVhdGVfZWFjaF9ibG9jayQyKGdldF9lYWNoX2NvbnRleHQkMihjdHgsIGVhY2hfdmFsdWUsIGkpKTtcblx0fVxuXG5cdGNvbnN0IG91dCA9IGkgPT4gdHJhbnNpdGlvbl9vdXQoZWFjaF9ibG9ja3NbaV0sIDEsIDEsICgpID0+IHtcblx0XHRlYWNoX2Jsb2Nrc1tpXSA9IG51bGw7XG5cdH0pO1xuXG5cdGxldCBkaXYxX2xldmVscyA9IFtcblx0XHR7XG5cdFx0XHRjbGFzczogZGl2MV9jbGFzc192YWx1ZSA9IGBkYXkgJHsvKm1ldGFkYXRhKi8gY3R4WzddLmNsYXNzZXMuam9pbihcIiBcIil9YFxuXHRcdH0sXG5cdFx0LyptZXRhZGF0YSovIGN0eFs3XS5kYXRhQXR0cmlidXRlcyB8fCB7fVxuXHRdO1xuXG5cdGxldCBkaXYxX2RhdGEgPSB7fTtcblxuXHRmb3IgKGxldCBpID0gMDsgaSA8IGRpdjFfbGV2ZWxzLmxlbmd0aDsgaSArPSAxKSB7XG5cdFx0ZGl2MV9kYXRhID0gYXNzaWduKGRpdjFfZGF0YSwgZGl2MV9sZXZlbHNbaV0pO1xuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRjKCkge1xuXHRcdFx0ZGl2MSA9IGVsZW1lbnQoXCJkaXZcIik7XG5cdFx0XHR0MCA9IHRleHQodDBfdmFsdWUpO1xuXHRcdFx0dDEgPSBzcGFjZSgpO1xuXHRcdFx0ZGl2MCA9IGVsZW1lbnQoXCJkaXZcIik7XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgZWFjaF9ibG9ja3MubGVuZ3RoOyBpICs9IDEpIHtcblx0XHRcdFx0ZWFjaF9ibG9ja3NbaV0uYygpO1xuXHRcdFx0fVxuXG5cdFx0XHRhdHRyKGRpdjAsIFwiY2xhc3NcIiwgXCJkb3QtY29udGFpbmVyIHN2ZWx0ZS1xM3dxZzlcIik7XG5cdFx0XHRzZXRfYXR0cmlidXRlcyhkaXYxLCBkaXYxX2RhdGEpO1xuXHRcdFx0dG9nZ2xlX2NsYXNzKGRpdjEsIFwiYWN0aXZlXCIsIC8qc2VsZWN0ZWRJZCovIGN0eFs2XSA9PT0gZ2V0RGF0ZVVJRF8xKC8qZGF0ZSovIGN0eFswXSwgXCJkYXlcIikpO1xuXHRcdFx0dG9nZ2xlX2NsYXNzKGRpdjEsIFwiYWRqYWNlbnQtbW9udGhcIiwgIS8qZGF0ZSovIGN0eFswXS5pc1NhbWUoLypkaXNwbGF5ZWRNb250aCovIGN0eFs1XSwgXCJtb250aFwiKSk7XG5cdFx0XHR0b2dnbGVfY2xhc3MoZGl2MSwgXCJ0b2RheVwiLCAvKmRhdGUqLyBjdHhbMF0uaXNTYW1lKC8qdG9kYXkqLyBjdHhbNF0sIFwiZGF5XCIpKTtcblx0XHRcdHRvZ2dsZV9jbGFzcyhkaXYxLCBcInN2ZWx0ZS1xM3dxZzlcIiwgdHJ1ZSk7XG5cdFx0fSxcblx0XHRtKHRhcmdldCwgYW5jaG9yKSB7XG5cdFx0XHRpbnNlcnQodGFyZ2V0LCBkaXYxLCBhbmNob3IpO1xuXHRcdFx0YXBwZW5kKGRpdjEsIHQwKTtcblx0XHRcdGFwcGVuZChkaXYxLCB0MSk7XG5cdFx0XHRhcHBlbmQoZGl2MSwgZGl2MCk7XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgZWFjaF9ibG9ja3MubGVuZ3RoOyBpICs9IDEpIHtcblx0XHRcdFx0ZWFjaF9ibG9ja3NbaV0ubShkaXYwLCBudWxsKTtcblx0XHRcdH1cblxuXHRcdFx0Y3VycmVudCA9IHRydWU7XG5cblx0XHRcdGlmICghbW91bnRlZCkge1xuXHRcdFx0XHRkaXNwb3NlID0gW1xuXHRcdFx0XHRcdGxpc3RlbihkaXYxLCBcImNsaWNrXCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdGlmIChpc19mdW5jdGlvbigvKm9uQ2xpY2sqLyBjdHhbMl0gJiYgLypjbGlja19oYW5kbGVyKi8gY3R4WzhdKSkgKC8qb25DbGljayovIGN0eFsyXSAmJiAvKmNsaWNrX2hhbmRsZXIqLyBjdHhbOF0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0bGlzdGVuKGRpdjEsIFwiY29udGV4dG1lbnVcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0aWYgKGlzX2Z1bmN0aW9uKC8qb25Db250ZXh0TWVudSovIGN0eFszXSAmJiAvKmNvbnRleHRtZW51X2hhbmRsZXIqLyBjdHhbOV0pKSAoLypvbkNvbnRleHRNZW51Ki8gY3R4WzNdICYmIC8qY29udGV4dG1lbnVfaGFuZGxlciovIGN0eFs5XSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRsaXN0ZW4oZGl2MSwgXCJwb2ludGVyb3ZlclwiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRpZiAoaXNfZnVuY3Rpb24oLypvbkhvdmVyKi8gY3R4WzFdICYmIC8qcG9pbnRlcm92ZXJfaGFuZGxlciovIGN0eFsxMF0pKSAoLypvbkhvdmVyKi8gY3R4WzFdICYmIC8qcG9pbnRlcm92ZXJfaGFuZGxlciovIGN0eFsxMF0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XTtcblxuXHRcdFx0XHRtb3VudGVkID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdHAobmV3X2N0eCwgZGlydHkpIHtcblx0XHRcdGN0eCA9IG5ld19jdHg7XG5cdFx0XHRpZiAoKCFjdXJyZW50IHx8IGRpcnR5ICYgLypkYXRlKi8gMSkgJiYgdDBfdmFsdWUgIT09ICh0MF92YWx1ZSA9IC8qZGF0ZSovIGN0eFswXS5mb3JtYXQoXCJEXCIpICsgXCJcIikpIHNldF9kYXRhKHQwLCB0MF92YWx1ZSk7XG5cblx0XHRcdGlmIChkaXJ0eSAmIC8qbWV0YWRhdGEqLyAxMjgpIHtcblx0XHRcdFx0ZWFjaF92YWx1ZSA9IC8qbWV0YWRhdGEqLyBjdHhbN10uZG90cztcblx0XHRcdFx0bGV0IGk7XG5cblx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IGVhY2hfdmFsdWUubGVuZ3RoOyBpICs9IDEpIHtcblx0XHRcdFx0XHRjb25zdCBjaGlsZF9jdHggPSBnZXRfZWFjaF9jb250ZXh0JDIoY3R4LCBlYWNoX3ZhbHVlLCBpKTtcblxuXHRcdFx0XHRcdGlmIChlYWNoX2Jsb2Nrc1tpXSkge1xuXHRcdFx0XHRcdFx0ZWFjaF9ibG9ja3NbaV0ucChjaGlsZF9jdHgsIGRpcnR5KTtcblx0XHRcdFx0XHRcdHRyYW5zaXRpb25faW4oZWFjaF9ibG9ja3NbaV0sIDEpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRlYWNoX2Jsb2Nrc1tpXSA9IGNyZWF0ZV9lYWNoX2Jsb2NrJDIoY2hpbGRfY3R4KTtcblx0XHRcdFx0XHRcdGVhY2hfYmxvY2tzW2ldLmMoKTtcblx0XHRcdFx0XHRcdHRyYW5zaXRpb25faW4oZWFjaF9ibG9ja3NbaV0sIDEpO1xuXHRcdFx0XHRcdFx0ZWFjaF9ibG9ja3NbaV0ubShkaXYwLCBudWxsKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRncm91cF9vdXRyb3MoKTtcblxuXHRcdFx0XHRmb3IgKGkgPSBlYWNoX3ZhbHVlLmxlbmd0aDsgaSA8IGVhY2hfYmxvY2tzLmxlbmd0aDsgaSArPSAxKSB7XG5cdFx0XHRcdFx0b3V0KGkpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y2hlY2tfb3V0cm9zKCk7XG5cdFx0XHR9XG5cblx0XHRcdHNldF9hdHRyaWJ1dGVzKGRpdjEsIGRpdjFfZGF0YSA9IGdldF9zcHJlYWRfdXBkYXRlKGRpdjFfbGV2ZWxzLCBbXG5cdFx0XHRcdCghY3VycmVudCB8fCBkaXJ0eSAmIC8qbWV0YWRhdGEqLyAxMjggJiYgZGl2MV9jbGFzc192YWx1ZSAhPT0gKGRpdjFfY2xhc3NfdmFsdWUgPSBgZGF5ICR7LyptZXRhZGF0YSovIGN0eFs3XS5jbGFzc2VzLmpvaW4oXCIgXCIpfWApKSAmJiB7IGNsYXNzOiBkaXYxX2NsYXNzX3ZhbHVlIH0sXG5cdFx0XHRcdGRpcnR5ICYgLyptZXRhZGF0YSovIDEyOCAmJiAoLyptZXRhZGF0YSovIGN0eFs3XS5kYXRhQXR0cmlidXRlcyB8fCB7fSlcblx0XHRcdF0pKTtcblxuXHRcdFx0dG9nZ2xlX2NsYXNzKGRpdjEsIFwiYWN0aXZlXCIsIC8qc2VsZWN0ZWRJZCovIGN0eFs2XSA9PT0gZ2V0RGF0ZVVJRF8xKC8qZGF0ZSovIGN0eFswXSwgXCJkYXlcIikpO1xuXHRcdFx0dG9nZ2xlX2NsYXNzKGRpdjEsIFwiYWRqYWNlbnQtbW9udGhcIiwgIS8qZGF0ZSovIGN0eFswXS5pc1NhbWUoLypkaXNwbGF5ZWRNb250aCovIGN0eFs1XSwgXCJtb250aFwiKSk7XG5cdFx0XHR0b2dnbGVfY2xhc3MoZGl2MSwgXCJ0b2RheVwiLCAvKmRhdGUqLyBjdHhbMF0uaXNTYW1lKC8qdG9kYXkqLyBjdHhbNF0sIFwiZGF5XCIpKTtcblx0XHRcdHRvZ2dsZV9jbGFzcyhkaXYxLCBcInN2ZWx0ZS1xM3dxZzlcIiwgdHJ1ZSk7XG5cdFx0fSxcblx0XHRpKGxvY2FsKSB7XG5cdFx0XHRpZiAoY3VycmVudCkgcmV0dXJuO1xuXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGVhY2hfdmFsdWUubGVuZ3RoOyBpICs9IDEpIHtcblx0XHRcdFx0dHJhbnNpdGlvbl9pbihlYWNoX2Jsb2Nrc1tpXSk7XG5cdFx0XHR9XG5cblx0XHRcdGN1cnJlbnQgPSB0cnVlO1xuXHRcdH0sXG5cdFx0byhsb2NhbCkge1xuXHRcdFx0ZWFjaF9ibG9ja3MgPSBlYWNoX2Jsb2Nrcy5maWx0ZXIoQm9vbGVhbik7XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgZWFjaF9ibG9ja3MubGVuZ3RoOyBpICs9IDEpIHtcblx0XHRcdFx0dHJhbnNpdGlvbl9vdXQoZWFjaF9ibG9ja3NbaV0pO1xuXHRcdFx0fVxuXG5cdFx0XHRjdXJyZW50ID0gZmFsc2U7XG5cdFx0fSxcblx0XHRkKGRldGFjaGluZykge1xuXHRcdFx0aWYgKGRldGFjaGluZykgZGV0YWNoKGRpdjEpO1xuXHRcdFx0ZGVzdHJveV9lYWNoKGVhY2hfYmxvY2tzLCBkZXRhY2hpbmcpO1xuXHRcdFx0bW91bnRlZCA9IGZhbHNlO1xuXHRcdFx0cnVuX2FsbChkaXNwb3NlKTtcblx0XHR9XG5cdH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZV9mcmFnbWVudCQ0KGN0eCkge1xuXHRsZXQgdGQ7XG5cdGxldCBtZXRhZGF0YXJlc29sdmVyO1xuXHRsZXQgY3VycmVudDtcblxuXHRtZXRhZGF0YXJlc29sdmVyID0gbmV3IE1ldGFkYXRhUmVzb2x2ZXIoe1xuXHRcdFx0cHJvcHM6IHtcblx0XHRcdFx0bWV0YWRhdGE6IC8qbWV0YWRhdGEqLyBjdHhbN10sXG5cdFx0XHRcdCQkc2xvdHM6IHtcblx0XHRcdFx0XHRkZWZhdWx0OiBbXG5cdFx0XHRcdFx0XHRjcmVhdGVfZGVmYXVsdF9zbG90JDEsXG5cdFx0XHRcdFx0XHQoeyBtZXRhZGF0YSB9KSA9PiAoeyA3OiBtZXRhZGF0YSB9KSxcblx0XHRcdFx0XHRcdCh7IG1ldGFkYXRhIH0pID0+IG1ldGFkYXRhID8gMTI4IDogMFxuXHRcdFx0XHRcdF1cblx0XHRcdFx0fSxcblx0XHRcdFx0JCRzY29wZTogeyBjdHggfVxuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdHJldHVybiB7XG5cdFx0YygpIHtcblx0XHRcdHRkID0gZWxlbWVudChcInRkXCIpO1xuXHRcdFx0Y3JlYXRlX2NvbXBvbmVudChtZXRhZGF0YXJlc29sdmVyLiQkLmZyYWdtZW50KTtcblx0XHR9LFxuXHRcdG0odGFyZ2V0LCBhbmNob3IpIHtcblx0XHRcdGluc2VydCh0YXJnZXQsIHRkLCBhbmNob3IpO1xuXHRcdFx0bW91bnRfY29tcG9uZW50KG1ldGFkYXRhcmVzb2x2ZXIsIHRkLCBudWxsKTtcblx0XHRcdGN1cnJlbnQgPSB0cnVlO1xuXHRcdH0sXG5cdFx0cChjdHgsIFtkaXJ0eV0pIHtcblx0XHRcdGNvbnN0IG1ldGFkYXRhcmVzb2x2ZXJfY2hhbmdlcyA9IHt9O1xuXHRcdFx0aWYgKGRpcnR5ICYgLyptZXRhZGF0YSovIDEyOCkgbWV0YWRhdGFyZXNvbHZlcl9jaGFuZ2VzLm1ldGFkYXRhID0gLyptZXRhZGF0YSovIGN0eFs3XTtcblxuXHRcdFx0aWYgKGRpcnR5ICYgLyokJHNjb3BlLCBtZXRhZGF0YSwgc2VsZWN0ZWRJZCwgZGF0ZSwgZGlzcGxheWVkTW9udGgsIHRvZGF5LCBvbkNsaWNrLCBvbkNvbnRleHRNZW51LCBvbkhvdmVyKi8gMTY2MzkpIHtcblx0XHRcdFx0bWV0YWRhdGFyZXNvbHZlcl9jaGFuZ2VzLiQkc2NvcGUgPSB7IGRpcnR5LCBjdHggfTtcblx0XHRcdH1cblxuXHRcdFx0bWV0YWRhdGFyZXNvbHZlci4kc2V0KG1ldGFkYXRhcmVzb2x2ZXJfY2hhbmdlcyk7XG5cdFx0fSxcblx0XHRpKGxvY2FsKSB7XG5cdFx0XHRpZiAoY3VycmVudCkgcmV0dXJuO1xuXHRcdFx0dHJhbnNpdGlvbl9pbihtZXRhZGF0YXJlc29sdmVyLiQkLmZyYWdtZW50LCBsb2NhbCk7XG5cdFx0XHRjdXJyZW50ID0gdHJ1ZTtcblx0XHR9LFxuXHRcdG8obG9jYWwpIHtcblx0XHRcdHRyYW5zaXRpb25fb3V0KG1ldGFkYXRhcmVzb2x2ZXIuJCQuZnJhZ21lbnQsIGxvY2FsKTtcblx0XHRcdGN1cnJlbnQgPSBmYWxzZTtcblx0XHR9LFxuXHRcdGQoZGV0YWNoaW5nKSB7XG5cdFx0XHRpZiAoZGV0YWNoaW5nKSBkZXRhY2godGQpO1xuXHRcdFx0ZGVzdHJveV9jb21wb25lbnQobWV0YWRhdGFyZXNvbHZlcik7XG5cdFx0fVxuXHR9O1xufVxuXG5mdW5jdGlvbiBpbnN0YW5jZSQ0KCQkc2VsZiwgJCRwcm9wcywgJCRpbnZhbGlkYXRlKSB7XG5cdFxuXHRcblx0bGV0IHsgZGF0ZSB9ID0gJCRwcm9wcztcblx0bGV0IHsgbWV0YWRhdGEgfSA9ICQkcHJvcHM7XG5cdGxldCB7IG9uSG92ZXIgfSA9ICQkcHJvcHM7XG5cdGxldCB7IG9uQ2xpY2sgfSA9ICQkcHJvcHM7XG5cdGxldCB7IG9uQ29udGV4dE1lbnUgfSA9ICQkcHJvcHM7XG5cdGxldCB7IHRvZGF5IH0gPSAkJHByb3BzO1xuXHRsZXQgeyBkaXNwbGF5ZWRNb250aCA9IG51bGwgfSA9ICQkcHJvcHM7XG5cdGxldCB7IHNlbGVjdGVkSWQgPSBudWxsIH0gPSAkJHByb3BzO1xuXHRjb25zdCBjbGlja19oYW5kbGVyID0gZSA9PiBvbkNsaWNrKGRhdGUsIGlzTWV0YVByZXNzZWQoZSkpO1xuXHRjb25zdCBjb250ZXh0bWVudV9oYW5kbGVyID0gZSA9PiBvbkNvbnRleHRNZW51KGRhdGUsIGUpO1xuXHRjb25zdCBwb2ludGVyb3Zlcl9oYW5kbGVyID0gZSA9PiBvbkhvdmVyKGRhdGUsIGUudGFyZ2V0LCBpc01ldGFQcmVzc2VkKGUpKTtcblxuXHQkJHNlbGYuJCRzZXQgPSAkJHByb3BzID0+IHtcblx0XHRpZiAoXCJkYXRlXCIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDAsIGRhdGUgPSAkJHByb3BzLmRhdGUpO1xuXHRcdGlmIChcIm1ldGFkYXRhXCIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDcsIG1ldGFkYXRhID0gJCRwcm9wcy5tZXRhZGF0YSk7XG5cdFx0aWYgKFwib25Ib3ZlclwiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSgxLCBvbkhvdmVyID0gJCRwcm9wcy5vbkhvdmVyKTtcblx0XHRpZiAoXCJvbkNsaWNrXCIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDIsIG9uQ2xpY2sgPSAkJHByb3BzLm9uQ2xpY2spO1xuXHRcdGlmIChcIm9uQ29udGV4dE1lbnVcIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoMywgb25Db250ZXh0TWVudSA9ICQkcHJvcHMub25Db250ZXh0TWVudSk7XG5cdFx0aWYgKFwidG9kYXlcIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoNCwgdG9kYXkgPSAkJHByb3BzLnRvZGF5KTtcblx0XHRpZiAoXCJkaXNwbGF5ZWRNb250aFwiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSg1LCBkaXNwbGF5ZWRNb250aCA9ICQkcHJvcHMuZGlzcGxheWVkTW9udGgpO1xuXHRcdGlmIChcInNlbGVjdGVkSWRcIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoNiwgc2VsZWN0ZWRJZCA9ICQkcHJvcHMuc2VsZWN0ZWRJZCk7XG5cdH07XG5cblx0cmV0dXJuIFtcblx0XHRkYXRlLFxuXHRcdG9uSG92ZXIsXG5cdFx0b25DbGljayxcblx0XHRvbkNvbnRleHRNZW51LFxuXHRcdHRvZGF5LFxuXHRcdGRpc3BsYXllZE1vbnRoLFxuXHRcdHNlbGVjdGVkSWQsXG5cdFx0bWV0YWRhdGEsXG5cdFx0Y2xpY2tfaGFuZGxlcixcblx0XHRjb250ZXh0bWVudV9oYW5kbGVyLFxuXHRcdHBvaW50ZXJvdmVyX2hhbmRsZXJcblx0XTtcbn1cblxuY2xhc3MgRGF5IGV4dGVuZHMgU3ZlbHRlQ29tcG9uZW50IHtcblx0Y29uc3RydWN0b3Iob3B0aW9ucykge1xuXHRcdHN1cGVyKCk7XG5cdFx0aWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInN2ZWx0ZS1xM3dxZzktc3R5bGVcIikpIGFkZF9jc3MkNCgpO1xuXG5cdFx0aW5pdCh0aGlzLCBvcHRpb25zLCBpbnN0YW5jZSQ0LCBjcmVhdGVfZnJhZ21lbnQkNCwgbm90X2VxdWFsLCB7XG5cdFx0XHRkYXRlOiAwLFxuXHRcdFx0bWV0YWRhdGE6IDcsXG5cdFx0XHRvbkhvdmVyOiAxLFxuXHRcdFx0b25DbGljazogMixcblx0XHRcdG9uQ29udGV4dE1lbnU6IDMsXG5cdFx0XHR0b2RheTogNCxcblx0XHRcdGRpc3BsYXllZE1vbnRoOiA1LFxuXHRcdFx0c2VsZWN0ZWRJZDogNlxuXHRcdH0pO1xuXHR9XG59XG5cbi8qIHNyYy9jb21wb25lbnRzL0Fycm93LnN2ZWx0ZSBnZW5lcmF0ZWQgYnkgU3ZlbHRlIHYzLjM1LjAgKi9cblxuZnVuY3Rpb24gYWRkX2NzcyQzKCkge1xuXHR2YXIgc3R5bGUgPSBlbGVtZW50KFwic3R5bGVcIik7XG5cdHN0eWxlLmlkID0gXCJzdmVsdGUtMTU2dzduYS1zdHlsZVwiO1xuXHRzdHlsZS50ZXh0Q29udGVudCA9IFwiLmFycm93LnN2ZWx0ZS0xNTZ3N25hLnN2ZWx0ZS0xNTZ3N25he2FsaWduLWl0ZW1zOmNlbnRlcjtjdXJzb3I6cG9pbnRlcjtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjt3aWR0aDoyNHB4fS5hcnJvdy5pcy1tb2JpbGUuc3ZlbHRlLTE1Nnc3bmEuc3ZlbHRlLTE1Nnc3bmF7d2lkdGg6MzJweH0ucmlnaHQuc3ZlbHRlLTE1Nnc3bmEuc3ZlbHRlLTE1Nnc3bmF7dHJhbnNmb3JtOnJvdGF0ZSgxODBkZWcpfS5hcnJvdy5zdmVsdGUtMTU2dzduYSBzdmcuc3ZlbHRlLTE1Nnc3bmF7Y29sb3I6dmFyKC0tY29sb3ItYXJyb3cpO2hlaWdodDoxNnB4O3dpZHRoOjE2cHh9XCI7XG5cdGFwcGVuZChkb2N1bWVudC5oZWFkLCBzdHlsZSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZV9mcmFnbWVudCQzKGN0eCkge1xuXHRsZXQgZGl2O1xuXHRsZXQgc3ZnO1xuXHRsZXQgcGF0aDtcblx0bGV0IG1vdW50ZWQ7XG5cdGxldCBkaXNwb3NlO1xuXG5cdHJldHVybiB7XG5cdFx0YygpIHtcblx0XHRcdGRpdiA9IGVsZW1lbnQoXCJkaXZcIik7XG5cdFx0XHRzdmcgPSBzdmdfZWxlbWVudChcInN2Z1wiKTtcblx0XHRcdHBhdGggPSBzdmdfZWxlbWVudChcInBhdGhcIik7XG5cdFx0XHRhdHRyKHBhdGgsIFwiZmlsbFwiLCBcImN1cnJlbnRDb2xvclwiKTtcblx0XHRcdGF0dHIocGF0aCwgXCJkXCIsIFwiTTM0LjUyIDIzOS4wM0wyMjguODcgNDQuNjljOS4zNy05LjM3IDI0LjU3LTkuMzcgMzMuOTQgMGwyMi42NyAyMi42N2M5LjM2IDkuMzYgOS4zNyAyNC41Mi4wNCAzMy45TDEzMS40OSAyNTZsMTU0LjAyIDE1NC43NWM5LjM0IDkuMzggOS4zMiAyNC41NC0uMDQgMzMuOWwtMjIuNjcgMjIuNjdjLTkuMzcgOS4zNy0yNC41NyA5LjM3LTMzLjk0IDBMMzQuNTIgMjcyLjk3Yy05LjM3LTkuMzctOS4zNy0yNC41NyAwLTMzLjk0elwiKTtcblx0XHRcdGF0dHIoc3ZnLCBcImZvY3VzYWJsZVwiLCBcImZhbHNlXCIpO1xuXHRcdFx0YXR0cihzdmcsIFwicm9sZVwiLCBcImltZ1wiKTtcblx0XHRcdGF0dHIoc3ZnLCBcInhtbG5zXCIsIFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIik7XG5cdFx0XHRhdHRyKHN2ZywgXCJ2aWV3Qm94XCIsIFwiMCAwIDMyMCA1MTJcIik7XG5cdFx0XHRhdHRyKHN2ZywgXCJjbGFzc1wiLCBcInN2ZWx0ZS0xNTZ3N25hXCIpO1xuXHRcdFx0YXR0cihkaXYsIFwiY2xhc3NcIiwgXCJhcnJvdyBzdmVsdGUtMTU2dzduYVwiKTtcblx0XHRcdGF0dHIoZGl2LCBcImFyaWEtbGFiZWxcIiwgLyp0b29sdGlwKi8gY3R4WzFdKTtcblx0XHRcdHRvZ2dsZV9jbGFzcyhkaXYsIFwiaXMtbW9iaWxlXCIsIC8qaXNNb2JpbGUqLyBjdHhbM10pO1xuXHRcdFx0dG9nZ2xlX2NsYXNzKGRpdiwgXCJyaWdodFwiLCAvKmRpcmVjdGlvbiovIGN0eFsyXSA9PT0gXCJyaWdodFwiKTtcblx0XHR9LFxuXHRcdG0odGFyZ2V0LCBhbmNob3IpIHtcblx0XHRcdGluc2VydCh0YXJnZXQsIGRpdiwgYW5jaG9yKTtcblx0XHRcdGFwcGVuZChkaXYsIHN2Zyk7XG5cdFx0XHRhcHBlbmQoc3ZnLCBwYXRoKTtcblxuXHRcdFx0aWYgKCFtb3VudGVkKSB7XG5cdFx0XHRcdGRpc3Bvc2UgPSBsaXN0ZW4oZGl2LCBcImNsaWNrXCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRpZiAoaXNfZnVuY3Rpb24oLypvbkNsaWNrKi8gY3R4WzBdKSkgLypvbkNsaWNrKi8gY3R4WzBdLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdG1vdW50ZWQgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0cChuZXdfY3R4LCBbZGlydHldKSB7XG5cdFx0XHRjdHggPSBuZXdfY3R4O1xuXG5cdFx0XHRpZiAoZGlydHkgJiAvKnRvb2x0aXAqLyAyKSB7XG5cdFx0XHRcdGF0dHIoZGl2LCBcImFyaWEtbGFiZWxcIiwgLyp0b29sdGlwKi8gY3R4WzFdKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGRpcnR5ICYgLypkaXJlY3Rpb24qLyA0KSB7XG5cdFx0XHRcdHRvZ2dsZV9jbGFzcyhkaXYsIFwicmlnaHRcIiwgLypkaXJlY3Rpb24qLyBjdHhbMl0gPT09IFwicmlnaHRcIik7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRpOiBub29wLFxuXHRcdG86IG5vb3AsXG5cdFx0ZChkZXRhY2hpbmcpIHtcblx0XHRcdGlmIChkZXRhY2hpbmcpIGRldGFjaChkaXYpO1xuXHRcdFx0bW91bnRlZCA9IGZhbHNlO1xuXHRcdFx0ZGlzcG9zZSgpO1xuXHRcdH1cblx0fTtcbn1cblxuZnVuY3Rpb24gaW5zdGFuY2UkMygkJHNlbGYsICQkcHJvcHMsICQkaW52YWxpZGF0ZSkge1xuXHRsZXQgeyBvbkNsaWNrIH0gPSAkJHByb3BzO1xuXHRsZXQgeyB0b29sdGlwIH0gPSAkJHByb3BzO1xuXHRsZXQgeyBkaXJlY3Rpb24gfSA9ICQkcHJvcHM7XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblx0bGV0IGlzTW9iaWxlID0gd2luZG93LmFwcC5pc01vYmlsZTtcblxuXHQkJHNlbGYuJCRzZXQgPSAkJHByb3BzID0+IHtcblx0XHRpZiAoXCJvbkNsaWNrXCIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDAsIG9uQ2xpY2sgPSAkJHByb3BzLm9uQ2xpY2spO1xuXHRcdGlmIChcInRvb2x0aXBcIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoMSwgdG9vbHRpcCA9ICQkcHJvcHMudG9vbHRpcCk7XG5cdFx0aWYgKFwiZGlyZWN0aW9uXCIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDIsIGRpcmVjdGlvbiA9ICQkcHJvcHMuZGlyZWN0aW9uKTtcblx0fTtcblxuXHRyZXR1cm4gW29uQ2xpY2ssIHRvb2x0aXAsIGRpcmVjdGlvbiwgaXNNb2JpbGVdO1xufVxuXG5jbGFzcyBBcnJvdyBleHRlbmRzIFN2ZWx0ZUNvbXBvbmVudCB7XG5cdGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcblx0XHRzdXBlcigpO1xuXHRcdGlmICghZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzdmVsdGUtMTU2dzduYS1zdHlsZVwiKSkgYWRkX2NzcyQzKCk7XG5cdFx0aW5pdCh0aGlzLCBvcHRpb25zLCBpbnN0YW5jZSQzLCBjcmVhdGVfZnJhZ21lbnQkMywgc2FmZV9ub3RfZXF1YWwsIHsgb25DbGljazogMCwgdG9vbHRpcDogMSwgZGlyZWN0aW9uOiAyIH0pO1xuXHR9XG59XG5cbi8qIHNyYy9jb21wb25lbnRzL05hdi5zdmVsdGUgZ2VuZXJhdGVkIGJ5IFN2ZWx0ZSB2My4zNS4wICovXG5cbmZ1bmN0aW9uIGFkZF9jc3MkMigpIHtcblx0dmFyIHN0eWxlID0gZWxlbWVudChcInN0eWxlXCIpO1xuXHRzdHlsZS5pZCA9IFwic3ZlbHRlLTF2d3I5ZGQtc3R5bGVcIjtcblx0c3R5bGUudGV4dENvbnRlbnQgPSBcIi5uYXYuc3ZlbHRlLTF2d3I5ZGQuc3ZlbHRlLTF2d3I5ZGR7YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleDttYXJnaW46MC42ZW0gMCAxZW07cGFkZGluZzowIDhweDt3aWR0aDoxMDAlfS5uYXYuaXMtbW9iaWxlLnN2ZWx0ZS0xdndyOWRkLnN2ZWx0ZS0xdndyOWRke3BhZGRpbmc6MH0udGl0bGUuc3ZlbHRlLTF2d3I5ZGQuc3ZlbHRlLTF2d3I5ZGR7Y29sb3I6dmFyKC0tY29sb3ItdGV4dC10aXRsZSk7Zm9udC1zaXplOjEuNWVtO21hcmdpbjowfS5pcy1tb2JpbGUuc3ZlbHRlLTF2d3I5ZGQgLnRpdGxlLnN2ZWx0ZS0xdndyOWRke2ZvbnQtc2l6ZToxLjNlbX0ubW9udGguc3ZlbHRlLTF2d3I5ZGQuc3ZlbHRlLTF2d3I5ZGR7Zm9udC13ZWlnaHQ6NTAwO3RleHQtdHJhbnNmb3JtOmNhcGl0YWxpemV9LnllYXIuc3ZlbHRlLTF2d3I5ZGQuc3ZlbHRlLTF2d3I5ZGR7Y29sb3I6dmFyKC0taW50ZXJhY3RpdmUtYWNjZW50KX0ucmlnaHQtbmF2LnN2ZWx0ZS0xdndyOWRkLnN2ZWx0ZS0xdndyOWRke2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO21hcmdpbi1sZWZ0OmF1dG99LnJlc2V0LWJ1dHRvbi5zdmVsdGUtMXZ3cjlkZC5zdmVsdGUtMXZ3cjlkZHtjdXJzb3I6cG9pbnRlcjtib3JkZXItcmFkaXVzOjRweDtjb2xvcjp2YXIoLS10ZXh0LW11dGVkKTtmb250LXNpemU6MC43ZW07Zm9udC13ZWlnaHQ6NjAwO2xldHRlci1zcGFjaW5nOjFweDttYXJnaW46MCA0cHg7cGFkZGluZzowcHggNHB4O3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZX0uaXMtbW9iaWxlLnN2ZWx0ZS0xdndyOWRkIC5yZXNldC1idXR0b24uc3ZlbHRlLTF2d3I5ZGR7ZGlzcGxheTpub25lfVwiO1xuXHRhcHBlbmQoZG9jdW1lbnQuaGVhZCwgc3R5bGUpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVfZnJhZ21lbnQkMihjdHgpIHtcblx0bGV0IGRpdjI7XG5cdGxldCBoMztcblx0bGV0IHNwYW4wO1xuXHRsZXQgdDBfdmFsdWUgPSAvKmRpc3BsYXllZE1vbnRoKi8gY3R4WzBdLmZvcm1hdChcIk1NTVwiKSArIFwiXCI7XG5cdGxldCB0MDtcblx0bGV0IHQxO1xuXHRsZXQgc3BhbjE7XG5cdGxldCB0Ml92YWx1ZSA9IC8qZGlzcGxheWVkTW9udGgqLyBjdHhbMF0uZm9ybWF0KFwiWVlZWVwiKSArIFwiXCI7XG5cdGxldCB0Mjtcblx0bGV0IHQzO1xuXHRsZXQgZGl2MTtcblx0bGV0IGFycm93MDtcblx0bGV0IHQ0O1xuXHRsZXQgZGl2MDtcblx0bGV0IHQ2O1xuXHRsZXQgYXJyb3cxO1xuXHRsZXQgY3VycmVudDtcblx0bGV0IG1vdW50ZWQ7XG5cdGxldCBkaXNwb3NlO1xuXG5cdGFycm93MCA9IG5ldyBBcnJvdyh7XG5cdFx0XHRwcm9wczoge1xuXHRcdFx0XHRkaXJlY3Rpb246IFwibGVmdFwiLFxuXHRcdFx0XHRvbkNsaWNrOiAvKmRlY3JlbWVudERpc3BsYXllZE1vbnRoKi8gY3R4WzNdLFxuXHRcdFx0XHR0b29sdGlwOiBcIlByZXZpb3VzIE1vbnRoXCJcblx0XHRcdH1cblx0XHR9KTtcblxuXHRhcnJvdzEgPSBuZXcgQXJyb3coe1xuXHRcdFx0cHJvcHM6IHtcblx0XHRcdFx0ZGlyZWN0aW9uOiBcInJpZ2h0XCIsXG5cdFx0XHRcdG9uQ2xpY2s6IC8qaW5jcmVtZW50RGlzcGxheWVkTW9udGgqLyBjdHhbMl0sXG5cdFx0XHRcdHRvb2x0aXA6IFwiTmV4dCBNb250aFwiXG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0cmV0dXJuIHtcblx0XHRjKCkge1xuXHRcdFx0ZGl2MiA9IGVsZW1lbnQoXCJkaXZcIik7XG5cdFx0XHRoMyA9IGVsZW1lbnQoXCJoM1wiKTtcblx0XHRcdHNwYW4wID0gZWxlbWVudChcInNwYW5cIik7XG5cdFx0XHR0MCA9IHRleHQodDBfdmFsdWUpO1xuXHRcdFx0dDEgPSBzcGFjZSgpO1xuXHRcdFx0c3BhbjEgPSBlbGVtZW50KFwic3BhblwiKTtcblx0XHRcdHQyID0gdGV4dCh0Ml92YWx1ZSk7XG5cdFx0XHR0MyA9IHNwYWNlKCk7XG5cdFx0XHRkaXYxID0gZWxlbWVudChcImRpdlwiKTtcblx0XHRcdGNyZWF0ZV9jb21wb25lbnQoYXJyb3cwLiQkLmZyYWdtZW50KTtcblx0XHRcdHQ0ID0gc3BhY2UoKTtcblx0XHRcdGRpdjAgPSBlbGVtZW50KFwiZGl2XCIpO1xuXHRcdFx0ZGl2MC50ZXh0Q29udGVudCA9IGAkey8qdG9kYXlEaXNwbGF5U3RyKi8gY3R4WzRdfWA7XG5cdFx0XHR0NiA9IHNwYWNlKCk7XG5cdFx0XHRjcmVhdGVfY29tcG9uZW50KGFycm93MS4kJC5mcmFnbWVudCk7XG5cdFx0XHRhdHRyKHNwYW4wLCBcImNsYXNzXCIsIFwibW9udGggc3ZlbHRlLTF2d3I5ZGRcIik7XG5cdFx0XHRhdHRyKHNwYW4xLCBcImNsYXNzXCIsIFwieWVhciBzdmVsdGUtMXZ3cjlkZFwiKTtcblx0XHRcdGF0dHIoaDMsIFwiY2xhc3NcIiwgXCJ0aXRsZSBzdmVsdGUtMXZ3cjlkZFwiKTtcblx0XHRcdGF0dHIoZGl2MCwgXCJjbGFzc1wiLCBcInJlc2V0LWJ1dHRvbiBzdmVsdGUtMXZ3cjlkZFwiKTtcblx0XHRcdGF0dHIoZGl2MSwgXCJjbGFzc1wiLCBcInJpZ2h0LW5hdiBzdmVsdGUtMXZ3cjlkZFwiKTtcblx0XHRcdGF0dHIoZGl2MiwgXCJjbGFzc1wiLCBcIm5hdiBzdmVsdGUtMXZ3cjlkZFwiKTtcblx0XHRcdHRvZ2dsZV9jbGFzcyhkaXYyLCBcImlzLW1vYmlsZVwiLCAvKmlzTW9iaWxlKi8gY3R4WzVdKTtcblx0XHR9LFxuXHRcdG0odGFyZ2V0LCBhbmNob3IpIHtcblx0XHRcdGluc2VydCh0YXJnZXQsIGRpdjIsIGFuY2hvcik7XG5cdFx0XHRhcHBlbmQoZGl2MiwgaDMpO1xuXHRcdFx0YXBwZW5kKGgzLCBzcGFuMCk7XG5cdFx0XHRhcHBlbmQoc3BhbjAsIHQwKTtcblx0XHRcdGFwcGVuZChoMywgdDEpO1xuXHRcdFx0YXBwZW5kKGgzLCBzcGFuMSk7XG5cdFx0XHRhcHBlbmQoc3BhbjEsIHQyKTtcblx0XHRcdGFwcGVuZChkaXYyLCB0Myk7XG5cdFx0XHRhcHBlbmQoZGl2MiwgZGl2MSk7XG5cdFx0XHRtb3VudF9jb21wb25lbnQoYXJyb3cwLCBkaXYxLCBudWxsKTtcblx0XHRcdGFwcGVuZChkaXYxLCB0NCk7XG5cdFx0XHRhcHBlbmQoZGl2MSwgZGl2MCk7XG5cdFx0XHRhcHBlbmQoZGl2MSwgdDYpO1xuXHRcdFx0bW91bnRfY29tcG9uZW50KGFycm93MSwgZGl2MSwgbnVsbCk7XG5cdFx0XHRjdXJyZW50ID0gdHJ1ZTtcblxuXHRcdFx0aWYgKCFtb3VudGVkKSB7XG5cdFx0XHRcdGRpc3Bvc2UgPSBbXG5cdFx0XHRcdFx0bGlzdGVuKGgzLCBcImNsaWNrXCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdGlmIChpc19mdW5jdGlvbigvKnJlc2V0RGlzcGxheWVkTW9udGgqLyBjdHhbMV0pKSAvKnJlc2V0RGlzcGxheWVkTW9udGgqLyBjdHhbMV0uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRsaXN0ZW4oZGl2MCwgXCJjbGlja1wiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRpZiAoaXNfZnVuY3Rpb24oLypyZXNldERpc3BsYXllZE1vbnRoKi8gY3R4WzFdKSkgLypyZXNldERpc3BsYXllZE1vbnRoKi8gY3R4WzFdLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XTtcblxuXHRcdFx0XHRtb3VudGVkID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdHAobmV3X2N0eCwgW2RpcnR5XSkge1xuXHRcdFx0Y3R4ID0gbmV3X2N0eDtcblx0XHRcdGlmICgoIWN1cnJlbnQgfHwgZGlydHkgJiAvKmRpc3BsYXllZE1vbnRoKi8gMSkgJiYgdDBfdmFsdWUgIT09ICh0MF92YWx1ZSA9IC8qZGlzcGxheWVkTW9udGgqLyBjdHhbMF0uZm9ybWF0KFwiTU1NXCIpICsgXCJcIikpIHNldF9kYXRhKHQwLCB0MF92YWx1ZSk7XG5cdFx0XHRpZiAoKCFjdXJyZW50IHx8IGRpcnR5ICYgLypkaXNwbGF5ZWRNb250aCovIDEpICYmIHQyX3ZhbHVlICE9PSAodDJfdmFsdWUgPSAvKmRpc3BsYXllZE1vbnRoKi8gY3R4WzBdLmZvcm1hdChcIllZWVlcIikgKyBcIlwiKSkgc2V0X2RhdGEodDIsIHQyX3ZhbHVlKTtcblx0XHRcdGNvbnN0IGFycm93MF9jaGFuZ2VzID0ge307XG5cdFx0XHRpZiAoZGlydHkgJiAvKmRlY3JlbWVudERpc3BsYXllZE1vbnRoKi8gOCkgYXJyb3cwX2NoYW5nZXMub25DbGljayA9IC8qZGVjcmVtZW50RGlzcGxheWVkTW9udGgqLyBjdHhbM107XG5cdFx0XHRhcnJvdzAuJHNldChhcnJvdzBfY2hhbmdlcyk7XG5cdFx0XHRjb25zdCBhcnJvdzFfY2hhbmdlcyA9IHt9O1xuXHRcdFx0aWYgKGRpcnR5ICYgLyppbmNyZW1lbnREaXNwbGF5ZWRNb250aCovIDQpIGFycm93MV9jaGFuZ2VzLm9uQ2xpY2sgPSAvKmluY3JlbWVudERpc3BsYXllZE1vbnRoKi8gY3R4WzJdO1xuXHRcdFx0YXJyb3cxLiRzZXQoYXJyb3cxX2NoYW5nZXMpO1xuXHRcdH0sXG5cdFx0aShsb2NhbCkge1xuXHRcdFx0aWYgKGN1cnJlbnQpIHJldHVybjtcblx0XHRcdHRyYW5zaXRpb25faW4oYXJyb3cwLiQkLmZyYWdtZW50LCBsb2NhbCk7XG5cdFx0XHR0cmFuc2l0aW9uX2luKGFycm93MS4kJC5mcmFnbWVudCwgbG9jYWwpO1xuXHRcdFx0Y3VycmVudCA9IHRydWU7XG5cdFx0fSxcblx0XHRvKGxvY2FsKSB7XG5cdFx0XHR0cmFuc2l0aW9uX291dChhcnJvdzAuJCQuZnJhZ21lbnQsIGxvY2FsKTtcblx0XHRcdHRyYW5zaXRpb25fb3V0KGFycm93MS4kJC5mcmFnbWVudCwgbG9jYWwpO1xuXHRcdFx0Y3VycmVudCA9IGZhbHNlO1xuXHRcdH0sXG5cdFx0ZChkZXRhY2hpbmcpIHtcblx0XHRcdGlmIChkZXRhY2hpbmcpIGRldGFjaChkaXYyKTtcblx0XHRcdGRlc3Ryb3lfY29tcG9uZW50KGFycm93MCk7XG5cdFx0XHRkZXN0cm95X2NvbXBvbmVudChhcnJvdzEpO1xuXHRcdFx0bW91bnRlZCA9IGZhbHNlO1xuXHRcdFx0cnVuX2FsbChkaXNwb3NlKTtcblx0XHR9XG5cdH07XG59XG5cbmZ1bmN0aW9uIGluc3RhbmNlJDIoJCRzZWxmLCAkJHByb3BzLCAkJGludmFsaWRhdGUpIHtcblx0XG5cdGxldCB7IGRpc3BsYXllZE1vbnRoIH0gPSAkJHByb3BzO1xuXHRsZXQgeyB0b2RheSB9ID0gJCRwcm9wcztcblx0bGV0IHsgcmVzZXREaXNwbGF5ZWRNb250aCB9ID0gJCRwcm9wcztcblx0bGV0IHsgaW5jcmVtZW50RGlzcGxheWVkTW9udGggfSA9ICQkcHJvcHM7XG5cdGxldCB7IGRlY3JlbWVudERpc3BsYXllZE1vbnRoIH0gPSAkJHByb3BzO1xuXG5cdC8vIEdldCB0aGUgd29yZCAnVG9kYXknIGJ1dCBsb2NhbGl6ZWQgdG8gdGhlIGN1cnJlbnQgbGFuZ3VhZ2Vcblx0Y29uc3QgdG9kYXlEaXNwbGF5U3RyID0gdG9kYXkuY2FsZW5kYXIoKS5zcGxpdCgvXFxkfFxccy8pWzBdO1xuXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5cdGxldCBpc01vYmlsZSA9IHdpbmRvdy5hcHAuaXNNb2JpbGU7XG5cblx0JCRzZWxmLiQkc2V0ID0gJCRwcm9wcyA9PiB7XG5cdFx0aWYgKFwiZGlzcGxheWVkTW9udGhcIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoMCwgZGlzcGxheWVkTW9udGggPSAkJHByb3BzLmRpc3BsYXllZE1vbnRoKTtcblx0XHRpZiAoXCJ0b2RheVwiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSg2LCB0b2RheSA9ICQkcHJvcHMudG9kYXkpO1xuXHRcdGlmIChcInJlc2V0RGlzcGxheWVkTW9udGhcIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoMSwgcmVzZXREaXNwbGF5ZWRNb250aCA9ICQkcHJvcHMucmVzZXREaXNwbGF5ZWRNb250aCk7XG5cdFx0aWYgKFwiaW5jcmVtZW50RGlzcGxheWVkTW9udGhcIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoMiwgaW5jcmVtZW50RGlzcGxheWVkTW9udGggPSAkJHByb3BzLmluY3JlbWVudERpc3BsYXllZE1vbnRoKTtcblx0XHRpZiAoXCJkZWNyZW1lbnREaXNwbGF5ZWRNb250aFwiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSgzLCBkZWNyZW1lbnREaXNwbGF5ZWRNb250aCA9ICQkcHJvcHMuZGVjcmVtZW50RGlzcGxheWVkTW9udGgpO1xuXHR9O1xuXG5cdHJldHVybiBbXG5cdFx0ZGlzcGxheWVkTW9udGgsXG5cdFx0cmVzZXREaXNwbGF5ZWRNb250aCxcblx0XHRpbmNyZW1lbnREaXNwbGF5ZWRNb250aCxcblx0XHRkZWNyZW1lbnREaXNwbGF5ZWRNb250aCxcblx0XHR0b2RheURpc3BsYXlTdHIsXG5cdFx0aXNNb2JpbGUsXG5cdFx0dG9kYXlcblx0XTtcbn1cblxuY2xhc3MgTmF2IGV4dGVuZHMgU3ZlbHRlQ29tcG9uZW50IHtcblx0Y29uc3RydWN0b3Iob3B0aW9ucykge1xuXHRcdHN1cGVyKCk7XG5cdFx0aWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInN2ZWx0ZS0xdndyOWRkLXN0eWxlXCIpKSBhZGRfY3NzJDIoKTtcblxuXHRcdGluaXQodGhpcywgb3B0aW9ucywgaW5zdGFuY2UkMiwgY3JlYXRlX2ZyYWdtZW50JDIsIHNhZmVfbm90X2VxdWFsLCB7XG5cdFx0XHRkaXNwbGF5ZWRNb250aDogMCxcblx0XHRcdHRvZGF5OiA2LFxuXHRcdFx0cmVzZXREaXNwbGF5ZWRNb250aDogMSxcblx0XHRcdGluY3JlbWVudERpc3BsYXllZE1vbnRoOiAyLFxuXHRcdFx0ZGVjcmVtZW50RGlzcGxheWVkTW9udGg6IDNcblx0XHR9KTtcblx0fVxufVxuXG4vKiBzcmMvY29tcG9uZW50cy9XZWVrTnVtLnN2ZWx0ZSBnZW5lcmF0ZWQgYnkgU3ZlbHRlIHYzLjM1LjAgKi9cblxuZnVuY3Rpb24gYWRkX2NzcyQxKCkge1xuXHR2YXIgc3R5bGUgPSBlbGVtZW50KFwic3R5bGVcIik7XG5cdHN0eWxlLmlkID0gXCJzdmVsdGUtZWd0MHlkLXN0eWxlXCI7XG5cdHN0eWxlLnRleHRDb250ZW50ID0gXCJ0ZC5zdmVsdGUtZWd0MHlke2JvcmRlci1yaWdodDoxcHggc29saWQgdmFyKC0tYmFja2dyb3VuZC1tb2RpZmllci1ib3JkZXIpfS53ZWVrLW51bS5zdmVsdGUtZWd0MHlke2JhY2tncm91bmQtY29sb3I6dmFyKC0tY29sb3ItYmFja2dyb3VuZC13ZWVrbnVtKTtib3JkZXItcmFkaXVzOjRweDtjb2xvcjp2YXIoLS1jb2xvci10ZXh0LXdlZWtudW0pO2N1cnNvcjpwb2ludGVyO2ZvbnQtc2l6ZTowLjY1ZW07aGVpZ2h0OjEwMCU7cGFkZGluZzo0cHg7dGV4dC1hbGlnbjpjZW50ZXI7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDAuMXMgZWFzZS1pbiwgY29sb3IgMC4xcyBlYXNlLWluO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lfS53ZWVrLW51bS5zdmVsdGUtZWd0MHlkOmhvdmVye2JhY2tncm91bmQtY29sb3I6dmFyKC0taW50ZXJhY3RpdmUtaG92ZXIpfS53ZWVrLW51bS5hY3RpdmUuc3ZlbHRlLWVndDB5ZDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWludGVyYWN0aXZlLWFjY2VudC1ob3Zlcil9LmFjdGl2ZS5zdmVsdGUtZWd0MHlke2NvbG9yOnZhcigtLXRleHQtb24tYWNjZW50KTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWludGVyYWN0aXZlLWFjY2VudCl9LmRvdC1jb250YWluZXIuc3ZlbHRlLWVndDB5ZHtkaXNwbGF5OmZsZXg7ZmxleC13cmFwOndyYXA7anVzdGlmeS1jb250ZW50OmNlbnRlcjtsaW5lLWhlaWdodDo2cHg7bWluLWhlaWdodDo2cHh9XCI7XG5cdGFwcGVuZChkb2N1bWVudC5oZWFkLCBzdHlsZSk7XG59XG5cbmZ1bmN0aW9uIGdldF9lYWNoX2NvbnRleHQkMShjdHgsIGxpc3QsIGkpIHtcblx0Y29uc3QgY2hpbGRfY3R4ID0gY3R4LnNsaWNlKCk7XG5cdGNoaWxkX2N0eFsxMV0gPSBsaXN0W2ldO1xuXHRyZXR1cm4gY2hpbGRfY3R4O1xufVxuXG4vLyAoMzU6OCkgeyNlYWNoIG1ldGFkYXRhLmRvdHMgYXMgZG90fVxuZnVuY3Rpb24gY3JlYXRlX2VhY2hfYmxvY2skMShjdHgpIHtcblx0bGV0IGRvdDtcblx0bGV0IGN1cnJlbnQ7XG5cdGNvbnN0IGRvdF9zcHJlYWRfbGV2ZWxzID0gWy8qZG90Ki8gY3R4WzExXV07XG5cdGxldCBkb3RfcHJvcHMgPSB7fTtcblxuXHRmb3IgKGxldCBpID0gMDsgaSA8IGRvdF9zcHJlYWRfbGV2ZWxzLmxlbmd0aDsgaSArPSAxKSB7XG5cdFx0ZG90X3Byb3BzID0gYXNzaWduKGRvdF9wcm9wcywgZG90X3NwcmVhZF9sZXZlbHNbaV0pO1xuXHR9XG5cblx0ZG90ID0gbmV3IERvdCh7IHByb3BzOiBkb3RfcHJvcHMgfSk7XG5cblx0cmV0dXJuIHtcblx0XHRjKCkge1xuXHRcdFx0Y3JlYXRlX2NvbXBvbmVudChkb3QuJCQuZnJhZ21lbnQpO1xuXHRcdH0sXG5cdFx0bSh0YXJnZXQsIGFuY2hvcikge1xuXHRcdFx0bW91bnRfY29tcG9uZW50KGRvdCwgdGFyZ2V0LCBhbmNob3IpO1xuXHRcdFx0Y3VycmVudCA9IHRydWU7XG5cdFx0fSxcblx0XHRwKGN0eCwgZGlydHkpIHtcblx0XHRcdGNvbnN0IGRvdF9jaGFuZ2VzID0gKGRpcnR5ICYgLyptZXRhZGF0YSovIDY0KVxuXHRcdFx0PyBnZXRfc3ByZWFkX3VwZGF0ZShkb3Rfc3ByZWFkX2xldmVscywgW2dldF9zcHJlYWRfb2JqZWN0KC8qZG90Ki8gY3R4WzExXSldKVxuXHRcdFx0OiB7fTtcblxuXHRcdFx0ZG90LiRzZXQoZG90X2NoYW5nZXMpO1xuXHRcdH0sXG5cdFx0aShsb2NhbCkge1xuXHRcdFx0aWYgKGN1cnJlbnQpIHJldHVybjtcblx0XHRcdHRyYW5zaXRpb25faW4oZG90LiQkLmZyYWdtZW50LCBsb2NhbCk7XG5cdFx0XHRjdXJyZW50ID0gdHJ1ZTtcblx0XHR9LFxuXHRcdG8obG9jYWwpIHtcblx0XHRcdHRyYW5zaXRpb25fb3V0KGRvdC4kJC5mcmFnbWVudCwgbG9jYWwpO1xuXHRcdFx0Y3VycmVudCA9IGZhbHNlO1xuXHRcdH0sXG5cdFx0ZChkZXRhY2hpbmcpIHtcblx0XHRcdGRlc3Ryb3lfY29tcG9uZW50KGRvdCwgZGV0YWNoaW5nKTtcblx0XHR9XG5cdH07XG59XG5cbi8vICgyNDoyKSA8TWV0YWRhdGFSZXNvbHZlciBtZXRhZGF0YT1cInttZXRhZGF0YX1cIiBsZXQ6bWV0YWRhdGE+XG5mdW5jdGlvbiBjcmVhdGVfZGVmYXVsdF9zbG90KGN0eCkge1xuXHRsZXQgZGl2MTtcblx0bGV0IHQwO1xuXHRsZXQgdDE7XG5cdGxldCBkaXYwO1xuXHRsZXQgZGl2MV9jbGFzc192YWx1ZTtcblx0bGV0IGN1cnJlbnQ7XG5cdGxldCBtb3VudGVkO1xuXHRsZXQgZGlzcG9zZTtcblx0bGV0IGVhY2hfdmFsdWUgPSAvKm1ldGFkYXRhKi8gY3R4WzZdLmRvdHM7XG5cdGxldCBlYWNoX2Jsb2NrcyA9IFtdO1xuXG5cdGZvciAobGV0IGkgPSAwOyBpIDwgZWFjaF92YWx1ZS5sZW5ndGg7IGkgKz0gMSkge1xuXHRcdGVhY2hfYmxvY2tzW2ldID0gY3JlYXRlX2VhY2hfYmxvY2skMShnZXRfZWFjaF9jb250ZXh0JDEoY3R4LCBlYWNoX3ZhbHVlLCBpKSk7XG5cdH1cblxuXHRjb25zdCBvdXQgPSBpID0+IHRyYW5zaXRpb25fb3V0KGVhY2hfYmxvY2tzW2ldLCAxLCAxLCAoKSA9PiB7XG5cdFx0ZWFjaF9ibG9ja3NbaV0gPSBudWxsO1xuXHR9KTtcblxuXHRyZXR1cm4ge1xuXHRcdGMoKSB7XG5cdFx0XHRkaXYxID0gZWxlbWVudChcImRpdlwiKTtcblx0XHRcdHQwID0gdGV4dCgvKndlZWtOdW0qLyBjdHhbMF0pO1xuXHRcdFx0dDEgPSBzcGFjZSgpO1xuXHRcdFx0ZGl2MCA9IGVsZW1lbnQoXCJkaXZcIik7XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgZWFjaF9ibG9ja3MubGVuZ3RoOyBpICs9IDEpIHtcblx0XHRcdFx0ZWFjaF9ibG9ja3NbaV0uYygpO1xuXHRcdFx0fVxuXG5cdFx0XHRhdHRyKGRpdjAsIFwiY2xhc3NcIiwgXCJkb3QtY29udGFpbmVyIHN2ZWx0ZS1lZ3QweWRcIik7XG5cdFx0XHRhdHRyKGRpdjEsIFwiY2xhc3NcIiwgZGl2MV9jbGFzc192YWx1ZSA9IFwiXCIgKyAobnVsbF90b19lbXB0eShgd2Vlay1udW0gJHsvKm1ldGFkYXRhKi8gY3R4WzZdLmNsYXNzZXMuam9pbihcIiBcIil9YCkgKyBcIiBzdmVsdGUtZWd0MHlkXCIpKTtcblx0XHRcdHRvZ2dsZV9jbGFzcyhkaXYxLCBcImFjdGl2ZVwiLCAvKnNlbGVjdGVkSWQqLyBjdHhbNV0gPT09IGdldERhdGVVSURfMSgvKmRheXMqLyBjdHhbMV1bMF0sIFwid2Vla1wiKSk7XG5cdFx0fSxcblx0XHRtKHRhcmdldCwgYW5jaG9yKSB7XG5cdFx0XHRpbnNlcnQodGFyZ2V0LCBkaXYxLCBhbmNob3IpO1xuXHRcdFx0YXBwZW5kKGRpdjEsIHQwKTtcblx0XHRcdGFwcGVuZChkaXYxLCB0MSk7XG5cdFx0XHRhcHBlbmQoZGl2MSwgZGl2MCk7XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgZWFjaF9ibG9ja3MubGVuZ3RoOyBpICs9IDEpIHtcblx0XHRcdFx0ZWFjaF9ibG9ja3NbaV0ubShkaXYwLCBudWxsKTtcblx0XHRcdH1cblxuXHRcdFx0Y3VycmVudCA9IHRydWU7XG5cblx0XHRcdGlmICghbW91bnRlZCkge1xuXHRcdFx0XHRkaXNwb3NlID0gW1xuXHRcdFx0XHRcdGxpc3RlbihkaXYxLCBcImNsaWNrXCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdGlmIChpc19mdW5jdGlvbigvKm9uQ2xpY2sqLyBjdHhbM10gJiYgLypjbGlja19oYW5kbGVyKi8gY3R4WzhdKSkgKC8qb25DbGljayovIGN0eFszXSAmJiAvKmNsaWNrX2hhbmRsZXIqLyBjdHhbOF0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0bGlzdGVuKGRpdjEsIFwiY29udGV4dG1lbnVcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0aWYgKGlzX2Z1bmN0aW9uKC8qb25Db250ZXh0TWVudSovIGN0eFs0XSAmJiAvKmNvbnRleHRtZW51X2hhbmRsZXIqLyBjdHhbOV0pKSAoLypvbkNvbnRleHRNZW51Ki8gY3R4WzRdICYmIC8qY29udGV4dG1lbnVfaGFuZGxlciovIGN0eFs5XSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRsaXN0ZW4oZGl2MSwgXCJwb2ludGVyb3ZlclwiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRpZiAoaXNfZnVuY3Rpb24oLypvbkhvdmVyKi8gY3R4WzJdICYmIC8qcG9pbnRlcm92ZXJfaGFuZGxlciovIGN0eFsxMF0pKSAoLypvbkhvdmVyKi8gY3R4WzJdICYmIC8qcG9pbnRlcm92ZXJfaGFuZGxlciovIGN0eFsxMF0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XTtcblxuXHRcdFx0XHRtb3VudGVkID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdHAobmV3X2N0eCwgZGlydHkpIHtcblx0XHRcdGN0eCA9IG5ld19jdHg7XG5cdFx0XHRpZiAoIWN1cnJlbnQgfHwgZGlydHkgJiAvKndlZWtOdW0qLyAxKSBzZXRfZGF0YSh0MCwgLyp3ZWVrTnVtKi8gY3R4WzBdKTtcblxuXHRcdFx0aWYgKGRpcnR5ICYgLyptZXRhZGF0YSovIDY0KSB7XG5cdFx0XHRcdGVhY2hfdmFsdWUgPSAvKm1ldGFkYXRhKi8gY3R4WzZdLmRvdHM7XG5cdFx0XHRcdGxldCBpO1xuXG5cdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBlYWNoX3ZhbHVlLmxlbmd0aDsgaSArPSAxKSB7XG5cdFx0XHRcdFx0Y29uc3QgY2hpbGRfY3R4ID0gZ2V0X2VhY2hfY29udGV4dCQxKGN0eCwgZWFjaF92YWx1ZSwgaSk7XG5cblx0XHRcdFx0XHRpZiAoZWFjaF9ibG9ja3NbaV0pIHtcblx0XHRcdFx0XHRcdGVhY2hfYmxvY2tzW2ldLnAoY2hpbGRfY3R4LCBkaXJ0eSk7XG5cdFx0XHRcdFx0XHR0cmFuc2l0aW9uX2luKGVhY2hfYmxvY2tzW2ldLCAxKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0ZWFjaF9ibG9ja3NbaV0gPSBjcmVhdGVfZWFjaF9ibG9jayQxKGNoaWxkX2N0eCk7XG5cdFx0XHRcdFx0XHRlYWNoX2Jsb2Nrc1tpXS5jKCk7XG5cdFx0XHRcdFx0XHR0cmFuc2l0aW9uX2luKGVhY2hfYmxvY2tzW2ldLCAxKTtcblx0XHRcdFx0XHRcdGVhY2hfYmxvY2tzW2ldLm0oZGl2MCwgbnVsbCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Z3JvdXBfb3V0cm9zKCk7XG5cblx0XHRcdFx0Zm9yIChpID0gZWFjaF92YWx1ZS5sZW5ndGg7IGkgPCBlYWNoX2Jsb2Nrcy5sZW5ndGg7IGkgKz0gMSkge1xuXHRcdFx0XHRcdG91dChpKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNoZWNrX291dHJvcygpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIWN1cnJlbnQgfHwgZGlydHkgJiAvKm1ldGFkYXRhKi8gNjQgJiYgZGl2MV9jbGFzc192YWx1ZSAhPT0gKGRpdjFfY2xhc3NfdmFsdWUgPSBcIlwiICsgKG51bGxfdG9fZW1wdHkoYHdlZWstbnVtICR7LyptZXRhZGF0YSovIGN0eFs2XS5jbGFzc2VzLmpvaW4oXCIgXCIpfWApICsgXCIgc3ZlbHRlLWVndDB5ZFwiKSkpIHtcblx0XHRcdFx0YXR0cihkaXYxLCBcImNsYXNzXCIsIGRpdjFfY2xhc3NfdmFsdWUpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoZGlydHkgJiAvKm1ldGFkYXRhLCBzZWxlY3RlZElkLCBnZXREYXRlVUlELCBkYXlzKi8gOTgpIHtcblx0XHRcdFx0dG9nZ2xlX2NsYXNzKGRpdjEsIFwiYWN0aXZlXCIsIC8qc2VsZWN0ZWRJZCovIGN0eFs1XSA9PT0gZ2V0RGF0ZVVJRF8xKC8qZGF5cyovIGN0eFsxXVswXSwgXCJ3ZWVrXCIpKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdGkobG9jYWwpIHtcblx0XHRcdGlmIChjdXJyZW50KSByZXR1cm47XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgZWFjaF92YWx1ZS5sZW5ndGg7IGkgKz0gMSkge1xuXHRcdFx0XHR0cmFuc2l0aW9uX2luKGVhY2hfYmxvY2tzW2ldKTtcblx0XHRcdH1cblxuXHRcdFx0Y3VycmVudCA9IHRydWU7XG5cdFx0fSxcblx0XHRvKGxvY2FsKSB7XG5cdFx0XHRlYWNoX2Jsb2NrcyA9IGVhY2hfYmxvY2tzLmZpbHRlcihCb29sZWFuKTtcblxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBlYWNoX2Jsb2Nrcy5sZW5ndGg7IGkgKz0gMSkge1xuXHRcdFx0XHR0cmFuc2l0aW9uX291dChlYWNoX2Jsb2Nrc1tpXSk7XG5cdFx0XHR9XG5cblx0XHRcdGN1cnJlbnQgPSBmYWxzZTtcblx0XHR9LFxuXHRcdGQoZGV0YWNoaW5nKSB7XG5cdFx0XHRpZiAoZGV0YWNoaW5nKSBkZXRhY2goZGl2MSk7XG5cdFx0XHRkZXN0cm95X2VhY2goZWFjaF9ibG9ja3MsIGRldGFjaGluZyk7XG5cdFx0XHRtb3VudGVkID0gZmFsc2U7XG5cdFx0XHRydW5fYWxsKGRpc3Bvc2UpO1xuXHRcdH1cblx0fTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlX2ZyYWdtZW50JDEoY3R4KSB7XG5cdGxldCB0ZDtcblx0bGV0IG1ldGFkYXRhcmVzb2x2ZXI7XG5cdGxldCBjdXJyZW50O1xuXG5cdG1ldGFkYXRhcmVzb2x2ZXIgPSBuZXcgTWV0YWRhdGFSZXNvbHZlcih7XG5cdFx0XHRwcm9wczoge1xuXHRcdFx0XHRtZXRhZGF0YTogLyptZXRhZGF0YSovIGN0eFs2XSxcblx0XHRcdFx0JCRzbG90czoge1xuXHRcdFx0XHRcdGRlZmF1bHQ6IFtcblx0XHRcdFx0XHRcdGNyZWF0ZV9kZWZhdWx0X3Nsb3QsXG5cdFx0XHRcdFx0XHQoeyBtZXRhZGF0YSB9KSA9PiAoeyA2OiBtZXRhZGF0YSB9KSxcblx0XHRcdFx0XHRcdCh7IG1ldGFkYXRhIH0pID0+IG1ldGFkYXRhID8gNjQgOiAwXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQkJHNjb3BlOiB7IGN0eCB9XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0cmV0dXJuIHtcblx0XHRjKCkge1xuXHRcdFx0dGQgPSBlbGVtZW50KFwidGRcIik7XG5cdFx0XHRjcmVhdGVfY29tcG9uZW50KG1ldGFkYXRhcmVzb2x2ZXIuJCQuZnJhZ21lbnQpO1xuXHRcdFx0YXR0cih0ZCwgXCJjbGFzc1wiLCBcInN2ZWx0ZS1lZ3QweWRcIik7XG5cdFx0fSxcblx0XHRtKHRhcmdldCwgYW5jaG9yKSB7XG5cdFx0XHRpbnNlcnQodGFyZ2V0LCB0ZCwgYW5jaG9yKTtcblx0XHRcdG1vdW50X2NvbXBvbmVudChtZXRhZGF0YXJlc29sdmVyLCB0ZCwgbnVsbCk7XG5cdFx0XHRjdXJyZW50ID0gdHJ1ZTtcblx0XHR9LFxuXHRcdHAoY3R4LCBbZGlydHldKSB7XG5cdFx0XHRjb25zdCBtZXRhZGF0YXJlc29sdmVyX2NoYW5nZXMgPSB7fTtcblx0XHRcdGlmIChkaXJ0eSAmIC8qbWV0YWRhdGEqLyA2NCkgbWV0YWRhdGFyZXNvbHZlcl9jaGFuZ2VzLm1ldGFkYXRhID0gLyptZXRhZGF0YSovIGN0eFs2XTtcblxuXHRcdFx0aWYgKGRpcnR5ICYgLyokJHNjb3BlLCBtZXRhZGF0YSwgc2VsZWN0ZWRJZCwgZGF5cywgb25DbGljaywgc3RhcnRPZldlZWssIG9uQ29udGV4dE1lbnUsIG9uSG92ZXIsIHdlZWtOdW0qLyAxNjYzOSkge1xuXHRcdFx0XHRtZXRhZGF0YXJlc29sdmVyX2NoYW5nZXMuJCRzY29wZSA9IHsgZGlydHksIGN0eCB9O1xuXHRcdFx0fVxuXG5cdFx0XHRtZXRhZGF0YXJlc29sdmVyLiRzZXQobWV0YWRhdGFyZXNvbHZlcl9jaGFuZ2VzKTtcblx0XHR9LFxuXHRcdGkobG9jYWwpIHtcblx0XHRcdGlmIChjdXJyZW50KSByZXR1cm47XG5cdFx0XHR0cmFuc2l0aW9uX2luKG1ldGFkYXRhcmVzb2x2ZXIuJCQuZnJhZ21lbnQsIGxvY2FsKTtcblx0XHRcdGN1cnJlbnQgPSB0cnVlO1xuXHRcdH0sXG5cdFx0byhsb2NhbCkge1xuXHRcdFx0dHJhbnNpdGlvbl9vdXQobWV0YWRhdGFyZXNvbHZlci4kJC5mcmFnbWVudCwgbG9jYWwpO1xuXHRcdFx0Y3VycmVudCA9IGZhbHNlO1xuXHRcdH0sXG5cdFx0ZChkZXRhY2hpbmcpIHtcblx0XHRcdGlmIChkZXRhY2hpbmcpIGRldGFjaCh0ZCk7XG5cdFx0XHRkZXN0cm95X2NvbXBvbmVudChtZXRhZGF0YXJlc29sdmVyKTtcblx0XHR9XG5cdH07XG59XG5cbmZ1bmN0aW9uIGluc3RhbmNlJDEoJCRzZWxmLCAkJHByb3BzLCAkJGludmFsaWRhdGUpIHtcblx0XG5cdFxuXHRsZXQgeyB3ZWVrTnVtIH0gPSAkJHByb3BzO1xuXHRsZXQgeyBkYXlzIH0gPSAkJHByb3BzO1xuXHRsZXQgeyBtZXRhZGF0YSB9ID0gJCRwcm9wcztcblx0bGV0IHsgb25Ib3ZlciB9ID0gJCRwcm9wcztcblx0bGV0IHsgb25DbGljayB9ID0gJCRwcm9wcztcblx0bGV0IHsgb25Db250ZXh0TWVudSB9ID0gJCRwcm9wcztcblx0bGV0IHsgc2VsZWN0ZWRJZCA9IG51bGwgfSA9ICQkcHJvcHM7XG5cdGxldCBzdGFydE9mV2Vlaztcblx0Y29uc3QgY2xpY2tfaGFuZGxlciA9IGUgPT4gb25DbGljayhzdGFydE9mV2VlaywgaXNNZXRhUHJlc3NlZChlKSk7XG5cdGNvbnN0IGNvbnRleHRtZW51X2hhbmRsZXIgPSBlID0+IG9uQ29udGV4dE1lbnUoZGF5c1swXSwgZSk7XG5cdGNvbnN0IHBvaW50ZXJvdmVyX2hhbmRsZXIgPSBlID0+IG9uSG92ZXIoc3RhcnRPZldlZWssIGUudGFyZ2V0LCBpc01ldGFQcmVzc2VkKGUpKTtcblxuXHQkJHNlbGYuJCRzZXQgPSAkJHByb3BzID0+IHtcblx0XHRpZiAoXCJ3ZWVrTnVtXCIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDAsIHdlZWtOdW0gPSAkJHByb3BzLndlZWtOdW0pO1xuXHRcdGlmIChcImRheXNcIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoMSwgZGF5cyA9ICQkcHJvcHMuZGF5cyk7XG5cdFx0aWYgKFwibWV0YWRhdGFcIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoNiwgbWV0YWRhdGEgPSAkJHByb3BzLm1ldGFkYXRhKTtcblx0XHRpZiAoXCJvbkhvdmVyXCIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDIsIG9uSG92ZXIgPSAkJHByb3BzLm9uSG92ZXIpO1xuXHRcdGlmIChcIm9uQ2xpY2tcIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoMywgb25DbGljayA9ICQkcHJvcHMub25DbGljayk7XG5cdFx0aWYgKFwib25Db250ZXh0TWVudVwiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSg0LCBvbkNvbnRleHRNZW51ID0gJCRwcm9wcy5vbkNvbnRleHRNZW51KTtcblx0XHRpZiAoXCJzZWxlY3RlZElkXCIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDUsIHNlbGVjdGVkSWQgPSAkJHByb3BzLnNlbGVjdGVkSWQpO1xuXHR9O1xuXG5cdCQkc2VsZi4kJC51cGRhdGUgPSAoKSA9PiB7XG5cdFx0aWYgKCQkc2VsZi4kJC5kaXJ0eSAmIC8qZGF5cyovIDIpIHtcblx0XHRcdCQkaW52YWxpZGF0ZSg3LCBzdGFydE9mV2VlayA9IGdldFN0YXJ0T2ZXZWVrKGRheXMpKTtcblx0XHR9XG5cdH07XG5cblx0cmV0dXJuIFtcblx0XHR3ZWVrTnVtLFxuXHRcdGRheXMsXG5cdFx0b25Ib3Zlcixcblx0XHRvbkNsaWNrLFxuXHRcdG9uQ29udGV4dE1lbnUsXG5cdFx0c2VsZWN0ZWRJZCxcblx0XHRtZXRhZGF0YSxcblx0XHRzdGFydE9mV2Vlayxcblx0XHRjbGlja19oYW5kbGVyLFxuXHRcdGNvbnRleHRtZW51X2hhbmRsZXIsXG5cdFx0cG9pbnRlcm92ZXJfaGFuZGxlclxuXHRdO1xufVxuXG5jbGFzcyBXZWVrTnVtIGV4dGVuZHMgU3ZlbHRlQ29tcG9uZW50IHtcblx0Y29uc3RydWN0b3Iob3B0aW9ucykge1xuXHRcdHN1cGVyKCk7XG5cdFx0aWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInN2ZWx0ZS1lZ3QweWQtc3R5bGVcIikpIGFkZF9jc3MkMSgpO1xuXG5cdFx0aW5pdCh0aGlzLCBvcHRpb25zLCBpbnN0YW5jZSQxLCBjcmVhdGVfZnJhZ21lbnQkMSwgbm90X2VxdWFsLCB7XG5cdFx0XHR3ZWVrTnVtOiAwLFxuXHRcdFx0ZGF5czogMSxcblx0XHRcdG1ldGFkYXRhOiA2LFxuXHRcdFx0b25Ib3ZlcjogMixcblx0XHRcdG9uQ2xpY2s6IDMsXG5cdFx0XHRvbkNvbnRleHRNZW51OiA0LFxuXHRcdFx0c2VsZWN0ZWRJZDogNVxuXHRcdH0pO1xuXHR9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1ldGFkYXRhUmVkdWNlcihwcm9taXNlZE1ldGFkYXRhKSB7XG4gICAgY29uc3QgbWV0YSA9IHtcbiAgICAgICAgZG90czogW10sXG4gICAgICAgIGNsYXNzZXM6IFtdLFxuICAgICAgICBkYXRhQXR0cmlidXRlczoge30sXG4gICAgfTtcbiAgICBjb25zdCBtZXRhcyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VkTWV0YWRhdGEpO1xuICAgIHJldHVybiBtZXRhcy5yZWR1Y2UoKGFjYywgbWV0YSkgPT4gKHtcbiAgICAgICAgY2xhc3NlczogWy4uLmFjYy5jbGFzc2VzLCAuLi4obWV0YS5jbGFzc2VzIHx8IFtdKV0sXG4gICAgICAgIGRhdGFBdHRyaWJ1dGVzOiBPYmplY3QuYXNzaWduKGFjYy5kYXRhQXR0cmlidXRlcywgbWV0YS5kYXRhQXR0cmlidXRlcyksXG4gICAgICAgIGRvdHM6IFsuLi5hY2MuZG90cywgLi4uKG1ldGEuZG90cyB8fCBbXSldLFxuICAgIH0pLCBtZXRhKTtcbn1cbmZ1bmN0aW9uIGdldERhaWx5TWV0YWRhdGEoc291cmNlcywgZGF0ZSwgLi4uX2FyZ3MpIHtcbiAgICByZXR1cm4gbWV0YWRhdGFSZWR1Y2VyKHNvdXJjZXMubWFwKChzb3VyY2UpID0+IHNvdXJjZS5nZXREYWlseU1ldGFkYXRhKGRhdGUpKSk7XG59XG5mdW5jdGlvbiBnZXRXZWVrbHlNZXRhZGF0YShzb3VyY2VzLCBkYXRlLCAuLi5fYXJncykge1xuICAgIHJldHVybiBtZXRhZGF0YVJlZHVjZXIoc291cmNlcy5tYXAoKHNvdXJjZSkgPT4gc291cmNlLmdldFdlZWtseU1ldGFkYXRhKGRhdGUpKSk7XG59XG5cbi8qIHNyYy9jb21wb25lbnRzL0NhbGVuZGFyLnN2ZWx0ZSBnZW5lcmF0ZWQgYnkgU3ZlbHRlIHYzLjM1LjAgKi9cblxuZnVuY3Rpb24gYWRkX2NzcygpIHtcblx0dmFyIHN0eWxlID0gZWxlbWVudChcInN0eWxlXCIpO1xuXHRzdHlsZS5pZCA9IFwic3ZlbHRlLXBjaW11OC1zdHlsZVwiO1xuXHRzdHlsZS50ZXh0Q29udGVudCA9IFwiLmNvbnRhaW5lci5zdmVsdGUtcGNpbXU4ey0tY29sb3ItYmFja2dyb3VuZC1oZWFkaW5nOnRyYW5zcGFyZW50Oy0tY29sb3ItYmFja2dyb3VuZC1kYXk6dHJhbnNwYXJlbnQ7LS1jb2xvci1iYWNrZ3JvdW5kLXdlZWtudW06dHJhbnNwYXJlbnQ7LS1jb2xvci1iYWNrZ3JvdW5kLXdlZWtlbmQ6dHJhbnNwYXJlbnQ7LS1jb2xvci1kb3Q6dmFyKC0tdGV4dC1tdXRlZCk7LS1jb2xvci1hcnJvdzp2YXIoLS10ZXh0LW11dGVkKTstLWNvbG9yLWJ1dHRvbjp2YXIoLS10ZXh0LW11dGVkKTstLWNvbG9yLXRleHQtdGl0bGU6dmFyKC0tdGV4dC1ub3JtYWwpOy0tY29sb3ItdGV4dC1oZWFkaW5nOnZhcigtLXRleHQtbXV0ZWQpOy0tY29sb3ItdGV4dC1kYXk6dmFyKC0tdGV4dC1ub3JtYWwpOy0tY29sb3ItdGV4dC10b2RheTp2YXIoLS1pbnRlcmFjdGl2ZS1hY2NlbnQpOy0tY29sb3ItdGV4dC13ZWVrbnVtOnZhcigtLXRleHQtbXV0ZWQpfS5jb250YWluZXIuc3ZlbHRlLXBjaW11OHtwYWRkaW5nOjAgOHB4fS5jb250YWluZXIuaXMtbW9iaWxlLnN2ZWx0ZS1wY2ltdTh7cGFkZGluZzowfXRoLnN2ZWx0ZS1wY2ltdTh7dGV4dC1hbGlnbjpjZW50ZXJ9LndlZWtlbmQuc3ZlbHRlLXBjaW11OHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWNvbG9yLWJhY2tncm91bmQtd2Vla2VuZCl9LmNhbGVuZGFyLnN2ZWx0ZS1wY2ltdTh7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO3dpZHRoOjEwMCV9dGguc3ZlbHRlLXBjaW11OHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWNvbG9yLWJhY2tncm91bmQtaGVhZGluZyk7Y29sb3I6dmFyKC0tY29sb3ItdGV4dC1oZWFkaW5nKTtmb250LXNpemU6MC42ZW07bGV0dGVyLXNwYWNpbmc6MXB4O3BhZGRpbmc6NHB4O3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZX1cIjtcblx0YXBwZW5kKGRvY3VtZW50LmhlYWQsIHN0eWxlKTtcbn1cblxuZnVuY3Rpb24gZ2V0X2VhY2hfY29udGV4dChjdHgsIGxpc3QsIGkpIHtcblx0Y29uc3QgY2hpbGRfY3R4ID0gY3R4LnNsaWNlKCk7XG5cdGNoaWxkX2N0eFsxOF0gPSBsaXN0W2ldO1xuXHRyZXR1cm4gY2hpbGRfY3R4O1xufVxuXG5mdW5jdGlvbiBnZXRfZWFjaF9jb250ZXh0XzEoY3R4LCBsaXN0LCBpKSB7XG5cdGNvbnN0IGNoaWxkX2N0eCA9IGN0eC5zbGljZSgpO1xuXHRjaGlsZF9jdHhbMjFdID0gbGlzdFtpXTtcblx0cmV0dXJuIGNoaWxkX2N0eDtcbn1cblxuZnVuY3Rpb24gZ2V0X2VhY2hfY29udGV4dF8yKGN0eCwgbGlzdCwgaSkge1xuXHRjb25zdCBjaGlsZF9jdHggPSBjdHguc2xpY2UoKTtcblx0Y2hpbGRfY3R4WzI0XSA9IGxpc3RbaV07XG5cdHJldHVybiBjaGlsZF9jdHg7XG59XG5cbmZ1bmN0aW9uIGdldF9lYWNoX2NvbnRleHRfMyhjdHgsIGxpc3QsIGkpIHtcblx0Y29uc3QgY2hpbGRfY3R4ID0gY3R4LnNsaWNlKCk7XG5cdGNoaWxkX2N0eFsyN10gPSBsaXN0W2ldO1xuXHRyZXR1cm4gY2hpbGRfY3R4O1xufVxuXG4vLyAoNTU6NikgeyNpZiBzaG93V2Vla051bXN9XG5mdW5jdGlvbiBjcmVhdGVfaWZfYmxvY2tfMihjdHgpIHtcblx0bGV0IGNvbDtcblxuXHRyZXR1cm4ge1xuXHRcdGMoKSB7XG5cdFx0XHRjb2wgPSBlbGVtZW50KFwiY29sXCIpO1xuXHRcdH0sXG5cdFx0bSh0YXJnZXQsIGFuY2hvcikge1xuXHRcdFx0aW5zZXJ0KHRhcmdldCwgY29sLCBhbmNob3IpO1xuXHRcdH0sXG5cdFx0ZChkZXRhY2hpbmcpIHtcblx0XHRcdGlmIChkZXRhY2hpbmcpIGRldGFjaChjb2wpO1xuXHRcdH1cblx0fTtcbn1cblxuLy8gKDU4OjYpIHsjZWFjaCBtb250aFsxXS5kYXlzIGFzIGRhdGV9XG5mdW5jdGlvbiBjcmVhdGVfZWFjaF9ibG9ja18zKGN0eCkge1xuXHRsZXQgY29sO1xuXG5cdHJldHVybiB7XG5cdFx0YygpIHtcblx0XHRcdGNvbCA9IGVsZW1lbnQoXCJjb2xcIik7XG5cdFx0XHRhdHRyKGNvbCwgXCJjbGFzc1wiLCBcInN2ZWx0ZS1wY2ltdThcIik7XG5cdFx0XHR0b2dnbGVfY2xhc3MoY29sLCBcIndlZWtlbmRcIiwgaXNXZWVrZW5kKC8qZGF0ZSovIGN0eFsyN10pKTtcblx0XHR9LFxuXHRcdG0odGFyZ2V0LCBhbmNob3IpIHtcblx0XHRcdGluc2VydCh0YXJnZXQsIGNvbCwgYW5jaG9yKTtcblx0XHR9LFxuXHRcdHAoY3R4LCBkaXJ0eSkge1xuXHRcdFx0aWYgKGRpcnR5ICYgLyppc1dlZWtlbmQsIG1vbnRoKi8gMTYzODQpIHtcblx0XHRcdFx0dG9nZ2xlX2NsYXNzKGNvbCwgXCJ3ZWVrZW5kXCIsIGlzV2Vla2VuZCgvKmRhdGUqLyBjdHhbMjddKSk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRkKGRldGFjaGluZykge1xuXHRcdFx0aWYgKGRldGFjaGluZykgZGV0YWNoKGNvbCk7XG5cdFx0fVxuXHR9O1xufVxuXG4vLyAoNjQ6OCkgeyNpZiBzaG93V2Vla051bXN9XG5mdW5jdGlvbiBjcmVhdGVfaWZfYmxvY2tfMShjdHgpIHtcblx0bGV0IHRoO1xuXG5cdHJldHVybiB7XG5cdFx0YygpIHtcblx0XHRcdHRoID0gZWxlbWVudChcInRoXCIpO1xuXHRcdFx0dGgudGV4dENvbnRlbnQgPSBcIldcIjtcblx0XHRcdGF0dHIodGgsIFwiY2xhc3NcIiwgXCJzdmVsdGUtcGNpbXU4XCIpO1xuXHRcdH0sXG5cdFx0bSh0YXJnZXQsIGFuY2hvcikge1xuXHRcdFx0aW5zZXJ0KHRhcmdldCwgdGgsIGFuY2hvcik7XG5cdFx0fSxcblx0XHRkKGRldGFjaGluZykge1xuXHRcdFx0aWYgKGRldGFjaGluZykgZGV0YWNoKHRoKTtcblx0XHR9XG5cdH07XG59XG5cbi8vICg2Nzo4KSB7I2VhY2ggZGF5c09mV2VlayBhcyBkYXlPZldlZWt9XG5mdW5jdGlvbiBjcmVhdGVfZWFjaF9ibG9ja18yKGN0eCkge1xuXHRsZXQgdGg7XG5cdGxldCB0X3ZhbHVlID0gLypkYXlPZldlZWsqLyBjdHhbMjRdICsgXCJcIjtcblx0bGV0IHQ7XG5cblx0cmV0dXJuIHtcblx0XHRjKCkge1xuXHRcdFx0dGggPSBlbGVtZW50KFwidGhcIik7XG5cdFx0XHR0ID0gdGV4dCh0X3ZhbHVlKTtcblx0XHRcdGF0dHIodGgsIFwiY2xhc3NcIiwgXCJzdmVsdGUtcGNpbXU4XCIpO1xuXHRcdH0sXG5cdFx0bSh0YXJnZXQsIGFuY2hvcikge1xuXHRcdFx0aW5zZXJ0KHRhcmdldCwgdGgsIGFuY2hvcik7XG5cdFx0XHRhcHBlbmQodGgsIHQpO1xuXHRcdH0sXG5cdFx0cChjdHgsIGRpcnR5KSB7XG5cdFx0XHRpZiAoZGlydHkgJiAvKmRheXNPZldlZWsqLyAzMjc2OCAmJiB0X3ZhbHVlICE9PSAodF92YWx1ZSA9IC8qZGF5T2ZXZWVrKi8gY3R4WzI0XSArIFwiXCIpKSBzZXRfZGF0YSh0LCB0X3ZhbHVlKTtcblx0XHR9LFxuXHRcdGQoZGV0YWNoaW5nKSB7XG5cdFx0XHRpZiAoZGV0YWNoaW5nKSBkZXRhY2godGgpO1xuXHRcdH1cblx0fTtcbn1cblxuLy8gKDc1OjEwKSB7I2lmIHNob3dXZWVrTnVtc31cbmZ1bmN0aW9uIGNyZWF0ZV9pZl9ibG9jayhjdHgpIHtcblx0bGV0IHdlZWtudW07XG5cdGxldCBjdXJyZW50O1xuXG5cdGNvbnN0IHdlZWtudW1fc3ByZWFkX2xldmVscyA9IFtcblx0XHQvKndlZWsqLyBjdHhbMThdLFxuXHRcdHtcblx0XHRcdG1ldGFkYXRhOiBnZXRXZWVrbHlNZXRhZGF0YSgvKnNvdXJjZXMqLyBjdHhbOF0sIC8qd2VlayovIGN0eFsxOF0uZGF5c1swXSwgLyp0b2RheSovIGN0eFsxMF0pXG5cdFx0fSxcblx0XHR7IG9uQ2xpY2s6IC8qb25DbGlja1dlZWsqLyBjdHhbN10gfSxcblx0XHR7XG5cdFx0XHRvbkNvbnRleHRNZW51OiAvKm9uQ29udGV4dE1lbnVXZWVrKi8gY3R4WzVdXG5cdFx0fSxcblx0XHR7IG9uSG92ZXI6IC8qb25Ib3ZlcldlZWsqLyBjdHhbM10gfSxcblx0XHR7IHNlbGVjdGVkSWQ6IC8qc2VsZWN0ZWRJZCovIGN0eFs5XSB9XG5cdF07XG5cblx0bGV0IHdlZWtudW1fcHJvcHMgPSB7fTtcblxuXHRmb3IgKGxldCBpID0gMDsgaSA8IHdlZWtudW1fc3ByZWFkX2xldmVscy5sZW5ndGg7IGkgKz0gMSkge1xuXHRcdHdlZWtudW1fcHJvcHMgPSBhc3NpZ24od2Vla251bV9wcm9wcywgd2Vla251bV9zcHJlYWRfbGV2ZWxzW2ldKTtcblx0fVxuXG5cdHdlZWtudW0gPSBuZXcgV2Vla051bSh7IHByb3BzOiB3ZWVrbnVtX3Byb3BzIH0pO1xuXG5cdHJldHVybiB7XG5cdFx0YygpIHtcblx0XHRcdGNyZWF0ZV9jb21wb25lbnQod2Vla251bS4kJC5mcmFnbWVudCk7XG5cdFx0fSxcblx0XHRtKHRhcmdldCwgYW5jaG9yKSB7XG5cdFx0XHRtb3VudF9jb21wb25lbnQod2Vla251bSwgdGFyZ2V0LCBhbmNob3IpO1xuXHRcdFx0Y3VycmVudCA9IHRydWU7XG5cdFx0fSxcblx0XHRwKGN0eCwgZGlydHkpIHtcblx0XHRcdGNvbnN0IHdlZWtudW1fY2hhbmdlcyA9IChkaXJ0eSAmIC8qbW9udGgsIGdldFdlZWtseU1ldGFkYXRhLCBzb3VyY2VzLCB0b2RheSwgb25DbGlja1dlZWssIG9uQ29udGV4dE1lbnVXZWVrLCBvbkhvdmVyV2Vlaywgc2VsZWN0ZWRJZCovIDE4MzQ0KVxuXHRcdFx0PyBnZXRfc3ByZWFkX3VwZGF0ZSh3ZWVrbnVtX3NwcmVhZF9sZXZlbHMsIFtcblx0XHRcdFx0XHRkaXJ0eSAmIC8qbW9udGgqLyAxNjM4NCAmJiBnZXRfc3ByZWFkX29iamVjdCgvKndlZWsqLyBjdHhbMThdKSxcblx0XHRcdFx0XHRkaXJ0eSAmIC8qZ2V0V2Vla2x5TWV0YWRhdGEsIHNvdXJjZXMsIG1vbnRoLCB0b2RheSovIDE3NjY0ICYmIHtcblx0XHRcdFx0XHRcdG1ldGFkYXRhOiBnZXRXZWVrbHlNZXRhZGF0YSgvKnNvdXJjZXMqLyBjdHhbOF0sIC8qd2VlayovIGN0eFsxOF0uZGF5c1swXSwgLyp0b2RheSovIGN0eFsxMF0pXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRkaXJ0eSAmIC8qb25DbGlja1dlZWsqLyAxMjggJiYgeyBvbkNsaWNrOiAvKm9uQ2xpY2tXZWVrKi8gY3R4WzddIH0sXG5cdFx0XHRcdFx0ZGlydHkgJiAvKm9uQ29udGV4dE1lbnVXZWVrKi8gMzIgJiYge1xuXHRcdFx0XHRcdFx0b25Db250ZXh0TWVudTogLypvbkNvbnRleHRNZW51V2VlayovIGN0eFs1XVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0ZGlydHkgJiAvKm9uSG92ZXJXZWVrKi8gOCAmJiB7IG9uSG92ZXI6IC8qb25Ib3ZlcldlZWsqLyBjdHhbM10gfSxcblx0XHRcdFx0XHRkaXJ0eSAmIC8qc2VsZWN0ZWRJZCovIDUxMiAmJiB7IHNlbGVjdGVkSWQ6IC8qc2VsZWN0ZWRJZCovIGN0eFs5XSB9XG5cdFx0XHRcdF0pXG5cdFx0XHQ6IHt9O1xuXG5cdFx0XHR3ZWVrbnVtLiRzZXQod2Vla251bV9jaGFuZ2VzKTtcblx0XHR9LFxuXHRcdGkobG9jYWwpIHtcblx0XHRcdGlmIChjdXJyZW50KSByZXR1cm47XG5cdFx0XHR0cmFuc2l0aW9uX2luKHdlZWtudW0uJCQuZnJhZ21lbnQsIGxvY2FsKTtcblx0XHRcdGN1cnJlbnQgPSB0cnVlO1xuXHRcdH0sXG5cdFx0byhsb2NhbCkge1xuXHRcdFx0dHJhbnNpdGlvbl9vdXQod2Vla251bS4kJC5mcmFnbWVudCwgbG9jYWwpO1xuXHRcdFx0Y3VycmVudCA9IGZhbHNlO1xuXHRcdH0sXG5cdFx0ZChkZXRhY2hpbmcpIHtcblx0XHRcdGRlc3Ryb3lfY29tcG9uZW50KHdlZWtudW0sIGRldGFjaGluZyk7XG5cdFx0fVxuXHR9O1xufVxuXG4vLyAoODU6MTApIHsjZWFjaCB3ZWVrLmRheXMgYXMgZGF5IChkYXkuZm9ybWF0KCkpfVxuZnVuY3Rpb24gY3JlYXRlX2VhY2hfYmxvY2tfMShrZXlfMSwgY3R4KSB7XG5cdGxldCBmaXJzdDtcblx0bGV0IGRheTtcblx0bGV0IGN1cnJlbnQ7XG5cblx0ZGF5ID0gbmV3IERheSh7XG5cdFx0XHRwcm9wczoge1xuXHRcdFx0XHRkYXRlOiAvKmRheSovIGN0eFsyMV0sXG5cdFx0XHRcdHRvZGF5OiAvKnRvZGF5Ki8gY3R4WzEwXSxcblx0XHRcdFx0ZGlzcGxheWVkTW9udGg6IC8qZGlzcGxheWVkTW9udGgqLyBjdHhbMF0sXG5cdFx0XHRcdG9uQ2xpY2s6IC8qb25DbGlja0RheSovIGN0eFs2XSxcblx0XHRcdFx0b25Db250ZXh0TWVudTogLypvbkNvbnRleHRNZW51RGF5Ki8gY3R4WzRdLFxuXHRcdFx0XHRvbkhvdmVyOiAvKm9uSG92ZXJEYXkqLyBjdHhbMl0sXG5cdFx0XHRcdG1ldGFkYXRhOiBnZXREYWlseU1ldGFkYXRhKC8qc291cmNlcyovIGN0eFs4XSwgLypkYXkqLyBjdHhbMjFdLCAvKnRvZGF5Ki8gY3R4WzEwXSksXG5cdFx0XHRcdHNlbGVjdGVkSWQ6IC8qc2VsZWN0ZWRJZCovIGN0eFs5XVxuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdHJldHVybiB7XG5cdFx0a2V5OiBrZXlfMSxcblx0XHRmaXJzdDogbnVsbCxcblx0XHRjKCkge1xuXHRcdFx0Zmlyc3QgPSBlbXB0eSgpO1xuXHRcdFx0Y3JlYXRlX2NvbXBvbmVudChkYXkuJCQuZnJhZ21lbnQpO1xuXHRcdFx0dGhpcy5maXJzdCA9IGZpcnN0O1xuXHRcdH0sXG5cdFx0bSh0YXJnZXQsIGFuY2hvcikge1xuXHRcdFx0aW5zZXJ0KHRhcmdldCwgZmlyc3QsIGFuY2hvcik7XG5cdFx0XHRtb3VudF9jb21wb25lbnQoZGF5LCB0YXJnZXQsIGFuY2hvcik7XG5cdFx0XHRjdXJyZW50ID0gdHJ1ZTtcblx0XHR9LFxuXHRcdHAobmV3X2N0eCwgZGlydHkpIHtcblx0XHRcdGN0eCA9IG5ld19jdHg7XG5cdFx0XHRjb25zdCBkYXlfY2hhbmdlcyA9IHt9O1xuXHRcdFx0aWYgKGRpcnR5ICYgLyptb250aCovIDE2Mzg0KSBkYXlfY2hhbmdlcy5kYXRlID0gLypkYXkqLyBjdHhbMjFdO1xuXHRcdFx0aWYgKGRpcnR5ICYgLyp0b2RheSovIDEwMjQpIGRheV9jaGFuZ2VzLnRvZGF5ID0gLyp0b2RheSovIGN0eFsxMF07XG5cdFx0XHRpZiAoZGlydHkgJiAvKmRpc3BsYXllZE1vbnRoKi8gMSkgZGF5X2NoYW5nZXMuZGlzcGxheWVkTW9udGggPSAvKmRpc3BsYXllZE1vbnRoKi8gY3R4WzBdO1xuXHRcdFx0aWYgKGRpcnR5ICYgLypvbkNsaWNrRGF5Ki8gNjQpIGRheV9jaGFuZ2VzLm9uQ2xpY2sgPSAvKm9uQ2xpY2tEYXkqLyBjdHhbNl07XG5cdFx0XHRpZiAoZGlydHkgJiAvKm9uQ29udGV4dE1lbnVEYXkqLyAxNikgZGF5X2NoYW5nZXMub25Db250ZXh0TWVudSA9IC8qb25Db250ZXh0TWVudURheSovIGN0eFs0XTtcblx0XHRcdGlmIChkaXJ0eSAmIC8qb25Ib3ZlckRheSovIDQpIGRheV9jaGFuZ2VzLm9uSG92ZXIgPSAvKm9uSG92ZXJEYXkqLyBjdHhbMl07XG5cdFx0XHRpZiAoZGlydHkgJiAvKnNvdXJjZXMsIG1vbnRoLCB0b2RheSovIDE3NjY0KSBkYXlfY2hhbmdlcy5tZXRhZGF0YSA9IGdldERhaWx5TWV0YWRhdGEoLypzb3VyY2VzKi8gY3R4WzhdLCAvKmRheSovIGN0eFsyMV0sIC8qdG9kYXkqLyBjdHhbMTBdKTtcblx0XHRcdGlmIChkaXJ0eSAmIC8qc2VsZWN0ZWRJZCovIDUxMikgZGF5X2NoYW5nZXMuc2VsZWN0ZWRJZCA9IC8qc2VsZWN0ZWRJZCovIGN0eFs5XTtcblx0XHRcdGRheS4kc2V0KGRheV9jaGFuZ2VzKTtcblx0XHR9LFxuXHRcdGkobG9jYWwpIHtcblx0XHRcdGlmIChjdXJyZW50KSByZXR1cm47XG5cdFx0XHR0cmFuc2l0aW9uX2luKGRheS4kJC5mcmFnbWVudCwgbG9jYWwpO1xuXHRcdFx0Y3VycmVudCA9IHRydWU7XG5cdFx0fSxcblx0XHRvKGxvY2FsKSB7XG5cdFx0XHR0cmFuc2l0aW9uX291dChkYXkuJCQuZnJhZ21lbnQsIGxvY2FsKTtcblx0XHRcdGN1cnJlbnQgPSBmYWxzZTtcblx0XHR9LFxuXHRcdGQoZGV0YWNoaW5nKSB7XG5cdFx0XHRpZiAoZGV0YWNoaW5nKSBkZXRhY2goZmlyc3QpO1xuXHRcdFx0ZGVzdHJveV9jb21wb25lbnQoZGF5LCBkZXRhY2hpbmcpO1xuXHRcdH1cblx0fTtcbn1cblxuLy8gKDczOjYpIHsjZWFjaCBtb250aCBhcyB3ZWVrICh3ZWVrLndlZWtOdW0pfVxuZnVuY3Rpb24gY3JlYXRlX2VhY2hfYmxvY2soa2V5XzEsIGN0eCkge1xuXHRsZXQgdHI7XG5cdGxldCB0MDtcblx0bGV0IGVhY2hfYmxvY2tzID0gW107XG5cdGxldCBlYWNoXzFfbG9va3VwID0gbmV3IE1hcCgpO1xuXHRsZXQgdDE7XG5cdGxldCBjdXJyZW50O1xuXHRsZXQgaWZfYmxvY2sgPSAvKnNob3dXZWVrTnVtcyovIGN0eFsxXSAmJiBjcmVhdGVfaWZfYmxvY2soY3R4KTtcblx0bGV0IGVhY2hfdmFsdWVfMSA9IC8qd2VlayovIGN0eFsxOF0uZGF5cztcblx0Y29uc3QgZ2V0X2tleSA9IGN0eCA9PiAvKmRheSovIGN0eFsyMV0uZm9ybWF0KCk7XG5cblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBlYWNoX3ZhbHVlXzEubGVuZ3RoOyBpICs9IDEpIHtcblx0XHRsZXQgY2hpbGRfY3R4ID0gZ2V0X2VhY2hfY29udGV4dF8xKGN0eCwgZWFjaF92YWx1ZV8xLCBpKTtcblx0XHRsZXQga2V5ID0gZ2V0X2tleShjaGlsZF9jdHgpO1xuXHRcdGVhY2hfMV9sb29rdXAuc2V0KGtleSwgZWFjaF9ibG9ja3NbaV0gPSBjcmVhdGVfZWFjaF9ibG9ja18xKGtleSwgY2hpbGRfY3R4KSk7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGtleToga2V5XzEsXG5cdFx0Zmlyc3Q6IG51bGwsXG5cdFx0YygpIHtcblx0XHRcdHRyID0gZWxlbWVudChcInRyXCIpO1xuXHRcdFx0aWYgKGlmX2Jsb2NrKSBpZl9ibG9jay5jKCk7XG5cdFx0XHR0MCA9IHNwYWNlKCk7XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgZWFjaF9ibG9ja3MubGVuZ3RoOyBpICs9IDEpIHtcblx0XHRcdFx0ZWFjaF9ibG9ja3NbaV0uYygpO1xuXHRcdFx0fVxuXG5cdFx0XHR0MSA9IHNwYWNlKCk7XG5cdFx0XHR0aGlzLmZpcnN0ID0gdHI7XG5cdFx0fSxcblx0XHRtKHRhcmdldCwgYW5jaG9yKSB7XG5cdFx0XHRpbnNlcnQodGFyZ2V0LCB0ciwgYW5jaG9yKTtcblx0XHRcdGlmIChpZl9ibG9jaykgaWZfYmxvY2subSh0ciwgbnVsbCk7XG5cdFx0XHRhcHBlbmQodHIsIHQwKTtcblxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBlYWNoX2Jsb2Nrcy5sZW5ndGg7IGkgKz0gMSkge1xuXHRcdFx0XHRlYWNoX2Jsb2Nrc1tpXS5tKHRyLCBudWxsKTtcblx0XHRcdH1cblxuXHRcdFx0YXBwZW5kKHRyLCB0MSk7XG5cdFx0XHRjdXJyZW50ID0gdHJ1ZTtcblx0XHR9LFxuXHRcdHAobmV3X2N0eCwgZGlydHkpIHtcblx0XHRcdGN0eCA9IG5ld19jdHg7XG5cblx0XHRcdGlmICgvKnNob3dXZWVrTnVtcyovIGN0eFsxXSkge1xuXHRcdFx0XHRpZiAoaWZfYmxvY2spIHtcblx0XHRcdFx0XHRpZl9ibG9jay5wKGN0eCwgZGlydHkpO1xuXG5cdFx0XHRcdFx0aWYgKGRpcnR5ICYgLypzaG93V2Vla051bXMqLyAyKSB7XG5cdFx0XHRcdFx0XHR0cmFuc2l0aW9uX2luKGlmX2Jsb2NrLCAxKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aWZfYmxvY2sgPSBjcmVhdGVfaWZfYmxvY2soY3R4KTtcblx0XHRcdFx0XHRpZl9ibG9jay5jKCk7XG5cdFx0XHRcdFx0dHJhbnNpdGlvbl9pbihpZl9ibG9jaywgMSk7XG5cdFx0XHRcdFx0aWZfYmxvY2subSh0ciwgdDApO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKGlmX2Jsb2NrKSB7XG5cdFx0XHRcdGdyb3VwX291dHJvcygpO1xuXG5cdFx0XHRcdHRyYW5zaXRpb25fb3V0KGlmX2Jsb2NrLCAxLCAxLCAoKSA9PiB7XG5cdFx0XHRcdFx0aWZfYmxvY2sgPSBudWxsO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRjaGVja19vdXRyb3MoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGRpcnR5ICYgLyptb250aCwgdG9kYXksIGRpc3BsYXllZE1vbnRoLCBvbkNsaWNrRGF5LCBvbkNvbnRleHRNZW51RGF5LCBvbkhvdmVyRGF5LCBnZXREYWlseU1ldGFkYXRhLCBzb3VyY2VzLCBzZWxlY3RlZElkKi8gMTgyNjEpIHtcblx0XHRcdFx0ZWFjaF92YWx1ZV8xID0gLyp3ZWVrKi8gY3R4WzE4XS5kYXlzO1xuXHRcdFx0XHRncm91cF9vdXRyb3MoKTtcblx0XHRcdFx0ZWFjaF9ibG9ja3MgPSB1cGRhdGVfa2V5ZWRfZWFjaChlYWNoX2Jsb2NrcywgZGlydHksIGdldF9rZXksIDEsIGN0eCwgZWFjaF92YWx1ZV8xLCBlYWNoXzFfbG9va3VwLCB0ciwgb3V0cm9fYW5kX2Rlc3Ryb3lfYmxvY2ssIGNyZWF0ZV9lYWNoX2Jsb2NrXzEsIHQxLCBnZXRfZWFjaF9jb250ZXh0XzEpO1xuXHRcdFx0XHRjaGVja19vdXRyb3MoKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdGkobG9jYWwpIHtcblx0XHRcdGlmIChjdXJyZW50KSByZXR1cm47XG5cdFx0XHR0cmFuc2l0aW9uX2luKGlmX2Jsb2NrKTtcblxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBlYWNoX3ZhbHVlXzEubGVuZ3RoOyBpICs9IDEpIHtcblx0XHRcdFx0dHJhbnNpdGlvbl9pbihlYWNoX2Jsb2Nrc1tpXSk7XG5cdFx0XHR9XG5cblx0XHRcdGN1cnJlbnQgPSB0cnVlO1xuXHRcdH0sXG5cdFx0byhsb2NhbCkge1xuXHRcdFx0dHJhbnNpdGlvbl9vdXQoaWZfYmxvY2spO1xuXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGVhY2hfYmxvY2tzLmxlbmd0aDsgaSArPSAxKSB7XG5cdFx0XHRcdHRyYW5zaXRpb25fb3V0KGVhY2hfYmxvY2tzW2ldKTtcblx0XHRcdH1cblxuXHRcdFx0Y3VycmVudCA9IGZhbHNlO1xuXHRcdH0sXG5cdFx0ZChkZXRhY2hpbmcpIHtcblx0XHRcdGlmIChkZXRhY2hpbmcpIGRldGFjaCh0cik7XG5cdFx0XHRpZiAoaWZfYmxvY2spIGlmX2Jsb2NrLmQoKTtcblxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBlYWNoX2Jsb2Nrcy5sZW5ndGg7IGkgKz0gMSkge1xuXHRcdFx0XHRlYWNoX2Jsb2Nrc1tpXS5kKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVfZnJhZ21lbnQoY3R4KSB7XG5cdGxldCBkaXY7XG5cdGxldCBuYXY7XG5cdGxldCB0MDtcblx0bGV0IHRhYmxlO1xuXHRsZXQgY29sZ3JvdXA7XG5cdGxldCB0MTtcblx0bGV0IHQyO1xuXHRsZXQgdGhlYWQ7XG5cdGxldCB0cjtcblx0bGV0IHQzO1xuXHRsZXQgdDQ7XG5cdGxldCB0Ym9keTtcblx0bGV0IGVhY2hfYmxvY2tzID0gW107XG5cdGxldCBlYWNoMl9sb29rdXAgPSBuZXcgTWFwKCk7XG5cdGxldCBjdXJyZW50O1xuXG5cdG5hdiA9IG5ldyBOYXYoe1xuXHRcdFx0cHJvcHM6IHtcblx0XHRcdFx0dG9kYXk6IC8qdG9kYXkqLyBjdHhbMTBdLFxuXHRcdFx0XHRkaXNwbGF5ZWRNb250aDogLypkaXNwbGF5ZWRNb250aCovIGN0eFswXSxcblx0XHRcdFx0aW5jcmVtZW50RGlzcGxheWVkTW9udGg6IC8qaW5jcmVtZW50RGlzcGxheWVkTW9udGgqLyBjdHhbMTFdLFxuXHRcdFx0XHRkZWNyZW1lbnREaXNwbGF5ZWRNb250aDogLypkZWNyZW1lbnREaXNwbGF5ZWRNb250aCovIGN0eFsxMl0sXG5cdFx0XHRcdHJlc2V0RGlzcGxheWVkTW9udGg6IC8qcmVzZXREaXNwbGF5ZWRNb250aCovIGN0eFsxM11cblx0XHRcdH1cblx0XHR9KTtcblxuXHRsZXQgaWZfYmxvY2swID0gLypzaG93V2Vla051bXMqLyBjdHhbMV0gJiYgY3JlYXRlX2lmX2Jsb2NrXzIoKTtcblx0bGV0IGVhY2hfdmFsdWVfMyA9IC8qbW9udGgqLyBjdHhbMTRdWzFdLmRheXM7XG5cdGxldCBlYWNoX2Jsb2Nrc18yID0gW107XG5cblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBlYWNoX3ZhbHVlXzMubGVuZ3RoOyBpICs9IDEpIHtcblx0XHRlYWNoX2Jsb2Nrc18yW2ldID0gY3JlYXRlX2VhY2hfYmxvY2tfMyhnZXRfZWFjaF9jb250ZXh0XzMoY3R4LCBlYWNoX3ZhbHVlXzMsIGkpKTtcblx0fVxuXG5cdGxldCBpZl9ibG9jazEgPSAvKnNob3dXZWVrTnVtcyovIGN0eFsxXSAmJiBjcmVhdGVfaWZfYmxvY2tfMSgpO1xuXHRsZXQgZWFjaF92YWx1ZV8yID0gLypkYXlzT2ZXZWVrKi8gY3R4WzE1XTtcblx0bGV0IGVhY2hfYmxvY2tzXzEgPSBbXTtcblxuXHRmb3IgKGxldCBpID0gMDsgaSA8IGVhY2hfdmFsdWVfMi5sZW5ndGg7IGkgKz0gMSkge1xuXHRcdGVhY2hfYmxvY2tzXzFbaV0gPSBjcmVhdGVfZWFjaF9ibG9ja18yKGdldF9lYWNoX2NvbnRleHRfMihjdHgsIGVhY2hfdmFsdWVfMiwgaSkpO1xuXHR9XG5cblx0bGV0IGVhY2hfdmFsdWUgPSAvKm1vbnRoKi8gY3R4WzE0XTtcblx0Y29uc3QgZ2V0X2tleSA9IGN0eCA9PiAvKndlZWsqLyBjdHhbMThdLndlZWtOdW07XG5cblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBlYWNoX3ZhbHVlLmxlbmd0aDsgaSArPSAxKSB7XG5cdFx0bGV0IGNoaWxkX2N0eCA9IGdldF9lYWNoX2NvbnRleHQoY3R4LCBlYWNoX3ZhbHVlLCBpKTtcblx0XHRsZXQga2V5ID0gZ2V0X2tleShjaGlsZF9jdHgpO1xuXHRcdGVhY2gyX2xvb2t1cC5zZXQoa2V5LCBlYWNoX2Jsb2Nrc1tpXSA9IGNyZWF0ZV9lYWNoX2Jsb2NrKGtleSwgY2hpbGRfY3R4KSk7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGMoKSB7XG5cdFx0XHRkaXYgPSBlbGVtZW50KFwiZGl2XCIpO1xuXHRcdFx0Y3JlYXRlX2NvbXBvbmVudChuYXYuJCQuZnJhZ21lbnQpO1xuXHRcdFx0dDAgPSBzcGFjZSgpO1xuXHRcdFx0dGFibGUgPSBlbGVtZW50KFwidGFibGVcIik7XG5cdFx0XHRjb2xncm91cCA9IGVsZW1lbnQoXCJjb2xncm91cFwiKTtcblx0XHRcdGlmIChpZl9ibG9jazApIGlmX2Jsb2NrMC5jKCk7XG5cdFx0XHR0MSA9IHNwYWNlKCk7XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgZWFjaF9ibG9ja3NfMi5sZW5ndGg7IGkgKz0gMSkge1xuXHRcdFx0XHRlYWNoX2Jsb2Nrc18yW2ldLmMoKTtcblx0XHRcdH1cblxuXHRcdFx0dDIgPSBzcGFjZSgpO1xuXHRcdFx0dGhlYWQgPSBlbGVtZW50KFwidGhlYWRcIik7XG5cdFx0XHR0ciA9IGVsZW1lbnQoXCJ0clwiKTtcblx0XHRcdGlmIChpZl9ibG9jazEpIGlmX2Jsb2NrMS5jKCk7XG5cdFx0XHR0MyA9IHNwYWNlKCk7XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgZWFjaF9ibG9ja3NfMS5sZW5ndGg7IGkgKz0gMSkge1xuXHRcdFx0XHRlYWNoX2Jsb2Nrc18xW2ldLmMoKTtcblx0XHRcdH1cblxuXHRcdFx0dDQgPSBzcGFjZSgpO1xuXHRcdFx0dGJvZHkgPSBlbGVtZW50KFwidGJvZHlcIik7XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgZWFjaF9ibG9ja3MubGVuZ3RoOyBpICs9IDEpIHtcblx0XHRcdFx0ZWFjaF9ibG9ja3NbaV0uYygpO1xuXHRcdFx0fVxuXG5cdFx0XHRhdHRyKHRhYmxlLCBcImNsYXNzXCIsIFwiY2FsZW5kYXIgc3ZlbHRlLXBjaW11OFwiKTtcblx0XHRcdGF0dHIoZGl2LCBcImlkXCIsIFwiY2FsZW5kYXItY29udGFpbmVyXCIpO1xuXHRcdFx0YXR0cihkaXYsIFwiY2xhc3NcIiwgXCJjb250YWluZXIgc3ZlbHRlLXBjaW11OFwiKTtcblx0XHRcdHRvZ2dsZV9jbGFzcyhkaXYsIFwiaXMtbW9iaWxlXCIsIC8qaXNNb2JpbGUqLyBjdHhbMTZdKTtcblx0XHR9LFxuXHRcdG0odGFyZ2V0LCBhbmNob3IpIHtcblx0XHRcdGluc2VydCh0YXJnZXQsIGRpdiwgYW5jaG9yKTtcblx0XHRcdG1vdW50X2NvbXBvbmVudChuYXYsIGRpdiwgbnVsbCk7XG5cdFx0XHRhcHBlbmQoZGl2LCB0MCk7XG5cdFx0XHRhcHBlbmQoZGl2LCB0YWJsZSk7XG5cdFx0XHRhcHBlbmQodGFibGUsIGNvbGdyb3VwKTtcblx0XHRcdGlmIChpZl9ibG9jazApIGlmX2Jsb2NrMC5tKGNvbGdyb3VwLCBudWxsKTtcblx0XHRcdGFwcGVuZChjb2xncm91cCwgdDEpO1xuXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGVhY2hfYmxvY2tzXzIubGVuZ3RoOyBpICs9IDEpIHtcblx0XHRcdFx0ZWFjaF9ibG9ja3NfMltpXS5tKGNvbGdyb3VwLCBudWxsKTtcblx0XHRcdH1cblxuXHRcdFx0YXBwZW5kKHRhYmxlLCB0Mik7XG5cdFx0XHRhcHBlbmQodGFibGUsIHRoZWFkKTtcblx0XHRcdGFwcGVuZCh0aGVhZCwgdHIpO1xuXHRcdFx0aWYgKGlmX2Jsb2NrMSkgaWZfYmxvY2sxLm0odHIsIG51bGwpO1xuXHRcdFx0YXBwZW5kKHRyLCB0Myk7XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgZWFjaF9ibG9ja3NfMS5sZW5ndGg7IGkgKz0gMSkge1xuXHRcdFx0XHRlYWNoX2Jsb2Nrc18xW2ldLm0odHIsIG51bGwpO1xuXHRcdFx0fVxuXG5cdFx0XHRhcHBlbmQodGFibGUsIHQ0KTtcblx0XHRcdGFwcGVuZCh0YWJsZSwgdGJvZHkpO1xuXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGVhY2hfYmxvY2tzLmxlbmd0aDsgaSArPSAxKSB7XG5cdFx0XHRcdGVhY2hfYmxvY2tzW2ldLm0odGJvZHksIG51bGwpO1xuXHRcdFx0fVxuXG5cdFx0XHRjdXJyZW50ID0gdHJ1ZTtcblx0XHR9LFxuXHRcdHAoY3R4LCBbZGlydHldKSB7XG5cdFx0XHRjb25zdCBuYXZfY2hhbmdlcyA9IHt9O1xuXHRcdFx0aWYgKGRpcnR5ICYgLyp0b2RheSovIDEwMjQpIG5hdl9jaGFuZ2VzLnRvZGF5ID0gLyp0b2RheSovIGN0eFsxMF07XG5cdFx0XHRpZiAoZGlydHkgJiAvKmRpc3BsYXllZE1vbnRoKi8gMSkgbmF2X2NoYW5nZXMuZGlzcGxheWVkTW9udGggPSAvKmRpc3BsYXllZE1vbnRoKi8gY3R4WzBdO1xuXHRcdFx0bmF2LiRzZXQobmF2X2NoYW5nZXMpO1xuXG5cdFx0XHRpZiAoLypzaG93V2Vla051bXMqLyBjdHhbMV0pIHtcblx0XHRcdFx0aWYgKGlmX2Jsb2NrMCkgOyBlbHNlIHtcblx0XHRcdFx0XHRpZl9ibG9jazAgPSBjcmVhdGVfaWZfYmxvY2tfMigpO1xuXHRcdFx0XHRcdGlmX2Jsb2NrMC5jKCk7XG5cdFx0XHRcdFx0aWZfYmxvY2swLm0oY29sZ3JvdXAsIHQxKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChpZl9ibG9jazApIHtcblx0XHRcdFx0aWZfYmxvY2swLmQoMSk7XG5cdFx0XHRcdGlmX2Jsb2NrMCA9IG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChkaXJ0eSAmIC8qaXNXZWVrZW5kLCBtb250aCovIDE2Mzg0KSB7XG5cdFx0XHRcdGVhY2hfdmFsdWVfMyA9IC8qbW9udGgqLyBjdHhbMTRdWzFdLmRheXM7XG5cdFx0XHRcdGxldCBpO1xuXG5cdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBlYWNoX3ZhbHVlXzMubGVuZ3RoOyBpICs9IDEpIHtcblx0XHRcdFx0XHRjb25zdCBjaGlsZF9jdHggPSBnZXRfZWFjaF9jb250ZXh0XzMoY3R4LCBlYWNoX3ZhbHVlXzMsIGkpO1xuXG5cdFx0XHRcdFx0aWYgKGVhY2hfYmxvY2tzXzJbaV0pIHtcblx0XHRcdFx0XHRcdGVhY2hfYmxvY2tzXzJbaV0ucChjaGlsZF9jdHgsIGRpcnR5KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0ZWFjaF9ibG9ja3NfMltpXSA9IGNyZWF0ZV9lYWNoX2Jsb2NrXzMoY2hpbGRfY3R4KTtcblx0XHRcdFx0XHRcdGVhY2hfYmxvY2tzXzJbaV0uYygpO1xuXHRcdFx0XHRcdFx0ZWFjaF9ibG9ja3NfMltpXS5tKGNvbGdyb3VwLCBudWxsKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmb3IgKDsgaSA8IGVhY2hfYmxvY2tzXzIubGVuZ3RoOyBpICs9IDEpIHtcblx0XHRcdFx0XHRlYWNoX2Jsb2Nrc18yW2ldLmQoMSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRlYWNoX2Jsb2Nrc18yLmxlbmd0aCA9IGVhY2hfdmFsdWVfMy5sZW5ndGg7XG5cdFx0XHR9XG5cblx0XHRcdGlmICgvKnNob3dXZWVrTnVtcyovIGN0eFsxXSkge1xuXHRcdFx0XHRpZiAoaWZfYmxvY2sxKSA7IGVsc2Uge1xuXHRcdFx0XHRcdGlmX2Jsb2NrMSA9IGNyZWF0ZV9pZl9ibG9ja18xKCk7XG5cdFx0XHRcdFx0aWZfYmxvY2sxLmMoKTtcblx0XHRcdFx0XHRpZl9ibG9jazEubSh0ciwgdDMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKGlmX2Jsb2NrMSkge1xuXHRcdFx0XHRpZl9ibG9jazEuZCgxKTtcblx0XHRcdFx0aWZfYmxvY2sxID0gbnVsbDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGRpcnR5ICYgLypkYXlzT2ZXZWVrKi8gMzI3NjgpIHtcblx0XHRcdFx0ZWFjaF92YWx1ZV8yID0gLypkYXlzT2ZXZWVrKi8gY3R4WzE1XTtcblx0XHRcdFx0bGV0IGk7XG5cblx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IGVhY2hfdmFsdWVfMi5sZW5ndGg7IGkgKz0gMSkge1xuXHRcdFx0XHRcdGNvbnN0IGNoaWxkX2N0eCA9IGdldF9lYWNoX2NvbnRleHRfMihjdHgsIGVhY2hfdmFsdWVfMiwgaSk7XG5cblx0XHRcdFx0XHRpZiAoZWFjaF9ibG9ja3NfMVtpXSkge1xuXHRcdFx0XHRcdFx0ZWFjaF9ibG9ja3NfMVtpXS5wKGNoaWxkX2N0eCwgZGlydHkpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRlYWNoX2Jsb2Nrc18xW2ldID0gY3JlYXRlX2VhY2hfYmxvY2tfMihjaGlsZF9jdHgpO1xuXHRcdFx0XHRcdFx0ZWFjaF9ibG9ja3NfMVtpXS5jKCk7XG5cdFx0XHRcdFx0XHRlYWNoX2Jsb2Nrc18xW2ldLm0odHIsIG51bGwpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGZvciAoOyBpIDwgZWFjaF9ibG9ja3NfMS5sZW5ndGg7IGkgKz0gMSkge1xuXHRcdFx0XHRcdGVhY2hfYmxvY2tzXzFbaV0uZCgxKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGVhY2hfYmxvY2tzXzEubGVuZ3RoID0gZWFjaF92YWx1ZV8yLmxlbmd0aDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGRpcnR5ICYgLyptb250aCwgdG9kYXksIGRpc3BsYXllZE1vbnRoLCBvbkNsaWNrRGF5LCBvbkNvbnRleHRNZW51RGF5LCBvbkhvdmVyRGF5LCBnZXREYWlseU1ldGFkYXRhLCBzb3VyY2VzLCBzZWxlY3RlZElkLCBnZXRXZWVrbHlNZXRhZGF0YSwgb25DbGlja1dlZWssIG9uQ29udGV4dE1lbnVXZWVrLCBvbkhvdmVyV2Vlaywgc2hvd1dlZWtOdW1zKi8gMTg0MzEpIHtcblx0XHRcdFx0ZWFjaF92YWx1ZSA9IC8qbW9udGgqLyBjdHhbMTRdO1xuXHRcdFx0XHRncm91cF9vdXRyb3MoKTtcblx0XHRcdFx0ZWFjaF9ibG9ja3MgPSB1cGRhdGVfa2V5ZWRfZWFjaChlYWNoX2Jsb2NrcywgZGlydHksIGdldF9rZXksIDEsIGN0eCwgZWFjaF92YWx1ZSwgZWFjaDJfbG9va3VwLCB0Ym9keSwgb3V0cm9fYW5kX2Rlc3Ryb3lfYmxvY2ssIGNyZWF0ZV9lYWNoX2Jsb2NrLCBudWxsLCBnZXRfZWFjaF9jb250ZXh0KTtcblx0XHRcdFx0Y2hlY2tfb3V0cm9zKCk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRpKGxvY2FsKSB7XG5cdFx0XHRpZiAoY3VycmVudCkgcmV0dXJuO1xuXHRcdFx0dHJhbnNpdGlvbl9pbihuYXYuJCQuZnJhZ21lbnQsIGxvY2FsKTtcblxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBlYWNoX3ZhbHVlLmxlbmd0aDsgaSArPSAxKSB7XG5cdFx0XHRcdHRyYW5zaXRpb25faW4oZWFjaF9ibG9ja3NbaV0pO1xuXHRcdFx0fVxuXG5cdFx0XHRjdXJyZW50ID0gdHJ1ZTtcblx0XHR9LFxuXHRcdG8obG9jYWwpIHtcblx0XHRcdHRyYW5zaXRpb25fb3V0KG5hdi4kJC5mcmFnbWVudCwgbG9jYWwpO1xuXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGVhY2hfYmxvY2tzLmxlbmd0aDsgaSArPSAxKSB7XG5cdFx0XHRcdHRyYW5zaXRpb25fb3V0KGVhY2hfYmxvY2tzW2ldKTtcblx0XHRcdH1cblxuXHRcdFx0Y3VycmVudCA9IGZhbHNlO1xuXHRcdH0sXG5cdFx0ZChkZXRhY2hpbmcpIHtcblx0XHRcdGlmIChkZXRhY2hpbmcpIGRldGFjaChkaXYpO1xuXHRcdFx0ZGVzdHJveV9jb21wb25lbnQobmF2KTtcblx0XHRcdGlmIChpZl9ibG9jazApIGlmX2Jsb2NrMC5kKCk7XG5cdFx0XHRkZXN0cm95X2VhY2goZWFjaF9ibG9ja3NfMiwgZGV0YWNoaW5nKTtcblx0XHRcdGlmIChpZl9ibG9jazEpIGlmX2Jsb2NrMS5kKCk7XG5cdFx0XHRkZXN0cm95X2VhY2goZWFjaF9ibG9ja3NfMSwgZGV0YWNoaW5nKTtcblxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBlYWNoX2Jsb2Nrcy5sZW5ndGg7IGkgKz0gMSkge1xuXHRcdFx0XHRlYWNoX2Jsb2Nrc1tpXS5kKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xufVxuXG5mdW5jdGlvbiBpbnN0YW5jZSgkJHNlbGYsICQkcHJvcHMsICQkaW52YWxpZGF0ZSkge1xuXHRcblx0XG5cdGxldCB7IGxvY2FsZURhdGEgfSA9ICQkcHJvcHM7XG5cdGxldCB7IHNob3dXZWVrTnVtcyA9IGZhbHNlIH0gPSAkJHByb3BzO1xuXHRsZXQgeyBvbkhvdmVyRGF5IH0gPSAkJHByb3BzO1xuXHRsZXQgeyBvbkhvdmVyV2VlayB9ID0gJCRwcm9wcztcblx0bGV0IHsgb25Db250ZXh0TWVudURheSB9ID0gJCRwcm9wcztcblx0bGV0IHsgb25Db250ZXh0TWVudVdlZWsgfSA9ICQkcHJvcHM7XG5cdGxldCB7IG9uQ2xpY2tEYXkgfSA9ICQkcHJvcHM7XG5cdGxldCB7IG9uQ2xpY2tXZWVrIH0gPSAkJHByb3BzO1xuXHRsZXQgeyBzb3VyY2VzID0gW10gfSA9ICQkcHJvcHM7XG5cdGxldCB7IHNlbGVjdGVkSWQgfSA9ICQkcHJvcHM7XG5cdGxldCB7IHRvZGF5ID0gd2luZG93Lm1vbWVudCgpIH0gPSAkJHByb3BzO1xuXHRsZXQgeyBkaXNwbGF5ZWRNb250aCA9IHRvZGF5IH0gPSAkJHByb3BzO1xuXHRsZXQgbW9udGg7XG5cdGxldCBkYXlzT2ZXZWVrO1xuXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5cdGxldCBpc01vYmlsZSA9IHdpbmRvdy5hcHAuaXNNb2JpbGU7XG5cblx0ZnVuY3Rpb24gaW5jcmVtZW50RGlzcGxheWVkTW9udGgoKSB7XG5cdFx0JCRpbnZhbGlkYXRlKDAsIGRpc3BsYXllZE1vbnRoID0gZGlzcGxheWVkTW9udGguY2xvbmUoKS5hZGQoMSwgXCJtb250aFwiKSk7XG5cdH1cblxuXHRmdW5jdGlvbiBkZWNyZW1lbnREaXNwbGF5ZWRNb250aCgpIHtcblx0XHQkJGludmFsaWRhdGUoMCwgZGlzcGxheWVkTW9udGggPSBkaXNwbGF5ZWRNb250aC5jbG9uZSgpLnN1YnRyYWN0KDEsIFwibW9udGhcIikpO1xuXHR9XG5cblx0ZnVuY3Rpb24gcmVzZXREaXNwbGF5ZWRNb250aCgpIHtcblx0XHQkJGludmFsaWRhdGUoMCwgZGlzcGxheWVkTW9udGggPSB0b2RheS5jbG9uZSgpKTtcblx0fVxuXG5cdCQkc2VsZi4kJHNldCA9ICQkcHJvcHMgPT4ge1xuXHRcdGlmIChcImxvY2FsZURhdGFcIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoMTcsIGxvY2FsZURhdGEgPSAkJHByb3BzLmxvY2FsZURhdGEpO1xuXHRcdGlmIChcInNob3dXZWVrTnVtc1wiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSgxLCBzaG93V2Vla051bXMgPSAkJHByb3BzLnNob3dXZWVrTnVtcyk7XG5cdFx0aWYgKFwib25Ib3ZlckRheVwiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSgyLCBvbkhvdmVyRGF5ID0gJCRwcm9wcy5vbkhvdmVyRGF5KTtcblx0XHRpZiAoXCJvbkhvdmVyV2Vla1wiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSgzLCBvbkhvdmVyV2VlayA9ICQkcHJvcHMub25Ib3ZlcldlZWspO1xuXHRcdGlmIChcIm9uQ29udGV4dE1lbnVEYXlcIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoNCwgb25Db250ZXh0TWVudURheSA9ICQkcHJvcHMub25Db250ZXh0TWVudURheSk7XG5cdFx0aWYgKFwib25Db250ZXh0TWVudVdlZWtcIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoNSwgb25Db250ZXh0TWVudVdlZWsgPSAkJHByb3BzLm9uQ29udGV4dE1lbnVXZWVrKTtcblx0XHRpZiAoXCJvbkNsaWNrRGF5XCIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDYsIG9uQ2xpY2tEYXkgPSAkJHByb3BzLm9uQ2xpY2tEYXkpO1xuXHRcdGlmIChcIm9uQ2xpY2tXZWVrXCIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDcsIG9uQ2xpY2tXZWVrID0gJCRwcm9wcy5vbkNsaWNrV2Vlayk7XG5cdFx0aWYgKFwic291cmNlc1wiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSg4LCBzb3VyY2VzID0gJCRwcm9wcy5zb3VyY2VzKTtcblx0XHRpZiAoXCJzZWxlY3RlZElkXCIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDksIHNlbGVjdGVkSWQgPSAkJHByb3BzLnNlbGVjdGVkSWQpO1xuXHRcdGlmIChcInRvZGF5XCIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDEwLCB0b2RheSA9ICQkcHJvcHMudG9kYXkpO1xuXHRcdGlmIChcImRpc3BsYXllZE1vbnRoXCIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDAsIGRpc3BsYXllZE1vbnRoID0gJCRwcm9wcy5kaXNwbGF5ZWRNb250aCk7XG5cdH07XG5cblx0JCRzZWxmLiQkLnVwZGF0ZSA9ICgpID0+IHtcblx0XHRpZiAoJCRzZWxmLiQkLmRpcnR5ICYgLypkaXNwbGF5ZWRNb250aCwgbG9jYWxlRGF0YSovIDEzMTA3Mykge1xuXHRcdFx0JCRpbnZhbGlkYXRlKDE0LCBtb250aCA9IGdldE1vbnRoKGRpc3BsYXllZE1vbnRoLCBsb2NhbGVEYXRhKSk7XG5cdFx0fVxuXG5cdFx0aWYgKCQkc2VsZi4kJC5kaXJ0eSAmIC8qdG9kYXksIGxvY2FsZURhdGEqLyAxMzIwOTYpIHtcblx0XHRcdCQkaW52YWxpZGF0ZSgxNSwgZGF5c09mV2VlayA9IGdldERheXNPZldlZWsodG9kYXksIGxvY2FsZURhdGEpKTtcblx0XHR9XG5cdH07XG5cblx0cmV0dXJuIFtcblx0XHRkaXNwbGF5ZWRNb250aCxcblx0XHRzaG93V2Vla051bXMsXG5cdFx0b25Ib3ZlckRheSxcblx0XHRvbkhvdmVyV2Vlayxcblx0XHRvbkNvbnRleHRNZW51RGF5LFxuXHRcdG9uQ29udGV4dE1lbnVXZWVrLFxuXHRcdG9uQ2xpY2tEYXksXG5cdFx0b25DbGlja1dlZWssXG5cdFx0c291cmNlcyxcblx0XHRzZWxlY3RlZElkLFxuXHRcdHRvZGF5LFxuXHRcdGluY3JlbWVudERpc3BsYXllZE1vbnRoLFxuXHRcdGRlY3JlbWVudERpc3BsYXllZE1vbnRoLFxuXHRcdHJlc2V0RGlzcGxheWVkTW9udGgsXG5cdFx0bW9udGgsXG5cdFx0ZGF5c09mV2Vlayxcblx0XHRpc01vYmlsZSxcblx0XHRsb2NhbGVEYXRhXG5cdF07XG59XG5cbmNsYXNzIENhbGVuZGFyIGV4dGVuZHMgU3ZlbHRlQ29tcG9uZW50IHtcblx0Y29uc3RydWN0b3Iob3B0aW9ucykge1xuXHRcdHN1cGVyKCk7XG5cdFx0aWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInN2ZWx0ZS1wY2ltdTgtc3R5bGVcIikpIGFkZF9jc3MoKTtcblxuXHRcdGluaXQodGhpcywgb3B0aW9ucywgaW5zdGFuY2UsIGNyZWF0ZV9mcmFnbWVudCwgbm90X2VxdWFsLCB7XG5cdFx0XHRsb2NhbGVEYXRhOiAxNyxcblx0XHRcdHNob3dXZWVrTnVtczogMSxcblx0XHRcdG9uSG92ZXJEYXk6IDIsXG5cdFx0XHRvbkhvdmVyV2VlazogMyxcblx0XHRcdG9uQ29udGV4dE1lbnVEYXk6IDQsXG5cdFx0XHRvbkNvbnRleHRNZW51V2VlazogNSxcblx0XHRcdG9uQ2xpY2tEYXk6IDYsXG5cdFx0XHRvbkNsaWNrV2VlazogNyxcblx0XHRcdHNvdXJjZXM6IDgsXG5cdFx0XHRzZWxlY3RlZElkOiA5LFxuXHRcdFx0dG9kYXk6IDEwLFxuXHRcdFx0ZGlzcGxheWVkTW9udGg6IDAsXG5cdFx0XHRpbmNyZW1lbnREaXNwbGF5ZWRNb250aDogMTEsXG5cdFx0XHRkZWNyZW1lbnREaXNwbGF5ZWRNb250aDogMTIsXG5cdFx0XHRyZXNldERpc3BsYXllZE1vbnRoOiAxM1xuXHRcdH0pO1xuXHR9XG5cblx0Z2V0IGluY3JlbWVudERpc3BsYXllZE1vbnRoKCkge1xuXHRcdHJldHVybiB0aGlzLiQkLmN0eFsxMV07XG5cdH1cblxuXHRnZXQgZGVjcmVtZW50RGlzcGxheWVkTW9udGgoKSB7XG5cdFx0cmV0dXJuIHRoaXMuJCQuY3R4WzEyXTtcblx0fVxuXG5cdGdldCByZXNldERpc3BsYXllZE1vbnRoKCkge1xuXHRcdHJldHVybiB0aGlzLiQkLmN0eFsxM107XG5cdH1cbn1cblxuY29uc3QgbGFuZ1RvTW9tZW50TG9jYWxlID0ge1xuICAgIGVuOiBcImVuLWdiXCIsXG4gICAgemg6IFwiemgtY25cIixcbiAgICBcInpoLVRXXCI6IFwiemgtdHdcIixcbiAgICBydTogXCJydVwiLFxuICAgIGtvOiBcImtvXCIsXG4gICAgaXQ6IFwiaXRcIixcbiAgICBpZDogXCJpZFwiLFxuICAgIHJvOiBcInJvXCIsXG4gICAgXCJwdC1CUlwiOiBcInB0LWJyXCIsXG4gICAgY3o6IFwiY3NcIixcbiAgICBkYTogXCJkYVwiLFxuICAgIGRlOiBcImRlXCIsXG4gICAgZXM6IFwiZXNcIixcbiAgICBmcjogXCJmclwiLFxuICAgIG5vOiBcIm5uXCIsXG4gICAgcGw6IFwicGxcIixcbiAgICBwdDogXCJwdFwiLFxuICAgIHRyOiBcInRyXCIsXG4gICAgaGk6IFwiaGlcIixcbiAgICBubDogXCJubFwiLFxuICAgIGFyOiBcImFyXCIsXG4gICAgamE6IFwiamFcIixcbn07XG5jb25zdCB3ZWVrZGF5cyA9IFtcbiAgICBcInN1bmRheVwiLFxuICAgIFwibW9uZGF5XCIsXG4gICAgXCJ0dWVzZGF5XCIsXG4gICAgXCJ3ZWRuZXNkYXlcIixcbiAgICBcInRodXJzZGF5XCIsXG4gICAgXCJmcmlkYXlcIixcbiAgICBcInNhdHVyZGF5XCIsXG5dO1xuZnVuY3Rpb24gb3ZlcnJpZGVHbG9iYWxNb21lbnRXZWVrU3RhcnQod2Vla1N0YXJ0KSB7XG4gICAgY29uc3QgeyBtb21lbnQgfSA9IHdpbmRvdztcbiAgICBjb25zdCBjdXJyZW50TG9jYWxlID0gbW9tZW50LmxvY2FsZSgpO1xuICAgIC8vIFNhdmUgdGhlIGluaXRpYWwgbG9jYWxlIHdlZWtzcGVjIHNvIHRoYXQgd2UgY2FuIHJlc3RvcmVcbiAgICAvLyBpdCB3aGVuIHRvZ2dsaW5nIGJldHdlZW4gdGhlIGRpZmZlcmVudCBvcHRpb25zIGluIHNldHRpbmdzLlxuICAgIGlmICghd2luZG93Ll9idW5kbGVkTG9jYWxlV2Vla1NwZWMpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgd2luZG93Ll9idW5kbGVkTG9jYWxlV2Vla1NwZWMgPSBtb21lbnQubG9jYWxlRGF0YSgpLl93ZWVrO1xuICAgIH1cbiAgICBpZiAod2Vla1N0YXJ0ID09PSBcImxvY2FsZVwiKSB7XG4gICAgICAgIG1vbWVudC51cGRhdGVMb2NhbGUoY3VycmVudExvY2FsZSwge1xuICAgICAgICAgICAgd2Vlazogd2luZG93Ll9idW5kbGVkTG9jYWxlV2Vla1NwZWMsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbW9tZW50LnVwZGF0ZUxvY2FsZShjdXJyZW50TG9jYWxlLCB7XG4gICAgICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICAgICAgZG93OiB3ZWVrZGF5cy5pbmRleE9mKHdlZWtTdGFydCkgfHwgMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbi8qKlxuICogU2V0cyB0aGUgbG9jYWxlIHVzZWQgYnkgdGhlIGNhbGVuZGFyLiBUaGlzIGFsbG93cyB0aGUgY2FsZW5kYXIgdG9cbiAqIGRlZmF1bHQgdG8gdGhlIHVzZXIncyBsb2NhbGUgKGUuZy4gU3RhcnQgV2VlayBvbiBTdW5kYXkvTW9uZGF5L0ZyaWRheSlcbiAqXG4gKiBAcGFyYW0gbG9jYWxlT3ZlcnJpZGUgbG9jYWxlIHN0cmluZyAoZS5nLiBcImVuLVVTXCIpXG4gKi9cbmZ1bmN0aW9uIGNvbmZpZ3VyZUdsb2JhbE1vbWVudExvY2FsZShsb2NhbGVPdmVycmlkZSA9IFwic3lzdGVtLWRlZmF1bHRcIiwgd2Vla1N0YXJ0ID0gXCJsb2NhbGVcIikge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCBvYnNpZGlhbkxhbmcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImxhbmd1YWdlXCIpIHx8IFwiZW5cIjtcbiAgICBjb25zdCBzeXN0ZW1MYW5nID0gKF9hID0gbmF2aWdhdG9yLmxhbmd1YWdlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudG9Mb3dlckNhc2UoKTtcbiAgICBsZXQgbW9tZW50TG9jYWxlID0gbGFuZ1RvTW9tZW50TG9jYWxlW29ic2lkaWFuTGFuZ107XG4gICAgaWYgKGxvY2FsZU92ZXJyaWRlICE9PSBcInN5c3RlbS1kZWZhdWx0XCIpIHtcbiAgICAgICAgbW9tZW50TG9jYWxlID0gbG9jYWxlT3ZlcnJpZGU7XG4gICAgfVxuICAgIGVsc2UgaWYgKHN5c3RlbUxhbmcuc3RhcnRzV2l0aChvYnNpZGlhbkxhbmcpKSB7XG4gICAgICAgIC8vIElmIHRoZSBzeXN0ZW0gbG9jYWxlIGlzIG1vcmUgc3BlY2lmaWMgKGVuLWdiIHZzIGVuKSwgdXNlIHRoZSBzeXN0ZW0gbG9jYWxlLlxuICAgICAgICBtb21lbnRMb2NhbGUgPSBzeXN0ZW1MYW5nO1xuICAgIH1cbiAgICBjb25zdCBjdXJyZW50TG9jYWxlID0gd2luZG93Lm1vbWVudC5sb2NhbGUobW9tZW50TG9jYWxlKTtcbiAgICBjb25zb2xlLmRlYnVnKGBbQ2FsZW5kYXJdIFRyeWluZyB0byBzd2l0Y2ggTW9tZW50LmpzIGdsb2JhbCBsb2NhbGUgdG8gJHttb21lbnRMb2NhbGV9LCBnb3QgJHtjdXJyZW50TG9jYWxlfWApO1xuICAgIG92ZXJyaWRlR2xvYmFsTW9tZW50V2Vla1N0YXJ0KHdlZWtTdGFydCk7XG4gICAgcmV0dXJuIGN1cnJlbnRMb2NhbGU7XG59XG5cbmV4cG9ydCB7IENhbGVuZGFyLCBjb25maWd1cmVHbG9iYWxNb21lbnRMb2NhbGUgfTtcbiIsImltcG9ydCB0eXBlIHsgQXBwIH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHsgY29uZmlndXJlR2xvYmFsTW9tZW50TG9jYWxlIH0gZnJvbSAnb2JzaWRpYW4tY2FsZW5kYXItdWknO1xuaW1wb3J0IHR5cGUgeyBJU2V0dGluZ3MgfSBmcm9tICdzcmMvc2V0dGluZ3MnO1xuXG5leHBvcnQgY29uc3Qgc2hvdWxkQ29uZmlndXJlR2xvYmFsTW9tZW50ID0gKGFwcDogQXBwKTogYm9vbGVhbiA9PlxuICAvLyBYWFg6IElmIHRoZSBjYWxlbmRhciBwbHVnaW4gaXMgaW5zdGFsbGVkLCBqdXN0IHVzZSB0aG9zZSBzZXR0aW5ncy5cbiAgLy8gT3RoZXJ3aXNlLCB3ZSBhcmUgcmVzcG9uc2libGUgZm9yIGNvbmZpZ3VyaW5nIHdlZWtTdGFydCBhbmQgbG9jYWxlT3ZlcnJpZGUuXG4gICEoYXBwIGFzIGFueSkucGx1Z2lucy5nZXRQbHVnaW4oJ2NhbGVuZGFyJyk/Ll9sb2FkZWQ7XG5cbmV4cG9ydCBjb25zdCB0cnlUb0NvbmZpZ3VyZUdsb2JhbE1vbWVudCA9IChcbiAgYXBwOiBBcHAsXG4gIHNldHRpbmdzOiBJU2V0dGluZ3MsXG4pOiB2b2lkID0+IHtcbiAgLy8gWFhYOiBJZiB0aGUgY2FsZW5kYXIgcGx1Z2luIGlzIGluc3RhbGxlZCwganVzdCB1c2UgdGhvc2Ugc2V0dGluZ3MuXG4gIC8vIE90aGVyd2lzZSwgd2UgYXJlIHJlc3BvbnNpYmxlIGZvciBjb25maWd1cmluZyB3ZWVrU3RhcnQgYW5kIGxvY2FsZU92ZXJyaWRlLlxuICBpZiAoc2hvdWxkQ29uZmlndXJlR2xvYmFsTW9tZW50KGFwcCkpIHtcbiAgICBjb25maWd1cmVHbG9iYWxNb21lbnRMb2NhbGUoc2V0dGluZ3MubG9jYWxlT3ZlcnJpZGUsIHNldHRpbmdzLndlZWtTdGFydCk7XG4gIH1cbn07XG4iLCJpbXBvcnQgdHlwZSB7IElMb2NhbGVPdmVycmlkZSwgSVdlZWtTdGFydE9wdGlvbiB9IGZyb20gJ29ic2lkaWFuLWNhbGVuZGFyLXVpJztcblxuZXhwb3J0IGludGVyZmFjZSBJU2V0dGluZ3Mge1xuICB0YXNrc0hlYWRlcjogc3RyaW5nO1xuICBibGFua0xpbmVBZnRlckhlYWRlcjogYm9vbGVhbjtcbiAgcHJlc2VydmVNb3ZlZFRhc2tzOiBib29sZWFuO1xuXG4gIC8vIENhbGVuZGFyIHZpZXdcbiAgbG9jYWxlT3ZlcnJpZGU6IElMb2NhbGVPdmVycmlkZTtcbiAgd2Vla1N0YXJ0OiBJV2Vla1N0YXJ0T3B0aW9uO1xufVxuXG5jb25zdCBkZWZhdWx0U2V0dGluZ3M6IElTZXR0aW5ncyA9IHtcbiAgdGFza3NIZWFkZXI6ICcjIyBUYXNrcycsXG4gIGJsYW5rTGluZUFmdGVySGVhZGVyOiB0cnVlLFxuICBwcmVzZXJ2ZU1vdmVkVGFza3M6IGZhbHNlLFxuXG4gIGxvY2FsZU92ZXJyaWRlOiAnc3lzdGVtLWRlZmF1bHQnLFxuICB3ZWVrU3RhcnQ6ICdsb2NhbGUnLFxufTtcblxuZXhwb3J0IGNvbnN0IHNldHRpbmdzV2l0aERlZmF1bHRzID0gKFxuICBzZXR0aW5nczogUGFydGlhbDxJU2V0dGluZ3M+LFxuKTogSVNldHRpbmdzID0+ICh7IC4uLmRlZmF1bHRTZXR0aW5ncywgLi4uc2V0dGluZ3MgfSk7XG4iLCJpbXBvcnQgdHlwZSB7IFRhc2tIYW5kbGVyIH0gZnJvbSAnLi90YXNrLWhhbmRsZXInO1xuaW1wb3J0IHR5cGUgeyBUYXNrTGluZSB9IGZyb20gJy4vdGFzay1saW5lJztcbmltcG9ydCB0eXBlIHsgUGVyaW9kaWNOb3RlSUQsIFZhdWx0SW50ZXJtZWRpYXRlIH0gZnJvbSAnLi92YXVsdCc7XG5pbXBvcnQgdHlwZSB7IFRBYnN0cmFjdEZpbGUsIFRGaWxlIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5leHBvcnQgZW51bSBOb3RlVHlwZSB7XG4gIERheSA9IDEsXG4gIFdlZWssXG4gIE1vbnRoLFxufVxuZXhwb3J0IGludGVyZmFjZSBGaWxlVGFza3Mge1xuICBmaWxlOiBURmlsZTtcbiAgdHlwZTogTm90ZVR5cGU7XG4gIHRhc2tzOiBUYXNrTGluZVtdO1xufVxuZXhwb3J0IGNsYXNzIFRhc2tDYWNoZSB7XG4gIHByaXZhdGUgZGFpbHlOb3RlczogUmVjb3JkPFBlcmlvZGljTm90ZUlELCBURmlsZT47XG4gIHByaXZhdGUgd2Vla2x5Tm90ZXM6IFJlY29yZDxQZXJpb2RpY05vdGVJRCwgVEZpbGU+O1xuICBwcml2YXRlIG1vbnRobHlOb3RlczogUmVjb3JkPFBlcmlvZGljTm90ZUlELCBURmlsZT47XG4gIHByaXZhdGUgaGFzTG9hZGVkOiBib29sZWFuO1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IHsgaWQ6IG51bWJlcjsgaG9vazogKHZhbDogYW55KSA9PiB2b2lkIH1bXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHZhdWx0OiBWYXVsdEludGVybWVkaWF0ZTtcbiAgcHJpdmF0ZSByZWFkb25seSB0YXNrSGFuZGxlcjogVGFza0hhbmRsZXI7XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgRGFpbHksIFdlZWtseSwgYW5kIE1vbnRobHkgbm90ZXMgb3JkZXJlZCBjaHJvbm9sb2dpY2FsbHkuXG4gICAqL1xuICBwcml2YXRlIHBlcmlvZGljTm90ZUxpc3Q6IFBlcmlvZGljTm90ZUlEW107XG4gIHByaXZhdGUgdGFza0xpbmVDYWNoZTogRmlsZVRhc2tzW107XG5cbiAgY29uc3RydWN0b3IodGFza0hhbmRsZXI6IFRhc2tIYW5kbGVyLCB2YXVsdDogVmF1bHRJbnRlcm1lZGlhdGUpIHtcbiAgICB0aGlzLnZhdWx0ID0gdmF1bHQ7XG4gICAgdGhpcy50YXNrSGFuZGxlciA9IHRhc2tIYW5kbGVyO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IFtdO1xuICAgIHRoaXMudGFza0xpbmVDYWNoZSA9IFtdO1xuICAgIHRoaXMuaGFzTG9hZGVkID0gZmFsc2U7XG5cbiAgICAvLyB0aGlzLmluaXRpYWxpemUoKTsgLy8gbm9uLWJsb2NraW5nLCBjYWxscyBub3RpZnkgd2hlbiBjb21wbGV0ZVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzdWJzY3JpYmUgZnVuY3Rpb24gaW1wbGVtZW50cyB0aGUgU3RvcmUgaW50ZXJmYWNlIGluIFN2ZWx0ZS4gVGhlXG4gICAqIHN1YnNjcmliZXJzIG11c3QgYmUgY2FsbGVkIGFueSB0aW1lIHRoZXJlIGlzIGEgY2hhbmdlIHRvIHRoZSB0YXNrLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN1YnNjcmliZSA9IChcbiAgICBzdWJzY3JpcHRpb246ICh2YWx1ZTogYW55KSA9PiB2b2lkLFxuICApOiAoKCkgPT4gdm9pZCkgPT4ge1xuICAgIGNvbnN0IG1heElEID0gdGhpcy5zdWJzY3JpcHRpb25zLnJlZHVjZShcbiAgICAgIChwcmV2LCB7IGlkIH0pOiBudW1iZXIgPT4gTWF0aC5tYXgocHJldiwgaWQpLFxuICAgICAgMCxcbiAgICApO1xuICAgIGNvbnN0IG5ld0lEID0gbWF4SUQgKyAxO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goeyBpZDogbmV3SUQsIGhvb2s6IHN1YnNjcmlwdGlvbiB9KTtcbiAgICBzdWJzY3JpcHRpb24odGhpcyk7XG5cbiAgICAvLyBSZXR1cm4gYW4gdW5zdWJzY3JpYmUgZnVuY3Rpb25cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zID0gdGhpcy5zdWJzY3JpcHRpb25zLmZpbHRlcigoeyBpZCB9KSA9PiBpZCAhPT0gbmV3SUQpO1xuICAgICAgY29uc29sZS5sb2coYFJlbW92aW5nIHN1YnNjcmlwdGlvbiAke25ld0lEfWApO1xuICAgIH07XG4gIH07XG5cbiAgcHVibGljIGdldCBsb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5oYXNMb2FkZWQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNldCBmdW5jdGlvbiBpbXBsZW1lbnRzIHRoZSBTdG9yZSBpbnRlcmZhY2UgaW4gU3ZlbHRlLiBXZSBhcmUgbm90XG4gICAqIGFjdHVhbGx5IHVzaW5nIGl0IHRvIHN0b3JlIG5ldyB2YWx1ZXMsIGJ1dCBpdCBpcyBuZWVkZWQgd2hlbiBiaW5kaW5nIHRvXG4gICAqIHByb3BlcnRpZXMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc2V0ID0gKF86IGFueSk6IHZvaWQgPT4ge307XG5cbiAgcHVibGljIGdldCBmaWxlcygpOiBGaWxlVGFza3NbXSB7XG4gICAgcmV0dXJuIHRoaXMudGFza0xpbmVDYWNoZTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBmaWxlT3Blbkhvb2sgPSBhc3luYyAoZmlsZTogVEZpbGUpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCBjYWNoZSA9IHRoaXMudGFza0xpbmVDYWNoZS5maW5kKChmdCkgPT4gZnQuZmlsZSA9PT0gZmlsZSk7XG4gICAgaWYgKGNhY2hlKSB7XG4gICAgICBjYWNoZS50YXNrcyA9IGF3YWl0IHRoaXMudGFza0hhbmRsZXIuZ2V0RmlsZVRhc2tzKGZpbGUpO1xuICAgICAgdGhpcy5ub3RpZnkoKTtcbiAgICB9XG4gIH07XG5cbiAgcHVibGljIHJlYWRvbmx5IGZpbGVDcmVhdGVIb29rID0gKGZpbGU6IFRBYnN0cmFjdEZpbGUpOiB2b2lkID0+IHtcbiAgICAvLyBUT0RPOiBBIG1vcmUgZ3JhbnVsYXIgYWRkaXRpb24gb2YgdGhlIG5ldyBmaWxlIHdvdWxkIGJlIG1vcmUgZWZmaWNpZW50XG4gICAgLy8gQ2Fubm90IGNhbGwgaW5pdGlhbGl6ZSBvbiBldmVyeSBmaWxlLWNyZWF0ZSBldmVudCBiZWNhdXNlIE9ic2lkaWFuIGZpcmVzXG4gICAgLy8gdGhhdCBldmVudCBmb3IgZXZlciBzaW5nbGUgZmlsZSB3aGVuIGZpcnN0IHN0YXJ0aW5nLlxuICAgIC8vIHRoaXMuaW5pdGlhbGl6ZSgpOyAvLyBub24tYmxvY2tpbmdcbiAgfTtcblxuICBwdWJsaWMgcmVhZG9ubHkgZmlsZURlbGV0ZUhvb2sgPSAoZmlsZTogVEFic3RyYWN0RmlsZSk6IHZvaWQgPT4ge1xuICAgIC8vIFRPRE86IEEgbW9yZSBncmFudWxhciByZW1vdmFsIG9mIHRoZSBmaWxlIHdvdWxkIGJlIG1vcmUgZWZmaWNpZW50XG4gICAgdGhpcy5pbml0aWFsaXplKCk7IC8vIG5vbi1ibG9ja2luZ1xuICB9O1xuXG4gIHB1YmxpYyByZWFkb25seSBmaWxlUmVuYW1lSG9vayA9IChcbiAgICBmaWxlOiBUQWJzdHJhY3RGaWxlLFxuICAgIG9sZFBhdGg6IHN0cmluZyxcbiAgKTogdm9pZCA9PiB7XG4gICAgLy8gVE9ETzogQSBtb3JlIGdyYW51bGFyIHVwZGF0ZSBvZiB0aGUgZmlsZSB3b3VsZCBiZSBtb3JlIGVmZmljaWVudFxuICAgIHRoaXMuaW5pdGlhbGl6ZSgpOyAvLyBub24tYmxvY2tpbmdcbiAgfTtcblxuICAvKipcbiAgICogTm90aWZ5IHN1YnNjcmlwdGlvbnMgb2YgYSBjaGFuZ2UuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbm90aWZ5ID0gKCk6IHZvaWQgPT4ge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKCh7IGhvb2sgfSkgPT4gaG9vayh0aGlzKSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIExvYWQgYW55IG5lY2Vzc2FyeSBzdGF0ZSBhc3luY2hyb25vdXNseVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGluaXRpYWxpemUgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc29sZS5sb2coJ2luaXRpYWxpemluZycpO1xuICAgIHRoaXMuZGFpbHlOb3RlcyA9IHRoaXMudmF1bHQuZ2V0RGFpbHlOb3RlcygpO1xuICAgIHRoaXMud2Vla2x5Tm90ZXMgPSB0aGlzLnZhdWx0LmdldFdlZWtseU5vdGVzKCk7XG4gICAgdGhpcy5tb250aGx5Tm90ZXMgPSB0aGlzLnZhdWx0LmdldE1vbnRobHlOb3RlcygpO1xuICAgIHRoaXMucGVyaW9kaWNOb3RlTGlzdCA9IHRoaXMubGlzdEZpbGVzKCk7XG4gICAgYXdhaXQgdGhpcy5wb3B1bGF0ZVRhc2tMaW5lQ2FjaGUoKTtcblxuICAgIHRoaXMuaGFzTG9hZGVkID0gdHJ1ZTtcbiAgICB0aGlzLm5vdGlmeSgpO1xuICB9O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZ2V0RmlsZUZvclBlcmlvZGljTm90ZSA9IChpZDogUGVyaW9kaWNOb3RlSUQpOiBURmlsZSA9PiB7XG4gICAgc3dpdGNoIChpZC5zcGxpdCgnLScsIDEpWzBdKSB7XG4gICAgICBjYXNlICdkYXknOlxuICAgICAgICByZXR1cm4gdGhpcy5kYWlseU5vdGVzW2lkXTtcbiAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICByZXR1cm4gdGhpcy53ZWVrbHlOb3Rlc1tpZF07XG4gICAgICBjYXNlICdtb250aCc6XG4gICAgICAgIHJldHVybiB0aGlzLm1vbnRobHlOb3Rlc1tpZF07XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH07XG5cbiAgcHJpdmF0ZSByZWFkb25seSBub3RlVHlwZUZvclBlcmlvZGljTm90ZSA9IChpZDogUGVyaW9kaWNOb3RlSUQpOiBOb3RlVHlwZSA9PiB7XG4gICAgc3dpdGNoIChpZC5zcGxpdCgnLScsIDEpWzBdKSB7XG4gICAgICBjYXNlICdkYXknOlxuICAgICAgICByZXR1cm4gTm90ZVR5cGUuRGF5O1xuICAgICAgY2FzZSAnd2Vlayc6XG4gICAgICAgIHJldHVybiBOb3RlVHlwZS5XZWVrO1xuICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICByZXR1cm4gTm90ZVR5cGUuTW9udGg7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH07XG5cbiAgcHJpdmF0ZSByZWFkb25seSBwb3B1bGF0ZVRhc2tMaW5lQ2FjaGUgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3QgZmlsZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHRoaXMucGVyaW9kaWNOb3RlTGlzdC5tYXAoXG4gICAgICAgIGFzeW5jIChwZXJpb2RpY05vdGVJRCk6IFByb21pc2U8RmlsZVRhc2tzPiA9PiB7XG4gICAgICAgICAgY29uc3QgZmlsZSA9IHRoaXMuZ2V0RmlsZUZvclBlcmlvZGljTm90ZShwZXJpb2RpY05vdGVJRCk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgICB0eXBlOiB0aGlzLm5vdGVUeXBlRm9yUGVyaW9kaWNOb3RlKHBlcmlvZGljTm90ZUlEKSxcbiAgICAgICAgICAgIHRhc2tzOiBmaWxlID8gYXdhaXQgdGhpcy50YXNrSGFuZGxlci5nZXRGaWxlVGFza3MoZmlsZSkgOiBbXSxcbiAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgKSxcbiAgICApO1xuXG4gICAgdGhpcy50YXNrTGluZUNhY2hlID0gZmlsZXMuZmlsdGVyKChmKSA9PiBmLnRhc2tzLmxlbmd0aCA+IDApO1xuICAgIHRoaXMuaGFzTG9hZGVkID0gdHJ1ZTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgb2YgZGFpbHkvd2Vla2x5L21vbnRobHkgbm90ZSBmaWxlcy5cbiAgICogTk9URTogVGhlIHZhbHVlcyByZXR1cm5lZCBhcmUgbm90IGFjdHVhbGx5IGZpbGUgbmFtZXMsIGJ1dCB2YWx1ZXMgc2ltaWxhciB0bzpcbiAgICogICAtIGRheS0yMDIxLTAyLTEyVDAwOjAwOjAwLTA4OjAwXG4gICAqICAgLSB3ZWVrLTIwMjEtMDItMjFUMDA6MDA6MDAtMDg6MDBcbiAgICogICAtIG1vbnRoLTIwMjEtMDItMDFUMDA6MDA6MDAtMDg6MDBcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgbGlzdEZpbGVzID0gKCk6IFBlcmlvZGljTm90ZUlEW10gPT4ge1xuICAgIGNvbnN0IGRhaWx5Tm90ZUtleXMgPSBPYmplY3Qua2V5cyh0aGlzLmRhaWx5Tm90ZXMpLnJldmVyc2UoKTtcbiAgICBjb25zdCB3ZWVrbHlOb3RlS2V5cyA9IE9iamVjdC5rZXlzKHRoaXMud2Vla2x5Tm90ZXMpLnJldmVyc2UoKTtcbiAgICBjb25zdCBtb250aGx5Tm90ZUtleXMgPSBPYmplY3Qua2V5cyh0aGlzLm1vbnRobHlOb3RlcykucmV2ZXJzZSgpO1xuXG4gICAgbGV0IHdlZWtseUkgPSAwO1xuICAgIGxldCBtb250aGx5SSA9IDA7XG5cbiAgICBjb25zdCBvcmRlcmVkTm90ZU5hbWVzOiBQZXJpb2RpY05vdGVJRFtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGN1cnJlbnREYWlseU5vdGUgb2YgZGFpbHlOb3RlS2V5cykge1xuICAgICAgaWYgKFxuICAgICAgICBtb250aGx5Tm90ZUtleXMubGVuZ3RoID4gbW9udGhseUkgJiZcbiAgICAgICAgdGhpcy5hZnRlcihjdXJyZW50RGFpbHlOb3RlLCBtb250aGx5Tm90ZUtleXNbbW9udGhseUldKVxuICAgICAgKSB7XG4gICAgICAgIG9yZGVyZWROb3RlTmFtZXMucHVzaChtb250aGx5Tm90ZUtleXNbbW9udGhseUldKTtcbiAgICAgICAgbW9udGhseUkrKztcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgd2Vla2x5Tm90ZUtleXMubGVuZ3RoID4gd2Vla2x5SSAmJlxuICAgICAgICB0aGlzLmFmdGVyKGN1cnJlbnREYWlseU5vdGUsIHdlZWtseU5vdGVLZXlzW3dlZWtseUldKVxuICAgICAgKSB7XG4gICAgICAgIG9yZGVyZWROb3RlTmFtZXMucHVzaCh3ZWVrbHlOb3RlS2V5c1t3ZWVrbHlJXSk7XG4gICAgICAgIHdlZWtseUkrKztcbiAgICAgIH1cbiAgICAgIG9yZGVyZWROb3RlTmFtZXMucHVzaChjdXJyZW50RGFpbHlOb3RlKTtcbiAgICB9XG5cbiAgICBmb3IgKDsgd2Vla2x5SSA8IHdlZWtseU5vdGVLZXlzLmxlbmd0aDsgd2Vla2x5SSsrKSB7XG4gICAgICBjb25zdCBjdXJyZW50V2Vla2x5Tm90ZSA9IHdlZWtseU5vdGVLZXlzW3dlZWtseUldO1xuICAgICAgaWYgKFxuICAgICAgICBtb250aGx5Tm90ZUtleXMubGVuZ3RoID4gbW9udGhseUkgJiZcbiAgICAgICAgdGhpcy5hZnRlcihjdXJyZW50V2Vla2x5Tm90ZSwgbW9udGhseU5vdGVLZXlzW21vbnRobHlJXSlcbiAgICAgICkge1xuICAgICAgICBvcmRlcmVkTm90ZU5hbWVzLnB1c2gobW9udGhseU5vdGVLZXlzW21vbnRobHlJXSk7XG4gICAgICAgIG1vbnRobHlJKys7XG4gICAgICB9XG4gICAgICBvcmRlcmVkTm90ZU5hbWVzLnB1c2goY3VycmVudFdlZWtseU5vdGUpO1xuICAgIH1cblxuICAgIGZvciAoOyBtb250aGx5SSA8IG1vbnRobHlOb3RlS2V5cy5sZW5ndGg7IG1vbnRobHlJKyspIHtcbiAgICAgIG9yZGVyZWROb3RlTmFtZXMucHVzaChtb250aGx5Tm90ZUtleXNbbW9udGhseUldKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3JkZXJlZE5vdGVOYW1lcztcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBmaXJzdCBub3RlIG5hbWUgaXMgbGF0ZXIgY2hyb25vbG9naWNhbGx5IHRoYW4gdGhlIGZpcnN0LlxuICAgKiBFeHBlY3RzIG5vdGUgbmFtZXMgdG8gYmUgc2ltaWxhciB0bzpcbiAgICogICAtIGRheS0yMDIxLTAyLTEyVDAwOjAwOjAwLTA4OjAwXG4gICAqICAgLSB3ZWVrLTIwMjEtMDItMjFUMDA6MDA6MDAtMDg6MDBcbiAgICogICAtIG1vbnRoLTIwMjEtMDItMDFUMDA6MDA6MDAtMDg6MDBcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgYWZ0ZXIgPSAobmFtZTE6IHN0cmluZywgbmFtZTI6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IGQxID0gd2luZG93Lm1vbWVudChuYW1lMS5zdWJzdHJpbmcobmFtZTEuaW5kZXhPZignLScpICsgMSkpO1xuICAgIGNvbnN0IGQyID0gd2luZG93Lm1vbWVudChuYW1lMi5zdWJzdHJpbmcobmFtZTIuaW5kZXhPZignLScpICsgMSkpO1xuICAgIHJldHVybiBkMS5pc0FmdGVyKGQyKTtcbiAgfTtcbn1cbiIsImltcG9ydCB0eXBlIHsgSVNldHRpbmdzIH0gZnJvbSAnLi9zZXR0aW5ncyc7XG5pbXBvcnQgdHlwZSB7IFRhc2tMaW5lIH0gZnJvbSAnLi90YXNrLWxpbmUnO1xuaW1wb3J0IHR5cGUgeyBWYXVsdEludGVybWVkaWF0ZSB9IGZyb20gJy4vdmF1bHQnO1xuaW1wb3J0IHR5cGUgeyBURmlsZSB9IGZyb20gJ29ic2lkaWFuJztcblxuLyoqXG4gKiBBZGRzIGEgbGluZSBmb3IgdGhlIHByb3ZpZGVkIHRhc2sgdG8gdGhlIHNwZWNpZmllZCBmaWxlIGluIHRoZSB0YXNrcyBzZWN0aW9uLlxuICovXG5leHBvcnQgY29uc3QgYWRkVGFza1JlcGV0aXRpb24gPSBhc3luYyAoXG4gIGZpbGU6IFRGaWxlLFxuICB0YXNrOiBUYXNrTGluZSxcbiAgc2V0dGluZ3M6IElTZXR0aW5ncyxcbiAgdmF1bHQ6IFZhdWx0SW50ZXJtZWRpYXRlLFxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnNvbGUuZGVidWcoXG4gICAgJ1NsYXRlZDogRW5zdXJpbmcgcmVwZWF0aW5nIHRhc2sgZXhpc3RzIGluIGZpbGU6ICcgKyBmaWxlLmJhc2VuYW1lLFxuICApO1xuXG4gIHJldHVybiB3aXRoRmlsZUNvbnRlbnRzKGZpbGUsIHZhdWx0LCAobGluZXM6IHN0cmluZ1tdKTogYm9vbGVhbiA9PiB7XG4gICAgY29uc3QgdGFza1NlY3Rpb25JbmRleCA9IGdldEluZGV4VGFza3NIZWFkaW5nKFxuICAgICAgbGluZXMsXG4gICAgICB0YXNrLmhlYWRpbmdzLFxuICAgICAgc2V0dGluZ3MsXG4gICAgKTtcbiAgICBjb25zdCB0YXNrU2VjdGlvbkVuZEluZGV4ID0gZ2V0SW5kZXhTZWN0aW9uTGFzdENvbnRlbnQoXG4gICAgICBsaW5lcyxcbiAgICAgIHRhc2tTZWN0aW9uSW5kZXgsXG4gICAgKTtcblxuICAgIGNvbnN0IGxpbmVzVG9JbnNlcnQgPSB0YXNrLnN1YkNvbnRlbnQuc2xpY2UoKTtcbiAgICBsaW5lc1RvSW5zZXJ0LnVuc2hpZnQodGFzay5saW5lQXNSZXBlYXRlZCgpKTtcblxuICAgIGluc2VydExpbmVzKGxpbmVzLCBsaW5lc1RvSW5zZXJ0LCB0YXNrU2VjdGlvbkVuZEluZGV4ICsgMSwgc2V0dGluZ3MpO1xuICAgIHJldHVybiB0cnVlO1xuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRUYXNrTW92ZSA9IGFzeW5jIChcbiAgZmlsZTogVEZpbGUsXG4gIHRhc2s6IFRhc2tMaW5lLFxuICBzZXR0aW5nczogSVNldHRpbmdzLFxuICB2YXVsdDogVmF1bHRJbnRlcm1lZGlhdGUsXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc29sZS5kZWJ1ZygnU2xhdGVkOiBNb3ZpbmcgdGFzayB0byBmaWxlOiAnICsgZmlsZS5iYXNlbmFtZSk7XG5cbiAgY29uc3QgbGluZXNUb0luc2VydCA9IHRhc2suc3ViQ29udGVudC5zbGljZSgpO1xuICBsaW5lc1RvSW5zZXJ0LnVuc2hpZnQodGFzay5saW5lKTtcblxuICByZXR1cm4gd2l0aEZpbGVDb250ZW50cyhmaWxlLCB2YXVsdCwgKGxpbmVzOiBzdHJpbmdbXSk6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IHRhc2tTZWN0aW9uSW5kZXggPSBnZXRJbmRleFRhc2tzSGVhZGluZyhcbiAgICAgIGxpbmVzLFxuICAgICAgdGFzay5oZWFkaW5ncyxcbiAgICAgIHNldHRpbmdzLFxuICAgICk7XG4gICAgY29uc3QgdGFza1NlY3Rpb25FbmRJbmRleCA9IGdldEluZGV4U2VjdGlvbkxhc3RDb250ZW50KFxuICAgICAgbGluZXMsXG4gICAgICB0YXNrU2VjdGlvbkluZGV4LFxuICAgICk7XG5cbiAgICBpbnNlcnRMaW5lcyhsaW5lcywgbGluZXNUb0luc2VydCwgdGFza1NlY3Rpb25FbmRJbmRleCArIDEsIHNldHRpbmdzKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgcmVtb3ZlVGFzayA9IGFzeW5jIChcbiAgZmlsZTogVEZpbGUsXG4gIHRhc2s6IFRhc2tMaW5lLFxuICB2YXVsdDogVmF1bHRJbnRlcm1lZGlhdGUsXG4pOiBQcm9taXNlPHZvaWQ+ID0+XG4gIHJlbW92ZUxpbmVzKGZpbGUsIHRhc2subGluZU51bSwgMSArIHRhc2suc3ViQ29udGVudC5sZW5ndGgsIHZhdWx0KTtcblxuZXhwb3J0IGNvbnN0IHJlbW92ZUxpbmVzID0gYXN5bmMgKFxuICBmaWxlOiBURmlsZSxcbiAgc3RhcnQ6IG51bWJlcixcbiAgY291bnQ6IG51bWJlcixcbiAgdmF1bHQ6IFZhdWx0SW50ZXJtZWRpYXRlLFxuKTogUHJvbWlzZTx2b2lkPiA9PlxuICB3aXRoRmlsZUNvbnRlbnRzKGZpbGUsIHZhdWx0LCAobGluZXM6IHN0cmluZ1tdKTogYm9vbGVhbiA9PiB7XG4gICAgbGluZXMuc3BsaWNlKHN0YXJ0LCBjb3VudCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBtYXJrcyB7Y291bnR9IHRoZSB0YXNrcyBzdGFydGluZyBvbiBsaW5lIHtzdGFydH0gYXMgY29waWVkIGJ5IGluc2VydGluZyAnPicgYmV0d2VlbiBicmFja2V0c1xuICogQHBhcmFtIHtURmlsZX0gZmlsZVxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IC0tIHRoZSBsaW5lIG51bWJlciBvZiB0aGUgZmlyc3QgdGFzayB0byBtYXJrIGFzIGNvcGllZFxuICogQHBhcmFtIHtudW1iZXJ9IGNvdW50IC0tIHRoZSBudW1iZXIgb2YgdGFza3MgdG8gbWFyayBhcyBjb3BpZWRcbiAqIEBwYXJhbSB7VmF1bHRJbnRlcm1lZGlhdGV9IHZhdWx0XG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgbWFya1Rhc2tBc0NvcGllZCA9IGFzeW5jIChcbiAgZmlsZTogVEZpbGUsXG4gIHN0YXJ0OiBudW1iZXIsXG4gIGNvdW50OiBudW1iZXIsXG4gIHZhdWx0OiBWYXVsdEludGVybWVkaWF0ZSxcbik6IFByb21pc2U8dm9pZD4gPT5cbiAgd2l0aEZpbGVDb250ZW50cyhmaWxlLCB2YXVsdCwgKGxpbmVzOiBzdHJpbmdbXSk6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IHRhc2tzVG9NYXJrID0gbGluZXMuc2xpY2Uoc3RhcnQsIHN0YXJ0ICsgY291bnQpO1xuICAgIGNvbnN0IG1hcmtlZFRhc2tzID0gdGFza3NUb01hcmsubWFwKCh0KSA9PiB0LnJlcGxhY2UoJ1sgXScsICdbPl0nKSk7XG4gICAgbGluZXMuc3BsaWNlKHN0YXJ0LCBjb3VudCwgLi4ubWFya2VkVGFza3MpO1xuICAgIHJldHVybiB0cnVlO1xuICB9KTtcblxuLyoqXG4gKiBSZWFkIHRoZSBmaWxlIGNvbnRlbnRzIGFuZCBwYXNzIHRvIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBhcyBhIGxpc3Qgb2YgbGluZXMuXG4gKiBJZiB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucyB0cnVlLCB3cml0ZSB0aGUgYXJyYXkgYmFjayB0byB0aGUgZmlsZS5cbiAqIE5PVEU6IElmIHVzZUNhY2hlIGlzIHRydWUsIHRoZSBmbiBpcyBub3QgYWxsb3dlZCB0byB1cGRhdGUgdGhlIGZpbGUhXG4gKi9cbmNvbnN0IHdpdGhGaWxlQ29udGVudHMgPSBhc3luYyAoXG4gIGZpbGU6IFRGaWxlLFxuICB2YXVsdDogVmF1bHRJbnRlcm1lZGlhdGUsXG4gIGZuOiAobGluZXM6IHN0cmluZ1tdKSA9PiBib29sZWFuLFxuICB1c2VDYWNoZSA9IGZhbHNlLFxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IGZpbGVDb250ZW50cyA9IChhd2FpdCB2YXVsdC5yZWFkRmlsZShmaWxlLCB1c2VDYWNoZSkpIHx8ICcnO1xuICBjb25zdCBsaW5lcyA9IGZpbGVDb250ZW50cy5zcGxpdCgnXFxuJyk7XG5cbiAgY29uc3QgdXBkYXRlZCA9IGZuKGxpbmVzKTtcbiAgaWYgKCF1c2VDYWNoZSAmJiB1cGRhdGVkKSB7XG4gICAgcmV0dXJuIHZhdWx0LndyaXRlRmlsZShmaWxlLCBsaW5lcy5qb2luKCdcXG4nKSk7XG4gIH1cbn07XG5cbi8qKlxuICogU2VhcmNoIHRoZSBwcm92aWRlZCBsaW5lcyBmb3IgdGhlIGluZGV4IG9mIHRoZSB0YXNrcyBzZWN0aW9uIGhlYWRpbmcuXG4gKiBOT1RFOiBUaGlzIG1heSBtb2RpZml5IHRoZSBhcnJheSB0byBhZGQgdGhlIGhlYWRlciBpZiBtaXNzaW5nLlxuICovXG5leHBvcnQgY29uc3QgZ2V0SW5kZXhUYXNrc0hlYWRpbmcgPSAoXG4gIGxpbmVzOiBzdHJpbmdbXSxcbiAgaGVhZGluZ3M6IHN0cmluZ1tdLFxuICBzZXR0aW5nczogSVNldHRpbmdzLFxuKTogbnVtYmVyID0+IHtcbiAgaWYgKGhlYWRpbmdzLmxlbmd0aCA9PT0gMCkge1xuICAgIGhlYWRpbmdzLnB1c2goc2V0dGluZ3MudGFza3NIZWFkZXIpO1xuICB9XG5cbiAgbGV0IHN0YXJ0SWR4ID0gMDtcbiAgbGV0IGVuZElkeCA9IGxpbmVzLmxlbmd0aDtcbiAgaGVhZGluZ3MuZm9yRWFjaCgoaGVhZGluZykgPT4ge1xuICAgIHN0YXJ0SWR4ID0gZ2V0SW5kZXhIZWFkaW5nSGVscGVyKFxuICAgICAgbGluZXMsXG4gICAgICBzdGFydElkeCxcbiAgICAgIGVuZElkeCxcbiAgICAgIGhlYWRpbmcsXG4gICAgICBzZXR0aW5ncyxcbiAgICApO1xuICAgIGVuZElkeCA9IGdldEluZGV4U2VjdGlvbk5leHRTaWJsaW5nKGxpbmVzLCBzdGFydElkeCk7XG4gIH0pO1xuXG4gIHJldHVybiBzdGFydElkeDtcbn07XG5cbmNvbnN0IGdldEluZGV4SGVhZGluZ0hlbHBlciA9IChcbiAgbGluZXM6IHN0cmluZ1tdLFxuICBzdGFydElkeDogbnVtYmVyLFxuICBlbmRJZHg6IG51bWJlcixcbiAgaGVhZGluZzogc3RyaW5nLFxuICBzZXR0aW5nczogSVNldHRpbmdzLFxuKTogbnVtYmVyID0+IHtcbiAgY29uc3QgYWN0dWFsRW5kSWR4ID0gTWF0aC5taW4oZW5kSWR4LCBsaW5lcy5sZW5ndGgpO1xuICBmb3IgKGxldCBpID0gc3RhcnRJZHg7IGkgPCBhY3R1YWxFbmRJZHg7IGkrKykge1xuICAgIGlmIChsaW5lc1tpXSA9PT0gaGVhZGluZykge1xuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICB9XG5cbiAgLy8gVGFza3Mgc2VjdGlvbiBub3QgZm91bmQsIHNvIGFkZCBpdFxuXG4gIGlmIChsaW5lcy5sZW5ndGggPT09IDEgJiYgbGluZXNbMF0gPT09ICcnKSB7XG4gICAgLy8gRW1wdHkgZmlsZSwganVzdCByZXBsYWNlIHRoZSBmaXJzdCBsaW5lXG4gICAgbGluZXNbMF0gPSBoZWFkaW5nO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgaWYgKHNldHRpbmdzLmJsYW5rTGluZUFmdGVySGVhZGVyICYmIGxpbmVzW2VuZElkeCAtIDFdICE9PSAnJykge1xuICAgIGxpbmVzLnNwbGljZShlbmRJZHgsIDAsICcnLCBoZWFkaW5nKTtcbiAgICByZXR1cm4gZW5kSWR4ICsgMTtcbiAgfVxuXG4gIGxpbmVzLnNwbGljZShlbmRJZHgsIDAsIGhlYWRpbmcpO1xuICByZXR1cm4gZW5kSWR4O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEluZGV4U2VjdGlvbk5leHRTaWJsaW5nID0gKFxuICBsaW5lczogc3RyaW5nW10sXG4gIHNlY3Rpb25IZWFkZXI6IG51bWJlcixcbik6IG51bWJlciA9PiB7XG4gIGNvbnN0IGRlc2lyZWRIZWFkZXJEZXB0aCA9IGdldEhlYWRlckRlcHRoKGxpbmVzW3NlY3Rpb25IZWFkZXJdKTtcblxuICAvLyBTdGFydCBvbiB0aGUgbGluZSBhZnRlciB0aGUgaGVhZGVyLlxuICAvLyBOT1RFOiBUaGF0IGNvdWxkIGJlIHRoZSBlbmQgb2YgdGhlIGZpbGUhXG4gIGZvciAobGV0IGkgPSBzZWN0aW9uSGVhZGVyICsgMTsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgbGluZSA9IGxpbmVzW2ldO1xuICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoJyMnKSAmJiBnZXRIZWFkZXJEZXB0aChsaW5lKSA8PSBkZXNpcmVkSGVhZGVyRGVwdGgpIHtcbiAgICAgIHJldHVybiBpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbGluZXMubGVuZ3RoO1xufTtcblxuLyoqXG4gKiBTZWFyY2ggdGhlIHByb3ZpZGVkIGxpbmVzIGZvciB0aGUgaW5kZXggb2YgdGhlIGxhc3QgbGluZSBvZiBjb250ZW50IHN0YXJ0aW5nXG4gKiBhZnRlciB0aGUgcHJvdmlkZWQgc2VjdGlvbiBoZWFkZXIgaW5kZXguXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRJbmRleFNlY3Rpb25MYXN0Q29udGVudCA9IChcbiAgbGluZXM6IHN0cmluZ1tdLFxuICBzZWN0aW9uSGVhZGVyOiBudW1iZXIsXG4pOiBudW1iZXIgPT4ge1xuICBsZXQgbGFzdENvbnRlbnRMaW5lID0gLTE7XG4gIGxldCBuZXh0SGVhZGVyTGluZSA9IC0xO1xuXG4gIC8vIFN0YXJ0IG9uIHRoZSBsaW5lIGFmdGVyIHRoZSBoZWFkZXIuXG4gIC8vIE5PVEU6IFRoYXQgY291bGQgYmUgdGhlIGVuZCBvZiB0aGUgZmlsZSFcbiAgZm9yIChsZXQgaSA9IHNlY3Rpb25IZWFkZXIgKyAxOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBsaW5lID0gbGluZXNbaV07XG5cbiAgICBpZiAobGluZS5zdGFydHNXaXRoKCcjJykpIHtcbiAgICAgIG5leHRIZWFkZXJMaW5lID0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChsaW5lLnRyaW0oKSAhPT0gJycpIHtcbiAgICAgIGxhc3RDb250ZW50TGluZSA9IGk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGxhc3RDb250ZW50TGluZSA9PT0gLTEpIHtcbiAgICAvLyBUaGVyZSBpcyBubyBjb250ZW50IGluIHRoaXMgc2VjdGlvbiwgc28gcmV0dXJuIHRoZSBoZWFkZXIgaW5kZXhcbiAgICByZXR1cm4gc2VjdGlvbkhlYWRlcjtcbiAgfVxuICAvLyBUaGVyZSBpcyBjb250ZW50IGluIHRoaXMgc2VjdGlvbiwgcmV0dXJuIHRoZSBsYXN0IGxpbmUgb2YgaXQuXG4gIHJldHVybiBsYXN0Q29udGVudExpbmU7XG59O1xuXG4vKipcbiAqIEluc2VydCB0aGUgcHJvdmlkZWQgbGluZSBiZWZvcmUgdGhlIHByb3ZpZGVkIGluZGV4LiBJZiB0aGUgc2V0dGluZ3MgY2FsbFxuICogZm9yIGEgYmxhbmsgbGluZSBhcm91bmQgaGVhZGluZ3MsIGluc2VydCBibGFuayBsaW5lcyBhcyBuZWNlc3NhcnkuXG4gKi9cbmV4cG9ydCBjb25zdCBpbnNlcnRMaW5lcyA9IChcbiAgZmlsZUxpbmVzOiBzdHJpbmdbXSxcbiAgbGluZXNUb0FkZDogc3RyaW5nW10sXG4gIGk6IG51bWJlcixcbiAgc2V0dGluZ3M6IElTZXR0aW5ncyxcbik6IHZvaWQgPT4ge1xuICBpZiAoIXNldHRpbmdzLmJsYW5rTGluZUFmdGVySGVhZGVyKSB7XG4gICAgZmlsZUxpbmVzLnNwbGljZShpLCAwLCAuLi5saW5lc1RvQWRkKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoaSA+IDAgJiYgZmlsZUxpbmVzW2kgLSAxXS5zdGFydHNXaXRoKCcjJykpIHtcbiAgICAvLyBMaW5lIGJlZm9yZSBpcyBhIGhlYWRpbmcsIGxlYXZlIGEgc3BhY2VcbiAgICBsaW5lc1RvQWRkLnVuc2hpZnQoJycpO1xuICB9XG4gIGlmIChpIDwgZmlsZUxpbmVzLmxlbmd0aCAmJiBmaWxlTGluZXNbaV0uc3RhcnRzV2l0aCgnIycpKSB7XG4gICAgLy8gTmV4dCBsaW5lIGlzIGEgaGVhZGluZywgbGVhdmUgYSBzcGFjZVxuICAgIGxpbmVzVG9BZGQucHVzaCgnJyk7XG4gIH0gZWxzZSBpZiAoaSA9PT0gZmlsZUxpbmVzLmxlbmd0aCkge1xuICAgIC8vIExhc3QgbGluZSBvZiB0aGUgZmlsZSwgbGVhdmUgYSBzcGFjZVxuICAgIGxpbmVzVG9BZGQucHVzaCgnJyk7XG4gIH1cblxuICBmaWxlTGluZXMuc3BsaWNlKGksIDAsIC4uLmxpbmVzVG9BZGQpO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbmFtZSBvZiB0aGlzIGRhaWx5IG5vdGUgY2FuIGJlIHBhcnNlZCBpbnRvIGEgZGF0ZSB1c2luZ1xuICogdGhlIGNvbmZpZ3VyZWQgZGFpbHkgbm90ZSBuYW1pbmcgc2V0dGluZ3MuXG4gKi9cbmV4cG9ydCBjb25zdCBmaWxlSXNEYWlseU5vdGUgPSAoXG4gIGZpbGU6IFRGaWxlLFxuICB2YXVsdDogVmF1bHRJbnRlcm1lZGlhdGUsXG4pOiBib29sZWFuID0+IHZhdWx0LmZpbmRNb21lbnRGb3JEYWlseU5vdGUoZmlsZSkgIT09IHVuZGVmaW5lZDtcblxuZXhwb3J0IGNvbnN0IGdldEJsb2NrSURJbmRleCA9IChsaW5lczogc3RyaW5nW10sIGJsb2NrSUQ6IHN0cmluZyk6IG51bWJlciA9PiB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAobGluZXNbaV0uaW5kZXhPZihibG9ja0lEKSA+IC0xKSB7XG4gICAgICByZXR1cm4gaTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEhlYWRlckRlcHRoID0gKGxpbmU6IHN0cmluZyk6IG51bWJlciA9PiB7XG4gIGNvbnN0IHRyaW1tZWRMaW5lID0gbGluZS50cmltU3RhcnQoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0cmltbWVkTGluZS5sZW5ndGg7IGkrKykge1xuICAgIGlmICh0cmltbWVkTGluZVtpXSA9PT0gJyMnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gaTtcbiAgfVxuXG4gIHJldHVybiB0cmltbWVkTGluZS5sZW5ndGg7XG59O1xuIiwiLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFdlZWtkYXlcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgdmFyIEFMTF9XRUVLREFZUyA9IFsnTU8nLCAnVFUnLCAnV0UnLCAnVEgnLCAnRlInLCAnU0EnLCAnU1UnXTtcbnZhciBXZWVrZGF5ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFdlZWtkYXkod2Vla2RheSwgbikge1xuICAgICAgICBpZiAobiA9PT0gMClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGNyZWF0ZSB3ZWVrZGF5IHdpdGggbiA9PSAwXCIpO1xuICAgICAgICB0aGlzLndlZWtkYXkgPSB3ZWVrZGF5O1xuICAgICAgICB0aGlzLm4gPSBuO1xuICAgIH1cbiAgICBXZWVrZGF5LmZyb21TdHIgPSBmdW5jdGlvbiAoc3RyKSB7XG4gICAgICAgIHJldHVybiBuZXcgV2Vla2RheShBTExfV0VFS0RBWVMuaW5kZXhPZihzdHIpKTtcbiAgICB9O1xuICAgIC8vIF9fY2FsbF9fIC0gQ2Fubm90IGNhbGwgdGhlIG9iamVjdCBkaXJlY3RseSwgZG8gaXQgdGhyb3VnaFxuICAgIC8vIGUuZy4gUlJ1bGUuVEgubnRoKC0xKSBpbnN0ZWFkLFxuICAgIFdlZWtkYXkucHJvdG90eXBlLm50aCA9IGZ1bmN0aW9uIChuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm4gPT09IG4gPyB0aGlzIDogbmV3IFdlZWtkYXkodGhpcy53ZWVrZGF5LCBuKTtcbiAgICB9O1xuICAgIC8vIF9fZXFfX1xuICAgIFdlZWtkYXkucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIChvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcy53ZWVrZGF5ID09PSBvdGhlci53ZWVrZGF5ICYmIHRoaXMubiA9PT0gb3RoZXIubjtcbiAgICB9O1xuICAgIC8vIF9fcmVwcl9fXG4gICAgV2Vla2RheS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzID0gQUxMX1dFRUtEQVlTW3RoaXMud2Vla2RheV07XG4gICAgICAgIGlmICh0aGlzLm4pXG4gICAgICAgICAgICBzID0gKHRoaXMubiA+IDAgPyAnKycgOiAnJykgKyBTdHJpbmcodGhpcy5uKSArIHM7XG4gICAgICAgIHJldHVybiBzO1xuICAgIH07XG4gICAgV2Vla2RheS5wcm90b3R5cGUuZ2V0SnNXZWVrZGF5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy53ZWVrZGF5ID09PSA2ID8gMCA6IHRoaXMud2Vla2RheSArIDE7XG4gICAgfTtcbiAgICByZXR1cm4gV2Vla2RheTtcbn0oKSk7XG5leHBvcnQgeyBXZWVrZGF5IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD13ZWVrZGF5LmpzLm1hcCIsIi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBIZWxwZXIgZnVuY3Rpb25zXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuaW1wb3J0IHsgQUxMX1dFRUtEQVlTIH0gZnJvbSAnLi93ZWVrZGF5JztcbmV4cG9ydCB2YXIgaXNQcmVzZW50ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQ7XG59O1xuZXhwb3J0IHZhciBpc051bWJlciA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInO1xufTtcbmV4cG9ydCB2YXIgaXNXZWVrZGF5U3RyID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgcmV0dXJuIEFMTF9XRUVLREFZUy5pbmRleE9mKHZhbHVlKSA+PSAwO1xufTtcbmV4cG9ydCB2YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG4vKipcbiAqIFNpbXBsaWZpZWQgdmVyc2lvbiBvZiBweXRob24ncyByYW5nZSgpXG4gKi9cbmV4cG9ydCB2YXIgcmFuZ2UgPSBmdW5jdGlvbiAoc3RhcnQsIGVuZCkge1xuICAgIGlmIChlbmQgPT09IHZvaWQgMCkgeyBlbmQgPSBzdGFydDsgfVxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGVuZCA9IHN0YXJ0O1xuICAgICAgICBzdGFydCA9IDA7XG4gICAgfVxuICAgIHZhciByYW5nID0gW107XG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspXG4gICAgICAgIHJhbmcucHVzaChpKTtcbiAgICByZXR1cm4gcmFuZztcbn07XG5leHBvcnQgdmFyIGNsb25lID0gZnVuY3Rpb24gKGFycmF5KSB7XG4gICAgcmV0dXJuIFtdLmNvbmNhdChhcnJheSk7XG59O1xuZXhwb3J0IHZhciByZXBlYXQgPSBmdW5jdGlvbiAodmFsdWUsIHRpbWVzKSB7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBhcnJheSA9IFtdO1xuICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBmb3IgKDsgaSA8IHRpbWVzOyBpKyspXG4gICAgICAgICAgICBhcnJheVtpXSA9IFtdLmNvbmNhdCh2YWx1ZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBmb3IgKDsgaSA8IHRpbWVzOyBpKyspXG4gICAgICAgICAgICBhcnJheVtpXSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG59O1xuZXhwb3J0IHZhciB0b0FycmF5ID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICBpZiAoaXNBcnJheShpdGVtKSkge1xuICAgICAgICByZXR1cm4gaXRlbTtcbiAgICB9XG4gICAgcmV0dXJuIFtpdGVtXTtcbn07XG5leHBvcnQgZnVuY3Rpb24gcGFkU3RhcnQoaXRlbSwgdGFyZ2V0TGVuZ3RoLCBwYWRTdHJpbmcpIHtcbiAgICBpZiAocGFkU3RyaW5nID09PSB2b2lkIDApIHsgcGFkU3RyaW5nID0gJyAnOyB9XG4gICAgdmFyIHN0ciA9IFN0cmluZyhpdGVtKTtcbiAgICB0YXJnZXRMZW5ndGggPSB0YXJnZXRMZW5ndGggPj4gMDtcbiAgICBpZiAoc3RyLmxlbmd0aCA+IHRhcmdldExlbmd0aCkge1xuICAgICAgICByZXR1cm4gU3RyaW5nKHN0cik7XG4gICAgfVxuICAgIHRhcmdldExlbmd0aCA9IHRhcmdldExlbmd0aCAtIHN0ci5sZW5ndGg7XG4gICAgaWYgKHRhcmdldExlbmd0aCA+IHBhZFN0cmluZy5sZW5ndGgpIHtcbiAgICAgICAgcGFkU3RyaW5nICs9IHJlcGVhdChwYWRTdHJpbmcsIHRhcmdldExlbmd0aCAvIHBhZFN0cmluZy5sZW5ndGgpO1xuICAgIH1cbiAgICByZXR1cm4gcGFkU3RyaW5nLnNsaWNlKDAsIHRhcmdldExlbmd0aCkgKyBTdHJpbmcoc3RyKTtcbn1cbi8qKlxuICogUHl0aG9uIGxpa2Ugc3BsaXRcbiAqL1xuZXhwb3J0IHZhciBzcGxpdCA9IGZ1bmN0aW9uIChzdHIsIHNlcCwgbnVtKSB7XG4gICAgdmFyIHNwbGl0cyA9IHN0ci5zcGxpdChzZXApO1xuICAgIHJldHVybiBudW1cbiAgICAgICAgPyBzcGxpdHMuc2xpY2UoMCwgbnVtKS5jb25jYXQoW3NwbGl0cy5zbGljZShudW0pLmpvaW4oc2VwKV0pXG4gICAgICAgIDogc3BsaXRzO1xufTtcbi8qKlxuICogY2xvc3VyZS9nb29nL21hdGgvbWF0aC5qczptb2R1bG9cbiAqIENvcHlyaWdodCAyMDA2IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy5cbiAqIFRoZSAlIG9wZXJhdG9yIGluIEphdmFTY3JpcHQgcmV0dXJucyB0aGUgcmVtYWluZGVyIG9mIGEgLyBiLCBidXQgZGlmZmVycyBmcm9tXG4gKiBzb21lIG90aGVyIGxhbmd1YWdlcyBpbiB0aGF0IHRoZSByZXN1bHQgd2lsbCBoYXZlIHRoZSBzYW1lIHNpZ24gYXMgdGhlXG4gKiBkaXZpZGVuZC4gRm9yIGV4YW1wbGUsIC0xICUgOCA9PSAtMSwgd2hlcmVhcyBpbiBzb21lIG90aGVyIGxhbmd1YWdlc1xuICogKHN1Y2ggYXMgUHl0aG9uKSB0aGUgcmVzdWx0IHdvdWxkIGJlIDcuIFRoaXMgZnVuY3Rpb24gZW11bGF0ZXMgdGhlIG1vcmVcbiAqIGNvcnJlY3QgbW9kdWxvIGJlaGF2aW9yLCB3aGljaCBpcyB1c2VmdWwgZm9yIGNlcnRhaW4gYXBwbGljYXRpb25zIHN1Y2ggYXNcbiAqIGNhbGN1bGF0aW5nIGFuIG9mZnNldCBpbmRleCBpbiBhIGNpcmN1bGFyIGxpc3QuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGEgVGhlIGRpdmlkZW5kLlxuICogQHBhcmFtIHtudW1iZXJ9IGIgVGhlIGRpdmlzb3IuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IGEgJSBiIHdoZXJlIHRoZSByZXN1bHQgaXMgYmV0d2VlbiAwIGFuZCBiIChlaXRoZXIgMCA8PSB4IDwgYlxuICogICAgIG9yIGIgPCB4IDw9IDAsIGRlcGVuZGluZyBvbiB0aGUgc2lnbiBvZiBiKS5cbiAqL1xuZXhwb3J0IHZhciBweW1vZCA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgdmFyIHIgPSBhICUgYjtcbiAgICAvLyBJZiByIGFuZCBiIGRpZmZlciBpbiBzaWduLCBhZGQgYiB0byB3cmFwIHRoZSByZXN1bHQgdG8gdGhlIGNvcnJlY3Qgc2lnbi5cbiAgICByZXR1cm4gciAqIGIgPCAwID8gciArIGIgOiByO1xufTtcbi8qKlxuICogQHNlZTogPGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvbGlicmFyeS9mdW5jdGlvbnMuaHRtbCNkaXZtb2Q+XG4gKi9cbmV4cG9ydCB2YXIgZGl2bW9kID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4geyBkaXY6IE1hdGguZmxvb3IoYSAvIGIpLCBtb2Q6IHB5bW9kKGEsIGIpIH07XG59O1xuZXhwb3J0IHZhciBlbXB0eSA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICByZXR1cm4gIWlzUHJlc2VudChvYmopIHx8IG9iai5sZW5ndGggPT09IDA7XG59O1xuLyoqXG4gKiBQeXRob24tbGlrZSBib29sZWFuXG4gKiBAcmV0dXJuIHtCb29sZWFufSB2YWx1ZSBvZiBhbiBvYmplY3QvcHJpbWl0aXZlLCB0YWtpbmcgaW50byBhY2NvdW50XG4gKiB0aGUgZmFjdCB0aGF0IGluIFB5dGhvbiBhbiBlbXB0eSBsaXN0J3MvdHVwbGUnc1xuICogYm9vbGVhbiB2YWx1ZSBpcyBGYWxzZSwgd2hlcmVhcyBpbiBKUyBpdCdzIHRydWVcbiAqL1xuZXhwb3J0IHZhciBub3RFbXB0eSA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICByZXR1cm4gIWVtcHR5KG9iaik7XG59O1xuLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiBhIHZhbHVlIGlzIGluIGFuIGFycmF5XG4gKi9cbmV4cG9ydCB2YXIgaW5jbHVkZXMgPSBmdW5jdGlvbiAoYXJyLCB2YWwpIHtcbiAgICByZXR1cm4gbm90RW1wdHkoYXJyKSAmJiBhcnIuaW5kZXhPZih2YWwpICE9PSAtMTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1oZWxwZXJzLmpzLm1hcCIsImltcG9ydCB7IHBhZFN0YXJ0IH0gZnJvbSAnLi9oZWxwZXJzJztcbi8qKlxuICogR2VuZXJhbCBkYXRlLXJlbGF0ZWQgdXRpbGl0aWVzLlxuICogQWxzbyBoYW5kbGVzIHNldmVyYWwgaW5jb21wYXRpYmlsaXRpZXMgYmV0d2VlbiBKYXZhU2NyaXB0IGFuZCBQeXRob25cbiAqXG4gKi9cbmV4cG9ydCB2YXIgZGF0ZXV0aWw7XG4oZnVuY3Rpb24gKGRhdGV1dGlsKSB7XG4gICAgZGF0ZXV0aWwuTU9OVEhfREFZUyA9IFszMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXTtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9mIG9uZSBkYXlcbiAgICAgKi9cbiAgICBkYXRldXRpbC5PTkVfREFZID0gMTAwMCAqIDYwICogNjAgKiAyNDtcbiAgICAvKipcbiAgICAgKiBAc2VlOiA8aHR0cDovL2RvY3MucHl0aG9uLm9yZy9saWJyYXJ5L2RhdGV0aW1lLmh0bWwjZGF0ZXRpbWUuTUFYWUVBUj5cbiAgICAgKi9cbiAgICBkYXRldXRpbC5NQVhZRUFSID0gOTk5OTtcbiAgICAvKipcbiAgICAgKiBQeXRob24gdXNlcyAxLUphbi0xIGFzIHRoZSBiYXNlIGZvciBjYWxjdWxhdGluZyBvcmRpbmFscyBidXQgd2UgZG9uJ3RcbiAgICAgKiB3YW50IHRvIGNvbmZ1c2UgdGhlIEpTIGVuZ2luZSB3aXRoIG1pbGxpc2Vjb25kcyA+IE51bWJlci5NQVhfTlVNQkVSLFxuICAgICAqIHRoZXJlZm9yZSB3ZSB1c2UgMS1KYW4tMTk3MCBpbnN0ZWFkXG4gICAgICovXG4gICAgZGF0ZXV0aWwuT1JESU5BTF9CQVNFID0gbmV3IERhdGUoRGF0ZS5VVEMoMTk3MCwgMCwgMSkpO1xuICAgIC8qKlxuICAgICAqIFB5dGhvbjogTU8tU1U6IDAgLSA2XG4gICAgICogSlM6IFNVLVNBVCAwIC0gNlxuICAgICAqL1xuICAgIGRhdGV1dGlsLlBZX1dFRUtEQVlTID0gWzYsIDAsIDEsIDIsIDMsIDQsIDVdO1xuICAgIC8qKlxuICAgICAqIHB5X2RhdGUudGltZXR1cGxlKClbN11cbiAgICAgKi9cbiAgICBkYXRldXRpbC5nZXRZZWFyRGF5ID0gZnVuY3Rpb24gKGRhdGUpIHtcbiAgICAgICAgdmFyIGRhdGVOb1RpbWUgPSBuZXcgRGF0ZShkYXRlLmdldFVUQ0Z1bGxZZWFyKCksIGRhdGUuZ2V0VVRDTW9udGgoKSwgZGF0ZS5nZXRVVENEYXRlKCkpO1xuICAgICAgICByZXR1cm4gKE1hdGguY2VpbCgoZGF0ZU5vVGltZS52YWx1ZU9mKCkgLVxuICAgICAgICAgICAgbmV3IERhdGUoZGF0ZS5nZXRVVENGdWxsWWVhcigpLCAwLCAxKS52YWx1ZU9mKCkpIC9cbiAgICAgICAgICAgIGRhdGV1dGlsLk9ORV9EQVkpICsgMSk7XG4gICAgfTtcbiAgICBkYXRldXRpbC5pc0xlYXBZZWFyID0gZnVuY3Rpb24gKHllYXIpIHtcbiAgICAgICAgcmV0dXJuICh5ZWFyICUgNCA9PT0gMCAmJiB5ZWFyICUgMTAwICE9PSAwKSB8fCB5ZWFyICUgNDAwID09PSAwO1xuICAgIH07XG4gICAgZGF0ZXV0aWwuaXNEYXRlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIERhdGU7XG4gICAgfTtcbiAgICBkYXRldXRpbC5pc1ZhbGlkRGF0ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZGF0ZXV0aWwuaXNEYXRlKHZhbHVlKSAmJiAhaXNOYU4odmFsdWUuZ2V0VGltZSgpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn0gdGhlIGRhdGUncyB0aW1lem9uZSBvZmZzZXQgaW4gbXNcbiAgICAgKi9cbiAgICBkYXRldXRpbC50ek9mZnNldCA9IGZ1bmN0aW9uIChkYXRlKSB7XG4gICAgICAgIHJldHVybiBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCkgKiA2MCAqIDEwMDA7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAc2VlOiA8aHR0cDovL3d3dy5tY2ZlZHJpZXMuY29tL0phdmFTY3JpcHQvRGF5c0JldHdlZW4uYXNwPlxuICAgICAqL1xuICAgIGRhdGV1dGlsLmRheXNCZXR3ZWVuID0gZnVuY3Rpb24gKGRhdGUxLCBkYXRlMikge1xuICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpbiBvbmUgZGF5XG4gICAgICAgIC8vIENvbnZlcnQgYm90aCBkYXRlcyB0byBtaWxsaXNlY29uZHNcbiAgICAgICAgdmFyIGRhdGUxbXMgPSBkYXRlMS5nZXRUaW1lKCkgLSBkYXRldXRpbC50ek9mZnNldChkYXRlMSk7XG4gICAgICAgIHZhciBkYXRlMm1zID0gZGF0ZTIuZ2V0VGltZSgpIC0gZGF0ZXV0aWwudHpPZmZzZXQoZGF0ZTIpO1xuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGRpZmZlcmVuY2UgaW4gbWlsbGlzZWNvbmRzXG4gICAgICAgIHZhciBkaWZmZXJlbmNlbXMgPSBkYXRlMW1zIC0gZGF0ZTJtcztcbiAgICAgICAgLy8gQ29udmVydCBiYWNrIHRvIGRheXMgYW5kIHJldHVyblxuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChkaWZmZXJlbmNlbXMgLyBkYXRldXRpbC5PTkVfREFZKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBzZWU6IDxodHRwOi8vZG9jcy5weXRob24ub3JnL2xpYnJhcnkvZGF0ZXRpbWUuaHRtbCNkYXRldGltZS5kYXRlLnRvb3JkaW5hbD5cbiAgICAgKi9cbiAgICBkYXRldXRpbC50b09yZGluYWwgPSBmdW5jdGlvbiAoZGF0ZSkge1xuICAgICAgICByZXR1cm4gZGF0ZXV0aWwuZGF5c0JldHdlZW4oZGF0ZSwgZGF0ZXV0aWwuT1JESU5BTF9CQVNFKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBzZWUgLSA8aHR0cDovL2RvY3MucHl0aG9uLm9yZy9saWJyYXJ5L2RhdGV0aW1lLmh0bWwjZGF0ZXRpbWUuZGF0ZS5mcm9tb3JkaW5hbD5cbiAgICAgKi9cbiAgICBkYXRldXRpbC5mcm9tT3JkaW5hbCA9IGZ1bmN0aW9uIChvcmRpbmFsKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZShkYXRldXRpbC5PUkRJTkFMX0JBU0UuZ2V0VGltZSgpICsgb3JkaW5hbCAqIGRhdGV1dGlsLk9ORV9EQVkpO1xuICAgIH07XG4gICAgZGF0ZXV0aWwuZ2V0TW9udGhEYXlzID0gZnVuY3Rpb24gKGRhdGUpIHtcbiAgICAgICAgdmFyIG1vbnRoID0gZGF0ZS5nZXRVVENNb250aCgpO1xuICAgICAgICByZXR1cm4gbW9udGggPT09IDEgJiYgZGF0ZXV0aWwuaXNMZWFwWWVhcihkYXRlLmdldFVUQ0Z1bGxZZWFyKCkpXG4gICAgICAgICAgICA/IDI5XG4gICAgICAgICAgICA6IGRhdGV1dGlsLk1PTlRIX0RBWVNbbW9udGhdO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfSBweXRob24tbGlrZSB3ZWVrZGF5XG4gICAgICovXG4gICAgZGF0ZXV0aWwuZ2V0V2Vla2RheSA9IGZ1bmN0aW9uIChkYXRlKSB7XG4gICAgICAgIHJldHVybiBkYXRldXRpbC5QWV9XRUVLREFZU1tkYXRlLmdldFVUQ0RheSgpXTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBzZWU6IDxodHRwOi8vZG9jcy5weXRob24ub3JnL2xpYnJhcnkvY2FsZW5kYXIuaHRtbCNjYWxlbmRhci5tb250aHJhbmdlPlxuICAgICAqL1xuICAgIGRhdGV1dGlsLm1vbnRoUmFuZ2UgPSBmdW5jdGlvbiAoeWVhciwgbW9udGgpIHtcbiAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZShEYXRlLlVUQyh5ZWFyLCBtb250aCwgMSkpO1xuICAgICAgICByZXR1cm4gW2RhdGV1dGlsLmdldFdlZWtkYXkoZGF0ZSksIGRhdGV1dGlsLmdldE1vbnRoRGF5cyhkYXRlKV07XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAc2VlOiA8aHR0cDovL2RvY3MucHl0aG9uLm9yZy9saWJyYXJ5L2RhdGV0aW1lLmh0bWwjZGF0ZXRpbWUuZGF0ZXRpbWUuY29tYmluZT5cbiAgICAgKi9cbiAgICBkYXRldXRpbC5jb21iaW5lID0gZnVuY3Rpb24gKGRhdGUsIHRpbWUpIHtcbiAgICAgICAgdGltZSA9IHRpbWUgfHwgZGF0ZTtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKGRhdGUuZ2V0VVRDRnVsbFllYXIoKSwgZGF0ZS5nZXRVVENNb250aCgpLCBkYXRlLmdldFVUQ0RhdGUoKSwgdGltZS5nZXRIb3VycygpLCB0aW1lLmdldE1pbnV0ZXMoKSwgdGltZS5nZXRTZWNvbmRzKCksIHRpbWUuZ2V0TWlsbGlzZWNvbmRzKCkpKTtcbiAgICB9O1xuICAgIGRhdGV1dGlsLmNsb25lID0gZnVuY3Rpb24gKGRhdGUpIHtcbiAgICAgICAgdmFyIGRvbGx5ID0gbmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkpO1xuICAgICAgICByZXR1cm4gZG9sbHk7XG4gICAgfTtcbiAgICBkYXRldXRpbC5jbG9uZURhdGVzID0gZnVuY3Rpb24gKGRhdGVzKSB7XG4gICAgICAgIHZhciBjbG9uZXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY2xvbmVzLnB1c2goZGF0ZXV0aWwuY2xvbmUoZGF0ZXNbaV0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2xvbmVzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU29ydHMgYW4gYXJyYXkgb2YgRGF0ZSBvciBkYXRldXRpbC5UaW1lIG9iamVjdHNcbiAgICAgKi9cbiAgICBkYXRldXRpbC5zb3J0ID0gZnVuY3Rpb24gKGRhdGVzKSB7XG4gICAgICAgIGRhdGVzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgIHJldHVybiBhLmdldFRpbWUoKSAtIGIuZ2V0VGltZSgpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGRhdGV1dGlsLnRpbWVUb1VudGlsU3RyaW5nID0gZnVuY3Rpb24gKHRpbWUsIHV0Yykge1xuICAgICAgICBpZiAodXRjID09PSB2b2lkIDApIHsgdXRjID0gdHJ1ZTsgfVxuICAgICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHRpbWUpO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgcGFkU3RhcnQoZGF0ZS5nZXRVVENGdWxsWWVhcigpLnRvU3RyaW5nKCksIDQsICcwJyksXG4gICAgICAgICAgICBwYWRTdGFydChkYXRlLmdldFVUQ01vbnRoKCkgKyAxLCAyLCAnMCcpLFxuICAgICAgICAgICAgcGFkU3RhcnQoZGF0ZS5nZXRVVENEYXRlKCksIDIsICcwJyksXG4gICAgICAgICAgICAnVCcsXG4gICAgICAgICAgICBwYWRTdGFydChkYXRlLmdldFVUQ0hvdXJzKCksIDIsICcwJyksXG4gICAgICAgICAgICBwYWRTdGFydChkYXRlLmdldFVUQ01pbnV0ZXMoKSwgMiwgJzAnKSxcbiAgICAgICAgICAgIHBhZFN0YXJ0KGRhdGUuZ2V0VVRDU2Vjb25kcygpLCAyLCAnMCcpLFxuICAgICAgICAgICAgdXRjID8gJ1onIDogJydcbiAgICAgICAgXS5qb2luKCcnKTtcbiAgICB9O1xuICAgIGRhdGV1dGlsLnVudGlsU3RyaW5nVG9EYXRlID0gZnVuY3Rpb24gKHVudGlsKSB7XG4gICAgICAgIHZhciByZSA9IC9eKFxcZHs0fSkoXFxkezJ9KShcXGR7Mn0pKFQoXFxkezJ9KShcXGR7Mn0pKFxcZHsyfSlaPyk/JC87XG4gICAgICAgIHZhciBiaXRzID0gcmUuZXhlYyh1bnRpbCk7XG4gICAgICAgIGlmICghYml0cylcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgVU5USUwgdmFsdWU6IFwiICsgdW50aWwpO1xuICAgICAgICByZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMocGFyc2VJbnQoYml0c1sxXSwgMTApLCBwYXJzZUludChiaXRzWzJdLCAxMCkgLSAxLCBwYXJzZUludChiaXRzWzNdLCAxMCksIHBhcnNlSW50KGJpdHNbNV0sIDEwKSB8fCAwLCBwYXJzZUludChiaXRzWzZdLCAxMCkgfHwgMCwgcGFyc2VJbnQoYml0c1s3XSwgMTApIHx8IDApKTtcbiAgICB9O1xufSkoZGF0ZXV0aWwgfHwgKGRhdGV1dGlsID0ge30pKTtcbmV4cG9ydCBkZWZhdWx0IGRhdGV1dGlsO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0ZXV0aWwuanMubWFwIiwiLyoqXG4gKiBUaGlzIGNsYXNzIGhlbHBzIHVzIHRvIGVtdWxhdGUgcHl0aG9uJ3MgZ2VuZXJhdG9ycywgc29ydGEuXG4gKi9cbnZhciBJdGVyUmVzdWx0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEl0ZXJSZXN1bHQobWV0aG9kLCBhcmdzKSB7XG4gICAgICAgIHRoaXMubWluRGF0ZSA9IG51bGw7XG4gICAgICAgIHRoaXMubWF4RGF0ZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX3Jlc3VsdCA9IFtdO1xuICAgICAgICB0aGlzLnRvdGFsID0gMDtcbiAgICAgICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7XG4gICAgICAgIHRoaXMuYXJncyA9IGFyZ3M7XG4gICAgICAgIGlmIChtZXRob2QgPT09ICdiZXR3ZWVuJykge1xuICAgICAgICAgICAgdGhpcy5tYXhEYXRlID0gYXJncy5pbmNcbiAgICAgICAgICAgICAgICA/IGFyZ3MuYmVmb3JlXG4gICAgICAgICAgICAgICAgOiBuZXcgRGF0ZShhcmdzLmJlZm9yZS5nZXRUaW1lKCkgLSAxKTtcbiAgICAgICAgICAgIHRoaXMubWluRGF0ZSA9IGFyZ3MuaW5jID8gYXJncy5hZnRlciA6IG5ldyBEYXRlKGFyZ3MuYWZ0ZXIuZ2V0VGltZSgpICsgMSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobWV0aG9kID09PSAnYmVmb3JlJykge1xuICAgICAgICAgICAgdGhpcy5tYXhEYXRlID0gYXJncy5pbmMgPyBhcmdzLmR0IDogbmV3IERhdGUoYXJncy5kdC5nZXRUaW1lKCkgLSAxKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXRob2QgPT09ICdhZnRlcicpIHtcbiAgICAgICAgICAgIHRoaXMubWluRGF0ZSA9IGFyZ3MuaW5jID8gYXJncy5kdCA6IG5ldyBEYXRlKGFyZ3MuZHQuZ2V0VGltZSgpICsgMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUG9zc2libHkgYWRkcyBhIGRhdGUgaW50byB0aGUgcmVzdWx0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtEYXRlfSBkYXRlIC0gdGhlIGRhdGUgaXNuJ3QgbmVjZXNzYXJseSBhZGRlZCB0byB0aGUgcmVzdWx0XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgbGlzdCAoaWYgaXQgaXMgdG9vIGxhdGUvdG9vIGVhcmx5KVxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgaXQgbWFrZXMgc2Vuc2UgdG8gY29udGludWUgdGhlIGl0ZXJhdGlvblxuICAgICAqICAgICAgICAgICAgICAgICAgIGZhbHNlIGlmIHdlJ3JlIGRvbmUuXG4gICAgICovXG4gICAgSXRlclJlc3VsdC5wcm90b3R5cGUuYWNjZXB0ID0gZnVuY3Rpb24gKGRhdGUpIHtcbiAgICAgICAgKyt0aGlzLnRvdGFsO1xuICAgICAgICB2YXIgdG9vRWFybHkgPSB0aGlzLm1pbkRhdGUgJiYgZGF0ZSA8IHRoaXMubWluRGF0ZTtcbiAgICAgICAgdmFyIHRvb0xhdGUgPSB0aGlzLm1heERhdGUgJiYgZGF0ZSA+IHRoaXMubWF4RGF0ZTtcbiAgICAgICAgaWYgKHRoaXMubWV0aG9kID09PSAnYmV0d2VlbicpIHtcbiAgICAgICAgICAgIGlmICh0b29FYXJseSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0b29MYXRlKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLm1ldGhvZCA9PT0gJ2JlZm9yZScpIHtcbiAgICAgICAgICAgIGlmICh0b29MYXRlKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLm1ldGhvZCA9PT0gJ2FmdGVyJykge1xuICAgICAgICAgICAgaWYgKHRvb0Vhcmx5KVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgdGhpcy5hZGQoZGF0ZSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkKGRhdGUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0RhdGV9IGRhdGUgdGhhdCBpcyBwYXJ0IG9mIHRoZSByZXN1bHQuXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gd2hldGhlciB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBtb3JlIHZhbHVlcy5cbiAgICAgKi9cbiAgICBJdGVyUmVzdWx0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAoZGF0ZSkge1xuICAgICAgICB0aGlzLl9yZXN1bHQucHVzaChkYXRlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiAnYmVmb3JlJyBhbmQgJ2FmdGVyJyByZXR1cm4gb25seSBvbmUgZGF0ZSwgd2hlcmVhcyAnYWxsJ1xuICAgICAqIGFuZCAnYmV0d2VlbicgYW4gYXJyYXkuXG4gICAgICogQHJldHVybiB7RGF0ZSxBcnJheT99XG4gICAgICovXG4gICAgSXRlclJlc3VsdC5wcm90b3R5cGUuZ2V0VmFsdWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciByZXMgPSB0aGlzLl9yZXN1bHQ7XG4gICAgICAgIHN3aXRjaCAodGhpcy5tZXRob2QpIHtcbiAgICAgICAgICAgIGNhc2UgJ2FsbCc6XG4gICAgICAgICAgICBjYXNlICdiZXR3ZWVuJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgICAgY2FzZSAnYmVmb3JlJzpcbiAgICAgICAgICAgIGNhc2UgJ2FmdGVyJzpcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChyZXMubGVuZ3RoID8gcmVzW3Jlcy5sZW5ndGggLSAxXSA6IG51bGwpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBJdGVyUmVzdWx0LnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJdGVyUmVzdWx0KHRoaXMubWV0aG9kLCB0aGlzLmFyZ3MpO1xuICAgIH07XG4gICAgcmV0dXJuIEl0ZXJSZXN1bHQ7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgSXRlclJlc3VsdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWl0ZXJyZXN1bHQuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgSXRlclJlc3VsdCBmcm9tICcuL2l0ZXJyZXN1bHQnO1xuLyoqXG4gKiBJdGVyUmVzdWx0IHN1YmNsYXNzIHRoYXQgY2FsbHMgYSBjYWxsYmFjayBmdW5jdGlvbiBvbiBlYWNoIGFkZCxcbiAqIGFuZCBzdG9wcyBpdGVyYXRpbmcgd2hlbiB0aGUgY2FsbGJhY2sgcmV0dXJucyBmYWxzZS5cbiAqL1xudmFyIENhbGxiYWNrSXRlclJlc3VsdCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQ2FsbGJhY2tJdGVyUmVzdWx0LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIENhbGxiYWNrSXRlclJlc3VsdChtZXRob2QsIGFyZ3MsIGl0ZXJhdG9yKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1ldGhvZCwgYXJncykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBDYWxsYmFja0l0ZXJSZXN1bHQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChkYXRlKSB7XG4gICAgICAgIGlmICh0aGlzLml0ZXJhdG9yKGRhdGUsIHRoaXMuX3Jlc3VsdC5sZW5ndGgpKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXN1bHQucHVzaChkYXRlKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIHJldHVybiBDYWxsYmFja0l0ZXJSZXN1bHQ7XG59KEl0ZXJSZXN1bHQpKTtcbmV4cG9ydCBkZWZhdWx0IENhbGxiYWNrSXRlclJlc3VsdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNhbGxiYWNraXRlcnJlc3VsdC5qcy5tYXAiLCIvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gaTE4blxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbnZhciBFTkdMSVNIID0ge1xuICAgIGRheU5hbWVzOiBbXG4gICAgICAgICdTdW5kYXknLCAnTW9uZGF5JywgJ1R1ZXNkYXknLCAnV2VkbmVzZGF5JyxcbiAgICAgICAgJ1RodXJzZGF5JywgJ0ZyaWRheScsICdTYXR1cmRheSdcbiAgICBdLFxuICAgIG1vbnRoTmFtZXM6IFtcbiAgICAgICAgJ0phbnVhcnknLCAnRmVicnVhcnknLCAnTWFyY2gnLCAnQXByaWwnLCAnTWF5JyxcbiAgICAgICAgJ0p1bmUnLCAnSnVseScsICdBdWd1c3QnLCAnU2VwdGVtYmVyJywgJ09jdG9iZXInLFxuICAgICAgICAnTm92ZW1iZXInLCAnRGVjZW1iZXInXG4gICAgXSxcbiAgICB0b2tlbnM6IHtcbiAgICAgICAgJ1NLSVAnOiAvXlsgXFxyXFxuXFx0XSt8XlxcLiQvLFxuICAgICAgICAnbnVtYmVyJzogL15bMS05XVswLTldKi8sXG4gICAgICAgICdudW1iZXJBc1RleHQnOiAvXihvbmV8dHdvfHRocmVlKS9pLFxuICAgICAgICAnZXZlcnknOiAvXmV2ZXJ5L2ksXG4gICAgICAgICdkYXkocyknOiAvXmRheXM/L2ksXG4gICAgICAgICd3ZWVrZGF5KHMpJzogL153ZWVrZGF5cz8vaSxcbiAgICAgICAgJ3dlZWsocyknOiAvXndlZWtzPy9pLFxuICAgICAgICAnaG91cihzKSc6IC9eaG91cnM/L2ksXG4gICAgICAgICdtaW51dGUocyknOiAvXm1pbnV0ZXM/L2ksXG4gICAgICAgICdtb250aChzKSc6IC9ebW9udGhzPy9pLFxuICAgICAgICAneWVhcihzKSc6IC9eeWVhcnM/L2ksXG4gICAgICAgICdvbic6IC9eKG9ufGluKS9pLFxuICAgICAgICAnYXQnOiAvXihhdCkvaSxcbiAgICAgICAgJ3RoZSc6IC9edGhlL2ksXG4gICAgICAgICdmaXJzdCc6IC9eZmlyc3QvaSxcbiAgICAgICAgJ3NlY29uZCc6IC9ec2Vjb25kL2ksXG4gICAgICAgICd0aGlyZCc6IC9edGhpcmQvaSxcbiAgICAgICAgJ250aCc6IC9eKFsxLTldWzAtOV0qKShcXC58dGh8bmR8cmR8c3QpL2ksXG4gICAgICAgICdsYXN0JzogL15sYXN0L2ksXG4gICAgICAgICdmb3InOiAvXmZvci9pLFxuICAgICAgICAndGltZShzKSc6IC9edGltZXM/L2ksXG4gICAgICAgICd1bnRpbCc6IC9eKHVuKT90aWwvaSxcbiAgICAgICAgJ21vbmRheSc6IC9ebW8obihkYXkpPyk/L2ksXG4gICAgICAgICd0dWVzZGF5JzogL150dShlKHMoZGF5KT8pPyk/L2ksXG4gICAgICAgICd3ZWRuZXNkYXknOiAvXndlKGQobihlc2RheSk/KT8pPy9pLFxuICAgICAgICAndGh1cnNkYXknOiAvXnRoKHUocihzZGF5KT8pPyk/L2ksXG4gICAgICAgICdmcmlkYXknOiAvXmZyKGkoZGF5KT8pPy9pLFxuICAgICAgICAnc2F0dXJkYXknOiAvXnNhKHQodXJkYXkpPyk/L2ksXG4gICAgICAgICdzdW5kYXknOiAvXnN1KG4oZGF5KT8pPy9pLFxuICAgICAgICAnamFudWFyeSc6IC9eamFuKHVhcnkpPy9pLFxuICAgICAgICAnZmVicnVhcnknOiAvXmZlYihydWFyeSk/L2ksXG4gICAgICAgICdtYXJjaCc6IC9ebWFyKGNoKT8vaSxcbiAgICAgICAgJ2FwcmlsJzogL15hcHIoaWwpPy9pLFxuICAgICAgICAnbWF5JzogL15tYXkvaSxcbiAgICAgICAgJ2p1bmUnOiAvXmp1bmU/L2ksXG4gICAgICAgICdqdWx5JzogL15qdWx5Py9pLFxuICAgICAgICAnYXVndXN0JzogL15hdWcodXN0KT8vaSxcbiAgICAgICAgJ3NlcHRlbWJlcic6IC9ec2VwKHQoZW1iZXIpPyk/L2ksXG4gICAgICAgICdvY3RvYmVyJzogL15vY3Qob2Jlcik/L2ksXG4gICAgICAgICdub3ZlbWJlcic6IC9ebm92KGVtYmVyKT8vaSxcbiAgICAgICAgJ2RlY2VtYmVyJzogL15kZWMoZW1iZXIpPy9pLFxuICAgICAgICAnY29tbWEnOiAvXigsXFxzKnwoYW5kfG9yKVxccyopKy9pXG4gICAgfVxufTtcbmV4cG9ydCBkZWZhdWx0IEVOR0xJU0g7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pMThuLmpzLm1hcCIsImltcG9ydCBFTkdMSVNIIGZyb20gJy4vaTE4bic7XG5pbXBvcnQgUlJ1bGUgZnJvbSAnLi4vaW5kZXgnO1xuaW1wb3J0IHsgaXNBcnJheSwgaXNOdW1iZXIsIGlzUHJlc2VudCB9IGZyb20gJy4uL2hlbHBlcnMnO1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEhlbHBlciBmdW5jdGlvbnNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vKipcbiAqIFJldHVybiB0cnVlIGlmIGEgdmFsdWUgaXMgaW4gYW4gYXJyYXlcbiAqL1xudmFyIGNvbnRhaW5zID0gZnVuY3Rpb24gKGFyciwgdmFsKSB7XG4gICAgcmV0dXJuIGFyci5pbmRleE9mKHZhbCkgIT09IC0xO1xufTtcbnZhciBkZWZhdWx0R2V0VGV4dCA9IGZ1bmN0aW9uIChpZCkgeyByZXR1cm4gaWQudG9TdHJpbmcoKTsgfTtcbnZhciBkZWZhdWx0RGF0ZUZvcm1hdHRlciA9IGZ1bmN0aW9uICh5ZWFyLCBtb250aCwgZGF5KSB7IHJldHVybiBtb250aCArIFwiIFwiICsgZGF5ICsgXCIsIFwiICsgeWVhcjsgfTtcbi8qKlxuICpcbiAqIEBwYXJhbSB7UlJ1bGV9IHJydWxlXG4gKiBPcHRpb25hbDpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGdldHRleHQgZnVuY3Rpb25cbiAqIEBwYXJhbSB7T2JqZWN0fSBsYW5ndWFnZSBkZWZpbml0aW9uXG4gKiBAY29uc3RydWN0b3JcbiAqL1xudmFyIFRvVGV4dCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUb1RleHQocnJ1bGUsIGdldHRleHQsIGxhbmd1YWdlLCBkYXRlRm9ybWF0dGVyKSB7XG4gICAgICAgIGlmIChnZXR0ZXh0ID09PSB2b2lkIDApIHsgZ2V0dGV4dCA9IGRlZmF1bHRHZXRUZXh0OyB9XG4gICAgICAgIGlmIChsYW5ndWFnZSA9PT0gdm9pZCAwKSB7IGxhbmd1YWdlID0gRU5HTElTSDsgfVxuICAgICAgICBpZiAoZGF0ZUZvcm1hdHRlciA9PT0gdm9pZCAwKSB7IGRhdGVGb3JtYXR0ZXIgPSBkZWZhdWx0RGF0ZUZvcm1hdHRlcjsgfVxuICAgICAgICB0aGlzLnRleHQgPSBbXTtcbiAgICAgICAgdGhpcy5sYW5ndWFnZSA9IGxhbmd1YWdlIHx8IEVOR0xJU0g7XG4gICAgICAgIHRoaXMuZ2V0dGV4dCA9IGdldHRleHQ7XG4gICAgICAgIHRoaXMuZGF0ZUZvcm1hdHRlciA9IGRhdGVGb3JtYXR0ZXI7XG4gICAgICAgIHRoaXMucnJ1bGUgPSBycnVsZTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gcnJ1bGUub3B0aW9ucztcbiAgICAgICAgdGhpcy5vcmlnT3B0aW9ucyA9IHJydWxlLm9yaWdPcHRpb25zO1xuICAgICAgICBpZiAodGhpcy5vcmlnT3B0aW9ucy5ieW1vbnRoZGF5KSB7XG4gICAgICAgICAgICB2YXIgYnltb250aGRheSA9IFtdLmNvbmNhdCh0aGlzLm9wdGlvbnMuYnltb250aGRheSk7XG4gICAgICAgICAgICB2YXIgYnlubW9udGhkYXkgPSBbXS5jb25jYXQodGhpcy5vcHRpb25zLmJ5bm1vbnRoZGF5KTtcbiAgICAgICAgICAgIGJ5bW9udGhkYXkuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSAtIGI7IH0pO1xuICAgICAgICAgICAgYnlubW9udGhkYXkuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYiAtIGE7IH0pO1xuICAgICAgICAgICAgLy8gMSwgMiwgMywgLi4sIC01LCAtNCwgLTMsIC4uXG4gICAgICAgICAgICB0aGlzLmJ5bW9udGhkYXkgPSBieW1vbnRoZGF5LmNvbmNhdChieW5tb250aGRheSk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuYnltb250aGRheS5sZW5ndGgpXG4gICAgICAgICAgICAgICAgdGhpcy5ieW1vbnRoZGF5ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNQcmVzZW50KHRoaXMub3JpZ09wdGlvbnMuYnl3ZWVrZGF5KSkge1xuICAgICAgICAgICAgdmFyIGJ5d2Vla2RheSA9ICFpc0FycmF5KHRoaXMub3JpZ09wdGlvbnMuYnl3ZWVrZGF5KVxuICAgICAgICAgICAgICAgID8gW3RoaXMub3JpZ09wdGlvbnMuYnl3ZWVrZGF5XVxuICAgICAgICAgICAgICAgIDogdGhpcy5vcmlnT3B0aW9ucy5ieXdlZWtkYXk7XG4gICAgICAgICAgICB2YXIgZGF5cyA9IFN0cmluZyhieXdlZWtkYXkpO1xuICAgICAgICAgICAgdGhpcy5ieXdlZWtkYXkgPSB7XG4gICAgICAgICAgICAgICAgYWxsV2Vla3M6IGJ5d2Vla2RheS5maWx0ZXIoZnVuY3Rpb24gKHdlZWtkYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICF3ZWVrZGF5Lm47XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgc29tZVdlZWtzOiBieXdlZWtkYXkuZmlsdGVyKGZ1bmN0aW9uICh3ZWVrZGF5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKHdlZWtkYXkubik7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgaXNXZWVrZGF5czogZGF5cy5pbmRleE9mKCdNTycpICE9PSAtMSAmJlxuICAgICAgICAgICAgICAgICAgICBkYXlzLmluZGV4T2YoJ1RVJykgIT09IC0xICYmXG4gICAgICAgICAgICAgICAgICAgIGRheXMuaW5kZXhPZignV0UnKSAhPT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgZGF5cy5pbmRleE9mKCdUSCcpICE9PSAtMSAmJlxuICAgICAgICAgICAgICAgICAgICBkYXlzLmluZGV4T2YoJ0ZSJykgIT09IC0xICYmXG4gICAgICAgICAgICAgICAgICAgIGRheXMuaW5kZXhPZignU0EnKSA9PT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgZGF5cy5pbmRleE9mKCdTVScpID09PSAtMSxcbiAgICAgICAgICAgICAgICBpc0V2ZXJ5RGF5OiBkYXlzLmluZGV4T2YoJ01PJykgIT09IC0xICYmXG4gICAgICAgICAgICAgICAgICAgIGRheXMuaW5kZXhPZignVFUnKSAhPT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgZGF5cy5pbmRleE9mKCdXRScpICE9PSAtMSAmJlxuICAgICAgICAgICAgICAgICAgICBkYXlzLmluZGV4T2YoJ1RIJykgIT09IC0xICYmXG4gICAgICAgICAgICAgICAgICAgIGRheXMuaW5kZXhPZignRlInKSAhPT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgZGF5cy5pbmRleE9mKCdTQScpICE9PSAtMSAmJlxuICAgICAgICAgICAgICAgICAgICBkYXlzLmluZGV4T2YoJ1NVJykgIT09IC0xXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFyIHNvcnRXZWVrRGF5cyA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEud2Vla2RheSAtIGIud2Vla2RheTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmJ5d2Vla2RheS5hbGxXZWVrcy5zb3J0KHNvcnRXZWVrRGF5cyk7XG4gICAgICAgICAgICB0aGlzLmJ5d2Vla2RheS5zb21lV2Vla3Muc29ydChzb3J0V2Vla0RheXMpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmJ5d2Vla2RheS5hbGxXZWVrcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgdGhpcy5ieXdlZWtkYXkuYWxsV2Vla3MgPSBudWxsO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmJ5d2Vla2RheS5zb21lV2Vla3MubGVuZ3RoKVxuICAgICAgICAgICAgICAgIHRoaXMuYnl3ZWVrZGF5LnNvbWVXZWVrcyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmJ5d2Vla2RheSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVGVzdCB3aGV0aGVyIHRoZSBycnVsZSBjYW4gYmUgZnVsbHkgY29udmVydGVkIHRvIHRleHQuXG4gICAgICogQHBhcmFtIHtSUnVsZX0gcnJ1bGVcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIFRvVGV4dC5pc0Z1bGx5Q29udmVydGlibGUgPSBmdW5jdGlvbiAocnJ1bGUpIHtcbiAgICAgICAgdmFyIGNhbkNvbnZlcnQgPSB0cnVlO1xuICAgICAgICBpZiAoIShycnVsZS5vcHRpb25zLmZyZXEgaW4gVG9UZXh0LklNUExFTUVOVEVEKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHJydWxlLm9yaWdPcHRpb25zLnVudGlsICYmIHJydWxlLm9yaWdPcHRpb25zLmNvdW50KVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gcnJ1bGUub3JpZ09wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmIChjb250YWlucyhbJ2R0c3RhcnQnLCAnd2tzdCcsICdmcmVxJ10sIGtleSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBpZiAoIWNvbnRhaW5zKFRvVGV4dC5JTVBMRU1FTlRFRFtycnVsZS5vcHRpb25zLmZyZXFdLCBrZXkpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FuQ29udmVydDtcbiAgICB9O1xuICAgIFRvVGV4dC5wcm90b3R5cGUuaXNGdWxseUNvbnZlcnRpYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gVG9UZXh0LmlzRnVsbHlDb252ZXJ0aWJsZSh0aGlzLnJydWxlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFBlcmZvcm0gdGhlIGNvbnZlcnNpb24uIE9ubHkgc29tZSBvZiB0aGUgZnJlcXVlbmNpZXMgYXJlIHN1cHBvcnRlZC5cbiAgICAgKiBJZiBzb21lIG9mIHRoZSBycnVsZSdzIG9wdGlvbnMgYXJlbid0IHN1cHBvcnRlZCwgdGhleSdsbFxuICAgICAqIGJlIG9taXR0ZWQgZnJvbSB0aGUgb3V0cHV0IGFuIFwiKH4gYXBwcm94aW1hdGUpXCIgd2lsbCBiZSBhcHBlbmRlZC5cbiAgICAgKiBAcmV0dXJuIHsqfVxuICAgICAqL1xuICAgIFRvVGV4dC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBnZXR0ZXh0ID0gdGhpcy5nZXR0ZXh0O1xuICAgICAgICBpZiAoISh0aGlzLm9wdGlvbnMuZnJlcSBpbiBUb1RleHQuSU1QTEVNRU5URUQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0dGV4dCgnUlJ1bGUgZXJyb3I6IFVuYWJsZSB0byBmdWxseSBjb252ZXJ0IHRoaXMgcnJ1bGUgdG8gdGV4dCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGV4dCA9IFtnZXR0ZXh0KCdldmVyeScpXTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aGlzW1JSdWxlLkZSRVFVRU5DSUVTW3RoaXMub3B0aW9ucy5mcmVxXV0oKTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy51bnRpbCkge1xuICAgICAgICAgICAgdGhpcy5hZGQoZ2V0dGV4dCgndW50aWwnKSk7XG4gICAgICAgICAgICB2YXIgdW50aWwgPSB0aGlzLm9wdGlvbnMudW50aWw7XG4gICAgICAgICAgICB0aGlzLmFkZCh0aGlzLmRhdGVGb3JtYXR0ZXIodW50aWwuZ2V0VVRDRnVsbFllYXIoKSwgdGhpcy5sYW5ndWFnZS5tb250aE5hbWVzW3VudGlsLmdldFVUQ01vbnRoKCldLCB1bnRpbC5nZXRVVENEYXRlKCkpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMuY291bnQpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkKGdldHRleHQoJ2ZvcicpKVxuICAgICAgICAgICAgICAgIC5hZGQodGhpcy5vcHRpb25zLmNvdW50LnRvU3RyaW5nKCkpXG4gICAgICAgICAgICAgICAgLmFkZCh0aGlzLnBsdXJhbCh0aGlzLm9wdGlvbnMuY291bnQpID8gZ2V0dGV4dCgndGltZXMnKSA6IGdldHRleHQoJ3RpbWUnKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmlzRnVsbHlDb252ZXJ0aWJsZSgpKVxuICAgICAgICAgICAgdGhpcy5hZGQoZ2V0dGV4dCgnKH4gYXBwcm94aW1hdGUpJykpO1xuICAgICAgICByZXR1cm4gdGhpcy50ZXh0LmpvaW4oJycpO1xuICAgIH07XG4gICAgVG9UZXh0LnByb3RvdHlwZS5IT1VSTFkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBnZXR0ZXh0ID0gdGhpcy5nZXR0ZXh0O1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmludGVydmFsICE9PSAxKVxuICAgICAgICAgICAgdGhpcy5hZGQodGhpcy5vcHRpb25zLmludGVydmFsLnRvU3RyaW5nKCkpO1xuICAgICAgICB0aGlzLmFkZCh0aGlzLnBsdXJhbCh0aGlzLm9wdGlvbnMuaW50ZXJ2YWwpID8gZ2V0dGV4dCgnaG91cnMnKSA6IGdldHRleHQoJ2hvdXInKSk7XG4gICAgfTtcbiAgICBUb1RleHQucHJvdG90eXBlLk1JTlVURUxZID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZ2V0dGV4dCA9IHRoaXMuZ2V0dGV4dDtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5pbnRlcnZhbCAhPT0gMSlcbiAgICAgICAgICAgIHRoaXMuYWRkKHRoaXMub3B0aW9ucy5pbnRlcnZhbC50b1N0cmluZygpKTtcbiAgICAgICAgdGhpcy5hZGQodGhpcy5wbHVyYWwodGhpcy5vcHRpb25zLmludGVydmFsKVxuICAgICAgICAgICAgPyBnZXR0ZXh0KCdtaW51dGVzJylcbiAgICAgICAgICAgIDogZ2V0dGV4dCgnbWludXRlJykpO1xuICAgIH07XG4gICAgVG9UZXh0LnByb3RvdHlwZS5EQUlMWSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGdldHRleHQgPSB0aGlzLmdldHRleHQ7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaW50ZXJ2YWwgIT09IDEpXG4gICAgICAgICAgICB0aGlzLmFkZCh0aGlzLm9wdGlvbnMuaW50ZXJ2YWwudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmICh0aGlzLmJ5d2Vla2RheSAmJiB0aGlzLmJ5d2Vla2RheS5pc1dlZWtkYXlzKSB7XG4gICAgICAgICAgICB0aGlzLmFkZCh0aGlzLnBsdXJhbCh0aGlzLm9wdGlvbnMuaW50ZXJ2YWwpXG4gICAgICAgICAgICAgICAgPyBnZXR0ZXh0KCd3ZWVrZGF5cycpXG4gICAgICAgICAgICAgICAgOiBnZXR0ZXh0KCd3ZWVrZGF5JykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hZGQodGhpcy5wbHVyYWwodGhpcy5vcHRpb25zLmludGVydmFsKSA/IGdldHRleHQoJ2RheXMnKSA6IGdldHRleHQoJ2RheScpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vcmlnT3B0aW9ucy5ieW1vbnRoKSB7XG4gICAgICAgICAgICB0aGlzLmFkZChnZXR0ZXh0KCdpbicpKTtcbiAgICAgICAgICAgIHRoaXMuX2J5bW9udGgoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5ieW1vbnRoZGF5KSB7XG4gICAgICAgICAgICB0aGlzLl9ieW1vbnRoZGF5KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5ieXdlZWtkYXkpIHtcbiAgICAgICAgICAgIHRoaXMuX2J5d2Vla2RheSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMub3JpZ09wdGlvbnMuYnlob3VyKSB7XG4gICAgICAgICAgICB0aGlzLl9ieWhvdXIoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgVG9UZXh0LnByb3RvdHlwZS5XRUVLTFkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBnZXR0ZXh0ID0gdGhpcy5nZXR0ZXh0O1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmludGVydmFsICE9PSAxKSB7XG4gICAgICAgICAgICB0aGlzLmFkZCh0aGlzLm9wdGlvbnMuaW50ZXJ2YWwudG9TdHJpbmcoKSkuYWRkKHRoaXMucGx1cmFsKHRoaXMub3B0aW9ucy5pbnRlcnZhbCkgPyBnZXR0ZXh0KCd3ZWVrcycpIDogZ2V0dGV4dCgnd2VlaycpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5ieXdlZWtkYXkgJiYgdGhpcy5ieXdlZWtkYXkuaXNXZWVrZGF5cykge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5pbnRlcnZhbCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkKHRoaXMucGx1cmFsKHRoaXMub3B0aW9ucy5pbnRlcnZhbClcbiAgICAgICAgICAgICAgICAgICAgPyBnZXR0ZXh0KCd3ZWVrZGF5cycpXG4gICAgICAgICAgICAgICAgICAgIDogZ2V0dGV4dCgnd2Vla2RheScpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkKGdldHRleHQoJ29uJykpLmFkZChnZXR0ZXh0KCd3ZWVrZGF5cycpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmJ5d2Vla2RheSAmJiB0aGlzLmJ5d2Vla2RheS5pc0V2ZXJ5RGF5KSB7XG4gICAgICAgICAgICB0aGlzLmFkZCh0aGlzLnBsdXJhbCh0aGlzLm9wdGlvbnMuaW50ZXJ2YWwpID8gZ2V0dGV4dCgnZGF5cycpIDogZ2V0dGV4dCgnZGF5JykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5pbnRlcnZhbCA9PT0gMSlcbiAgICAgICAgICAgICAgICB0aGlzLmFkZChnZXR0ZXh0KCd3ZWVrJykpO1xuICAgICAgICAgICAgaWYgKHRoaXMub3JpZ09wdGlvbnMuYnltb250aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkKGdldHRleHQoJ2luJykpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2J5bW9udGgoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmJ5bW9udGhkYXkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9ieW1vbnRoZGF5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLmJ5d2Vla2RheSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2J5d2Vla2RheSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBUb1RleHQucHJvdG90eXBlLk1PTlRITFkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBnZXR0ZXh0ID0gdGhpcy5nZXR0ZXh0O1xuICAgICAgICBpZiAodGhpcy5vcmlnT3B0aW9ucy5ieW1vbnRoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmludGVydmFsICE9PSAxKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGQodGhpcy5vcHRpb25zLmludGVydmFsLnRvU3RyaW5nKCkpLmFkZChnZXR0ZXh0KCdtb250aHMnKSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGx1cmFsKHRoaXMub3B0aW9ucy5pbnRlcnZhbCkpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkKGdldHRleHQoJ2luJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcy5hZGQoZ2V0dGV4dCgnTU9OVEgnKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2J5bW9udGgoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaW50ZXJ2YWwgIT09IDEpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGQodGhpcy5vcHRpb25zLmludGVydmFsLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgdGhpcy5hZGQodGhpcy5wbHVyYWwodGhpcy5vcHRpb25zLmludGVydmFsKVxuICAgICAgICAgICAgICAgID8gZ2V0dGV4dCgnbW9udGhzJylcbiAgICAgICAgICAgICAgICA6IGdldHRleHQoJ21vbnRoJykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmJ5bW9udGhkYXkpIHtcbiAgICAgICAgICAgIHRoaXMuX2J5bW9udGhkYXkoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmJ5d2Vla2RheSAmJiB0aGlzLmJ5d2Vla2RheS5pc1dlZWtkYXlzKSB7XG4gICAgICAgICAgICB0aGlzLmFkZChnZXR0ZXh0KCdvbicpKS5hZGQoZ2V0dGV4dCgnd2Vla2RheXMnKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5ieXdlZWtkYXkpIHtcbiAgICAgICAgICAgIHRoaXMuX2J5d2Vla2RheSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBUb1RleHQucHJvdG90eXBlLllFQVJMWSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGdldHRleHQgPSB0aGlzLmdldHRleHQ7XG4gICAgICAgIGlmICh0aGlzLm9yaWdPcHRpb25zLmJ5bW9udGgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaW50ZXJ2YWwgIT09IDEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZCh0aGlzLm9wdGlvbnMuaW50ZXJ2YWwudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGQoZ2V0dGV4dCgneWVhcnMnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyB0aGlzLmFkZChnZXR0ZXh0KCdZRUFSJykpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9ieW1vbnRoKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmludGVydmFsICE9PSAxKVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkKHRoaXMub3B0aW9ucy5pbnRlcnZhbC50b1N0cmluZygpKTtcbiAgICAgICAgICAgIHRoaXMuYWRkKHRoaXMucGx1cmFsKHRoaXMub3B0aW9ucy5pbnRlcnZhbCkgPyBnZXR0ZXh0KCd5ZWFycycpIDogZ2V0dGV4dCgneWVhcicpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5ieW1vbnRoZGF5KSB7XG4gICAgICAgICAgICB0aGlzLl9ieW1vbnRoZGF5KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5ieXdlZWtkYXkpIHtcbiAgICAgICAgICAgIHRoaXMuX2J5d2Vla2RheSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYnl5ZWFyZGF5KSB7XG4gICAgICAgICAgICB0aGlzLmFkZChnZXR0ZXh0KCdvbiB0aGUnKSlcbiAgICAgICAgICAgICAgICAuYWRkKHRoaXMubGlzdCh0aGlzLm9wdGlvbnMuYnl5ZWFyZGF5LCB0aGlzLm50aCwgZ2V0dGV4dCgnYW5kJykpKVxuICAgICAgICAgICAgICAgIC5hZGQoZ2V0dGV4dCgnZGF5JykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYnl3ZWVrbm8pIHtcbiAgICAgICAgICAgIHRoaXMuYWRkKGdldHRleHQoJ2luJykpXG4gICAgICAgICAgICAgICAgLmFkZCh0aGlzLnBsdXJhbCh0aGlzLm9wdGlvbnMuYnl3ZWVrbm8ubGVuZ3RoKVxuICAgICAgICAgICAgICAgID8gZ2V0dGV4dCgnd2Vla3MnKVxuICAgICAgICAgICAgICAgIDogZ2V0dGV4dCgnd2VlaycpKVxuICAgICAgICAgICAgICAgIC5hZGQodGhpcy5saXN0KHRoaXMub3B0aW9ucy5ieXdlZWtubywgdW5kZWZpbmVkLCBnZXR0ZXh0KCdhbmQnKSkpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBUb1RleHQucHJvdG90eXBlLl9ieW1vbnRoZGF5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZ2V0dGV4dCA9IHRoaXMuZ2V0dGV4dDtcbiAgICAgICAgaWYgKHRoaXMuYnl3ZWVrZGF5ICYmIHRoaXMuYnl3ZWVrZGF5LmFsbFdlZWtzKSB7XG4gICAgICAgICAgICB0aGlzLmFkZChnZXR0ZXh0KCdvbicpKVxuICAgICAgICAgICAgICAgIC5hZGQodGhpcy5saXN0KHRoaXMuYnl3ZWVrZGF5LmFsbFdlZWtzLCB0aGlzLndlZWtkYXl0ZXh0LCBnZXR0ZXh0KCdvcicpKSlcbiAgICAgICAgICAgICAgICAuYWRkKGdldHRleHQoJ3RoZScpKVxuICAgICAgICAgICAgICAgIC5hZGQodGhpcy5saXN0KHRoaXMuYnltb250aGRheSwgdGhpcy5udGgsIGdldHRleHQoJ29yJykpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWRkKGdldHRleHQoJ29uIHRoZScpKS5hZGQodGhpcy5saXN0KHRoaXMuYnltb250aGRheSwgdGhpcy5udGgsIGdldHRleHQoJ2FuZCcpKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdGhpcy5hZGQoZ2V0dGV4dCgnREFZJykpXG4gICAgfTtcbiAgICBUb1RleHQucHJvdG90eXBlLl9ieXdlZWtkYXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBnZXR0ZXh0ID0gdGhpcy5nZXR0ZXh0O1xuICAgICAgICBpZiAodGhpcy5ieXdlZWtkYXkuYWxsV2Vla3MgJiYgIXRoaXMuYnl3ZWVrZGF5LmlzV2Vla2RheXMpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkKGdldHRleHQoJ29uJykpLmFkZCh0aGlzLmxpc3QodGhpcy5ieXdlZWtkYXkuYWxsV2Vla3MsIHRoaXMud2Vla2RheXRleHQpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5ieXdlZWtkYXkuc29tZVdlZWtzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5ieXdlZWtkYXkuYWxsV2Vla3MpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGQoZ2V0dGV4dCgnYW5kJykpO1xuICAgICAgICAgICAgdGhpcy5hZGQoZ2V0dGV4dCgnb24gdGhlJykpLmFkZCh0aGlzLmxpc3QodGhpcy5ieXdlZWtkYXkuc29tZVdlZWtzLCB0aGlzLndlZWtkYXl0ZXh0LCBnZXR0ZXh0KCdhbmQnKSkpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBUb1RleHQucHJvdG90eXBlLl9ieWhvdXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBnZXR0ZXh0ID0gdGhpcy5nZXR0ZXh0O1xuICAgICAgICB0aGlzLmFkZChnZXR0ZXh0KCdhdCcpKS5hZGQodGhpcy5saXN0KHRoaXMub3JpZ09wdGlvbnMuYnlob3VyLCB1bmRlZmluZWQsIGdldHRleHQoJ2FuZCcpKSk7XG4gICAgfTtcbiAgICBUb1RleHQucHJvdG90eXBlLl9ieW1vbnRoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFkZCh0aGlzLmxpc3QodGhpcy5vcHRpb25zLmJ5bW9udGgsIHRoaXMubW9udGh0ZXh0LCB0aGlzLmdldHRleHQoJ2FuZCcpKSk7XG4gICAgfTtcbiAgICBUb1RleHQucHJvdG90eXBlLm50aCA9IGZ1bmN0aW9uIChuKSB7XG4gICAgICAgIG4gPSBwYXJzZUludChuLnRvU3RyaW5nKCksIDEwKTtcbiAgICAgICAgdmFyIG50aDtcbiAgICAgICAgdmFyIG5wb3M7XG4gICAgICAgIHZhciBnZXR0ZXh0ID0gdGhpcy5nZXR0ZXh0O1xuICAgICAgICBpZiAobiA9PT0gLTEpXG4gICAgICAgICAgICByZXR1cm4gZ2V0dGV4dCgnbGFzdCcpO1xuICAgICAgICBucG9zID0gTWF0aC5hYnMobik7XG4gICAgICAgIHN3aXRjaCAobnBvcykge1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgY2FzZSAyMTpcbiAgICAgICAgICAgIGNhc2UgMzE6XG4gICAgICAgICAgICAgICAgbnRoID0gbnBvcyArIGdldHRleHQoJ3N0Jyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBjYXNlIDIyOlxuICAgICAgICAgICAgICAgIG50aCA9IG5wb3MgKyBnZXR0ZXh0KCduZCcpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgY2FzZSAyMzpcbiAgICAgICAgICAgICAgICBudGggPSBucG9zICsgZ2V0dGV4dCgncmQnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgbnRoID0gbnBvcyArIGdldHRleHQoJ3RoJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG4gPCAwID8gbnRoICsgJyAnICsgZ2V0dGV4dCgnbGFzdCcpIDogbnRoO1xuICAgIH07XG4gICAgVG9UZXh0LnByb3RvdHlwZS5tb250aHRleHQgPSBmdW5jdGlvbiAobSkge1xuICAgICAgICByZXR1cm4gdGhpcy5sYW5ndWFnZS5tb250aE5hbWVzW20gLSAxXTtcbiAgICB9O1xuICAgIFRvVGV4dC5wcm90b3R5cGUud2Vla2RheXRleHQgPSBmdW5jdGlvbiAod2RheSkge1xuICAgICAgICB2YXIgd2Vla2RheSA9IGlzTnVtYmVyKHdkYXkpID8gKHdkYXkgKyAxKSAlIDcgOiB3ZGF5LmdldEpzV2Vla2RheSgpO1xuICAgICAgICByZXR1cm4gKCh3ZGF5Lm4gPyB0aGlzLm50aCh3ZGF5Lm4pICsgJyAnIDogJycpICsgdGhpcy5sYW5ndWFnZS5kYXlOYW1lc1t3ZWVrZGF5XSk7XG4gICAgfTtcbiAgICBUb1RleHQucHJvdG90eXBlLnBsdXJhbCA9IGZ1bmN0aW9uIChuKSB7XG4gICAgICAgIHJldHVybiBuICUgMTAwICE9PSAxO1xuICAgIH07XG4gICAgVG9UZXh0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAocykge1xuICAgICAgICB0aGlzLnRleHQucHVzaCgnICcpO1xuICAgICAgICB0aGlzLnRleHQucHVzaChzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBUb1RleHQucHJvdG90eXBlLmxpc3QgPSBmdW5jdGlvbiAoYXJyLCBjYWxsYmFjaywgZmluYWxEZWxpbSwgZGVsaW0pIHtcbiAgICAgICAgaWYgKGRlbGltID09PSB2b2lkIDApIHsgZGVsaW0gPSAnLCc7IH1cbiAgICAgICAgaWYgKCFpc0FycmF5KGFycikpIHtcbiAgICAgICAgICAgIGFyciA9IFthcnJdO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkZWxpbUpvaW4gPSBmdW5jdGlvbiAoYXJyYXksIGRlbGltaXRlciwgZmluYWxEZWxpbWl0ZXIpIHtcbiAgICAgICAgICAgIHZhciBsaXN0ID0gJyc7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IGFycmF5Lmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QgKz0gJyAnICsgZmluYWxEZWxpbWl0ZXIgKyAnICc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaXN0ICs9IGRlbGltaXRlciArICcgJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsaXN0ICs9IGFycmF5W2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgICAgIH07XG4gICAgICAgIGNhbGxiYWNrID1cbiAgICAgICAgICAgIGNhbGxiYWNrIHx8XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKG8pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8udG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHZhciByZWFsQ2FsbGJhY2sgPSBmdW5jdGlvbiAoYXJnKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sgJiYgY2FsbGJhY2suY2FsbChzZWxmLCBhcmcpO1xuICAgICAgICB9O1xuICAgICAgICBpZiAoZmluYWxEZWxpbSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlbGltSm9pbihhcnIubWFwKHJlYWxDYWxsYmFjayksIGRlbGltLCBmaW5hbERlbGltKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBhcnIubWFwKHJlYWxDYWxsYmFjaykuam9pbihkZWxpbSArICcgJyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBUb1RleHQ7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgVG9UZXh0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dG90ZXh0LmpzLm1hcCIsImltcG9ydCBFTkdMSVNIIGZyb20gJy4vaTE4bic7XG5pbXBvcnQgUlJ1bGUgZnJvbSAnLi4vaW5kZXgnO1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFBhcnNlclxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbnZhciBQYXJzZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUGFyc2VyKHJ1bGVzKSB7XG4gICAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG4gICAgICAgIHRoaXMucnVsZXMgPSBydWxlcztcbiAgICB9XG4gICAgUGFyc2VyLnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gICAgICAgIHRoaXMudGV4dCA9IHRleHQ7XG4gICAgICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0U3ltYm9sKCk7XG4gICAgfTtcbiAgICBQYXJzZXIucHJvdG90eXBlLmlzRG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9uZSAmJiB0aGlzLnN5bWJvbCA9PT0gbnVsbDtcbiAgICB9O1xuICAgIFBhcnNlci5wcm90b3R5cGUubmV4dFN5bWJvbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGJlc3Q7XG4gICAgICAgIHZhciBiZXN0U3ltYm9sO1xuICAgICAgICB2YXIgcCA9IHRoaXM7XG4gICAgICAgIHRoaXMuc3ltYm9sID0gbnVsbDtcbiAgICAgICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRvbmUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgdmFyIHJ1bGUgPSB2b2lkIDA7XG4gICAgICAgICAgICBiZXN0ID0gbnVsbDtcbiAgICAgICAgICAgIGZvciAodmFyIG5hbWVfMSBpbiB0aGlzLnJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgcnVsZSA9IHRoaXMucnVsZXNbbmFtZV8xXTtcbiAgICAgICAgICAgICAgICB2YXIgbWF0Y2ggPSBydWxlLmV4ZWMocC50ZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJlc3QgPT09IG51bGwgfHwgbWF0Y2hbMF0ubGVuZ3RoID4gYmVzdFswXS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3QgPSBtYXRjaDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RTeW1ib2wgPSBuYW1lXzE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYmVzdCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0ID0gdGhpcy50ZXh0LnN1YnN0cihiZXN0WzBdLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudGV4dCA9PT0gJycpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYmVzdCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnN5bWJvbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB9IHdoaWxlIChiZXN0U3ltYm9sID09PSAnU0tJUCcpO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMuc3ltYm9sID0gYmVzdFN5bWJvbDtcbiAgICAgICAgdGhpcy52YWx1ZSA9IGJlc3Q7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgUGFyc2VyLnByb3RvdHlwZS5hY2NlcHQgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBpZiAodGhpcy5zeW1ib2wgPT09IG5hbWUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHYgPSB0aGlzLnZhbHVlO1xuICAgICAgICAgICAgICAgIHRoaXMubmV4dFN5bWJvbCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5uZXh0U3ltYm9sKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICBQYXJzZXIucHJvdG90eXBlLmFjY2VwdE51bWJlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWNjZXB0KCdudW1iZXInKTtcbiAgICB9O1xuICAgIFBhcnNlci5wcm90b3R5cGUuZXhwZWN0ID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgaWYgKHRoaXMuYWNjZXB0KG5hbWUpKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgJyArIG5hbWUgKyAnIGJ1dCBmb3VuZCAnICsgdGhpcy5zeW1ib2wpO1xuICAgIH07XG4gICAgcmV0dXJuIFBhcnNlcjtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBwYXJzZVRleHQodGV4dCwgbGFuZ3VhZ2UpIHtcbiAgICBpZiAobGFuZ3VhZ2UgPT09IHZvaWQgMCkgeyBsYW5ndWFnZSA9IEVOR0xJU0g7IH1cbiAgICB2YXIgb3B0aW9ucyA9IHt9O1xuICAgIHZhciB0dHIgPSBuZXcgUGFyc2VyKGxhbmd1YWdlLnRva2Vucyk7XG4gICAgaWYgKCF0dHIuc3RhcnQodGV4dCkpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIFMoKTtcbiAgICByZXR1cm4gb3B0aW9ucztcbiAgICBmdW5jdGlvbiBTKCkge1xuICAgICAgICAvLyBldmVyeSBbbl1cbiAgICAgICAgdHRyLmV4cGVjdCgnZXZlcnknKTtcbiAgICAgICAgdmFyIG4gPSB0dHIuYWNjZXB0TnVtYmVyKCk7XG4gICAgICAgIGlmIChuKVxuICAgICAgICAgICAgb3B0aW9ucy5pbnRlcnZhbCA9IHBhcnNlSW50KG5bMF0sIDEwKTtcbiAgICAgICAgaWYgKHR0ci5pc0RvbmUoKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBlbmQnKTtcbiAgICAgICAgc3dpdGNoICh0dHIuc3ltYm9sKSB7XG4gICAgICAgICAgICBjYXNlICdkYXkocyknOlxuICAgICAgICAgICAgICAgIG9wdGlvbnMuZnJlcSA9IFJSdWxlLkRBSUxZO1xuICAgICAgICAgICAgICAgIGlmICh0dHIubmV4dFN5bWJvbCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIEFUKCk7XG4gICAgICAgICAgICAgICAgICAgIEYoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAvLyBGSVhNRSBOb3RlOiBldmVyeSAyIHdlZWtkYXlzICE9IGV2ZXJ5IHR3byB3ZWVrcyBvbiB3ZWVrZGF5cy5cbiAgICAgICAgICAgIC8vIERBSUxZIG9uIHdlZWtkYXlzIGlzIG5vdCBhIHZhbGlkIHJ1bGVcbiAgICAgICAgICAgIGNhc2UgJ3dlZWtkYXkocyknOlxuICAgICAgICAgICAgICAgIG9wdGlvbnMuZnJlcSA9IFJSdWxlLldFRUtMWTtcbiAgICAgICAgICAgICAgICBvcHRpb25zLmJ5d2Vla2RheSA9IFtcbiAgICAgICAgICAgICAgICAgICAgUlJ1bGUuTU8sXG4gICAgICAgICAgICAgICAgICAgIFJSdWxlLlRVLFxuICAgICAgICAgICAgICAgICAgICBSUnVsZS5XRSxcbiAgICAgICAgICAgICAgICAgICAgUlJ1bGUuVEgsXG4gICAgICAgICAgICAgICAgICAgIFJSdWxlLkZSXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICB0dHIubmV4dFN5bWJvbCgpO1xuICAgICAgICAgICAgICAgIEYoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3dlZWsocyknOlxuICAgICAgICAgICAgICAgIG9wdGlvbnMuZnJlcSA9IFJSdWxlLldFRUtMWTtcbiAgICAgICAgICAgICAgICBpZiAodHRyLm5leHRTeW1ib2woKSkge1xuICAgICAgICAgICAgICAgICAgICBPTigpO1xuICAgICAgICAgICAgICAgICAgICBGKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaG91cihzKSc6XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5mcmVxID0gUlJ1bGUuSE9VUkxZO1xuICAgICAgICAgICAgICAgIGlmICh0dHIubmV4dFN5bWJvbCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIE9OKCk7XG4gICAgICAgICAgICAgICAgICAgIEYoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtaW51dGUocyknOlxuICAgICAgICAgICAgICAgIG9wdGlvbnMuZnJlcSA9IFJSdWxlLk1JTlVURUxZO1xuICAgICAgICAgICAgICAgIGlmICh0dHIubmV4dFN5bWJvbCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIE9OKCk7XG4gICAgICAgICAgICAgICAgICAgIEYoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtb250aChzKSc6XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5mcmVxID0gUlJ1bGUuTU9OVEhMWTtcbiAgICAgICAgICAgICAgICBpZiAodHRyLm5leHRTeW1ib2woKSkge1xuICAgICAgICAgICAgICAgICAgICBPTigpO1xuICAgICAgICAgICAgICAgICAgICBGKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAneWVhcihzKSc6XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5mcmVxID0gUlJ1bGUuWUVBUkxZO1xuICAgICAgICAgICAgICAgIGlmICh0dHIubmV4dFN5bWJvbCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIE9OKCk7XG4gICAgICAgICAgICAgICAgICAgIEYoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtb25kYXknOlxuICAgICAgICAgICAgY2FzZSAndHVlc2RheSc6XG4gICAgICAgICAgICBjYXNlICd3ZWRuZXNkYXknOlxuICAgICAgICAgICAgY2FzZSAndGh1cnNkYXknOlxuICAgICAgICAgICAgY2FzZSAnZnJpZGF5JzpcbiAgICAgICAgICAgIGNhc2UgJ3NhdHVyZGF5JzpcbiAgICAgICAgICAgIGNhc2UgJ3N1bmRheSc6XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5mcmVxID0gUlJ1bGUuV0VFS0xZO1xuICAgICAgICAgICAgICAgIHZhciBrZXkgPSB0dHIuc3ltYm9sLnN1YnN0cigwLCAyKS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuYnl3ZWVrZGF5ID0gW1JSdWxlW2tleV1dO1xuICAgICAgICAgICAgICAgIGlmICghdHRyLm5leHRTeW1ib2woKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIC8vIFRPRE8gY2hlY2sgZm9yIGR1cGxpY2F0ZXNcbiAgICAgICAgICAgICAgICB3aGlsZSAodHRyLmFjY2VwdCgnY29tbWEnKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHRyLmlzRG9uZSgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIGVuZCcpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgd2tkID0gZGVjb2RlV0tEKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghd2tkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc3ltYm9sICcgKyB0dHIuc3ltYm9sICsgJywgZXhwZWN0ZWQgd2Vla2RheScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5ieXdlZWtkYXkucHVzaChSUnVsZVt3a2RdKTtcbiAgICAgICAgICAgICAgICAgICAgdHRyLm5leHRTeW1ib2woKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgTURBWXMoKTtcbiAgICAgICAgICAgICAgICBGKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdqYW51YXJ5JzpcbiAgICAgICAgICAgIGNhc2UgJ2ZlYnJ1YXJ5JzpcbiAgICAgICAgICAgIGNhc2UgJ21hcmNoJzpcbiAgICAgICAgICAgIGNhc2UgJ2FwcmlsJzpcbiAgICAgICAgICAgIGNhc2UgJ21heSc6XG4gICAgICAgICAgICBjYXNlICdqdW5lJzpcbiAgICAgICAgICAgIGNhc2UgJ2p1bHknOlxuICAgICAgICAgICAgY2FzZSAnYXVndXN0JzpcbiAgICAgICAgICAgIGNhc2UgJ3NlcHRlbWJlcic6XG4gICAgICAgICAgICBjYXNlICdvY3RvYmVyJzpcbiAgICAgICAgICAgIGNhc2UgJ25vdmVtYmVyJzpcbiAgICAgICAgICAgIGNhc2UgJ2RlY2VtYmVyJzpcbiAgICAgICAgICAgICAgICBvcHRpb25zLmZyZXEgPSBSUnVsZS5ZRUFSTFk7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5ieW1vbnRoID0gW2RlY29kZU0oKV07XG4gICAgICAgICAgICAgICAgaWYgKCF0dHIubmV4dFN5bWJvbCgpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgLy8gVE9ETyBjaGVjayBmb3IgZHVwbGljYXRlc1xuICAgICAgICAgICAgICAgIHdoaWxlICh0dHIuYWNjZXB0KCdjb21tYScpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0dHIuaXNEb25lKCkpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgZW5kJyk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtID0gZGVjb2RlTSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzeW1ib2wgJyArIHR0ci5zeW1ib2wgKyAnLCBleHBlY3RlZCBtb250aCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuYnltb250aC5wdXNoKG0pO1xuICAgICAgICAgICAgICAgICAgICB0dHIubmV4dFN5bWJvbCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBPTigpO1xuICAgICAgICAgICAgICAgIEYoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIHN5bWJvbCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIE9OKCkge1xuICAgICAgICB2YXIgb24gPSB0dHIuYWNjZXB0KCdvbicpO1xuICAgICAgICB2YXIgdGhlID0gdHRyLmFjY2VwdCgndGhlJyk7XG4gICAgICAgIGlmICghKG9uIHx8IHRoZSkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIHZhciBudGggPSBkZWNvZGVOVEgoKTtcbiAgICAgICAgICAgIHZhciB3a2QgPSBkZWNvZGVXS0QoKTtcbiAgICAgICAgICAgIHZhciBtID0gZGVjb2RlTSgpO1xuICAgICAgICAgICAgLy8gbnRoIDx3ZWVrZGF5PiB8IDx3ZWVrZGF5PlxuICAgICAgICAgICAgaWYgKG50aCkge1xuICAgICAgICAgICAgICAgIC8vIHR0ci5uZXh0U3ltYm9sKClcbiAgICAgICAgICAgICAgICBpZiAod2tkKSB7XG4gICAgICAgICAgICAgICAgICAgIHR0ci5uZXh0U3ltYm9sKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy5ieXdlZWtkYXkpXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmJ5d2Vla2RheSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuYnl3ZWVrZGF5LnB1c2goUlJ1bGVbd2tkXS5udGgobnRoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuYnltb250aGRheSlcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuYnltb250aGRheSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuYnltb250aGRheS5wdXNoKG50aCk7XG4gICAgICAgICAgICAgICAgICAgIHR0ci5hY2NlcHQoJ2RheShzKScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyA8d2Vla2RheT5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHdrZCkge1xuICAgICAgICAgICAgICAgIHR0ci5uZXh0U3ltYm9sKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLmJ5d2Vla2RheSlcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5ieXdlZWtkYXkgPSBbXTtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5ieXdlZWtkYXkucHVzaChSUnVsZVt3a2RdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR0ci5zeW1ib2wgPT09ICd3ZWVrZGF5KHMpJykge1xuICAgICAgICAgICAgICAgIHR0ci5uZXh0U3ltYm9sKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLmJ5d2Vla2RheSkge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmJ5d2Vla2RheSA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIFJSdWxlLk1PLFxuICAgICAgICAgICAgICAgICAgICAgICAgUlJ1bGUuVFUsXG4gICAgICAgICAgICAgICAgICAgICAgICBSUnVsZS5XRSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFJSdWxlLlRILFxuICAgICAgICAgICAgICAgICAgICAgICAgUlJ1bGUuRlJcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0dHIuc3ltYm9sID09PSAnd2VlayhzKScpIHtcbiAgICAgICAgICAgICAgICB0dHIubmV4dFN5bWJvbCgpO1xuICAgICAgICAgICAgICAgIHZhciBuID0gdHRyLmFjY2VwdE51bWJlcigpO1xuICAgICAgICAgICAgICAgIGlmICghbikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc3ltYm9sICcgKyB0dHIuc3ltYm9sICsgJywgZXhwZWN0ZWQgd2VlayBudW1iZXInKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5ieXdlZWtubyA9IFtwYXJzZUludChuWzBdLCAxMCldO1xuICAgICAgICAgICAgICAgIHdoaWxlICh0dHIuYWNjZXB0KCdjb21tYScpKSB7XG4gICAgICAgICAgICAgICAgICAgIG4gPSB0dHIuYWNjZXB0TnVtYmVyKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHN5bWJvbCAnICsgdHRyLnN5bWJvbCArICc7IGV4cGVjdGVkIG1vbnRoZGF5Jyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5ieXdlZWtuby5wdXNoKHBhcnNlSW50KG5bMF0sIDEwKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobSkge1xuICAgICAgICAgICAgICAgIHR0ci5uZXh0U3ltYm9sKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLmJ5bW9udGgpXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuYnltb250aCA9IFtdO1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBvcHRpb25zLmJ5bW9udGgucHVzaChtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAodHRyLmFjY2VwdCgnY29tbWEnKSB8fCB0dHIuYWNjZXB0KCd0aGUnKSB8fCB0dHIuYWNjZXB0KCdvbicpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gQVQoKSB7XG4gICAgICAgIHZhciBhdCA9IHR0ci5hY2NlcHQoJ2F0Jyk7XG4gICAgICAgIGlmICghYXQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIHZhciBuID0gdHRyLmFjY2VwdE51bWJlcigpO1xuICAgICAgICAgICAgaWYgKCFuKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHN5bWJvbCAnICsgdHRyLnN5bWJvbCArICcsIGV4cGVjdGVkIGhvdXInKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wdGlvbnMuYnlob3VyID0gW3BhcnNlSW50KG5bMF0sIDEwKV07XG4gICAgICAgICAgICB3aGlsZSAodHRyLmFjY2VwdCgnY29tbWEnKSkge1xuICAgICAgICAgICAgICAgIG4gPSB0dHIuYWNjZXB0TnVtYmVyKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzeW1ib2wgJyArIHR0ci5zeW1ib2wgKyAnOyBleHBlY3RlZCBob3VyJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG9wdGlvbnMuYnlob3VyLnB1c2gocGFyc2VJbnQoblswXSwgMTApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAodHRyLmFjY2VwdCgnY29tbWEnKSB8fCB0dHIuYWNjZXB0KCdhdCcpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVjb2RlTSgpIHtcbiAgICAgICAgc3dpdGNoICh0dHIuc3ltYm9sKSB7XG4gICAgICAgICAgICBjYXNlICdqYW51YXJ5JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgIGNhc2UgJ2ZlYnJ1YXJ5JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gMjtcbiAgICAgICAgICAgIGNhc2UgJ21hcmNoJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gMztcbiAgICAgICAgICAgIGNhc2UgJ2FwcmlsJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gNDtcbiAgICAgICAgICAgIGNhc2UgJ21heSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIDU7XG4gICAgICAgICAgICBjYXNlICdqdW5lJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gNjtcbiAgICAgICAgICAgIGNhc2UgJ2p1bHknOlxuICAgICAgICAgICAgICAgIHJldHVybiA3O1xuICAgICAgICAgICAgY2FzZSAnYXVndXN0JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gODtcbiAgICAgICAgICAgIGNhc2UgJ3NlcHRlbWJlcic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIDk7XG4gICAgICAgICAgICBjYXNlICdvY3RvYmVyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gMTA7XG4gICAgICAgICAgICBjYXNlICdub3ZlbWJlcic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIDExO1xuICAgICAgICAgICAgY2FzZSAnZGVjZW1iZXInOlxuICAgICAgICAgICAgICAgIHJldHVybiAxMjtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRlY29kZVdLRCgpIHtcbiAgICAgICAgc3dpdGNoICh0dHIuc3ltYm9sKSB7XG4gICAgICAgICAgICBjYXNlICdtb25kYXknOlxuICAgICAgICAgICAgY2FzZSAndHVlc2RheSc6XG4gICAgICAgICAgICBjYXNlICd3ZWRuZXNkYXknOlxuICAgICAgICAgICAgY2FzZSAndGh1cnNkYXknOlxuICAgICAgICAgICAgY2FzZSAnZnJpZGF5JzpcbiAgICAgICAgICAgIGNhc2UgJ3NhdHVyZGF5JzpcbiAgICAgICAgICAgIGNhc2UgJ3N1bmRheSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHR0ci5zeW1ib2wuc3Vic3RyKDAsIDIpLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBkZWNvZGVOVEgoKSB7XG4gICAgICAgIHN3aXRjaCAodHRyLnN5bWJvbCkge1xuICAgICAgICAgICAgY2FzZSAnbGFzdCc6XG4gICAgICAgICAgICAgICAgdHRyLm5leHRTeW1ib2woKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICBjYXNlICdmaXJzdCc6XG4gICAgICAgICAgICAgICAgdHRyLm5leHRTeW1ib2woKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgICAgICAgICAgICAgdHRyLm5leHRTeW1ib2woKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHRyLmFjY2VwdCgnbGFzdCcpID8gLTIgOiAyO1xuICAgICAgICAgICAgY2FzZSAndGhpcmQnOlxuICAgICAgICAgICAgICAgIHR0ci5uZXh0U3ltYm9sKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHR0ci5hY2NlcHQoJ2xhc3QnKSA/IC0zIDogMztcbiAgICAgICAgICAgIGNhc2UgJ250aCc6XG4gICAgICAgICAgICAgICAgdmFyIHYgPSBwYXJzZUludCh0dHIudmFsdWVbMV0sIDEwKTtcbiAgICAgICAgICAgICAgICBpZiAodiA8IC0zNjYgfHwgdiA+IDM2NilcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOdGggb3V0IG9mIHJhbmdlOiAnICsgdik7XG4gICAgICAgICAgICAgICAgdHRyLm5leHRTeW1ib2woKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHRyLmFjY2VwdCgnbGFzdCcpID8gLXYgOiB2O1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gTURBWXMoKSB7XG4gICAgICAgIHR0ci5hY2NlcHQoJ29uJyk7XG4gICAgICAgIHR0ci5hY2NlcHQoJ3RoZScpO1xuICAgICAgICB2YXIgbnRoID0gZGVjb2RlTlRIKCk7XG4gICAgICAgIGlmICghbnRoKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBvcHRpb25zLmJ5bW9udGhkYXkgPSBbbnRoXTtcbiAgICAgICAgdHRyLm5leHRTeW1ib2woKTtcbiAgICAgICAgd2hpbGUgKHR0ci5hY2NlcHQoJ2NvbW1hJykpIHtcbiAgICAgICAgICAgIG50aCA9IGRlY29kZU5USCgpO1xuICAgICAgICAgICAgaWYgKCFudGgpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc3ltYm9sICcgKyB0dHIuc3ltYm9sICsgJzsgZXhwZWN0ZWQgbW9udGhkYXknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wdGlvbnMuYnltb250aGRheS5wdXNoKG50aCk7XG4gICAgICAgICAgICB0dHIubmV4dFN5bWJvbCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIEYoKSB7XG4gICAgICAgIGlmICh0dHIuc3ltYm9sID09PSAndW50aWwnKSB7XG4gICAgICAgICAgICB2YXIgZGF0ZSA9IERhdGUucGFyc2UodHRyLnRleHQpO1xuICAgICAgICAgICAgaWYgKCFkYXRlKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHBhcnNlIHVudGlsIGRhdGU6JyArIHR0ci50ZXh0KTtcbiAgICAgICAgICAgIG9wdGlvbnMudW50aWwgPSBuZXcgRGF0ZShkYXRlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0dHIuYWNjZXB0KCdmb3InKSkge1xuICAgICAgICAgICAgb3B0aW9ucy5jb3VudCA9IHBhcnNlSW50KHR0ci52YWx1ZVswXSwgMTApO1xuICAgICAgICAgICAgdHRyLmV4cGVjdCgnbnVtYmVyJyk7XG4gICAgICAgICAgICAvLyB0dHIuZXhwZWN0KCd0aW1lcycpXG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXJzZXRleHQuanMubWFwIiwiZXhwb3J0IHZhciBGcmVxdWVuY3k7XG4oZnVuY3Rpb24gKEZyZXF1ZW5jeSkge1xuICAgIEZyZXF1ZW5jeVtGcmVxdWVuY3lbXCJZRUFSTFlcIl0gPSAwXSA9IFwiWUVBUkxZXCI7XG4gICAgRnJlcXVlbmN5W0ZyZXF1ZW5jeVtcIk1PTlRITFlcIl0gPSAxXSA9IFwiTU9OVEhMWVwiO1xuICAgIEZyZXF1ZW5jeVtGcmVxdWVuY3lbXCJXRUVLTFlcIl0gPSAyXSA9IFwiV0VFS0xZXCI7XG4gICAgRnJlcXVlbmN5W0ZyZXF1ZW5jeVtcIkRBSUxZXCJdID0gM10gPSBcIkRBSUxZXCI7XG4gICAgRnJlcXVlbmN5W0ZyZXF1ZW5jeVtcIkhPVVJMWVwiXSA9IDRdID0gXCJIT1VSTFlcIjtcbiAgICBGcmVxdWVuY3lbRnJlcXVlbmN5W1wiTUlOVVRFTFlcIl0gPSA1XSA9IFwiTUlOVVRFTFlcIjtcbiAgICBGcmVxdWVuY3lbRnJlcXVlbmN5W1wiU0VDT05ETFlcIl0gPSA2XSA9IFwiU0VDT05ETFlcIjtcbn0pKEZyZXF1ZW5jeSB8fCAoRnJlcXVlbmN5ID0ge30pKTtcbmV4cG9ydCBmdW5jdGlvbiBmcmVxSXNEYWlseU9yR3JlYXRlcihmcmVxKSB7XG4gICAgcmV0dXJuIGZyZXEgPCBGcmVxdWVuY3kuSE9VUkxZO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHlwZXMuanMubWFwIiwiaW1wb3J0IFRvVGV4dCBmcm9tICcuL3RvdGV4dCc7XG5pbXBvcnQgcGFyc2VUZXh0IGZyb20gJy4vcGFyc2V0ZXh0JztcbmltcG9ydCBSUnVsZSBmcm9tICcuLi9pbmRleCc7XG5pbXBvcnQgeyBGcmVxdWVuY3kgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgRU5HTElTSCBmcm9tICcuL2kxOG4nO1xuLyohXG4qIHJydWxlLmpzIC0gTGlicmFyeSBmb3Igd29ya2luZyB3aXRoIHJlY3VycmVuY2UgcnVsZXMgZm9yIGNhbGVuZGFyIGRhdGVzLlxuKiBodHRwczovL2dpdGh1Yi5jb20vamFrdWJyb3p0b2NpbC9ycnVsZVxuKlxuKiBDb3B5cmlnaHQgMjAxMCwgSmFrdWIgUm96dG9jaWwgYW5kIExhcnMgU2Nob25pbmdcbiogTGljZW5jZWQgdW5kZXIgdGhlIEJTRCBsaWNlbmNlLlxuKiBodHRwczovL2dpdGh1Yi5jb20vamFrdWJyb3p0b2NpbC9ycnVsZS9ibG9iL21hc3Rlci9MSUNFTkNFXG4qXG4qL1xuLyoqXG4gKlxuICogSW1wbGVtZW50YXRpb24gb2YgUlJ1bGUuZnJvbVRleHQoKSBhbmQgUlJ1bGU6OnRvVGV4dCgpLlxuICpcbiAqXG4gKiBPbiB0aGUgY2xpZW50IHNpZGUsIHRoaXMgZmlsZSBuZWVkcyB0byBiZSBpbmNsdWRlZFxuICogd2hlbiB0aG9zZSBmdW5jdGlvbnMgYXJlIHVzZWQuXG4gKlxuICovXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gZnJvbVRleHRcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vKipcbiAqIFdpbGwgYmUgYWJsZSB0byBjb252ZXJ0IHNvbWUgb2YgdGhlIGJlbG93IGRlc2NyaWJlZCBydWxlcyBmcm9tXG4gKiB0ZXh0IGZvcm1hdCB0byBhIHJ1bGUgb2JqZWN0LlxuICpcbiAqXG4gKiBSVUxFU1xuICpcbiAqIEV2ZXJ5IChbbl0pXG4gKiAgICAgICBkYXkocylcbiAqICAgICB8IFt3ZWVrZGF5XSwgLi4uLCAoYW5kKSBbd2Vla2RheV1cbiAqICAgICB8IHdlZWtkYXkocylcbiAqICAgICB8IHdlZWsocylcbiAqICAgICB8IG1vbnRoKHMpXG4gKiAgICAgfCBbbW9udGhdLCAuLi4sIChhbmQpIFttb250aF1cbiAqICAgICB8IHllYXIocylcbiAqXG4gKlxuICogUGx1cyAwLCAxLCBvciBtdWx0aXBsZSBvZiB0aGVzZTpcbiAqXG4gKiBvbiBbd2Vla2RheV0sIC4uLiwgKG9yKSBbd2Vla2RheV0gdGhlIFttb250aGRheV0sIFttb250aGRheV0sIC4uLiAob3IpIFttb250aGRheV1cbiAqXG4gKiBvbiBbd2Vla2RheV0sIC4uLiwgKGFuZCkgW3dlZWtkYXldXG4gKlxuICogb24gdGhlIFttb250aGRheV0sIFttb250aGRheV0sIC4uLiAoYW5kKSBbbW9udGhkYXldIChkYXkgb2YgdGhlIG1vbnRoKVxuICpcbiAqIG9uIHRoZSBbbnRoLXdlZWtkYXldLCAuLi4sIChhbmQpIFtudGgtd2Vla2RheV0gKG9mIHRoZSBtb250aC95ZWFyKVxuICpcbiAqXG4gKiBQbHVzIDAgb3IgMSBvZiB0aGVzZTpcbiAqXG4gKiBmb3IgW25dIHRpbWUocylcbiAqXG4gKiB1bnRpbCBbZGF0ZV1cbiAqXG4gKiBQbHVzICguKVxuICpcbiAqXG4gKiBEZWZpbml0ZWx5IG5vIHN1cHBvcnRlZCBmb3IgcGFyc2luZzpcbiAqXG4gKiAoZm9yIHllYXIpOlxuICogICAgIGluIHdlZWsocykgW25dLCAuLi4sIChhbmQpIFtuXVxuICpcbiAqICAgICBvbiB0aGUgW3llYXJkYXldLCAuLi4sIChhbmQpIFtuXSBkYXkgb2YgdGhlIHllYXJcbiAqICAgICBvbiBkYXkgW3llYXJkYXldLCAuLi4sIChhbmQpIFtuXVxuICpcbiAqXG4gKiBOT04tVEVSTUlOQUxTXG4gKlxuICogW25dOiAxLCAyIC4uLiwgb25lLCB0d28sIHRocmVlIC4uXG4gKiBbbW9udGhdOiBKYW51YXJ5LCBGZWJydWFyeSwgTWFyY2gsIEFwcmlsLCBNYXksIC4uLiBEZWNlbWJlclxuICogW3dlZWtkYXldOiBNb25kYXksIC4uLiBTdW5kYXlcbiAqIFtudGgtd2Vla2RheV06IGZpcnN0IFt3ZWVrZGF5XSwgMm5kIFt3ZWVrZGF5XSwgLi4uIGxhc3QgW3dlZWtkYXldLCAuLi5cbiAqIFttb250aGRheV06IGZpcnN0LCAxLiwgMi4sIDFzdCwgMm5kLCBzZWNvbmQsIC4uLiAzMXN0LCBsYXN0IGRheSwgMm5kIGxhc3QgZGF5LCAuLlxuICogW2RhdGVdOlxuICogICAgIFttb250aF0gKDAtMzEoLCkgKFt5ZWFyXSkpLFxuICogICAgICh0aGUpIDAtMzEuKDEtMTIuKFt5ZWFyXSkpLFxuICogICAgICh0aGUpIDAtMzEvKDEtMTIvKFt5ZWFyXSkpLFxuICogICAgIFt3ZWVrZGF5XVxuICpcbiAqIFt5ZWFyXTogMDAwMCwgMDAwMSwgLi4uIDAxLCAwMiwgLi5cbiAqXG4gKiBEZWZpbml0ZWx5IG5vdCBzdXBwb3J0ZWQgZm9yIHBhcnNpbmc6XG4gKlxuICogW3llYXJkYXldOiBmaXJzdCwgMS4sIDIuLCAxc3QsIDJuZCwgc2Vjb25kLCAuLi4gMzY2dGgsIGxhc3QgZGF5LCAybmQgbGFzdCBkYXksIC4uXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHRleHRcbiAqIEByZXR1cm4ge09iamVjdCwgQm9vbGVhbn0gdGhlIHJ1bGUsIG9yIG51bGwuXG4gKi9cbnZhciBmcm9tVGV4dCA9IGZ1bmN0aW9uICh0ZXh0LCBsYW5ndWFnZSkge1xuICAgIGlmIChsYW5ndWFnZSA9PT0gdm9pZCAwKSB7IGxhbmd1YWdlID0gRU5HTElTSDsgfVxuICAgIHJldHVybiBuZXcgUlJ1bGUocGFyc2VUZXh0KHRleHQsIGxhbmd1YWdlKSB8fCB1bmRlZmluZWQpO1xufTtcbnZhciBjb21tb24gPSBbXG4gICAgJ2NvdW50JyxcbiAgICAndW50aWwnLFxuICAgICdpbnRlcnZhbCcsXG4gICAgJ2J5d2Vla2RheScsXG4gICAgJ2J5bW9udGhkYXknLFxuICAgICdieW1vbnRoJ1xuXTtcblRvVGV4dC5JTVBMRU1FTlRFRCA9IFtdO1xuVG9UZXh0LklNUExFTUVOVEVEW0ZyZXF1ZW5jeS5IT1VSTFldID0gY29tbW9uO1xuVG9UZXh0LklNUExFTUVOVEVEW0ZyZXF1ZW5jeS5NSU5VVEVMWV0gPSBjb21tb247XG5Ub1RleHQuSU1QTEVNRU5URURbRnJlcXVlbmN5LkRBSUxZXSA9IFsnYnlob3VyJ10uY29uY2F0KGNvbW1vbik7XG5Ub1RleHQuSU1QTEVNRU5URURbRnJlcXVlbmN5LldFRUtMWV0gPSBjb21tb247XG5Ub1RleHQuSU1QTEVNRU5URURbRnJlcXVlbmN5Lk1PTlRITFldID0gY29tbW9uO1xuVG9UZXh0LklNUExFTUVOVEVEW0ZyZXF1ZW5jeS5ZRUFSTFldID0gWydieXdlZWtubycsICdieXllYXJkYXknXS5jb25jYXQoY29tbW9uKTtcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFeHBvcnRcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG52YXIgdG9UZXh0ID0gZnVuY3Rpb24gKHJydWxlLCBnZXR0ZXh0LCBsYW5ndWFnZSwgZGF0ZUZvcm1hdHRlcikge1xuICAgIHJldHVybiBuZXcgVG9UZXh0KHJydWxlLCBnZXR0ZXh0LCBsYW5ndWFnZSwgZGF0ZUZvcm1hdHRlcikudG9TdHJpbmcoKTtcbn07XG52YXIgaXNGdWxseUNvbnZlcnRpYmxlID0gVG9UZXh0LmlzRnVsbHlDb252ZXJ0aWJsZTtcbmV4cG9ydCB7IGZyb21UZXh0LCBwYXJzZVRleHQsIGlzRnVsbHlDb252ZXJ0aWJsZSwgdG9UZXh0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IEZyZXF1ZW5jeSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgcHltb2QsIGRpdm1vZCwgZW1wdHksIGluY2x1ZGVzIH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7IGRhdGV1dGlsIH0gZnJvbSAnLi9kYXRldXRpbCc7XG52YXIgVGltZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUaW1lKGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZCkge1xuICAgICAgICB0aGlzLmhvdXIgPSBob3VyO1xuICAgICAgICB0aGlzLm1pbnV0ZSA9IG1pbnV0ZTtcbiAgICAgICAgdGhpcy5zZWNvbmQgPSBzZWNvbmQ7XG4gICAgICAgIHRoaXMubWlsbGlzZWNvbmQgPSBtaWxsaXNlY29uZCB8fCAwO1xuICAgIH1cbiAgICBUaW1lLnByb3RvdHlwZS5nZXRIb3VycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG91cjtcbiAgICB9O1xuICAgIFRpbWUucHJvdG90eXBlLmdldE1pbnV0ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbnV0ZTtcbiAgICB9O1xuICAgIFRpbWUucHJvdG90eXBlLmdldFNlY29uZHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlY29uZDtcbiAgICB9O1xuICAgIFRpbWUucHJvdG90eXBlLmdldE1pbGxpc2Vjb25kcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQ7XG4gICAgfTtcbiAgICBUaW1lLnByb3RvdHlwZS5nZXRUaW1lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gKCh0aGlzLmhvdXIgKiA2MCAqIDYwICsgdGhpcy5taW51dGUgKiA2MCArIHRoaXMuc2Vjb25kKSAqIDEwMDAgK1xuICAgICAgICAgICAgdGhpcy5taWxsaXNlY29uZCk7XG4gICAgfTtcbiAgICByZXR1cm4gVGltZTtcbn0oKSk7XG5leHBvcnQgeyBUaW1lIH07XG52YXIgRGF0ZVRpbWUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKERhdGVUaW1lLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIERhdGVUaW1lKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnllYXIgPSB5ZWFyO1xuICAgICAgICBfdGhpcy5tb250aCA9IG1vbnRoO1xuICAgICAgICBfdGhpcy5kYXkgPSBkYXk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgRGF0ZVRpbWUuZnJvbURhdGUgPSBmdW5jdGlvbiAoZGF0ZSkge1xuICAgICAgICByZXR1cm4gbmV3IHRoaXMoZGF0ZS5nZXRVVENGdWxsWWVhcigpLCBkYXRlLmdldFVUQ01vbnRoKCkgKyAxLCBkYXRlLmdldFVUQ0RhdGUoKSwgZGF0ZS5nZXRVVENIb3VycygpLCBkYXRlLmdldFVUQ01pbnV0ZXMoKSwgZGF0ZS5nZXRVVENTZWNvbmRzKCksIGRhdGUudmFsdWVPZigpICUgMTAwMCk7XG4gICAgfTtcbiAgICBEYXRlVGltZS5wcm90b3R5cGUuZ2V0V2Vla2RheSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGRhdGV1dGlsLmdldFdlZWtkYXkobmV3IERhdGUodGhpcy5nZXRUaW1lKCkpKTtcbiAgICB9O1xuICAgIERhdGVUaW1lLnByb3RvdHlwZS5nZXRUaW1lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEModGhpcy55ZWFyLCB0aGlzLm1vbnRoIC0gMSwgdGhpcy5kYXksIHRoaXMuaG91ciwgdGhpcy5taW51dGUsIHRoaXMuc2Vjb25kLCB0aGlzLm1pbGxpc2Vjb25kKSkuZ2V0VGltZSgpO1xuICAgIH07XG4gICAgRGF0ZVRpbWUucHJvdG90eXBlLmdldERheSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF5O1xuICAgIH07XG4gICAgRGF0ZVRpbWUucHJvdG90eXBlLmdldE1vbnRoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb250aDtcbiAgICB9O1xuICAgIERhdGVUaW1lLnByb3RvdHlwZS5nZXRZZWFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy55ZWFyO1xuICAgIH07XG4gICAgRGF0ZVRpbWUucHJvdG90eXBlLmFkZFllYXJzID0gZnVuY3Rpb24gKHllYXJzKSB7XG4gICAgICAgIHRoaXMueWVhciArPSB5ZWFycztcbiAgICB9O1xuICAgIERhdGVUaW1lLnByb3RvdHlwZS5hZGRNb250aHMgPSBmdW5jdGlvbiAobW9udGhzKSB7XG4gICAgICAgIHRoaXMubW9udGggKz0gbW9udGhzO1xuICAgICAgICBpZiAodGhpcy5tb250aCA+IDEyKSB7XG4gICAgICAgICAgICB2YXIgeWVhckRpdiA9IE1hdGguZmxvb3IodGhpcy5tb250aCAvIDEyKTtcbiAgICAgICAgICAgIHZhciBtb250aE1vZCA9IHB5bW9kKHRoaXMubW9udGgsIDEyKTtcbiAgICAgICAgICAgIHRoaXMubW9udGggPSBtb250aE1vZDtcbiAgICAgICAgICAgIHRoaXMueWVhciArPSB5ZWFyRGl2O1xuICAgICAgICAgICAgaWYgKHRoaXMubW9udGggPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1vbnRoID0gMTI7XG4gICAgICAgICAgICAgICAgLS10aGlzLnllYXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIERhdGVUaW1lLnByb3RvdHlwZS5hZGRXZWVrbHkgPSBmdW5jdGlvbiAoZGF5cywgd2tzdCkge1xuICAgICAgICBpZiAod2tzdCA+IHRoaXMuZ2V0V2Vla2RheSgpKSB7XG4gICAgICAgICAgICB0aGlzLmRheSArPSAtKHRoaXMuZ2V0V2Vla2RheSgpICsgMSArICg2IC0gd2tzdCkpICsgZGF5cyAqIDc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRheSArPSAtKHRoaXMuZ2V0V2Vla2RheSgpIC0gd2tzdCkgKyBkYXlzICogNztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpeERheSgpO1xuICAgIH07XG4gICAgRGF0ZVRpbWUucHJvdG90eXBlLmFkZERhaWx5ID0gZnVuY3Rpb24gKGRheXMpIHtcbiAgICAgICAgdGhpcy5kYXkgKz0gZGF5cztcbiAgICAgICAgdGhpcy5maXhEYXkoKTtcbiAgICB9O1xuICAgIERhdGVUaW1lLnByb3RvdHlwZS5hZGRIb3VycyA9IGZ1bmN0aW9uIChob3VycywgZmlsdGVyZWQsIGJ5aG91cikge1xuICAgICAgICBpZiAoZmlsdGVyZWQpIHtcbiAgICAgICAgICAgIC8vIEp1bXAgdG8gb25lIGl0ZXJhdGlvbiBiZWZvcmUgbmV4dCBkYXlcbiAgICAgICAgICAgIHRoaXMuaG91ciArPSBNYXRoLmZsb29yKCgyMyAtIHRoaXMuaG91cikgLyBob3VycykgKiBob3VycztcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgdGhpcy5ob3VyICs9IGhvdXJzO1xuICAgICAgICAgICAgdmFyIF9hID0gZGl2bW9kKHRoaXMuaG91ciwgMjQpLCBkYXlEaXYgPSBfYS5kaXYsIGhvdXJNb2QgPSBfYS5tb2Q7XG4gICAgICAgICAgICBpZiAoZGF5RGl2KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ob3VyID0gaG91ck1vZDtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZERhaWx5KGRheURpdik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZW1wdHkoYnlob3VyKSB8fCBpbmNsdWRlcyhieWhvdXIsIHRoaXMuaG91cikpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIERhdGVUaW1lLnByb3RvdHlwZS5hZGRNaW51dGVzID0gZnVuY3Rpb24gKG1pbnV0ZXMsIGZpbHRlcmVkLCBieWhvdXIsIGJ5bWludXRlKSB7XG4gICAgICAgIGlmIChmaWx0ZXJlZCkge1xuICAgICAgICAgICAgLy8gSnVtcCB0byBvbmUgaXRlcmF0aW9uIGJlZm9yZSBuZXh0IGRheVxuICAgICAgICAgICAgdGhpcy5taW51dGUgKz1cbiAgICAgICAgICAgICAgICBNYXRoLmZsb29yKCgxNDM5IC0gKHRoaXMuaG91ciAqIDYwICsgdGhpcy5taW51dGUpKSAvIG1pbnV0ZXMpICogbWludXRlcztcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgdGhpcy5taW51dGUgKz0gbWludXRlcztcbiAgICAgICAgICAgIHZhciBfYSA9IGRpdm1vZCh0aGlzLm1pbnV0ZSwgNjApLCBob3VyRGl2ID0gX2EuZGl2LCBtaW51dGVNb2QgPSBfYS5tb2Q7XG4gICAgICAgICAgICBpZiAoaG91ckRpdikge1xuICAgICAgICAgICAgICAgIHRoaXMubWludXRlID0gbWludXRlTW9kO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkSG91cnMoaG91ckRpdiwgZmFsc2UsIGJ5aG91cik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKGVtcHR5KGJ5aG91cikgfHwgaW5jbHVkZXMoYnlob3VyLCB0aGlzLmhvdXIpKSAmJlxuICAgICAgICAgICAgICAgIChlbXB0eShieW1pbnV0ZSkgfHwgaW5jbHVkZXMoYnltaW51dGUsIHRoaXMubWludXRlKSkpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgRGF0ZVRpbWUucHJvdG90eXBlLmFkZFNlY29uZHMgPSBmdW5jdGlvbiAoc2Vjb25kcywgZmlsdGVyZWQsIGJ5aG91ciwgYnltaW51dGUsIGJ5c2Vjb25kKSB7XG4gICAgICAgIGlmIChmaWx0ZXJlZCkge1xuICAgICAgICAgICAgLy8gSnVtcCB0byBvbmUgaXRlcmF0aW9uIGJlZm9yZSBuZXh0IGRheVxuICAgICAgICAgICAgdGhpcy5zZWNvbmQgKz1cbiAgICAgICAgICAgICAgICBNYXRoLmZsb29yKCg4NjM5OSAtICh0aGlzLmhvdXIgKiAzNjAwICsgdGhpcy5taW51dGUgKiA2MCArIHRoaXMuc2Vjb25kKSkgLyBzZWNvbmRzKSAqIHNlY29uZHM7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIHRoaXMuc2Vjb25kICs9IHNlY29uZHM7XG4gICAgICAgICAgICB2YXIgX2EgPSBkaXZtb2QodGhpcy5zZWNvbmQsIDYwKSwgbWludXRlRGl2ID0gX2EuZGl2LCBzZWNvbmRNb2QgPSBfYS5tb2Q7XG4gICAgICAgICAgICBpZiAobWludXRlRGl2KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWNvbmQgPSBzZWNvbmRNb2Q7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRNaW51dGVzKG1pbnV0ZURpdiwgZmFsc2UsIGJ5aG91ciwgYnltaW51dGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChlbXB0eShieWhvdXIpIHx8IGluY2x1ZGVzKGJ5aG91ciwgdGhpcy5ob3VyKSkgJiZcbiAgICAgICAgICAgICAgICAoZW1wdHkoYnltaW51dGUpIHx8IGluY2x1ZGVzKGJ5bWludXRlLCB0aGlzLm1pbnV0ZSkpICYmXG4gICAgICAgICAgICAgICAgKGVtcHR5KGJ5c2Vjb25kKSB8fCBpbmNsdWRlcyhieXNlY29uZCwgdGhpcy5zZWNvbmQpKSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBEYXRlVGltZS5wcm90b3R5cGUuZml4RGF5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5kYXkgPD0gMjgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGF5c2lubW9udGggPSBkYXRldXRpbC5tb250aFJhbmdlKHRoaXMueWVhciwgdGhpcy5tb250aCAtIDEpWzFdO1xuICAgICAgICBpZiAodGhpcy5kYXkgPD0gZGF5c2lubW9udGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAodGhpcy5kYXkgPiBkYXlzaW5tb250aCkge1xuICAgICAgICAgICAgdGhpcy5kYXkgLT0gZGF5c2lubW9udGg7XG4gICAgICAgICAgICArK3RoaXMubW9udGg7XG4gICAgICAgICAgICBpZiAodGhpcy5tb250aCA9PT0gMTMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1vbnRoID0gMTtcbiAgICAgICAgICAgICAgICArK3RoaXMueWVhcjtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy55ZWFyID4gZGF0ZXV0aWwuTUFYWUVBUikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGF5c2lubW9udGggPSBkYXRldXRpbC5tb250aFJhbmdlKHRoaXMueWVhciwgdGhpcy5tb250aCAtIDEpWzFdO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBEYXRlVGltZS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKG9wdGlvbnMsIGZpbHRlcmVkKSB7XG4gICAgICAgIHZhciBmcmVxID0gb3B0aW9ucy5mcmVxLCBpbnRlcnZhbCA9IG9wdGlvbnMuaW50ZXJ2YWwsIHdrc3QgPSBvcHRpb25zLndrc3QsIGJ5aG91ciA9IG9wdGlvbnMuYnlob3VyLCBieW1pbnV0ZSA9IG9wdGlvbnMuYnltaW51dGUsIGJ5c2Vjb25kID0gb3B0aW9ucy5ieXNlY29uZDtcbiAgICAgICAgc3dpdGNoIChmcmVxKSB7XG4gICAgICAgICAgICBjYXNlIEZyZXF1ZW5jeS5ZRUFSTFk6IHJldHVybiB0aGlzLmFkZFllYXJzKGludGVydmFsKTtcbiAgICAgICAgICAgIGNhc2UgRnJlcXVlbmN5Lk1PTlRITFk6IHJldHVybiB0aGlzLmFkZE1vbnRocyhpbnRlcnZhbCk7XG4gICAgICAgICAgICBjYXNlIEZyZXF1ZW5jeS5XRUVLTFk6IHJldHVybiB0aGlzLmFkZFdlZWtseShpbnRlcnZhbCwgd2tzdCk7XG4gICAgICAgICAgICBjYXNlIEZyZXF1ZW5jeS5EQUlMWTogcmV0dXJuIHRoaXMuYWRkRGFpbHkoaW50ZXJ2YWwpO1xuICAgICAgICAgICAgY2FzZSBGcmVxdWVuY3kuSE9VUkxZOiByZXR1cm4gdGhpcy5hZGRIb3VycyhpbnRlcnZhbCwgZmlsdGVyZWQsIGJ5aG91cik7XG4gICAgICAgICAgICBjYXNlIEZyZXF1ZW5jeS5NSU5VVEVMWTogcmV0dXJuIHRoaXMuYWRkTWludXRlcyhpbnRlcnZhbCwgZmlsdGVyZWQsIGJ5aG91ciwgYnltaW51dGUpO1xuICAgICAgICAgICAgY2FzZSBGcmVxdWVuY3kuU0VDT05ETFk6IHJldHVybiB0aGlzLmFkZFNlY29uZHMoaW50ZXJ2YWwsIGZpbHRlcmVkLCBieWhvdXIsIGJ5bWludXRlLCBieXNlY29uZCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBEYXRlVGltZTtcbn0oVGltZSkpO1xuZXhwb3J0IHsgRGF0ZVRpbWUgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGV0aW1lLmpzLm1hcCIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBmcmVxSXNEYWlseU9yR3JlYXRlciB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgaW5jbHVkZXMsIG5vdEVtcHR5LCBpc1ByZXNlbnQsIGlzTnVtYmVyLCBpc0FycmF5LCBpc1dlZWtkYXlTdHIgfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IFJSdWxlLCB7IGRlZmF1bHRLZXlzLCBERUZBVUxUX09QVElPTlMgfSBmcm9tICcuL3JydWxlJztcbmltcG9ydCBkYXRldXRpbCBmcm9tICcuL2RhdGV1dGlsJztcbmltcG9ydCB7IFdlZWtkYXkgfSBmcm9tICcuL3dlZWtkYXknO1xuaW1wb3J0IHsgVGltZSB9IGZyb20gJy4vZGF0ZXRpbWUnO1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxpemVPcHRpb25zKG9wdGlvbnMpIHtcbiAgICB2YXIgaW52YWxpZCA9IFtdO1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob3B0aW9ucyk7XG4gICAgLy8gU2hhbGxvdyBjb3B5IGZvciBvcHRpb25zIGFuZCBvcmlnT3B0aW9ucyBhbmQgY2hlY2sgZm9yIGludmFsaWRcbiAgICBmb3IgKHZhciBfaSA9IDAsIGtleXNfMSA9IGtleXM7IF9pIDwga2V5c18xLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YXIga2V5ID0ga2V5c18xW19pXTtcbiAgICAgICAgaWYgKCFpbmNsdWRlcyhkZWZhdWx0S2V5cywga2V5KSlcbiAgICAgICAgICAgIGludmFsaWQucHVzaChrZXkpO1xuICAgICAgICBpZiAoZGF0ZXV0aWwuaXNEYXRlKG9wdGlvbnNba2V5XSkgJiYgIWRhdGV1dGlsLmlzVmFsaWREYXRlKG9wdGlvbnNba2V5XSkpXG4gICAgICAgICAgICBpbnZhbGlkLnB1c2goa2V5KTtcbiAgICB9XG4gICAgaWYgKGludmFsaWQubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBvcHRpb25zOiAnICsgaW52YWxpZC5qb2luKCcsICcpKTtcbiAgICB9XG4gICAgcmV0dXJuIF9fYXNzaWduKHt9LCBvcHRpb25zKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU9wdGlvbnMob3B0aW9ucykge1xuICAgIHZhciBvcHRzID0gX19hc3NpZ24oX19hc3NpZ24oe30sIERFRkFVTFRfT1BUSU9OUyksIGluaXRpYWxpemVPcHRpb25zKG9wdGlvbnMpKTtcbiAgICBpZiAoaXNQcmVzZW50KG9wdHMuYnllYXN0ZXIpKVxuICAgICAgICBvcHRzLmZyZXEgPSBSUnVsZS5ZRUFSTFk7XG4gICAgaWYgKCEoaXNQcmVzZW50KG9wdHMuZnJlcSkgJiYgUlJ1bGUuRlJFUVVFTkNJRVNbb3B0cy5mcmVxXSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBmcmVxdWVuY3k6IFwiICsgb3B0cy5mcmVxICsgXCIgXCIgKyBvcHRpb25zLmZyZXEpO1xuICAgIH1cbiAgICBpZiAoIW9wdHMuZHRzdGFydClcbiAgICAgICAgb3B0cy5kdHN0YXJ0ID0gbmV3IERhdGUobmV3IERhdGUoKS5zZXRNaWxsaXNlY29uZHMoMCkpO1xuICAgIGlmICghaXNQcmVzZW50KG9wdHMud2tzdCkpIHtcbiAgICAgICAgb3B0cy53a3N0ID0gUlJ1bGUuTU8ud2Vla2RheTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNOdW1iZXIob3B0cy53a3N0KSkge1xuICAgICAgICAvLyBjb29sLCBqdXN0IGtlZXAgaXQgbGlrZSB0aGF0XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBvcHRzLndrc3QgPSBvcHRzLndrc3Qud2Vla2RheTtcbiAgICB9XG4gICAgaWYgKGlzUHJlc2VudChvcHRzLmJ5c2V0cG9zKSkge1xuICAgICAgICBpZiAoaXNOdW1iZXIob3B0cy5ieXNldHBvcykpXG4gICAgICAgICAgICBvcHRzLmJ5c2V0cG9zID0gW29wdHMuYnlzZXRwb3NdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9wdHMuYnlzZXRwb3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciB2ID0gb3B0cy5ieXNldHBvc1tpXTtcbiAgICAgICAgICAgIGlmICh2ID09PSAwIHx8ICEodiA+PSAtMzY2ICYmIHYgPD0gMzY2KSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignYnlzZXRwb3MgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDM2NiwnICsgJyBvciBiZXR3ZWVuIC0zNjYgYW5kIC0xJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCEoQm9vbGVhbihvcHRzLmJ5d2Vla25vKSB8fFxuICAgICAgICBub3RFbXB0eShvcHRzLmJ5d2Vla25vKSB8fFxuICAgICAgICBub3RFbXB0eShvcHRzLmJ5eWVhcmRheSkgfHxcbiAgICAgICAgQm9vbGVhbihvcHRzLmJ5bW9udGhkYXkpIHx8XG4gICAgICAgIG5vdEVtcHR5KG9wdHMuYnltb250aGRheSkgfHxcbiAgICAgICAgaXNQcmVzZW50KG9wdHMuYnl3ZWVrZGF5KSB8fFxuICAgICAgICBpc1ByZXNlbnQob3B0cy5ieWVhc3RlcikpKSB7XG4gICAgICAgIHN3aXRjaCAob3B0cy5mcmVxKSB7XG4gICAgICAgICAgICBjYXNlIFJSdWxlLllFQVJMWTpcbiAgICAgICAgICAgICAgICBpZiAoIW9wdHMuYnltb250aClcbiAgICAgICAgICAgICAgICAgICAgb3B0cy5ieW1vbnRoID0gb3B0cy5kdHN0YXJ0LmdldFVUQ01vbnRoKCkgKyAxO1xuICAgICAgICAgICAgICAgIG9wdHMuYnltb250aGRheSA9IG9wdHMuZHRzdGFydC5nZXRVVENEYXRlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFJSdWxlLk1PTlRITFk6XG4gICAgICAgICAgICAgICAgb3B0cy5ieW1vbnRoZGF5ID0gb3B0cy5kdHN0YXJ0LmdldFVUQ0RhdGUoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUlJ1bGUuV0VFS0xZOlxuICAgICAgICAgICAgICAgIG9wdHMuYnl3ZWVrZGF5ID0gW2RhdGV1dGlsLmdldFdlZWtkYXkob3B0cy5kdHN0YXJ0KV07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gYnltb250aFxuICAgIGlmIChpc1ByZXNlbnQob3B0cy5ieW1vbnRoKSAmJiAhaXNBcnJheShvcHRzLmJ5bW9udGgpKSB7XG4gICAgICAgIG9wdHMuYnltb250aCA9IFtvcHRzLmJ5bW9udGhdO1xuICAgIH1cbiAgICAvLyBieXllYXJkYXlcbiAgICBpZiAoaXNQcmVzZW50KG9wdHMuYnl5ZWFyZGF5KSAmJlxuICAgICAgICAhaXNBcnJheShvcHRzLmJ5eWVhcmRheSkgJiZcbiAgICAgICAgaXNOdW1iZXIob3B0cy5ieXllYXJkYXkpKSB7XG4gICAgICAgIG9wdHMuYnl5ZWFyZGF5ID0gW29wdHMuYnl5ZWFyZGF5XTtcbiAgICB9XG4gICAgLy8gYnltb250aGRheVxuICAgIGlmICghaXNQcmVzZW50KG9wdHMuYnltb250aGRheSkpIHtcbiAgICAgICAgb3B0cy5ieW1vbnRoZGF5ID0gW107XG4gICAgICAgIG9wdHMuYnlubW9udGhkYXkgPSBbXTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNBcnJheShvcHRzLmJ5bW9udGhkYXkpKSB7XG4gICAgICAgIHZhciBieW1vbnRoZGF5ID0gW107XG4gICAgICAgIHZhciBieW5tb250aGRheSA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9wdHMuYnltb250aGRheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHYgPSBvcHRzLmJ5bW9udGhkYXlbaV07XG4gICAgICAgICAgICBpZiAodiA+IDApIHtcbiAgICAgICAgICAgICAgICBieW1vbnRoZGF5LnB1c2godik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2IDwgMCkge1xuICAgICAgICAgICAgICAgIGJ5bm1vbnRoZGF5LnB1c2godik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgb3B0cy5ieW1vbnRoZGF5ID0gYnltb250aGRheTtcbiAgICAgICAgb3B0cy5ieW5tb250aGRheSA9IGJ5bm1vbnRoZGF5O1xuICAgIH1cbiAgICBlbHNlIGlmIChvcHRzLmJ5bW9udGhkYXkgPCAwKSB7XG4gICAgICAgIG9wdHMuYnlubW9udGhkYXkgPSBbb3B0cy5ieW1vbnRoZGF5XTtcbiAgICAgICAgb3B0cy5ieW1vbnRoZGF5ID0gW107XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBvcHRzLmJ5bm1vbnRoZGF5ID0gW107XG4gICAgICAgIG9wdHMuYnltb250aGRheSA9IFtvcHRzLmJ5bW9udGhkYXldO1xuICAgIH1cbiAgICAvLyBieXdlZWtub1xuICAgIGlmIChpc1ByZXNlbnQob3B0cy5ieXdlZWtubykgJiYgIWlzQXJyYXkob3B0cy5ieXdlZWtubykpIHtcbiAgICAgICAgb3B0cy5ieXdlZWtubyA9IFtvcHRzLmJ5d2Vla25vXTtcbiAgICB9XG4gICAgLy8gYnl3ZWVrZGF5IC8gYnlud2Vla2RheVxuICAgIGlmICghaXNQcmVzZW50KG9wdHMuYnl3ZWVrZGF5KSkge1xuICAgICAgICBvcHRzLmJ5bndlZWtkYXkgPSBudWxsO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc051bWJlcihvcHRzLmJ5d2Vla2RheSkpIHtcbiAgICAgICAgb3B0cy5ieXdlZWtkYXkgPSBbb3B0cy5ieXdlZWtkYXldO1xuICAgICAgICBvcHRzLmJ5bndlZWtkYXkgPSBudWxsO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc1dlZWtkYXlTdHIob3B0cy5ieXdlZWtkYXkpKSB7XG4gICAgICAgIG9wdHMuYnl3ZWVrZGF5ID0gW1dlZWtkYXkuZnJvbVN0cihvcHRzLmJ5d2Vla2RheSkud2Vla2RheV07XG4gICAgICAgIG9wdHMuYnlud2Vla2RheSA9IG51bGw7XG4gICAgfVxuICAgIGVsc2UgaWYgKG9wdHMuYnl3ZWVrZGF5IGluc3RhbmNlb2YgV2Vla2RheSkge1xuICAgICAgICBpZiAoIW9wdHMuYnl3ZWVrZGF5Lm4gfHwgb3B0cy5mcmVxID4gUlJ1bGUuTU9OVEhMWSkge1xuICAgICAgICAgICAgb3B0cy5ieXdlZWtkYXkgPSBbb3B0cy5ieXdlZWtkYXkud2Vla2RheV07XG4gICAgICAgICAgICBvcHRzLmJ5bndlZWtkYXkgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb3B0cy5ieW53ZWVrZGF5ID0gW1tvcHRzLmJ5d2Vla2RheS53ZWVrZGF5LCBvcHRzLmJ5d2Vla2RheS5uXV07XG4gICAgICAgICAgICBvcHRzLmJ5d2Vla2RheSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHZhciBieXdlZWtkYXkgPSBbXTtcbiAgICAgICAgdmFyIGJ5bndlZWtkYXkgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcHRzLmJ5d2Vla2RheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHdkYXkgPSBvcHRzLmJ5d2Vla2RheVtpXTtcbiAgICAgICAgICAgIGlmIChpc051bWJlcih3ZGF5KSkge1xuICAgICAgICAgICAgICAgIGJ5d2Vla2RheS5wdXNoKHdkYXkpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNXZWVrZGF5U3RyKHdkYXkpKSB7XG4gICAgICAgICAgICAgICAgYnl3ZWVrZGF5LnB1c2goV2Vla2RheS5mcm9tU3RyKHdkYXkpLndlZWtkYXkpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF3ZGF5Lm4gfHwgb3B0cy5mcmVxID4gUlJ1bGUuTU9OVEhMWSkge1xuICAgICAgICAgICAgICAgIGJ5d2Vla2RheS5wdXNoKHdkYXkud2Vla2RheSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBieW53ZWVrZGF5LnB1c2goW3dkYXkud2Vla2RheSwgd2RheS5uXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgb3B0cy5ieXdlZWtkYXkgPSBub3RFbXB0eShieXdlZWtkYXkpID8gYnl3ZWVrZGF5IDogbnVsbDtcbiAgICAgICAgb3B0cy5ieW53ZWVrZGF5ID0gbm90RW1wdHkoYnlud2Vla2RheSkgPyBieW53ZWVrZGF5IDogbnVsbDtcbiAgICB9XG4gICAgLy8gYnlob3VyXG4gICAgaWYgKCFpc1ByZXNlbnQob3B0cy5ieWhvdXIpKSB7XG4gICAgICAgIG9wdHMuYnlob3VyID1cbiAgICAgICAgICAgIG9wdHMuZnJlcSA8IFJSdWxlLkhPVVJMWSA/IFtvcHRzLmR0c3RhcnQuZ2V0VVRDSG91cnMoKV0gOiBudWxsO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc051bWJlcihvcHRzLmJ5aG91cikpIHtcbiAgICAgICAgb3B0cy5ieWhvdXIgPSBbb3B0cy5ieWhvdXJdO1xuICAgIH1cbiAgICAvLyBieW1pbnV0ZVxuICAgIGlmICghaXNQcmVzZW50KG9wdHMuYnltaW51dGUpKSB7XG4gICAgICAgIG9wdHMuYnltaW51dGUgPVxuICAgICAgICAgICAgb3B0cy5mcmVxIDwgUlJ1bGUuTUlOVVRFTFkgPyBbb3B0cy5kdHN0YXJ0LmdldFVUQ01pbnV0ZXMoKV0gOiBudWxsO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc051bWJlcihvcHRzLmJ5bWludXRlKSkge1xuICAgICAgICBvcHRzLmJ5bWludXRlID0gW29wdHMuYnltaW51dGVdO1xuICAgIH1cbiAgICAvLyBieXNlY29uZFxuICAgIGlmICghaXNQcmVzZW50KG9wdHMuYnlzZWNvbmQpKSB7XG4gICAgICAgIG9wdHMuYnlzZWNvbmQgPVxuICAgICAgICAgICAgb3B0cy5mcmVxIDwgUlJ1bGUuU0VDT05ETFkgPyBbb3B0cy5kdHN0YXJ0LmdldFVUQ1NlY29uZHMoKV0gOiBudWxsO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc051bWJlcihvcHRzLmJ5c2Vjb25kKSkge1xuICAgICAgICBvcHRzLmJ5c2Vjb25kID0gW29wdHMuYnlzZWNvbmRdO1xuICAgIH1cbiAgICByZXR1cm4geyBwYXJzZWRPcHRpb25zOiBvcHRzIH07XG59XG5leHBvcnQgZnVuY3Rpb24gYnVpbGRUaW1lc2V0KG9wdHMpIHtcbiAgICB2YXIgbWlsbGlzZWNvbmRNb2R1bG8gPSBvcHRzLmR0c3RhcnQuZ2V0VGltZSgpICUgMTAwMDtcbiAgICBpZiAoIWZyZXFJc0RhaWx5T3JHcmVhdGVyKG9wdHMuZnJlcSkpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICB2YXIgdGltZXNldCA9IFtdO1xuICAgIG9wdHMuYnlob3VyLmZvckVhY2goZnVuY3Rpb24gKGhvdXIpIHtcbiAgICAgICAgb3B0cy5ieW1pbnV0ZS5mb3JFYWNoKGZ1bmN0aW9uIChtaW51dGUpIHtcbiAgICAgICAgICAgIG9wdHMuYnlzZWNvbmQuZm9yRWFjaChmdW5jdGlvbiAoc2Vjb25kKSB7XG4gICAgICAgICAgICAgICAgdGltZXNldC5wdXNoKG5ldyBUaW1lKGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZE1vZHVsbykpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiB0aW1lc2V0O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGFyc2VvcHRpb25zLmpzLm1hcCIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBGcmVxdWVuY3kgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IFdlZWtkYXkgfSBmcm9tICcuL3dlZWtkYXknO1xuaW1wb3J0IGRhdGV1dGlsIGZyb20gJy4vZGF0ZXV0aWwnO1xuaW1wb3J0IHsgRGF5cyB9IGZyb20gJy4vcnJ1bGUnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU3RyaW5nKHJmY1N0cmluZykge1xuICAgIHZhciBvcHRpb25zID0gcmZjU3RyaW5nLnNwbGl0KCdcXG4nKS5tYXAocGFyc2VMaW5lKS5maWx0ZXIoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHggIT09IG51bGw7IH0pO1xuICAgIHJldHVybiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgb3B0aW9uc1swXSksIG9wdGlvbnNbMV0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRHRzdGFydChsaW5lKSB7XG4gICAgdmFyIG9wdGlvbnMgPSB7fTtcbiAgICB2YXIgZHRzdGFydFdpdGhab25lID0gL0RUU1RBUlQoPzo7VFpJRD0oW146PV0rPykpPyg/Ojp8PSkoW147XFxzXSspL2kuZXhlYyhsaW5lKTtcbiAgICBpZiAoIWR0c3RhcnRXaXRoWm9uZSkge1xuICAgICAgICByZXR1cm4gb3B0aW9ucztcbiAgICB9XG4gICAgdmFyIF8gPSBkdHN0YXJ0V2l0aFpvbmVbMF0sIHR6aWQgPSBkdHN0YXJ0V2l0aFpvbmVbMV0sIGR0c3RhcnQgPSBkdHN0YXJ0V2l0aFpvbmVbMl07XG4gICAgaWYgKHR6aWQpIHtcbiAgICAgICAgb3B0aW9ucy50emlkID0gdHppZDtcbiAgICB9XG4gICAgb3B0aW9ucy5kdHN0YXJ0ID0gZGF0ZXV0aWwudW50aWxTdHJpbmdUb0RhdGUoZHRzdGFydCk7XG4gICAgcmV0dXJuIG9wdGlvbnM7XG59XG5mdW5jdGlvbiBwYXJzZUxpbmUocmZjU3RyaW5nKSB7XG4gICAgcmZjU3RyaW5nID0gcmZjU3RyaW5nLnJlcGxhY2UoL15cXHMrfFxccyskLywgJycpO1xuICAgIGlmICghcmZjU3RyaW5nLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgdmFyIGhlYWRlciA9IC9eKFtBLVpdKz8pWzo7XS8uZXhlYyhyZmNTdHJpbmcudG9VcHBlckNhc2UoKSk7XG4gICAgaWYgKCFoZWFkZXIpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlUnJ1bGUocmZjU3RyaW5nKTtcbiAgICB9XG4gICAgdmFyIF8gPSBoZWFkZXJbMF0sIGtleSA9IGhlYWRlclsxXTtcbiAgICBzd2l0Y2ggKGtleS50b1VwcGVyQ2FzZSgpKSB7XG4gICAgICAgIGNhc2UgJ1JSVUxFJzpcbiAgICAgICAgY2FzZSAnRVhSVUxFJzpcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVJydWxlKHJmY1N0cmluZyk7XG4gICAgICAgIGNhc2UgJ0RUU1RBUlQnOlxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlRHRzdGFydChyZmNTdHJpbmcpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgUkZDIHByb3AgXCIgKyBrZXkgKyBcIiBpbiBcIiArIHJmY1N0cmluZyk7XG4gICAgfVxufVxuZnVuY3Rpb24gcGFyc2VScnVsZShsaW5lKSB7XG4gICAgdmFyIHN0cmlwcGVkTGluZSA9IGxpbmUucmVwbGFjZSgvXlJSVUxFOi9pLCAnJyk7XG4gICAgdmFyIG9wdGlvbnMgPSBwYXJzZUR0c3RhcnQoc3RyaXBwZWRMaW5lKTtcbiAgICB2YXIgYXR0cnMgPSBsaW5lLnJlcGxhY2UoL14oPzpSUlVMRXxFWFJVTEUpOi9pLCAnJykuc3BsaXQoJzsnKTtcbiAgICBhdHRycy5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyKSB7XG4gICAgICAgIHZhciBfYSA9IGF0dHIuc3BsaXQoJz0nKSwga2V5ID0gX2FbMF0sIHZhbHVlID0gX2FbMV07XG4gICAgICAgIHN3aXRjaCAoa2V5LnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIGNhc2UgJ0ZSRVEnOlxuICAgICAgICAgICAgICAgIG9wdGlvbnMuZnJlcSA9IEZyZXF1ZW5jeVt2YWx1ZS50b1VwcGVyQ2FzZSgpXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ1dLU1QnOlxuICAgICAgICAgICAgICAgIG9wdGlvbnMud2tzdCA9IERheXNbdmFsdWUudG9VcHBlckNhc2UoKV07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdDT1VOVCc6XG4gICAgICAgICAgICBjYXNlICdJTlRFUlZBTCc6XG4gICAgICAgICAgICBjYXNlICdCWVNFVFBPUyc6XG4gICAgICAgICAgICBjYXNlICdCWU1PTlRIJzpcbiAgICAgICAgICAgIGNhc2UgJ0JZTU9OVEhEQVknOlxuICAgICAgICAgICAgY2FzZSAnQllZRUFSREFZJzpcbiAgICAgICAgICAgIGNhc2UgJ0JZV0VFS05PJzpcbiAgICAgICAgICAgIGNhc2UgJ0JZSE9VUic6XG4gICAgICAgICAgICBjYXNlICdCWU1JTlVURSc6XG4gICAgICAgICAgICBjYXNlICdCWVNFQ09ORCc6XG4gICAgICAgICAgICAgICAgdmFyIG51bSA9IHBhcnNlTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uS2V5ID0ga2V5LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIG9wdGlvbnNbb3B0aW9uS2V5XSA9IG51bTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0JZV0VFS0RBWSc6XG4gICAgICAgICAgICBjYXNlICdCWURBWSc6XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5ieXdlZWtkYXkgPSBwYXJzZVdlZWtkYXkodmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnRFRTVEFSVCc6XG4gICAgICAgICAgICBjYXNlICdUWklEJzpcbiAgICAgICAgICAgICAgICAvLyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICAgICAgICAgICAgICB2YXIgZHRzdGFydCA9IHBhcnNlRHRzdGFydChsaW5lKTtcbiAgICAgICAgICAgICAgICBvcHRpb25zLnR6aWQgPSBkdHN0YXJ0LnR6aWQ7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5kdHN0YXJ0ID0gZHRzdGFydC5kdHN0YXJ0O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnVU5USUwnOlxuICAgICAgICAgICAgICAgIG9wdGlvbnMudW50aWwgPSBkYXRldXRpbC51bnRpbFN0cmluZ1RvRGF0ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdCWUVBU1RFUic6XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5ieWVhc3RlciA9IE51bWJlcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gUlJVTEUgcHJvcGVydHkgJ1wiICsga2V5ICsgXCInXCIpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG9wdGlvbnM7XG59XG5mdW5jdGlvbiBwYXJzZU51bWJlcih2YWx1ZSkge1xuICAgIGlmICh2YWx1ZS5pbmRleE9mKCcsJykgIT09IC0xKSB7XG4gICAgICAgIHZhciB2YWx1ZXMgPSB2YWx1ZS5zcGxpdCgnLCcpO1xuICAgICAgICByZXR1cm4gdmFsdWVzLm1hcChwYXJzZUluZGl2aWR1YWxOdW1iZXIpO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VJbmRpdmlkdWFsTnVtYmVyKHZhbHVlKTtcbn1cbmZ1bmN0aW9uIHBhcnNlSW5kaXZpZHVhbE51bWJlcih2YWx1ZSkge1xuICAgIGlmICgvXlsrLV0/XFxkKyQvLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG5mdW5jdGlvbiBwYXJzZVdlZWtkYXkodmFsdWUpIHtcbiAgICB2YXIgZGF5cyA9IHZhbHVlLnNwbGl0KCcsJyk7XG4gICAgcmV0dXJuIGRheXMubWFwKGZ1bmN0aW9uIChkYXkpIHtcbiAgICAgICAgaWYgKGRheS5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIC8vIE1PLCBUVSwgLi4uXG4gICAgICAgICAgICByZXR1cm4gRGF5c1tkYXldOyAvLyB3ZGF5IGluc3RhbmNlb2YgV2Vla2RheVxuICAgICAgICB9XG4gICAgICAgIC8vIC0xTU8sICszRlIsIDFTTywgMTNUVSAuLi5cbiAgICAgICAgdmFyIHBhcnRzID0gZGF5Lm1hdGNoKC9eKFsrLV0/XFxkezEsMn0pKFtBLVpdezJ9KSQvKTtcbiAgICAgICAgdmFyIG4gPSBOdW1iZXIocGFydHNbMV0pO1xuICAgICAgICB2YXIgd2RheXBhcnQgPSBwYXJ0c1syXTtcbiAgICAgICAgdmFyIHdkYXkgPSBEYXlzW3dkYXlwYXJ0XS53ZWVrZGF5O1xuICAgICAgICByZXR1cm4gbmV3IFdlZWtkYXkod2RheSwgbik7XG4gICAgfSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXJzZXN0cmluZy5qcy5tYXAiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbi8vIHRoZXNlIGFyZW4ndCByZWFsbHkgcHJpdmF0ZSwgYnV0IG5vciBhcmUgdGhleSByZWFsbHkgdXNlZnVsIHRvIGRvY3VtZW50XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgTHV4b25FcnJvciBleHRlbmRzIEVycm9yIHt9XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cblxuXG5jbGFzcyBJbnZhbGlkRGF0ZVRpbWVFcnJvciBleHRlbmRzIEx1eG9uRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihyZWFzb24pIHtcbiAgICBzdXBlcihgSW52YWxpZCBEYXRlVGltZTogJHtyZWFzb24udG9NZXNzYWdlKCl9YCk7XG4gIH1cblxufVxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cbmNsYXNzIEludmFsaWRJbnRlcnZhbEVycm9yIGV4dGVuZHMgTHV4b25FcnJvciB7XG4gIGNvbnN0cnVjdG9yKHJlYXNvbikge1xuICAgIHN1cGVyKGBJbnZhbGlkIEludGVydmFsOiAke3JlYXNvbi50b01lc3NhZ2UoKX1gKTtcbiAgfVxuXG59XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cblxuY2xhc3MgSW52YWxpZER1cmF0aW9uRXJyb3IgZXh0ZW5kcyBMdXhvbkVycm9yIHtcbiAgY29uc3RydWN0b3IocmVhc29uKSB7XG4gICAgc3VwZXIoYEludmFsaWQgRHVyYXRpb246ICR7cmVhc29uLnRvTWVzc2FnZSgpfWApO1xuICB9XG5cbn1cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG5jbGFzcyBDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvciBleHRlbmRzIEx1eG9uRXJyb3Ige31cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG5jbGFzcyBJbnZhbGlkVW5pdEVycm9yIGV4dGVuZHMgTHV4b25FcnJvciB7XG4gIGNvbnN0cnVjdG9yKHVuaXQpIHtcbiAgICBzdXBlcihgSW52YWxpZCB1bml0ICR7dW5pdH1gKTtcbiAgfVxuXG59XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cblxuY2xhc3MgSW52YWxpZEFyZ3VtZW50RXJyb3IgZXh0ZW5kcyBMdXhvbkVycm9yIHt9XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cblxuY2xhc3MgWm9uZUlzQWJzdHJhY3RFcnJvciBleHRlbmRzIEx1eG9uRXJyb3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIlpvbmUgaXMgYW4gYWJzdHJhY3QgY2xhc3NcIik7XG4gIH1cblxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IG4gPSBcIm51bWVyaWNcIixcbiAgICAgIHMgPSBcInNob3J0XCIsXG4gICAgICBsID0gXCJsb25nXCI7XG5jb25zdCBEQVRFX1NIT1JUID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbixcbiAgZGF5OiBuXG59O1xuY29uc3QgREFURV9NRUQgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBzLFxuICBkYXk6IG5cbn07XG5jb25zdCBEQVRFX01FRF9XSVRIX1dFRUtEQVkgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBzLFxuICBkYXk6IG4sXG4gIHdlZWtkYXk6IHNcbn07XG5jb25zdCBEQVRFX0ZVTEwgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBsLFxuICBkYXk6IG5cbn07XG5jb25zdCBEQVRFX0hVR0UgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBsLFxuICBkYXk6IG4sXG4gIHdlZWtkYXk6IGxcbn07XG5jb25zdCBUSU1FX1NJTVBMRSA9IHtcbiAgaG91cjogbixcbiAgbWludXRlOiBuXG59O1xuY29uc3QgVElNRV9XSVRIX1NFQ09ORFMgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbiAgc2Vjb25kOiBuXG59O1xuY29uc3QgVElNRV9XSVRIX1NIT1JUX09GRlNFVCA9IHtcbiAgaG91cjogbixcbiAgbWludXRlOiBuLFxuICBzZWNvbmQ6IG4sXG4gIHRpbWVab25lTmFtZTogc1xufTtcbmNvbnN0IFRJTUVfV0lUSF9MT05HX09GRlNFVCA9IHtcbiAgaG91cjogbixcbiAgbWludXRlOiBuLFxuICBzZWNvbmQ6IG4sXG4gIHRpbWVab25lTmFtZTogbFxufTtcbmNvbnN0IFRJTUVfMjRfU0lNUExFID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG4gIGhvdXIxMjogZmFsc2Vcbn07XG4vKipcbiAqIHtAbGluayB0b0xvY2FsZVN0cmluZ307IGZvcm1hdCBsaWtlICcwOTozMDoyMycsIGFsd2F5cyAyNC1ob3VyLlxuICovXG5cbmNvbnN0IFRJTUVfMjRfV0lUSF9TRUNPTkRTID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG4gIHNlY29uZDogbixcbiAgaG91cjEyOiBmYWxzZVxufTtcbi8qKlxuICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfTsgZm9ybWF0IGxpa2UgJzA5OjMwOjIzIEVEVCcsIGFsd2F5cyAyNC1ob3VyLlxuICovXG5cbmNvbnN0IFRJTUVfMjRfV0lUSF9TSE9SVF9PRkZTRVQgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbiAgc2Vjb25kOiBuLFxuICBob3VyMTI6IGZhbHNlLFxuICB0aW1lWm9uZU5hbWU6IHNcbn07XG4vKipcbiAqIHtAbGluayB0b0xvY2FsZVN0cmluZ307IGZvcm1hdCBsaWtlICcwOTozMDoyMyBFYXN0ZXJuIERheWxpZ2h0IFRpbWUnLCBhbHdheXMgMjQtaG91ci5cbiAqL1xuXG5jb25zdCBUSU1FXzI0X1dJVEhfTE9OR19PRkZTRVQgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbiAgc2Vjb25kOiBuLFxuICBob3VyMTI6IGZhbHNlLFxuICB0aW1lWm9uZU5hbWU6IGxcbn07XG4vKipcbiAqIHtAbGluayB0b0xvY2FsZVN0cmluZ307IGZvcm1hdCBsaWtlICcxMC8xNC8xOTgzLCA5OjMwIEFNJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gKi9cblxuY29uc3QgREFURVRJTUVfU0hPUlQgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBuLFxuICBkYXk6IG4sXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogblxufTtcbi8qKlxuICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfTsgZm9ybWF0IGxpa2UgJzEwLzE0LzE5ODMsIDk6MzA6MzMgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cbiAqL1xuXG5jb25zdCBEQVRFVElNRV9TSE9SVF9XSVRIX1NFQ09ORFMgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBuLFxuICBkYXk6IG4sXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbiAgc2Vjb25kOiBuXG59O1xuY29uc3QgREFURVRJTUVfTUVEID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogcyxcbiAgZGF5OiBuLFxuICBob3VyOiBuLFxuICBtaW51dGU6IG5cbn07XG5jb25zdCBEQVRFVElNRV9NRURfV0lUSF9TRUNPTkRTID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogcyxcbiAgZGF5OiBuLFxuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG4gIHNlY29uZDogblxufTtcbmNvbnN0IERBVEVUSU1FX01FRF9XSVRIX1dFRUtEQVkgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBzLFxuICBkYXk6IG4sXG4gIHdlZWtkYXk6IHMsXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogblxufTtcbmNvbnN0IERBVEVUSU1FX0ZVTEwgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBsLFxuICBkYXk6IG4sXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbiAgdGltZVpvbmVOYW1lOiBzXG59O1xuY29uc3QgREFURVRJTUVfRlVMTF9XSVRIX1NFQ09ORFMgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBsLFxuICBkYXk6IG4sXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbiAgc2Vjb25kOiBuLFxuICB0aW1lWm9uZU5hbWU6IHNcbn07XG5jb25zdCBEQVRFVElNRV9IVUdFID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbCxcbiAgZGF5OiBuLFxuICB3ZWVrZGF5OiBsLFxuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG4gIHRpbWVab25lTmFtZTogbFxufTtcbmNvbnN0IERBVEVUSU1FX0hVR0VfV0lUSF9TRUNPTkRTID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbCxcbiAgZGF5OiBuLFxuICB3ZWVrZGF5OiBsLFxuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG4gIHNlY29uZDogbixcbiAgdGltZVpvbmVOYW1lOiBsXG59O1xuXG4vKlxuICBUaGlzIGlzIGp1c3QgYSBqdW5rIGRyYXdlciwgY29udGFpbmluZyBhbnl0aGluZyB1c2VkIGFjcm9zcyBtdWx0aXBsZSBjbGFzc2VzLlxuICBCZWNhdXNlIEx1eG9uIGlzIHNtYWxsKGlzaCksIHRoaXMgc2hvdWxkIHN0YXkgc21hbGwgYW5kIHdlIHdvbid0IHdvcnJ5IGFib3V0IHNwbGl0dGluZ1xuICBpdCB1cCBpbnRvLCBzYXksIHBhcnNpbmdVdGlsLmpzIGFuZCBiYXNpY1V0aWwuanMgYW5kIHNvIG9uLiBCdXQgdGhleSBhcmUgZGl2aWRlZCB1cCBieSBmZWF0dXJlIGFyZWEuXG4qL1xuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG4vLyBUWVBFU1xuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChvKSB7XG4gIHJldHVybiB0eXBlb2YgbyA9PT0gXCJ1bmRlZmluZWRcIjtcbn1cbmZ1bmN0aW9uIGlzTnVtYmVyKG8pIHtcbiAgcmV0dXJuIHR5cGVvZiBvID09PSBcIm51bWJlclwiO1xufVxuZnVuY3Rpb24gaXNJbnRlZ2VyKG8pIHtcbiAgcmV0dXJuIHR5cGVvZiBvID09PSBcIm51bWJlclwiICYmIG8gJSAxID09PSAwO1xufVxuZnVuY3Rpb24gaXNTdHJpbmcobykge1xuICByZXR1cm4gdHlwZW9mIG8gPT09IFwic3RyaW5nXCI7XG59XG5mdW5jdGlvbiBpc0RhdGUobykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pID09PSBcIltvYmplY3QgRGF0ZV1cIjtcbn0gLy8gQ0FQQUJJTElUSUVTXG5cbmZ1bmN0aW9uIGhhc0ludGwoKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHR5cGVvZiBJbnRsICE9PSBcInVuZGVmaW5lZFwiICYmIEludGwuRGF0ZVRpbWVGb3JtYXQ7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIGhhc0Zvcm1hdFRvUGFydHMoKSB7XG4gIHJldHVybiAhaXNVbmRlZmluZWQoSW50bC5EYXRlVGltZUZvcm1hdC5wcm90b3R5cGUuZm9ybWF0VG9QYXJ0cyk7XG59XG5mdW5jdGlvbiBoYXNSZWxhdGl2ZSgpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gdHlwZW9mIEludGwgIT09IFwidW5kZWZpbmVkXCIgJiYgISFJbnRsLlJlbGF0aXZlVGltZUZvcm1hdDtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufSAvLyBPQkpFQ1RTIEFORCBBUlJBWVNcblxuZnVuY3Rpb24gbWF5YmVBcnJheSh0aGluZykge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh0aGluZykgPyB0aGluZyA6IFt0aGluZ107XG59XG5mdW5jdGlvbiBiZXN0QnkoYXJyLCBieSwgY29tcGFyZSkge1xuICBpZiAoYXJyLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4gYXJyLnJlZHVjZSgoYmVzdCwgbmV4dCkgPT4ge1xuICAgIGNvbnN0IHBhaXIgPSBbYnkobmV4dCksIG5leHRdO1xuXG4gICAgaWYgKCFiZXN0KSB7XG4gICAgICByZXR1cm4gcGFpcjtcbiAgICB9IGVsc2UgaWYgKGNvbXBhcmUoYmVzdFswXSwgcGFpclswXSkgPT09IGJlc3RbMF0pIHtcbiAgICAgIHJldHVybiBiZXN0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcGFpcjtcbiAgICB9XG4gIH0sIG51bGwpWzFdO1xufVxuZnVuY3Rpb24gcGljayhvYmosIGtleXMpIHtcbiAgcmV0dXJuIGtleXMucmVkdWNlKChhLCBrKSA9PiB7XG4gICAgYVtrXSA9IG9ialtrXTtcbiAgICByZXR1cm4gYTtcbiAgfSwge30pO1xufVxuZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn0gLy8gTlVNQkVSUyBBTkQgU1RSSU5HU1xuXG5mdW5jdGlvbiBpbnRlZ2VyQmV0d2Vlbih0aGluZywgYm90dG9tLCB0b3ApIHtcbiAgcmV0dXJuIGlzSW50ZWdlcih0aGluZykgJiYgdGhpbmcgPj0gYm90dG9tICYmIHRoaW5nIDw9IHRvcDtcbn0gLy8geCAlIG4gYnV0IHRha2VzIHRoZSBzaWduIG9mIG4gaW5zdGVhZCBvZiB4XG5cbmZ1bmN0aW9uIGZsb29yTW9kKHgsIG4pIHtcbiAgcmV0dXJuIHggLSBuICogTWF0aC5mbG9vcih4IC8gbik7XG59XG5mdW5jdGlvbiBwYWRTdGFydChpbnB1dCwgbiA9IDIpIHtcbiAgY29uc3QgbWludXMgPSBpbnB1dCA8IDAgPyBcIi1cIiA6IFwiXCI7XG4gIGNvbnN0IHRhcmdldCA9IG1pbnVzID8gaW5wdXQgKiAtMSA6IGlucHV0O1xuICBsZXQgcmVzdWx0O1xuXG4gIGlmICh0YXJnZXQudG9TdHJpbmcoKS5sZW5ndGggPCBuKSB7XG4gICAgcmVzdWx0ID0gKFwiMFwiLnJlcGVhdChuKSArIHRhcmdldCkuc2xpY2UoLW4pO1xuICB9IGVsc2Uge1xuICAgIHJlc3VsdCA9IHRhcmdldC50b1N0cmluZygpO1xuICB9XG5cbiAgcmV0dXJuIGAke21pbnVzfSR7cmVzdWx0fWA7XG59XG5mdW5jdGlvbiBwYXJzZUludGVnZXIoc3RyaW5nKSB7XG4gIGlmIChpc1VuZGVmaW5lZChzdHJpbmcpIHx8IHN0cmluZyA9PT0gbnVsbCB8fCBzdHJpbmcgPT09IFwiXCIpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBwYXJzZUludChzdHJpbmcsIDEwKTtcbiAgfVxufVxuZnVuY3Rpb24gcGFyc2VNaWxsaXMoZnJhY3Rpb24pIHtcbiAgLy8gUmV0dXJuIHVuZGVmaW5lZCAoaW5zdGVhZCBvZiAwKSBpbiB0aGVzZSBjYXNlcywgd2hlcmUgZnJhY3Rpb24gaXMgbm90IHNldFxuICBpZiAoaXNVbmRlZmluZWQoZnJhY3Rpb24pIHx8IGZyYWN0aW9uID09PSBudWxsIHx8IGZyYWN0aW9uID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBmID0gcGFyc2VGbG9hdChcIjAuXCIgKyBmcmFjdGlvbikgKiAxMDAwO1xuICAgIHJldHVybiBNYXRoLmZsb29yKGYpO1xuICB9XG59XG5mdW5jdGlvbiByb3VuZFRvKG51bWJlciwgZGlnaXRzLCB0b3dhcmRaZXJvID0gZmFsc2UpIHtcbiAgY29uc3QgZmFjdG9yID0gTWF0aC5wb3coMTAsIGRpZ2l0cyksXG4gICAgICAgIHJvdW5kZXIgPSB0b3dhcmRaZXJvID8gTWF0aC50cnVuYyA6IE1hdGgucm91bmQ7XG4gIHJldHVybiByb3VuZGVyKG51bWJlciAqIGZhY3RvcikgLyBmYWN0b3I7XG59IC8vIERBVEUgQkFTSUNTXG5cbmZ1bmN0aW9uIGlzTGVhcFllYXIoeWVhcikge1xuICByZXR1cm4geWVhciAlIDQgPT09IDAgJiYgKHllYXIgJSAxMDAgIT09IDAgfHwgeWVhciAlIDQwMCA9PT0gMCk7XG59XG5mdW5jdGlvbiBkYXlzSW5ZZWFyKHllYXIpIHtcbiAgcmV0dXJuIGlzTGVhcFllYXIoeWVhcikgPyAzNjYgOiAzNjU7XG59XG5mdW5jdGlvbiBkYXlzSW5Nb250aCh5ZWFyLCBtb250aCkge1xuICBjb25zdCBtb2RNb250aCA9IGZsb29yTW9kKG1vbnRoIC0gMSwgMTIpICsgMSxcbiAgICAgICAgbW9kWWVhciA9IHllYXIgKyAobW9udGggLSBtb2RNb250aCkgLyAxMjtcblxuICBpZiAobW9kTW9udGggPT09IDIpIHtcbiAgICByZXR1cm4gaXNMZWFwWWVhcihtb2RZZWFyKSA/IDI5IDogMjg7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFszMSwgbnVsbCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdW21vZE1vbnRoIC0gMV07XG4gIH1cbn0gLy8gY292ZXJ0IGEgY2FsZW5kYXIgb2JqZWN0IHRvIGEgbG9jYWwgdGltZXN0YW1wIChlcG9jaCwgYnV0IHdpdGggdGhlIG9mZnNldCBiYWtlZCBpbilcblxuZnVuY3Rpb24gb2JqVG9Mb2NhbFRTKG9iaikge1xuICBsZXQgZCA9IERhdGUuVVRDKG9iai55ZWFyLCBvYmoubW9udGggLSAxLCBvYmouZGF5LCBvYmouaG91ciwgb2JqLm1pbnV0ZSwgb2JqLnNlY29uZCwgb2JqLm1pbGxpc2Vjb25kKTsgLy8gZm9yIGxlZ2FjeSByZWFzb25zLCB5ZWFycyBiZXR3ZWVuIDAgYW5kIDk5IGFyZSBpbnRlcnByZXRlZCBhcyAxOVhYOyByZXZlcnQgdGhhdFxuXG4gIGlmIChvYmoueWVhciA8IDEwMCAmJiBvYmoueWVhciA+PSAwKSB7XG4gICAgZCA9IG5ldyBEYXRlKGQpO1xuICAgIGQuc2V0VVRDRnVsbFllYXIoZC5nZXRVVENGdWxsWWVhcigpIC0gMTkwMCk7XG4gIH1cblxuICByZXR1cm4gK2Q7XG59XG5mdW5jdGlvbiB3ZWVrc0luV2Vla1llYXIod2Vla1llYXIpIHtcbiAgY29uc3QgcDEgPSAod2Vla1llYXIgKyBNYXRoLmZsb29yKHdlZWtZZWFyIC8gNCkgLSBNYXRoLmZsb29yKHdlZWtZZWFyIC8gMTAwKSArIE1hdGguZmxvb3Iod2Vla1llYXIgLyA0MDApKSAlIDcsXG4gICAgICAgIGxhc3QgPSB3ZWVrWWVhciAtIDEsXG4gICAgICAgIHAyID0gKGxhc3QgKyBNYXRoLmZsb29yKGxhc3QgLyA0KSAtIE1hdGguZmxvb3IobGFzdCAvIDEwMCkgKyBNYXRoLmZsb29yKGxhc3QgLyA0MDApKSAlIDc7XG4gIHJldHVybiBwMSA9PT0gNCB8fCBwMiA9PT0gMyA/IDUzIDogNTI7XG59XG5mdW5jdGlvbiB1bnRydW5jYXRlWWVhcih5ZWFyKSB7XG4gIGlmICh5ZWFyID4gOTkpIHtcbiAgICByZXR1cm4geWVhcjtcbiAgfSBlbHNlIHJldHVybiB5ZWFyID4gNjAgPyAxOTAwICsgeWVhciA6IDIwMDAgKyB5ZWFyO1xufSAvLyBQQVJTSU5HXG5cbmZ1bmN0aW9uIHBhcnNlWm9uZUluZm8odHMsIG9mZnNldEZvcm1hdCwgbG9jYWxlLCB0aW1lWm9uZSA9IG51bGwpIHtcbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHRzKSxcbiAgICAgICAgaW50bE9wdHMgPSB7XG4gICAgaG91cjEyOiBmYWxzZSxcbiAgICB5ZWFyOiBcIm51bWVyaWNcIixcbiAgICBtb250aDogXCIyLWRpZ2l0XCIsXG4gICAgZGF5OiBcIjItZGlnaXRcIixcbiAgICBob3VyOiBcIjItZGlnaXRcIixcbiAgICBtaW51dGU6IFwiMi1kaWdpdFwiXG4gIH07XG5cbiAgaWYgKHRpbWVab25lKSB7XG4gICAgaW50bE9wdHMudGltZVpvbmUgPSB0aW1lWm9uZTtcbiAgfVxuXG4gIGNvbnN0IG1vZGlmaWVkID0gT2JqZWN0LmFzc2lnbih7XG4gICAgdGltZVpvbmVOYW1lOiBvZmZzZXRGb3JtYXRcbiAgfSwgaW50bE9wdHMpLFxuICAgICAgICBpbnRsID0gaGFzSW50bCgpO1xuXG4gIGlmIChpbnRsICYmIGhhc0Zvcm1hdFRvUGFydHMoKSkge1xuICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxvY2FsZSwgbW9kaWZpZWQpLmZvcm1hdFRvUGFydHMoZGF0ZSkuZmluZChtID0+IG0udHlwZS50b0xvd2VyQ2FzZSgpID09PSBcInRpbWV6b25lbmFtZVwiKTtcbiAgICByZXR1cm4gcGFyc2VkID8gcGFyc2VkLnZhbHVlIDogbnVsbDtcbiAgfSBlbHNlIGlmIChpbnRsKSB7XG4gICAgLy8gdGhpcyBwcm9iYWJseSBkb2Vzbid0IHdvcmsgZm9yIGFsbCBsb2NhbGVzXG4gICAgY29uc3Qgd2l0aG91dCA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxvY2FsZSwgaW50bE9wdHMpLmZvcm1hdChkYXRlKSxcbiAgICAgICAgICBpbmNsdWRlZCA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxvY2FsZSwgbW9kaWZpZWQpLmZvcm1hdChkYXRlKSxcbiAgICAgICAgICBkaWZmZWQgPSBpbmNsdWRlZC5zdWJzdHJpbmcod2l0aG91dC5sZW5ndGgpLFxuICAgICAgICAgIHRyaW1tZWQgPSBkaWZmZWQucmVwbGFjZSgvXlssIFxcdTIwMGVdKy8sIFwiXCIpO1xuICAgIHJldHVybiB0cmltbWVkO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59IC8vIHNpZ25lZE9mZnNldCgnLTUnLCAnMzAnKSAtPiAtMzMwXG5cbmZ1bmN0aW9uIHNpZ25lZE9mZnNldChvZmZIb3VyU3RyLCBvZmZNaW51dGVTdHIpIHtcbiAgbGV0IG9mZkhvdXIgPSBwYXJzZUludChvZmZIb3VyU3RyLCAxMCk7IC8vIGRvbid0IHx8IHRoaXMgYmVjYXVzZSB3ZSB3YW50IHRvIHByZXNlcnZlIC0wXG5cbiAgaWYgKE51bWJlci5pc05hTihvZmZIb3VyKSkge1xuICAgIG9mZkhvdXIgPSAwO1xuICB9XG5cbiAgY29uc3Qgb2ZmTWluID0gcGFyc2VJbnQob2ZmTWludXRlU3RyLCAxMCkgfHwgMCxcbiAgICAgICAgb2ZmTWluU2lnbmVkID0gb2ZmSG91ciA8IDAgfHwgT2JqZWN0LmlzKG9mZkhvdXIsIC0wKSA/IC1vZmZNaW4gOiBvZmZNaW47XG4gIHJldHVybiBvZmZIb3VyICogNjAgKyBvZmZNaW5TaWduZWQ7XG59IC8vIENPRVJDSU9OXG5cbmZ1bmN0aW9uIGFzTnVtYmVyKHZhbHVlKSB7XG4gIGNvbnN0IG51bWVyaWNWYWx1ZSA9IE51bWJlcih2YWx1ZSk7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiIHx8IHZhbHVlID09PSBcIlwiIHx8IE51bWJlci5pc05hTihudW1lcmljVmFsdWUpKSB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoYEludmFsaWQgdW5pdCB2YWx1ZSAke3ZhbHVlfWApO1xuICByZXR1cm4gbnVtZXJpY1ZhbHVlO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplT2JqZWN0KG9iaiwgbm9ybWFsaXplciwgbm9uVW5pdEtleXMpIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHt9O1xuXG4gIGZvciAoY29uc3QgdSBpbiBvYmopIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkob2JqLCB1KSkge1xuICAgICAgaWYgKG5vblVuaXRLZXlzLmluZGV4T2YodSkgPj0gMCkgY29udGludWU7XG4gICAgICBjb25zdCB2ID0gb2JqW3VdO1xuICAgICAgaWYgKHYgPT09IHVuZGVmaW5lZCB8fCB2ID09PSBudWxsKSBjb250aW51ZTtcbiAgICAgIG5vcm1hbGl6ZWRbbm9ybWFsaXplcih1KV0gPSBhc051bWJlcih2KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cbmZ1bmN0aW9uIGZvcm1hdE9mZnNldChvZmZzZXQsIGZvcm1hdCkge1xuICBjb25zdCBob3VycyA9IE1hdGgudHJ1bmMoTWF0aC5hYnMob2Zmc2V0IC8gNjApKSxcbiAgICAgICAgbWludXRlcyA9IE1hdGgudHJ1bmMoTWF0aC5hYnMob2Zmc2V0ICUgNjApKSxcbiAgICAgICAgc2lnbiA9IG9mZnNldCA+PSAwID8gXCIrXCIgOiBcIi1cIjtcblxuICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgIGNhc2UgXCJzaG9ydFwiOlxuICAgICAgcmV0dXJuIGAke3NpZ259JHtwYWRTdGFydChob3VycywgMil9OiR7cGFkU3RhcnQobWludXRlcywgMil9YDtcblxuICAgIGNhc2UgXCJuYXJyb3dcIjpcbiAgICAgIHJldHVybiBgJHtzaWdufSR7aG91cnN9JHttaW51dGVzID4gMCA/IGA6JHttaW51dGVzfWAgOiBcIlwifWA7XG5cbiAgICBjYXNlIFwidGVjaGllXCI6XG4gICAgICByZXR1cm4gYCR7c2lnbn0ke3BhZFN0YXJ0KGhvdXJzLCAyKX0ke3BhZFN0YXJ0KG1pbnV0ZXMsIDIpfWA7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFZhbHVlIGZvcm1hdCAke2Zvcm1hdH0gaXMgb3V0IG9mIHJhbmdlIGZvciBwcm9wZXJ0eSBmb3JtYXRgKTtcbiAgfVxufVxuZnVuY3Rpb24gdGltZU9iamVjdChvYmopIHtcbiAgcmV0dXJuIHBpY2sob2JqLCBbXCJob3VyXCIsIFwibWludXRlXCIsIFwic2Vjb25kXCIsIFwibWlsbGlzZWNvbmRcIl0pO1xufVxuY29uc3QgaWFuYVJlZ2V4ID0gL1tBLVphLXpfKy1dezEsMjU2fSg6P1xcL1tBLVphLXpfKy1dezEsMjU2fShcXC9bQS1aYS16XystXXsxLDI1Nn0pPyk/LztcblxuZnVuY3Rpb24gc3RyaW5naWZ5KG9iaikge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob2JqLCBPYmplY3Qua2V5cyhvYmopLnNvcnQoKSk7XG59XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cblxuXG5jb25zdCBtb250aHNMb25nID0gW1wiSmFudWFyeVwiLCBcIkZlYnJ1YXJ5XCIsIFwiTWFyY2hcIiwgXCJBcHJpbFwiLCBcIk1heVwiLCBcIkp1bmVcIiwgXCJKdWx5XCIsIFwiQXVndXN0XCIsIFwiU2VwdGVtYmVyXCIsIFwiT2N0b2JlclwiLCBcIk5vdmVtYmVyXCIsIFwiRGVjZW1iZXJcIl07XG5jb25zdCBtb250aHNTaG9ydCA9IFtcIkphblwiLCBcIkZlYlwiLCBcIk1hclwiLCBcIkFwclwiLCBcIk1heVwiLCBcIkp1blwiLCBcIkp1bFwiLCBcIkF1Z1wiLCBcIlNlcFwiLCBcIk9jdFwiLCBcIk5vdlwiLCBcIkRlY1wiXTtcbmNvbnN0IG1vbnRoc05hcnJvdyA9IFtcIkpcIiwgXCJGXCIsIFwiTVwiLCBcIkFcIiwgXCJNXCIsIFwiSlwiLCBcIkpcIiwgXCJBXCIsIFwiU1wiLCBcIk9cIiwgXCJOXCIsIFwiRFwiXTtcbmZ1bmN0aW9uIG1vbnRocyhsZW5ndGgpIHtcbiAgc3dpdGNoIChsZW5ndGgpIHtcbiAgICBjYXNlIFwibmFycm93XCI6XG4gICAgICByZXR1cm4gbW9udGhzTmFycm93O1xuXG4gICAgY2FzZSBcInNob3J0XCI6XG4gICAgICByZXR1cm4gbW9udGhzU2hvcnQ7XG5cbiAgICBjYXNlIFwibG9uZ1wiOlxuICAgICAgcmV0dXJuIG1vbnRoc0xvbmc7XG5cbiAgICBjYXNlIFwibnVtZXJpY1wiOlxuICAgICAgcmV0dXJuIFtcIjFcIiwgXCIyXCIsIFwiM1wiLCBcIjRcIiwgXCI1XCIsIFwiNlwiLCBcIjdcIiwgXCI4XCIsIFwiOVwiLCBcIjEwXCIsIFwiMTFcIiwgXCIxMlwiXTtcblxuICAgIGNhc2UgXCIyLWRpZ2l0XCI6XG4gICAgICByZXR1cm4gW1wiMDFcIiwgXCIwMlwiLCBcIjAzXCIsIFwiMDRcIiwgXCIwNVwiLCBcIjA2XCIsIFwiMDdcIiwgXCIwOFwiLCBcIjA5XCIsIFwiMTBcIiwgXCIxMVwiLCBcIjEyXCJdO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG5jb25zdCB3ZWVrZGF5c0xvbmcgPSBbXCJNb25kYXlcIiwgXCJUdWVzZGF5XCIsIFwiV2VkbmVzZGF5XCIsIFwiVGh1cnNkYXlcIiwgXCJGcmlkYXlcIiwgXCJTYXR1cmRheVwiLCBcIlN1bmRheVwiXTtcbmNvbnN0IHdlZWtkYXlzU2hvcnQgPSBbXCJNb25cIiwgXCJUdWVcIiwgXCJXZWRcIiwgXCJUaHVcIiwgXCJGcmlcIiwgXCJTYXRcIiwgXCJTdW5cIl07XG5jb25zdCB3ZWVrZGF5c05hcnJvdyA9IFtcIk1cIiwgXCJUXCIsIFwiV1wiLCBcIlRcIiwgXCJGXCIsIFwiU1wiLCBcIlNcIl07XG5mdW5jdGlvbiB3ZWVrZGF5cyhsZW5ndGgpIHtcbiAgc3dpdGNoIChsZW5ndGgpIHtcbiAgICBjYXNlIFwibmFycm93XCI6XG4gICAgICByZXR1cm4gd2Vla2RheXNOYXJyb3c7XG5cbiAgICBjYXNlIFwic2hvcnRcIjpcbiAgICAgIHJldHVybiB3ZWVrZGF5c1Nob3J0O1xuXG4gICAgY2FzZSBcImxvbmdcIjpcbiAgICAgIHJldHVybiB3ZWVrZGF5c0xvbmc7XG5cbiAgICBjYXNlIFwibnVtZXJpY1wiOlxuICAgICAgcmV0dXJuIFtcIjFcIiwgXCIyXCIsIFwiM1wiLCBcIjRcIiwgXCI1XCIsIFwiNlwiLCBcIjdcIl07XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbmNvbnN0IG1lcmlkaWVtcyA9IFtcIkFNXCIsIFwiUE1cIl07XG5jb25zdCBlcmFzTG9uZyA9IFtcIkJlZm9yZSBDaHJpc3RcIiwgXCJBbm5vIERvbWluaVwiXTtcbmNvbnN0IGVyYXNTaG9ydCA9IFtcIkJDXCIsIFwiQURcIl07XG5jb25zdCBlcmFzTmFycm93ID0gW1wiQlwiLCBcIkFcIl07XG5mdW5jdGlvbiBlcmFzKGxlbmd0aCkge1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgXCJuYXJyb3dcIjpcbiAgICAgIHJldHVybiBlcmFzTmFycm93O1xuXG4gICAgY2FzZSBcInNob3J0XCI6XG4gICAgICByZXR1cm4gZXJhc1Nob3J0O1xuXG4gICAgY2FzZSBcImxvbmdcIjpcbiAgICAgIHJldHVybiBlcmFzTG9uZztcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuZnVuY3Rpb24gbWVyaWRpZW1Gb3JEYXRlVGltZShkdCkge1xuICByZXR1cm4gbWVyaWRpZW1zW2R0LmhvdXIgPCAxMiA/IDAgOiAxXTtcbn1cbmZ1bmN0aW9uIHdlZWtkYXlGb3JEYXRlVGltZShkdCwgbGVuZ3RoKSB7XG4gIHJldHVybiB3ZWVrZGF5cyhsZW5ndGgpW2R0LndlZWtkYXkgLSAxXTtcbn1cbmZ1bmN0aW9uIG1vbnRoRm9yRGF0ZVRpbWUoZHQsIGxlbmd0aCkge1xuICByZXR1cm4gbW9udGhzKGxlbmd0aClbZHQubW9udGggLSAxXTtcbn1cbmZ1bmN0aW9uIGVyYUZvckRhdGVUaW1lKGR0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGVyYXMobGVuZ3RoKVtkdC55ZWFyIDwgMCA/IDAgOiAxXTtcbn1cbmZ1bmN0aW9uIGZvcm1hdFJlbGF0aXZlVGltZSh1bml0LCBjb3VudCwgbnVtZXJpYyA9IFwiYWx3YXlzXCIsIG5hcnJvdyA9IGZhbHNlKSB7XG4gIGNvbnN0IHVuaXRzID0ge1xuICAgIHllYXJzOiBbXCJ5ZWFyXCIsIFwieXIuXCJdLFxuICAgIHF1YXJ0ZXJzOiBbXCJxdWFydGVyXCIsIFwicXRyLlwiXSxcbiAgICBtb250aHM6IFtcIm1vbnRoXCIsIFwibW8uXCJdLFxuICAgIHdlZWtzOiBbXCJ3ZWVrXCIsIFwid2suXCJdLFxuICAgIGRheXM6IFtcImRheVwiLCBcImRheVwiLCBcImRheXNcIl0sXG4gICAgaG91cnM6IFtcImhvdXJcIiwgXCJoci5cIl0sXG4gICAgbWludXRlczogW1wibWludXRlXCIsIFwibWluLlwiXSxcbiAgICBzZWNvbmRzOiBbXCJzZWNvbmRcIiwgXCJzZWMuXCJdXG4gIH07XG4gIGNvbnN0IGxhc3RhYmxlID0gW1wiaG91cnNcIiwgXCJtaW51dGVzXCIsIFwic2Vjb25kc1wiXS5pbmRleE9mKHVuaXQpID09PSAtMTtcblxuICBpZiAobnVtZXJpYyA9PT0gXCJhdXRvXCIgJiYgbGFzdGFibGUpIHtcbiAgICBjb25zdCBpc0RheSA9IHVuaXQgPT09IFwiZGF5c1wiO1xuXG4gICAgc3dpdGNoIChjb3VudCkge1xuICAgICAgY2FzZSAxOlxuICAgICAgICByZXR1cm4gaXNEYXkgPyBcInRvbW9ycm93XCIgOiBgbmV4dCAke3VuaXRzW3VuaXRdWzBdfWA7XG5cbiAgICAgIGNhc2UgLTE6XG4gICAgICAgIHJldHVybiBpc0RheSA/IFwieWVzdGVyZGF5XCIgOiBgbGFzdCAke3VuaXRzW3VuaXRdWzBdfWA7XG5cbiAgICAgIGNhc2UgMDpcbiAgICAgICAgcmV0dXJuIGlzRGF5ID8gXCJ0b2RheVwiIDogYHRoaXMgJHt1bml0c1t1bml0XVswXX1gO1xuXG4gICAgfVxuICB9XG5cbiAgY29uc3QgaXNJblBhc3QgPSBPYmplY3QuaXMoY291bnQsIC0wKSB8fCBjb3VudCA8IDAsXG4gICAgICAgIGZtdFZhbHVlID0gTWF0aC5hYnMoY291bnQpLFxuICAgICAgICBzaW5ndWxhciA9IGZtdFZhbHVlID09PSAxLFxuICAgICAgICBsaWxVbml0cyA9IHVuaXRzW3VuaXRdLFxuICAgICAgICBmbXRVbml0ID0gbmFycm93ID8gc2luZ3VsYXIgPyBsaWxVbml0c1sxXSA6IGxpbFVuaXRzWzJdIHx8IGxpbFVuaXRzWzFdIDogc2luZ3VsYXIgPyB1bml0c1t1bml0XVswXSA6IHVuaXQ7XG4gIHJldHVybiBpc0luUGFzdCA/IGAke2ZtdFZhbHVlfSAke2ZtdFVuaXR9IGFnb2AgOiBgaW4gJHtmbXRWYWx1ZX0gJHtmbXRVbml0fWA7XG59XG5mdW5jdGlvbiBmb3JtYXRTdHJpbmcoa25vd25Gb3JtYXQpIHtcbiAgLy8gdGhlc2UgYWxsIGhhdmUgdGhlIG9mZnNldHMgcmVtb3ZlZCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgYWNjZXNzIHRvIHRoZW1cbiAgLy8gd2l0aG91dCBhbGwgdGhlIGludGwgc3R1ZmYgdGhpcyBpcyBiYWNrZmlsbGluZ1xuICBjb25zdCBmaWx0ZXJlZCA9IHBpY2soa25vd25Gb3JtYXQsIFtcIndlZWtkYXlcIiwgXCJlcmFcIiwgXCJ5ZWFyXCIsIFwibW9udGhcIiwgXCJkYXlcIiwgXCJob3VyXCIsIFwibWludXRlXCIsIFwic2Vjb25kXCIsIFwidGltZVpvbmVOYW1lXCIsIFwiaG91cjEyXCJdKSxcbiAgICAgICAga2V5ID0gc3RyaW5naWZ5KGZpbHRlcmVkKSxcbiAgICAgICAgZGF0ZVRpbWVIdWdlID0gXCJFRUVFLCBMTExMIGQsIHl5eXksIGg6bW0gYVwiO1xuXG4gIHN3aXRjaCAoa2V5KSB7XG4gICAgY2FzZSBzdHJpbmdpZnkoREFURV9TSE9SVCk6XG4gICAgICByZXR1cm4gXCJNL2QveXl5eVwiO1xuXG4gICAgY2FzZSBzdHJpbmdpZnkoREFURV9NRUQpOlxuICAgICAgcmV0dXJuIFwiTExMIGQsIHl5eXlcIjtcblxuICAgIGNhc2Ugc3RyaW5naWZ5KERBVEVfTUVEX1dJVEhfV0VFS0RBWSk6XG4gICAgICByZXR1cm4gXCJFRUUsIExMTCBkLCB5eXl5XCI7XG5cbiAgICBjYXNlIHN0cmluZ2lmeShEQVRFX0ZVTEwpOlxuICAgICAgcmV0dXJuIFwiTExMTCBkLCB5eXl5XCI7XG5cbiAgICBjYXNlIHN0cmluZ2lmeShEQVRFX0hVR0UpOlxuICAgICAgcmV0dXJuIFwiRUVFRSwgTExMTCBkLCB5eXl5XCI7XG5cbiAgICBjYXNlIHN0cmluZ2lmeShUSU1FX1NJTVBMRSk6XG4gICAgICByZXR1cm4gXCJoOm1tIGFcIjtcblxuICAgIGNhc2Ugc3RyaW5naWZ5KFRJTUVfV0lUSF9TRUNPTkRTKTpcbiAgICAgIHJldHVybiBcImg6bW06c3MgYVwiO1xuXG4gICAgY2FzZSBzdHJpbmdpZnkoVElNRV9XSVRIX1NIT1JUX09GRlNFVCk6XG4gICAgICByZXR1cm4gXCJoOm1tIGFcIjtcblxuICAgIGNhc2Ugc3RyaW5naWZ5KFRJTUVfV0lUSF9MT05HX09GRlNFVCk6XG4gICAgICByZXR1cm4gXCJoOm1tIGFcIjtcblxuICAgIGNhc2Ugc3RyaW5naWZ5KFRJTUVfMjRfU0lNUExFKTpcbiAgICAgIHJldHVybiBcIkhIOm1tXCI7XG5cbiAgICBjYXNlIHN0cmluZ2lmeShUSU1FXzI0X1dJVEhfU0VDT05EUyk6XG4gICAgICByZXR1cm4gXCJISDptbTpzc1wiO1xuXG4gICAgY2FzZSBzdHJpbmdpZnkoVElNRV8yNF9XSVRIX1NIT1JUX09GRlNFVCk6XG4gICAgICByZXR1cm4gXCJISDptbVwiO1xuXG4gICAgY2FzZSBzdHJpbmdpZnkoVElNRV8yNF9XSVRIX0xPTkdfT0ZGU0VUKTpcbiAgICAgIHJldHVybiBcIkhIOm1tXCI7XG5cbiAgICBjYXNlIHN0cmluZ2lmeShEQVRFVElNRV9TSE9SVCk6XG4gICAgICByZXR1cm4gXCJNL2QveXl5eSwgaDptbSBhXCI7XG5cbiAgICBjYXNlIHN0cmluZ2lmeShEQVRFVElNRV9NRUQpOlxuICAgICAgcmV0dXJuIFwiTExMIGQsIHl5eXksIGg6bW0gYVwiO1xuXG4gICAgY2FzZSBzdHJpbmdpZnkoREFURVRJTUVfRlVMTCk6XG4gICAgICByZXR1cm4gXCJMTExMIGQsIHl5eXksIGg6bW0gYVwiO1xuXG4gICAgY2FzZSBzdHJpbmdpZnkoREFURVRJTUVfSFVHRSk6XG4gICAgICByZXR1cm4gZGF0ZVRpbWVIdWdlO1xuXG4gICAgY2FzZSBzdHJpbmdpZnkoREFURVRJTUVfU0hPUlRfV0lUSF9TRUNPTkRTKTpcbiAgICAgIHJldHVybiBcIk0vZC95eXl5LCBoOm1tOnNzIGFcIjtcblxuICAgIGNhc2Ugc3RyaW5naWZ5KERBVEVUSU1FX01FRF9XSVRIX1NFQ09ORFMpOlxuICAgICAgcmV0dXJuIFwiTExMIGQsIHl5eXksIGg6bW06c3MgYVwiO1xuXG4gICAgY2FzZSBzdHJpbmdpZnkoREFURVRJTUVfTUVEX1dJVEhfV0VFS0RBWSk6XG4gICAgICByZXR1cm4gXCJFRUUsIGQgTExMIHl5eXksIGg6bW0gYVwiO1xuXG4gICAgY2FzZSBzdHJpbmdpZnkoREFURVRJTUVfRlVMTF9XSVRIX1NFQ09ORFMpOlxuICAgICAgcmV0dXJuIFwiTExMTCBkLCB5eXl5LCBoOm1tOnNzIGFcIjtcblxuICAgIGNhc2Ugc3RyaW5naWZ5KERBVEVUSU1FX0hVR0VfV0lUSF9TRUNPTkRTKTpcbiAgICAgIHJldHVybiBcIkVFRUUsIExMTEwgZCwgeXl5eSwgaDptbTpzcyBhXCI7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGRhdGVUaW1lSHVnZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlUb2tlbnMoc3BsaXRzLCB0b2tlblRvU3RyaW5nKSB7XG4gIGxldCBzID0gXCJcIjtcblxuICBmb3IgKGNvbnN0IHRva2VuIG9mIHNwbGl0cykge1xuICAgIGlmICh0b2tlbi5saXRlcmFsKSB7XG4gICAgICBzICs9IHRva2VuLnZhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcyArPSB0b2tlblRvU3RyaW5nKHRva2VuLnZhbCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHM7XG59XG5cbmNvbnN0IG1hY3JvVG9rZW5Ub0Zvcm1hdE9wdHMgPSB7XG4gIEQ6IERBVEVfU0hPUlQsXG4gIEREOiBEQVRFX01FRCxcbiAgREREOiBEQVRFX0ZVTEwsXG4gIEREREQ6IERBVEVfSFVHRSxcbiAgdDogVElNRV9TSU1QTEUsXG4gIHR0OiBUSU1FX1dJVEhfU0VDT05EUyxcbiAgdHR0OiBUSU1FX1dJVEhfU0hPUlRfT0ZGU0VULFxuICB0dHR0OiBUSU1FX1dJVEhfTE9OR19PRkZTRVQsXG4gIFQ6IFRJTUVfMjRfU0lNUExFLFxuICBUVDogVElNRV8yNF9XSVRIX1NFQ09ORFMsXG4gIFRUVDogVElNRV8yNF9XSVRIX1NIT1JUX09GRlNFVCxcbiAgVFRUVDogVElNRV8yNF9XSVRIX0xPTkdfT0ZGU0VULFxuICBmOiBEQVRFVElNRV9TSE9SVCxcbiAgZmY6IERBVEVUSU1FX01FRCxcbiAgZmZmOiBEQVRFVElNRV9GVUxMLFxuICBmZmZmOiBEQVRFVElNRV9IVUdFLFxuICBGOiBEQVRFVElNRV9TSE9SVF9XSVRIX1NFQ09ORFMsXG4gIEZGOiBEQVRFVElNRV9NRURfV0lUSF9TRUNPTkRTLFxuICBGRkY6IERBVEVUSU1FX0ZVTExfV0lUSF9TRUNPTkRTLFxuICBGRkZGOiBEQVRFVElNRV9IVUdFX1dJVEhfU0VDT05EU1xufTtcbi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG5jbGFzcyBGb3JtYXR0ZXIge1xuICBzdGF0aWMgY3JlYXRlKGxvY2FsZSwgb3B0cyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBGb3JtYXR0ZXIobG9jYWxlLCBvcHRzKTtcbiAgfVxuXG4gIHN0YXRpYyBwYXJzZUZvcm1hdChmbXQpIHtcbiAgICBsZXQgY3VycmVudCA9IG51bGwsXG4gICAgICAgIGN1cnJlbnRGdWxsID0gXCJcIixcbiAgICAgICAgYnJhY2tldGVkID0gZmFsc2U7XG4gICAgY29uc3Qgc3BsaXRzID0gW107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZtdC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYyA9IGZtdC5jaGFyQXQoaSk7XG5cbiAgICAgIGlmIChjID09PSBcIidcIikge1xuICAgICAgICBpZiAoY3VycmVudEZ1bGwubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHNwbGl0cy5wdXNoKHtcbiAgICAgICAgICAgIGxpdGVyYWw6IGJyYWNrZXRlZCxcbiAgICAgICAgICAgIHZhbDogY3VycmVudEZ1bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnQgPSBudWxsO1xuICAgICAgICBjdXJyZW50RnVsbCA9IFwiXCI7XG4gICAgICAgIGJyYWNrZXRlZCA9ICFicmFja2V0ZWQ7XG4gICAgICB9IGVsc2UgaWYgKGJyYWNrZXRlZCkge1xuICAgICAgICBjdXJyZW50RnVsbCArPSBjO1xuICAgICAgfSBlbHNlIGlmIChjID09PSBjdXJyZW50KSB7XG4gICAgICAgIGN1cnJlbnRGdWxsICs9IGM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoY3VycmVudEZ1bGwubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHNwbGl0cy5wdXNoKHtcbiAgICAgICAgICAgIGxpdGVyYWw6IGZhbHNlLFxuICAgICAgICAgICAgdmFsOiBjdXJyZW50RnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudEZ1bGwgPSBjO1xuICAgICAgICBjdXJyZW50ID0gYztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY3VycmVudEZ1bGwubGVuZ3RoID4gMCkge1xuICAgICAgc3BsaXRzLnB1c2goe1xuICAgICAgICBsaXRlcmFsOiBicmFja2V0ZWQsXG4gICAgICAgIHZhbDogY3VycmVudEZ1bGxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBzcGxpdHM7XG4gIH1cblxuICBzdGF0aWMgbWFjcm9Ub2tlblRvRm9ybWF0T3B0cyh0b2tlbikge1xuICAgIHJldHVybiBtYWNyb1Rva2VuVG9Gb3JtYXRPcHRzW3Rva2VuXTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGxvY2FsZSwgZm9ybWF0T3B0cykge1xuICAgIHRoaXMub3B0cyA9IGZvcm1hdE9wdHM7XG4gICAgdGhpcy5sb2MgPSBsb2NhbGU7XG4gICAgdGhpcy5zeXN0ZW1Mb2MgPSBudWxsO1xuICB9XG5cbiAgZm9ybWF0V2l0aFN5c3RlbURlZmF1bHQoZHQsIG9wdHMpIHtcbiAgICBpZiAodGhpcy5zeXN0ZW1Mb2MgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuc3lzdGVtTG9jID0gdGhpcy5sb2MucmVkZWZhdWx0VG9TeXN0ZW0oKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZiA9IHRoaXMuc3lzdGVtTG9jLmR0Rm9ybWF0dGVyKGR0LCBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdHMsIG9wdHMpKTtcbiAgICByZXR1cm4gZGYuZm9ybWF0KCk7XG4gIH1cblxuICBmb3JtYXREYXRlVGltZShkdCwgb3B0cyA9IHt9KSB7XG4gICAgY29uc3QgZGYgPSB0aGlzLmxvYy5kdEZvcm1hdHRlcihkdCwgT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRzLCBvcHRzKSk7XG4gICAgcmV0dXJuIGRmLmZvcm1hdCgpO1xuICB9XG5cbiAgZm9ybWF0RGF0ZVRpbWVQYXJ0cyhkdCwgb3B0cyA9IHt9KSB7XG4gICAgY29uc3QgZGYgPSB0aGlzLmxvYy5kdEZvcm1hdHRlcihkdCwgT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRzLCBvcHRzKSk7XG4gICAgcmV0dXJuIGRmLmZvcm1hdFRvUGFydHMoKTtcbiAgfVxuXG4gIHJlc29sdmVkT3B0aW9ucyhkdCwgb3B0cyA9IHt9KSB7XG4gICAgY29uc3QgZGYgPSB0aGlzLmxvYy5kdEZvcm1hdHRlcihkdCwgT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRzLCBvcHRzKSk7XG4gICAgcmV0dXJuIGRmLnJlc29sdmVkT3B0aW9ucygpO1xuICB9XG5cbiAgbnVtKG4sIHAgPSAwKSB7XG4gICAgLy8gd2UgZ2V0IHNvbWUgcGVyZiBvdXQgb2YgZG9pbmcgdGhpcyBoZXJlLCBhbm5veWluZ2x5XG4gICAgaWYgKHRoaXMub3B0cy5mb3JjZVNpbXBsZSkge1xuICAgICAgcmV0dXJuIHBhZFN0YXJ0KG4sIHApO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdHMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdHMpO1xuXG4gICAgaWYgKHAgPiAwKSB7XG4gICAgICBvcHRzLnBhZFRvID0gcDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5sb2MubnVtYmVyRm9ybWF0dGVyKG9wdHMpLmZvcm1hdChuKTtcbiAgfVxuXG4gIGZvcm1hdERhdGVUaW1lRnJvbVN0cmluZyhkdCwgZm10KSB7XG4gICAgY29uc3Qga25vd25FbmdsaXNoID0gdGhpcy5sb2MubGlzdGluZ01vZGUoKSA9PT0gXCJlblwiLFxuICAgICAgICAgIHVzZURhdGVUaW1lRm9ybWF0dGVyID0gdGhpcy5sb2Mub3V0cHV0Q2FsZW5kYXIgJiYgdGhpcy5sb2Mub3V0cHV0Q2FsZW5kYXIgIT09IFwiZ3JlZ29yeVwiICYmIGhhc0Zvcm1hdFRvUGFydHMoKSxcbiAgICAgICAgICBzdHJpbmcgPSAob3B0cywgZXh0cmFjdCkgPT4gdGhpcy5sb2MuZXh0cmFjdChkdCwgb3B0cywgZXh0cmFjdCksXG4gICAgICAgICAgZm9ybWF0T2Zmc2V0ID0gb3B0cyA9PiB7XG4gICAgICBpZiAoZHQuaXNPZmZzZXRGaXhlZCAmJiBkdC5vZmZzZXQgPT09IDAgJiYgb3B0cy5hbGxvd1opIHtcbiAgICAgICAgcmV0dXJuIFwiWlwiO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZHQuaXNWYWxpZCA/IGR0LnpvbmUuZm9ybWF0T2Zmc2V0KGR0LnRzLCBvcHRzLmZvcm1hdCkgOiBcIlwiO1xuICAgIH0sXG4gICAgICAgICAgbWVyaWRpZW0gPSAoKSA9PiBrbm93bkVuZ2xpc2ggPyBtZXJpZGllbUZvckRhdGVUaW1lKGR0KSA6IHN0cmluZyh7XG4gICAgICBob3VyOiBcIm51bWVyaWNcIixcbiAgICAgIGhvdXIxMjogdHJ1ZVxuICAgIH0sIFwiZGF5cGVyaW9kXCIpLFxuICAgICAgICAgIG1vbnRoID0gKGxlbmd0aCwgc3RhbmRhbG9uZSkgPT4ga25vd25FbmdsaXNoID8gbW9udGhGb3JEYXRlVGltZShkdCwgbGVuZ3RoKSA6IHN0cmluZyhzdGFuZGFsb25lID8ge1xuICAgICAgbW9udGg6IGxlbmd0aFxuICAgIH0gOiB7XG4gICAgICBtb250aDogbGVuZ3RoLFxuICAgICAgZGF5OiBcIm51bWVyaWNcIlxuICAgIH0sIFwibW9udGhcIiksXG4gICAgICAgICAgd2Vla2RheSA9IChsZW5ndGgsIHN0YW5kYWxvbmUpID0+IGtub3duRW5nbGlzaCA/IHdlZWtkYXlGb3JEYXRlVGltZShkdCwgbGVuZ3RoKSA6IHN0cmluZyhzdGFuZGFsb25lID8ge1xuICAgICAgd2Vla2RheTogbGVuZ3RoXG4gICAgfSA6IHtcbiAgICAgIHdlZWtkYXk6IGxlbmd0aCxcbiAgICAgIG1vbnRoOiBcImxvbmdcIixcbiAgICAgIGRheTogXCJudW1lcmljXCJcbiAgICB9LCBcIndlZWtkYXlcIiksXG4gICAgICAgICAgbWF5YmVNYWNybyA9IHRva2VuID0+IHtcbiAgICAgIGNvbnN0IGZvcm1hdE9wdHMgPSBGb3JtYXR0ZXIubWFjcm9Ub2tlblRvRm9ybWF0T3B0cyh0b2tlbik7XG5cbiAgICAgIGlmIChmb3JtYXRPcHRzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1hdFdpdGhTeXN0ZW1EZWZhdWx0KGR0LCBmb3JtYXRPcHRzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0b2tlbjtcbiAgICAgIH1cbiAgICB9LFxuICAgICAgICAgIGVyYSA9IGxlbmd0aCA9PiBrbm93bkVuZ2xpc2ggPyBlcmFGb3JEYXRlVGltZShkdCwgbGVuZ3RoKSA6IHN0cmluZyh7XG4gICAgICBlcmE6IGxlbmd0aFxuICAgIH0sIFwiZXJhXCIpLFxuICAgICAgICAgIHRva2VuVG9TdHJpbmcgPSB0b2tlbiA9PiB7XG4gICAgICAvLyBXaGVyZSBwb3NzaWJsZTogaHR0cDovL2NsZHIudW5pY29kZS5vcmcvdHJhbnNsYXRpb24vZGF0ZS10aW1lLTEvZGF0ZS10aW1lI1RPQy1TdGFuZGFsb25lLXZzLi1Gb3JtYXQtU3R5bGVzXG4gICAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAgIC8vIG1zXG4gICAgICAgIGNhc2UgXCJTXCI6XG4gICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0Lm1pbGxpc2Vjb25kKTtcblxuICAgICAgICBjYXNlIFwidVwiOiAvLyBmYWxscyB0aHJvdWdoXG5cbiAgICAgICAgY2FzZSBcIlNTU1wiOlxuICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC5taWxsaXNlY29uZCwgMyk7XG4gICAgICAgIC8vIHNlY29uZHNcblxuICAgICAgICBjYXNlIFwic1wiOlxuICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC5zZWNvbmQpO1xuXG4gICAgICAgIGNhc2UgXCJzc1wiOlxuICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC5zZWNvbmQsIDIpO1xuICAgICAgICAvLyBtaW51dGVzXG5cbiAgICAgICAgY2FzZSBcIm1cIjpcbiAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQubWludXRlKTtcblxuICAgICAgICBjYXNlIFwibW1cIjpcbiAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQubWludXRlLCAyKTtcbiAgICAgICAgLy8gaG91cnNcblxuICAgICAgICBjYXNlIFwiaFwiOlxuICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC5ob3VyICUgMTIgPT09IDAgPyAxMiA6IGR0LmhvdXIgJSAxMik7XG5cbiAgICAgICAgY2FzZSBcImhoXCI6XG4gICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0LmhvdXIgJSAxMiA9PT0gMCA/IDEyIDogZHQuaG91ciAlIDEyLCAyKTtcblxuICAgICAgICBjYXNlIFwiSFwiOlxuICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC5ob3VyKTtcblxuICAgICAgICBjYXNlIFwiSEhcIjpcbiAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQuaG91ciwgMik7XG4gICAgICAgIC8vIG9mZnNldFxuXG4gICAgICAgIGNhc2UgXCJaXCI6XG4gICAgICAgICAgLy8gbGlrZSArNlxuICAgICAgICAgIHJldHVybiBmb3JtYXRPZmZzZXQoe1xuICAgICAgICAgICAgZm9ybWF0OiBcIm5hcnJvd1wiLFxuICAgICAgICAgICAgYWxsb3daOiB0aGlzLm9wdHMuYWxsb3daXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgY2FzZSBcIlpaXCI6XG4gICAgICAgICAgLy8gbGlrZSArMDY6MDBcbiAgICAgICAgICByZXR1cm4gZm9ybWF0T2Zmc2V0KHtcbiAgICAgICAgICAgIGZvcm1hdDogXCJzaG9ydFwiLFxuICAgICAgICAgICAgYWxsb3daOiB0aGlzLm9wdHMuYWxsb3daXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgY2FzZSBcIlpaWlwiOlxuICAgICAgICAgIC8vIGxpa2UgKzA2MDBcbiAgICAgICAgICByZXR1cm4gZm9ybWF0T2Zmc2V0KHtcbiAgICAgICAgICAgIGZvcm1hdDogXCJ0ZWNoaWVcIixcbiAgICAgICAgICAgIGFsbG93WjogdGhpcy5vcHRzLmFsbG93WlxuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGNhc2UgXCJaWlpaXCI6XG4gICAgICAgICAgLy8gbGlrZSBFU1RcbiAgICAgICAgICByZXR1cm4gZHQuem9uZS5vZmZzZXROYW1lKGR0LnRzLCB7XG4gICAgICAgICAgICBmb3JtYXQ6IFwic2hvcnRcIixcbiAgICAgICAgICAgIGxvY2FsZTogdGhpcy5sb2MubG9jYWxlXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgY2FzZSBcIlpaWlpaXCI6XG4gICAgICAgICAgLy8gbGlrZSBFYXN0ZXJuIFN0YW5kYXJkIFRpbWVcbiAgICAgICAgICByZXR1cm4gZHQuem9uZS5vZmZzZXROYW1lKGR0LnRzLCB7XG4gICAgICAgICAgICBmb3JtYXQ6IFwibG9uZ1wiLFxuICAgICAgICAgICAgbG9jYWxlOiB0aGlzLmxvYy5sb2NhbGVcbiAgICAgICAgICB9KTtcbiAgICAgICAgLy8gem9uZVxuXG4gICAgICAgIGNhc2UgXCJ6XCI6XG4gICAgICAgICAgLy8gbGlrZSBBbWVyaWNhL05ld19Zb3JrXG4gICAgICAgICAgcmV0dXJuIGR0LnpvbmVOYW1lO1xuICAgICAgICAvLyBtZXJpZGllbXNcblxuICAgICAgICBjYXNlIFwiYVwiOlxuICAgICAgICAgIHJldHVybiBtZXJpZGllbSgpO1xuICAgICAgICAvLyBkYXRlc1xuXG4gICAgICAgIGNhc2UgXCJkXCI6XG4gICAgICAgICAgcmV0dXJuIHVzZURhdGVUaW1lRm9ybWF0dGVyID8gc3RyaW5nKHtcbiAgICAgICAgICAgIGRheTogXCJudW1lcmljXCJcbiAgICAgICAgICB9LCBcImRheVwiKSA6IHRoaXMubnVtKGR0LmRheSk7XG5cbiAgICAgICAgY2FzZSBcImRkXCI6XG4gICAgICAgICAgcmV0dXJuIHVzZURhdGVUaW1lRm9ybWF0dGVyID8gc3RyaW5nKHtcbiAgICAgICAgICAgIGRheTogXCIyLWRpZ2l0XCJcbiAgICAgICAgICB9LCBcImRheVwiKSA6IHRoaXMubnVtKGR0LmRheSwgMik7XG4gICAgICAgIC8vIHdlZWtkYXlzIC0gc3RhbmRhbG9uZVxuXG4gICAgICAgIGNhc2UgXCJjXCI6XG4gICAgICAgICAgLy8gbGlrZSAxXG4gICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0LndlZWtkYXkpO1xuXG4gICAgICAgIGNhc2UgXCJjY2NcIjpcbiAgICAgICAgICAvLyBsaWtlICdUdWVzJ1xuICAgICAgICAgIHJldHVybiB3ZWVrZGF5KFwic2hvcnRcIiwgdHJ1ZSk7XG5cbiAgICAgICAgY2FzZSBcImNjY2NcIjpcbiAgICAgICAgICAvLyBsaWtlICdUdWVzZGF5J1xuICAgICAgICAgIHJldHVybiB3ZWVrZGF5KFwibG9uZ1wiLCB0cnVlKTtcblxuICAgICAgICBjYXNlIFwiY2NjY2NcIjpcbiAgICAgICAgICAvLyBsaWtlICdUJ1xuICAgICAgICAgIHJldHVybiB3ZWVrZGF5KFwibmFycm93XCIsIHRydWUpO1xuICAgICAgICAvLyB3ZWVrZGF5cyAtIGZvcm1hdFxuXG4gICAgICAgIGNhc2UgXCJFXCI6XG4gICAgICAgICAgLy8gbGlrZSAxXG4gICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0LndlZWtkYXkpO1xuXG4gICAgICAgIGNhc2UgXCJFRUVcIjpcbiAgICAgICAgICAvLyBsaWtlICdUdWVzJ1xuICAgICAgICAgIHJldHVybiB3ZWVrZGF5KFwic2hvcnRcIiwgZmFsc2UpO1xuXG4gICAgICAgIGNhc2UgXCJFRUVFXCI6XG4gICAgICAgICAgLy8gbGlrZSAnVHVlc2RheSdcbiAgICAgICAgICByZXR1cm4gd2Vla2RheShcImxvbmdcIiwgZmFsc2UpO1xuXG4gICAgICAgIGNhc2UgXCJFRUVFRVwiOlxuICAgICAgICAgIC8vIGxpa2UgJ1QnXG4gICAgICAgICAgcmV0dXJuIHdlZWtkYXkoXCJuYXJyb3dcIiwgZmFsc2UpO1xuICAgICAgICAvLyBtb250aHMgLSBzdGFuZGFsb25lXG5cbiAgICAgICAgY2FzZSBcIkxcIjpcbiAgICAgICAgICAvLyBsaWtlIDFcbiAgICAgICAgICByZXR1cm4gdXNlRGF0ZVRpbWVGb3JtYXR0ZXIgPyBzdHJpbmcoe1xuICAgICAgICAgICAgbW9udGg6IFwibnVtZXJpY1wiLFxuICAgICAgICAgICAgZGF5OiBcIm51bWVyaWNcIlxuICAgICAgICAgIH0sIFwibW9udGhcIikgOiB0aGlzLm51bShkdC5tb250aCk7XG5cbiAgICAgICAgY2FzZSBcIkxMXCI6XG4gICAgICAgICAgLy8gbGlrZSAwMSwgZG9lc24ndCBzZWVtIHRvIHdvcmtcbiAgICAgICAgICByZXR1cm4gdXNlRGF0ZVRpbWVGb3JtYXR0ZXIgPyBzdHJpbmcoe1xuICAgICAgICAgICAgbW9udGg6IFwiMi1kaWdpdFwiLFxuICAgICAgICAgICAgZGF5OiBcIm51bWVyaWNcIlxuICAgICAgICAgIH0sIFwibW9udGhcIikgOiB0aGlzLm51bShkdC5tb250aCwgMik7XG5cbiAgICAgICAgY2FzZSBcIkxMTFwiOlxuICAgICAgICAgIC8vIGxpa2UgSmFuXG4gICAgICAgICAgcmV0dXJuIG1vbnRoKFwic2hvcnRcIiwgdHJ1ZSk7XG5cbiAgICAgICAgY2FzZSBcIkxMTExcIjpcbiAgICAgICAgICAvLyBsaWtlIEphbnVhcnlcbiAgICAgICAgICByZXR1cm4gbW9udGgoXCJsb25nXCIsIHRydWUpO1xuXG4gICAgICAgIGNhc2UgXCJMTExMTFwiOlxuICAgICAgICAgIC8vIGxpa2UgSlxuICAgICAgICAgIHJldHVybiBtb250aChcIm5hcnJvd1wiLCB0cnVlKTtcbiAgICAgICAgLy8gbW9udGhzIC0gZm9ybWF0XG5cbiAgICAgICAgY2FzZSBcIk1cIjpcbiAgICAgICAgICAvLyBsaWtlIDFcbiAgICAgICAgICByZXR1cm4gdXNlRGF0ZVRpbWVGb3JtYXR0ZXIgPyBzdHJpbmcoe1xuICAgICAgICAgICAgbW9udGg6IFwibnVtZXJpY1wiXG4gICAgICAgICAgfSwgXCJtb250aFwiKSA6IHRoaXMubnVtKGR0Lm1vbnRoKTtcblxuICAgICAgICBjYXNlIFwiTU1cIjpcbiAgICAgICAgICAvLyBsaWtlIDAxXG4gICAgICAgICAgcmV0dXJuIHVzZURhdGVUaW1lRm9ybWF0dGVyID8gc3RyaW5nKHtcbiAgICAgICAgICAgIG1vbnRoOiBcIjItZGlnaXRcIlxuICAgICAgICAgIH0sIFwibW9udGhcIikgOiB0aGlzLm51bShkdC5tb250aCwgMik7XG5cbiAgICAgICAgY2FzZSBcIk1NTVwiOlxuICAgICAgICAgIC8vIGxpa2UgSmFuXG4gICAgICAgICAgcmV0dXJuIG1vbnRoKFwic2hvcnRcIiwgZmFsc2UpO1xuXG4gICAgICAgIGNhc2UgXCJNTU1NXCI6XG4gICAgICAgICAgLy8gbGlrZSBKYW51YXJ5XG4gICAgICAgICAgcmV0dXJuIG1vbnRoKFwibG9uZ1wiLCBmYWxzZSk7XG5cbiAgICAgICAgY2FzZSBcIk1NTU1NXCI6XG4gICAgICAgICAgLy8gbGlrZSBKXG4gICAgICAgICAgcmV0dXJuIG1vbnRoKFwibmFycm93XCIsIGZhbHNlKTtcbiAgICAgICAgLy8geWVhcnNcblxuICAgICAgICBjYXNlIFwieVwiOlxuICAgICAgICAgIC8vIGxpa2UgMjAxNFxuICAgICAgICAgIHJldHVybiB1c2VEYXRlVGltZUZvcm1hdHRlciA/IHN0cmluZyh7XG4gICAgICAgICAgICB5ZWFyOiBcIm51bWVyaWNcIlxuICAgICAgICAgIH0sIFwieWVhclwiKSA6IHRoaXMubnVtKGR0LnllYXIpO1xuXG4gICAgICAgIGNhc2UgXCJ5eVwiOlxuICAgICAgICAgIC8vIGxpa2UgMTRcbiAgICAgICAgICByZXR1cm4gdXNlRGF0ZVRpbWVGb3JtYXR0ZXIgPyBzdHJpbmcoe1xuICAgICAgICAgICAgeWVhcjogXCIyLWRpZ2l0XCJcbiAgICAgICAgICB9LCBcInllYXJcIikgOiB0aGlzLm51bShkdC55ZWFyLnRvU3RyaW5nKCkuc2xpY2UoLTIpLCAyKTtcblxuICAgICAgICBjYXNlIFwieXl5eVwiOlxuICAgICAgICAgIC8vIGxpa2UgMDAxMlxuICAgICAgICAgIHJldHVybiB1c2VEYXRlVGltZUZvcm1hdHRlciA/IHN0cmluZyh7XG4gICAgICAgICAgICB5ZWFyOiBcIm51bWVyaWNcIlxuICAgICAgICAgIH0sIFwieWVhclwiKSA6IHRoaXMubnVtKGR0LnllYXIsIDQpO1xuXG4gICAgICAgIGNhc2UgXCJ5eXl5eXlcIjpcbiAgICAgICAgICAvLyBsaWtlIDAwMDAxMlxuICAgICAgICAgIHJldHVybiB1c2VEYXRlVGltZUZvcm1hdHRlciA/IHN0cmluZyh7XG4gICAgICAgICAgICB5ZWFyOiBcIm51bWVyaWNcIlxuICAgICAgICAgIH0sIFwieWVhclwiKSA6IHRoaXMubnVtKGR0LnllYXIsIDYpO1xuICAgICAgICAvLyBlcmFzXG5cbiAgICAgICAgY2FzZSBcIkdcIjpcbiAgICAgICAgICAvLyBsaWtlIEFEXG4gICAgICAgICAgcmV0dXJuIGVyYShcInNob3J0XCIpO1xuXG4gICAgICAgIGNhc2UgXCJHR1wiOlxuICAgICAgICAgIC8vIGxpa2UgQW5ubyBEb21pbmlcbiAgICAgICAgICByZXR1cm4gZXJhKFwibG9uZ1wiKTtcblxuICAgICAgICBjYXNlIFwiR0dHR0dcIjpcbiAgICAgICAgICByZXR1cm4gZXJhKFwibmFycm93XCIpO1xuXG4gICAgICAgIGNhc2UgXCJra1wiOlxuICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC53ZWVrWWVhci50b1N0cmluZygpLnNsaWNlKC0yKSwgMik7XG5cbiAgICAgICAgY2FzZSBcImtra2tcIjpcbiAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQud2Vla1llYXIsIDQpO1xuXG4gICAgICAgIGNhc2UgXCJXXCI6XG4gICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0LndlZWtOdW1iZXIpO1xuXG4gICAgICAgIGNhc2UgXCJXV1wiOlxuICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC53ZWVrTnVtYmVyLCAyKTtcblxuICAgICAgICBjYXNlIFwib1wiOlxuICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC5vcmRpbmFsKTtcblxuICAgICAgICBjYXNlIFwib29vXCI6XG4gICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0Lm9yZGluYWwsIDMpO1xuXG4gICAgICAgIGNhc2UgXCJxXCI6XG4gICAgICAgICAgLy8gbGlrZSAxXG4gICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0LnF1YXJ0ZXIpO1xuXG4gICAgICAgIGNhc2UgXCJxcVwiOlxuICAgICAgICAgIC8vIGxpa2UgMDFcbiAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQucXVhcnRlciwgMik7XG5cbiAgICAgICAgY2FzZSBcIlhcIjpcbiAgICAgICAgICByZXR1cm4gdGhpcy5udW0oTWF0aC5mbG9vcihkdC50cyAvIDEwMDApKTtcblxuICAgICAgICBjYXNlIFwieFwiOlxuICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC50cyk7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gbWF5YmVNYWNybyh0b2tlbik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBzdHJpbmdpZnlUb2tlbnMoRm9ybWF0dGVyLnBhcnNlRm9ybWF0KGZtdCksIHRva2VuVG9TdHJpbmcpO1xuICB9XG5cbiAgZm9ybWF0RHVyYXRpb25Gcm9tU3RyaW5nKGR1ciwgZm10KSB7XG4gICAgY29uc3QgdG9rZW5Ub0ZpZWxkID0gdG9rZW4gPT4ge1xuICAgICAgc3dpdGNoICh0b2tlblswXSkge1xuICAgICAgICBjYXNlIFwiU1wiOlxuICAgICAgICAgIHJldHVybiBcIm1pbGxpc2Vjb25kXCI7XG5cbiAgICAgICAgY2FzZSBcInNcIjpcbiAgICAgICAgICByZXR1cm4gXCJzZWNvbmRcIjtcblxuICAgICAgICBjYXNlIFwibVwiOlxuICAgICAgICAgIHJldHVybiBcIm1pbnV0ZVwiO1xuXG4gICAgICAgIGNhc2UgXCJoXCI6XG4gICAgICAgICAgcmV0dXJuIFwiaG91clwiO1xuXG4gICAgICAgIGNhc2UgXCJkXCI6XG4gICAgICAgICAgcmV0dXJuIFwiZGF5XCI7XG5cbiAgICAgICAgY2FzZSBcIk1cIjpcbiAgICAgICAgICByZXR1cm4gXCJtb250aFwiO1xuXG4gICAgICAgIGNhc2UgXCJ5XCI6XG4gICAgICAgICAgcmV0dXJuIFwieWVhclwiO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSxcbiAgICAgICAgICB0b2tlblRvU3RyaW5nID0gbGlsZHVyID0+IHRva2VuID0+IHtcbiAgICAgIGNvbnN0IG1hcHBlZCA9IHRva2VuVG9GaWVsZCh0b2tlbik7XG5cbiAgICAgIGlmIChtYXBwZWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubnVtKGxpbGR1ci5nZXQobWFwcGVkKSwgdG9rZW4ubGVuZ3RoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0b2tlbjtcbiAgICAgIH1cbiAgICB9LFxuICAgICAgICAgIHRva2VucyA9IEZvcm1hdHRlci5wYXJzZUZvcm1hdChmbXQpLFxuICAgICAgICAgIHJlYWxUb2tlbnMgPSB0b2tlbnMucmVkdWNlKChmb3VuZCwge1xuICAgICAgbGl0ZXJhbCxcbiAgICAgIHZhbFxuICAgIH0pID0+IGxpdGVyYWwgPyBmb3VuZCA6IGZvdW5kLmNvbmNhdCh2YWwpLCBbXSksXG4gICAgICAgICAgY29sbGFwc2VkID0gZHVyLnNoaWZ0VG8oLi4ucmVhbFRva2Vucy5tYXAodG9rZW5Ub0ZpZWxkKS5maWx0ZXIodCA9PiB0KSk7XG5cbiAgICByZXR1cm4gc3RyaW5naWZ5VG9rZW5zKHRva2VucywgdG9rZW5Ub1N0cmluZyhjb2xsYXBzZWQpKTtcbiAgfVxuXG59XG5cbmNsYXNzIEludmFsaWQge1xuICBjb25zdHJ1Y3RvcihyZWFzb24sIGV4cGxhbmF0aW9uKSB7XG4gICAgdGhpcy5yZWFzb24gPSByZWFzb247XG4gICAgdGhpcy5leHBsYW5hdGlvbiA9IGV4cGxhbmF0aW9uO1xuICB9XG5cbiAgdG9NZXNzYWdlKCkge1xuICAgIGlmICh0aGlzLmV4cGxhbmF0aW9uKSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5yZWFzb259OiAke3RoaXMuZXhwbGFuYXRpb259YDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMucmVhc29uO1xuICAgIH1cbiAgfVxuXG59XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHtcbiAgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307XG4gIHZhciB0YXJnZXQgPSB7fTtcbiAgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuICB2YXIga2V5LCBpO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAga2V5ID0gc291cmNlS2V5c1tpXTtcbiAgICBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlO1xuICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG4vKiBlc2xpbnQgbm8tdW51c2VkLXZhcnM6IFwib2ZmXCIgKi9cbi8qKlxuICogQGludGVyZmFjZVxuICovXG5cbmNsYXNzIFpvbmUge1xuICAvKipcbiAgICogVGhlIHR5cGUgb2Ygem9uZVxuICAgKiBAYWJzdHJhY3RcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCB0eXBlKCkge1xuICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoaXMgem9uZS5cbiAgICogQGFic3RyYWN0XG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuXG5cbiAgZ2V0IG5hbWUoKSB7XG4gICAgdGhyb3cgbmV3IFpvbmVJc0Fic3RyYWN0RXJyb3IoKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBvZmZzZXQgaXMga25vd24gdG8gYmUgZml4ZWQgZm9yIHRoZSB3aG9sZSB5ZWFyLlxuICAgKiBAYWJzdHJhY3RcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuXG5cbiAgZ2V0IHVuaXZlcnNhbCgpIHtcbiAgICB0aHJvdyBuZXcgWm9uZUlzQWJzdHJhY3RFcnJvcigpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBvZmZzZXQncyBjb21tb24gbmFtZSAoc3VjaCBhcyBFU1QpIGF0IHRoZSBzcGVjaWZpZWQgdGltZXN0YW1wXG4gICAqIEBhYnN0cmFjdFxuICAgKiBAcGFyYW0ge251bWJlcn0gdHMgLSBFcG9jaCBtaWxsaXNlY29uZHMgZm9yIHdoaWNoIHRvIGdldCB0aGUgbmFtZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIE9wdGlvbnMgdG8gYWZmZWN0IHRoZSBmb3JtYXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMuZm9ybWF0IC0gV2hhdCBzdHlsZSBvZiBvZmZzZXQgdG8gcmV0dXJuLiBBY2NlcHRzICdsb25nJyBvciAnc2hvcnQnLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5sb2NhbGUgLSBXaGF0IGxvY2FsZSB0byByZXR1cm4gdGhlIG9mZnNldCBuYW1lIGluLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuXG5cbiAgb2Zmc2V0TmFtZSh0cywgb3B0cykge1xuICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG9mZnNldCdzIHZhbHVlIGFzIGEgc3RyaW5nXG4gICAqIEBhYnN0cmFjdFxuICAgKiBAcGFyYW0ge251bWJlcn0gdHMgLSBFcG9jaCBtaWxsaXNlY29uZHMgZm9yIHdoaWNoIHRvIGdldCB0aGUgb2Zmc2V0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtYXQgLSBXaGF0IHN0eWxlIG9mIG9mZnNldCB0byByZXR1cm4uXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICBBY2NlcHRzICduYXJyb3cnLCAnc2hvcnQnLCBvciAndGVjaGllJy4gUmV0dXJuaW5nICcrNicsICcrMDY6MDAnLCBvciAnKzA2MDAnIHJlc3BlY3RpdmVseVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuXG5cbiAgZm9ybWF0T2Zmc2V0KHRzLCBmb3JtYXQpIHtcbiAgICB0aHJvdyBuZXcgWm9uZUlzQWJzdHJhY3RFcnJvcigpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG9mZnNldCBpbiBtaW51dGVzIGZvciB0aGlzIHpvbmUgYXQgdGhlIHNwZWNpZmllZCB0aW1lc3RhbXAuXG4gICAqIEBhYnN0cmFjdFxuICAgKiBAcGFyYW0ge251bWJlcn0gdHMgLSBFcG9jaCBtaWxsaXNlY29uZHMgZm9yIHdoaWNoIHRvIGNvbXB1dGUgdGhlIG9mZnNldFxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuXG5cbiAgb2Zmc2V0KHRzKSB7XG4gICAgdGhyb3cgbmV3IFpvbmVJc0Fic3RyYWN0RXJyb3IoKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBab25lIGlzIGVxdWFsIHRvIGFub3RoZXIgem9uZVxuICAgKiBAYWJzdHJhY3RcbiAgICogQHBhcmFtIHtab25lfSBvdGhlclpvbmUgLSB0aGUgem9uZSB0byBjb21wYXJlXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuXG5cbiAgZXF1YWxzKG90aGVyWm9uZSkge1xuICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoaXMgWm9uZSBpcyB2YWxpZC5cbiAgICogQGFic3RyYWN0XG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKi9cblxuXG4gIGdldCBpc1ZhbGlkKCkge1xuICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gIH1cblxufVxuXG5sZXQgc2luZ2xldG9uID0gbnVsbDtcbi8qKlxuICogUmVwcmVzZW50cyB0aGUgbG9jYWwgem9uZSBmb3IgdGhpcyBKYXZhU2NyaXB0IGVudmlyb25tZW50LlxuICogQGltcGxlbWVudHMge1pvbmV9XG4gKi9cblxuY2xhc3MgTG9jYWxab25lIGV4dGVuZHMgWm9uZSB7XG4gIC8qKlxuICAgKiBHZXQgYSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGxvY2FsIHpvbmVcbiAgICogQHJldHVybiB7TG9jYWxab25lfVxuICAgKi9cbiAgc3RhdGljIGdldCBpbnN0YW5jZSgpIHtcbiAgICBpZiAoc2luZ2xldG9uID09PSBudWxsKSB7XG4gICAgICBzaW5nbGV0b24gPSBuZXcgTG9jYWxab25lKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNpbmdsZXRvbjtcbiAgfVxuICAvKiogQG92ZXJyaWRlICoqL1xuXG5cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIFwibG9jYWxcIjtcbiAgfVxuICAvKiogQG92ZXJyaWRlICoqL1xuXG5cbiAgZ2V0IG5hbWUoKSB7XG4gICAgaWYgKGhhc0ludGwoKSkge1xuICAgICAgcmV0dXJuIG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KCkucmVzb2x2ZWRPcHRpb25zKCkudGltZVpvbmU7XG4gICAgfSBlbHNlIHJldHVybiBcImxvY2FsXCI7XG4gIH1cbiAgLyoqIEBvdmVycmlkZSAqKi9cblxuXG4gIGdldCB1bml2ZXJzYWwoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8qKiBAb3ZlcnJpZGUgKiovXG5cblxuICBvZmZzZXROYW1lKHRzLCB7XG4gICAgZm9ybWF0LFxuICAgIGxvY2FsZVxuICB9KSB7XG4gICAgcmV0dXJuIHBhcnNlWm9uZUluZm8odHMsIGZvcm1hdCwgbG9jYWxlKTtcbiAgfVxuICAvKiogQG92ZXJyaWRlICoqL1xuXG5cbiAgZm9ybWF0T2Zmc2V0KHRzLCBmb3JtYXQpIHtcbiAgICByZXR1cm4gZm9ybWF0T2Zmc2V0KHRoaXMub2Zmc2V0KHRzKSwgZm9ybWF0KTtcbiAgfVxuICAvKiogQG92ZXJyaWRlICoqL1xuXG5cbiAgb2Zmc2V0KHRzKSB7XG4gICAgcmV0dXJuIC1uZXcgRGF0ZSh0cykuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgfVxuICAvKiogQG92ZXJyaWRlICoqL1xuXG5cbiAgZXF1YWxzKG90aGVyWm9uZSkge1xuICAgIHJldHVybiBvdGhlclpvbmUudHlwZSA9PT0gXCJsb2NhbFwiO1xuICB9XG4gIC8qKiBAb3ZlcnJpZGUgKiovXG5cblxuICBnZXQgaXNWYWxpZCgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG59XG5cbmNvbnN0IG1hdGNoaW5nUmVnZXggPSBSZWdFeHAoYF4ke2lhbmFSZWdleC5zb3VyY2V9JGApO1xubGV0IGR0ZkNhY2hlID0ge307XG5cbmZ1bmN0aW9uIG1ha2VEVEYoem9uZSkge1xuICBpZiAoIWR0ZkNhY2hlW3pvbmVdKSB7XG4gICAgZHRmQ2FjaGVbem9uZV0gPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChcImVuLVVTXCIsIHtcbiAgICAgIGhvdXIxMjogZmFsc2UsXG4gICAgICB0aW1lWm9uZTogem9uZSxcbiAgICAgIHllYXI6IFwibnVtZXJpY1wiLFxuICAgICAgbW9udGg6IFwiMi1kaWdpdFwiLFxuICAgICAgZGF5OiBcIjItZGlnaXRcIixcbiAgICAgIGhvdXI6IFwiMi1kaWdpdFwiLFxuICAgICAgbWludXRlOiBcIjItZGlnaXRcIixcbiAgICAgIHNlY29uZDogXCIyLWRpZ2l0XCJcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBkdGZDYWNoZVt6b25lXTtcbn1cblxuY29uc3QgdHlwZVRvUG9zID0ge1xuICB5ZWFyOiAwLFxuICBtb250aDogMSxcbiAgZGF5OiAyLFxuICBob3VyOiAzLFxuICBtaW51dGU6IDQsXG4gIHNlY29uZDogNVxufTtcblxuZnVuY3Rpb24gaGFja3lPZmZzZXQoZHRmLCBkYXRlKSB7XG4gIGNvbnN0IGZvcm1hdHRlZCA9IGR0Zi5mb3JtYXQoZGF0ZSkucmVwbGFjZSgvXFx1MjAwRS9nLCBcIlwiKSxcbiAgICAgICAgcGFyc2VkID0gLyhcXGQrKVxcLyhcXGQrKVxcLyhcXGQrKSw/IChcXGQrKTooXFxkKyk6KFxcZCspLy5leGVjKGZvcm1hdHRlZCksXG4gICAgICAgIFssIGZNb250aCwgZkRheSwgZlllYXIsIGZIb3VyLCBmTWludXRlLCBmU2Vjb25kXSA9IHBhcnNlZDtcbiAgcmV0dXJuIFtmWWVhciwgZk1vbnRoLCBmRGF5LCBmSG91ciwgZk1pbnV0ZSwgZlNlY29uZF07XG59XG5cbmZ1bmN0aW9uIHBhcnRzT2Zmc2V0KGR0ZiwgZGF0ZSkge1xuICBjb25zdCBmb3JtYXR0ZWQgPSBkdGYuZm9ybWF0VG9QYXJ0cyhkYXRlKSxcbiAgICAgICAgZmlsbGVkID0gW107XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb3JtYXR0ZWQubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB7XG4gICAgICB0eXBlLFxuICAgICAgdmFsdWVcbiAgICB9ID0gZm9ybWF0dGVkW2ldLFxuICAgICAgICAgIHBvcyA9IHR5cGVUb1Bvc1t0eXBlXTtcblxuICAgIGlmICghaXNVbmRlZmluZWQocG9zKSkge1xuICAgICAgZmlsbGVkW3Bvc10gPSBwYXJzZUludCh2YWx1ZSwgMTApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmaWxsZWQ7XG59XG5cbmxldCBpYW5hWm9uZUNhY2hlID0ge307XG4vKipcbiAqIEEgem9uZSBpZGVudGlmaWVkIGJ5IGFuIElBTkEgaWRlbnRpZmllciwgbGlrZSBBbWVyaWNhL05ld19Zb3JrXG4gKiBAaW1wbGVtZW50cyB7Wm9uZX1cbiAqL1xuXG5jbGFzcyBJQU5BWm9uZSBleHRlbmRzIFpvbmUge1xuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBab25lIG5hbWVcbiAgICogQHJldHVybiB7SUFOQVpvbmV9XG4gICAqL1xuICBzdGF0aWMgY3JlYXRlKG5hbWUpIHtcbiAgICBpZiAoIWlhbmFab25lQ2FjaGVbbmFtZV0pIHtcbiAgICAgIGlhbmFab25lQ2FjaGVbbmFtZV0gPSBuZXcgSUFOQVpvbmUobmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlhbmFab25lQ2FjaGVbbmFtZV07XG4gIH1cbiAgLyoqXG4gICAqIFJlc2V0IGxvY2FsIGNhY2hlcy4gU2hvdWxkIG9ubHkgYmUgbmVjZXNzYXJ5IGluIHRlc3Rpbmcgc2NlbmFyaW9zLlxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cblxuXG4gIHN0YXRpYyByZXNldENhY2hlKCkge1xuICAgIGlhbmFab25lQ2FjaGUgPSB7fTtcbiAgICBkdGZDYWNoZSA9IHt9O1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHByb3ZpZGVkIHN0cmluZyBpcyBhIHZhbGlkIHNwZWNpZmllci4gVGhpcyBvbmx5IGNoZWNrcyB0aGUgc3RyaW5nJ3MgZm9ybWF0LCBub3QgdGhhdCB0aGUgc3BlY2lmaWVyIGlkZW50aWZpZXMgYSBrbm93biB6b25lOyBzZWUgaXNWYWxpZFpvbmUgZm9yIHRoYXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzIC0gVGhlIHN0cmluZyB0byBjaGVjayB2YWxpZGl0eSBvblxuICAgKiBAZXhhbXBsZSBJQU5BWm9uZS5pc1ZhbGlkU3BlY2lmaWVyKFwiQW1lcmljYS9OZXdfWW9ya1wiKSAvLz0+IHRydWVcbiAgICogQGV4YW1wbGUgSUFOQVpvbmUuaXNWYWxpZFNwZWNpZmllcihcIkZhbnRhc2lhL0Nhc3RsZVwiKSAvLz0+IHRydWVcbiAgICogQGV4YW1wbGUgSUFOQVpvbmUuaXNWYWxpZFNwZWNpZmllcihcIlNwb3J0fn5ibG9ycFwiKSAvLz0+IGZhbHNlXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuXG5cbiAgc3RhdGljIGlzVmFsaWRTcGVjaWZpZXIocykge1xuICAgIHJldHVybiAhIShzICYmIHMubWF0Y2gobWF0Y2hpbmdSZWdleCkpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHByb3ZpZGVkIHN0cmluZyBpZGVudGlmaWVzIGEgcmVhbCB6b25lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB6b25lIC0gVGhlIHN0cmluZyB0byBjaGVja1xuICAgKiBAZXhhbXBsZSBJQU5BWm9uZS5pc1ZhbGlkWm9uZShcIkFtZXJpY2EvTmV3X1lvcmtcIikgLy89PiB0cnVlXG4gICAqIEBleGFtcGxlIElBTkFab25lLmlzVmFsaWRab25lKFwiRmFudGFzaWEvQ2FzdGxlXCIpIC8vPT4gZmFsc2VcbiAgICogQGV4YW1wbGUgSUFOQVpvbmUuaXNWYWxpZFpvbmUoXCJTcG9ydH5+YmxvcnBcIikgLy89PiBmYWxzZVxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cblxuXG4gIHN0YXRpYyBpc1ZhbGlkWm9uZSh6b25lKSB7XG4gICAgdHJ5IHtcbiAgICAgIG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KFwiZW4tVVNcIiwge1xuICAgICAgICB0aW1lWm9uZTogem9uZVxuICAgICAgfSkuZm9ybWF0KCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9IC8vIEV0Yy9HTVQrOCAtPiAtNDgwXG5cbiAgLyoqIEBpZ25vcmUgKi9cblxuXG4gIHN0YXRpYyBwYXJzZUdNVE9mZnNldChzcGVjaWZpZXIpIHtcbiAgICBpZiAoc3BlY2lmaWVyKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IHNwZWNpZmllci5tYXRjaCgvXkV0Y1xcL0dNVChbKy1dXFxkezEsMn0pJC9pKTtcblxuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIHJldHVybiAtNjAgKiBwYXJzZUludChtYXRjaFsxXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgc3VwZXIoKTtcbiAgICAvKiogQHByaXZhdGUgKiovXG5cbiAgICB0aGlzLnpvbmVOYW1lID0gbmFtZTtcbiAgICAvKiogQHByaXZhdGUgKiovXG5cbiAgICB0aGlzLnZhbGlkID0gSUFOQVpvbmUuaXNWYWxpZFpvbmUobmFtZSk7XG4gIH1cbiAgLyoqIEBvdmVycmlkZSAqKi9cblxuXG4gIGdldCB0eXBlKCkge1xuICAgIHJldHVybiBcImlhbmFcIjtcbiAgfVxuICAvKiogQG92ZXJyaWRlICoqL1xuXG5cbiAgZ2V0IG5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuem9uZU5hbWU7XG4gIH1cbiAgLyoqIEBvdmVycmlkZSAqKi9cblxuXG4gIGdldCB1bml2ZXJzYWwoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8qKiBAb3ZlcnJpZGUgKiovXG5cblxuICBvZmZzZXROYW1lKHRzLCB7XG4gICAgZm9ybWF0LFxuICAgIGxvY2FsZVxuICB9KSB7XG4gICAgcmV0dXJuIHBhcnNlWm9uZUluZm8odHMsIGZvcm1hdCwgbG9jYWxlLCB0aGlzLm5hbWUpO1xuICB9XG4gIC8qKiBAb3ZlcnJpZGUgKiovXG5cblxuICBmb3JtYXRPZmZzZXQodHMsIGZvcm1hdCkge1xuICAgIHJldHVybiBmb3JtYXRPZmZzZXQodGhpcy5vZmZzZXQodHMpLCBmb3JtYXQpO1xuICB9XG4gIC8qKiBAb3ZlcnJpZGUgKiovXG5cblxuICBvZmZzZXQodHMpIHtcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodHMpLFxuICAgICAgICAgIGR0ZiA9IG1ha2VEVEYodGhpcy5uYW1lKSxcbiAgICAgICAgICBbeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmRdID0gZHRmLmZvcm1hdFRvUGFydHMgPyBwYXJ0c09mZnNldChkdGYsIGRhdGUpIDogaGFja3lPZmZzZXQoZHRmLCBkYXRlKSxcbiAgICAgICAgICAvLyB3b3JrIGFyb3VuZCBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0xMDI1NTY0JmNhbj0yJnE9JTIyMjQlM0EwMCUyMiUyMGRhdGV0aW1lZm9ybWF0XG4gICAgYWRqdXN0ZWRIb3VyID0gaG91ciA9PT0gMjQgPyAwIDogaG91cjtcbiAgICBjb25zdCBhc1VUQyA9IG9ialRvTG9jYWxUUyh7XG4gICAgICB5ZWFyLFxuICAgICAgbW9udGgsXG4gICAgICBkYXksXG4gICAgICBob3VyOiBhZGp1c3RlZEhvdXIsXG4gICAgICBtaW51dGUsXG4gICAgICBzZWNvbmQsXG4gICAgICBtaWxsaXNlY29uZDogMFxuICAgIH0pO1xuICAgIGxldCBhc1RTID0gK2RhdGU7XG4gICAgY29uc3Qgb3ZlciA9IGFzVFMgJSAxMDAwO1xuICAgIGFzVFMgLT0gb3ZlciA+PSAwID8gb3ZlciA6IDEwMDAgKyBvdmVyO1xuICAgIHJldHVybiAoYXNVVEMgLSBhc1RTKSAvICg2MCAqIDEwMDApO1xuICB9XG4gIC8qKiBAb3ZlcnJpZGUgKiovXG5cblxuICBlcXVhbHMob3RoZXJab25lKSB7XG4gICAgcmV0dXJuIG90aGVyWm9uZS50eXBlID09PSBcImlhbmFcIiAmJiBvdGhlclpvbmUubmFtZSA9PT0gdGhpcy5uYW1lO1xuICB9XG4gIC8qKiBAb3ZlcnJpZGUgKiovXG5cblxuICBnZXQgaXNWYWxpZCgpIHtcbiAgICByZXR1cm4gdGhpcy52YWxpZDtcbiAgfVxuXG59XG5cbmxldCBzaW5nbGV0b24kMSA9IG51bGw7XG4vKipcbiAqIEEgem9uZSB3aXRoIGEgZml4ZWQgb2Zmc2V0IChtZWFuaW5nIG5vIERTVClcbiAqIEBpbXBsZW1lbnRzIHtab25lfVxuICovXG5cbmNsYXNzIEZpeGVkT2Zmc2V0Wm9uZSBleHRlbmRzIFpvbmUge1xuICAvKipcbiAgICogR2V0IGEgc2luZ2xldG9uIGluc3RhbmNlIG9mIFVUQ1xuICAgKiBAcmV0dXJuIHtGaXhlZE9mZnNldFpvbmV9XG4gICAqL1xuICBzdGF0aWMgZ2V0IHV0Y0luc3RhbmNlKCkge1xuICAgIGlmIChzaW5nbGV0b24kMSA9PT0gbnVsbCkge1xuICAgICAgc2luZ2xldG9uJDEgPSBuZXcgRml4ZWRPZmZzZXRab25lKDApO1xuICAgIH1cblxuICAgIHJldHVybiBzaW5nbGV0b24kMTtcbiAgfVxuICAvKipcbiAgICogR2V0IGFuIGluc3RhbmNlIHdpdGggYSBzcGVjaWZpZWQgb2Zmc2V0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvZmZzZXQgLSBUaGUgb2Zmc2V0IGluIG1pbnV0ZXNcbiAgICogQHJldHVybiB7Rml4ZWRPZmZzZXRab25lfVxuICAgKi9cblxuXG4gIHN0YXRpYyBpbnN0YW5jZShvZmZzZXQpIHtcbiAgICByZXR1cm4gb2Zmc2V0ID09PSAwID8gRml4ZWRPZmZzZXRab25lLnV0Y0luc3RhbmNlIDogbmV3IEZpeGVkT2Zmc2V0Wm9uZShvZmZzZXQpO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgYW4gaW5zdGFuY2Ugb2YgRml4ZWRPZmZzZXRab25lIGZyb20gYSBVVEMgb2Zmc2V0IHN0cmluZywgbGlrZSBcIlVUQys2XCJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHMgLSBUaGUgb2Zmc2V0IHN0cmluZyB0byBwYXJzZVxuICAgKiBAZXhhbXBsZSBGaXhlZE9mZnNldFpvbmUucGFyc2VTcGVjaWZpZXIoXCJVVEMrNlwiKVxuICAgKiBAZXhhbXBsZSBGaXhlZE9mZnNldFpvbmUucGFyc2VTcGVjaWZpZXIoXCJVVEMrMDZcIilcbiAgICogQGV4YW1wbGUgRml4ZWRPZmZzZXRab25lLnBhcnNlU3BlY2lmaWVyKFwiVVRDLTY6MDBcIilcbiAgICogQHJldHVybiB7Rml4ZWRPZmZzZXRab25lfVxuICAgKi9cblxuXG4gIHN0YXRpYyBwYXJzZVNwZWNpZmllcihzKSB7XG4gICAgaWYgKHMpIHtcbiAgICAgIGNvbnN0IHIgPSBzLm1hdGNoKC9edXRjKD86KFsrLV1cXGR7MSwyfSkoPzo6KFxcZHsyfSkpPyk/JC9pKTtcblxuICAgICAgaWYgKHIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGaXhlZE9mZnNldFpvbmUoc2lnbmVkT2Zmc2V0KHJbMV0sIHJbMl0pKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKG9mZnNldCkge1xuICAgIHN1cGVyKCk7XG4gICAgLyoqIEBwcml2YXRlICoqL1xuXG4gICAgdGhpcy5maXhlZCA9IG9mZnNldDtcbiAgfVxuICAvKiogQG92ZXJyaWRlICoqL1xuXG5cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIFwiZml4ZWRcIjtcbiAgfVxuICAvKiogQG92ZXJyaWRlICoqL1xuXG5cbiAgZ2V0IG5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZml4ZWQgPT09IDAgPyBcIlVUQ1wiIDogYFVUQyR7Zm9ybWF0T2Zmc2V0KHRoaXMuZml4ZWQsIFwibmFycm93XCIpfWA7XG4gIH1cbiAgLyoqIEBvdmVycmlkZSAqKi9cblxuXG4gIG9mZnNldE5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgfVxuICAvKiogQG92ZXJyaWRlICoqL1xuXG5cbiAgZm9ybWF0T2Zmc2V0KHRzLCBmb3JtYXQpIHtcbiAgICByZXR1cm4gZm9ybWF0T2Zmc2V0KHRoaXMuZml4ZWQsIGZvcm1hdCk7XG4gIH1cbiAgLyoqIEBvdmVycmlkZSAqKi9cblxuXG4gIGdldCB1bml2ZXJzYWwoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyoqIEBvdmVycmlkZSAqKi9cblxuXG4gIG9mZnNldCgpIHtcbiAgICByZXR1cm4gdGhpcy5maXhlZDtcbiAgfVxuICAvKiogQG92ZXJyaWRlICoqL1xuXG5cbiAgZXF1YWxzKG90aGVyWm9uZSkge1xuICAgIHJldHVybiBvdGhlclpvbmUudHlwZSA9PT0gXCJmaXhlZFwiICYmIG90aGVyWm9uZS5maXhlZCA9PT0gdGhpcy5maXhlZDtcbiAgfVxuICAvKiogQG92ZXJyaWRlICoqL1xuXG5cbiAgZ2V0IGlzVmFsaWQoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxufVxuXG4vKipcbiAqIEEgem9uZSB0aGF0IGZhaWxlZCB0byBwYXJzZS4gWW91IHNob3VsZCBuZXZlciBuZWVkIHRvIGluc3RhbnRpYXRlIHRoaXMuXG4gKiBAaW1wbGVtZW50cyB7Wm9uZX1cbiAqL1xuXG5jbGFzcyBJbnZhbGlkWm9uZSBleHRlbmRzIFpvbmUge1xuICBjb25zdHJ1Y3Rvcih6b25lTmFtZSkge1xuICAgIHN1cGVyKCk7XG4gICAgLyoqICBAcHJpdmF0ZSAqL1xuXG4gICAgdGhpcy56b25lTmFtZSA9IHpvbmVOYW1lO1xuICB9XG4gIC8qKiBAb3ZlcnJpZGUgKiovXG5cblxuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gXCJpbnZhbGlkXCI7XG4gIH1cbiAgLyoqIEBvdmVycmlkZSAqKi9cblxuXG4gIGdldCBuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLnpvbmVOYW1lO1xuICB9XG4gIC8qKiBAb3ZlcnJpZGUgKiovXG5cblxuICBnZXQgdW5pdmVyc2FsKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvKiogQG92ZXJyaWRlICoqL1xuXG5cbiAgb2Zmc2V0TmFtZSgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKiogQG92ZXJyaWRlICoqL1xuXG5cbiAgZm9ybWF0T2Zmc2V0KCkge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG4gIC8qKiBAb3ZlcnJpZGUgKiovXG5cblxuICBvZmZzZXQoKSB7XG4gICAgcmV0dXJuIE5hTjtcbiAgfVxuICAvKiogQG92ZXJyaWRlICoqL1xuXG5cbiAgZXF1YWxzKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvKiogQG92ZXJyaWRlICoqL1xuXG5cbiAgZ2V0IGlzVmFsaWQoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBub3JtYWxpemVab25lKGlucHV0LCBkZWZhdWx0Wm9uZSkge1xuICBsZXQgb2Zmc2V0O1xuXG4gIGlmIChpc1VuZGVmaW5lZChpbnB1dCkgfHwgaW5wdXQgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZGVmYXVsdFpvbmU7XG4gIH0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBab25lKSB7XG4gICAgcmV0dXJuIGlucHV0O1xuICB9IGVsc2UgaWYgKGlzU3RyaW5nKGlucHV0KSkge1xuICAgIGNvbnN0IGxvd2VyZWQgPSBpbnB1dC50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChsb3dlcmVkID09PSBcImxvY2FsXCIpIHJldHVybiBkZWZhdWx0Wm9uZTtlbHNlIGlmIChsb3dlcmVkID09PSBcInV0Y1wiIHx8IGxvd2VyZWQgPT09IFwiZ210XCIpIHJldHVybiBGaXhlZE9mZnNldFpvbmUudXRjSW5zdGFuY2U7ZWxzZSBpZiAoKG9mZnNldCA9IElBTkFab25lLnBhcnNlR01UT2Zmc2V0KGlucHV0KSkgIT0gbnVsbCkge1xuICAgICAgLy8gaGFuZGxlIEV0Yy9HTVQtNCwgd2hpY2ggVjggY2hva2VzIG9uXG4gICAgICByZXR1cm4gRml4ZWRPZmZzZXRab25lLmluc3RhbmNlKG9mZnNldCk7XG4gICAgfSBlbHNlIGlmIChJQU5BWm9uZS5pc1ZhbGlkU3BlY2lmaWVyKGxvd2VyZWQpKSByZXR1cm4gSUFOQVpvbmUuY3JlYXRlKGlucHV0KTtlbHNlIHJldHVybiBGaXhlZE9mZnNldFpvbmUucGFyc2VTcGVjaWZpZXIobG93ZXJlZCkgfHwgbmV3IEludmFsaWRab25lKGlucHV0KTtcbiAgfSBlbHNlIGlmIChpc051bWJlcihpbnB1dCkpIHtcbiAgICByZXR1cm4gRml4ZWRPZmZzZXRab25lLmluc3RhbmNlKGlucHV0KTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09IFwib2JqZWN0XCIgJiYgaW5wdXQub2Zmc2V0ICYmIHR5cGVvZiBpbnB1dC5vZmZzZXQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAvLyBUaGlzIGlzIGR1bWIsIGJ1dCB0aGUgaW5zdGFuY2VvZiBjaGVjayBhYm92ZSBkb2Vzbid0IHNlZW0gdG8gcmVhbGx5IHdvcmtcbiAgICAvLyBzbyB3ZSdyZSBkdWNrIGNoZWNraW5nIGl0XG4gICAgcmV0dXJuIGlucHV0O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXcgSW52YWxpZFpvbmUoaW5wdXQpO1xuICB9XG59XG5cbmxldCBub3cgPSAoKSA9PiBEYXRlLm5vdygpLFxuICAgIGRlZmF1bHRab25lID0gbnVsbCxcbiAgICAvLyBub3Qgc2V0dGluZyB0aGlzIGRpcmVjdGx5IHRvIExvY2FsWm9uZS5pbnN0YW5jZSBiYyBsb2FkaW5nIG9yZGVyIGlzc3Vlc1xuZGVmYXVsdExvY2FsZSA9IG51bGwsXG4gICAgZGVmYXVsdE51bWJlcmluZ1N5c3RlbSA9IG51bGwsXG4gICAgZGVmYXVsdE91dHB1dENhbGVuZGFyID0gbnVsbCxcbiAgICB0aHJvd09uSW52YWxpZCA9IGZhbHNlO1xuLyoqXG4gKiBTZXR0aW5ncyBjb250YWlucyBzdGF0aWMgZ2V0dGVycyBhbmQgc2V0dGVycyB0aGF0IGNvbnRyb2wgTHV4b24ncyBvdmVyYWxsIGJlaGF2aW9yLiBMdXhvbiBpcyBhIHNpbXBsZSBsaWJyYXJ5IHdpdGggZmV3IG9wdGlvbnMsIGJ1dCB0aGUgb25lcyBpdCBkb2VzIGhhdmUgbGl2ZSBoZXJlLlxuICovXG5cblxuY2xhc3MgU2V0dGluZ3Mge1xuICAvKipcbiAgICogR2V0IHRoZSBjYWxsYmFjayBmb3IgcmV0dXJuaW5nIHRoZSBjdXJyZW50IHRpbWVzdGFtcC5cbiAgICogQHR5cGUge2Z1bmN0aW9ufVxuICAgKi9cbiAgc3RhdGljIGdldCBub3coKSB7XG4gICAgcmV0dXJuIG5vdztcbiAgfVxuICAvKipcbiAgICogU2V0IHRoZSBjYWxsYmFjayBmb3IgcmV0dXJuaW5nIHRoZSBjdXJyZW50IHRpbWVzdGFtcC5cbiAgICogVGhlIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYSBudW1iZXIsIHdoaWNoIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgYW4gRXBvY2ggbWlsbGlzZWNvbmQgY291bnRcbiAgICogQHR5cGUge2Z1bmN0aW9ufVxuICAgKiBAZXhhbXBsZSBTZXR0aW5ncy5ub3cgPSAoKSA9PiBEYXRlLm5vdygpICsgMzAwMCAvLyBwcmV0ZW5kIGl0IGlzIDMgc2Vjb25kcyBpbiB0aGUgZnV0dXJlXG4gICAqIEBleGFtcGxlIFNldHRpbmdzLm5vdyA9ICgpID0+IDAgLy8gYWx3YXlzIHByZXRlbmQgaXQncyBKYW4gMSwgMTk3MCBhdCBtaWRuaWdodCBpbiBVVEMgdGltZVxuICAgKi9cblxuXG4gIHN0YXRpYyBzZXQgbm93KG4pIHtcbiAgICBub3cgPSBuO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgdGhlIGRlZmF1bHQgdGltZSB6b25lIHRvIGNyZWF0ZSBEYXRlVGltZXMgaW4uXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuXG5cbiAgc3RhdGljIGdldCBkZWZhdWx0Wm9uZU5hbWUoKSB7XG4gICAgcmV0dXJuIFNldHRpbmdzLmRlZmF1bHRab25lLm5hbWU7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGUgZGVmYXVsdCB0aW1lIHpvbmUgdG8gY3JlYXRlIERhdGVUaW1lcyBpbi4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG5cblxuICBzdGF0aWMgc2V0IGRlZmF1bHRab25lTmFtZSh6KSB7XG4gICAgaWYgKCF6KSB7XG4gICAgICBkZWZhdWx0Wm9uZSA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlZmF1bHRab25lID0gbm9ybWFsaXplWm9uZSh6KTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEdldCB0aGUgZGVmYXVsdCB0aW1lIHpvbmUgb2JqZWN0IHRvIGNyZWF0ZSBEYXRlVGltZXMgaW4uIERvZXMgbm90IGFmZmVjdCBleGlzdGluZyBpbnN0YW5jZXMuXG4gICAqIEB0eXBlIHtab25lfVxuICAgKi9cblxuXG4gIHN0YXRpYyBnZXQgZGVmYXVsdFpvbmUoKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRab25lIHx8IExvY2FsWm9uZS5pbnN0YW5jZTtcbiAgfVxuICAvKipcbiAgICogR2V0IHRoZSBkZWZhdWx0IGxvY2FsZSB0byBjcmVhdGUgRGF0ZVRpbWVzIHdpdGguIERvZXMgbm90IGFmZmVjdCBleGlzdGluZyBpbnN0YW5jZXMuXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuXG5cbiAgc3RhdGljIGdldCBkZWZhdWx0TG9jYWxlKCkge1xuICAgIHJldHVybiBkZWZhdWx0TG9jYWxlO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhlIGRlZmF1bHQgbG9jYWxlIHRvIGNyZWF0ZSBEYXRlVGltZXMgd2l0aC4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG5cblxuICBzdGF0aWMgc2V0IGRlZmF1bHRMb2NhbGUobG9jYWxlKSB7XG4gICAgZGVmYXVsdExvY2FsZSA9IGxvY2FsZTtcbiAgfVxuICAvKipcbiAgICogR2V0IHRoZSBkZWZhdWx0IG51bWJlcmluZyBzeXN0ZW0gdG8gY3JlYXRlIERhdGVUaW1lcyB3aXRoLiBEb2VzIG5vdCBhZmZlY3QgZXhpc3RpbmcgaW5zdGFuY2VzLlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cblxuXG4gIHN0YXRpYyBnZXQgZGVmYXVsdE51bWJlcmluZ1N5c3RlbSgpIHtcbiAgICByZXR1cm4gZGVmYXVsdE51bWJlcmluZ1N5c3RlbTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoZSBkZWZhdWx0IG51bWJlcmluZyBzeXN0ZW0gdG8gY3JlYXRlIERhdGVUaW1lcyB3aXRoLiBEb2VzIG5vdCBhZmZlY3QgZXhpc3RpbmcgaW5zdGFuY2VzLlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cblxuXG4gIHN0YXRpYyBzZXQgZGVmYXVsdE51bWJlcmluZ1N5c3RlbShudW1iZXJpbmdTeXN0ZW0pIHtcbiAgICBkZWZhdWx0TnVtYmVyaW5nU3lzdGVtID0gbnVtYmVyaW5nU3lzdGVtO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgdGhlIGRlZmF1bHQgb3V0cHV0IGNhbGVuZGFyIHRvIGNyZWF0ZSBEYXRlVGltZXMgd2l0aC4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG5cblxuICBzdGF0aWMgZ2V0IGRlZmF1bHRPdXRwdXRDYWxlbmRhcigpIHtcbiAgICByZXR1cm4gZGVmYXVsdE91dHB1dENhbGVuZGFyO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhlIGRlZmF1bHQgb3V0cHV0IGNhbGVuZGFyIHRvIGNyZWF0ZSBEYXRlVGltZXMgd2l0aC4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG5cblxuICBzdGF0aWMgc2V0IGRlZmF1bHRPdXRwdXRDYWxlbmRhcihvdXRwdXRDYWxlbmRhcikge1xuICAgIGRlZmF1bHRPdXRwdXRDYWxlbmRhciA9IG91dHB1dENhbGVuZGFyO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgd2hldGhlciBMdXhvbiB3aWxsIHRocm93IHdoZW4gaXQgZW5jb3VudGVycyBpbnZhbGlkIERhdGVUaW1lcywgRHVyYXRpb25zLCBvciBJbnRlcnZhbHNcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuXG5cbiAgc3RhdGljIGdldCB0aHJvd09uSW52YWxpZCgpIHtcbiAgICByZXR1cm4gdGhyb3dPbkludmFsaWQ7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB3aGV0aGVyIEx1eG9uIHdpbGwgdGhyb3cgd2hlbiBpdCBlbmNvdW50ZXJzIGludmFsaWQgRGF0ZVRpbWVzLCBEdXJhdGlvbnMsIG9yIEludGVydmFsc1xuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICovXG5cblxuICBzdGF0aWMgc2V0IHRocm93T25JbnZhbGlkKHQpIHtcbiAgICB0aHJvd09uSW52YWxpZCA9IHQ7XG4gIH1cbiAgLyoqXG4gICAqIFJlc2V0IEx1eG9uJ3MgZ2xvYmFsIGNhY2hlcy4gU2hvdWxkIG9ubHkgYmUgbmVjZXNzYXJ5IGluIHRlc3Rpbmcgc2NlbmFyaW9zLlxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cblxuXG4gIHN0YXRpYyByZXNldENhY2hlcygpIHtcbiAgICBMb2NhbGUucmVzZXRDYWNoZSgpO1xuICAgIElBTkFab25lLnJlc2V0Q2FjaGUoKTtcbiAgfVxuXG59XG5cbmxldCBpbnRsRFRDYWNoZSA9IHt9O1xuXG5mdW5jdGlvbiBnZXRDYWNoZWREVEYobG9jU3RyaW5nLCBvcHRzID0ge30pIHtcbiAgY29uc3Qga2V5ID0gSlNPTi5zdHJpbmdpZnkoW2xvY1N0cmluZywgb3B0c10pO1xuICBsZXQgZHRmID0gaW50bERUQ2FjaGVba2V5XTtcblxuICBpZiAoIWR0Zikge1xuICAgIGR0ZiA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxvY1N0cmluZywgb3B0cyk7XG4gICAgaW50bERUQ2FjaGVba2V5XSA9IGR0ZjtcbiAgfVxuXG4gIHJldHVybiBkdGY7XG59XG5cbmxldCBpbnRsTnVtQ2FjaGUgPSB7fTtcblxuZnVuY3Rpb24gZ2V0Q2FjaGVkSU5GKGxvY1N0cmluZywgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IGtleSA9IEpTT04uc3RyaW5naWZ5KFtsb2NTdHJpbmcsIG9wdHNdKTtcbiAgbGV0IGluZiA9IGludGxOdW1DYWNoZVtrZXldO1xuXG4gIGlmICghaW5mKSB7XG4gICAgaW5mID0gbmV3IEludGwuTnVtYmVyRm9ybWF0KGxvY1N0cmluZywgb3B0cyk7XG4gICAgaW50bE51bUNhY2hlW2tleV0gPSBpbmY7XG4gIH1cblxuICByZXR1cm4gaW5mO1xufVxuXG5sZXQgaW50bFJlbENhY2hlID0ge307XG5cbmZ1bmN0aW9uIGdldENhY2hlZFJURihsb2NTdHJpbmcsIG9wdHMgPSB7fSkge1xuICBjb25zdCBjYWNoZUtleU9wdHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShvcHRzLCBbXCJiYXNlXCJdKTsgLy8gZXhjbHVkZSBgYmFzZWAgZnJvbSB0aGUgb3B0aW9uc1xuXG5cbiAgY29uc3Qga2V5ID0gSlNPTi5zdHJpbmdpZnkoW2xvY1N0cmluZywgY2FjaGVLZXlPcHRzXSk7XG4gIGxldCBpbmYgPSBpbnRsUmVsQ2FjaGVba2V5XTtcblxuICBpZiAoIWluZikge1xuICAgIGluZiA9IG5ldyBJbnRsLlJlbGF0aXZlVGltZUZvcm1hdChsb2NTdHJpbmcsIG9wdHMpO1xuICAgIGludGxSZWxDYWNoZVtrZXldID0gaW5mO1xuICB9XG5cbiAgcmV0dXJuIGluZjtcbn1cblxubGV0IHN5c0xvY2FsZUNhY2hlID0gbnVsbDtcblxuZnVuY3Rpb24gc3lzdGVtTG9jYWxlKCkge1xuICBpZiAoc3lzTG9jYWxlQ2FjaGUpIHtcbiAgICByZXR1cm4gc3lzTG9jYWxlQ2FjaGU7XG4gIH0gZWxzZSBpZiAoaGFzSW50bCgpKSB7XG4gICAgY29uc3QgY29tcHV0ZWRTeXMgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCgpLnJlc29sdmVkT3B0aW9ucygpLmxvY2FsZTsgLy8gbm9kZSBzb21ldGltZXMgZGVmYXVsdHMgdG8gXCJ1bmRcIi4gT3ZlcnJpZGUgdGhhdCBiZWNhdXNlIHRoYXQgaXMgZHVtYlxuXG4gICAgc3lzTG9jYWxlQ2FjaGUgPSAhY29tcHV0ZWRTeXMgfHwgY29tcHV0ZWRTeXMgPT09IFwidW5kXCIgPyBcImVuLVVTXCIgOiBjb21wdXRlZFN5cztcbiAgICByZXR1cm4gc3lzTG9jYWxlQ2FjaGU7XG4gIH0gZWxzZSB7XG4gICAgc3lzTG9jYWxlQ2FjaGUgPSBcImVuLVVTXCI7XG4gICAgcmV0dXJuIHN5c0xvY2FsZUNhY2hlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlTG9jYWxlU3RyaW5nKGxvY2FsZVN0cikge1xuICAvLyBJIHJlYWxseSB3YW50IHRvIGF2b2lkIHdyaXRpbmcgYSBCQ1AgNDcgcGFyc2VyXG4gIC8vIHNlZSwgZS5nLiBodHRwczovL2dpdGh1Yi5jb20vd29vb3JtL2JjcC00N1xuICAvLyBJbnN0ZWFkLCB3ZSdsbCBkbyB0aGlzOlxuICAvLyBhKSBpZiB0aGUgc3RyaW5nIGhhcyBubyAtdSBleHRlbnNpb25zLCBqdXN0IGxlYXZlIGl0IGFsb25lXG4gIC8vIGIpIGlmIGl0IGRvZXMsIHVzZSBJbnRsIHRvIHJlc29sdmUgZXZlcnl0aGluZ1xuICAvLyBjKSBpZiBJbnRsIGZhaWxzLCB0cnkgYWdhaW4gd2l0aG91dCB0aGUgLXVcbiAgY29uc3QgdUluZGV4ID0gbG9jYWxlU3RyLmluZGV4T2YoXCItdS1cIik7XG5cbiAgaWYgKHVJbmRleCA9PT0gLTEpIHtcbiAgICByZXR1cm4gW2xvY2FsZVN0cl07XG4gIH0gZWxzZSB7XG4gICAgbGV0IG9wdGlvbnM7XG4gICAgY29uc3Qgc21hbGxlciA9IGxvY2FsZVN0ci5zdWJzdHJpbmcoMCwgdUluZGV4KTtcblxuICAgIHRyeSB7XG4gICAgICBvcHRpb25zID0gZ2V0Q2FjaGVkRFRGKGxvY2FsZVN0cikucmVzb2x2ZWRPcHRpb25zKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgb3B0aW9ucyA9IGdldENhY2hlZERURihzbWFsbGVyKS5yZXNvbHZlZE9wdGlvbnMoKTtcbiAgICB9XG5cbiAgICBjb25zdCB7XG4gICAgICBudW1iZXJpbmdTeXN0ZW0sXG4gICAgICBjYWxlbmRhclxuICAgIH0gPSBvcHRpb25zOyAvLyByZXR1cm4gdGhlIHNtYWxsZXIgb25lIHNvIHRoYXQgd2UgY2FuIGFwcGVuZCB0aGUgY2FsZW5kYXIgYW5kIG51bWJlcmluZyBvdmVycmlkZXMgdG8gaXRcblxuICAgIHJldHVybiBbc21hbGxlciwgbnVtYmVyaW5nU3lzdGVtLCBjYWxlbmRhcl07XG4gIH1cbn1cblxuZnVuY3Rpb24gaW50bENvbmZpZ1N0cmluZyhsb2NhbGVTdHIsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIpIHtcbiAgaWYgKGhhc0ludGwoKSkge1xuICAgIGlmIChvdXRwdXRDYWxlbmRhciB8fCBudW1iZXJpbmdTeXN0ZW0pIHtcbiAgICAgIGxvY2FsZVN0ciArPSBcIi11XCI7XG5cbiAgICAgIGlmIChvdXRwdXRDYWxlbmRhcikge1xuICAgICAgICBsb2NhbGVTdHIgKz0gYC1jYS0ke291dHB1dENhbGVuZGFyfWA7XG4gICAgICB9XG5cbiAgICAgIGlmIChudW1iZXJpbmdTeXN0ZW0pIHtcbiAgICAgICAgbG9jYWxlU3RyICs9IGAtbnUtJHtudW1iZXJpbmdTeXN0ZW19YDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGxvY2FsZVN0cjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGxvY2FsZVN0cjtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcE1vbnRocyhmKSB7XG4gIGNvbnN0IG1zID0gW107XG5cbiAgZm9yIChsZXQgaSA9IDE7IGkgPD0gMTI7IGkrKykge1xuICAgIGNvbnN0IGR0ID0gRGF0ZVRpbWUudXRjKDIwMTYsIGksIDEpO1xuICAgIG1zLnB1c2goZihkdCkpO1xuICB9XG5cbiAgcmV0dXJuIG1zO1xufVxuXG5mdW5jdGlvbiBtYXBXZWVrZGF5cyhmKSB7XG4gIGNvbnN0IG1zID0gW107XG5cbiAgZm9yIChsZXQgaSA9IDE7IGkgPD0gNzsgaSsrKSB7XG4gICAgY29uc3QgZHQgPSBEYXRlVGltZS51dGMoMjAxNiwgMTEsIDEzICsgaSk7XG4gICAgbXMucHVzaChmKGR0KSk7XG4gIH1cblxuICByZXR1cm4gbXM7XG59XG5cbmZ1bmN0aW9uIGxpc3RTdHVmZihsb2MsIGxlbmd0aCwgZGVmYXVsdE9LLCBlbmdsaXNoRm4sIGludGxGbikge1xuICBjb25zdCBtb2RlID0gbG9jLmxpc3RpbmdNb2RlKGRlZmF1bHRPSyk7XG5cbiAgaWYgKG1vZGUgPT09IFwiZXJyb3JcIikge1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2UgaWYgKG1vZGUgPT09IFwiZW5cIikge1xuICAgIHJldHVybiBlbmdsaXNoRm4obGVuZ3RoKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gaW50bEZuKGxlbmd0aCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3VwcG9ydHNGYXN0TnVtYmVycyhsb2MpIHtcbiAgaWYgKGxvYy5udW1iZXJpbmdTeXN0ZW0gJiYgbG9jLm51bWJlcmluZ1N5c3RlbSAhPT0gXCJsYXRuXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGxvYy5udW1iZXJpbmdTeXN0ZW0gPT09IFwibGF0blwiIHx8ICFsb2MubG9jYWxlIHx8IGxvYy5sb2NhbGUuc3RhcnRzV2l0aChcImVuXCIpIHx8IGhhc0ludGwoKSAmJiBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChsb2MuaW50bCkucmVzb2x2ZWRPcHRpb25zKCkubnVtYmVyaW5nU3lzdGVtID09PSBcImxhdG5cIjtcbiAgfVxufVxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cblxuY2xhc3MgUG9seU51bWJlckZvcm1hdHRlciB7XG4gIGNvbnN0cnVjdG9yKGludGwsIGZvcmNlU2ltcGxlLCBvcHRzKSB7XG4gICAgdGhpcy5wYWRUbyA9IG9wdHMucGFkVG8gfHwgMDtcbiAgICB0aGlzLmZsb29yID0gb3B0cy5mbG9vciB8fCBmYWxzZTtcblxuICAgIGlmICghZm9yY2VTaW1wbGUgJiYgaGFzSW50bCgpKSB7XG4gICAgICBjb25zdCBpbnRsT3B0cyA9IHtcbiAgICAgICAgdXNlR3JvdXBpbmc6IGZhbHNlXG4gICAgICB9O1xuICAgICAgaWYgKG9wdHMucGFkVG8gPiAwKSBpbnRsT3B0cy5taW5pbXVtSW50ZWdlckRpZ2l0cyA9IG9wdHMucGFkVG87XG4gICAgICB0aGlzLmluZiA9IGdldENhY2hlZElORihpbnRsLCBpbnRsT3B0cyk7XG4gICAgfVxuICB9XG5cbiAgZm9ybWF0KGkpIHtcbiAgICBpZiAodGhpcy5pbmYpIHtcbiAgICAgIGNvbnN0IGZpeGVkID0gdGhpcy5mbG9vciA/IE1hdGguZmxvb3IoaSkgOiBpO1xuICAgICAgcmV0dXJuIHRoaXMuaW5mLmZvcm1hdChmaXhlZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRvIG1hdGNoIHRoZSBicm93c2VyJ3MgbnVtYmVyZm9ybWF0dGVyIGRlZmF1bHRzXG4gICAgICBjb25zdCBmaXhlZCA9IHRoaXMuZmxvb3IgPyBNYXRoLmZsb29yKGkpIDogcm91bmRUbyhpLCAzKTtcbiAgICAgIHJldHVybiBwYWRTdGFydChmaXhlZCwgdGhpcy5wYWRUbyk7XG4gICAgfVxuICB9XG5cbn1cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG5cbmNsYXNzIFBvbHlEYXRlRm9ybWF0dGVyIHtcbiAgY29uc3RydWN0b3IoZHQsIGludGwsIG9wdHMpIHtcbiAgICB0aGlzLm9wdHMgPSBvcHRzO1xuICAgIHRoaXMuaGFzSW50bCA9IGhhc0ludGwoKTtcbiAgICBsZXQgejtcblxuICAgIGlmIChkdC56b25lLnVuaXZlcnNhbCAmJiB0aGlzLmhhc0ludGwpIHtcbiAgICAgIC8vIFVUQy04IG9yIEV0Yy9VVEMtOCBhcmUgbm90IHBhcnQgb2YgdHpkYXRhLCBvbmx5IEV0Yy9HTVQrOCBhbmQgdGhlIGxpa2UuXG4gICAgICAvLyBUaGF0IGlzIHdoeSBmaXhlZC1vZmZzZXQgVFogaXMgc2V0IHRvIHRoYXQgdW5sZXNzIGl0IGlzOlxuICAgICAgLy8gMS4gT3V0c2lkZSBvZiB0aGUgc3VwcG9ydGVkIHJhbmdlIEV0Yy9HTVQtMTQgdG8gRXRjL0dNVCsxMi5cbiAgICAgIC8vIDIuIE5vdCBhIHdob2xlIGhvdXIsIGUuZy4gVVRDKzQ6MzAuXG4gICAgICBjb25zdCBnbXRPZmZzZXQgPSAtMSAqIChkdC5vZmZzZXQgLyA2MCk7XG5cbiAgICAgIGlmIChnbXRPZmZzZXQgPj0gLTE0ICYmIGdtdE9mZnNldCA8PSAxMiAmJiBnbXRPZmZzZXQgJSAxID09PSAwKSB7XG4gICAgICAgIHogPSBnbXRPZmZzZXQgPj0gMCA/IGBFdGMvR01UKyR7Z210T2Zmc2V0fWAgOiBgRXRjL0dNVCR7Z210T2Zmc2V0fWA7XG4gICAgICAgIHRoaXMuZHQgPSBkdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vdCBhbGwgZml4ZWQtb2Zmc2V0IHpvbmVzIGxpa2UgRXRjLys0OjMwIGFyZSBwcmVzZW50IGluIHR6ZGF0YS5cbiAgICAgICAgLy8gU28gd2UgaGF2ZSB0byBtYWtlIGRvLiBUd28gY2FzZXM6XG4gICAgICAgIC8vIDEuIFRoZSBmb3JtYXQgb3B0aW9ucyB0ZWxsIHVzIHRvIHNob3cgdGhlIHpvbmUuIFdlIGNhbid0IGRvIHRoYXQsIHNvIHRoZSBiZXN0XG4gICAgICAgIC8vIHdlIGNhbiBkbyBpcyBmb3JtYXQgdGhlIGRhdGUgaW4gVVRDLlxuICAgICAgICAvLyAyLiBUaGUgZm9ybWF0IG9wdGlvbnMgZG9uJ3QgdGVsbCB1cyB0byBzaG93IHRoZSB6b25lLiBUaGVuIHdlIGNhbiBhZGp1c3QgdGhlbVxuICAgICAgICAvLyB0aGUgdGltZSBhbmQgdGVsbCB0aGUgZm9ybWF0dGVyIHRvIHNob3cgaXQgdG8gdXMgaW4gVVRDLCBzbyB0aGF0IHRoZSB0aW1lIGlzIHJpZ2h0XG4gICAgICAgIC8vIGFuZCB0aGUgYmFkIHpvbmUgZG9lc24ndCBzaG93IHVwLlxuICAgICAgICB6ID0gXCJVVENcIjtcblxuICAgICAgICBpZiAob3B0cy50aW1lWm9uZU5hbWUpIHtcbiAgICAgICAgICB0aGlzLmR0ID0gZHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kdCA9IGR0Lm9mZnNldCA9PT0gMCA/IGR0IDogRGF0ZVRpbWUuZnJvbU1pbGxpcyhkdC50cyArIGR0Lm9mZnNldCAqIDYwICogMTAwMCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGR0LnpvbmUudHlwZSA9PT0gXCJsb2NhbFwiKSB7XG4gICAgICB0aGlzLmR0ID0gZHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZHQgPSBkdDtcbiAgICAgIHogPSBkdC56b25lLm5hbWU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFzSW50bCkge1xuICAgICAgY29uc3QgaW50bE9wdHMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdHMpO1xuXG4gICAgICBpZiAoeikge1xuICAgICAgICBpbnRsT3B0cy50aW1lWm9uZSA9IHo7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZHRmID0gZ2V0Q2FjaGVkRFRGKGludGwsIGludGxPcHRzKTtcbiAgICB9XG4gIH1cblxuICBmb3JtYXQoKSB7XG4gICAgaWYgKHRoaXMuaGFzSW50bCkge1xuICAgICAgcmV0dXJuIHRoaXMuZHRmLmZvcm1hdCh0aGlzLmR0LnRvSlNEYXRlKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0b2tlbkZvcm1hdCA9IGZvcm1hdFN0cmluZyh0aGlzLm9wdHMpLFxuICAgICAgICAgICAgbG9jID0gTG9jYWxlLmNyZWF0ZShcImVuLVVTXCIpO1xuICAgICAgcmV0dXJuIEZvcm1hdHRlci5jcmVhdGUobG9jKS5mb3JtYXREYXRlVGltZUZyb21TdHJpbmcodGhpcy5kdCwgdG9rZW5Gb3JtYXQpO1xuICAgIH1cbiAgfVxuXG4gIGZvcm1hdFRvUGFydHMoKSB7XG4gICAgaWYgKHRoaXMuaGFzSW50bCAmJiBoYXNGb3JtYXRUb1BhcnRzKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmR0Zi5mb3JtYXRUb1BhcnRzKHRoaXMuZHQudG9KU0RhdGUoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoaXMgaXMga2luZCBvZiBhIGNvcCBvdXQuIFdlIGFjdHVhbGx5IGNvdWxkIGRvIHRoaXMgZm9yIEVuZ2xpc2guIEhvd2V2ZXIsIHdlIGNvdWxkbid0IGRvIGl0IGZvciBpbnRsIHN0cmluZ3NcbiAgICAgIC8vIGFuZCBJTU8gaXQncyB0b28gd2VpcmQgdG8gaGF2ZSBhbiB1bmNhbm55IHZhbGxleSBsaWtlIHRoYXRcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICByZXNvbHZlZE9wdGlvbnMoKSB7XG4gICAgaWYgKHRoaXMuaGFzSW50bCkge1xuICAgICAgcmV0dXJuIHRoaXMuZHRmLnJlc29sdmVkT3B0aW9ucygpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsb2NhbGU6IFwiZW4tVVNcIixcbiAgICAgICAgbnVtYmVyaW5nU3lzdGVtOiBcImxhdG5cIixcbiAgICAgICAgb3V0cHV0Q2FsZW5kYXI6IFwiZ3JlZ29yeVwiXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG59XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cblxuXG5jbGFzcyBQb2x5UmVsRm9ybWF0dGVyIHtcbiAgY29uc3RydWN0b3IoaW50bCwgaXNFbmdsaXNoLCBvcHRzKSB7XG4gICAgdGhpcy5vcHRzID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICBzdHlsZTogXCJsb25nXCJcbiAgICB9LCBvcHRzKTtcblxuICAgIGlmICghaXNFbmdsaXNoICYmIGhhc1JlbGF0aXZlKCkpIHtcbiAgICAgIHRoaXMucnRmID0gZ2V0Q2FjaGVkUlRGKGludGwsIG9wdHMpO1xuICAgIH1cbiAgfVxuXG4gIGZvcm1hdChjb3VudCwgdW5pdCkge1xuICAgIGlmICh0aGlzLnJ0Zikge1xuICAgICAgcmV0dXJuIHRoaXMucnRmLmZvcm1hdChjb3VudCwgdW5pdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmb3JtYXRSZWxhdGl2ZVRpbWUodW5pdCwgY291bnQsIHRoaXMub3B0cy5udW1lcmljLCB0aGlzLm9wdHMuc3R5bGUgIT09IFwibG9uZ1wiKTtcbiAgICB9XG4gIH1cblxuICBmb3JtYXRUb1BhcnRzKGNvdW50LCB1bml0KSB7XG4gICAgaWYgKHRoaXMucnRmKSB7XG4gICAgICByZXR1cm4gdGhpcy5ydGYuZm9ybWF0VG9QYXJ0cyhjb3VudCwgdW5pdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxufVxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cblxuY2xhc3MgTG9jYWxlIHtcbiAgc3RhdGljIGZyb21PcHRzKG9wdHMpIHtcbiAgICByZXR1cm4gTG9jYWxlLmNyZWF0ZShvcHRzLmxvY2FsZSwgb3B0cy5udW1iZXJpbmdTeXN0ZW0sIG9wdHMub3V0cHV0Q2FsZW5kYXIsIG9wdHMuZGVmYXVsdFRvRU4pO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZShsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIsIGRlZmF1bHRUb0VOID0gZmFsc2UpIHtcbiAgICBjb25zdCBzcGVjaWZpZWRMb2NhbGUgPSBsb2NhbGUgfHwgU2V0dGluZ3MuZGVmYXVsdExvY2FsZSxcbiAgICAgICAgICAvLyB0aGUgc3lzdGVtIGxvY2FsZSBpcyB1c2VmdWwgZm9yIGh1bWFuIHJlYWRhYmxlIHN0cmluZ3MgYnV0IGFubm95aW5nIGZvciBwYXJzaW5nL2Zvcm1hdHRpbmcga25vd24gZm9ybWF0c1xuICAgIGxvY2FsZVIgPSBzcGVjaWZpZWRMb2NhbGUgfHwgKGRlZmF1bHRUb0VOID8gXCJlbi1VU1wiIDogc3lzdGVtTG9jYWxlKCkpLFxuICAgICAgICAgIG51bWJlcmluZ1N5c3RlbVIgPSBudW1iZXJpbmdTeXN0ZW0gfHwgU2V0dGluZ3MuZGVmYXVsdE51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgICBvdXRwdXRDYWxlbmRhclIgPSBvdXRwdXRDYWxlbmRhciB8fCBTZXR0aW5ncy5kZWZhdWx0T3V0cHV0Q2FsZW5kYXI7XG4gICAgcmV0dXJuIG5ldyBMb2NhbGUobG9jYWxlUiwgbnVtYmVyaW5nU3lzdGVtUiwgb3V0cHV0Q2FsZW5kYXJSLCBzcGVjaWZpZWRMb2NhbGUpO1xuICB9XG5cbiAgc3RhdGljIHJlc2V0Q2FjaGUoKSB7XG4gICAgc3lzTG9jYWxlQ2FjaGUgPSBudWxsO1xuICAgIGludGxEVENhY2hlID0ge307XG4gICAgaW50bE51bUNhY2hlID0ge307XG4gICAgaW50bFJlbENhY2hlID0ge307XG4gIH1cblxuICBzdGF0aWMgZnJvbU9iamVjdCh7XG4gICAgbG9jYWxlLFxuICAgIG51bWJlcmluZ1N5c3RlbSxcbiAgICBvdXRwdXRDYWxlbmRhclxuICB9ID0ge30pIHtcbiAgICByZXR1cm4gTG9jYWxlLmNyZWF0ZShsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIpO1xuICB9XG5cbiAgY29uc3RydWN0b3IobG9jYWxlLCBudW1iZXJpbmcsIG91dHB1dENhbGVuZGFyLCBzcGVjaWZpZWRMb2NhbGUpIHtcbiAgICBjb25zdCBbcGFyc2VkTG9jYWxlLCBwYXJzZWROdW1iZXJpbmdTeXN0ZW0sIHBhcnNlZE91dHB1dENhbGVuZGFyXSA9IHBhcnNlTG9jYWxlU3RyaW5nKGxvY2FsZSk7XG4gICAgdGhpcy5sb2NhbGUgPSBwYXJzZWRMb2NhbGU7XG4gICAgdGhpcy5udW1iZXJpbmdTeXN0ZW0gPSBudW1iZXJpbmcgfHwgcGFyc2VkTnVtYmVyaW5nU3lzdGVtIHx8IG51bGw7XG4gICAgdGhpcy5vdXRwdXRDYWxlbmRhciA9IG91dHB1dENhbGVuZGFyIHx8IHBhcnNlZE91dHB1dENhbGVuZGFyIHx8IG51bGw7XG4gICAgdGhpcy5pbnRsID0gaW50bENvbmZpZ1N0cmluZyh0aGlzLmxvY2FsZSwgdGhpcy5udW1iZXJpbmdTeXN0ZW0sIHRoaXMub3V0cHV0Q2FsZW5kYXIpO1xuICAgIHRoaXMud2Vla2RheXNDYWNoZSA9IHtcbiAgICAgIGZvcm1hdDoge30sXG4gICAgICBzdGFuZGFsb25lOiB7fVxuICAgIH07XG4gICAgdGhpcy5tb250aHNDYWNoZSA9IHtcbiAgICAgIGZvcm1hdDoge30sXG4gICAgICBzdGFuZGFsb25lOiB7fVxuICAgIH07XG4gICAgdGhpcy5tZXJpZGllbUNhY2hlID0gbnVsbDtcbiAgICB0aGlzLmVyYUNhY2hlID0ge307XG4gICAgdGhpcy5zcGVjaWZpZWRMb2NhbGUgPSBzcGVjaWZpZWRMb2NhbGU7XG4gICAgdGhpcy5mYXN0TnVtYmVyc0NhY2hlZCA9IG51bGw7XG4gIH1cblxuICBnZXQgZmFzdE51bWJlcnMoKSB7XG4gICAgaWYgKHRoaXMuZmFzdE51bWJlcnNDYWNoZWQgPT0gbnVsbCkge1xuICAgICAgdGhpcy5mYXN0TnVtYmVyc0NhY2hlZCA9IHN1cHBvcnRzRmFzdE51bWJlcnModGhpcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZmFzdE51bWJlcnNDYWNoZWQ7XG4gIH1cblxuICBsaXN0aW5nTW9kZShkZWZhdWx0T0sgPSB0cnVlKSB7XG4gICAgY29uc3QgaW50bCA9IGhhc0ludGwoKSxcbiAgICAgICAgICBoYXNGVFAgPSBpbnRsICYmIGhhc0Zvcm1hdFRvUGFydHMoKSxcbiAgICAgICAgICBpc0FjdHVhbGx5RW4gPSB0aGlzLmlzRW5nbGlzaCgpLFxuICAgICAgICAgIGhhc05vV2VpcmRuZXNzID0gKHRoaXMubnVtYmVyaW5nU3lzdGVtID09PSBudWxsIHx8IHRoaXMubnVtYmVyaW5nU3lzdGVtID09PSBcImxhdG5cIikgJiYgKHRoaXMub3V0cHV0Q2FsZW5kYXIgPT09IG51bGwgfHwgdGhpcy5vdXRwdXRDYWxlbmRhciA9PT0gXCJncmVnb3J5XCIpO1xuXG4gICAgaWYgKCFoYXNGVFAgJiYgIShpc0FjdHVhbGx5RW4gJiYgaGFzTm9XZWlyZG5lc3MpICYmICFkZWZhdWx0T0spIHtcbiAgICAgIHJldHVybiBcImVycm9yXCI7XG4gICAgfSBlbHNlIGlmICghaGFzRlRQIHx8IGlzQWN0dWFsbHlFbiAmJiBoYXNOb1dlaXJkbmVzcykge1xuICAgICAgcmV0dXJuIFwiZW5cIjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFwiaW50bFwiO1xuICAgIH1cbiAgfVxuXG4gIGNsb25lKGFsdHMpIHtcbiAgICBpZiAoIWFsdHMgfHwgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYWx0cykubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIExvY2FsZS5jcmVhdGUoYWx0cy5sb2NhbGUgfHwgdGhpcy5zcGVjaWZpZWRMb2NhbGUsIGFsdHMubnVtYmVyaW5nU3lzdGVtIHx8IHRoaXMubnVtYmVyaW5nU3lzdGVtLCBhbHRzLm91dHB1dENhbGVuZGFyIHx8IHRoaXMub3V0cHV0Q2FsZW5kYXIsIGFsdHMuZGVmYXVsdFRvRU4gfHwgZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIHJlZGVmYXVsdFRvRU4oYWx0cyA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoT2JqZWN0LmFzc2lnbih7fSwgYWx0cywge1xuICAgICAgZGVmYXVsdFRvRU46IHRydWVcbiAgICB9KSk7XG4gIH1cblxuICByZWRlZmF1bHRUb1N5c3RlbShhbHRzID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZShPYmplY3QuYXNzaWduKHt9LCBhbHRzLCB7XG4gICAgICBkZWZhdWx0VG9FTjogZmFsc2VcbiAgICB9KSk7XG4gIH1cblxuICBtb250aHMobGVuZ3RoLCBmb3JtYXQgPSBmYWxzZSwgZGVmYXVsdE9LID0gdHJ1ZSkge1xuICAgIHJldHVybiBsaXN0U3R1ZmYodGhpcywgbGVuZ3RoLCBkZWZhdWx0T0ssIG1vbnRocywgKCkgPT4ge1xuICAgICAgY29uc3QgaW50bCA9IGZvcm1hdCA/IHtcbiAgICAgICAgbW9udGg6IGxlbmd0aCxcbiAgICAgICAgZGF5OiBcIm51bWVyaWNcIlxuICAgICAgfSA6IHtcbiAgICAgICAgbW9udGg6IGxlbmd0aFxuICAgICAgfSxcbiAgICAgICAgICAgIGZvcm1hdFN0ciA9IGZvcm1hdCA/IFwiZm9ybWF0XCIgOiBcInN0YW5kYWxvbmVcIjtcblxuICAgICAgaWYgKCF0aGlzLm1vbnRoc0NhY2hlW2Zvcm1hdFN0cl1bbGVuZ3RoXSkge1xuICAgICAgICB0aGlzLm1vbnRoc0NhY2hlW2Zvcm1hdFN0cl1bbGVuZ3RoXSA9IG1hcE1vbnRocyhkdCA9PiB0aGlzLmV4dHJhY3QoZHQsIGludGwsIFwibW9udGhcIikpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5tb250aHNDYWNoZVtmb3JtYXRTdHJdW2xlbmd0aF07XG4gICAgfSk7XG4gIH1cblxuICB3ZWVrZGF5cyhsZW5ndGgsIGZvcm1hdCA9IGZhbHNlLCBkZWZhdWx0T0sgPSB0cnVlKSB7XG4gICAgcmV0dXJuIGxpc3RTdHVmZih0aGlzLCBsZW5ndGgsIGRlZmF1bHRPSywgd2Vla2RheXMsICgpID0+IHtcbiAgICAgIGNvbnN0IGludGwgPSBmb3JtYXQgPyB7XG4gICAgICAgIHdlZWtkYXk6IGxlbmd0aCxcbiAgICAgICAgeWVhcjogXCJudW1lcmljXCIsXG4gICAgICAgIG1vbnRoOiBcImxvbmdcIixcbiAgICAgICAgZGF5OiBcIm51bWVyaWNcIlxuICAgICAgfSA6IHtcbiAgICAgICAgd2Vla2RheTogbGVuZ3RoXG4gICAgICB9LFxuICAgICAgICAgICAgZm9ybWF0U3RyID0gZm9ybWF0ID8gXCJmb3JtYXRcIiA6IFwic3RhbmRhbG9uZVwiO1xuXG4gICAgICBpZiAoIXRoaXMud2Vla2RheXNDYWNoZVtmb3JtYXRTdHJdW2xlbmd0aF0pIHtcbiAgICAgICAgdGhpcy53ZWVrZGF5c0NhY2hlW2Zvcm1hdFN0cl1bbGVuZ3RoXSA9IG1hcFdlZWtkYXlzKGR0ID0+IHRoaXMuZXh0cmFjdChkdCwgaW50bCwgXCJ3ZWVrZGF5XCIpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMud2Vla2RheXNDYWNoZVtmb3JtYXRTdHJdW2xlbmd0aF07XG4gICAgfSk7XG4gIH1cblxuICBtZXJpZGllbXMoZGVmYXVsdE9LID0gdHJ1ZSkge1xuICAgIHJldHVybiBsaXN0U3R1ZmYodGhpcywgdW5kZWZpbmVkLCBkZWZhdWx0T0ssICgpID0+IG1lcmlkaWVtcywgKCkgPT4ge1xuICAgICAgLy8gSW4gdGhlb3J5IHRoZXJlIGNvdWxkIGJlIGFyaWJpdHJhcnkgZGF5IHBlcmlvZHMuIFdlJ3JlIGdvbm5hIGFzc3VtZSB0aGVyZSBhcmUgZXhhY3RseSB0d29cbiAgICAgIC8vIGZvciBBTSBhbmQgUE0uIFRoaXMgaXMgcHJvYmFibHkgd3JvbmcsIGJ1dCBpdCdzIG1ha2VzIHBhcnNpbmcgd2F5IGVhc2llci5cbiAgICAgIGlmICghdGhpcy5tZXJpZGllbUNhY2hlKSB7XG4gICAgICAgIGNvbnN0IGludGwgPSB7XG4gICAgICAgICAgaG91cjogXCJudW1lcmljXCIsXG4gICAgICAgICAgaG91cjEyOiB0cnVlXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMubWVyaWRpZW1DYWNoZSA9IFtEYXRlVGltZS51dGMoMjAxNiwgMTEsIDEzLCA5KSwgRGF0ZVRpbWUudXRjKDIwMTYsIDExLCAxMywgMTkpXS5tYXAoZHQgPT4gdGhpcy5leHRyYWN0KGR0LCBpbnRsLCBcImRheXBlcmlvZFwiKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLm1lcmlkaWVtQ2FjaGU7XG4gICAgfSk7XG4gIH1cblxuICBlcmFzKGxlbmd0aCwgZGVmYXVsdE9LID0gdHJ1ZSkge1xuICAgIHJldHVybiBsaXN0U3R1ZmYodGhpcywgbGVuZ3RoLCBkZWZhdWx0T0ssIGVyYXMsICgpID0+IHtcbiAgICAgIGNvbnN0IGludGwgPSB7XG4gICAgICAgIGVyYTogbGVuZ3RoXG4gICAgICB9OyAvLyBUaGlzIGlzIHByb2JsZW1hdGljLiBEaWZmZXJlbnQgY2FsZW5kYXJzIGFyZSBnb2luZyB0byBkZWZpbmUgZXJhcyB0b3RhbGx5IGRpZmZlcmVudGx5LiBXaGF0IEkgbmVlZCBpcyB0aGUgbWluaW11bSBzZXQgb2YgZGF0ZXNcbiAgICAgIC8vIHRvIGRlZmluaXRlbHkgZW51bWVyYXRlIHRoZW0uXG5cbiAgICAgIGlmICghdGhpcy5lcmFDYWNoZVtsZW5ndGhdKSB7XG4gICAgICAgIHRoaXMuZXJhQ2FjaGVbbGVuZ3RoXSA9IFtEYXRlVGltZS51dGMoLTQwLCAxLCAxKSwgRGF0ZVRpbWUudXRjKDIwMTcsIDEsIDEpXS5tYXAoZHQgPT4gdGhpcy5leHRyYWN0KGR0LCBpbnRsLCBcImVyYVwiKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmVyYUNhY2hlW2xlbmd0aF07XG4gICAgfSk7XG4gIH1cblxuICBleHRyYWN0KGR0LCBpbnRsT3B0cywgZmllbGQpIHtcbiAgICBjb25zdCBkZiA9IHRoaXMuZHRGb3JtYXR0ZXIoZHQsIGludGxPcHRzKSxcbiAgICAgICAgICByZXN1bHRzID0gZGYuZm9ybWF0VG9QYXJ0cygpLFxuICAgICAgICAgIG1hdGNoaW5nID0gcmVzdWx0cy5maW5kKG0gPT4gbS50eXBlLnRvTG93ZXJDYXNlKCkgPT09IGZpZWxkKTtcbiAgICByZXR1cm4gbWF0Y2hpbmcgPyBtYXRjaGluZy52YWx1ZSA6IG51bGw7XG4gIH1cblxuICBudW1iZXJGb3JtYXR0ZXIob3B0cyA9IHt9KSB7XG4gICAgLy8gdGhpcyBmb3JjZXNpbXBsZSBvcHRpb24gaXMgbmV2ZXIgdXNlZCAodGhlIG9ubHkgY2FsbGVyIHNob3J0LWNpcmN1aXRzIG9uIGl0LCBidXQgaXQgc2VlbXMgc2FmZXIgdG8gbGVhdmUpXG4gICAgLy8gKGluIGNvbnRyYXN0LCB0aGUgcmVzdCBvZiB0aGUgY29uZGl0aW9uIGlzIHVzZWQgaGVhdmlseSlcbiAgICByZXR1cm4gbmV3IFBvbHlOdW1iZXJGb3JtYXR0ZXIodGhpcy5pbnRsLCBvcHRzLmZvcmNlU2ltcGxlIHx8IHRoaXMuZmFzdE51bWJlcnMsIG9wdHMpO1xuICB9XG5cbiAgZHRGb3JtYXR0ZXIoZHQsIGludGxPcHRzID0ge30pIHtcbiAgICByZXR1cm4gbmV3IFBvbHlEYXRlRm9ybWF0dGVyKGR0LCB0aGlzLmludGwsIGludGxPcHRzKTtcbiAgfVxuXG4gIHJlbEZvcm1hdHRlcihvcHRzID0ge30pIHtcbiAgICByZXR1cm4gbmV3IFBvbHlSZWxGb3JtYXR0ZXIodGhpcy5pbnRsLCB0aGlzLmlzRW5nbGlzaCgpLCBvcHRzKTtcbiAgfVxuXG4gIGlzRW5nbGlzaCgpIHtcbiAgICByZXR1cm4gdGhpcy5sb2NhbGUgPT09IFwiZW5cIiB8fCB0aGlzLmxvY2FsZS50b0xvd2VyQ2FzZSgpID09PSBcImVuLXVzXCIgfHwgaGFzSW50bCgpICYmIG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KHRoaXMuaW50bCkucmVzb2x2ZWRPcHRpb25zKCkubG9jYWxlLnN0YXJ0c1dpdGgoXCJlbi11c1wiKTtcbiAgfVxuXG4gIGVxdWFscyhvdGhlcikge1xuICAgIHJldHVybiB0aGlzLmxvY2FsZSA9PT0gb3RoZXIubG9jYWxlICYmIHRoaXMubnVtYmVyaW5nU3lzdGVtID09PSBvdGhlci5udW1iZXJpbmdTeXN0ZW0gJiYgdGhpcy5vdXRwdXRDYWxlbmRhciA9PT0gb3RoZXIub3V0cHV0Q2FsZW5kYXI7XG4gIH1cblxufVxuXG4vKlxuICogVGhpcyBmaWxlIGhhbmRsZXMgcGFyc2luZyBmb3Igd2VsbC1zcGVjaWZpZWQgZm9ybWF0cy4gSGVyZSdzIGhvdyBpdCB3b3JrczpcbiAqIFR3byB0aGluZ3MgZ28gaW50byBwYXJzaW5nOiBhIHJlZ2V4IHRvIG1hdGNoIHdpdGggYW5kIGFuIGV4dHJhY3RvciB0byB0YWtlIGFwYXJ0IHRoZSBncm91cHMgaW4gdGhlIG1hdGNoLlxuICogQW4gZXh0cmFjdG9yIGlzIGp1c3QgYSBmdW5jdGlvbiB0aGF0IHRha2VzIGEgcmVnZXggbWF0Y2ggYXJyYXkgYW5kIHJldHVybnMgYSB7IHllYXI6IC4uLiwgbW9udGg6IC4uLiB9IG9iamVjdFxuICogcGFyc2UoKSBkb2VzIHRoZSB3b3JrIG9mIGV4ZWN1dGluZyB0aGUgcmVnZXggYW5kIGFwcGx5aW5nIHRoZSBleHRyYWN0b3IuIEl0IHRha2VzIG11bHRpcGxlIHJlZ2V4L2V4dHJhY3RvciBwYWlycyB0byB0cnkgaW4gc2VxdWVuY2UuXG4gKiBFeHRyYWN0b3JzIGNhbiB0YWtlIGEgXCJjdXJzb3JcIiByZXByZXNlbnRpbmcgdGhlIG9mZnNldCBpbiB0aGUgbWF0Y2ggdG8gbG9vayBhdC4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIGNvbWJpbmUgZXh0cmFjdG9ycy5cbiAqIGNvbWJpbmVFeHRyYWN0b3JzKCkgZG9lcyB0aGUgd29yayBvZiBjb21iaW5pbmcgdGhlbSwga2VlcGluZyB0cmFjayBvZiB0aGUgY3Vyc29yIHRocm91Z2ggbXVsdGlwbGUgZXh0cmFjdGlvbnMuXG4gKiBTb21lIGV4dHJhY3Rpb25zIGFyZSBzdXBlciBkdW1iIGFuZCBzaW1wbGVQYXJzZSBhbmQgZnJvbVN0cmluZ3MgaGVscCBEUlkgdGhlbS5cbiAqL1xuXG5mdW5jdGlvbiBjb21iaW5lUmVnZXhlcyguLi5yZWdleGVzKSB7XG4gIGNvbnN0IGZ1bGwgPSByZWdleGVzLnJlZHVjZSgoZiwgcikgPT4gZiArIHIuc291cmNlLCBcIlwiKTtcbiAgcmV0dXJuIFJlZ0V4cChgXiR7ZnVsbH0kYCk7XG59XG5cbmZ1bmN0aW9uIGNvbWJpbmVFeHRyYWN0b3JzKC4uLmV4dHJhY3RvcnMpIHtcbiAgcmV0dXJuIG0gPT4gZXh0cmFjdG9ycy5yZWR1Y2UoKFttZXJnZWRWYWxzLCBtZXJnZWRab25lLCBjdXJzb3JdLCBleCkgPT4ge1xuICAgIGNvbnN0IFt2YWwsIHpvbmUsIG5leHRdID0gZXgobSwgY3Vyc29yKTtcbiAgICByZXR1cm4gW09iamVjdC5hc3NpZ24obWVyZ2VkVmFscywgdmFsKSwgbWVyZ2VkWm9uZSB8fCB6b25lLCBuZXh0XTtcbiAgfSwgW3t9LCBudWxsLCAxXSkuc2xpY2UoMCwgMik7XG59XG5cbmZ1bmN0aW9uIHBhcnNlKHMsIC4uLnBhdHRlcm5zKSB7XG4gIGlmIChzID09IG51bGwpIHtcbiAgICByZXR1cm4gW251bGwsIG51bGxdO1xuICB9XG5cbiAgZm9yIChjb25zdCBbcmVnZXgsIGV4dHJhY3Rvcl0gb2YgcGF0dGVybnMpIHtcbiAgICBjb25zdCBtID0gcmVnZXguZXhlYyhzKTtcblxuICAgIGlmIChtKSB7XG4gICAgICByZXR1cm4gZXh0cmFjdG9yKG0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBbbnVsbCwgbnVsbF07XG59XG5cbmZ1bmN0aW9uIHNpbXBsZVBhcnNlKC4uLmtleXMpIHtcbiAgcmV0dXJuIChtYXRjaCwgY3Vyc29yKSA9PiB7XG4gICAgY29uc3QgcmV0ID0ge307XG4gICAgbGV0IGk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgcmV0W2tleXNbaV1dID0gcGFyc2VJbnRlZ2VyKG1hdGNoW2N1cnNvciArIGldKTtcbiAgICB9XG5cbiAgICByZXR1cm4gW3JldCwgbnVsbCwgY3Vyc29yICsgaV07XG4gIH07XG59IC8vIElTTyBhbmQgU1FMIHBhcnNpbmdcblxuXG5jb25zdCBvZmZzZXRSZWdleCA9IC8oPzooWil8KFsrLV1cXGRcXGQpKD86Oj8oXFxkXFxkKSk/KS8sXG4gICAgICBpc29UaW1lQmFzZVJlZ2V4ID0gLyhcXGRcXGQpKD86Oj8oXFxkXFxkKSg/Ojo/KFxcZFxcZCkoPzpbLixdKFxcZHsxLDMwfSkpPyk/KT8vLFxuICAgICAgaXNvVGltZVJlZ2V4ID0gUmVnRXhwKGAke2lzb1RpbWVCYXNlUmVnZXguc291cmNlfSR7b2Zmc2V0UmVnZXguc291cmNlfT9gKSxcbiAgICAgIGlzb1RpbWVFeHRlbnNpb25SZWdleCA9IFJlZ0V4cChgKD86VCR7aXNvVGltZVJlZ2V4LnNvdXJjZX0pP2ApLFxuICAgICAgaXNvWW1kUmVnZXggPSAvKFsrLV1cXGR7Nn18XFxkezR9KSg/Oi0/KFxcZFxcZCkoPzotPyhcXGRcXGQpKT8pPy8sXG4gICAgICBpc29XZWVrUmVnZXggPSAvKFxcZHs0fSktP1coXFxkXFxkKSg/Oi0/KFxcZCkpPy8sXG4gICAgICBpc29PcmRpbmFsUmVnZXggPSAvKFxcZHs0fSktPyhcXGR7M30pLyxcbiAgICAgIGV4dHJhY3RJU09XZWVrRGF0YSA9IHNpbXBsZVBhcnNlKFwid2Vla1llYXJcIiwgXCJ3ZWVrTnVtYmVyXCIsIFwid2Vla0RheVwiKSxcbiAgICAgIGV4dHJhY3RJU09PcmRpbmFsRGF0YSA9IHNpbXBsZVBhcnNlKFwieWVhclwiLCBcIm9yZGluYWxcIiksXG4gICAgICBzcWxZbWRSZWdleCA9IC8oXFxkezR9KS0oXFxkXFxkKS0oXFxkXFxkKS8sXG4gICAgICAvLyBkdW1iZWQtZG93biB2ZXJzaW9uIG9mIHRoZSBJU08gb25lXG5zcWxUaW1lUmVnZXggPSBSZWdFeHAoYCR7aXNvVGltZUJhc2VSZWdleC5zb3VyY2V9ID8oPzoke29mZnNldFJlZ2V4LnNvdXJjZX18KCR7aWFuYVJlZ2V4LnNvdXJjZX0pKT9gKSxcbiAgICAgIHNxbFRpbWVFeHRlbnNpb25SZWdleCA9IFJlZ0V4cChgKD86ICR7c3FsVGltZVJlZ2V4LnNvdXJjZX0pP2ApO1xuXG5mdW5jdGlvbiBpbnQobWF0Y2gsIHBvcywgZmFsbGJhY2spIHtcbiAgY29uc3QgbSA9IG1hdGNoW3Bvc107XG4gIHJldHVybiBpc1VuZGVmaW5lZChtKSA/IGZhbGxiYWNrIDogcGFyc2VJbnRlZ2VyKG0pO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0SVNPWW1kKG1hdGNoLCBjdXJzb3IpIHtcbiAgY29uc3QgaXRlbSA9IHtcbiAgICB5ZWFyOiBpbnQobWF0Y2gsIGN1cnNvciksXG4gICAgbW9udGg6IGludChtYXRjaCwgY3Vyc29yICsgMSwgMSksXG4gICAgZGF5OiBpbnQobWF0Y2gsIGN1cnNvciArIDIsIDEpXG4gIH07XG4gIHJldHVybiBbaXRlbSwgbnVsbCwgY3Vyc29yICsgM107XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RJU09UaW1lKG1hdGNoLCBjdXJzb3IpIHtcbiAgY29uc3QgaXRlbSA9IHtcbiAgICBob3VyczogaW50KG1hdGNoLCBjdXJzb3IsIDApLFxuICAgIG1pbnV0ZXM6IGludChtYXRjaCwgY3Vyc29yICsgMSwgMCksXG4gICAgc2Vjb25kczogaW50KG1hdGNoLCBjdXJzb3IgKyAyLCAwKSxcbiAgICBtaWxsaXNlY29uZHM6IHBhcnNlTWlsbGlzKG1hdGNoW2N1cnNvciArIDNdKVxuICB9O1xuICByZXR1cm4gW2l0ZW0sIG51bGwsIGN1cnNvciArIDRdO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0SVNPT2Zmc2V0KG1hdGNoLCBjdXJzb3IpIHtcbiAgY29uc3QgbG9jYWwgPSAhbWF0Y2hbY3Vyc29yXSAmJiAhbWF0Y2hbY3Vyc29yICsgMV0sXG4gICAgICAgIGZ1bGxPZmZzZXQgPSBzaWduZWRPZmZzZXQobWF0Y2hbY3Vyc29yICsgMV0sIG1hdGNoW2N1cnNvciArIDJdKSxcbiAgICAgICAgem9uZSA9IGxvY2FsID8gbnVsbCA6IEZpeGVkT2Zmc2V0Wm9uZS5pbnN0YW5jZShmdWxsT2Zmc2V0KTtcbiAgcmV0dXJuIFt7fSwgem9uZSwgY3Vyc29yICsgM107XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RJQU5BWm9uZShtYXRjaCwgY3Vyc29yKSB7XG4gIGNvbnN0IHpvbmUgPSBtYXRjaFtjdXJzb3JdID8gSUFOQVpvbmUuY3JlYXRlKG1hdGNoW2N1cnNvcl0pIDogbnVsbDtcbiAgcmV0dXJuIFt7fSwgem9uZSwgY3Vyc29yICsgMV07XG59IC8vIElTTyB0aW1lIHBhcnNpbmdcblxuXG5jb25zdCBpc29UaW1lT25seSA9IFJlZ0V4cChgXlQ/JHtpc29UaW1lQmFzZVJlZ2V4LnNvdXJjZX0kYCk7IC8vIElTTyBkdXJhdGlvbiBwYXJzaW5nXG5cbmNvbnN0IGlzb0R1cmF0aW9uID0gL14tP1AoPzooPzooLT9cXGR7MSw5fSlZKT8oPzooLT9cXGR7MSw5fSlNKT8oPzooLT9cXGR7MSw5fSlXKT8oPzooLT9cXGR7MSw5fSlEKT8oPzpUKD86KC0/XFxkezEsOX0pSCk/KD86KC0/XFxkezEsOX0pTSk/KD86KC0/XFxkezEsMjB9KSg/OlsuLF0oLT9cXGR7MSw5fSkpP1MpPyk/KSQvO1xuXG5mdW5jdGlvbiBleHRyYWN0SVNPRHVyYXRpb24obWF0Y2gpIHtcbiAgY29uc3QgW3MsIHllYXJTdHIsIG1vbnRoU3RyLCB3ZWVrU3RyLCBkYXlTdHIsIGhvdXJTdHIsIG1pbnV0ZVN0ciwgc2Vjb25kU3RyLCBtaWxsaXNlY29uZHNTdHJdID0gbWF0Y2g7XG4gIGNvbnN0IGhhc05lZ2F0aXZlUHJlZml4ID0gc1swXSA9PT0gXCItXCI7XG5cbiAgY29uc3QgbWF5YmVOZWdhdGUgPSBudW0gPT4gbnVtICYmIGhhc05lZ2F0aXZlUHJlZml4ID8gLW51bSA6IG51bTtcblxuICByZXR1cm4gW3tcbiAgICB5ZWFyczogbWF5YmVOZWdhdGUocGFyc2VJbnRlZ2VyKHllYXJTdHIpKSxcbiAgICBtb250aHM6IG1heWJlTmVnYXRlKHBhcnNlSW50ZWdlcihtb250aFN0cikpLFxuICAgIHdlZWtzOiBtYXliZU5lZ2F0ZShwYXJzZUludGVnZXIod2Vla1N0cikpLFxuICAgIGRheXM6IG1heWJlTmVnYXRlKHBhcnNlSW50ZWdlcihkYXlTdHIpKSxcbiAgICBob3VyczogbWF5YmVOZWdhdGUocGFyc2VJbnRlZ2VyKGhvdXJTdHIpKSxcbiAgICBtaW51dGVzOiBtYXliZU5lZ2F0ZShwYXJzZUludGVnZXIobWludXRlU3RyKSksXG4gICAgc2Vjb25kczogbWF5YmVOZWdhdGUocGFyc2VJbnRlZ2VyKHNlY29uZFN0cikpLFxuICAgIG1pbGxpc2Vjb25kczogbWF5YmVOZWdhdGUocGFyc2VNaWxsaXMobWlsbGlzZWNvbmRzU3RyKSlcbiAgfV07XG59IC8vIFRoZXNlIGFyZSBhIGxpdHRsZSBicmFpbmRlYWQuIEVEVCAqc2hvdWxkKiB0ZWxsIHVzIHRoYXQgd2UncmUgaW4sIHNheSwgQW1lcmljYS9OZXdfWW9ya1xuLy8gYW5kIG5vdCBqdXN0IHRoYXQgd2UncmUgaW4gLTI0MCAqcmlnaHQgbm93Ki4gQnV0IHNpbmNlIEkgZG9uJ3QgdGhpbmsgdGhlc2UgYXJlIHVzZWQgdGhhdCBvZnRlblxuLy8gSSdtIGp1c3QgZ29pbmcgdG8gaWdub3JlIHRoYXRcblxuXG5jb25zdCBvYnNPZmZzZXRzID0ge1xuICBHTVQ6IDAsXG4gIEVEVDogLTQgKiA2MCxcbiAgRVNUOiAtNSAqIDYwLFxuICBDRFQ6IC01ICogNjAsXG4gIENTVDogLTYgKiA2MCxcbiAgTURUOiAtNiAqIDYwLFxuICBNU1Q6IC03ICogNjAsXG4gIFBEVDogLTcgKiA2MCxcbiAgUFNUOiAtOCAqIDYwXG59O1xuXG5mdW5jdGlvbiBmcm9tU3RyaW5ncyh3ZWVrZGF5U3RyLCB5ZWFyU3RyLCBtb250aFN0ciwgZGF5U3RyLCBob3VyU3RyLCBtaW51dGVTdHIsIHNlY29uZFN0cikge1xuICBjb25zdCByZXN1bHQgPSB7XG4gICAgeWVhcjogeWVhclN0ci5sZW5ndGggPT09IDIgPyB1bnRydW5jYXRlWWVhcihwYXJzZUludGVnZXIoeWVhclN0cikpIDogcGFyc2VJbnRlZ2VyKHllYXJTdHIpLFxuICAgIG1vbnRoOiBtb250aHNTaG9ydC5pbmRleE9mKG1vbnRoU3RyKSArIDEsXG4gICAgZGF5OiBwYXJzZUludGVnZXIoZGF5U3RyKSxcbiAgICBob3VyOiBwYXJzZUludGVnZXIoaG91clN0ciksXG4gICAgbWludXRlOiBwYXJzZUludGVnZXIobWludXRlU3RyKVxuICB9O1xuICBpZiAoc2Vjb25kU3RyKSByZXN1bHQuc2Vjb25kID0gcGFyc2VJbnRlZ2VyKHNlY29uZFN0cik7XG5cbiAgaWYgKHdlZWtkYXlTdHIpIHtcbiAgICByZXN1bHQud2Vla2RheSA9IHdlZWtkYXlTdHIubGVuZ3RoID4gMyA/IHdlZWtkYXlzTG9uZy5pbmRleE9mKHdlZWtkYXlTdHIpICsgMSA6IHdlZWtkYXlzU2hvcnQuaW5kZXhPZih3ZWVrZGF5U3RyKSArIDE7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufSAvLyBSRkMgMjgyMi81MzIyXG5cblxuY29uc3QgcmZjMjgyMiA9IC9eKD86KE1vbnxUdWV8V2VkfFRodXxGcml8U2F0fFN1biksXFxzKT8oXFxkezEsMn0pXFxzKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKVxccyhcXGR7Miw0fSlcXHMoXFxkXFxkKTooXFxkXFxkKSg/OjooXFxkXFxkKSk/XFxzKD86KFVUfEdNVHxbRUNNUF1bU0RdVCl8KFtael0pfCg/OihbKy1dXFxkXFxkKShcXGRcXGQpKSkkLztcblxuZnVuY3Rpb24gZXh0cmFjdFJGQzI4MjIobWF0Y2gpIHtcbiAgY29uc3QgWywgd2Vla2RheVN0ciwgZGF5U3RyLCBtb250aFN0ciwgeWVhclN0ciwgaG91clN0ciwgbWludXRlU3RyLCBzZWNvbmRTdHIsIG9ic09mZnNldCwgbWlsT2Zmc2V0LCBvZmZIb3VyU3RyLCBvZmZNaW51dGVTdHJdID0gbWF0Y2gsXG4gICAgICAgIHJlc3VsdCA9IGZyb21TdHJpbmdzKHdlZWtkYXlTdHIsIHllYXJTdHIsIG1vbnRoU3RyLCBkYXlTdHIsIGhvdXJTdHIsIG1pbnV0ZVN0ciwgc2Vjb25kU3RyKTtcbiAgbGV0IG9mZnNldDtcblxuICBpZiAob2JzT2Zmc2V0KSB7XG4gICAgb2Zmc2V0ID0gb2JzT2Zmc2V0c1tvYnNPZmZzZXRdO1xuICB9IGVsc2UgaWYgKG1pbE9mZnNldCkge1xuICAgIG9mZnNldCA9IDA7XG4gIH0gZWxzZSB7XG4gICAgb2Zmc2V0ID0gc2lnbmVkT2Zmc2V0KG9mZkhvdXJTdHIsIG9mZk1pbnV0ZVN0cik7XG4gIH1cblxuICByZXR1cm4gW3Jlc3VsdCwgbmV3IEZpeGVkT2Zmc2V0Wm9uZShvZmZzZXQpXTtcbn1cblxuZnVuY3Rpb24gcHJlcHJvY2Vzc1JGQzI4MjIocykge1xuICAvLyBSZW1vdmUgY29tbWVudHMgYW5kIGZvbGRpbmcgd2hpdGVzcGFjZSBhbmQgcmVwbGFjZSBtdWx0aXBsZS1zcGFjZXMgd2l0aCBhIHNpbmdsZSBzcGFjZVxuICByZXR1cm4gcy5yZXBsYWNlKC9cXChbXildKlxcKXxbXFxuXFx0XS9nLCBcIiBcIikucmVwbGFjZSgvKFxcc1xccyspL2csIFwiIFwiKS50cmltKCk7XG59IC8vIGh0dHAgZGF0ZVxuXG5cbmNvbnN0IHJmYzExMjMgPSAvXihNb258VHVlfFdlZHxUaHV8RnJpfFNhdHxTdW4pLCAoXFxkXFxkKSAoSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpIChcXGR7NH0pIChcXGRcXGQpOihcXGRcXGQpOihcXGRcXGQpIEdNVCQvLFxuICAgICAgcmZjODUwID0gL14oTW9uZGF5fFR1ZXNkYXl8V2Vkc2RheXxUaHVyc2RheXxGcmlkYXl8U2F0dXJkYXl8U3VuZGF5KSwgKFxcZFxcZCktKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKS0oXFxkXFxkKSAoXFxkXFxkKTooXFxkXFxkKTooXFxkXFxkKSBHTVQkLyxcbiAgICAgIGFzY2lpID0gL14oTW9ufFR1ZXxXZWR8VGh1fEZyaXxTYXR8U3VuKSAoSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpICggXFxkfFxcZFxcZCkgKFxcZFxcZCk6KFxcZFxcZCk6KFxcZFxcZCkgKFxcZHs0fSkkLztcblxuZnVuY3Rpb24gZXh0cmFjdFJGQzExMjNPcjg1MChtYXRjaCkge1xuICBjb25zdCBbLCB3ZWVrZGF5U3RyLCBkYXlTdHIsIG1vbnRoU3RyLCB5ZWFyU3RyLCBob3VyU3RyLCBtaW51dGVTdHIsIHNlY29uZFN0cl0gPSBtYXRjaCxcbiAgICAgICAgcmVzdWx0ID0gZnJvbVN0cmluZ3Mod2Vla2RheVN0ciwgeWVhclN0ciwgbW9udGhTdHIsIGRheVN0ciwgaG91clN0ciwgbWludXRlU3RyLCBzZWNvbmRTdHIpO1xuICByZXR1cm4gW3Jlc3VsdCwgRml4ZWRPZmZzZXRab25lLnV0Y0luc3RhbmNlXTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdEFTQ0lJKG1hdGNoKSB7XG4gIGNvbnN0IFssIHdlZWtkYXlTdHIsIG1vbnRoU3RyLCBkYXlTdHIsIGhvdXJTdHIsIG1pbnV0ZVN0ciwgc2Vjb25kU3RyLCB5ZWFyU3RyXSA9IG1hdGNoLFxuICAgICAgICByZXN1bHQgPSBmcm9tU3RyaW5ncyh3ZWVrZGF5U3RyLCB5ZWFyU3RyLCBtb250aFN0ciwgZGF5U3RyLCBob3VyU3RyLCBtaW51dGVTdHIsIHNlY29uZFN0cik7XG4gIHJldHVybiBbcmVzdWx0LCBGaXhlZE9mZnNldFpvbmUudXRjSW5zdGFuY2VdO1xufVxuXG5jb25zdCBpc29ZbWRXaXRoVGltZUV4dGVuc2lvblJlZ2V4ID0gY29tYmluZVJlZ2V4ZXMoaXNvWW1kUmVnZXgsIGlzb1RpbWVFeHRlbnNpb25SZWdleCk7XG5jb25zdCBpc29XZWVrV2l0aFRpbWVFeHRlbnNpb25SZWdleCA9IGNvbWJpbmVSZWdleGVzKGlzb1dlZWtSZWdleCwgaXNvVGltZUV4dGVuc2lvblJlZ2V4KTtcbmNvbnN0IGlzb09yZGluYWxXaXRoVGltZUV4dGVuc2lvblJlZ2V4ID0gY29tYmluZVJlZ2V4ZXMoaXNvT3JkaW5hbFJlZ2V4LCBpc29UaW1lRXh0ZW5zaW9uUmVnZXgpO1xuY29uc3QgaXNvVGltZUNvbWJpbmVkUmVnZXggPSBjb21iaW5lUmVnZXhlcyhpc29UaW1lUmVnZXgpO1xuY29uc3QgZXh0cmFjdElTT1ltZFRpbWVBbmRPZmZzZXQgPSBjb21iaW5lRXh0cmFjdG9ycyhleHRyYWN0SVNPWW1kLCBleHRyYWN0SVNPVGltZSwgZXh0cmFjdElTT09mZnNldCk7XG5jb25zdCBleHRyYWN0SVNPV2Vla1RpbWVBbmRPZmZzZXQgPSBjb21iaW5lRXh0cmFjdG9ycyhleHRyYWN0SVNPV2Vla0RhdGEsIGV4dHJhY3RJU09UaW1lLCBleHRyYWN0SVNPT2Zmc2V0KTtcbmNvbnN0IGV4dHJhY3RJU09PcmRpbmFsRGF0YUFuZFRpbWUgPSBjb21iaW5lRXh0cmFjdG9ycyhleHRyYWN0SVNPT3JkaW5hbERhdGEsIGV4dHJhY3RJU09UaW1lKTtcbmNvbnN0IGV4dHJhY3RJU09UaW1lQW5kT2Zmc2V0ID0gY29tYmluZUV4dHJhY3RvcnMoZXh0cmFjdElTT1RpbWUsIGV4dHJhY3RJU09PZmZzZXQpO1xuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlSVNPRGF0ZShzKSB7XG4gIHJldHVybiBwYXJzZShzLCBbaXNvWW1kV2l0aFRpbWVFeHRlbnNpb25SZWdleCwgZXh0cmFjdElTT1ltZFRpbWVBbmRPZmZzZXRdLCBbaXNvV2Vla1dpdGhUaW1lRXh0ZW5zaW9uUmVnZXgsIGV4dHJhY3RJU09XZWVrVGltZUFuZE9mZnNldF0sIFtpc29PcmRpbmFsV2l0aFRpbWVFeHRlbnNpb25SZWdleCwgZXh0cmFjdElTT09yZGluYWxEYXRhQW5kVGltZV0sIFtpc29UaW1lQ29tYmluZWRSZWdleCwgZXh0cmFjdElTT1RpbWVBbmRPZmZzZXRdKTtcbn1cbmZ1bmN0aW9uIHBhcnNlUkZDMjgyMkRhdGUocykge1xuICByZXR1cm4gcGFyc2UocHJlcHJvY2Vzc1JGQzI4MjIocyksIFtyZmMyODIyLCBleHRyYWN0UkZDMjgyMl0pO1xufVxuZnVuY3Rpb24gcGFyc2VIVFRQRGF0ZShzKSB7XG4gIHJldHVybiBwYXJzZShzLCBbcmZjMTEyMywgZXh0cmFjdFJGQzExMjNPcjg1MF0sIFtyZmM4NTAsIGV4dHJhY3RSRkMxMTIzT3I4NTBdLCBbYXNjaWksIGV4dHJhY3RBU0NJSV0pO1xufVxuZnVuY3Rpb24gcGFyc2VJU09EdXJhdGlvbihzKSB7XG4gIHJldHVybiBwYXJzZShzLCBbaXNvRHVyYXRpb24sIGV4dHJhY3RJU09EdXJhdGlvbl0pO1xufVxuY29uc3QgZXh0cmFjdElTT1RpbWVPbmx5ID0gY29tYmluZUV4dHJhY3RvcnMoZXh0cmFjdElTT1RpbWUpO1xuZnVuY3Rpb24gcGFyc2VJU09UaW1lT25seShzKSB7XG4gIHJldHVybiBwYXJzZShzLCBbaXNvVGltZU9ubHksIGV4dHJhY3RJU09UaW1lT25seV0pO1xufVxuY29uc3Qgc3FsWW1kV2l0aFRpbWVFeHRlbnNpb25SZWdleCA9IGNvbWJpbmVSZWdleGVzKHNxbFltZFJlZ2V4LCBzcWxUaW1lRXh0ZW5zaW9uUmVnZXgpO1xuY29uc3Qgc3FsVGltZUNvbWJpbmVkUmVnZXggPSBjb21iaW5lUmVnZXhlcyhzcWxUaW1lUmVnZXgpO1xuY29uc3QgZXh0cmFjdElTT1ltZFRpbWVPZmZzZXRBbmRJQU5BWm9uZSA9IGNvbWJpbmVFeHRyYWN0b3JzKGV4dHJhY3RJU09ZbWQsIGV4dHJhY3RJU09UaW1lLCBleHRyYWN0SVNPT2Zmc2V0LCBleHRyYWN0SUFOQVpvbmUpO1xuY29uc3QgZXh0cmFjdElTT1RpbWVPZmZzZXRBbmRJQU5BWm9uZSA9IGNvbWJpbmVFeHRyYWN0b3JzKGV4dHJhY3RJU09UaW1lLCBleHRyYWN0SVNPT2Zmc2V0LCBleHRyYWN0SUFOQVpvbmUpO1xuZnVuY3Rpb24gcGFyc2VTUUwocykge1xuICByZXR1cm4gcGFyc2UocywgW3NxbFltZFdpdGhUaW1lRXh0ZW5zaW9uUmVnZXgsIGV4dHJhY3RJU09ZbWRUaW1lT2Zmc2V0QW5kSUFOQVpvbmVdLCBbc3FsVGltZUNvbWJpbmVkUmVnZXgsIGV4dHJhY3RJU09UaW1lT2Zmc2V0QW5kSUFOQVpvbmVdKTtcbn1cblxuY29uc3QgSU5WQUxJRCA9IFwiSW52YWxpZCBEdXJhdGlvblwiOyAvLyB1bml0IGNvbnZlcnNpb24gY29uc3RhbnRzXG5cbmNvbnN0IGxvd09yZGVyTWF0cml4ID0ge1xuICB3ZWVrczoge1xuICAgIGRheXM6IDcsXG4gICAgaG91cnM6IDcgKiAyNCxcbiAgICBtaW51dGVzOiA3ICogMjQgKiA2MCxcbiAgICBzZWNvbmRzOiA3ICogMjQgKiA2MCAqIDYwLFxuICAgIG1pbGxpc2Vjb25kczogNyAqIDI0ICogNjAgKiA2MCAqIDEwMDBcbiAgfSxcbiAgZGF5czoge1xuICAgIGhvdXJzOiAyNCxcbiAgICBtaW51dGVzOiAyNCAqIDYwLFxuICAgIHNlY29uZHM6IDI0ICogNjAgKiA2MCxcbiAgICBtaWxsaXNlY29uZHM6IDI0ICogNjAgKiA2MCAqIDEwMDBcbiAgfSxcbiAgaG91cnM6IHtcbiAgICBtaW51dGVzOiA2MCxcbiAgICBzZWNvbmRzOiA2MCAqIDYwLFxuICAgIG1pbGxpc2Vjb25kczogNjAgKiA2MCAqIDEwMDBcbiAgfSxcbiAgbWludXRlczoge1xuICAgIHNlY29uZHM6IDYwLFxuICAgIG1pbGxpc2Vjb25kczogNjAgKiAxMDAwXG4gIH0sXG4gIHNlY29uZHM6IHtcbiAgICBtaWxsaXNlY29uZHM6IDEwMDBcbiAgfVxufSxcbiAgICAgIGNhc3VhbE1hdHJpeCA9IE9iamVjdC5hc3NpZ24oe1xuICB5ZWFyczoge1xuICAgIHF1YXJ0ZXJzOiA0LFxuICAgIG1vbnRoczogMTIsXG4gICAgd2Vla3M6IDUyLFxuICAgIGRheXM6IDM2NSxcbiAgICBob3VyczogMzY1ICogMjQsXG4gICAgbWludXRlczogMzY1ICogMjQgKiA2MCxcbiAgICBzZWNvbmRzOiAzNjUgKiAyNCAqIDYwICogNjAsXG4gICAgbWlsbGlzZWNvbmRzOiAzNjUgKiAyNCAqIDYwICogNjAgKiAxMDAwXG4gIH0sXG4gIHF1YXJ0ZXJzOiB7XG4gICAgbW9udGhzOiAzLFxuICAgIHdlZWtzOiAxMyxcbiAgICBkYXlzOiA5MSxcbiAgICBob3VyczogOTEgKiAyNCxcbiAgICBtaW51dGVzOiA5MSAqIDI0ICogNjAsXG4gICAgc2Vjb25kczogOTEgKiAyNCAqIDYwICogNjAsXG4gICAgbWlsbGlzZWNvbmRzOiA5MSAqIDI0ICogNjAgKiA2MCAqIDEwMDBcbiAgfSxcbiAgbW9udGhzOiB7XG4gICAgd2Vla3M6IDQsXG4gICAgZGF5czogMzAsXG4gICAgaG91cnM6IDMwICogMjQsXG4gICAgbWludXRlczogMzAgKiAyNCAqIDYwLFxuICAgIHNlY29uZHM6IDMwICogMjQgKiA2MCAqIDYwLFxuICAgIG1pbGxpc2Vjb25kczogMzAgKiAyNCAqIDYwICogNjAgKiAxMDAwXG4gIH1cbn0sIGxvd09yZGVyTWF0cml4KSxcbiAgICAgIGRheXNJblllYXJBY2N1cmF0ZSA9IDE0NjA5Ny4wIC8gNDAwLFxuICAgICAgZGF5c0luTW9udGhBY2N1cmF0ZSA9IDE0NjA5Ny4wIC8gNDgwMCxcbiAgICAgIGFjY3VyYXRlTWF0cml4ID0gT2JqZWN0LmFzc2lnbih7XG4gIHllYXJzOiB7XG4gICAgcXVhcnRlcnM6IDQsXG4gICAgbW9udGhzOiAxMixcbiAgICB3ZWVrczogZGF5c0luWWVhckFjY3VyYXRlIC8gNyxcbiAgICBkYXlzOiBkYXlzSW5ZZWFyQWNjdXJhdGUsXG4gICAgaG91cnM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0LFxuICAgIG1pbnV0ZXM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0ICogNjAsXG4gICAgc2Vjb25kczogZGF5c0luWWVhckFjY3VyYXRlICogMjQgKiA2MCAqIDYwLFxuICAgIG1pbGxpc2Vjb25kczogZGF5c0luWWVhckFjY3VyYXRlICogMjQgKiA2MCAqIDYwICogMTAwMFxuICB9LFxuICBxdWFydGVyczoge1xuICAgIG1vbnRoczogMyxcbiAgICB3ZWVrczogZGF5c0luWWVhckFjY3VyYXRlIC8gMjgsXG4gICAgZGF5czogZGF5c0luWWVhckFjY3VyYXRlIC8gNCxcbiAgICBob3VyczogZGF5c0luWWVhckFjY3VyYXRlICogMjQgLyA0LFxuICAgIG1pbnV0ZXM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0ICogNjAgLyA0LFxuICAgIHNlY29uZHM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0ICogNjAgKiA2MCAvIDQsXG4gICAgbWlsbGlzZWNvbmRzOiBkYXlzSW5ZZWFyQWNjdXJhdGUgKiAyNCAqIDYwICogNjAgKiAxMDAwIC8gNFxuICB9LFxuICBtb250aHM6IHtcbiAgICB3ZWVrczogZGF5c0luTW9udGhBY2N1cmF0ZSAvIDcsXG4gICAgZGF5czogZGF5c0luTW9udGhBY2N1cmF0ZSxcbiAgICBob3VyczogZGF5c0luTW9udGhBY2N1cmF0ZSAqIDI0LFxuICAgIG1pbnV0ZXM6IGRheXNJbk1vbnRoQWNjdXJhdGUgKiAyNCAqIDYwLFxuICAgIHNlY29uZHM6IGRheXNJbk1vbnRoQWNjdXJhdGUgKiAyNCAqIDYwICogNjAsXG4gICAgbWlsbGlzZWNvbmRzOiBkYXlzSW5Nb250aEFjY3VyYXRlICogMjQgKiA2MCAqIDYwICogMTAwMFxuICB9XG59LCBsb3dPcmRlck1hdHJpeCk7IC8vIHVuaXRzIG9yZGVyZWQgYnkgc2l6ZVxuXG5jb25zdCBvcmRlcmVkVW5pdHMgPSBbXCJ5ZWFyc1wiLCBcInF1YXJ0ZXJzXCIsIFwibW9udGhzXCIsIFwid2Vla3NcIiwgXCJkYXlzXCIsIFwiaG91cnNcIiwgXCJtaW51dGVzXCIsIFwic2Vjb25kc1wiLCBcIm1pbGxpc2Vjb25kc1wiXTtcbmNvbnN0IHJldmVyc2VVbml0cyA9IG9yZGVyZWRVbml0cy5zbGljZSgwKS5yZXZlcnNlKCk7IC8vIGNsb25lIHJlYWxseSBtZWFucyBcImNyZWF0ZSBhbm90aGVyIGluc3RhbmNlIGp1c3QgbGlrZSB0aGlzIG9uZSwgYnV0IHdpdGggdGhlc2UgY2hhbmdlc1wiXG5cbmZ1bmN0aW9uIGNsb25lKGR1ciwgYWx0cywgY2xlYXIgPSBmYWxzZSkge1xuICAvLyBkZWVwIG1lcmdlIGZvciB2YWxzXG4gIGNvbnN0IGNvbmYgPSB7XG4gICAgdmFsdWVzOiBjbGVhciA/IGFsdHMudmFsdWVzIDogT2JqZWN0LmFzc2lnbih7fSwgZHVyLnZhbHVlcywgYWx0cy52YWx1ZXMgfHwge30pLFxuICAgIGxvYzogZHVyLmxvYy5jbG9uZShhbHRzLmxvYyksXG4gICAgY29udmVyc2lvbkFjY3VyYWN5OiBhbHRzLmNvbnZlcnNpb25BY2N1cmFjeSB8fCBkdXIuY29udmVyc2lvbkFjY3VyYWN5XG4gIH07XG4gIHJldHVybiBuZXcgRHVyYXRpb24oY29uZik7XG59XG5cbmZ1bmN0aW9uIGFudGlUcnVuYyhuKSB7XG4gIHJldHVybiBuIDwgMCA/IE1hdGguZmxvb3IobikgOiBNYXRoLmNlaWwobik7XG59IC8vIE5COiBtdXRhdGVzIHBhcmFtZXRlcnNcblxuXG5mdW5jdGlvbiBjb252ZXJ0KG1hdHJpeCwgZnJvbU1hcCwgZnJvbVVuaXQsIHRvTWFwLCB0b1VuaXQpIHtcbiAgY29uc3QgY29udiA9IG1hdHJpeFt0b1VuaXRdW2Zyb21Vbml0XSxcbiAgICAgICAgcmF3ID0gZnJvbU1hcFtmcm9tVW5pdF0gLyBjb252LFxuICAgICAgICBzYW1lU2lnbiA9IE1hdGguc2lnbihyYXcpID09PSBNYXRoLnNpZ24odG9NYXBbdG9Vbml0XSksXG4gICAgICAgIC8vIG9rLCBzbyB0aGlzIGlzIHdpbGQsIGJ1dCBzZWUgdGhlIG1hdHJpeCBpbiB0aGUgdGVzdHNcbiAgYWRkZWQgPSAhc2FtZVNpZ24gJiYgdG9NYXBbdG9Vbml0XSAhPT0gMCAmJiBNYXRoLmFicyhyYXcpIDw9IDEgPyBhbnRpVHJ1bmMocmF3KSA6IE1hdGgudHJ1bmMocmF3KTtcbiAgdG9NYXBbdG9Vbml0XSArPSBhZGRlZDtcbiAgZnJvbU1hcFtmcm9tVW5pdF0gLT0gYWRkZWQgKiBjb252O1xufSAvLyBOQjogbXV0YXRlcyBwYXJhbWV0ZXJzXG5cblxuZnVuY3Rpb24gbm9ybWFsaXplVmFsdWVzKG1hdHJpeCwgdmFscykge1xuICByZXZlcnNlVW5pdHMucmVkdWNlKChwcmV2aW91cywgY3VycmVudCkgPT4ge1xuICAgIGlmICghaXNVbmRlZmluZWQodmFsc1tjdXJyZW50XSkpIHtcbiAgICAgIGlmIChwcmV2aW91cykge1xuICAgICAgICBjb252ZXJ0KG1hdHJpeCwgdmFscywgcHJldmlvdXMsIHZhbHMsIGN1cnJlbnQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHByZXZpb3VzO1xuICAgIH1cbiAgfSwgbnVsbCk7XG59XG4vKipcbiAqIEEgRHVyYXRpb24gb2JqZWN0IHJlcHJlc2VudHMgYSBwZXJpb2Qgb2YgdGltZSwgbGlrZSBcIjIgbW9udGhzXCIgb3IgXCIxIGRheSwgMSBob3VyXCIuIENvbmNlcHR1YWxseSwgaXQncyBqdXN0IGEgbWFwIG9mIHVuaXRzIHRvIHRoZWlyIHF1YW50aXRpZXMsIGFjY29tcGFuaWVkIGJ5IHNvbWUgYWRkaXRpb25hbCBjb25maWd1cmF0aW9uIGFuZCBtZXRob2RzIGZvciBjcmVhdGluZywgcGFyc2luZywgaW50ZXJyb2dhdGluZywgdHJhbnNmb3JtaW5nLCBhbmQgZm9ybWF0dGluZyB0aGVtLiBUaGV5IGNhbiBiZSB1c2VkIG9uIHRoZWlyIG93biBvciBpbiBjb25qdW5jdGlvbiB3aXRoIG90aGVyIEx1eG9uIHR5cGVzOyBmb3IgZXhhbXBsZSwgeW91IGNhbiB1c2Uge0BsaW5rIERhdGVUaW1lLnBsdXN9IHRvIGFkZCBhIER1cmF0aW9uIG9iamVjdCB0byBhIERhdGVUaW1lLCBwcm9kdWNpbmcgYW5vdGhlciBEYXRlVGltZS5cbiAqXG4gKiBIZXJlIGlzIGEgYnJpZWYgb3ZlcnZpZXcgb2YgY29tbW9ubHkgdXNlZCBtZXRob2RzIGFuZCBnZXR0ZXJzIGluIER1cmF0aW9uOlxuICpcbiAqICogKipDcmVhdGlvbioqIFRvIGNyZWF0ZSBhIER1cmF0aW9uLCB1c2Uge0BsaW5rIER1cmF0aW9uLmZyb21NaWxsaXN9LCB7QGxpbmsgRHVyYXRpb24uZnJvbU9iamVjdH0sIG9yIHtAbGluayBEdXJhdGlvbi5mcm9tSVNPfS5cbiAqICogKipVbml0IHZhbHVlcyoqIFNlZSB0aGUge0BsaW5rIER1cmF0aW9uLnllYXJzfSwge0BsaW5rIER1cmF0aW9uLm1vbnRoc30sIHtAbGluayBEdXJhdGlvbi53ZWVrc30sIHtAbGluayBEdXJhdGlvbi5kYXlzfSwge0BsaW5rIER1cmF0aW9uLmhvdXJzfSwge0BsaW5rIER1cmF0aW9uLm1pbnV0ZXN9LCB7QGxpbmsgRHVyYXRpb24uc2Vjb25kc30sIHtAbGluayBEdXJhdGlvbi5taWxsaXNlY29uZHN9IGFjY2Vzc29ycy5cbiAqICogKipDb25maWd1cmF0aW9uKiogU2VlICB7QGxpbmsgRHVyYXRpb24ubG9jYWxlfSBhbmQge0BsaW5rIER1cmF0aW9uLm51bWJlcmluZ1N5c3RlbX0gYWNjZXNzb3JzLlxuICogKiAqKlRyYW5zZm9ybWF0aW9uKiogVG8gY3JlYXRlIG5ldyBEdXJhdGlvbnMgb3V0IG9mIG9sZCBvbmVzIHVzZSB7QGxpbmsgRHVyYXRpb24ucGx1c30sIHtAbGluayBEdXJhdGlvbi5taW51c30sIHtAbGluayBEdXJhdGlvbi5ub3JtYWxpemV9LCB7QGxpbmsgRHVyYXRpb24uc2V0fSwge0BsaW5rIER1cmF0aW9uLnJlY29uZmlndXJlfSwge0BsaW5rIER1cmF0aW9uLnNoaWZ0VG99LCBhbmQge0BsaW5rIER1cmF0aW9uLm5lZ2F0ZX0uXG4gKiAqICoqT3V0cHV0KiogVG8gY29udmVydCB0aGUgRHVyYXRpb24gaW50byBvdGhlciByZXByZXNlbnRhdGlvbnMsIHNlZSB7QGxpbmsgRHVyYXRpb24uYXN9LCB7QGxpbmsgRHVyYXRpb24udG9JU099LCB7QGxpbmsgRHVyYXRpb24udG9Gb3JtYXR9LCBhbmQge0BsaW5rIER1cmF0aW9uLnRvSlNPTn1cbiAqXG4gKiBUaGVyZSdzIGFyZSBtb3JlIG1ldGhvZHMgZG9jdW1lbnRlZCBiZWxvdy4gSW4gYWRkaXRpb24sIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHN1YnRsZXIgdG9waWNzIGxpa2UgaW50ZXJuYXRpb25hbGl6YXRpb24gYW5kIHZhbGlkaXR5LCBzZWUgdGhlIGV4dGVybmFsIGRvY3VtZW50YXRpb24uXG4gKi9cblxuXG5jbGFzcyBEdXJhdGlvbiB7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgY29uc3QgYWNjdXJhdGUgPSBjb25maWcuY29udmVyc2lvbkFjY3VyYWN5ID09PSBcImxvbmd0ZXJtXCIgfHwgZmFsc2U7XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG5cbiAgICB0aGlzLnZhbHVlcyA9IGNvbmZpZy52YWx1ZXM7XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG5cbiAgICB0aGlzLmxvYyA9IGNvbmZpZy5sb2MgfHwgTG9jYWxlLmNyZWF0ZSgpO1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuXG4gICAgdGhpcy5jb252ZXJzaW9uQWNjdXJhY3kgPSBhY2N1cmF0ZSA/IFwibG9uZ3Rlcm1cIiA6IFwiY2FzdWFsXCI7XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG5cbiAgICB0aGlzLmludmFsaWQgPSBjb25maWcuaW52YWxpZCB8fCBudWxsO1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuXG4gICAgdGhpcy5tYXRyaXggPSBhY2N1cmF0ZSA/IGFjY3VyYXRlTWF0cml4IDogY2FzdWFsTWF0cml4O1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuXG4gICAgdGhpcy5pc0x1eG9uRHVyYXRpb24gPSB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGUgRHVyYXRpb24gZnJvbSBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudCBvZiBtaWxsaXNlY29uZHNcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIGZvciBwYXJzaW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGU9J2VuLVVTJ10gLSB0aGUgbG9jYWxlIHRvIHVzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byB1c2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxuICAgKi9cblxuXG4gIHN0YXRpYyBmcm9tTWlsbGlzKGNvdW50LCBvcHRzKSB7XG4gICAgcmV0dXJuIER1cmF0aW9uLmZyb21PYmplY3QoT2JqZWN0LmFzc2lnbih7XG4gICAgICBtaWxsaXNlY29uZHM6IGNvdW50XG4gICAgfSwgb3B0cykpO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEdXJhdGlvbiBmcm9tIGEgSmF2YVNjcmlwdCBvYmplY3Qgd2l0aCBrZXlzIGxpa2UgJ3llYXJzJyBhbmQgJ2hvdXJzLlxuICAgKiBJZiB0aGlzIG9iamVjdCBpcyBlbXB0eSB0aGVuIGEgemVybyBtaWxsaXNlY29uZHMgZHVyYXRpb24gaXMgcmV0dXJuZWQuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmogLSB0aGUgb2JqZWN0IHRvIGNyZWF0ZSB0aGUgRGF0ZVRpbWUgZnJvbVxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLnllYXJzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoucXVhcnRlcnNcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5tb250aHNcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai53ZWVrc1xuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLmRheXNcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5ob3Vyc1xuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLm1pbnV0ZXNcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5zZWNvbmRzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoubWlsbGlzZWNvbmRzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb2JqLmxvY2FsZT0nZW4tVVMnXSAtIHRoZSBsb2NhbGUgdG8gdXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvYmoubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gdXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb2JqLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxuICAgKi9cblxuXG4gIHN0YXRpYyBmcm9tT2JqZWN0KG9iaikge1xuICAgIGlmIChvYmogPT0gbnVsbCB8fCB0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoYER1cmF0aW9uLmZyb21PYmplY3Q6IGFyZ3VtZW50IGV4cGVjdGVkIHRvIGJlIGFuIG9iamVjdCwgZ290ICR7b2JqID09PSBudWxsID8gXCJudWxsXCIgOiB0eXBlb2Ygb2JqfWApO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgRHVyYXRpb24oe1xuICAgICAgdmFsdWVzOiBub3JtYWxpemVPYmplY3Qob2JqLCBEdXJhdGlvbi5ub3JtYWxpemVVbml0LCBbXCJsb2NhbGVcIiwgXCJudW1iZXJpbmdTeXN0ZW1cIiwgXCJjb252ZXJzaW9uQWNjdXJhY3lcIiwgXCJ6b25lXCIgLy8gYSBiaXQgb2YgZGVidDsgaXQncyBzdXBlciBpbmNvbnZlbmllbnQgaW50ZXJuYWxseSBub3QgdG8gYmUgYWJsZSB0byBibGluZGx5IHBhc3MgdGhpc1xuICAgICAgXSksXG4gICAgICBsb2M6IExvY2FsZS5mcm9tT2JqZWN0KG9iaiksXG4gICAgICBjb252ZXJzaW9uQWNjdXJhY3k6IG9iai5jb252ZXJzaW9uQWNjdXJhY3lcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlIGEgRHVyYXRpb24gZnJvbSBhbiBJU08gODYwMSBkdXJhdGlvbiBzdHJpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGV4dCB0byBwYXJzZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgZm9yIHBhcnNpbmdcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nZW4tVVMnXSAtIHRoZSBsb2NhbGUgdG8gdXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHVzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuY29udmVyc2lvbkFjY3VyYWN5PSdjYXN1YWwnXSAtIHRoZSBjb252ZXJzaW9uIHN5c3RlbSB0byB1c2VcbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSNEdXJhdGlvbnNcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbUlTTygnUDNZNk0xVzREVDEySDMwTTVTJykudG9PYmplY3QoKSAvLz0+IHsgeWVhcnM6IDMsIG1vbnRoczogNiwgd2Vla3M6IDEsIGRheXM6IDQsIGhvdXJzOiAxMiwgbWludXRlczogMzAsIHNlY29uZHM6IDUgfVxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tSVNPKCdQVDIzSCcpLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAyMyB9XG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21JU08oJ1A1WTNNJykudG9PYmplY3QoKSAvLz0+IHsgeWVhcnM6IDUsIG1vbnRoczogMyB9XG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxuICAgKi9cblxuXG4gIHN0YXRpYyBmcm9tSVNPKHRleHQsIG9wdHMpIHtcbiAgICBjb25zdCBbcGFyc2VkXSA9IHBhcnNlSVNPRHVyYXRpb24odGV4dCk7XG5cbiAgICBpZiAocGFyc2VkKSB7XG4gICAgICBjb25zdCBvYmogPSBPYmplY3QuYXNzaWduKHBhcnNlZCwgb3B0cyk7XG4gICAgICByZXR1cm4gRHVyYXRpb24uZnJvbU9iamVjdChvYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gRHVyYXRpb24uaW52YWxpZChcInVucGFyc2FibGVcIiwgYHRoZSBpbnB1dCBcIiR7dGV4dH1cIiBjYW4ndCBiZSBwYXJzZWQgYXMgSVNPIDg2MDFgKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZSBhIER1cmF0aW9uIGZyb20gYW4gSVNPIDg2MDEgdGltZSBzdHJpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGV4dCB0byBwYXJzZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgZm9yIHBhcnNpbmdcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nZW4tVVMnXSAtIHRoZSBsb2NhbGUgdG8gdXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHVzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuY29udmVyc2lvbkFjY3VyYWN5PSdjYXN1YWwnXSAtIHRoZSBjb252ZXJzaW9uIHN5c3RlbSB0byB1c2VcbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSNUaW1lc1xuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tSVNPVGltZSgnMTE6MjI6MzMuNDQ0JykudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDExLCBtaW51dGVzOiAyMiwgc2Vjb25kczogMzMsIG1pbGxpc2Vjb25kczogNDQ0IH1cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbUlTT1RpbWUoJzExOjAwJykudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDExLCBtaW51dGVzOiAwLCBzZWNvbmRzOiAwIH1cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbUlTT1RpbWUoJ1QxMTowMCcpLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAxMSwgbWludXRlczogMCwgc2Vjb25kczogMCB9XG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21JU09UaW1lKCcxMTAwJykudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDExLCBtaW51dGVzOiAwLCBzZWNvbmRzOiAwIH1cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbUlTT1RpbWUoJ1QxMTAwJykudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDExLCBtaW51dGVzOiAwLCBzZWNvbmRzOiAwIH1cbiAgICogQHJldHVybiB7RHVyYXRpb259XG4gICAqL1xuXG5cbiAgc3RhdGljIGZyb21JU09UaW1lKHRleHQsIG9wdHMpIHtcbiAgICBjb25zdCBbcGFyc2VkXSA9IHBhcnNlSVNPVGltZU9ubHkodGV4dCk7XG5cbiAgICBpZiAocGFyc2VkKSB7XG4gICAgICBjb25zdCBvYmogPSBPYmplY3QuYXNzaWduKHBhcnNlZCwgb3B0cyk7XG4gICAgICByZXR1cm4gRHVyYXRpb24uZnJvbU9iamVjdChvYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gRHVyYXRpb24uaW52YWxpZChcInVucGFyc2FibGVcIiwgYHRoZSBpbnB1dCBcIiR7dGV4dH1cIiBjYW4ndCBiZSBwYXJzZWQgYXMgSVNPIDg2MDFgKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBpbnZhbGlkIER1cmF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uIC0gc2ltcGxlIHN0cmluZyBvZiB3aHkgdGhpcyBkYXRldGltZSBpcyBpbnZhbGlkLiBTaG91bGQgbm90IGNvbnRhaW4gcGFyYW1ldGVycyBvciBhbnl0aGluZyBlbHNlIGRhdGEtZGVwZW5kZW50XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZXhwbGFuYXRpb249bnVsbF0gLSBsb25nZXIgZXhwbGFuYXRpb24sIG1heSBpbmNsdWRlIHBhcmFtZXRlcnMgYW5kIG90aGVyIHVzZWZ1bCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb25cbiAgICogQHJldHVybiB7RHVyYXRpb259XG4gICAqL1xuXG5cbiAgc3RhdGljIGludmFsaWQocmVhc29uLCBleHBsYW5hdGlvbiA9IG51bGwpIHtcbiAgICBpZiAoIXJlYXNvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFwibmVlZCB0byBzcGVjaWZ5IGEgcmVhc29uIHRoZSBEdXJhdGlvbiBpcyBpbnZhbGlkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGludmFsaWQgPSByZWFzb24gaW5zdGFuY2VvZiBJbnZhbGlkID8gcmVhc29uIDogbmV3IEludmFsaWQocmVhc29uLCBleHBsYW5hdGlvbik7XG5cbiAgICBpZiAoU2V0dGluZ3MudGhyb3dPbkludmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkRHVyYXRpb25FcnJvcihpbnZhbGlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBEdXJhdGlvbih7XG4gICAgICAgIGludmFsaWRcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG5cblxuICBzdGF0aWMgbm9ybWFsaXplVW5pdCh1bml0KSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IHtcbiAgICAgIHllYXI6IFwieWVhcnNcIixcbiAgICAgIHllYXJzOiBcInllYXJzXCIsXG4gICAgICBxdWFydGVyOiBcInF1YXJ0ZXJzXCIsXG4gICAgICBxdWFydGVyczogXCJxdWFydGVyc1wiLFxuICAgICAgbW9udGg6IFwibW9udGhzXCIsXG4gICAgICBtb250aHM6IFwibW9udGhzXCIsXG4gICAgICB3ZWVrOiBcIndlZWtzXCIsXG4gICAgICB3ZWVrczogXCJ3ZWVrc1wiLFxuICAgICAgZGF5OiBcImRheXNcIixcbiAgICAgIGRheXM6IFwiZGF5c1wiLFxuICAgICAgaG91cjogXCJob3Vyc1wiLFxuICAgICAgaG91cnM6IFwiaG91cnNcIixcbiAgICAgIG1pbnV0ZTogXCJtaW51dGVzXCIsXG4gICAgICBtaW51dGVzOiBcIm1pbnV0ZXNcIixcbiAgICAgIHNlY29uZDogXCJzZWNvbmRzXCIsXG4gICAgICBzZWNvbmRzOiBcInNlY29uZHNcIixcbiAgICAgIG1pbGxpc2Vjb25kOiBcIm1pbGxpc2Vjb25kc1wiLFxuICAgICAgbWlsbGlzZWNvbmRzOiBcIm1pbGxpc2Vjb25kc1wiXG4gICAgfVt1bml0ID8gdW5pdC50b0xvd2VyQ2FzZSgpIDogdW5pdF07XG4gICAgaWYgKCFub3JtYWxpemVkKSB0aHJvdyBuZXcgSW52YWxpZFVuaXRFcnJvcih1bml0KTtcbiAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgfVxuICAvKipcbiAgICogQ2hlY2sgaWYgYW4gb2JqZWN0IGlzIGEgRHVyYXRpb24uIFdvcmtzIGFjcm9zcyBjb250ZXh0IGJvdW5kYXJpZXNcbiAgICogQHBhcmFtIHtvYmplY3R9IG9cbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG5cblxuICBzdGF0aWMgaXNEdXJhdGlvbihvKSB7XG4gICAgcmV0dXJuIG8gJiYgby5pc0x1eG9uRHVyYXRpb24gfHwgZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIEdldCAgdGhlIGxvY2FsZSBvZiBhIER1cmF0aW9uLCBzdWNoICdlbi1HQidcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG5cblxuICBnZXQgbG9jYWxlKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmxvYy5sb2NhbGUgOiBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgdGhlIG51bWJlcmluZyBzeXN0ZW0gb2YgYSBEdXJhdGlvbiwgc3VjaCAnYmVuZycuIFRoZSBudW1iZXJpbmcgc3lzdGVtIGlzIHVzZWQgd2hlbiBmb3JtYXR0aW5nIHRoZSBEdXJhdGlvblxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cblxuXG4gIGdldCBudW1iZXJpbmdTeXN0ZW0oKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMubG9jLm51bWJlcmluZ1N5c3RlbSA6IG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEdXJhdGlvbiBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgZm9ybWF0IHN0cmluZy4gWW91IG1heSB1c2UgdGhlc2UgdG9rZW5zOlxuICAgKiAqIGBTYCBmb3IgbWlsbGlzZWNvbmRzXG4gICAqICogYHNgIGZvciBzZWNvbmRzXG4gICAqICogYG1gIGZvciBtaW51dGVzXG4gICAqICogYGhgIGZvciBob3Vyc1xuICAgKiAqIGBkYCBmb3IgZGF5c1xuICAgKiAqIGBNYCBmb3IgbW9udGhzXG4gICAqICogYHlgIGZvciB5ZWFyc1xuICAgKiBOb3RlczpcbiAgICogKiBBZGQgcGFkZGluZyBieSByZXBlYXRpbmcgdGhlIHRva2VuLCBlLmcuIFwieXlcIiBwYWRzIHRoZSB5ZWFycyB0byB0d28gZGlnaXRzLCBcImhoaGhcIiBwYWRzIHRoZSBob3VycyBvdXQgdG8gZm91ciBkaWdpdHNcbiAgICogKiBUaGUgZHVyYXRpb24gd2lsbCBiZSBjb252ZXJ0ZWQgdG8gdGhlIHNldCBvZiB1bml0cyBpbiB0aGUgZm9ybWF0IHN0cmluZyB1c2luZyB7QGxpbmsgRHVyYXRpb24uc2hpZnRUb30gYW5kIHRoZSBEdXJhdGlvbnMncyBjb252ZXJzaW9uIGFjY3VyYWN5IHNldHRpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbXQgLSB0aGUgZm9ybWF0IHN0cmluZ1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5mbG9vcj10cnVlXSAtIGZsb29yIG51bWVyaWNhbCB2YWx1ZXNcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IHllYXJzOiAxLCBkYXlzOiA2LCBzZWNvbmRzOiAyIH0pLnRvRm9ybWF0KFwieSBkIHNcIikgLy89PiBcIjEgNiAyXCJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IHllYXJzOiAxLCBkYXlzOiA2LCBzZWNvbmRzOiAyIH0pLnRvRm9ybWF0KFwieXkgZGQgc3NzXCIpIC8vPT4gXCIwMSAwNiAwMDJcIlxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgeWVhcnM6IDEsIGRheXM6IDYsIHNlY29uZHM6IDIgfSkudG9Gb3JtYXQoXCJNIFNcIikgLy89PiBcIjEyIDUxODQwMjAwMFwiXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG5cblxuICB0b0Zvcm1hdChmbXQsIG9wdHMgPSB7fSkge1xuICAgIC8vIHJldmVyc2UtY29tcGF0IHNpbmNlIDEuMjsgd2UgYWx3YXlzIHJvdW5kIGRvd24gbm93LCBuZXZlciB1cCwgYW5kIHdlIGRvIGl0IGJ5IGRlZmF1bHRcbiAgICBjb25zdCBmbXRPcHRzID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0cywge1xuICAgICAgZmxvb3I6IG9wdHMucm91bmQgIT09IGZhbHNlICYmIG9wdHMuZmxvb3IgIT09IGZhbHNlXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IEZvcm1hdHRlci5jcmVhdGUodGhpcy5sb2MsIGZtdE9wdHMpLmZvcm1hdER1cmF0aW9uRnJvbVN0cmluZyh0aGlzLCBmbXQpIDogSU5WQUxJRDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIEphdmFTY3JpcHQgb2JqZWN0IHdpdGggdGhpcyBEdXJhdGlvbidzIHZhbHVlcy5cbiAgICogQHBhcmFtIG9wdHMgLSBvcHRpb25zIGZvciBnZW5lcmF0aW5nIHRoZSBvYmplY3RcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlQ29uZmlnPWZhbHNlXSAtIGluY2x1ZGUgY29uZmlndXJhdGlvbiBhdHRyaWJ1dGVzIGluIHRoZSBvdXRwdXRcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IHllYXJzOiAxLCBkYXlzOiA2LCBzZWNvbmRzOiAyIH0pLnRvT2JqZWN0KCkgLy89PiB7IHllYXJzOiAxLCBkYXlzOiA2LCBzZWNvbmRzOiAyIH1cbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKi9cblxuXG4gIHRvT2JqZWN0KG9wdHMgPSB7fSkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4ge307XG4gICAgY29uc3QgYmFzZSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMudmFsdWVzKTtcblxuICAgIGlmIChvcHRzLmluY2x1ZGVDb25maWcpIHtcbiAgICAgIGJhc2UuY29udmVyc2lvbkFjY3VyYWN5ID0gdGhpcy5jb252ZXJzaW9uQWNjdXJhY3k7XG4gICAgICBiYXNlLm51bWJlcmluZ1N5c3RlbSA9IHRoaXMubG9jLm51bWJlcmluZ1N5c3RlbTtcbiAgICAgIGJhc2UubG9jYWxlID0gdGhpcy5sb2MubG9jYWxlO1xuICAgIH1cblxuICAgIHJldHVybiBiYXNlO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIElTTyA4NjAxLWNvbXBsaWFudCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEdXJhdGlvbi5cbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSNEdXJhdGlvbnNcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IHllYXJzOiAzLCBzZWNvbmRzOiA0NSB9KS50b0lTTygpIC8vPT4gJ1AzWVQ0NVMnXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBtb250aHM6IDQsIHNlY29uZHM6IDQ1IH0pLnRvSVNPKCkgLy89PiAnUDRNVDQ1UydcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IG1vbnRoczogNSB9KS50b0lTTygpIC8vPT4gJ1A1TSdcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IG1pbnV0ZXM6IDUgfSkudG9JU08oKSAvLz0+ICdQVDVNJ1xuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgbWlsbGlzZWNvbmRzOiA2IH0pLnRvSVNPKCkgLy89PiAnUFQwLjAwNlMnXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG5cblxuICB0b0lTTygpIHtcbiAgICAvLyB3ZSBjb3VsZCB1c2UgdGhlIGZvcm1hdHRlciwgYnV0IHRoaXMgaXMgYW4gZWFzaWVyIHdheSB0byBnZXQgdGhlIG1pbmltdW0gc3RyaW5nXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBudWxsO1xuICAgIGxldCBzID0gXCJQXCI7XG4gICAgaWYgKHRoaXMueWVhcnMgIT09IDApIHMgKz0gdGhpcy55ZWFycyArIFwiWVwiO1xuICAgIGlmICh0aGlzLm1vbnRocyAhPT0gMCB8fCB0aGlzLnF1YXJ0ZXJzICE9PSAwKSBzICs9IHRoaXMubW9udGhzICsgdGhpcy5xdWFydGVycyAqIDMgKyBcIk1cIjtcbiAgICBpZiAodGhpcy53ZWVrcyAhPT0gMCkgcyArPSB0aGlzLndlZWtzICsgXCJXXCI7XG4gICAgaWYgKHRoaXMuZGF5cyAhPT0gMCkgcyArPSB0aGlzLmRheXMgKyBcIkRcIjtcbiAgICBpZiAodGhpcy5ob3VycyAhPT0gMCB8fCB0aGlzLm1pbnV0ZXMgIT09IDAgfHwgdGhpcy5zZWNvbmRzICE9PSAwIHx8IHRoaXMubWlsbGlzZWNvbmRzICE9PSAwKSBzICs9IFwiVFwiO1xuICAgIGlmICh0aGlzLmhvdXJzICE9PSAwKSBzICs9IHRoaXMuaG91cnMgKyBcIkhcIjtcbiAgICBpZiAodGhpcy5taW51dGVzICE9PSAwKSBzICs9IHRoaXMubWludXRlcyArIFwiTVwiO1xuICAgIGlmICh0aGlzLnNlY29uZHMgIT09IDAgfHwgdGhpcy5taWxsaXNlY29uZHMgIT09IDApIC8vIHRoaXMgd2lsbCBoYW5kbGUgXCJmbG9hdGluZyBwb2ludCBtYWRuZXNzXCIgYnkgcmVtb3ZpbmcgZXh0cmEgZGVjaW1hbCBwbGFjZXNcbiAgICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzU4ODAwNC9pcy1mbG9hdGluZy1wb2ludC1tYXRoLWJyb2tlblxuICAgICAgcyArPSByb3VuZFRvKHRoaXMuc2Vjb25kcyArIHRoaXMubWlsbGlzZWNvbmRzIC8gMTAwMCwgMykgKyBcIlNcIjtcbiAgICBpZiAocyA9PT0gXCJQXCIpIHMgKz0gXCJUMFNcIjtcbiAgICByZXR1cm4gcztcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhbiBJU08gODYwMS1jb21wbGlhbnQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRHVyYXRpb24sIGZvcm1hdHRlZCBhcyBhIHRpbWUgb2YgZGF5LlxuICAgKiBOb3RlIHRoYXQgdGhpcyB3aWxsIHJldHVybiBudWxsIGlmIHRoZSBkdXJhdGlvbiBpcyBpbnZhbGlkLCBuZWdhdGl2ZSwgb3IgZXF1YWwgdG8gb3IgZ3JlYXRlciB0aGFuIDI0IGhvdXJzLlxuICAgKiBAc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxI1RpbWVzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnN1cHByZXNzTWlsbGlzZWNvbmRzPWZhbHNlXSAtIGV4Y2x1ZGUgbWlsbGlzZWNvbmRzIGZyb20gdGhlIGZvcm1hdCBpZiB0aGV5J3JlIDBcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zdXBwcmVzc1NlY29uZHM9ZmFsc2VdIC0gZXhjbHVkZSBzZWNvbmRzIGZyb20gdGhlIGZvcm1hdCBpZiB0aGV5J3JlIDBcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlUHJlZml4PWZhbHNlXSAtIGluY2x1ZGUgdGhlIGBUYCBwcmVmaXhcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmZvcm1hdD0nZXh0ZW5kZWQnXSAtIGNob29zZSBiZXR3ZWVuIHRoZSBiYXNpYyBhbmQgZXh0ZW5kZWQgZm9ybWF0XG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBob3VyczogMTEgfSkudG9JU09UaW1lKCkgLy89PiAnMTE6MDA6MDAuMDAwJ1xuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDExIH0pLnRvSVNPVGltZSh7IHN1cHByZXNzTWlsbGlzZWNvbmRzOiB0cnVlIH0pIC8vPT4gJzExOjAwOjAwJ1xuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDExIH0pLnRvSVNPVGltZSh7IHN1cHByZXNzU2Vjb25kczogdHJ1ZSB9KSAvLz0+ICcxMTowMCdcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IGhvdXJzOiAxMSB9KS50b0lTT1RpbWUoeyBpbmNsdWRlUHJlZml4OiB0cnVlIH0pIC8vPT4gJ1QxMTowMDowMC4wMDAnXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBob3VyczogMTEgfSkudG9JU09UaW1lKHsgZm9ybWF0OiAnYmFzaWMnIH0pIC8vPT4gJzExMDAwMC4wMDAnXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG5cblxuICB0b0lTT1RpbWUob3B0cyA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IG1pbGxpcyA9IHRoaXMudG9NaWxsaXMoKTtcbiAgICBpZiAobWlsbGlzIDwgMCB8fCBtaWxsaXMgPj0gODY0MDAwMDApIHJldHVybiBudWxsO1xuICAgIG9wdHMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgIHN1cHByZXNzTWlsbGlzZWNvbmRzOiBmYWxzZSxcbiAgICAgIHN1cHByZXNzU2Vjb25kczogZmFsc2UsXG4gICAgICBpbmNsdWRlUHJlZml4OiBmYWxzZSxcbiAgICAgIGZvcm1hdDogXCJleHRlbmRlZFwiXG4gICAgfSwgb3B0cyk7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnNoaWZ0VG8oXCJob3Vyc1wiLCBcIm1pbnV0ZXNcIiwgXCJzZWNvbmRzXCIsIFwibWlsbGlzZWNvbmRzXCIpO1xuICAgIGxldCBmbXQgPSBvcHRzLmZvcm1hdCA9PT0gXCJiYXNpY1wiID8gXCJoaG1tXCIgOiBcImhoOm1tXCI7XG5cbiAgICBpZiAoIW9wdHMuc3VwcHJlc3NTZWNvbmRzIHx8IHZhbHVlLnNlY29uZHMgIT09IDAgfHwgdmFsdWUubWlsbGlzZWNvbmRzICE9PSAwKSB7XG4gICAgICBmbXQgKz0gb3B0cy5mb3JtYXQgPT09IFwiYmFzaWNcIiA/IFwic3NcIiA6IFwiOnNzXCI7XG5cbiAgICAgIGlmICghb3B0cy5zdXBwcmVzc01pbGxpc2Vjb25kcyB8fCB2YWx1ZS5taWxsaXNlY29uZHMgIT09IDApIHtcbiAgICAgICAgZm10ICs9IFwiLlNTU1wiO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBzdHIgPSB2YWx1ZS50b0Zvcm1hdChmbXQpO1xuXG4gICAgaWYgKG9wdHMuaW5jbHVkZVByZWZpeCkge1xuICAgICAgc3RyID0gXCJUXCIgKyBzdHI7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhbiBJU08gODYwMSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIER1cmF0aW9uIGFwcHJvcHJpYXRlIGZvciB1c2UgaW4gSlNPTi5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cblxuXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b0lTTygpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIElTTyA4NjAxIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRHVyYXRpb24gYXBwcm9wcmlhdGUgZm9yIHVzZSBpbiBkZWJ1Z2dpbmcuXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG5cblxuICB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy50b0lTTygpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIG1pbGxpc2Vjb25kcyB2YWx1ZSBvZiB0aGlzIER1cmF0aW9uLlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuXG5cbiAgdG9NaWxsaXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXMoXCJtaWxsaXNlY29uZHNcIik7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gbWlsbGlzZWNvbmRzIHZhbHVlIG9mIHRoaXMgRHVyYXRpb24uIEFsaWFzIG9mIHtAbGluayB0b01pbGxpc31cbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cblxuXG4gIHZhbHVlT2YoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9NaWxsaXMoKTtcbiAgfVxuICAvKipcbiAgICogTWFrZSB0aGlzIER1cmF0aW9uIGxvbmdlciBieSB0aGUgc3BlY2lmaWVkIGFtb3VudC4gUmV0dXJuIGEgbmV3bHktY29uc3RydWN0ZWQgRHVyYXRpb24uXG4gICAqIEBwYXJhbSB7RHVyYXRpb258T2JqZWN0fG51bWJlcn0gZHVyYXRpb24gLSBUaGUgYW1vdW50IHRvIGFkZC4gRWl0aGVyIGEgTHV4b24gRHVyYXRpb24sIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcywgdGhlIG9iamVjdCBhcmd1bWVudCB0byBEdXJhdGlvbi5mcm9tT2JqZWN0KClcbiAgICogQHJldHVybiB7RHVyYXRpb259XG4gICAqL1xuXG5cbiAgcGx1cyhkdXJhdGlvbikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICBjb25zdCBkdXIgPSBmcmllbmRseUR1cmF0aW9uKGR1cmF0aW9uKSxcbiAgICAgICAgICByZXN1bHQgPSB7fTtcblxuICAgIGZvciAoY29uc3QgayBvZiBvcmRlcmVkVW5pdHMpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eShkdXIudmFsdWVzLCBrKSB8fCBoYXNPd25Qcm9wZXJ0eSh0aGlzLnZhbHVlcywgaykpIHtcbiAgICAgICAgcmVzdWx0W2tdID0gZHVyLmdldChrKSArIHRoaXMuZ2V0KGspO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjbG9uZSh0aGlzLCB7XG4gICAgICB2YWx1ZXM6IHJlc3VsdFxuICAgIH0sIHRydWUpO1xuICB9XG4gIC8qKlxuICAgKiBNYWtlIHRoaXMgRHVyYXRpb24gc2hvcnRlciBieSB0aGUgc3BlY2lmaWVkIGFtb3VudC4gUmV0dXJuIGEgbmV3bHktY29uc3RydWN0ZWQgRHVyYXRpb24uXG4gICAqIEBwYXJhbSB7RHVyYXRpb258T2JqZWN0fG51bWJlcn0gZHVyYXRpb24gLSBUaGUgYW1vdW50IHRvIHN1YnRyYWN0LiBFaXRoZXIgYSBMdXhvbiBEdXJhdGlvbiwgYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLCB0aGUgb2JqZWN0IGFyZ3VtZW50IHRvIER1cmF0aW9uLmZyb21PYmplY3QoKVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG5cblxuICBtaW51cyhkdXJhdGlvbikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICBjb25zdCBkdXIgPSBmcmllbmRseUR1cmF0aW9uKGR1cmF0aW9uKTtcbiAgICByZXR1cm4gdGhpcy5wbHVzKGR1ci5uZWdhdGUoKSk7XG4gIH1cbiAgLyoqXG4gICAqIFNjYWxlIHRoaXMgRHVyYXRpb24gYnkgdGhlIHNwZWNpZmllZCBhbW91bnQuIFJldHVybiBhIG5ld2x5LWNvbnN0cnVjdGVkIER1cmF0aW9uLlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBmbiAtIFRoZSBmdW5jdGlvbiB0byBhcHBseSB0byBlYWNoIHVuaXQuIEFyaXR5IGlzIDEgb3IgMjogdGhlIHZhbHVlIG9mIHRoZSB1bml0IGFuZCwgb3B0aW9uYWxseSwgdGhlIHVuaXQgbmFtZS4gTXVzdCByZXR1cm4gYSBudW1iZXIuXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBob3VyczogMSwgbWludXRlczogMzAgfSkubWFwVW5pdCh4ID0+IHggKiAyKSAvLz0+IHsgaG91cnM6IDIsIG1pbnV0ZXM6IDYwIH1cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IGhvdXJzOiAxLCBtaW51dGVzOiAzMCB9KS5tYXBVbml0KCh4LCB1KSA9PiB1ID09PSBcImhvdXJcIiA/IHggKiAyIDogeCkgLy89PiB7IGhvdXJzOiAyLCBtaW51dGVzOiAzMCB9XG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxuICAgKi9cblxuXG4gIG1hcFVuaXRzKGZuKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKHRoaXMudmFsdWVzKSkge1xuICAgICAgcmVzdWx0W2tdID0gYXNOdW1iZXIoZm4odGhpcy52YWx1ZXNba10sIGspKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2xvbmUodGhpcywge1xuICAgICAgdmFsdWVzOiByZXN1bHRcbiAgICB9LCB0cnVlKTtcbiAgfVxuICAvKipcbiAgICogR2V0IHRoZSB2YWx1ZSBvZiB1bml0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5pdCAtIGEgdW5pdCBzdWNoIGFzICdtaW51dGUnIG9yICdkYXknXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3Qoe3llYXJzOiAyLCBkYXlzOiAzfSkueWVhcnMgLy89PiAyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3Qoe3llYXJzOiAyLCBkYXlzOiAzfSkubW9udGhzIC8vPT4gMFxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHt5ZWFyczogMiwgZGF5czogM30pLmRheXMgLy89PiAzXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG5cblxuICBnZXQodW5pdCkge1xuICAgIHJldHVybiB0aGlzW0R1cmF0aW9uLm5vcm1hbGl6ZVVuaXQodW5pdCldO1xuICB9XG4gIC8qKlxuICAgKiBcIlNldFwiIHRoZSB2YWx1ZXMgb2Ygc3BlY2lmaWVkIHVuaXRzLiBSZXR1cm4gYSBuZXdseS1jb25zdHJ1Y3RlZCBEdXJhdGlvbi5cbiAgICogQHBhcmFtIHtPYmplY3R9IHZhbHVlcyAtIGEgbWFwcGluZyBvZiB1bml0cyB0byBudW1iZXJzXG4gICAqIEBleGFtcGxlIGR1ci5zZXQoeyB5ZWFyczogMjAxNyB9KVxuICAgKiBAZXhhbXBsZSBkdXIuc2V0KHsgaG91cnM6IDgsIG1pbnV0ZXM6IDMwIH0pXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxuICAgKi9cblxuXG4gIHNldCh2YWx1ZXMpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgY29uc3QgbWl4ZWQgPSBPYmplY3QuYXNzaWduKHRoaXMudmFsdWVzLCBub3JtYWxpemVPYmplY3QodmFsdWVzLCBEdXJhdGlvbi5ub3JtYWxpemVVbml0LCBbXSkpO1xuICAgIHJldHVybiBjbG9uZSh0aGlzLCB7XG4gICAgICB2YWx1ZXM6IG1peGVkXG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIFwiU2V0XCIgdGhlIGxvY2FsZSBhbmQvb3IgbnVtYmVyaW5nU3lzdGVtLiAgUmV0dXJucyBhIG5ld2x5LWNvbnN0cnVjdGVkIER1cmF0aW9uLlxuICAgKiBAZXhhbXBsZSBkdXIucmVjb25maWd1cmUoeyBsb2NhbGU6ICdlbi1HQicgfSlcbiAgICogQHJldHVybiB7RHVyYXRpb259XG4gICAqL1xuXG5cbiAgcmVjb25maWd1cmUoe1xuICAgIGxvY2FsZSxcbiAgICBudW1iZXJpbmdTeXN0ZW0sXG4gICAgY29udmVyc2lvbkFjY3VyYWN5XG4gIH0gPSB7fSkge1xuICAgIGNvbnN0IGxvYyA9IHRoaXMubG9jLmNsb25lKHtcbiAgICAgIGxvY2FsZSxcbiAgICAgIG51bWJlcmluZ1N5c3RlbVxuICAgIH0pLFxuICAgICAgICAgIG9wdHMgPSB7XG4gICAgICBsb2NcbiAgICB9O1xuXG4gICAgaWYgKGNvbnZlcnNpb25BY2N1cmFjeSkge1xuICAgICAgb3B0cy5jb252ZXJzaW9uQWNjdXJhY3kgPSBjb252ZXJzaW9uQWNjdXJhY3k7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIG9wdHMpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgZHVyYXRpb24gaW4gdGhlIHNwZWNpZmllZCB1bml0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5pdCAtIGEgdW5pdCBzdWNoIGFzICdtaW51dGVzJyBvciAnZGF5cydcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7eWVhcnM6IDF9KS5hcygnZGF5cycpIC8vPT4gMzY1XG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3Qoe3llYXJzOiAxfSkuYXMoJ21vbnRocycpIC8vPT4gMTJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7aG91cnM6IDYwfSkuYXMoJ2RheXMnKSAvLz0+IDIuNVxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuXG5cbiAgYXModW5pdCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnNoaWZ0VG8odW5pdCkuZ2V0KHVuaXQpIDogTmFOO1xuICB9XG4gIC8qKlxuICAgKiBSZWR1Y2UgdGhpcyBEdXJhdGlvbiB0byBpdHMgY2Fub25pY2FsIHJlcHJlc2VudGF0aW9uIGluIGl0cyBjdXJyZW50IHVuaXRzLlxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgeWVhcnM6IDIsIGRheXM6IDUwMDAgfSkubm9ybWFsaXplKCkudG9PYmplY3QoKSAvLz0+IHsgeWVhcnM6IDE1LCBkYXlzOiAyNTUgfVxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDEyLCBtaW51dGVzOiAtNDUgfSkubm9ybWFsaXplKCkudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDExLCBtaW51dGVzOiAxNSB9XG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxuICAgKi9cblxuXG4gIG5vcm1hbGl6ZSgpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgY29uc3QgdmFscyA9IHRoaXMudG9PYmplY3QoKTtcbiAgICBub3JtYWxpemVWYWx1ZXModGhpcy5tYXRyaXgsIHZhbHMpO1xuICAgIHJldHVybiBjbG9uZSh0aGlzLCB7XG4gICAgICB2YWx1ZXM6IHZhbHNcbiAgICB9LCB0cnVlKTtcbiAgfVxuICAvKipcbiAgICogQ29udmVydCB0aGlzIER1cmF0aW9uIGludG8gaXRzIHJlcHJlc2VudGF0aW9uIGluIGEgZGlmZmVyZW50IHNldCBvZiB1bml0cy5cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IGhvdXJzOiAxLCBzZWNvbmRzOiAzMCB9KS5zaGlmdFRvKCdtaW51dGVzJywgJ21pbGxpc2Vjb25kcycpLnRvT2JqZWN0KCkgLy89PiB7IG1pbnV0ZXM6IDYwLCBtaWxsaXNlY29uZHM6IDMwMDAwIH1cbiAgICogQHJldHVybiB7RHVyYXRpb259XG4gICAqL1xuXG5cbiAgc2hpZnRUbyguLi51bml0cykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcblxuICAgIGlmICh1bml0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHVuaXRzID0gdW5pdHMubWFwKHUgPT4gRHVyYXRpb24ubm9ybWFsaXplVW5pdCh1KSk7XG4gICAgY29uc3QgYnVpbHQgPSB7fSxcbiAgICAgICAgICBhY2N1bXVsYXRlZCA9IHt9LFxuICAgICAgICAgIHZhbHMgPSB0aGlzLnRvT2JqZWN0KCk7XG4gICAgbGV0IGxhc3RVbml0O1xuXG4gICAgZm9yIChjb25zdCBrIG9mIG9yZGVyZWRVbml0cykge1xuICAgICAgaWYgKHVuaXRzLmluZGV4T2YoaykgPj0gMCkge1xuICAgICAgICBsYXN0VW5pdCA9IGs7XG4gICAgICAgIGxldCBvd24gPSAwOyAvLyBhbnl0aGluZyB3ZSBoYXZlbid0IGJvaWxlZCBkb3duIHlldCBzaG91bGQgZ2V0IGJvaWxlZCB0byB0aGlzIHVuaXRcblxuICAgICAgICBmb3IgKGNvbnN0IGFrIGluIGFjY3VtdWxhdGVkKSB7XG4gICAgICAgICAgb3duICs9IHRoaXMubWF0cml4W2FrXVtrXSAqIGFjY3VtdWxhdGVkW2FrXTtcbiAgICAgICAgICBhY2N1bXVsYXRlZFtha10gPSAwO1xuICAgICAgICB9IC8vIHBsdXMgYW55dGhpbmcgdGhhdCdzIGFscmVhZHkgaW4gdGhpcyB1bml0XG5cblxuICAgICAgICBpZiAoaXNOdW1iZXIodmFsc1trXSkpIHtcbiAgICAgICAgICBvd24gKz0gdmFsc1trXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGkgPSBNYXRoLnRydW5jKG93bik7XG4gICAgICAgIGJ1aWx0W2tdID0gaTtcbiAgICAgICAgYWNjdW11bGF0ZWRba10gPSBvd24gLSBpOyAvLyB3ZSdkIGxpa2UgdG8gYWJzb3JiIHRoZXNlIGZyYWN0aW9ucyBpbiBhbm90aGVyIHVuaXRcbiAgICAgICAgLy8gcGx1cyBhbnl0aGluZyBmdXJ0aGVyIGRvd24gdGhlIGNoYWluIHRoYXQgc2hvdWxkIGJlIHJvbGxlZCB1cCBpbiB0byB0aGlzXG5cbiAgICAgICAgZm9yIChjb25zdCBkb3duIGluIHZhbHMpIHtcbiAgICAgICAgICBpZiAob3JkZXJlZFVuaXRzLmluZGV4T2YoZG93bikgPiBvcmRlcmVkVW5pdHMuaW5kZXhPZihrKSkge1xuICAgICAgICAgICAgY29udmVydCh0aGlzLm1hdHJpeCwgdmFscywgZG93biwgYnVpbHQsIGspO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBvdGhlcndpc2UsIGtlZXAgaXQgaW4gdGhlIHdpbmdzIHRvIGJvaWwgaXQgbGF0ZXJcblxuICAgICAgfSBlbHNlIGlmIChpc051bWJlcih2YWxzW2tdKSkge1xuICAgICAgICBhY2N1bXVsYXRlZFtrXSA9IHZhbHNba107XG4gICAgICB9XG4gICAgfSAvLyBhbnl0aGluZyBsZWZ0b3ZlciBiZWNvbWVzIHRoZSBkZWNpbWFsIGZvciB0aGUgbGFzdCB1bml0XG4gICAgLy8gbGFzdFVuaXQgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIHVuaXRzIGlzIG5vdCBlbXB0eVxuXG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBhY2N1bXVsYXRlZCkge1xuICAgICAgaWYgKGFjY3VtdWxhdGVkW2tleV0gIT09IDApIHtcbiAgICAgICAgYnVpbHRbbGFzdFVuaXRdICs9IGtleSA9PT0gbGFzdFVuaXQgPyBhY2N1bXVsYXRlZFtrZXldIDogYWNjdW11bGF0ZWRba2V5XSAvIHRoaXMubWF0cml4W2xhc3RVbml0XVtrZXldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjbG9uZSh0aGlzLCB7XG4gICAgICB2YWx1ZXM6IGJ1aWx0XG4gICAgfSwgdHJ1ZSkubm9ybWFsaXplKCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgbmVnYXRpdmUgb2YgdGhpcyBEdXJhdGlvbi5cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IGhvdXJzOiAxLCBzZWNvbmRzOiAzMCB9KS5uZWdhdGUoKS50b09iamVjdCgpIC8vPT4geyBob3VyczogLTEsIHNlY29uZHM6IC0zMCB9XG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxuICAgKi9cblxuXG4gIG5lZ2F0ZSgpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgY29uc3QgbmVnYXRlZCA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKHRoaXMudmFsdWVzKSkge1xuICAgICAgbmVnYXRlZFtrXSA9IC10aGlzLnZhbHVlc1trXTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2xvbmUodGhpcywge1xuICAgICAgdmFsdWVzOiBuZWdhdGVkXG4gICAgfSwgdHJ1ZSk7XG4gIH1cbiAgLyoqXG4gICAqIEdldCB0aGUgeWVhcnMuXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuXG5cbiAgZ2V0IHllYXJzKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy55ZWFycyB8fCAwIDogTmFOO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgdGhlIHF1YXJ0ZXJzLlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cblxuXG4gIGdldCBxdWFydGVycygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy52YWx1ZXMucXVhcnRlcnMgfHwgMCA6IE5hTjtcbiAgfVxuICAvKipcbiAgICogR2V0IHRoZSBtb250aHMuXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuXG5cbiAgZ2V0IG1vbnRocygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy52YWx1ZXMubW9udGhzIHx8IDAgOiBOYU47XG4gIH1cbiAgLyoqXG4gICAqIEdldCB0aGUgd2Vla3NcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG5cblxuICBnZXQgd2Vla3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLndlZWtzIHx8IDAgOiBOYU47XG4gIH1cbiAgLyoqXG4gICAqIEdldCB0aGUgZGF5cy5cbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG5cblxuICBnZXQgZGF5cygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy52YWx1ZXMuZGF5cyB8fCAwIDogTmFOO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgdGhlIGhvdXJzLlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cblxuXG4gIGdldCBob3VycygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy52YWx1ZXMuaG91cnMgfHwgMCA6IE5hTjtcbiAgfVxuICAvKipcbiAgICogR2V0IHRoZSBtaW51dGVzLlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cblxuXG4gIGdldCBtaW51dGVzKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy5taW51dGVzIHx8IDAgOiBOYU47XG4gIH1cbiAgLyoqXG4gICAqIEdldCB0aGUgc2Vjb25kcy5cbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cblxuXG4gIGdldCBzZWNvbmRzKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy5zZWNvbmRzIHx8IDAgOiBOYU47XG4gIH1cbiAgLyoqXG4gICAqIEdldCB0aGUgbWlsbGlzZWNvbmRzLlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuXG5cbiAgZ2V0IG1pbGxpc2Vjb25kcygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy52YWx1ZXMubWlsbGlzZWNvbmRzIHx8IDAgOiBOYU47XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgRHVyYXRpb24gaXMgaW52YWxpZC4gSW52YWxpZCBkdXJhdGlvbnMgYXJlIHJldHVybmVkIGJ5IGRpZmYgb3BlcmF0aW9uc1xuICAgKiBvbiBpbnZhbGlkIERhdGVUaW1lcyBvciBJbnRlcnZhbHMuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuXG5cbiAgZ2V0IGlzVmFsaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW52YWxpZCA9PT0gbnVsbDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhbiBlcnJvciBjb2RlIGlmIHRoaXMgRHVyYXRpb24gYmVjYW1lIGludmFsaWQsIG9yIG51bGwgaWYgdGhlIER1cmF0aW9uIGlzIHZhbGlkXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG5cblxuICBnZXQgaW52YWxpZFJlYXNvbigpIHtcbiAgICByZXR1cm4gdGhpcy5pbnZhbGlkID8gdGhpcy5pbnZhbGlkLnJlYXNvbiA6IG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gZXhwbGFuYXRpb24gb2Ygd2h5IHRoaXMgRHVyYXRpb24gYmVjYW1lIGludmFsaWQsIG9yIG51bGwgaWYgdGhlIER1cmF0aW9uIGlzIHZhbGlkXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuXG5cbiAgZ2V0IGludmFsaWRFeHBsYW5hdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5pbnZhbGlkID8gdGhpcy5pbnZhbGlkLmV4cGxhbmF0aW9uIDogbnVsbDtcbiAgfVxuICAvKipcbiAgICogRXF1YWxpdHkgY2hlY2tcbiAgICogVHdvIER1cmF0aW9ucyBhcmUgZXF1YWwgaWZmIHRoZXkgaGF2ZSB0aGUgc2FtZSB1bml0cyBhbmQgdGhlIHNhbWUgdmFsdWVzIGZvciBlYWNoIHVuaXQuXG4gICAqIEBwYXJhbSB7RHVyYXRpb259IG90aGVyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuXG5cbiAgZXF1YWxzKG90aGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQgfHwgIW90aGVyLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMubG9jLmVxdWFscyhvdGhlci5sb2MpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXEodjEsIHYyKSB7XG4gICAgICAvLyBDb25zaWRlciAwIGFuZCB1bmRlZmluZWQgYXMgZXF1YWxcbiAgICAgIGlmICh2MSA9PT0gdW5kZWZpbmVkIHx8IHYxID09PSAwKSByZXR1cm4gdjIgPT09IHVuZGVmaW5lZCB8fCB2MiA9PT0gMDtcbiAgICAgIHJldHVybiB2MSA9PT0gdjI7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB1IG9mIG9yZGVyZWRVbml0cykge1xuICAgICAgaWYgKCFlcSh0aGlzLnZhbHVlc1t1XSwgb3RoZXIudmFsdWVzW3VdKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxufVxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZyaWVuZGx5RHVyYXRpb24oZHVyYXRpb25pc2gpIHtcbiAgaWYgKGlzTnVtYmVyKGR1cmF0aW9uaXNoKSkge1xuICAgIHJldHVybiBEdXJhdGlvbi5mcm9tTWlsbGlzKGR1cmF0aW9uaXNoKTtcbiAgfSBlbHNlIGlmIChEdXJhdGlvbi5pc0R1cmF0aW9uKGR1cmF0aW9uaXNoKSkge1xuICAgIHJldHVybiBkdXJhdGlvbmlzaDtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZHVyYXRpb25pc2ggPT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gRHVyYXRpb24uZnJvbU9iamVjdChkdXJhdGlvbmlzaCk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKGBVbmtub3duIGR1cmF0aW9uIGFyZ3VtZW50ICR7ZHVyYXRpb25pc2h9IG9mIHR5cGUgJHt0eXBlb2YgZHVyYXRpb25pc2h9YCk7XG4gIH1cbn1cblxuY29uc3QgSU5WQUxJRCQxID0gXCJJbnZhbGlkIEludGVydmFsXCI7IC8vIGNoZWNrcyBpZiB0aGUgc3RhcnQgaXMgZXF1YWwgdG8gb3IgYmVmb3JlIHRoZSBlbmRcblxuZnVuY3Rpb24gdmFsaWRhdGVTdGFydEVuZChzdGFydCwgZW5kKSB7XG4gIGlmICghc3RhcnQgfHwgIXN0YXJ0LmlzVmFsaWQpIHtcbiAgICByZXR1cm4gSW50ZXJ2YWwuaW52YWxpZChcIm1pc3Npbmcgb3IgaW52YWxpZCBzdGFydFwiKTtcbiAgfSBlbHNlIGlmICghZW5kIHx8ICFlbmQuaXNWYWxpZCkge1xuICAgIHJldHVybiBJbnRlcnZhbC5pbnZhbGlkKFwibWlzc2luZyBvciBpbnZhbGlkIGVuZFwiKTtcbiAgfSBlbHNlIGlmIChlbmQgPCBzdGFydCkge1xuICAgIHJldHVybiBJbnRlcnZhbC5pbnZhbGlkKFwiZW5kIGJlZm9yZSBzdGFydFwiLCBgVGhlIGVuZCBvZiBhbiBpbnRlcnZhbCBtdXN0IGJlIGFmdGVyIGl0cyBzdGFydCwgYnV0IHlvdSBoYWQgc3RhcnQ9JHtzdGFydC50b0lTTygpfSBhbmQgZW5kPSR7ZW5kLnRvSVNPKCl9YCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbi8qKlxuICogQW4gSW50ZXJ2YWwgb2JqZWN0IHJlcHJlc2VudHMgYSBoYWxmLW9wZW4gaW50ZXJ2YWwgb2YgdGltZSwgd2hlcmUgZWFjaCBlbmRwb2ludCBpcyBhIHtAbGluayBEYXRlVGltZX0uIENvbmNlcHR1YWxseSwgaXQncyBhIGNvbnRhaW5lciBmb3IgdGhvc2UgdHdvIGVuZHBvaW50cywgYWNjb21wYW5pZWQgYnkgbWV0aG9kcyBmb3IgY3JlYXRpbmcsIHBhcnNpbmcsIGludGVycm9nYXRpbmcsIGNvbXBhcmluZywgdHJhbnNmb3JtaW5nLCBhbmQgZm9ybWF0dGluZyB0aGVtLlxuICpcbiAqIEhlcmUgaXMgYSBicmllZiBvdmVydmlldyBvZiB0aGUgbW9zdCBjb21tb25seSB1c2VkIG1ldGhvZHMgYW5kIGdldHRlcnMgaW4gSW50ZXJ2YWw6XG4gKlxuICogKiAqKkNyZWF0aW9uKiogVG8gY3JlYXRlIGFuIEludGVydmFsLCB1c2Uge0BsaW5rIGZyb21EYXRlVGltZXN9LCB7QGxpbmsgYWZ0ZXJ9LCB7QGxpbmsgYmVmb3JlfSwgb3Ige0BsaW5rIGZyb21JU099LlxuICogKiAqKkFjY2Vzc29ycyoqIFVzZSB7QGxpbmsgc3RhcnR9IGFuZCB7QGxpbmsgZW5kfSB0byBnZXQgdGhlIHN0YXJ0IGFuZCBlbmQuXG4gKiAqICoqSW50ZXJyb2dhdGlvbioqIFRvIGFuYWx5emUgdGhlIEludGVydmFsLCB1c2Uge0BsaW5rIGNvdW50fSwge0BsaW5rIGxlbmd0aH0sIHtAbGluayBoYXNTYW1lfSwge0BsaW5rIGNvbnRhaW5zfSwge0BsaW5rIGlzQWZ0ZXJ9LCBvciB7QGxpbmsgaXNCZWZvcmV9LlxuICogKiAqKlRyYW5zZm9ybWF0aW9uKiogVG8gY3JlYXRlIG90aGVyIEludGVydmFscyBvdXQgb2YgdGhpcyBvbmUsIHVzZSB7QGxpbmsgc2V0fSwge0BsaW5rIHNwbGl0QXR9LCB7QGxpbmsgc3BsaXRCeX0sIHtAbGluayBkaXZpZGVFcXVhbGx5fSwge0BsaW5rIG1lcmdlfSwge0BsaW5rIHhvcn0sIHtAbGluayB1bmlvbn0sIHtAbGluayBpbnRlcnNlY3Rpb259LCBvciB7QGxpbmsgZGlmZmVyZW5jZX0uXG4gKiAqICoqQ29tcGFyaXNvbioqIFRvIGNvbXBhcmUgdGhpcyBJbnRlcnZhbCB0byBhbm90aGVyIG9uZSwgdXNlIHtAbGluayBlcXVhbHN9LCB7QGxpbmsgb3ZlcmxhcHN9LCB7QGxpbmsgYWJ1dHNTdGFydH0sIHtAbGluayBhYnV0c0VuZH0sIHtAbGluayBlbmd1bGZzfS5cbiAqICogKipPdXRwdXQqKiBUbyBjb252ZXJ0IHRoZSBJbnRlcnZhbCBpbnRvIG90aGVyIHJlcHJlc2VudGF0aW9ucywgc2VlIHtAbGluayB0b1N0cmluZ30sIHtAbGluayB0b0lTT30sIHtAbGluayB0b0lTT0RhdGV9LCB7QGxpbmsgdG9JU09UaW1lfSwge0BsaW5rIHRvRm9ybWF0fSwgYW5kIHtAbGluayB0b0R1cmF0aW9ufS5cbiAqL1xuXG5cbmNsYXNzIEludGVydmFsIHtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLnMgPSBjb25maWcuc3RhcnQ7XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG5cbiAgICB0aGlzLmUgPSBjb25maWcuZW5kO1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuXG4gICAgdGhpcy5pbnZhbGlkID0gY29uZmlnLmludmFsaWQgfHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cblxuICAgIHRoaXMuaXNMdXhvbkludGVydmFsID0gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlIGFuIGludmFsaWQgSW50ZXJ2YWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWFzb24gLSBzaW1wbGUgc3RyaW5nIG9mIHdoeSB0aGlzIEludGVydmFsIGlzIGludmFsaWQuIFNob3VsZCBub3QgY29udGFpbiBwYXJhbWV0ZXJzIG9yIGFueXRoaW5nIGVsc2UgZGF0YS1kZXBlbmRlbnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtleHBsYW5hdGlvbj1udWxsXSAtIGxvbmdlciBleHBsYW5hdGlvbiwgbWF5IGluY2x1ZGUgcGFyYW1ldGVycyBhbmQgb3RoZXIgdXNlZnVsIGRlYnVnZ2luZyBpbmZvcm1hdGlvblxuICAgKiBAcmV0dXJuIHtJbnRlcnZhbH1cbiAgICovXG5cblxuICBzdGF0aWMgaW52YWxpZChyZWFzb24sIGV4cGxhbmF0aW9uID0gbnVsbCkge1xuICAgIGlmICghcmVhc29uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXCJuZWVkIHRvIHNwZWNpZnkgYSByZWFzb24gdGhlIEludGVydmFsIGlzIGludmFsaWRcIik7XG4gICAgfVxuXG4gICAgY29uc3QgaW52YWxpZCA9IHJlYXNvbiBpbnN0YW5jZW9mIEludmFsaWQgPyByZWFzb24gOiBuZXcgSW52YWxpZChyZWFzb24sIGV4cGxhbmF0aW9uKTtcblxuICAgIGlmIChTZXR0aW5ncy50aHJvd09uSW52YWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRJbnRlcnZhbEVycm9yKGludmFsaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IEludGVydmFsKHtcbiAgICAgICAgaW52YWxpZFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gSW50ZXJ2YWwgZnJvbSBhIHN0YXJ0IERhdGVUaW1lIGFuZCBhbiBlbmQgRGF0ZVRpbWUuIEluY2x1c2l2ZSBvZiB0aGUgc3RhcnQgYnV0IG5vdCB0aGUgZW5kLlxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfERhdGV8T2JqZWN0fSBzdGFydFxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfERhdGV8T2JqZWN0fSBlbmRcbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XG4gICAqL1xuXG5cbiAgc3RhdGljIGZyb21EYXRlVGltZXMoc3RhcnQsIGVuZCkge1xuICAgIGNvbnN0IGJ1aWx0U3RhcnQgPSBmcmllbmRseURhdGVUaW1lKHN0YXJ0KSxcbiAgICAgICAgICBidWlsdEVuZCA9IGZyaWVuZGx5RGF0ZVRpbWUoZW5kKTtcbiAgICBjb25zdCB2YWxpZGF0ZUVycm9yID0gdmFsaWRhdGVTdGFydEVuZChidWlsdFN0YXJ0LCBidWlsdEVuZCk7XG5cbiAgICBpZiAodmFsaWRhdGVFcnJvciA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbmV3IEludGVydmFsKHtcbiAgICAgICAgc3RhcnQ6IGJ1aWx0U3RhcnQsXG4gICAgICAgIGVuZDogYnVpbHRFbmRcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdmFsaWRhdGVFcnJvcjtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBJbnRlcnZhbCBmcm9tIGEgc3RhcnQgRGF0ZVRpbWUgYW5kIGEgRHVyYXRpb24gdG8gZXh0ZW5kIHRvLlxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfERhdGV8T2JqZWN0fSBzdGFydFxuICAgKiBAcGFyYW0ge0R1cmF0aW9ufE9iamVjdHxudW1iZXJ9IGR1cmF0aW9uIC0gdGhlIGxlbmd0aCBvZiB0aGUgSW50ZXJ2YWwuXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxuICAgKi9cblxuXG4gIHN0YXRpYyBhZnRlcihzdGFydCwgZHVyYXRpb24pIHtcbiAgICBjb25zdCBkdXIgPSBmcmllbmRseUR1cmF0aW9uKGR1cmF0aW9uKSxcbiAgICAgICAgICBkdCA9IGZyaWVuZGx5RGF0ZVRpbWUoc3RhcnQpO1xuICAgIHJldHVybiBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKGR0LCBkdC5wbHVzKGR1cikpO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gSW50ZXJ2YWwgZnJvbSBhbiBlbmQgRGF0ZVRpbWUgYW5kIGEgRHVyYXRpb24gdG8gZXh0ZW5kIGJhY2t3YXJkcyB0by5cbiAgICogQHBhcmFtIHtEYXRlVGltZXxEYXRlfE9iamVjdH0gZW5kXG4gICAqIEBwYXJhbSB7RHVyYXRpb258T2JqZWN0fG51bWJlcn0gZHVyYXRpb24gLSB0aGUgbGVuZ3RoIG9mIHRoZSBJbnRlcnZhbC5cbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XG4gICAqL1xuXG5cbiAgc3RhdGljIGJlZm9yZShlbmQsIGR1cmF0aW9uKSB7XG4gICAgY29uc3QgZHVyID0gZnJpZW5kbHlEdXJhdGlvbihkdXJhdGlvbiksXG4gICAgICAgICAgZHQgPSBmcmllbmRseURhdGVUaW1lKGVuZCk7XG4gICAgcmV0dXJuIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQubWludXMoZHVyKSwgZHQpO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gSW50ZXJ2YWwgZnJvbSBhbiBJU08gODYwMSBzdHJpbmcuXG4gICAqIEFjY2VwdHMgYDxzdGFydD4vPGVuZD5gLCBgPHN0YXJ0Pi88ZHVyYXRpb24+YCwgYW5kIGA8ZHVyYXRpb24+LzxlbmQ+YCBmb3JtYXRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRoZSBJU08gc3RyaW5nIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0c10gLSBvcHRpb25zIHRvIHBhc3Mge0BsaW5rIERhdGVUaW1lLmZyb21JU099IGFuZCBvcHRpb25hbGx5IHtAbGluayBEdXJhdGlvbi5mcm9tSVNPfVxuICAgKiBAc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxI1RpbWVfaW50ZXJ2YWxzXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxuICAgKi9cblxuXG4gIHN0YXRpYyBmcm9tSVNPKHRleHQsIG9wdHMpIHtcbiAgICBjb25zdCBbcywgZV0gPSAodGV4dCB8fCBcIlwiKS5zcGxpdChcIi9cIiwgMik7XG5cbiAgICBpZiAocyAmJiBlKSB7XG4gICAgICBsZXQgc3RhcnQsIHN0YXJ0SXNWYWxpZDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgc3RhcnQgPSBEYXRlVGltZS5mcm9tSVNPKHMsIG9wdHMpO1xuICAgICAgICBzdGFydElzVmFsaWQgPSBzdGFydC5pc1ZhbGlkO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBzdGFydElzVmFsaWQgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgbGV0IGVuZCwgZW5kSXNWYWxpZDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZW5kID0gRGF0ZVRpbWUuZnJvbUlTTyhlLCBvcHRzKTtcbiAgICAgICAgZW5kSXNWYWxpZCA9IGVuZC5pc1ZhbGlkO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBlbmRJc1ZhbGlkID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGFydElzVmFsaWQgJiYgZW5kSXNWYWxpZCkge1xuICAgICAgICByZXR1cm4gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhzdGFydCwgZW5kKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXJ0SXNWYWxpZCkge1xuICAgICAgICBjb25zdCBkdXIgPSBEdXJhdGlvbi5mcm9tSVNPKGUsIG9wdHMpO1xuXG4gICAgICAgIGlmIChkdXIuaXNWYWxpZCkge1xuICAgICAgICAgIHJldHVybiBJbnRlcnZhbC5hZnRlcihzdGFydCwgZHVyKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChlbmRJc1ZhbGlkKSB7XG4gICAgICAgIGNvbnN0IGR1ciA9IER1cmF0aW9uLmZyb21JU08ocywgb3B0cyk7XG5cbiAgICAgICAgaWYgKGR1ci5pc1ZhbGlkKSB7XG4gICAgICAgICAgcmV0dXJuIEludGVydmFsLmJlZm9yZShlbmQsIGR1cik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gSW50ZXJ2YWwuaW52YWxpZChcInVucGFyc2FibGVcIiwgYHRoZSBpbnB1dCBcIiR7dGV4dH1cIiBjYW4ndCBiZSBwYXJzZWQgYXMgSVNPIDg2MDFgKTtcbiAgfVxuICAvKipcbiAgICogQ2hlY2sgaWYgYW4gb2JqZWN0IGlzIGFuIEludGVydmFsLiBXb3JrcyBhY3Jvc3MgY29udGV4dCBib3VuZGFyaWVzXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuXG5cbiAgc3RhdGljIGlzSW50ZXJ2YWwobykge1xuICAgIHJldHVybiBvICYmIG8uaXNMdXhvbkludGVydmFsIHx8IGZhbHNlO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzdGFydCBvZiB0aGUgSW50ZXJ2YWxcbiAgICogQHR5cGUge0RhdGVUaW1lfVxuICAgKi9cblxuXG4gIGdldCBzdGFydCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5zIDogbnVsbDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZW5kIG9mIHRoZSBJbnRlcnZhbFxuICAgKiBAdHlwZSB7RGF0ZVRpbWV9XG4gICAqL1xuXG5cbiAgZ2V0IGVuZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5lIDogbnVsbDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgSW50ZXJ2YWwncyBlbmQgaXMgYXQgbGVhc3QgaXRzIHN0YXJ0LCBtZWFuaW5nIHRoYXQgdGhlIEludGVydmFsIGlzbid0ICdiYWNrd2FyZHMnLlxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICovXG5cblxuICBnZXQgaXNWYWxpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pbnZhbGlkUmVhc29uID09PSBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGVycm9yIGNvZGUgaWYgdGhpcyBJbnRlcnZhbCBpcyBpbnZhbGlkLCBvciBudWxsIGlmIHRoZSBJbnRlcnZhbCBpcyB2YWxpZFxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cblxuXG4gIGdldCBpbnZhbGlkUmVhc29uKCkge1xuICAgIHJldHVybiB0aGlzLmludmFsaWQgPyB0aGlzLmludmFsaWQucmVhc29uIDogbnVsbDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhbiBleHBsYW5hdGlvbiBvZiB3aHkgdGhpcyBJbnRlcnZhbCBiZWNhbWUgaW52YWxpZCwgb3IgbnVsbCBpZiB0aGUgSW50ZXJ2YWwgaXMgdmFsaWRcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG5cblxuICBnZXQgaW52YWxpZEV4cGxhbmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmludmFsaWQgPyB0aGlzLmludmFsaWQuZXhwbGFuYXRpb24gOiBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIEludGVydmFsIGluIHRoZSBzcGVjaWZpZWQgdW5pdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuaXQgLSB0aGUgdW5pdCAoc3VjaCBhcyAnaG91cnMnIG9yICdkYXlzJykgdG8gcmV0dXJuIHRoZSBsZW5ndGggaW4uXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG5cblxuICBsZW5ndGgodW5pdCA9IFwibWlsbGlzZWNvbmRzXCIpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy50b0R1cmF0aW9uKC4uLlt1bml0XSkuZ2V0KHVuaXQpIDogTmFOO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb3VudCBvZiBtaW51dGVzLCBob3VycywgZGF5cywgbW9udGhzLCBvciB5ZWFycyBpbmNsdWRlZCBpbiB0aGUgSW50ZXJ2YWwsIGV2ZW4gaW4gcGFydC5cbiAgICogVW5saWtlIHtAbGluayBsZW5ndGh9IHRoaXMgY291bnRzIHNlY3Rpb25zIG9mIHRoZSBjYWxlbmRhciwgbm90IHBlcmlvZHMgb2YgdGltZSwgZS5nLiBzcGVjaWZ5aW5nICdkYXknXG4gICAqIGFza3MgJ3doYXQgZGF0ZXMgYXJlIGluY2x1ZGVkIGluIHRoaXMgaW50ZXJ2YWw/Jywgbm90ICdob3cgbWFueSBkYXlzIGxvbmcgaXMgdGhpcyBpbnRlcnZhbD8nXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbdW5pdD0nbWlsbGlzZWNvbmRzJ10gLSB0aGUgdW5pdCBvZiB0aW1lIHRvIGNvdW50LlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuXG5cbiAgY291bnQodW5pdCA9IFwibWlsbGlzZWNvbmRzXCIpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIE5hTjtcbiAgICBjb25zdCBzdGFydCA9IHRoaXMuc3RhcnQuc3RhcnRPZih1bml0KSxcbiAgICAgICAgICBlbmQgPSB0aGlzLmVuZC5zdGFydE9mKHVuaXQpO1xuICAgIHJldHVybiBNYXRoLmZsb29yKGVuZC5kaWZmKHN0YXJ0LCB1bml0KS5nZXQodW5pdCkpICsgMTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgSW50ZXJ2YWwncyBzdGFydCBhbmQgZW5kIGFyZSBib3RoIGluIHRoZSBzYW1lIHVuaXQgb2YgdGltZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5pdCAtIHRoZSB1bml0IG9mIHRpbWUgdG8gY2hlY2sgc2FtZW5lc3Mgb25cbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG5cblxuICBoYXNTYW1lKHVuaXQpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5pc0VtcHR5KCkgfHwgdGhpcy5lLm1pbnVzKDEpLmhhc1NhbWUodGhpcy5zLCB1bml0KSA6IGZhbHNlO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsIGhhcyB0aGUgc2FtZSBzdGFydCBhbmQgZW5kIERhdGVUaW1lcy5cbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG5cblxuICBpc0VtcHR5KCkge1xuICAgIHJldHVybiB0aGlzLnMudmFsdWVPZigpID09PSB0aGlzLmUudmFsdWVPZigpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsJ3Mgc3RhcnQgaXMgYWZ0ZXIgdGhlIHNwZWNpZmllZCBEYXRlVGltZS5cbiAgICogQHBhcmFtIHtEYXRlVGltZX0gZGF0ZVRpbWVcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG5cblxuICBpc0FmdGVyKGRhdGVUaW1lKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5zID4gZGF0ZVRpbWU7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoaXMgSW50ZXJ2YWwncyBlbmQgaXMgYmVmb3JlIHRoZSBzcGVjaWZpZWQgRGF0ZVRpbWUuXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IGRhdGVUaW1lXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuXG5cbiAgaXNCZWZvcmUoZGF0ZVRpbWUpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLmUgPD0gZGF0ZVRpbWU7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoaXMgSW50ZXJ2YWwgY29udGFpbnMgdGhlIHNwZWNpZmllZCBEYXRlVGltZS5cbiAgICogQHBhcmFtIHtEYXRlVGltZX0gZGF0ZVRpbWVcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG5cblxuICBjb250YWlucyhkYXRlVGltZSkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMucyA8PSBkYXRlVGltZSAmJiB0aGlzLmUgPiBkYXRlVGltZTtcbiAgfVxuICAvKipcbiAgICogXCJTZXRzXCIgdGhlIHN0YXJ0IGFuZC9vciBlbmQgZGF0ZXMuIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBJbnRlcnZhbC5cbiAgICogQHBhcmFtIHtPYmplY3R9IHZhbHVlcyAtIHRoZSB2YWx1ZXMgdG8gc2V0XG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IHZhbHVlcy5zdGFydCAtIHRoZSBzdGFydGluZyBEYXRlVGltZVxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSB2YWx1ZXMuZW5kIC0gdGhlIGVuZGluZyBEYXRlVGltZVxuICAgKiBAcmV0dXJuIHtJbnRlcnZhbH1cbiAgICovXG5cblxuICBzZXQoe1xuICAgIHN0YXJ0LFxuICAgIGVuZFxuICB9ID0ge30pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgcmV0dXJuIEludGVydmFsLmZyb21EYXRlVGltZXMoc3RhcnQgfHwgdGhpcy5zLCBlbmQgfHwgdGhpcy5lKTtcbiAgfVxuICAvKipcbiAgICogU3BsaXQgdGhpcyBJbnRlcnZhbCBhdCBlYWNoIG9mIHRoZSBzcGVjaWZpZWQgRGF0ZVRpbWVzXG4gICAqIEBwYXJhbSB7Li4uW0RhdGVUaW1lXX0gZGF0ZVRpbWVzIC0gdGhlIHVuaXQgb2YgdGltZSB0byBjb3VudC5cbiAgICogQHJldHVybiB7W0ludGVydmFsXX1cbiAgICovXG5cblxuICBzcGxpdEF0KC4uLmRhdGVUaW1lcykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gW107XG4gICAgY29uc3Qgc29ydGVkID0gZGF0ZVRpbWVzLm1hcChmcmllbmRseURhdGVUaW1lKS5maWx0ZXIoZCA9PiB0aGlzLmNvbnRhaW5zKGQpKS5zb3J0KCksXG4gICAgICAgICAgcmVzdWx0cyA9IFtdO1xuICAgIGxldCB7XG4gICAgICBzXG4gICAgfSA9IHRoaXMsXG4gICAgICAgIGkgPSAwO1xuXG4gICAgd2hpbGUgKHMgPCB0aGlzLmUpIHtcbiAgICAgIGNvbnN0IGFkZGVkID0gc29ydGVkW2ldIHx8IHRoaXMuZSxcbiAgICAgICAgICAgIG5leHQgPSArYWRkZWQgPiArdGhpcy5lID8gdGhpcy5lIDogYWRkZWQ7XG4gICAgICByZXN1bHRzLnB1c2goSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhzLCBuZXh0KSk7XG4gICAgICBzID0gbmV4dDtcbiAgICAgIGkgKz0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuICAvKipcbiAgICogU3BsaXQgdGhpcyBJbnRlcnZhbCBpbnRvIHNtYWxsZXIgSW50ZXJ2YWxzLCBlYWNoIG9mIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLlxuICAgKiBMZWZ0IG92ZXIgdGltZSBpcyBncm91cGVkIGludG8gYSBzbWFsbGVyIGludGVydmFsXG4gICAqIEBwYXJhbSB7RHVyYXRpb258T2JqZWN0fG51bWJlcn0gZHVyYXRpb24gLSBUaGUgbGVuZ3RoIG9mIGVhY2ggcmVzdWx0aW5nIGludGVydmFsLlxuICAgKiBAcmV0dXJuIHtbSW50ZXJ2YWxdfVxuICAgKi9cblxuXG4gIHNwbGl0QnkoZHVyYXRpb24pIHtcbiAgICBjb25zdCBkdXIgPSBmcmllbmRseUR1cmF0aW9uKGR1cmF0aW9uKTtcblxuICAgIGlmICghdGhpcy5pc1ZhbGlkIHx8ICFkdXIuaXNWYWxpZCB8fCBkdXIuYXMoXCJtaWxsaXNlY29uZHNcIikgPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBsZXQge1xuICAgICAgc1xuICAgIH0gPSB0aGlzLFxuICAgICAgICBhZGRlZCxcbiAgICAgICAgbmV4dDtcbiAgICBjb25zdCByZXN1bHRzID0gW107XG5cbiAgICB3aGlsZSAocyA8IHRoaXMuZSkge1xuICAgICAgYWRkZWQgPSBzLnBsdXMoZHVyKTtcbiAgICAgIG5leHQgPSArYWRkZWQgPiArdGhpcy5lID8gdGhpcy5lIDogYWRkZWQ7XG4gICAgICByZXN1bHRzLnB1c2goSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhzLCBuZXh0KSk7XG4gICAgICBzID0gbmV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuICAvKipcbiAgICogU3BsaXQgdGhpcyBJbnRlcnZhbCBpbnRvIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHNtYWxsZXIgaW50ZXJ2YWxzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyT2ZQYXJ0cyAtIFRoZSBudW1iZXIgb2YgSW50ZXJ2YWxzIHRvIGRpdmlkZSB0aGUgSW50ZXJ2YWwgaW50by5cbiAgICogQHJldHVybiB7W0ludGVydmFsXX1cbiAgICovXG5cblxuICBkaXZpZGVFcXVhbGx5KG51bWJlck9mUGFydHMpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiB0aGlzLnNwbGl0QnkodGhpcy5sZW5ndGgoKSAvIG51bWJlck9mUGFydHMpLnNsaWNlKDAsIG51bWJlck9mUGFydHMpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsIG92ZXJsYXBzIHdpdGggdGhlIHNwZWNpZmllZCBJbnRlcnZhbFxuICAgKiBAcGFyYW0ge0ludGVydmFsfSBvdGhlclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cblxuXG4gIG92ZXJsYXBzKG90aGVyKSB7XG4gICAgcmV0dXJuIHRoaXMuZSA+IG90aGVyLnMgJiYgdGhpcy5zIDwgb3RoZXIuZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCdzIGVuZCBpcyBhZGphY2VudCB0byB0aGUgc3BlY2lmaWVkIEludGVydmFsJ3Mgc3RhcnQuXG4gICAqIEBwYXJhbSB7SW50ZXJ2YWx9IG90aGVyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuXG5cbiAgYWJ1dHNTdGFydChvdGhlcikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICt0aGlzLmUgPT09ICtvdGhlci5zO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsJ3Mgc3RhcnQgaXMgYWRqYWNlbnQgdG8gdGhlIHNwZWNpZmllZCBJbnRlcnZhbCdzIGVuZC5cbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG5cblxuICBhYnV0c0VuZChvdGhlcikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICtvdGhlci5lID09PSArdGhpcy5zO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsIGVuZ3VsZnMgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIHNwZWNpZmllZCBJbnRlcnZhbC5cbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG5cblxuICBlbmd1bGZzKG90aGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5zIDw9IG90aGVyLnMgJiYgdGhpcy5lID49IG90aGVyLmU7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoaXMgSW50ZXJ2YWwgaGFzIHRoZSBzYW1lIHN0YXJ0IGFuZCBlbmQgYXMgdGhlIHNwZWNpZmllZCBJbnRlcnZhbC5cbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG5cblxuICBlcXVhbHMob3RoZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCB8fCAhb3RoZXIuaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnMuZXF1YWxzKG90aGVyLnMpICYmIHRoaXMuZS5lcXVhbHMob3RoZXIuZSk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybiBhbiBJbnRlcnZhbCByZXByZXNlbnRpbmcgdGhlIGludGVyc2VjdGlvbiBvZiB0aGlzIEludGVydmFsIGFuZCB0aGUgc3BlY2lmaWVkIEludGVydmFsLlxuICAgKiBTcGVjaWZpY2FsbHksIHRoZSByZXN1bHRpbmcgSW50ZXJ2YWwgaGFzIHRoZSBtYXhpbXVtIHN0YXJ0IHRpbWUgYW5kIHRoZSBtaW5pbXVtIGVuZCB0aW1lIG9mIHRoZSB0d28gSW50ZXJ2YWxzLlxuICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlIGludGVyc2VjdGlvbiBpcyBlbXB0eSwgbWVhbmluZywgdGhlIGludGVydmFscyBkb24ndCBpbnRlcnNlY3QuXG4gICAqIEBwYXJhbSB7SW50ZXJ2YWx9IG90aGVyXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxuICAgKi9cblxuXG4gIGludGVyc2VjdGlvbihvdGhlcikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICBjb25zdCBzID0gdGhpcy5zID4gb3RoZXIucyA/IHRoaXMucyA6IG90aGVyLnMsXG4gICAgICAgICAgZSA9IHRoaXMuZSA8IG90aGVyLmUgPyB0aGlzLmUgOiBvdGhlci5lO1xuXG4gICAgaWYgKHMgPiBlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIEludGVydmFsLmZyb21EYXRlVGltZXMocywgZSk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gSW50ZXJ2YWwgcmVwcmVzZW50aW5nIHRoZSB1bmlvbiBvZiB0aGlzIEludGVydmFsIGFuZCB0aGUgc3BlY2lmaWVkIEludGVydmFsLlxuICAgKiBTcGVjaWZpY2FsbHksIHRoZSByZXN1bHRpbmcgSW50ZXJ2YWwgaGFzIHRoZSBtaW5pbXVtIHN0YXJ0IHRpbWUgYW5kIHRoZSBtYXhpbXVtIGVuZCB0aW1lIG9mIHRoZSB0d28gSW50ZXJ2YWxzLlxuICAgKiBAcGFyYW0ge0ludGVydmFsfSBvdGhlclxuICAgKiBAcmV0dXJuIHtJbnRlcnZhbH1cbiAgICovXG5cblxuICB1bmlvbihvdGhlcikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICBjb25zdCBzID0gdGhpcy5zIDwgb3RoZXIucyA/IHRoaXMucyA6IG90aGVyLnMsXG4gICAgICAgICAgZSA9IHRoaXMuZSA+IG90aGVyLmUgPyB0aGlzLmUgOiBvdGhlci5lO1xuICAgIHJldHVybiBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKHMsIGUpO1xuICB9XG4gIC8qKlxuICAgKiBNZXJnZSBhbiBhcnJheSBvZiBJbnRlcnZhbHMgaW50byBhIGVxdWl2YWxlbnQgbWluaW1hbCBzZXQgb2YgSW50ZXJ2YWxzLlxuICAgKiBDb21iaW5lcyBvdmVybGFwcGluZyBhbmQgYWRqYWNlbnQgSW50ZXJ2YWxzLlxuICAgKiBAcGFyYW0ge1tJbnRlcnZhbF19IGludGVydmFsc1xuICAgKiBAcmV0dXJuIHtbSW50ZXJ2YWxdfVxuICAgKi9cblxuXG4gIHN0YXRpYyBtZXJnZShpbnRlcnZhbHMpIHtcbiAgICBjb25zdCBbZm91bmQsIGZpbmFsXSA9IGludGVydmFscy5zb3J0KChhLCBiKSA9PiBhLnMgLSBiLnMpLnJlZHVjZSgoW3NvZmFyLCBjdXJyZW50XSwgaXRlbSkgPT4ge1xuICAgICAgaWYgKCFjdXJyZW50KSB7XG4gICAgICAgIHJldHVybiBbc29mYXIsIGl0ZW1dO1xuICAgICAgfSBlbHNlIGlmIChjdXJyZW50Lm92ZXJsYXBzKGl0ZW0pIHx8IGN1cnJlbnQuYWJ1dHNTdGFydChpdGVtKSkge1xuICAgICAgICByZXR1cm4gW3NvZmFyLCBjdXJyZW50LnVuaW9uKGl0ZW0pXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBbc29mYXIuY29uY2F0KFtjdXJyZW50XSksIGl0ZW1dO1xuICAgICAgfVxuICAgIH0sIFtbXSwgbnVsbF0pO1xuXG4gICAgaWYgKGZpbmFsKSB7XG4gICAgICBmb3VuZC5wdXNoKGZpbmFsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm91bmQ7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBJbnRlcnZhbHMgcmVwcmVzZW50aW5nIHRoZSBzcGFucyBvZiB0aW1lIHRoYXQgb25seSBhcHBlYXIgaW4gb25lIG9mIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWxzLlxuICAgKiBAcGFyYW0ge1tJbnRlcnZhbF19IGludGVydmFsc1xuICAgKiBAcmV0dXJuIHtbSW50ZXJ2YWxdfVxuICAgKi9cblxuXG4gIHN0YXRpYyB4b3IoaW50ZXJ2YWxzKSB7XG4gICAgbGV0IHN0YXJ0ID0gbnVsbCxcbiAgICAgICAgY3VycmVudENvdW50ID0gMDtcbiAgICBjb25zdCByZXN1bHRzID0gW10sXG4gICAgICAgICAgZW5kcyA9IGludGVydmFscy5tYXAoaSA9PiBbe1xuICAgICAgdGltZTogaS5zLFxuICAgICAgdHlwZTogXCJzXCJcbiAgICB9LCB7XG4gICAgICB0aW1lOiBpLmUsXG4gICAgICB0eXBlOiBcImVcIlxuICAgIH1dKSxcbiAgICAgICAgICBmbGF0dGVuZWQgPSBBcnJheS5wcm90b3R5cGUuY29uY2F0KC4uLmVuZHMpLFxuICAgICAgICAgIGFyciA9IGZsYXR0ZW5lZC5zb3J0KChhLCBiKSA9PiBhLnRpbWUgLSBiLnRpbWUpO1xuXG4gICAgZm9yIChjb25zdCBpIG9mIGFycikge1xuICAgICAgY3VycmVudENvdW50ICs9IGkudHlwZSA9PT0gXCJzXCIgPyAxIDogLTE7XG5cbiAgICAgIGlmIChjdXJyZW50Q291bnQgPT09IDEpIHtcbiAgICAgICAgc3RhcnQgPSBpLnRpbWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoc3RhcnQgJiYgK3N0YXJ0ICE9PSAraS50aW1lKSB7XG4gICAgICAgICAgcmVzdWx0cy5wdXNoKEludGVydmFsLmZyb21EYXRlVGltZXMoc3RhcnQsIGkudGltZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhcnQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBJbnRlcnZhbC5tZXJnZShyZXN1bHRzKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIGFuIEludGVydmFsIHJlcHJlc2VudGluZyB0aGUgc3BhbiBvZiB0aW1lIGluIHRoaXMgSW50ZXJ2YWwgdGhhdCBkb2Vzbid0IG92ZXJsYXAgd2l0aCBhbnkgb2YgdGhlIHNwZWNpZmllZCBJbnRlcnZhbHMuXG4gICAqIEBwYXJhbSB7Li4uSW50ZXJ2YWx9IGludGVydmFsc1xuICAgKiBAcmV0dXJuIHtbSW50ZXJ2YWxdfVxuICAgKi9cblxuXG4gIGRpZmZlcmVuY2UoLi4uaW50ZXJ2YWxzKSB7XG4gICAgcmV0dXJuIEludGVydmFsLnhvcihbdGhpc10uY29uY2F0KGludGVydmFscykpLm1hcChpID0+IHRoaXMuaW50ZXJzZWN0aW9uKGkpKS5maWx0ZXIoaSA9PiBpICYmICFpLmlzRW1wdHkoKSk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBJbnRlcnZhbCBhcHByb3ByaWF0ZSBmb3IgZGVidWdnaW5nLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuXG5cbiAgdG9TdHJpbmcoKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBJTlZBTElEJDE7XG4gICAgcmV0dXJuIGBbJHt0aGlzLnMudG9JU08oKX0g4oCTICR7dGhpcy5lLnRvSVNPKCl9KWA7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIEludGVydmFsLlxuICAgKiBAc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxI1RpbWVfaW50ZXJ2YWxzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gVGhlIHNhbWUgb3B0aW9ucyBhcyB7QGxpbmsgRGF0ZVRpbWUudG9JU099XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG5cblxuICB0b0lTTyhvcHRzKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBJTlZBTElEJDE7XG4gICAgcmV0dXJuIGAke3RoaXMucy50b0lTTyhvcHRzKX0vJHt0aGlzLmUudG9JU08ob3B0cyl9YDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhbiBJU08gODYwMS1jb21wbGlhbnQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGRhdGUgb2YgdGhpcyBJbnRlcnZhbC5cbiAgICogVGhlIHRpbWUgY29tcG9uZW50cyBhcmUgaWdub3JlZC5cbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSNUaW1lX2ludGVydmFsc1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuXG5cbiAgdG9JU09EYXRlKCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gSU5WQUxJRCQxO1xuICAgIHJldHVybiBgJHt0aGlzLnMudG9JU09EYXRlKCl9LyR7dGhpcy5lLnRvSVNPRGF0ZSgpfWA7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aW1lIG9mIHRoaXMgSW50ZXJ2YWwuXG4gICAqIFRoZSBkYXRlIGNvbXBvbmVudHMgYXJlIGlnbm9yZWQuXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEjVGltZV9pbnRlcnZhbHNcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBUaGUgc2FtZSBvcHRpb25zIGFzIHtAbGluayBEYXRlVGltZS50b0lTT31cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cblxuXG4gIHRvSVNPVGltZShvcHRzKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBJTlZBTElEJDE7XG4gICAgcmV0dXJuIGAke3RoaXMucy50b0lTT1RpbWUob3B0cyl9LyR7dGhpcy5lLnRvSVNPVGltZShvcHRzKX1gO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgSW50ZXJ2YWwgZm9ybWF0dGVkIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIGZvcm1hdCBzdHJpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRlRm9ybWF0IC0gdGhlIGZvcm1hdCBzdHJpbmcuIFRoaXMgc3RyaW5nIGZvcm1hdHMgdGhlIHN0YXJ0IGFuZCBlbmQgdGltZS4gU2VlIHtAbGluayBEYXRlVGltZS50b0Zvcm1hdH0gZm9yIGRldGFpbHMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuc2VwYXJhdG9yID0gICcg4oCTICddIC0gYSBzZXBhcmF0b3IgdG8gcGxhY2UgYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCByZXByZXNlbnRhdGlvbnNcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cblxuXG4gIHRvRm9ybWF0KGRhdGVGb3JtYXQsIHtcbiAgICBzZXBhcmF0b3IgPSBcIiDigJMgXCJcbiAgfSA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBJTlZBTElEJDE7XG4gICAgcmV0dXJuIGAke3RoaXMucy50b0Zvcm1hdChkYXRlRm9ybWF0KX0ke3NlcGFyYXRvcn0ke3RoaXMuZS50b0Zvcm1hdChkYXRlRm9ybWF0KX1gO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gYSBEdXJhdGlvbiByZXByZXNlbnRpbmcgdGhlIHRpbWUgc3Bhbm5lZCBieSB0aGlzIGludGVydmFsLlxuICAgKiBAcGFyYW0ge3N0cmluZ3xzdHJpbmdbXX0gW3VuaXQ9WydtaWxsaXNlY29uZHMnXV0gLSB0aGUgdW5pdCBvciB1bml0cyAoc3VjaCBhcyAnaG91cnMnIG9yICdkYXlzJykgdG8gaW5jbHVkZSBpbiB0aGUgZHVyYXRpb24uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUgY3JlYXRpb24gb2YgdGhlIER1cmF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5jb252ZXJzaW9uQWNjdXJhY3k9J2Nhc3VhbCddIC0gdGhlIGNvbnZlcnNpb24gc3lzdGVtIHRvIHVzZVxuICAgKiBAZXhhbXBsZSBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKGR0MSwgZHQyKS50b0R1cmF0aW9uKCkudG9PYmplY3QoKSAvLz0+IHsgbWlsbGlzZWNvbmRzOiA4ODQ4OTI1NyB9XG4gICAqIEBleGFtcGxlIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQxLCBkdDIpLnRvRHVyYXRpb24oJ2RheXMnKS50b09iamVjdCgpIC8vPT4geyBkYXlzOiAxLjAyNDE4MTIxNTI3Nzc3NzggfVxuICAgKiBAZXhhbXBsZSBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKGR0MSwgZHQyKS50b0R1cmF0aW9uKFsnaG91cnMnLCAnbWludXRlcyddKS50b09iamVjdCgpIC8vPT4geyBob3VyczogMjQsIG1pbnV0ZXM6IDM0LjgyMDk1IH1cbiAgICogQGV4YW1wbGUgSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhkdDEsIGR0MikudG9EdXJhdGlvbihbJ2hvdXJzJywgJ21pbnV0ZXMnLCAnc2Vjb25kcyddKS50b09iamVjdCgpIC8vPT4geyBob3VyczogMjQsIG1pbnV0ZXM6IDM0LCBzZWNvbmRzOiA0OS4yNTcgfVxuICAgKiBAZXhhbXBsZSBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKGR0MSwgZHQyKS50b0R1cmF0aW9uKCdzZWNvbmRzJykudG9PYmplY3QoKSAvLz0+IHsgc2Vjb25kczogODg0ODkuMjU3IH1cbiAgICogQHJldHVybiB7RHVyYXRpb259XG4gICAqL1xuXG5cbiAgdG9EdXJhdGlvbih1bml0LCBvcHRzKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBEdXJhdGlvbi5pbnZhbGlkKHRoaXMuaW52YWxpZFJlYXNvbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZS5kaWZmKHRoaXMucywgdW5pdCwgb3B0cyk7XG4gIH1cbiAgLyoqXG4gICAqIFJ1biBtYXBGbiBvbiB0aGUgaW50ZXJ2YWwgc3RhcnQgYW5kIGVuZCwgcmV0dXJuaW5nIGEgbmV3IEludGVydmFsIGZyb20gdGhlIHJlc3VsdGluZyBEYXRlVGltZXNcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gbWFwRm5cbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XG4gICAqIEBleGFtcGxlIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQxLCBkdDIpLm1hcEVuZHBvaW50cyhlbmRwb2ludCA9PiBlbmRwb2ludC50b1VUQygpKVxuICAgKiBAZXhhbXBsZSBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKGR0MSwgZHQyKS5tYXBFbmRwb2ludHMoZW5kcG9pbnQgPT4gZW5kcG9pbnQucGx1cyh7IGhvdXJzOiAyIH0pKVxuICAgKi9cblxuXG4gIG1hcEVuZHBvaW50cyhtYXBGbikge1xuICAgIHJldHVybiBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKG1hcEZuKHRoaXMucyksIG1hcEZuKHRoaXMuZSkpO1xuICB9XG5cbn1cblxuLyoqXG4gKiBUaGUgSW5mbyBjbGFzcyBjb250YWlucyBzdGF0aWMgbWV0aG9kcyBmb3IgcmV0cmlldmluZyBnZW5lcmFsIHRpbWUgYW5kIGRhdGUgcmVsYXRlZCBkYXRhLiBGb3IgZXhhbXBsZSwgaXQgaGFzIG1ldGhvZHMgZm9yIGZpbmRpbmcgb3V0IGlmIGEgdGltZSB6b25lIGhhcyBhIERTVCwgZm9yIGxpc3RpbmcgdGhlIG1vbnRocyBpbiBhbnkgc3VwcG9ydGVkIGxvY2FsZSwgYW5kIGZvciBkaXNjb3ZlcmluZyB3aGljaCBvZiBMdXhvbiBmZWF0dXJlcyBhcmUgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IGVudmlyb25tZW50LlxuICovXG5cbmNsYXNzIEluZm8ge1xuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB6b25lIGNvbnRhaW5zIGEgRFNULlxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbem9uZT0nbG9jYWwnXSAtIFpvbmUgdG8gY2hlY2suIERlZmF1bHRzIHRvIHRoZSBlbnZpcm9ubWVudCdzIGxvY2FsIHpvbmUuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBzdGF0aWMgaGFzRFNUKHpvbmUgPSBTZXR0aW5ncy5kZWZhdWx0Wm9uZSkge1xuICAgIGNvbnN0IHByb3RvID0gRGF0ZVRpbWUubm93KCkuc2V0Wm9uZSh6b25lKS5zZXQoe1xuICAgICAgbW9udGg6IDEyXG4gICAgfSk7XG4gICAgcmV0dXJuICF6b25lLnVuaXZlcnNhbCAmJiBwcm90by5vZmZzZXQgIT09IHByb3RvLnNldCh7XG4gICAgICBtb250aDogNlxuICAgIH0pLm9mZnNldDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB6b25lIGlzIGEgdmFsaWQgSUFOQSBzcGVjaWZpZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB6b25lIC0gWm9uZSB0byBjaGVja1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cblxuXG4gIHN0YXRpYyBpc1ZhbGlkSUFOQVpvbmUoem9uZSkge1xuICAgIHJldHVybiBJQU5BWm9uZS5pc1ZhbGlkU3BlY2lmaWVyKHpvbmUpICYmIElBTkFab25lLmlzVmFsaWRab25lKHpvbmUpO1xuICB9XG4gIC8qKlxuICAgKiBDb252ZXJ0cyB0aGUgaW5wdXQgaW50byBhIHtAbGluayBab25lfSBpbnN0YW5jZS5cbiAgICpcbiAgICogKiBJZiBgaW5wdXRgIGlzIGFscmVhZHkgYSBab25lIGluc3RhbmNlLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuXG4gICAqICogSWYgYGlucHV0YCBpcyBhIHN0cmluZyBjb250YWluaW5nIGEgdmFsaWQgdGltZSB6b25lIG5hbWUsIGEgWm9uZSBpbnN0YW5jZVxuICAgKiAgIHdpdGggdGhhdCBuYW1lIGlzIHJldHVybmVkLlxuICAgKiAqIElmIGBpbnB1dGAgaXMgYSBzdHJpbmcgdGhhdCBkb2Vzbid0IHJlZmVyIHRvIGEga25vd24gdGltZSB6b25lLCBhIFpvbmVcbiAgICogICBpbnN0YW5jZSB3aXRoIHtAbGluayBab25lLmlzVmFsaWR9ID09IGZhbHNlIGlzIHJldHVybmVkLlxuICAgKiAqIElmIGBpbnB1dCBpcyBhIG51bWJlciwgYSBab25lIGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZCBmaXhlZCBvZmZzZXRcbiAgICogICBpbiBtaW51dGVzIGlzIHJldHVybmVkLlxuICAgKiAqIElmIGBpbnB1dGAgaXMgYG51bGxgIG9yIGB1bmRlZmluZWRgLCB0aGUgZGVmYXVsdCB6b25lIGlzIHJldHVybmVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfG51bWJlcn0gW2lucHV0XSAtIHRoZSB2YWx1ZSB0byBiZSBjb252ZXJ0ZWRcbiAgICogQHJldHVybiB7Wm9uZX1cbiAgICovXG5cblxuICBzdGF0aWMgbm9ybWFsaXplWm9uZShpbnB1dCkge1xuICAgIHJldHVybiBub3JtYWxpemVab25lKGlucHV0LCBTZXR0aW5ncy5kZWZhdWx0Wm9uZSk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBzdGFuZGFsb25lIG1vbnRoIG5hbWVzLlxuICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0RhdGVUaW1lRm9ybWF0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGVuZ3RoPSdsb25nJ10gLSB0aGUgbGVuZ3RoIG9mIHRoZSBtb250aCByZXByZXNlbnRhdGlvbiwgc3VjaCBhcyBcIm51bWVyaWNcIiwgXCIyLWRpZ2l0XCIsIFwibmFycm93XCIsIFwic2hvcnRcIiwgXCJsb25nXCJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGVdIC0gdGhlIGxvY2FsZSBjb2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5udW1iZXJpbmdTeXN0ZW09bnVsbF0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMub3V0cHV0Q2FsZW5kYXI9J2dyZWdvcnknXSAtIHRoZSBjYWxlbmRhclxuICAgKiBAZXhhbXBsZSBJbmZvLm1vbnRocygpWzBdIC8vPT4gJ0phbnVhcnknXG4gICAqIEBleGFtcGxlIEluZm8ubW9udGhzKCdzaG9ydCcpWzBdIC8vPT4gJ0phbidcbiAgICogQGV4YW1wbGUgSW5mby5tb250aHMoJ251bWVyaWMnKVswXSAvLz0+ICcxJ1xuICAgKiBAZXhhbXBsZSBJbmZvLm1vbnRocygnc2hvcnQnLCB7IGxvY2FsZTogJ2ZyLUNBJyB9IClbMF0gLy89PiAnamFudi4nXG4gICAqIEBleGFtcGxlIEluZm8ubW9udGhzKCdudW1lcmljJywgeyBsb2NhbGU6ICdhcicgfSlbMF0gLy89PiAn2aEnXG4gICAqIEBleGFtcGxlIEluZm8ubW9udGhzKCdsb25nJywgeyBvdXRwdXRDYWxlbmRhcjogJ2lzbGFtaWMnIH0pWzBdIC8vPT4gJ1JhYmnKuyBJJ1xuICAgKiBAcmV0dXJuIHtbc3RyaW5nXX1cbiAgICovXG5cblxuICBzdGF0aWMgbW9udGhzKGxlbmd0aCA9IFwibG9uZ1wiLCB7XG4gICAgbG9jYWxlID0gbnVsbCxcbiAgICBudW1iZXJpbmdTeXN0ZW0gPSBudWxsLFxuICAgIG91dHB1dENhbGVuZGFyID0gXCJncmVnb3J5XCJcbiAgfSA9IHt9KSB7XG4gICAgcmV0dXJuIExvY2FsZS5jcmVhdGUobG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG91dHB1dENhbGVuZGFyKS5tb250aHMobGVuZ3RoKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIGFuIGFycmF5IG9mIGZvcm1hdCBtb250aCBuYW1lcy5cbiAgICogRm9ybWF0IG1vbnRocyBkaWZmZXIgZnJvbSBzdGFuZGFsb25lIG1vbnRocyBpbiB0aGF0IHRoZXkncmUgbWVhbnQgdG8gYXBwZWFyIG5leHQgdG8gdGhlIGRheSBvZiB0aGUgbW9udGguIEluIHNvbWUgbGFuZ3VhZ2VzLCB0aGF0XG4gICAqIGNoYW5nZXMgdGhlIHN0cmluZy5cbiAgICogU2VlIHtAbGluayBtb250aHN9XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGVuZ3RoPSdsb25nJ10gLSB0aGUgbGVuZ3RoIG9mIHRoZSBtb250aCByZXByZXNlbnRhdGlvbiwgc3VjaCBhcyBcIm51bWVyaWNcIiwgXCIyLWRpZ2l0XCIsIFwibmFycm93XCIsIFwic2hvcnRcIiwgXCJsb25nXCJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGVdIC0gdGhlIGxvY2FsZSBjb2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5udW1iZXJpbmdTeXN0ZW09bnVsbF0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMub3V0cHV0Q2FsZW5kYXI9J2dyZWdvcnknXSAtIHRoZSBjYWxlbmRhclxuICAgKiBAcmV0dXJuIHtbc3RyaW5nXX1cbiAgICovXG5cblxuICBzdGF0aWMgbW9udGhzRm9ybWF0KGxlbmd0aCA9IFwibG9uZ1wiLCB7XG4gICAgbG9jYWxlID0gbnVsbCxcbiAgICBudW1iZXJpbmdTeXN0ZW0gPSBudWxsLFxuICAgIG91dHB1dENhbGVuZGFyID0gXCJncmVnb3J5XCJcbiAgfSA9IHt9KSB7XG4gICAgcmV0dXJuIExvY2FsZS5jcmVhdGUobG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG91dHB1dENhbGVuZGFyKS5tb250aHMobGVuZ3RoLCB0cnVlKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIGFuIGFycmF5IG9mIHN0YW5kYWxvbmUgd2VlayBuYW1lcy5cbiAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9EYXRlVGltZUZvcm1hdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2xlbmd0aD0nbG9uZyddIC0gdGhlIGxlbmd0aCBvZiB0aGUgd2Vla2RheSByZXByZXNlbnRhdGlvbiwgc3VjaCBhcyBcIm5hcnJvd1wiLCBcInNob3J0XCIsIFwibG9uZ1wiLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZV0gLSB0aGUgbG9jYWxlIGNvZGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLm51bWJlcmluZ1N5c3RlbT1udWxsXSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtXG4gICAqIEBleGFtcGxlIEluZm8ud2Vla2RheXMoKVswXSAvLz0+ICdNb25kYXknXG4gICAqIEBleGFtcGxlIEluZm8ud2Vla2RheXMoJ3Nob3J0JylbMF0gLy89PiAnTW9uJ1xuICAgKiBAZXhhbXBsZSBJbmZvLndlZWtkYXlzKCdzaG9ydCcsIHsgbG9jYWxlOiAnZnItQ0EnIH0pWzBdIC8vPT4gJ2x1bi4nXG4gICAqIEBleGFtcGxlIEluZm8ud2Vla2RheXMoJ3Nob3J0JywgeyBsb2NhbGU6ICdhcicgfSlbMF0gLy89PiAn2KfZhNin2KvZhtmK2YYnXG4gICAqIEByZXR1cm4ge1tzdHJpbmddfVxuICAgKi9cblxuXG4gIHN0YXRpYyB3ZWVrZGF5cyhsZW5ndGggPSBcImxvbmdcIiwge1xuICAgIGxvY2FsZSA9IG51bGwsXG4gICAgbnVtYmVyaW5nU3lzdGVtID0gbnVsbFxuICB9ID0ge30pIHtcbiAgICByZXR1cm4gTG9jYWxlLmNyZWF0ZShsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgbnVsbCkud2Vla2RheXMobGVuZ3RoKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIGFuIGFycmF5IG9mIGZvcm1hdCB3ZWVrIG5hbWVzLlxuICAgKiBGb3JtYXQgd2Vla2RheXMgZGlmZmVyIGZyb20gc3RhbmRhbG9uZSB3ZWVrZGF5cyBpbiB0aGF0IHRoZXkncmUgbWVhbnQgdG8gYXBwZWFyIG5leHQgdG8gbW9yZSBkYXRlIGluZm9ybWF0aW9uLiBJbiBzb21lIGxhbmd1YWdlcywgdGhhdFxuICAgKiBjaGFuZ2VzIHRoZSBzdHJpbmcuXG4gICAqIFNlZSB7QGxpbmsgd2Vla2RheXN9XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGVuZ3RoPSdsb25nJ10gLSB0aGUgbGVuZ3RoIG9mIHRoZSB3ZWVrZGF5IHJlcHJlc2VudGF0aW9uLCBzdWNoIGFzIFwibmFycm93XCIsIFwic2hvcnRcIiwgXCJsb25nXCIuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlPW51bGxdIC0gdGhlIGxvY2FsZSBjb2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5udW1iZXJpbmdTeXN0ZW09bnVsbF0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbVxuICAgKiBAcmV0dXJuIHtbc3RyaW5nXX1cbiAgICovXG5cblxuICBzdGF0aWMgd2Vla2RheXNGb3JtYXQobGVuZ3RoID0gXCJsb25nXCIsIHtcbiAgICBsb2NhbGUgPSBudWxsLFxuICAgIG51bWJlcmluZ1N5c3RlbSA9IG51bGxcbiAgfSA9IHt9KSB7XG4gICAgcmV0dXJuIExvY2FsZS5jcmVhdGUobG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG51bGwpLndlZWtkYXlzKGxlbmd0aCwgdHJ1ZSk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBtZXJpZGllbXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlXSAtIHRoZSBsb2NhbGUgY29kZVxuICAgKiBAZXhhbXBsZSBJbmZvLm1lcmlkaWVtcygpIC8vPT4gWyAnQU0nLCAnUE0nIF1cbiAgICogQGV4YW1wbGUgSW5mby5tZXJpZGllbXMoeyBsb2NhbGU6ICdteScgfSkgLy89PiBbICfhgJThgLbhgJThgIDhgLonLCAn4YCK4YCU4YCxJyBdXG4gICAqIEByZXR1cm4ge1tzdHJpbmddfVxuICAgKi9cblxuXG4gIHN0YXRpYyBtZXJpZGllbXMoe1xuICAgIGxvY2FsZSA9IG51bGxcbiAgfSA9IHt9KSB7XG4gICAgcmV0dXJuIExvY2FsZS5jcmVhdGUobG9jYWxlKS5tZXJpZGllbXMoKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIGFuIGFycmF5IG9mIGVyYXMsIHN1Y2ggYXMgWydCQycsICdBRCddLiBUaGUgbG9jYWxlIGNhbiBiZSBzcGVjaWZpZWQsIGJ1dCB0aGUgY2FsZW5kYXIgc3lzdGVtIGlzIGFsd2F5cyBHcmVnb3JpYW4uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGVuZ3RoPSdzaG9ydCddIC0gdGhlIGxlbmd0aCBvZiB0aGUgZXJhIHJlcHJlc2VudGF0aW9uLCBzdWNoIGFzIFwic2hvcnRcIiBvciBcImxvbmdcIi5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGVdIC0gdGhlIGxvY2FsZSBjb2RlXG4gICAqIEBleGFtcGxlIEluZm8uZXJhcygpIC8vPT4gWyAnQkMnLCAnQUQnIF1cbiAgICogQGV4YW1wbGUgSW5mby5lcmFzKCdsb25nJykgLy89PiBbICdCZWZvcmUgQ2hyaXN0JywgJ0Fubm8gRG9taW5pJyBdXG4gICAqIEBleGFtcGxlIEluZm8uZXJhcygnbG9uZycsIHsgbG9jYWxlOiAnZnInIH0pIC8vPT4gWyAnYXZhbnQgSsOpc3VzLUNocmlzdCcsICdhcHLDqHMgSsOpc3VzLUNocmlzdCcgXVxuICAgKiBAcmV0dXJuIHtbc3RyaW5nXX1cbiAgICovXG5cblxuICBzdGF0aWMgZXJhcyhsZW5ndGggPSBcInNob3J0XCIsIHtcbiAgICBsb2NhbGUgPSBudWxsXG4gIH0gPSB7fSkge1xuICAgIHJldHVybiBMb2NhbGUuY3JlYXRlKGxvY2FsZSwgbnVsbCwgXCJncmVnb3J5XCIpLmVyYXMobGVuZ3RoKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIHRoZSBzZXQgb2YgYXZhaWxhYmxlIGZlYXR1cmVzIGluIHRoaXMgZW52aXJvbm1lbnQuXG4gICAqIFNvbWUgZmVhdHVyZXMgb2YgTHV4b24gYXJlIG5vdCBhdmFpbGFibGUgaW4gYWxsIGVudmlyb25tZW50cy4gRm9yIGV4YW1wbGUsIG9uIG9sZGVyIGJyb3dzZXJzLCB0aW1lem9uZSBzdXBwb3J0IGlzIG5vdCBhdmFpbGFibGUuIFVzZSB0aGlzIGZ1bmN0aW9uIHRvIGZpZ3VyZSBvdXQgaWYgdGhhdCdzIHRoZSBjYXNlLlxuICAgKiBLZXlzOlxuICAgKiAqIGB6b25lc2A6IHdoZXRoZXIgdGhpcyBlbnZpcm9ubWVudCBzdXBwb3J0cyBJQU5BIHRpbWV6b25lc1xuICAgKiAqIGBpbnRsVG9rZW5zYDogd2hldGhlciB0aGlzIGVudmlyb25tZW50IHN1cHBvcnRzIGludGVybmF0aW9uYWxpemVkIHRva2VuLWJhc2VkIGZvcm1hdHRpbmcvcGFyc2luZ1xuICAgKiAqIGBpbnRsYDogd2hldGhlciB0aGlzIGVudmlyb25tZW50IHN1cHBvcnRzIGdlbmVyYWwgaW50ZXJuYXRpb25hbGl6YXRpb25cbiAgICogKiBgcmVsYXRpdmVgOiB3aGV0aGVyIHRoaXMgZW52aXJvbm1lbnQgc3VwcG9ydHMgcmVsYXRpdmUgdGltZSBmb3JtYXR0aW5nXG4gICAqIEBleGFtcGxlIEluZm8uZmVhdHVyZXMoKSAvLz0+IHsgaW50bDogdHJ1ZSwgaW50bFRva2VuczogZmFsc2UsIHpvbmVzOiB0cnVlLCByZWxhdGl2ZTogZmFsc2UgfVxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuXG5cbiAgc3RhdGljIGZlYXR1cmVzKCkge1xuICAgIGxldCBpbnRsID0gZmFsc2UsXG4gICAgICAgIGludGxUb2tlbnMgPSBmYWxzZSxcbiAgICAgICAgem9uZXMgPSBmYWxzZSxcbiAgICAgICAgcmVsYXRpdmUgPSBmYWxzZTtcblxuICAgIGlmIChoYXNJbnRsKCkpIHtcbiAgICAgIGludGwgPSB0cnVlO1xuICAgICAgaW50bFRva2VucyA9IGhhc0Zvcm1hdFRvUGFydHMoKTtcbiAgICAgIHJlbGF0aXZlID0gaGFzUmVsYXRpdmUoKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgem9uZXMgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChcImVuXCIsIHtcbiAgICAgICAgICB0aW1lWm9uZTogXCJBbWVyaWNhL05ld19Zb3JrXCJcbiAgICAgICAgfSkucmVzb2x2ZWRPcHRpb25zKCkudGltZVpvbmUgPT09IFwiQW1lcmljYS9OZXdfWW9ya1wiO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB6b25lcyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpbnRsLFxuICAgICAgaW50bFRva2VucyxcbiAgICAgIHpvbmVzLFxuICAgICAgcmVsYXRpdmVcbiAgICB9O1xuICB9XG5cbn1cblxuZnVuY3Rpb24gZGF5RGlmZihlYXJsaWVyLCBsYXRlcikge1xuICBjb25zdCB1dGNEYXlTdGFydCA9IGR0ID0+IGR0LnRvVVRDKDAsIHtcbiAgICBrZWVwTG9jYWxUaW1lOiB0cnVlXG4gIH0pLnN0YXJ0T2YoXCJkYXlcIikudmFsdWVPZigpLFxuICAgICAgICBtcyA9IHV0Y0RheVN0YXJ0KGxhdGVyKSAtIHV0Y0RheVN0YXJ0KGVhcmxpZXIpO1xuXG4gIHJldHVybiBNYXRoLmZsb29yKER1cmF0aW9uLmZyb21NaWxsaXMobXMpLmFzKFwiZGF5c1wiKSk7XG59XG5cbmZ1bmN0aW9uIGhpZ2hPcmRlckRpZmZzKGN1cnNvciwgbGF0ZXIsIHVuaXRzKSB7XG4gIGNvbnN0IGRpZmZlcnMgPSBbW1wieWVhcnNcIiwgKGEsIGIpID0+IGIueWVhciAtIGEueWVhcl0sIFtcInF1YXJ0ZXJzXCIsIChhLCBiKSA9PiBiLnF1YXJ0ZXIgLSBhLnF1YXJ0ZXJdLCBbXCJtb250aHNcIiwgKGEsIGIpID0+IGIubW9udGggLSBhLm1vbnRoICsgKGIueWVhciAtIGEueWVhcikgKiAxMl0sIFtcIndlZWtzXCIsIChhLCBiKSA9PiB7XG4gICAgY29uc3QgZGF5cyA9IGRheURpZmYoYSwgYik7XG4gICAgcmV0dXJuIChkYXlzIC0gZGF5cyAlIDcpIC8gNztcbiAgfV0sIFtcImRheXNcIiwgZGF5RGlmZl1dO1xuICBjb25zdCByZXN1bHRzID0ge307XG4gIGxldCBsb3dlc3RPcmRlciwgaGlnaFdhdGVyO1xuXG4gIGZvciAoY29uc3QgW3VuaXQsIGRpZmZlcl0gb2YgZGlmZmVycykge1xuICAgIGlmICh1bml0cy5pbmRleE9mKHVuaXQpID49IDApIHtcbiAgICAgIGxvd2VzdE9yZGVyID0gdW5pdDtcbiAgICAgIGxldCBkZWx0YSA9IGRpZmZlcihjdXJzb3IsIGxhdGVyKTtcbiAgICAgIGhpZ2hXYXRlciA9IGN1cnNvci5wbHVzKHtcbiAgICAgICAgW3VuaXRdOiBkZWx0YVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChoaWdoV2F0ZXIgPiBsYXRlcikge1xuICAgICAgICBjdXJzb3IgPSBjdXJzb3IucGx1cyh7XG4gICAgICAgICAgW3VuaXRdOiBkZWx0YSAtIDFcbiAgICAgICAgfSk7XG4gICAgICAgIGRlbHRhIC09IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdXJzb3IgPSBoaWdoV2F0ZXI7XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdHNbdW5pdF0gPSBkZWx0YTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gW2N1cnNvciwgcmVzdWx0cywgaGlnaFdhdGVyLCBsb3dlc3RPcmRlcl07XG59XG5cbmZ1bmN0aW9uIGRpZmYgKGVhcmxpZXIsIGxhdGVyLCB1bml0cywgb3B0cykge1xuICBsZXQgW2N1cnNvciwgcmVzdWx0cywgaGlnaFdhdGVyLCBsb3dlc3RPcmRlcl0gPSBoaWdoT3JkZXJEaWZmcyhlYXJsaWVyLCBsYXRlciwgdW5pdHMpO1xuICBjb25zdCByZW1haW5pbmdNaWxsaXMgPSBsYXRlciAtIGN1cnNvcjtcbiAgY29uc3QgbG93ZXJPcmRlclVuaXRzID0gdW5pdHMuZmlsdGVyKHUgPT4gW1wiaG91cnNcIiwgXCJtaW51dGVzXCIsIFwic2Vjb25kc1wiLCBcIm1pbGxpc2Vjb25kc1wiXS5pbmRleE9mKHUpID49IDApO1xuXG4gIGlmIChsb3dlck9yZGVyVW5pdHMubGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKGhpZ2hXYXRlciA8IGxhdGVyKSB7XG4gICAgICBoaWdoV2F0ZXIgPSBjdXJzb3IucGx1cyh7XG4gICAgICAgIFtsb3dlc3RPcmRlcl06IDFcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChoaWdoV2F0ZXIgIT09IGN1cnNvcikge1xuICAgICAgcmVzdWx0c1tsb3dlc3RPcmRlcl0gPSAocmVzdWx0c1tsb3dlc3RPcmRlcl0gfHwgMCkgKyByZW1haW5pbmdNaWxsaXMgLyAoaGlnaFdhdGVyIC0gY3Vyc29yKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBkdXJhdGlvbiA9IER1cmF0aW9uLmZyb21PYmplY3QoT2JqZWN0LmFzc2lnbihyZXN1bHRzLCBvcHRzKSk7XG5cbiAgaWYgKGxvd2VyT3JkZXJVbml0cy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIER1cmF0aW9uLmZyb21NaWxsaXMocmVtYWluaW5nTWlsbGlzLCBvcHRzKS5zaGlmdFRvKC4uLmxvd2VyT3JkZXJVbml0cykucGx1cyhkdXJhdGlvbik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGR1cmF0aW9uO1xuICB9XG59XG5cbmNvbnN0IG51bWJlcmluZ1N5c3RlbXMgPSB7XG4gIGFyYWI6IFwiW1xcdTA2NjAtXFx1MDY2OV1cIixcbiAgYXJhYmV4dDogXCJbXFx1MDZGMC1cXHUwNkY5XVwiLFxuICBiYWxpOiBcIltcXHUxQjUwLVxcdTFCNTldXCIsXG4gIGJlbmc6IFwiW1xcdTA5RTYtXFx1MDlFRl1cIixcbiAgZGV2YTogXCJbXFx1MDk2Ni1cXHUwOTZGXVwiLFxuICBmdWxsd2lkZTogXCJbXFx1RkYxMC1cXHVGRjE5XVwiLFxuICBndWpyOiBcIltcXHUwQUU2LVxcdTBBRUZdXCIsXG4gIGhhbmlkZWM6IFwiW+OAh3zkuIB85LqMfOS4iXzlm5t85LqUfOWFrXzkuIN85YWrfOS5nV1cIixcbiAga2htcjogXCJbXFx1MTdFMC1cXHUxN0U5XVwiLFxuICBrbmRhOiBcIltcXHUwQ0U2LVxcdTBDRUZdXCIsXG4gIGxhb286IFwiW1xcdTBFRDAtXFx1MEVEOV1cIixcbiAgbGltYjogXCJbXFx1MTk0Ni1cXHUxOTRGXVwiLFxuICBtbHltOiBcIltcXHUwRDY2LVxcdTBENkZdXCIsXG4gIG1vbmc6IFwiW1xcdTE4MTAtXFx1MTgxOV1cIixcbiAgbXltcjogXCJbXFx1MTA0MC1cXHUxMDQ5XVwiLFxuICBvcnlhOiBcIltcXHUwQjY2LVxcdTBCNkZdXCIsXG4gIHRhbWxkZWM6IFwiW1xcdTBCRTYtXFx1MEJFRl1cIixcbiAgdGVsdTogXCJbXFx1MEM2Ni1cXHUwQzZGXVwiLFxuICB0aGFpOiBcIltcXHUwRTUwLVxcdTBFNTldXCIsXG4gIHRpYnQ6IFwiW1xcdTBGMjAtXFx1MEYyOV1cIixcbiAgbGF0bjogXCJcXFxcZFwiXG59O1xuY29uc3QgbnVtYmVyaW5nU3lzdGVtc1VURjE2ID0ge1xuICBhcmFiOiBbMTYzMiwgMTY0MV0sXG4gIGFyYWJleHQ6IFsxNzc2LCAxNzg1XSxcbiAgYmFsaTogWzY5OTIsIDcwMDFdLFxuICBiZW5nOiBbMjUzNCwgMjU0M10sXG4gIGRldmE6IFsyNDA2LCAyNDE1XSxcbiAgZnVsbHdpZGU6IFs2NTI5NiwgNjUzMDNdLFxuICBndWpyOiBbMjc5MCwgMjc5OV0sXG4gIGtobXI6IFs2MTEyLCA2MTIxXSxcbiAga25kYTogWzMzMDIsIDMzMTFdLFxuICBsYW9vOiBbMzc5MiwgMzgwMV0sXG4gIGxpbWI6IFs2NDcwLCA2NDc5XSxcbiAgbWx5bTogWzM0MzAsIDM0MzldLFxuICBtb25nOiBbNjE2MCwgNjE2OV0sXG4gIG15bXI6IFs0MTYwLCA0MTY5XSxcbiAgb3J5YTogWzI5MTgsIDI5MjddLFxuICB0YW1sZGVjOiBbMzA0NiwgMzA1NV0sXG4gIHRlbHU6IFszMTc0LCAzMTgzXSxcbiAgdGhhaTogWzM2NjQsIDM2NzNdLFxuICB0aWJ0OiBbMzg3MiwgMzg4MV1cbn07IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuXG5jb25zdCBoYW5pZGVjQ2hhcnMgPSBudW1iZXJpbmdTeXN0ZW1zLmhhbmlkZWMucmVwbGFjZSgvW1xcW3xcXF1dL2csIFwiXCIpLnNwbGl0KFwiXCIpO1xuZnVuY3Rpb24gcGFyc2VEaWdpdHMoc3RyKSB7XG4gIGxldCB2YWx1ZSA9IHBhcnNlSW50KHN0ciwgMTApO1xuXG4gIGlmIChpc05hTih2YWx1ZSkpIHtcbiAgICB2YWx1ZSA9IFwiXCI7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY29kZSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuXG4gICAgICBpZiAoc3RyW2ldLnNlYXJjaChudW1iZXJpbmdTeXN0ZW1zLmhhbmlkZWMpICE9PSAtMSkge1xuICAgICAgICB2YWx1ZSArPSBoYW5pZGVjQ2hhcnMuaW5kZXhPZihzdHJbaV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbnVtYmVyaW5nU3lzdGVtc1VURjE2KSB7XG4gICAgICAgICAgY29uc3QgW21pbiwgbWF4XSA9IG51bWJlcmluZ1N5c3RlbXNVVEYxNltrZXldO1xuXG4gICAgICAgICAgaWYgKGNvZGUgPj0gbWluICYmIGNvZGUgPD0gbWF4KSB7XG4gICAgICAgICAgICB2YWx1ZSArPSBjb2RlIC0gbWluO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwYXJzZUludCh2YWx1ZSwgMTApO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuZnVuY3Rpb24gZGlnaXRSZWdleCh7XG4gIG51bWJlcmluZ1N5c3RlbVxufSwgYXBwZW5kID0gXCJcIikge1xuICByZXR1cm4gbmV3IFJlZ0V4cChgJHtudW1iZXJpbmdTeXN0ZW1zW251bWJlcmluZ1N5c3RlbSB8fCBcImxhdG5cIl19JHthcHBlbmR9YCk7XG59XG5cbmNvbnN0IE1JU1NJTkdfRlRQID0gXCJtaXNzaW5nIEludGwuRGF0ZVRpbWVGb3JtYXQuZm9ybWF0VG9QYXJ0cyBzdXBwb3J0XCI7XG5cbmZ1bmN0aW9uIGludFVuaXQocmVnZXgsIHBvc3QgPSBpID0+IGkpIHtcbiAgcmV0dXJuIHtcbiAgICByZWdleCxcbiAgICBkZXNlcjogKFtzXSkgPT4gcG9zdChwYXJzZURpZ2l0cyhzKSlcbiAgfTtcbn1cblxuY29uc3QgTkJTUCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKTtcbmNvbnN0IHNwYWNlT3JOQlNQID0gYCggfCR7TkJTUH0pYDtcbmNvbnN0IHNwYWNlT3JOQlNQUmVnRXhwID0gbmV3IFJlZ0V4cChzcGFjZU9yTkJTUCwgXCJnXCIpO1xuXG5mdW5jdGlvbiBmaXhMaXN0UmVnZXgocykge1xuICAvLyBtYWtlIGRvdHMgb3B0aW9uYWwgYW5kIGFsc28gbWFrZSB0aGVtIGxpdGVyYWxcbiAgLy8gbWFrZSBzcGFjZSBhbmQgbm9uIGJyZWFrYWJsZSBzcGFjZSBjaGFyYWN0ZXJzIGludGVyY2hhbmdlYWJsZVxuICByZXR1cm4gcy5yZXBsYWNlKC9cXC4vZywgXCJcXFxcLj9cIikucmVwbGFjZShzcGFjZU9yTkJTUFJlZ0V4cCwgc3BhY2VPck5CU1ApO1xufVxuXG5mdW5jdGlvbiBzdHJpcEluc2Vuc2l0aXZpdGllcyhzKSB7XG4gIHJldHVybiBzLnJlcGxhY2UoL1xcLi9nLCBcIlwiKSAvLyBpZ25vcmUgZG90cyB0aGF0IHdlcmUgbWFkZSBvcHRpb25hbFxuICAucmVwbGFjZShzcGFjZU9yTkJTUFJlZ0V4cCwgXCIgXCIpIC8vIGludGVyY2hhbmdlIHNwYWNlIGFuZCBuYnNwXG4gIC50b0xvd2VyQ2FzZSgpO1xufVxuXG5mdW5jdGlvbiBvbmVPZihzdHJpbmdzLCBzdGFydEluZGV4KSB7XG4gIGlmIChzdHJpbmdzID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlZ2V4OiBSZWdFeHAoc3RyaW5ncy5tYXAoZml4TGlzdFJlZ2V4KS5qb2luKFwifFwiKSksXG4gICAgICBkZXNlcjogKFtzXSkgPT4gc3RyaW5ncy5maW5kSW5kZXgoaSA9PiBzdHJpcEluc2Vuc2l0aXZpdGllcyhzKSA9PT0gc3RyaXBJbnNlbnNpdGl2aXRpZXMoaSkpICsgc3RhcnRJbmRleFxuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gb2Zmc2V0KHJlZ2V4LCBncm91cHMpIHtcbiAgcmV0dXJuIHtcbiAgICByZWdleCxcbiAgICBkZXNlcjogKFssIGgsIG1dKSA9PiBzaWduZWRPZmZzZXQoaCwgbSksXG4gICAgZ3JvdXBzXG4gIH07XG59XG5cbmZ1bmN0aW9uIHNpbXBsZShyZWdleCkge1xuICByZXR1cm4ge1xuICAgIHJlZ2V4LFxuICAgIGRlc2VyOiAoW3NdKSA9PiBzXG4gIH07XG59XG5cbmZ1bmN0aW9uIGVzY2FwZVRva2VuKHZhbHVlKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2VsZXNzLWVzY2FwZVxuICByZXR1cm4gdmFsdWUucmVwbGFjZSgvW1xcLVxcW1xcXXt9KCkqKz8uLFxcXFxcXF4kfCNcXHNdL2csIFwiXFxcXCQmXCIpO1xufVxuXG5mdW5jdGlvbiB1bml0Rm9yVG9rZW4odG9rZW4sIGxvYykge1xuICBjb25zdCBvbmUgPSBkaWdpdFJlZ2V4KGxvYyksXG4gICAgICAgIHR3byA9IGRpZ2l0UmVnZXgobG9jLCBcInsyfVwiKSxcbiAgICAgICAgdGhyZWUgPSBkaWdpdFJlZ2V4KGxvYywgXCJ7M31cIiksXG4gICAgICAgIGZvdXIgPSBkaWdpdFJlZ2V4KGxvYywgXCJ7NH1cIiksXG4gICAgICAgIHNpeCA9IGRpZ2l0UmVnZXgobG9jLCBcIns2fVwiKSxcbiAgICAgICAgb25lT3JUd28gPSBkaWdpdFJlZ2V4KGxvYywgXCJ7MSwyfVwiKSxcbiAgICAgICAgb25lVG9UaHJlZSA9IGRpZ2l0UmVnZXgobG9jLCBcInsxLDN9XCIpLFxuICAgICAgICBvbmVUb1NpeCA9IGRpZ2l0UmVnZXgobG9jLCBcInsxLDZ9XCIpLFxuICAgICAgICBvbmVUb05pbmUgPSBkaWdpdFJlZ2V4KGxvYywgXCJ7MSw5fVwiKSxcbiAgICAgICAgdHdvVG9Gb3VyID0gZGlnaXRSZWdleChsb2MsIFwiezIsNH1cIiksXG4gICAgICAgIGZvdXJUb1NpeCA9IGRpZ2l0UmVnZXgobG9jLCBcIns0LDZ9XCIpLFxuICAgICAgICBsaXRlcmFsID0gdCA9PiAoe1xuICAgIHJlZ2V4OiBSZWdFeHAoZXNjYXBlVG9rZW4odC52YWwpKSxcbiAgICBkZXNlcjogKFtzXSkgPT4gcyxcbiAgICBsaXRlcmFsOiB0cnVlXG4gIH0pLFxuICAgICAgICB1bml0YXRlID0gdCA9PiB7XG4gICAgaWYgKHRva2VuLmxpdGVyYWwpIHtcbiAgICAgIHJldHVybiBsaXRlcmFsKHQpO1xuICAgIH1cblxuICAgIHN3aXRjaCAodC52YWwpIHtcbiAgICAgIC8vIGVyYVxuICAgICAgY2FzZSBcIkdcIjpcbiAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy5lcmFzKFwic2hvcnRcIiwgZmFsc2UpLCAwKTtcblxuICAgICAgY2FzZSBcIkdHXCI6XG4gICAgICAgIHJldHVybiBvbmVPZihsb2MuZXJhcyhcImxvbmdcIiwgZmFsc2UpLCAwKTtcbiAgICAgIC8vIHllYXJzXG5cbiAgICAgIGNhc2UgXCJ5XCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KG9uZVRvU2l4KTtcblxuICAgICAgY2FzZSBcInl5XCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KHR3b1RvRm91ciwgdW50cnVuY2F0ZVllYXIpO1xuXG4gICAgICBjYXNlIFwieXl5eVwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdChmb3VyKTtcblxuICAgICAgY2FzZSBcInl5eXl5XCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KGZvdXJUb1NpeCk7XG5cbiAgICAgIGNhc2UgXCJ5eXl5eXlcIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQoc2l4KTtcbiAgICAgIC8vIG1vbnRoc1xuXG4gICAgICBjYXNlIFwiTVwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG5cbiAgICAgIGNhc2UgXCJNTVwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuXG4gICAgICBjYXNlIFwiTU1NXCI6XG4gICAgICAgIHJldHVybiBvbmVPZihsb2MubW9udGhzKFwic2hvcnRcIiwgdHJ1ZSwgZmFsc2UpLCAxKTtcblxuICAgICAgY2FzZSBcIk1NTU1cIjpcbiAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy5tb250aHMoXCJsb25nXCIsIHRydWUsIGZhbHNlKSwgMSk7XG5cbiAgICAgIGNhc2UgXCJMXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcblxuICAgICAgY2FzZSBcIkxMXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG5cbiAgICAgIGNhc2UgXCJMTExcIjpcbiAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy5tb250aHMoXCJzaG9ydFwiLCBmYWxzZSwgZmFsc2UpLCAxKTtcblxuICAgICAgY2FzZSBcIkxMTExcIjpcbiAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy5tb250aHMoXCJsb25nXCIsIGZhbHNlLCBmYWxzZSksIDEpO1xuICAgICAgLy8gZGF0ZXNcblxuICAgICAgY2FzZSBcImRcIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQob25lT3JUd28pO1xuXG4gICAgICBjYXNlIFwiZGRcIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcbiAgICAgIC8vIG9yZGluYWxzXG5cbiAgICAgIGNhc2UgXCJvXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KG9uZVRvVGhyZWUpO1xuXG4gICAgICBjYXNlIFwib29vXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KHRocmVlKTtcbiAgICAgIC8vIHRpbWVcblxuICAgICAgY2FzZSBcIkhIXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG5cbiAgICAgIGNhc2UgXCJIXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcblxuICAgICAgY2FzZSBcImhoXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG5cbiAgICAgIGNhc2UgXCJoXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcblxuICAgICAgY2FzZSBcIm1tXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG5cbiAgICAgIGNhc2UgXCJtXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcblxuICAgICAgY2FzZSBcInFcIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQob25lT3JUd28pO1xuXG4gICAgICBjYXNlIFwicXFcIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcblxuICAgICAgY2FzZSBcInNcIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQob25lT3JUd28pO1xuXG4gICAgICBjYXNlIFwic3NcIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcblxuICAgICAgY2FzZSBcIlNcIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQob25lVG9UaHJlZSk7XG5cbiAgICAgIGNhc2UgXCJTU1NcIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQodGhyZWUpO1xuXG4gICAgICBjYXNlIFwidVwiOlxuICAgICAgICByZXR1cm4gc2ltcGxlKG9uZVRvTmluZSk7XG4gICAgICAvLyBtZXJpZGllbVxuXG4gICAgICBjYXNlIFwiYVwiOlxuICAgICAgICByZXR1cm4gb25lT2YobG9jLm1lcmlkaWVtcygpLCAwKTtcbiAgICAgIC8vIHdlZWtZZWFyIChrKVxuXG4gICAgICBjYXNlIFwia2tra1wiOlxuICAgICAgICByZXR1cm4gaW50VW5pdChmb3VyKTtcblxuICAgICAgY2FzZSBcImtrXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KHR3b1RvRm91ciwgdW50cnVuY2F0ZVllYXIpO1xuICAgICAgLy8gd2Vla051bWJlciAoVylcblxuICAgICAgY2FzZSBcIldcIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQob25lT3JUd28pO1xuXG4gICAgICBjYXNlIFwiV1dcIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcbiAgICAgIC8vIHdlZWtkYXlzXG5cbiAgICAgIGNhc2UgXCJFXCI6XG4gICAgICBjYXNlIFwiY1wiOlxuICAgICAgICByZXR1cm4gaW50VW5pdChvbmUpO1xuXG4gICAgICBjYXNlIFwiRUVFXCI6XG4gICAgICAgIHJldHVybiBvbmVPZihsb2Mud2Vla2RheXMoXCJzaG9ydFwiLCBmYWxzZSwgZmFsc2UpLCAxKTtcblxuICAgICAgY2FzZSBcIkVFRUVcIjpcbiAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy53ZWVrZGF5cyhcImxvbmdcIiwgZmFsc2UsIGZhbHNlKSwgMSk7XG5cbiAgICAgIGNhc2UgXCJjY2NcIjpcbiAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy53ZWVrZGF5cyhcInNob3J0XCIsIHRydWUsIGZhbHNlKSwgMSk7XG5cbiAgICAgIGNhc2UgXCJjY2NjXCI6XG4gICAgICAgIHJldHVybiBvbmVPZihsb2Mud2Vla2RheXMoXCJsb25nXCIsIHRydWUsIGZhbHNlKSwgMSk7XG4gICAgICAvLyBvZmZzZXQvem9uZVxuXG4gICAgICBjYXNlIFwiWlwiOlxuICAgICAgY2FzZSBcIlpaXCI6XG4gICAgICAgIHJldHVybiBvZmZzZXQobmV3IFJlZ0V4cChgKFsrLV0ke29uZU9yVHdvLnNvdXJjZX0pKD86Oigke3R3by5zb3VyY2V9KSk/YCksIDIpO1xuXG4gICAgICBjYXNlIFwiWlpaXCI6XG4gICAgICAgIHJldHVybiBvZmZzZXQobmV3IFJlZ0V4cChgKFsrLV0ke29uZU9yVHdvLnNvdXJjZX0pKCR7dHdvLnNvdXJjZX0pP2ApLCAyKTtcbiAgICAgIC8vIHdlIGRvbid0IHN1cHBvcnQgWlpaWiAoUFNUKSBvciBaWlpaWiAoUGFjaWZpYyBTdGFuZGFyZCBUaW1lKSBpbiBwYXJzaW5nXG4gICAgICAvLyBiZWNhdXNlIHdlIGRvbid0IGhhdmUgYW55IHdheSB0byBmaWd1cmUgb3V0IHdoYXQgdGhleSBhcmVcblxuICAgICAgY2FzZSBcInpcIjpcbiAgICAgICAgcmV0dXJuIHNpbXBsZSgvW2Etel8rLS9dezEsMjU2fT8vaSk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsaXRlcmFsKHQpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCB1bml0ID0gdW5pdGF0ZSh0b2tlbikgfHwge1xuICAgIGludmFsaWRSZWFzb246IE1JU1NJTkdfRlRQXG4gIH07XG4gIHVuaXQudG9rZW4gPSB0b2tlbjtcbiAgcmV0dXJuIHVuaXQ7XG59XG5cbmNvbnN0IHBhcnRUeXBlU3R5bGVUb1Rva2VuVmFsID0ge1xuICB5ZWFyOiB7XG4gICAgXCIyLWRpZ2l0XCI6IFwieXlcIixcbiAgICBudW1lcmljOiBcInl5eXl5XCJcbiAgfSxcbiAgbW9udGg6IHtcbiAgICBudW1lcmljOiBcIk1cIixcbiAgICBcIjItZGlnaXRcIjogXCJNTVwiLFxuICAgIHNob3J0OiBcIk1NTVwiLFxuICAgIGxvbmc6IFwiTU1NTVwiXG4gIH0sXG4gIGRheToge1xuICAgIG51bWVyaWM6IFwiZFwiLFxuICAgIFwiMi1kaWdpdFwiOiBcImRkXCJcbiAgfSxcbiAgd2Vla2RheToge1xuICAgIHNob3J0OiBcIkVFRVwiLFxuICAgIGxvbmc6IFwiRUVFRVwiXG4gIH0sXG4gIGRheXBlcmlvZDogXCJhXCIsXG4gIGRheVBlcmlvZDogXCJhXCIsXG4gIGhvdXI6IHtcbiAgICBudW1lcmljOiBcImhcIixcbiAgICBcIjItZGlnaXRcIjogXCJoaFwiXG4gIH0sXG4gIG1pbnV0ZToge1xuICAgIG51bWVyaWM6IFwibVwiLFxuICAgIFwiMi1kaWdpdFwiOiBcIm1tXCJcbiAgfSxcbiAgc2Vjb25kOiB7XG4gICAgbnVtZXJpYzogXCJzXCIsXG4gICAgXCIyLWRpZ2l0XCI6IFwic3NcIlxuICB9XG59O1xuXG5mdW5jdGlvbiB0b2tlbkZvclBhcnQocGFydCwgbG9jYWxlLCBmb3JtYXRPcHRzKSB7XG4gIGNvbnN0IHtcbiAgICB0eXBlLFxuICAgIHZhbHVlXG4gIH0gPSBwYXJ0O1xuXG4gIGlmICh0eXBlID09PSBcImxpdGVyYWxcIikge1xuICAgIHJldHVybiB7XG4gICAgICBsaXRlcmFsOiB0cnVlLFxuICAgICAgdmFsOiB2YWx1ZVxuICAgIH07XG4gIH1cblxuICBjb25zdCBzdHlsZSA9IGZvcm1hdE9wdHNbdHlwZV07XG4gIGxldCB2YWwgPSBwYXJ0VHlwZVN0eWxlVG9Ub2tlblZhbFt0eXBlXTtcblxuICBpZiAodHlwZW9mIHZhbCA9PT0gXCJvYmplY3RcIikge1xuICAgIHZhbCA9IHZhbFtzdHlsZV07XG4gIH1cblxuICBpZiAodmFsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxpdGVyYWw6IGZhbHNlLFxuICAgICAgdmFsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmVnZXgodW5pdHMpIHtcbiAgY29uc3QgcmUgPSB1bml0cy5tYXAodSA9PiB1LnJlZ2V4KS5yZWR1Y2UoKGYsIHIpID0+IGAke2Z9KCR7ci5zb3VyY2V9KWAsIFwiXCIpO1xuICByZXR1cm4gW2BeJHtyZX0kYCwgdW5pdHNdO1xufVxuXG5mdW5jdGlvbiBtYXRjaChpbnB1dCwgcmVnZXgsIGhhbmRsZXJzKSB7XG4gIGNvbnN0IG1hdGNoZXMgPSBpbnB1dC5tYXRjaChyZWdleCk7XG5cbiAgaWYgKG1hdGNoZXMpIHtcbiAgICBjb25zdCBhbGwgPSB7fTtcbiAgICBsZXQgbWF0Y2hJbmRleCA9IDE7XG5cbiAgICBmb3IgKGNvbnN0IGkgaW4gaGFuZGxlcnMpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eShoYW5kbGVycywgaSkpIHtcbiAgICAgICAgY29uc3QgaCA9IGhhbmRsZXJzW2ldLFxuICAgICAgICAgICAgICBncm91cHMgPSBoLmdyb3VwcyA/IGguZ3JvdXBzICsgMSA6IDE7XG5cbiAgICAgICAgaWYgKCFoLmxpdGVyYWwgJiYgaC50b2tlbikge1xuICAgICAgICAgIGFsbFtoLnRva2VuLnZhbFswXV0gPSBoLmRlc2VyKG1hdGNoZXMuc2xpY2UobWF0Y2hJbmRleCwgbWF0Y2hJbmRleCArIGdyb3VwcykpO1xuICAgICAgICB9XG5cbiAgICAgICAgbWF0Y2hJbmRleCArPSBncm91cHM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFttYXRjaGVzLCBhbGxdO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBbbWF0Y2hlcywge31dO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRhdGVUaW1lRnJvbU1hdGNoZXMobWF0Y2hlcykge1xuICBjb25zdCB0b0ZpZWxkID0gdG9rZW4gPT4ge1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJTXCI6XG4gICAgICAgIHJldHVybiBcIm1pbGxpc2Vjb25kXCI7XG5cbiAgICAgIGNhc2UgXCJzXCI6XG4gICAgICAgIHJldHVybiBcInNlY29uZFwiO1xuXG4gICAgICBjYXNlIFwibVwiOlxuICAgICAgICByZXR1cm4gXCJtaW51dGVcIjtcblxuICAgICAgY2FzZSBcImhcIjpcbiAgICAgIGNhc2UgXCJIXCI6XG4gICAgICAgIHJldHVybiBcImhvdXJcIjtcblxuICAgICAgY2FzZSBcImRcIjpcbiAgICAgICAgcmV0dXJuIFwiZGF5XCI7XG5cbiAgICAgIGNhc2UgXCJvXCI6XG4gICAgICAgIHJldHVybiBcIm9yZGluYWxcIjtcblxuICAgICAgY2FzZSBcIkxcIjpcbiAgICAgIGNhc2UgXCJNXCI6XG4gICAgICAgIHJldHVybiBcIm1vbnRoXCI7XG5cbiAgICAgIGNhc2UgXCJ5XCI6XG4gICAgICAgIHJldHVybiBcInllYXJcIjtcblxuICAgICAgY2FzZSBcIkVcIjpcbiAgICAgIGNhc2UgXCJjXCI6XG4gICAgICAgIHJldHVybiBcIndlZWtkYXlcIjtcblxuICAgICAgY2FzZSBcIldcIjpcbiAgICAgICAgcmV0dXJuIFwid2Vla051bWJlclwiO1xuXG4gICAgICBjYXNlIFwia1wiOlxuICAgICAgICByZXR1cm4gXCJ3ZWVrWWVhclwiO1xuXG4gICAgICBjYXNlIFwicVwiOlxuICAgICAgICByZXR1cm4gXCJxdWFydGVyXCI7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfTtcblxuICBsZXQgem9uZTtcblxuICBpZiAoIWlzVW5kZWZpbmVkKG1hdGNoZXMuWikpIHtcbiAgICB6b25lID0gbmV3IEZpeGVkT2Zmc2V0Wm9uZShtYXRjaGVzLlopO1xuICB9IGVsc2UgaWYgKCFpc1VuZGVmaW5lZChtYXRjaGVzLnopKSB7XG4gICAgem9uZSA9IElBTkFab25lLmNyZWF0ZShtYXRjaGVzLnopO1xuICB9IGVsc2Uge1xuICAgIHpvbmUgPSBudWxsO1xuICB9XG5cbiAgaWYgKCFpc1VuZGVmaW5lZChtYXRjaGVzLnEpKSB7XG4gICAgbWF0Y2hlcy5NID0gKG1hdGNoZXMucSAtIDEpICogMyArIDE7XG4gIH1cblxuICBpZiAoIWlzVW5kZWZpbmVkKG1hdGNoZXMuaCkpIHtcbiAgICBpZiAobWF0Y2hlcy5oIDwgMTIgJiYgbWF0Y2hlcy5hID09PSAxKSB7XG4gICAgICBtYXRjaGVzLmggKz0gMTI7XG4gICAgfSBlbHNlIGlmIChtYXRjaGVzLmggPT09IDEyICYmIG1hdGNoZXMuYSA9PT0gMCkge1xuICAgICAgbWF0Y2hlcy5oID0gMDtcbiAgICB9XG4gIH1cblxuICBpZiAobWF0Y2hlcy5HID09PSAwICYmIG1hdGNoZXMueSkge1xuICAgIG1hdGNoZXMueSA9IC1tYXRjaGVzLnk7XG4gIH1cblxuICBpZiAoIWlzVW5kZWZpbmVkKG1hdGNoZXMudSkpIHtcbiAgICBtYXRjaGVzLlMgPSBwYXJzZU1pbGxpcyhtYXRjaGVzLnUpO1xuICB9XG5cbiAgY29uc3QgdmFscyA9IE9iamVjdC5rZXlzKG1hdGNoZXMpLnJlZHVjZSgociwgaykgPT4ge1xuICAgIGNvbnN0IGYgPSB0b0ZpZWxkKGspO1xuXG4gICAgaWYgKGYpIHtcbiAgICAgIHJbZl0gPSBtYXRjaGVzW2tdO1xuICAgIH1cblxuICAgIHJldHVybiByO1xuICB9LCB7fSk7XG4gIHJldHVybiBbdmFscywgem9uZV07XG59XG5cbmxldCBkdW1teURhdGVUaW1lQ2FjaGUgPSBudWxsO1xuXG5mdW5jdGlvbiBnZXREdW1teURhdGVUaW1lKCkge1xuICBpZiAoIWR1bW15RGF0ZVRpbWVDYWNoZSkge1xuICAgIGR1bW15RGF0ZVRpbWVDYWNoZSA9IERhdGVUaW1lLmZyb21NaWxsaXMoMTU1NTU1NTU1NTU1NSk7XG4gIH1cblxuICByZXR1cm4gZHVtbXlEYXRlVGltZUNhY2hlO1xufVxuXG5mdW5jdGlvbiBtYXliZUV4cGFuZE1hY3JvVG9rZW4odG9rZW4sIGxvY2FsZSkge1xuICBpZiAodG9rZW4ubGl0ZXJhbCkge1xuICAgIHJldHVybiB0b2tlbjtcbiAgfVxuXG4gIGNvbnN0IGZvcm1hdE9wdHMgPSBGb3JtYXR0ZXIubWFjcm9Ub2tlblRvRm9ybWF0T3B0cyh0b2tlbi52YWwpO1xuXG4gIGlmICghZm9ybWF0T3B0cykge1xuICAgIHJldHVybiB0b2tlbjtcbiAgfVxuXG4gIGNvbnN0IGZvcm1hdHRlciA9IEZvcm1hdHRlci5jcmVhdGUobG9jYWxlLCBmb3JtYXRPcHRzKTtcbiAgY29uc3QgcGFydHMgPSBmb3JtYXR0ZXIuZm9ybWF0RGF0ZVRpbWVQYXJ0cyhnZXREdW1teURhdGVUaW1lKCkpO1xuICBjb25zdCB0b2tlbnMgPSBwYXJ0cy5tYXAocCA9PiB0b2tlbkZvclBhcnQocCwgbG9jYWxlLCBmb3JtYXRPcHRzKSk7XG5cbiAgaWYgKHRva2Vucy5pbmNsdWRlcyh1bmRlZmluZWQpKSB7XG4gICAgcmV0dXJuIHRva2VuO1xuICB9XG5cbiAgcmV0dXJuIHRva2Vucztcbn1cblxuZnVuY3Rpb24gZXhwYW5kTWFjcm9Ub2tlbnModG9rZW5zLCBsb2NhbGUpIHtcbiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQoLi4udG9rZW5zLm1hcCh0ID0+IG1heWJlRXhwYW5kTWFjcm9Ub2tlbih0LCBsb2NhbGUpKSk7XG59XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cblxuXG5mdW5jdGlvbiBleHBsYWluRnJvbVRva2Vucyhsb2NhbGUsIGlucHV0LCBmb3JtYXQpIHtcbiAgY29uc3QgdG9rZW5zID0gZXhwYW5kTWFjcm9Ub2tlbnMoRm9ybWF0dGVyLnBhcnNlRm9ybWF0KGZvcm1hdCksIGxvY2FsZSksXG4gICAgICAgIHVuaXRzID0gdG9rZW5zLm1hcCh0ID0+IHVuaXRGb3JUb2tlbih0LCBsb2NhbGUpKSxcbiAgICAgICAgZGlzcXVhbGlmeWluZ1VuaXQgPSB1bml0cy5maW5kKHQgPT4gdC5pbnZhbGlkUmVhc29uKTtcblxuICBpZiAoZGlzcXVhbGlmeWluZ1VuaXQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW5wdXQsXG4gICAgICB0b2tlbnMsXG4gICAgICBpbnZhbGlkUmVhc29uOiBkaXNxdWFsaWZ5aW5nVW5pdC5pbnZhbGlkUmVhc29uXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBbcmVnZXhTdHJpbmcsIGhhbmRsZXJzXSA9IGJ1aWxkUmVnZXgodW5pdHMpLFxuICAgICAgICAgIHJlZ2V4ID0gUmVnRXhwKHJlZ2V4U3RyaW5nLCBcImlcIiksXG4gICAgICAgICAgW3Jhd01hdGNoZXMsIG1hdGNoZXNdID0gbWF0Y2goaW5wdXQsIHJlZ2V4LCBoYW5kbGVycyksXG4gICAgICAgICAgW3Jlc3VsdCwgem9uZV0gPSBtYXRjaGVzID8gZGF0ZVRpbWVGcm9tTWF0Y2hlcyhtYXRjaGVzKSA6IFtudWxsLCBudWxsXTtcblxuICAgIGlmIChoYXNPd25Qcm9wZXJ0eShtYXRjaGVzLCBcImFcIikgJiYgaGFzT3duUHJvcGVydHkobWF0Y2hlcywgXCJIXCIpKSB7XG4gICAgICB0aHJvdyBuZXcgQ29uZmxpY3RpbmdTcGVjaWZpY2F0aW9uRXJyb3IoXCJDYW4ndCBpbmNsdWRlIG1lcmlkaWVtIHdoZW4gc3BlY2lmeWluZyAyNC1ob3VyIGZvcm1hdFwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaW5wdXQsXG4gICAgICB0b2tlbnMsXG4gICAgICByZWdleCxcbiAgICAgIHJhd01hdGNoZXMsXG4gICAgICBtYXRjaGVzLFxuICAgICAgcmVzdWx0LFxuICAgICAgem9uZVxuICAgIH07XG4gIH1cbn1cbmZ1bmN0aW9uIHBhcnNlRnJvbVRva2Vucyhsb2NhbGUsIGlucHV0LCBmb3JtYXQpIHtcbiAgY29uc3Qge1xuICAgIHJlc3VsdCxcbiAgICB6b25lLFxuICAgIGludmFsaWRSZWFzb25cbiAgfSA9IGV4cGxhaW5Gcm9tVG9rZW5zKGxvY2FsZSwgaW5wdXQsIGZvcm1hdCk7XG4gIHJldHVybiBbcmVzdWx0LCB6b25lLCBpbnZhbGlkUmVhc29uXTtcbn1cblxuY29uc3Qgbm9uTGVhcExhZGRlciA9IFswLCAzMSwgNTksIDkwLCAxMjAsIDE1MSwgMTgxLCAyMTIsIDI0MywgMjczLCAzMDQsIDMzNF0sXG4gICAgICBsZWFwTGFkZGVyID0gWzAsIDMxLCA2MCwgOTEsIDEyMSwgMTUyLCAxODIsIDIxMywgMjQ0LCAyNzQsIDMwNSwgMzM1XTtcblxuZnVuY3Rpb24gdW5pdE91dE9mUmFuZ2UodW5pdCwgdmFsdWUpIHtcbiAgcmV0dXJuIG5ldyBJbnZhbGlkKFwidW5pdCBvdXQgb2YgcmFuZ2VcIiwgYHlvdSBzcGVjaWZpZWQgJHt2YWx1ZX0gKG9mIHR5cGUgJHt0eXBlb2YgdmFsdWV9KSBhcyBhICR7dW5pdH0sIHdoaWNoIGlzIGludmFsaWRgKTtcbn1cblxuZnVuY3Rpb24gZGF5T2ZXZWVrKHllYXIsIG1vbnRoLCBkYXkpIHtcbiAgY29uc3QganMgPSBuZXcgRGF0ZShEYXRlLlVUQyh5ZWFyLCBtb250aCAtIDEsIGRheSkpLmdldFVUQ0RheSgpO1xuICByZXR1cm4ganMgPT09IDAgPyA3IDoganM7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVPcmRpbmFsKHllYXIsIG1vbnRoLCBkYXkpIHtcbiAgcmV0dXJuIGRheSArIChpc0xlYXBZZWFyKHllYXIpID8gbGVhcExhZGRlciA6IG5vbkxlYXBMYWRkZXIpW21vbnRoIC0gMV07XG59XG5cbmZ1bmN0aW9uIHVuY29tcHV0ZU9yZGluYWwoeWVhciwgb3JkaW5hbCkge1xuICBjb25zdCB0YWJsZSA9IGlzTGVhcFllYXIoeWVhcikgPyBsZWFwTGFkZGVyIDogbm9uTGVhcExhZGRlcixcbiAgICAgICAgbW9udGgwID0gdGFibGUuZmluZEluZGV4KGkgPT4gaSA8IG9yZGluYWwpLFxuICAgICAgICBkYXkgPSBvcmRpbmFsIC0gdGFibGVbbW9udGgwXTtcbiAgcmV0dXJuIHtcbiAgICBtb250aDogbW9udGgwICsgMSxcbiAgICBkYXlcbiAgfTtcbn1cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG5cbmZ1bmN0aW9uIGdyZWdvcmlhblRvV2VlayhncmVnT2JqKSB7XG4gIGNvbnN0IHtcbiAgICB5ZWFyLFxuICAgIG1vbnRoLFxuICAgIGRheVxuICB9ID0gZ3JlZ09iaixcbiAgICAgICAgb3JkaW5hbCA9IGNvbXB1dGVPcmRpbmFsKHllYXIsIG1vbnRoLCBkYXkpLFxuICAgICAgICB3ZWVrZGF5ID0gZGF5T2ZXZWVrKHllYXIsIG1vbnRoLCBkYXkpO1xuICBsZXQgd2Vla051bWJlciA9IE1hdGguZmxvb3IoKG9yZGluYWwgLSB3ZWVrZGF5ICsgMTApIC8gNyksXG4gICAgICB3ZWVrWWVhcjtcblxuICBpZiAod2Vla051bWJlciA8IDEpIHtcbiAgICB3ZWVrWWVhciA9IHllYXIgLSAxO1xuICAgIHdlZWtOdW1iZXIgPSB3ZWVrc0luV2Vla1llYXIod2Vla1llYXIpO1xuICB9IGVsc2UgaWYgKHdlZWtOdW1iZXIgPiB3ZWVrc0luV2Vla1llYXIoeWVhcikpIHtcbiAgICB3ZWVrWWVhciA9IHllYXIgKyAxO1xuICAgIHdlZWtOdW1iZXIgPSAxO1xuICB9IGVsc2Uge1xuICAgIHdlZWtZZWFyID0geWVhcjtcbiAgfVxuXG4gIHJldHVybiBPYmplY3QuYXNzaWduKHtcbiAgICB3ZWVrWWVhcixcbiAgICB3ZWVrTnVtYmVyLFxuICAgIHdlZWtkYXlcbiAgfSwgdGltZU9iamVjdChncmVnT2JqKSk7XG59XG5mdW5jdGlvbiB3ZWVrVG9HcmVnb3JpYW4od2Vla0RhdGEpIHtcbiAgY29uc3Qge1xuICAgIHdlZWtZZWFyLFxuICAgIHdlZWtOdW1iZXIsXG4gICAgd2Vla2RheVxuICB9ID0gd2Vla0RhdGEsXG4gICAgICAgIHdlZWtkYXlPZkphbjQgPSBkYXlPZldlZWsod2Vla1llYXIsIDEsIDQpLFxuICAgICAgICB5ZWFySW5EYXlzID0gZGF5c0luWWVhcih3ZWVrWWVhcik7XG4gIGxldCBvcmRpbmFsID0gd2Vla051bWJlciAqIDcgKyB3ZWVrZGF5IC0gd2Vla2RheU9mSmFuNCAtIDMsXG4gICAgICB5ZWFyO1xuXG4gIGlmIChvcmRpbmFsIDwgMSkge1xuICAgIHllYXIgPSB3ZWVrWWVhciAtIDE7XG4gICAgb3JkaW5hbCArPSBkYXlzSW5ZZWFyKHllYXIpO1xuICB9IGVsc2UgaWYgKG9yZGluYWwgPiB5ZWFySW5EYXlzKSB7XG4gICAgeWVhciA9IHdlZWtZZWFyICsgMTtcbiAgICBvcmRpbmFsIC09IGRheXNJblllYXIod2Vla1llYXIpO1xuICB9IGVsc2Uge1xuICAgIHllYXIgPSB3ZWVrWWVhcjtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICBtb250aCxcbiAgICBkYXlcbiAgfSA9IHVuY29tcHV0ZU9yZGluYWwoeWVhciwgb3JkaW5hbCk7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKHtcbiAgICB5ZWFyLFxuICAgIG1vbnRoLFxuICAgIGRheVxuICB9LCB0aW1lT2JqZWN0KHdlZWtEYXRhKSk7XG59XG5mdW5jdGlvbiBncmVnb3JpYW5Ub09yZGluYWwoZ3JlZ0RhdGEpIHtcbiAgY29uc3Qge1xuICAgIHllYXIsXG4gICAgbW9udGgsXG4gICAgZGF5XG4gIH0gPSBncmVnRGF0YSxcbiAgICAgICAgb3JkaW5hbCA9IGNvbXB1dGVPcmRpbmFsKHllYXIsIG1vbnRoLCBkYXkpO1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7XG4gICAgeWVhcixcbiAgICBvcmRpbmFsXG4gIH0sIHRpbWVPYmplY3QoZ3JlZ0RhdGEpKTtcbn1cbmZ1bmN0aW9uIG9yZGluYWxUb0dyZWdvcmlhbihvcmRpbmFsRGF0YSkge1xuICBjb25zdCB7XG4gICAgeWVhcixcbiAgICBvcmRpbmFsXG4gIH0gPSBvcmRpbmFsRGF0YSxcbiAgICAgICAge1xuICAgIG1vbnRoLFxuICAgIGRheVxuICB9ID0gdW5jb21wdXRlT3JkaW5hbCh5ZWFyLCBvcmRpbmFsKTtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe1xuICAgIHllYXIsXG4gICAgbW9udGgsXG4gICAgZGF5XG4gIH0sIHRpbWVPYmplY3Qob3JkaW5hbERhdGEpKTtcbn1cbmZ1bmN0aW9uIGhhc0ludmFsaWRXZWVrRGF0YShvYmopIHtcbiAgY29uc3QgdmFsaWRZZWFyID0gaXNJbnRlZ2VyKG9iai53ZWVrWWVhciksXG4gICAgICAgIHZhbGlkV2VlayA9IGludGVnZXJCZXR3ZWVuKG9iai53ZWVrTnVtYmVyLCAxLCB3ZWVrc0luV2Vla1llYXIob2JqLndlZWtZZWFyKSksXG4gICAgICAgIHZhbGlkV2Vla2RheSA9IGludGVnZXJCZXR3ZWVuKG9iai53ZWVrZGF5LCAxLCA3KTtcblxuICBpZiAoIXZhbGlkWWVhcikge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcIndlZWtZZWFyXCIsIG9iai53ZWVrWWVhcik7XG4gIH0gZWxzZSBpZiAoIXZhbGlkV2Vlaykge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcIndlZWtcIiwgb2JqLndlZWspO1xuICB9IGVsc2UgaWYgKCF2YWxpZFdlZWtkYXkpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJ3ZWVrZGF5XCIsIG9iai53ZWVrZGF5KTtcbiAgfSBlbHNlIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGhhc0ludmFsaWRPcmRpbmFsRGF0YShvYmopIHtcbiAgY29uc3QgdmFsaWRZZWFyID0gaXNJbnRlZ2VyKG9iai55ZWFyKSxcbiAgICAgICAgdmFsaWRPcmRpbmFsID0gaW50ZWdlckJldHdlZW4ob2JqLm9yZGluYWwsIDEsIGRheXNJblllYXIob2JqLnllYXIpKTtcblxuICBpZiAoIXZhbGlkWWVhcikge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcInllYXJcIiwgb2JqLnllYXIpO1xuICB9IGVsc2UgaWYgKCF2YWxpZE9yZGluYWwpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJvcmRpbmFsXCIsIG9iai5vcmRpbmFsKTtcbiAgfSBlbHNlIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGhhc0ludmFsaWRHcmVnb3JpYW5EYXRhKG9iaikge1xuICBjb25zdCB2YWxpZFllYXIgPSBpc0ludGVnZXIob2JqLnllYXIpLFxuICAgICAgICB2YWxpZE1vbnRoID0gaW50ZWdlckJldHdlZW4ob2JqLm1vbnRoLCAxLCAxMiksXG4gICAgICAgIHZhbGlkRGF5ID0gaW50ZWdlckJldHdlZW4ob2JqLmRheSwgMSwgZGF5c0luTW9udGgob2JqLnllYXIsIG9iai5tb250aCkpO1xuXG4gIGlmICghdmFsaWRZZWFyKSB7XG4gICAgcmV0dXJuIHVuaXRPdXRPZlJhbmdlKFwieWVhclwiLCBvYmoueWVhcik7XG4gIH0gZWxzZSBpZiAoIXZhbGlkTW9udGgpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJtb250aFwiLCBvYmoubW9udGgpO1xuICB9IGVsc2UgaWYgKCF2YWxpZERheSkge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcImRheVwiLCBvYmouZGF5KTtcbiAgfSBlbHNlIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGhhc0ludmFsaWRUaW1lRGF0YShvYmopIHtcbiAgY29uc3Qge1xuICAgIGhvdXIsXG4gICAgbWludXRlLFxuICAgIHNlY29uZCxcbiAgICBtaWxsaXNlY29uZFxuICB9ID0gb2JqO1xuICBjb25zdCB2YWxpZEhvdXIgPSBpbnRlZ2VyQmV0d2Vlbihob3VyLCAwLCAyMykgfHwgaG91ciA9PT0gMjQgJiYgbWludXRlID09PSAwICYmIHNlY29uZCA9PT0gMCAmJiBtaWxsaXNlY29uZCA9PT0gMCxcbiAgICAgICAgdmFsaWRNaW51dGUgPSBpbnRlZ2VyQmV0d2VlbihtaW51dGUsIDAsIDU5KSxcbiAgICAgICAgdmFsaWRTZWNvbmQgPSBpbnRlZ2VyQmV0d2VlbihzZWNvbmQsIDAsIDU5KSxcbiAgICAgICAgdmFsaWRNaWxsaXNlY29uZCA9IGludGVnZXJCZXR3ZWVuKG1pbGxpc2Vjb25kLCAwLCA5OTkpO1xuXG4gIGlmICghdmFsaWRIb3VyKSB7XG4gICAgcmV0dXJuIHVuaXRPdXRPZlJhbmdlKFwiaG91clwiLCBob3VyKTtcbiAgfSBlbHNlIGlmICghdmFsaWRNaW51dGUpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJtaW51dGVcIiwgbWludXRlKTtcbiAgfSBlbHNlIGlmICghdmFsaWRTZWNvbmQpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJzZWNvbmRcIiwgc2Vjb25kKTtcbiAgfSBlbHNlIGlmICghdmFsaWRNaWxsaXNlY29uZCkge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcIm1pbGxpc2Vjb25kXCIsIG1pbGxpc2Vjb25kKTtcbiAgfSBlbHNlIHJldHVybiBmYWxzZTtcbn1cblxuY29uc3QgSU5WQUxJRCQyID0gXCJJbnZhbGlkIERhdGVUaW1lXCI7XG5jb25zdCBNQVhfREFURSA9IDguNjRlMTU7XG5cbmZ1bmN0aW9uIHVuc3VwcG9ydGVkWm9uZSh6b25lKSB7XG4gIHJldHVybiBuZXcgSW52YWxpZChcInVuc3VwcG9ydGVkIHpvbmVcIiwgYHRoZSB6b25lIFwiJHt6b25lLm5hbWV9XCIgaXMgbm90IHN1cHBvcnRlZGApO1xufSAvLyB3ZSBjYWNoZSB3ZWVrIGRhdGEgb24gdGhlIERUIG9iamVjdCBhbmQgdGhpcyBpbnRlcm1lZGlhdGVzIHRoZSBjYWNoZVxuXG5cbmZ1bmN0aW9uIHBvc3NpYmx5Q2FjaGVkV2Vla0RhdGEoZHQpIHtcbiAgaWYgKGR0LndlZWtEYXRhID09PSBudWxsKSB7XG4gICAgZHQud2Vla0RhdGEgPSBncmVnb3JpYW5Ub1dlZWsoZHQuYyk7XG4gIH1cblxuICByZXR1cm4gZHQud2Vla0RhdGE7XG59IC8vIGNsb25lIHJlYWxseSBtZWFucywgXCJtYWtlIGEgbmV3IG9iamVjdCB3aXRoIHRoZXNlIG1vZGlmaWNhdGlvbnNcIi4gYWxsIFwic2V0dGVyc1wiIHJlYWxseSB1c2UgdGhpc1xuLy8gdG8gY3JlYXRlIGEgbmV3IG9iamVjdCB3aGlsZSBvbmx5IGNoYW5naW5nIHNvbWUgb2YgdGhlIHByb3BlcnRpZXNcblxuXG5mdW5jdGlvbiBjbG9uZSQxKGluc3QsIGFsdHMpIHtcbiAgY29uc3QgY3VycmVudCA9IHtcbiAgICB0czogaW5zdC50cyxcbiAgICB6b25lOiBpbnN0LnpvbmUsXG4gICAgYzogaW5zdC5jLFxuICAgIG86IGluc3QubyxcbiAgICBsb2M6IGluc3QubG9jLFxuICAgIGludmFsaWQ6IGluc3QuaW52YWxpZFxuICB9O1xuICByZXR1cm4gbmV3IERhdGVUaW1lKE9iamVjdC5hc3NpZ24oe30sIGN1cnJlbnQsIGFsdHMsIHtcbiAgICBvbGQ6IGN1cnJlbnRcbiAgfSkpO1xufSAvLyBmaW5kIHRoZSByaWdodCBvZmZzZXQgYSBnaXZlbiBsb2NhbCB0aW1lLiBUaGUgbyBpbnB1dCBpcyBvdXIgZ3Vlc3MsIHdoaWNoIGRldGVybWluZXMgd2hpY2hcbi8vIG9mZnNldCB3ZSdsbCBwaWNrIGluIGFtYmlndW91cyBjYXNlcyAoZS5nLiB0aGVyZSBhcmUgdHdvIDMgQU1zIGIvYyBGYWxsYmFjayBEU1QpXG5cblxuZnVuY3Rpb24gZml4T2Zmc2V0KGxvY2FsVFMsIG8sIHR6KSB7XG4gIC8vIE91ciBVVEMgdGltZSBpcyBqdXN0IGEgZ3Vlc3MgYmVjYXVzZSBvdXIgb2Zmc2V0IGlzIGp1c3QgYSBndWVzc1xuICBsZXQgdXRjR3Vlc3MgPSBsb2NhbFRTIC0gbyAqIDYwICogMTAwMDsgLy8gVGVzdCB3aGV0aGVyIHRoZSB6b25lIG1hdGNoZXMgdGhlIG9mZnNldCBmb3IgdGhpcyB0c1xuXG4gIGNvbnN0IG8yID0gdHoub2Zmc2V0KHV0Y0d1ZXNzKTsgLy8gSWYgc28sIG9mZnNldCBkaWRuJ3QgY2hhbmdlIGFuZCB3ZSdyZSBkb25lXG5cbiAgaWYgKG8gPT09IG8yKSB7XG4gICAgcmV0dXJuIFt1dGNHdWVzcywgb107XG4gIH0gLy8gSWYgbm90LCBjaGFuZ2UgdGhlIHRzIGJ5IHRoZSBkaWZmZXJlbmNlIGluIHRoZSBvZmZzZXRcblxuXG4gIHV0Y0d1ZXNzIC09IChvMiAtIG8pICogNjAgKiAxMDAwOyAvLyBJZiB0aGF0IGdpdmVzIHVzIHRoZSBsb2NhbCB0aW1lIHdlIHdhbnQsIHdlJ3JlIGRvbmVcblxuICBjb25zdCBvMyA9IHR6Lm9mZnNldCh1dGNHdWVzcyk7XG5cbiAgaWYgKG8yID09PSBvMykge1xuICAgIHJldHVybiBbdXRjR3Vlc3MsIG8yXTtcbiAgfSAvLyBJZiBpdCdzIGRpZmZlcmVudCwgd2UncmUgaW4gYSBob2xlIHRpbWUuIFRoZSBvZmZzZXQgaGFzIGNoYW5nZWQsIGJ1dCB0aGUgd2UgZG9uJ3QgYWRqdXN0IHRoZSB0aW1lXG5cblxuICByZXR1cm4gW2xvY2FsVFMgLSBNYXRoLm1pbihvMiwgbzMpICogNjAgKiAxMDAwLCBNYXRoLm1heChvMiwgbzMpXTtcbn0gLy8gY29udmVydCBhbiBlcG9jaCB0aW1lc3RhbXAgaW50byBhIGNhbGVuZGFyIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBvZmZzZXRcblxuXG5mdW5jdGlvbiB0c1RvT2JqKHRzLCBvZmZzZXQpIHtcbiAgdHMgKz0gb2Zmc2V0ICogNjAgKiAxMDAwO1xuICBjb25zdCBkID0gbmV3IERhdGUodHMpO1xuICByZXR1cm4ge1xuICAgIHllYXI6IGQuZ2V0VVRDRnVsbFllYXIoKSxcbiAgICBtb250aDogZC5nZXRVVENNb250aCgpICsgMSxcbiAgICBkYXk6IGQuZ2V0VVRDRGF0ZSgpLFxuICAgIGhvdXI6IGQuZ2V0VVRDSG91cnMoKSxcbiAgICBtaW51dGU6IGQuZ2V0VVRDTWludXRlcygpLFxuICAgIHNlY29uZDogZC5nZXRVVENTZWNvbmRzKCksXG4gICAgbWlsbGlzZWNvbmQ6IGQuZ2V0VVRDTWlsbGlzZWNvbmRzKClcbiAgfTtcbn0gLy8gY29udmVydCBhIGNhbGVuZGFyIG9iamVjdCB0byBhIGVwb2NoIHRpbWVzdGFtcFxuXG5cbmZ1bmN0aW9uIG9ialRvVFMob2JqLCBvZmZzZXQsIHpvbmUpIHtcbiAgcmV0dXJuIGZpeE9mZnNldChvYmpUb0xvY2FsVFMob2JqKSwgb2Zmc2V0LCB6b25lKTtcbn0gLy8gY3JlYXRlIGEgbmV3IERUIGluc3RhbmNlIGJ5IGFkZGluZyBhIGR1cmF0aW9uLCBhZGp1c3RpbmcgZm9yIERTVHNcblxuXG5mdW5jdGlvbiBhZGp1c3RUaW1lKGluc3QsIGR1cikge1xuICBjb25zdCBvUHJlID0gaW5zdC5vLFxuICAgICAgICB5ZWFyID0gaW5zdC5jLnllYXIgKyBNYXRoLnRydW5jKGR1ci55ZWFycyksXG4gICAgICAgIG1vbnRoID0gaW5zdC5jLm1vbnRoICsgTWF0aC50cnVuYyhkdXIubW9udGhzKSArIE1hdGgudHJ1bmMoZHVyLnF1YXJ0ZXJzKSAqIDMsXG4gICAgICAgIGMgPSBPYmplY3QuYXNzaWduKHt9LCBpbnN0LmMsIHtcbiAgICB5ZWFyLFxuICAgIG1vbnRoLFxuICAgIGRheTogTWF0aC5taW4oaW5zdC5jLmRheSwgZGF5c0luTW9udGgoeWVhciwgbW9udGgpKSArIE1hdGgudHJ1bmMoZHVyLmRheXMpICsgTWF0aC50cnVuYyhkdXIud2Vla3MpICogN1xuICB9KSxcbiAgICAgICAgbWlsbGlzVG9BZGQgPSBEdXJhdGlvbi5mcm9tT2JqZWN0KHtcbiAgICB5ZWFyczogZHVyLnllYXJzIC0gTWF0aC50cnVuYyhkdXIueWVhcnMpLFxuICAgIHF1YXJ0ZXJzOiBkdXIucXVhcnRlcnMgLSBNYXRoLnRydW5jKGR1ci5xdWFydGVycyksXG4gICAgbW9udGhzOiBkdXIubW9udGhzIC0gTWF0aC50cnVuYyhkdXIubW9udGhzKSxcbiAgICB3ZWVrczogZHVyLndlZWtzIC0gTWF0aC50cnVuYyhkdXIud2Vla3MpLFxuICAgIGRheXM6IGR1ci5kYXlzIC0gTWF0aC50cnVuYyhkdXIuZGF5cyksXG4gICAgaG91cnM6IGR1ci5ob3VycyxcbiAgICBtaW51dGVzOiBkdXIubWludXRlcyxcbiAgICBzZWNvbmRzOiBkdXIuc2Vjb25kcyxcbiAgICBtaWxsaXNlY29uZHM6IGR1ci5taWxsaXNlY29uZHNcbiAgfSkuYXMoXCJtaWxsaXNlY29uZHNcIiksXG4gICAgICAgIGxvY2FsVFMgPSBvYmpUb0xvY2FsVFMoYyk7XG4gIGxldCBbdHMsIG9dID0gZml4T2Zmc2V0KGxvY2FsVFMsIG9QcmUsIGluc3Quem9uZSk7XG5cbiAgaWYgKG1pbGxpc1RvQWRkICE9PSAwKSB7XG4gICAgdHMgKz0gbWlsbGlzVG9BZGQ7IC8vIHRoYXQgY291bGQgaGF2ZSBjaGFuZ2VkIHRoZSBvZmZzZXQgYnkgZ29pbmcgb3ZlciBhIERTVCwgYnV0IHdlIHdhbnQgdG8ga2VlcCB0aGUgdHMgdGhlIHNhbWVcblxuICAgIG8gPSBpbnN0LnpvbmUub2Zmc2V0KHRzKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdHMsXG4gICAgb1xuICB9O1xufSAvLyBoZWxwZXIgdXNlZnVsIGluIHR1cm5pbmcgdGhlIHJlc3VsdHMgb2YgcGFyc2luZyBpbnRvIHJlYWwgZGF0ZXNcbi8vIGJ5IGhhbmRsaW5nIHRoZSB6b25lIG9wdGlvbnNcblxuXG5mdW5jdGlvbiBwYXJzZURhdGFUb0RhdGVUaW1lKHBhcnNlZCwgcGFyc2VkWm9uZSwgb3B0cywgZm9ybWF0LCB0ZXh0KSB7XG4gIGNvbnN0IHtcbiAgICBzZXRab25lLFxuICAgIHpvbmVcbiAgfSA9IG9wdHM7XG5cbiAgaWYgKHBhcnNlZCAmJiBPYmplY3Qua2V5cyhwYXJzZWQpLmxlbmd0aCAhPT0gMCkge1xuICAgIGNvbnN0IGludGVycHJldGF0aW9uWm9uZSA9IHBhcnNlZFpvbmUgfHwgem9uZSxcbiAgICAgICAgICBpbnN0ID0gRGF0ZVRpbWUuZnJvbU9iamVjdChPYmplY3QuYXNzaWduKHBhcnNlZCwgb3B0cywge1xuICAgICAgem9uZTogaW50ZXJwcmV0YXRpb25ab25lLFxuICAgICAgLy8gc2V0Wm9uZSBpcyBhIHZhbGlkIG9wdGlvbiBpbiB0aGUgY2FsbGluZyBtZXRob2RzLCBidXQgbm90IGluIGZyb21PYmplY3RcbiAgICAgIHNldFpvbmU6IHVuZGVmaW5lZFxuICAgIH0pKTtcbiAgICByZXR1cm4gc2V0Wm9uZSA/IGluc3QgOiBpbnN0LnNldFpvbmUoem9uZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQobmV3IEludmFsaWQoXCJ1bnBhcnNhYmxlXCIsIGB0aGUgaW5wdXQgXCIke3RleHR9XCIgY2FuJ3QgYmUgcGFyc2VkIGFzICR7Zm9ybWF0fWApKTtcbiAgfVxufSAvLyBpZiB5b3Ugd2FudCB0byBvdXRwdXQgYSB0ZWNobmljYWwgZm9ybWF0IChlLmcuIFJGQyAyODIyKSwgdGhpcyBoZWxwZXJcbi8vIGhlbHBzIGhhbmRsZSB0aGUgZGV0YWlsc1xuXG5cbmZ1bmN0aW9uIHRvVGVjaEZvcm1hdChkdCwgZm9ybWF0LCBhbGxvd1ogPSB0cnVlKSB7XG4gIHJldHVybiBkdC5pc1ZhbGlkID8gRm9ybWF0dGVyLmNyZWF0ZShMb2NhbGUuY3JlYXRlKFwiZW4tVVNcIiksIHtcbiAgICBhbGxvd1osXG4gICAgZm9yY2VTaW1wbGU6IHRydWVcbiAgfSkuZm9ybWF0RGF0ZVRpbWVGcm9tU3RyaW5nKGR0LCBmb3JtYXQpIDogbnVsbDtcbn0gLy8gdGVjaG5pY2FsIHRpbWUgZm9ybWF0cyAoZS5nLiB0aGUgdGltZSBwYXJ0IG9mIElTTyA4NjAxKSwgdGFrZSBzb21lIG9wdGlvbnNcbi8vIGFuZCB0aGlzIGNvbW1vbml6ZXMgdGhlaXIgaGFuZGxpbmdcblxuXG5mdW5jdGlvbiB0b1RlY2hUaW1lRm9ybWF0KGR0LCB7XG4gIHN1cHByZXNzU2Vjb25kcyA9IGZhbHNlLFxuICBzdXBwcmVzc01pbGxpc2Vjb25kcyA9IGZhbHNlLFxuICBpbmNsdWRlT2Zmc2V0LFxuICBpbmNsdWRlUHJlZml4ID0gZmFsc2UsXG4gIGluY2x1ZGVab25lID0gZmFsc2UsXG4gIHNwYWNlWm9uZSA9IGZhbHNlLFxuICBmb3JtYXQgPSBcImV4dGVuZGVkXCJcbn0pIHtcbiAgbGV0IGZtdCA9IGZvcm1hdCA9PT0gXCJiYXNpY1wiID8gXCJISG1tXCIgOiBcIkhIOm1tXCI7XG5cbiAgaWYgKCFzdXBwcmVzc1NlY29uZHMgfHwgZHQuc2Vjb25kICE9PSAwIHx8IGR0Lm1pbGxpc2Vjb25kICE9PSAwKSB7XG4gICAgZm10ICs9IGZvcm1hdCA9PT0gXCJiYXNpY1wiID8gXCJzc1wiIDogXCI6c3NcIjtcblxuICAgIGlmICghc3VwcHJlc3NNaWxsaXNlY29uZHMgfHwgZHQubWlsbGlzZWNvbmQgIT09IDApIHtcbiAgICAgIGZtdCArPSBcIi5TU1NcIjtcbiAgICB9XG4gIH1cblxuICBpZiAoKGluY2x1ZGVab25lIHx8IGluY2x1ZGVPZmZzZXQpICYmIHNwYWNlWm9uZSkge1xuICAgIGZtdCArPSBcIiBcIjtcbiAgfVxuXG4gIGlmIChpbmNsdWRlWm9uZSkge1xuICAgIGZtdCArPSBcInpcIjtcbiAgfSBlbHNlIGlmIChpbmNsdWRlT2Zmc2V0KSB7XG4gICAgZm10ICs9IGZvcm1hdCA9PT0gXCJiYXNpY1wiID8gXCJaWlpcIiA6IFwiWlpcIjtcbiAgfVxuXG4gIGxldCBzdHIgPSB0b1RlY2hGb3JtYXQoZHQsIGZtdCk7XG5cbiAgaWYgKGluY2x1ZGVQcmVmaXgpIHtcbiAgICBzdHIgPSBcIlRcIiArIHN0cjtcbiAgfVxuXG4gIHJldHVybiBzdHI7XG59IC8vIGRlZmF1bHRzIGZvciB1bnNwZWNpZmllZCB1bml0cyBpbiB0aGUgc3VwcG9ydGVkIGNhbGVuZGFyc1xuXG5cbmNvbnN0IGRlZmF1bHRVbml0VmFsdWVzID0ge1xuICBtb250aDogMSxcbiAgZGF5OiAxLFxuICBob3VyOiAwLFxuICBtaW51dGU6IDAsXG4gIHNlY29uZDogMCxcbiAgbWlsbGlzZWNvbmQ6IDBcbn0sXG4gICAgICBkZWZhdWx0V2Vla1VuaXRWYWx1ZXMgPSB7XG4gIHdlZWtOdW1iZXI6IDEsXG4gIHdlZWtkYXk6IDEsXG4gIGhvdXI6IDAsXG4gIG1pbnV0ZTogMCxcbiAgc2Vjb25kOiAwLFxuICBtaWxsaXNlY29uZDogMFxufSxcbiAgICAgIGRlZmF1bHRPcmRpbmFsVW5pdFZhbHVlcyA9IHtcbiAgb3JkaW5hbDogMSxcbiAgaG91cjogMCxcbiAgbWludXRlOiAwLFxuICBzZWNvbmQ6IDAsXG4gIG1pbGxpc2Vjb25kOiAwXG59OyAvLyBVbml0cyBpbiB0aGUgc3VwcG9ydGVkIGNhbGVuZGFycywgc29ydGVkIGJ5IGJpZ25lc3NcblxuY29uc3Qgb3JkZXJlZFVuaXRzJDEgPSBbXCJ5ZWFyXCIsIFwibW9udGhcIiwgXCJkYXlcIiwgXCJob3VyXCIsIFwibWludXRlXCIsIFwic2Vjb25kXCIsIFwibWlsbGlzZWNvbmRcIl0sXG4gICAgICBvcmRlcmVkV2Vla1VuaXRzID0gW1wid2Vla1llYXJcIiwgXCJ3ZWVrTnVtYmVyXCIsIFwid2Vla2RheVwiLCBcImhvdXJcIiwgXCJtaW51dGVcIiwgXCJzZWNvbmRcIiwgXCJtaWxsaXNlY29uZFwiXSxcbiAgICAgIG9yZGVyZWRPcmRpbmFsVW5pdHMgPSBbXCJ5ZWFyXCIsIFwib3JkaW5hbFwiLCBcImhvdXJcIiwgXCJtaW51dGVcIiwgXCJzZWNvbmRcIiwgXCJtaWxsaXNlY29uZFwiXTsgLy8gc3RhbmRhcmRpemUgY2FzZSBhbmQgcGx1cmFsaXR5IGluIHVuaXRzXG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVVuaXQodW5pdCkge1xuICBjb25zdCBub3JtYWxpemVkID0ge1xuICAgIHllYXI6IFwieWVhclwiLFxuICAgIHllYXJzOiBcInllYXJcIixcbiAgICBtb250aDogXCJtb250aFwiLFxuICAgIG1vbnRoczogXCJtb250aFwiLFxuICAgIGRheTogXCJkYXlcIixcbiAgICBkYXlzOiBcImRheVwiLFxuICAgIGhvdXI6IFwiaG91clwiLFxuICAgIGhvdXJzOiBcImhvdXJcIixcbiAgICBtaW51dGU6IFwibWludXRlXCIsXG4gICAgbWludXRlczogXCJtaW51dGVcIixcbiAgICBxdWFydGVyOiBcInF1YXJ0ZXJcIixcbiAgICBxdWFydGVyczogXCJxdWFydGVyXCIsXG4gICAgc2Vjb25kOiBcInNlY29uZFwiLFxuICAgIHNlY29uZHM6IFwic2Vjb25kXCIsXG4gICAgbWlsbGlzZWNvbmQ6IFwibWlsbGlzZWNvbmRcIixcbiAgICBtaWxsaXNlY29uZHM6IFwibWlsbGlzZWNvbmRcIixcbiAgICB3ZWVrZGF5OiBcIndlZWtkYXlcIixcbiAgICB3ZWVrZGF5czogXCJ3ZWVrZGF5XCIsXG4gICAgd2Vla251bWJlcjogXCJ3ZWVrTnVtYmVyXCIsXG4gICAgd2Vla3NudW1iZXI6IFwid2Vla051bWJlclwiLFxuICAgIHdlZWtudW1iZXJzOiBcIndlZWtOdW1iZXJcIixcbiAgICB3ZWVreWVhcjogXCJ3ZWVrWWVhclwiLFxuICAgIHdlZWt5ZWFyczogXCJ3ZWVrWWVhclwiLFxuICAgIG9yZGluYWw6IFwib3JkaW5hbFwiXG4gIH1bdW5pdC50b0xvd2VyQ2FzZSgpXTtcbiAgaWYgKCFub3JtYWxpemVkKSB0aHJvdyBuZXcgSW52YWxpZFVuaXRFcnJvcih1bml0KTtcbiAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG59IC8vIHRoaXMgaXMgYSBkdW1iZWQgZG93biB2ZXJzaW9uIG9mIGZyb21PYmplY3QoKSB0aGF0IHJ1bnMgYWJvdXQgNjAlIGZhc3RlclxuLy8gYnV0IGRvZXNuJ3QgZG8gYW55IHZhbGlkYXRpb24sIG1ha2VzIGEgYnVuY2ggb2YgYXNzdW1wdGlvbnMgYWJvdXQgd2hhdCB1bml0c1xuLy8gYXJlIHByZXNlbnQsIGFuZCBzbyBvbi5cblxuXG5mdW5jdGlvbiBxdWlja0RUKG9iaiwgem9uZSkge1xuICAvLyBhc3N1bWUgd2UgaGF2ZSB0aGUgaGlnaGVyLW9yZGVyIHVuaXRzXG4gIGZvciAoY29uc3QgdSBvZiBvcmRlcmVkVW5pdHMkMSkge1xuICAgIGlmIChpc1VuZGVmaW5lZChvYmpbdV0pKSB7XG4gICAgICBvYmpbdV0gPSBkZWZhdWx0VW5pdFZhbHVlc1t1XTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBpbnZhbGlkID0gaGFzSW52YWxpZEdyZWdvcmlhbkRhdGEob2JqKSB8fCBoYXNJbnZhbGlkVGltZURhdGEob2JqKTtcblxuICBpZiAoaW52YWxpZCkge1xuICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKGludmFsaWQpO1xuICB9XG5cbiAgY29uc3QgdHNOb3cgPSBTZXR0aW5ncy5ub3coKSxcbiAgICAgICAgb2Zmc2V0UHJvdmlzID0gem9uZS5vZmZzZXQodHNOb3cpLFxuICAgICAgICBbdHMsIG9dID0gb2JqVG9UUyhvYmosIG9mZnNldFByb3Zpcywgem9uZSk7XG4gIHJldHVybiBuZXcgRGF0ZVRpbWUoe1xuICAgIHRzLFxuICAgIHpvbmUsXG4gICAgb1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZGlmZlJlbGF0aXZlKHN0YXJ0LCBlbmQsIG9wdHMpIHtcbiAgY29uc3Qgcm91bmQgPSBpc1VuZGVmaW5lZChvcHRzLnJvdW5kKSA/IHRydWUgOiBvcHRzLnJvdW5kLFxuICAgICAgICBmb3JtYXQgPSAoYywgdW5pdCkgPT4ge1xuICAgIGMgPSByb3VuZFRvKGMsIHJvdW5kIHx8IG9wdHMuY2FsZW5kYXJ5ID8gMCA6IDIsIHRydWUpO1xuICAgIGNvbnN0IGZvcm1hdHRlciA9IGVuZC5sb2MuY2xvbmUob3B0cykucmVsRm9ybWF0dGVyKG9wdHMpO1xuICAgIHJldHVybiBmb3JtYXR0ZXIuZm9ybWF0KGMsIHVuaXQpO1xuICB9LFxuICAgICAgICBkaWZmZXIgPSB1bml0ID0+IHtcbiAgICBpZiAob3B0cy5jYWxlbmRhcnkpIHtcbiAgICAgIGlmICghZW5kLmhhc1NhbWUoc3RhcnQsIHVuaXQpKSB7XG4gICAgICAgIHJldHVybiBlbmQuc3RhcnRPZih1bml0KS5kaWZmKHN0YXJ0LnN0YXJ0T2YodW5pdCksIHVuaXQpLmdldCh1bml0KTtcbiAgICAgIH0gZWxzZSByZXR1cm4gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVuZC5kaWZmKHN0YXJ0LCB1bml0KS5nZXQodW5pdCk7XG4gICAgfVxuICB9O1xuXG4gIGlmIChvcHRzLnVuaXQpIHtcbiAgICByZXR1cm4gZm9ybWF0KGRpZmZlcihvcHRzLnVuaXQpLCBvcHRzLnVuaXQpO1xuICB9XG5cbiAgZm9yIChjb25zdCB1bml0IG9mIG9wdHMudW5pdHMpIHtcbiAgICBjb25zdCBjb3VudCA9IGRpZmZlcih1bml0KTtcblxuICAgIGlmIChNYXRoLmFicyhjb3VudCkgPj0gMSkge1xuICAgICAgcmV0dXJuIGZvcm1hdChjb3VudCwgdW5pdCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZvcm1hdCgwLCBvcHRzLnVuaXRzW29wdHMudW5pdHMubGVuZ3RoIC0gMV0pO1xufVxuLyoqXG4gKiBBIERhdGVUaW1lIGlzIGFuIGltbXV0YWJsZSBkYXRhIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgYSBzcGVjaWZpYyBkYXRlIGFuZCB0aW1lIGFuZCBhY2NvbXBhbnlpbmcgbWV0aG9kcy4gSXQgY29udGFpbnMgY2xhc3MgYW5kIGluc3RhbmNlIG1ldGhvZHMgZm9yIGNyZWF0aW5nLCBwYXJzaW5nLCBpbnRlcnJvZ2F0aW5nLCB0cmFuc2Zvcm1pbmcsIGFuZCBmb3JtYXR0aW5nIHRoZW0uXG4gKlxuICogQSBEYXRlVGltZSBjb21wcmlzZXMgb2Y6XG4gKiAqIEEgdGltZXN0YW1wLiBFYWNoIERhdGVUaW1lIGluc3RhbmNlIHJlZmVycyB0byBhIHNwZWNpZmljIG1pbGxpc2Vjb25kIG9mIHRoZSBVbml4IGVwb2NoLlxuICogKiBBIHRpbWUgem9uZS4gRWFjaCBpbnN0YW5jZSBpcyBjb25zaWRlcmVkIGluIHRoZSBjb250ZXh0IG9mIGEgc3BlY2lmaWMgem9uZSAoYnkgZGVmYXVsdCB0aGUgbG9jYWwgc3lzdGVtJ3Mgem9uZSkuXG4gKiAqIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyB0aGF0IGVmZmVjdCBob3cgb3V0cHV0IHN0cmluZ3MgYXJlIGZvcm1hdHRlZCwgc3VjaCBhcyBgbG9jYWxlYCwgYG51bWJlcmluZ1N5c3RlbWAsIGFuZCBgb3V0cHV0Q2FsZW5kYXJgLlxuICpcbiAqIEhlcmUgaXMgYSBicmllZiBvdmVydmlldyBvZiB0aGUgbW9zdCBjb21tb25seSB1c2VkIGZ1bmN0aW9uYWxpdHkgaXQgcHJvdmlkZXM6XG4gKlxuICogKiAqKkNyZWF0aW9uKio6IFRvIGNyZWF0ZSBhIERhdGVUaW1lIGZyb20gaXRzIGNvbXBvbmVudHMsIHVzZSBvbmUgb2YgaXRzIGZhY3RvcnkgY2xhc3MgbWV0aG9kczoge0BsaW5rIGxvY2FsfSwge0BsaW5rIHV0Y30sIGFuZCAobW9zdCBmbGV4aWJseSkge0BsaW5rIGZyb21PYmplY3R9LiBUbyBjcmVhdGUgb25lIGZyb20gYSBzdGFuZGFyZCBzdHJpbmcgZm9ybWF0LCB1c2Uge0BsaW5rIGZyb21JU099LCB7QGxpbmsgZnJvbUhUVFB9LCBhbmQge0BsaW5rIGZyb21SRkMyODIyfS4gVG8gY3JlYXRlIG9uZSBmcm9tIGEgY3VzdG9tIHN0cmluZyBmb3JtYXQsIHVzZSB7QGxpbmsgZnJvbUZvcm1hdH0uIFRvIGNyZWF0ZSBvbmUgZnJvbSBhIG5hdGl2ZSBKUyBkYXRlLCB1c2Uge0BsaW5rIGZyb21KU0RhdGV9LlxuICogKiAqKkdyZWdvcmlhbiBjYWxlbmRhciBhbmQgdGltZSoqOiBUbyBleGFtaW5lIHRoZSBHcmVnb3JpYW4gcHJvcGVydGllcyBvZiBhIERhdGVUaW1lIGluZGl2aWR1YWxseSAoaS5lIGFzIG9wcG9zZWQgdG8gY29sbGVjdGl2ZWx5IHRocm91Z2gge0BsaW5rIHRvT2JqZWN0fSksIHVzZSB0aGUge0BsaW5rIHllYXJ9LCB7QGxpbmsgbW9udGh9LFxuICoge0BsaW5rIGRheX0sIHtAbGluayBob3VyfSwge0BsaW5rIG1pbnV0ZX0sIHtAbGluayBzZWNvbmR9LCB7QGxpbmsgbWlsbGlzZWNvbmR9IGFjY2Vzc29ycy5cbiAqICogKipXZWVrIGNhbGVuZGFyKio6IEZvciBJU08gd2VlayBjYWxlbmRhciBhdHRyaWJ1dGVzLCBzZWUgdGhlIHtAbGluayB3ZWVrWWVhcn0sIHtAbGluayB3ZWVrTnVtYmVyfSwgYW5kIHtAbGluayB3ZWVrZGF5fSBhY2Nlc3NvcnMuXG4gKiAqICoqQ29uZmlndXJhdGlvbioqIFNlZSB0aGUge0BsaW5rIGxvY2FsZX0gYW5kIHtAbGluayBudW1iZXJpbmdTeXN0ZW19IGFjY2Vzc29ycy5cbiAqICogKipUcmFuc2Zvcm1hdGlvbioqOiBUbyB0cmFuc2Zvcm0gdGhlIERhdGVUaW1lIGludG8gb3RoZXIgRGF0ZVRpbWVzLCB1c2Uge0BsaW5rIHNldH0sIHtAbGluayByZWNvbmZpZ3VyZX0sIHtAbGluayBzZXRab25lfSwge0BsaW5rIHNldExvY2FsZX0sIHtAbGluayBwbHVzfSwge0BsaW5rIG1pbnVzfSwge0BsaW5rIGVuZE9mfSwge0BsaW5rIHN0YXJ0T2Z9LCB7QGxpbmsgdG9VVEN9LCBhbmQge0BsaW5rIHRvTG9jYWx9LlxuICogKiAqKk91dHB1dCoqOiBUbyBjb252ZXJ0IHRoZSBEYXRlVGltZSB0byBvdGhlciByZXByZXNlbnRhdGlvbnMsIHVzZSB0aGUge0BsaW5rIHRvUmVsYXRpdmV9LCB7QGxpbmsgdG9SZWxhdGl2ZUNhbGVuZGFyfSwge0BsaW5rIHRvSlNPTn0sIHtAbGluayB0b0lTT30sIHtAbGluayB0b0hUVFB9LCB7QGxpbmsgdG9PYmplY3R9LCB7QGxpbmsgdG9SRkMyODIyfSwge0BsaW5rIHRvU3RyaW5nfSwge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSwge0BsaW5rIHRvRm9ybWF0fSwge0BsaW5rIHRvTWlsbGlzfSBhbmQge0BsaW5rIHRvSlNEYXRlfS5cbiAqXG4gKiBUaGVyZSdzIHBsZW50eSBvdGhlcnMgZG9jdW1lbnRlZCBiZWxvdy4gSW4gYWRkaXRpb24sIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHN1YnRsZXIgdG9waWNzIGxpa2UgaW50ZXJuYXRpb25hbGl6YXRpb24sIHRpbWUgem9uZXMsIGFsdGVybmF0aXZlIGNhbGVuZGFycywgdmFsaWRpdHksIGFuZCBzbyBvbiwgc2VlIHRoZSBleHRlcm5hbCBkb2N1bWVudGF0aW9uLlxuICovXG5cblxuY2xhc3MgRGF0ZVRpbWUge1xuICAvKipcbiAgICogQGFjY2VzcyBwcml2YXRlXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICBjb25zdCB6b25lID0gY29uZmlnLnpvbmUgfHwgU2V0dGluZ3MuZGVmYXVsdFpvbmU7XG4gICAgbGV0IGludmFsaWQgPSBjb25maWcuaW52YWxpZCB8fCAoTnVtYmVyLmlzTmFOKGNvbmZpZy50cykgPyBuZXcgSW52YWxpZChcImludmFsaWQgaW5wdXRcIikgOiBudWxsKSB8fCAoIXpvbmUuaXNWYWxpZCA/IHVuc3VwcG9ydGVkWm9uZSh6b25lKSA6IG51bGwpO1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuXG4gICAgdGhpcy50cyA9IGlzVW5kZWZpbmVkKGNvbmZpZy50cykgPyBTZXR0aW5ncy5ub3coKSA6IGNvbmZpZy50cztcbiAgICBsZXQgYyA9IG51bGwsXG4gICAgICAgIG8gPSBudWxsO1xuXG4gICAgaWYgKCFpbnZhbGlkKSB7XG4gICAgICBjb25zdCB1bmNoYW5nZWQgPSBjb25maWcub2xkICYmIGNvbmZpZy5vbGQudHMgPT09IHRoaXMudHMgJiYgY29uZmlnLm9sZC56b25lLmVxdWFscyh6b25lKTtcblxuICAgICAgaWYgKHVuY2hhbmdlZCkge1xuICAgICAgICBbYywgb10gPSBbY29uZmlnLm9sZC5jLCBjb25maWcub2xkLm9dO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgb3QgPSB6b25lLm9mZnNldCh0aGlzLnRzKTtcbiAgICAgICAgYyA9IHRzVG9PYmoodGhpcy50cywgb3QpO1xuICAgICAgICBpbnZhbGlkID0gTnVtYmVyLmlzTmFOKGMueWVhcikgPyBuZXcgSW52YWxpZChcImludmFsaWQgaW5wdXRcIikgOiBudWxsO1xuICAgICAgICBjID0gaW52YWxpZCA/IG51bGwgOiBjO1xuICAgICAgICBvID0gaW52YWxpZCA/IG51bGwgOiBvdDtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG5cblxuICAgIHRoaXMuX3pvbmUgPSB6b25lO1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuXG4gICAgdGhpcy5sb2MgPSBjb25maWcubG9jIHx8IExvY2FsZS5jcmVhdGUoKTtcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cblxuICAgIHRoaXMuaW52YWxpZCA9IGludmFsaWQ7XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG5cbiAgICB0aGlzLndlZWtEYXRhID0gbnVsbDtcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cblxuICAgIHRoaXMuYyA9IGM7XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG5cbiAgICB0aGlzLm8gPSBvO1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuXG4gICAgdGhpcy5pc0x1eG9uRGF0ZVRpbWUgPSB0cnVlO1xuICB9IC8vIENPTlNUUlVDVFxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmb3IgdGhlIGN1cnJlbnQgaW5zdGFudCwgaW4gdGhlIHN5c3RlbSdzIHRpbWUgem9uZS5cbiAgICpcbiAgICogVXNlIFNldHRpbmdzIHRvIG92ZXJyaWRlIHRoZXNlIGRlZmF1bHQgdmFsdWVzIGlmIG5lZWRlZC5cbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9JU08oKSAvL34+IG5vdyBpbiB0aGUgSVNPIGZvcm1hdFxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG5cblxuICBzdGF0aWMgbm93KCkge1xuICAgIHJldHVybiBuZXcgRGF0ZVRpbWUoe30pO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBsb2NhbCBEYXRlVGltZVxuICAgKiBAcGFyYW0ge251bWJlcn0gW3llYXJdIC0gVGhlIGNhbGVuZGFyIHllYXIuIElmIG9taXR0ZWQgKGFzIGluLCBjYWxsIGBsb2NhbCgpYCB3aXRoIG5vIGFyZ3VtZW50cyksIHRoZSBjdXJyZW50IHRpbWUgd2lsbCBiZSB1c2VkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbW9udGg9MV0gLSBUaGUgbW9udGgsIDEtaW5kZXhlZFxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RheT0xXSAtIFRoZSBkYXkgb2YgdGhlIG1vbnRoLCAxLWluZGV4ZWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtob3VyPTBdIC0gVGhlIGhvdXIgb2YgdGhlIGRheSwgaW4gMjQtaG91ciB0aW1lXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWludXRlPTBdIC0gVGhlIG1pbnV0ZSBvZiB0aGUgaG91ciwgbWVhbmluZyBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDU5XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbc2Vjb25kPTBdIC0gVGhlIHNlY29uZCBvZiB0aGUgbWludXRlLCBtZWFuaW5nIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgNTlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFttaWxsaXNlY29uZD0wXSAtIFRoZSBtaWxsaXNlY29uZCBvZiB0aGUgc2Vjb25kLCBtZWFuaW5nIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgOTk5XG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiBub3dcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNykgICAgICAgICAgICAgICAgICAgICAgICAvL34+IDIwMTctMDEtMDFUMDA6MDA6MDBcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMykgICAgICAgICAgICAgICAgICAgICAvL34+IDIwMTctMDMtMDFUMDA6MDA6MDBcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMywgMTIpICAgICAgICAgICAgICAgICAvL34+IDIwMTctMDMtMTJUMDA6MDA6MDBcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMywgMTIsIDUpICAgICAgICAgICAgICAvL34+IDIwMTctMDMtMTJUMDU6MDA6MDBcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMywgMTIsIDUsIDQ1KSAgICAgICAgICAvL34+IDIwMTctMDMtMTJUMDU6NDU6MDBcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMywgMTIsIDUsIDQ1LCAxMCkgICAgICAvL34+IDIwMTctMDMtMTJUMDU6NDU6MTBcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMywgMTIsIDUsIDQ1LCAxMCwgNzY1KSAvL34+IDIwMTctMDMtMTJUMDU6NDU6MTAuNzY1XG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cblxuXG4gIHN0YXRpYyBsb2NhbCh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQpIHtcbiAgICBpZiAoaXNVbmRlZmluZWQoeWVhcikpIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZVRpbWUoe30pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcXVpY2tEVCh7XG4gICAgICAgIHllYXIsXG4gICAgICAgIG1vbnRoLFxuICAgICAgICBkYXksXG4gICAgICAgIGhvdXIsXG4gICAgICAgIG1pbnV0ZSxcbiAgICAgICAgc2Vjb25kLFxuICAgICAgICBtaWxsaXNlY29uZFxuICAgICAgfSwgU2V0dGluZ3MuZGVmYXVsdFpvbmUpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgaW4gVVRDXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbeWVhcl0gLSBUaGUgY2FsZW5kYXIgeWVhci4gSWYgb21pdHRlZCAoYXMgaW4sIGNhbGwgYHV0YygpYCB3aXRoIG5vIGFyZ3VtZW50cyksIHRoZSBjdXJyZW50IHRpbWUgd2lsbCBiZSB1c2VkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbW9udGg9MV0gLSBUaGUgbW9udGgsIDEtaW5kZXhlZFxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RheT0xXSAtIFRoZSBkYXkgb2YgdGhlIG1vbnRoXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbaG91cj0wXSAtIFRoZSBob3VyIG9mIHRoZSBkYXksIGluIDI0LWhvdXIgdGltZVxuICAgKiBAcGFyYW0ge251bWJlcn0gW21pbnV0ZT0wXSAtIFRoZSBtaW51dGUgb2YgdGhlIGhvdXIsIG1lYW5pbmcgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCA1OVxuICAgKiBAcGFyYW0ge251bWJlcn0gW3NlY29uZD0wXSAtIFRoZSBzZWNvbmQgb2YgdGhlIG1pbnV0ZSwgbWVhbmluZyBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDU5XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWlsbGlzZWNvbmQ9MF0gLSBUaGUgbWlsbGlzZWNvbmQgb2YgdGhlIHNlY29uZCwgbWVhbmluZyBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDk5OVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL34+IG5vd1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNykgICAgICAgICAgICAgICAgICAgICAgICAvL34+IDIwMTctMDEtMDFUMDA6MDA6MDBaXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE3LCAzKSAgICAgICAgICAgICAgICAgICAgIC8vfj4gMjAxNy0wMy0wMVQwMDowMDowMFpcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTcsIDMsIDEyKSAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTEyVDAwOjAwOjAwWlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNywgMywgMTIsIDUpICAgICAgICAgICAgICAvL34+IDIwMTctMDMtMTJUMDU6MDA6MDBaXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE3LCAzLCAxMiwgNSwgNDUpICAgICAgICAgIC8vfj4gMjAxNy0wMy0xMlQwNTo0NTowMFpcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTcsIDMsIDEyLCA1LCA0NSwgMTApICAgICAgLy9+PiAyMDE3LTAzLTEyVDA1OjQ1OjEwWlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNywgMywgMTIsIDUsIDQ1LCAxMCwgNzY1KSAvL34+IDIwMTctMDMtMTJUMDU6NDU6MTAuNzY1WlxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG5cblxuICBzdGF0aWMgdXRjKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZCkge1xuICAgIGlmIChpc1VuZGVmaW5lZCh5ZWFyKSkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlVGltZSh7XG4gICAgICAgIHRzOiBTZXR0aW5ncy5ub3coKSxcbiAgICAgICAgem9uZTogRml4ZWRPZmZzZXRab25lLnV0Y0luc3RhbmNlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHF1aWNrRFQoe1xuICAgICAgICB5ZWFyLFxuICAgICAgICBtb250aCxcbiAgICAgICAgZGF5LFxuICAgICAgICBob3VyLFxuICAgICAgICBtaW51dGUsXG4gICAgICAgIHNlY29uZCxcbiAgICAgICAgbWlsbGlzZWNvbmRcbiAgICAgIH0sIEZpeGVkT2Zmc2V0Wm9uZS51dGNJbnN0YW5jZSk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGEgSmF2YVNjcmlwdCBEYXRlIG9iamVjdC4gVXNlcyB0aGUgZGVmYXVsdCB6b25lLlxuICAgKiBAcGFyYW0ge0RhdGV9IGRhdGUgLSBhIEphdmFTY3JpcHQgRGF0ZSBvYmplY3RcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBEYXRlVGltZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb3B0aW9ucy56b25lPSdsb2NhbCddIC0gdGhlIHpvbmUgdG8gcGxhY2UgdGhlIERhdGVUaW1lIGludG9cbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuXG5cbiAgc3RhdGljIGZyb21KU0RhdGUoZGF0ZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgdHMgPSBpc0RhdGUoZGF0ZSkgPyBkYXRlLnZhbHVlT2YoKSA6IE5hTjtcblxuICAgIGlmIChOdW1iZXIuaXNOYU4odHMpKSB7XG4gICAgICByZXR1cm4gRGF0ZVRpbWUuaW52YWxpZChcImludmFsaWQgaW5wdXRcIik7XG4gICAgfVxuXG4gICAgY29uc3Qgem9uZVRvVXNlID0gbm9ybWFsaXplWm9uZShvcHRpb25zLnpvbmUsIFNldHRpbmdzLmRlZmF1bHRab25lKTtcblxuICAgIGlmICghem9uZVRvVXNlLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKHVuc3VwcG9ydGVkWm9uZSh6b25lVG9Vc2UpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IERhdGVUaW1lKHtcbiAgICAgIHRzOiB0cyxcbiAgICAgIHpvbmU6IHpvbmVUb1VzZSxcbiAgICAgIGxvYzogTG9jYWxlLmZyb21PYmplY3Qob3B0aW9ucylcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIGVwb2NoIChtZWFuaW5nIHNpbmNlIDEgSmFudWFyeSAxOTcwIDAwOjAwOjAwIFVUQykuIFVzZXMgdGhlIGRlZmF1bHQgem9uZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG1pbGxpc2Vjb25kcyAtIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSAxOTcwIFVUQ1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIERhdGVUaW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRpb25zLnpvbmU9J2xvY2FsJ10gLSB0aGUgem9uZSB0byBwbGFjZSB0aGUgRGF0ZVRpbWUgaW50b1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubG9jYWxlXSAtIGEgbG9jYWxlIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm91dHB1dENhbGVuZGFyIC0gdGhlIG91dHB1dCBjYWxlbmRhciB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG5cblxuICBzdGF0aWMgZnJvbU1pbGxpcyhtaWxsaXNlY29uZHMsIG9wdGlvbnMgPSB7fSkge1xuICAgIGlmICghaXNOdW1iZXIobWlsbGlzZWNvbmRzKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKGBmcm9tTWlsbGlzIHJlcXVpcmVzIGEgbnVtZXJpY2FsIGlucHV0LCBidXQgcmVjZWl2ZWQgYSAke3R5cGVvZiBtaWxsaXNlY29uZHN9IHdpdGggdmFsdWUgJHttaWxsaXNlY29uZHN9YCk7XG4gICAgfSBlbHNlIGlmIChtaWxsaXNlY29uZHMgPCAtTUFYX0RBVEUgfHwgbWlsbGlzZWNvbmRzID4gTUFYX0RBVEUpIHtcbiAgICAgIC8vIHRoaXMgaXNuJ3QgcGVyZmVjdCBiZWNhdXNlIGJlY2F1c2Ugd2UgY2FuIHN0aWxsIGVuZCB1cCBvdXQgb2YgcmFuZ2UgYmVjYXVzZSBvZiBhZGRpdGlvbmFsIHNoaWZ0aW5nLCBidXQgaXQncyBhIHN0YXJ0XG4gICAgICByZXR1cm4gRGF0ZVRpbWUuaW52YWxpZChcIlRpbWVzdGFtcCBvdXQgb2YgcmFuZ2VcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZVRpbWUoe1xuICAgICAgICB0czogbWlsbGlzZWNvbmRzLFxuICAgICAgICB6b25lOiBub3JtYWxpemVab25lKG9wdGlvbnMuem9uZSwgU2V0dGluZ3MuZGVmYXVsdFpvbmUpLFxuICAgICAgICBsb2M6IExvY2FsZS5mcm9tT2JqZWN0KG9wdGlvbnMpXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYSBudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2ggKG1lYW5pbmcgc2luY2UgMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKS4gVXNlcyB0aGUgZGVmYXVsdCB6b25lLlxuICAgKiBAcGFyYW0ge251bWJlcn0gc2Vjb25kcyAtIGEgbnVtYmVyIG9mIHNlY29uZHMgc2luY2UgMTk3MCBVVENcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBEYXRlVGltZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb3B0aW9ucy56b25lPSdsb2NhbCddIC0gdGhlIHpvbmUgdG8gcGxhY2UgdGhlIERhdGVUaW1lIGludG9cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxvY2FsZV0gLSBhIGxvY2FsZSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5vdXRwdXRDYWxlbmRhciAtIHRoZSBvdXRwdXQgY2FsZW5kYXIgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuXG5cbiAgc3RhdGljIGZyb21TZWNvbmRzKHNlY29uZHMsIG9wdGlvbnMgPSB7fSkge1xuICAgIGlmICghaXNOdW1iZXIoc2Vjb25kcykpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcImZyb21TZWNvbmRzIHJlcXVpcmVzIGEgbnVtZXJpY2FsIGlucHV0XCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IERhdGVUaW1lKHtcbiAgICAgICAgdHM6IHNlY29uZHMgKiAxMDAwLFxuICAgICAgICB6b25lOiBub3JtYWxpemVab25lKG9wdGlvbnMuem9uZSwgU2V0dGluZ3MuZGVmYXVsdFpvbmUpLFxuICAgICAgICBsb2M6IExvY2FsZS5mcm9tT2JqZWN0KG9wdGlvbnMpXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYSBKYXZhU2NyaXB0IG9iamVjdCB3aXRoIGtleXMgbGlrZSAneWVhcicgYW5kICdob3VyJyB3aXRoIHJlYXNvbmFibGUgZGVmYXVsdHMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmogLSB0aGUgb2JqZWN0IHRvIGNyZWF0ZSB0aGUgRGF0ZVRpbWUgZnJvbVxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLnllYXIgLSBhIHllYXIsIHN1Y2ggYXMgMTk4N1xuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLm1vbnRoIC0gYSBtb250aCwgMS0xMlxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLmRheSAtIGEgZGF5IG9mIHRoZSBtb250aCwgMS0zMSwgZGVwZW5kaW5nIG9uIHRoZSBtb250aFxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLm9yZGluYWwgLSBkYXkgb2YgdGhlIHllYXIsIDEtMzY1IG9yIDM2NlxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLndlZWtZZWFyIC0gYW4gSVNPIHdlZWsgeWVhclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLndlZWtOdW1iZXIgLSBhbiBJU08gd2VlayBudW1iZXIsIGJldHdlZW4gMSBhbmQgNTIgb3IgNTMsIGRlcGVuZGluZyBvbiB0aGUgeWVhclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLndlZWtkYXkgLSBhbiBJU08gd2Vla2RheSwgMS03LCB3aGVyZSAxIGlzIE1vbmRheSBhbmQgNyBpcyBTdW5kYXlcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5ob3VyIC0gaG91ciBvZiB0aGUgZGF5LCAwLTIzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoubWludXRlIC0gbWludXRlIG9mIHRoZSBob3VyLCAwLTU5XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmouc2Vjb25kIC0gc2Vjb25kIG9mIHRoZSBtaW51dGUsIDAtNTlcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5taWxsaXNlY29uZCAtIG1pbGxpc2Vjb25kIG9mIHRoZSBzZWNvbmQsIDAtOTk5XG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvYmouem9uZT0nbG9jYWwnXSAtIGludGVycHJldCB0aGUgbnVtYmVycyBpbiB0aGUgY29udGV4dCBvZiBhIHBhcnRpY3VsYXIgem9uZS4gQ2FuIHRha2UgYW55IHZhbHVlIHRha2VuIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byBzZXRab25lKClcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvYmoubG9jYWxlPSdzeXN0ZW0ncyBsb2NhbGUnXSAtIGEgbG9jYWxlIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvYmoub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvYmoubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IHllYXI6IDE5ODIsIG1vbnRoOiA1LCBkYXk6IDI1fSkudG9JU09EYXRlKCkgLy89PiAnMTk4Mi0wNS0yNSdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IHllYXI6IDE5ODIgfSkudG9JU09EYXRlKCkgLy89PiAnMTk4Mi0wMS0wMSdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IGhvdXI6IDEwLCBtaW51dGU6IDI2LCBzZWNvbmQ6IDYgfSkgLy9+PiB0b2RheSBhdCAxMDoyNjowNlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tT2JqZWN0KHsgaG91cjogMTAsIG1pbnV0ZTogMjYsIHNlY29uZDogNiwgem9uZTogJ3V0YycgfSksXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21PYmplY3QoeyBob3VyOiAxMCwgbWludXRlOiAyNiwgc2Vjb25kOiA2LCB6b25lOiAnbG9jYWwnIH0pXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21PYmplY3QoeyBob3VyOiAxMCwgbWludXRlOiAyNiwgc2Vjb25kOiA2LCB6b25lOiAnQW1lcmljYS9OZXdfWW9yaycgfSlcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IHdlZWtZZWFyOiAyMDE2LCB3ZWVrTnVtYmVyOiAyLCB3ZWVrZGF5OiAzIH0pLnRvSVNPRGF0ZSgpIC8vPT4gJzIwMTYtMDEtMTMnXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cblxuXG4gIHN0YXRpYyBmcm9tT2JqZWN0KG9iaikge1xuICAgIGNvbnN0IHpvbmVUb1VzZSA9IG5vcm1hbGl6ZVpvbmUob2JqLnpvbmUsIFNldHRpbmdzLmRlZmF1bHRab25lKTtcblxuICAgIGlmICghem9uZVRvVXNlLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKHVuc3VwcG9ydGVkWm9uZSh6b25lVG9Vc2UpKTtcbiAgICB9XG5cbiAgICBjb25zdCB0c05vdyA9IFNldHRpbmdzLm5vdygpLFxuICAgICAgICAgIG9mZnNldFByb3ZpcyA9IHpvbmVUb1VzZS5vZmZzZXQodHNOb3cpLFxuICAgICAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVPYmplY3Qob2JqLCBub3JtYWxpemVVbml0LCBbXCJ6b25lXCIsIFwibG9jYWxlXCIsIFwib3V0cHV0Q2FsZW5kYXJcIiwgXCJudW1iZXJpbmdTeXN0ZW1cIl0pLFxuICAgICAgICAgIGNvbnRhaW5zT3JkaW5hbCA9ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLm9yZGluYWwpLFxuICAgICAgICAgIGNvbnRhaW5zR3JlZ29yWWVhciA9ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLnllYXIpLFxuICAgICAgICAgIGNvbnRhaW5zR3JlZ29yTUQgPSAhaXNVbmRlZmluZWQobm9ybWFsaXplZC5tb250aCkgfHwgIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQuZGF5KSxcbiAgICAgICAgICBjb250YWluc0dyZWdvciA9IGNvbnRhaW5zR3JlZ29yWWVhciB8fCBjb250YWluc0dyZWdvck1ELFxuICAgICAgICAgIGRlZmluaXRlV2Vla0RlZiA9IG5vcm1hbGl6ZWQud2Vla1llYXIgfHwgbm9ybWFsaXplZC53ZWVrTnVtYmVyLFxuICAgICAgICAgIGxvYyA9IExvY2FsZS5mcm9tT2JqZWN0KG9iaik7IC8vIGNhc2VzOlxuICAgIC8vIGp1c3QgYSB3ZWVrZGF5IC0+IHRoaXMgd2VlaydzIGluc3RhbmNlIG9mIHRoYXQgd2Vla2RheSwgbm8gd29ycmllc1xuICAgIC8vIChncmVnb3JpYW4gZGF0YSBvciBvcmRpbmFsKSArICh3ZWVrWWVhciBvciB3ZWVrTnVtYmVyKSAtPiBlcnJvclxuICAgIC8vIChncmVnb3JpYW4gbW9udGggb3IgZGF5KSArIG9yZGluYWwgLT4gZXJyb3JcbiAgICAvLyBvdGhlcndpc2UganVzdCB1c2Ugd2Vla3Mgb3Igb3JkaW5hbHMgb3IgZ3JlZ29yaWFuLCBkZXBlbmRpbmcgb24gd2hhdCdzIHNwZWNpZmllZFxuXG4gICAgaWYgKChjb250YWluc0dyZWdvciB8fCBjb250YWluc09yZGluYWwpICYmIGRlZmluaXRlV2Vla0RlZikge1xuICAgICAgdGhyb3cgbmV3IENvbmZsaWN0aW5nU3BlY2lmaWNhdGlvbkVycm9yKFwiQ2FuJ3QgbWl4IHdlZWtZZWFyL3dlZWtOdW1iZXIgdW5pdHMgd2l0aCB5ZWFyL21vbnRoL2RheSBvciBvcmRpbmFsc1wiKTtcbiAgICB9XG5cbiAgICBpZiAoY29udGFpbnNHcmVnb3JNRCAmJiBjb250YWluc09yZGluYWwpIHtcbiAgICAgIHRocm93IG5ldyBDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvcihcIkNhbid0IG1peCBvcmRpbmFsIGRhdGVzIHdpdGggbW9udGgvZGF5XCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZVdlZWtEYXRhID0gZGVmaW5pdGVXZWVrRGVmIHx8IG5vcm1hbGl6ZWQud2Vla2RheSAmJiAhY29udGFpbnNHcmVnb3I7IC8vIGNvbmZpZ3VyZSBvdXJzZWx2ZXMgdG8gZGVhbCB3aXRoIGdyZWdvcmlhbiBkYXRlcyBvciB3ZWVrIHN0dWZmXG5cbiAgICBsZXQgdW5pdHMsXG4gICAgICAgIGRlZmF1bHRWYWx1ZXMsXG4gICAgICAgIG9iak5vdyA9IHRzVG9PYmoodHNOb3csIG9mZnNldFByb3Zpcyk7XG5cbiAgICBpZiAodXNlV2Vla0RhdGEpIHtcbiAgICAgIHVuaXRzID0gb3JkZXJlZFdlZWtVbml0cztcbiAgICAgIGRlZmF1bHRWYWx1ZXMgPSBkZWZhdWx0V2Vla1VuaXRWYWx1ZXM7XG4gICAgICBvYmpOb3cgPSBncmVnb3JpYW5Ub1dlZWsob2JqTm93KTtcbiAgICB9IGVsc2UgaWYgKGNvbnRhaW5zT3JkaW5hbCkge1xuICAgICAgdW5pdHMgPSBvcmRlcmVkT3JkaW5hbFVuaXRzO1xuICAgICAgZGVmYXVsdFZhbHVlcyA9IGRlZmF1bHRPcmRpbmFsVW5pdFZhbHVlcztcbiAgICAgIG9iak5vdyA9IGdyZWdvcmlhblRvT3JkaW5hbChvYmpOb3cpO1xuICAgIH0gZWxzZSB7XG4gICAgICB1bml0cyA9IG9yZGVyZWRVbml0cyQxO1xuICAgICAgZGVmYXVsdFZhbHVlcyA9IGRlZmF1bHRVbml0VmFsdWVzO1xuICAgIH0gLy8gc2V0IGRlZmF1bHQgdmFsdWVzIGZvciBtaXNzaW5nIHN0dWZmXG5cblxuICAgIGxldCBmb3VuZEZpcnN0ID0gZmFsc2U7XG5cbiAgICBmb3IgKGNvbnN0IHUgb2YgdW5pdHMpIHtcbiAgICAgIGNvbnN0IHYgPSBub3JtYWxpemVkW3VdO1xuXG4gICAgICBpZiAoIWlzVW5kZWZpbmVkKHYpKSB7XG4gICAgICAgIGZvdW5kRmlyc3QgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChmb3VuZEZpcnN0KSB7XG4gICAgICAgIG5vcm1hbGl6ZWRbdV0gPSBkZWZhdWx0VmFsdWVzW3VdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9ybWFsaXplZFt1XSA9IG9iak5vd1t1XTtcbiAgICAgIH1cbiAgICB9IC8vIG1ha2Ugc3VyZSB0aGUgdmFsdWVzIHdlIGhhdmUgYXJlIGluIHJhbmdlXG5cblxuICAgIGNvbnN0IGhpZ2hlck9yZGVySW52YWxpZCA9IHVzZVdlZWtEYXRhID8gaGFzSW52YWxpZFdlZWtEYXRhKG5vcm1hbGl6ZWQpIDogY29udGFpbnNPcmRpbmFsID8gaGFzSW52YWxpZE9yZGluYWxEYXRhKG5vcm1hbGl6ZWQpIDogaGFzSW52YWxpZEdyZWdvcmlhbkRhdGEobm9ybWFsaXplZCksXG4gICAgICAgICAgaW52YWxpZCA9IGhpZ2hlck9yZGVySW52YWxpZCB8fCBoYXNJbnZhbGlkVGltZURhdGEobm9ybWFsaXplZCk7XG5cbiAgICBpZiAoaW52YWxpZCkge1xuICAgICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoaW52YWxpZCk7XG4gICAgfSAvLyBjb21wdXRlIHRoZSBhY3R1YWwgdGltZVxuXG5cbiAgICBjb25zdCBncmVnb3JpYW4gPSB1c2VXZWVrRGF0YSA/IHdlZWtUb0dyZWdvcmlhbihub3JtYWxpemVkKSA6IGNvbnRhaW5zT3JkaW5hbCA/IG9yZGluYWxUb0dyZWdvcmlhbihub3JtYWxpemVkKSA6IG5vcm1hbGl6ZWQsXG4gICAgICAgICAgW3RzRmluYWwsIG9mZnNldEZpbmFsXSA9IG9ialRvVFMoZ3JlZ29yaWFuLCBvZmZzZXRQcm92aXMsIHpvbmVUb1VzZSksXG4gICAgICAgICAgaW5zdCA9IG5ldyBEYXRlVGltZSh7XG4gICAgICB0czogdHNGaW5hbCxcbiAgICAgIHpvbmU6IHpvbmVUb1VzZSxcbiAgICAgIG86IG9mZnNldEZpbmFsLFxuICAgICAgbG9jXG4gICAgfSk7IC8vIGdyZWdvcmlhbiBkYXRhICsgd2Vla2RheSBzZXJ2ZXMgb25seSB0byB2YWxpZGF0ZVxuXG4gICAgaWYgKG5vcm1hbGl6ZWQud2Vla2RheSAmJiBjb250YWluc0dyZWdvciAmJiBvYmoud2Vla2RheSAhPT0gaW5zdC53ZWVrZGF5KSB7XG4gICAgICByZXR1cm4gRGF0ZVRpbWUuaW52YWxpZChcIm1pc21hdGNoZWQgd2Vla2RheVwiLCBgeW91IGNhbid0IHNwZWNpZnkgYm90aCBhIHdlZWtkYXkgb2YgJHtub3JtYWxpemVkLndlZWtkYXl9IGFuZCBhIGRhdGUgb2YgJHtpbnN0LnRvSVNPKCl9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGluc3Q7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYW4gSVNPIDg2MDEgc3RyaW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGhlIElTTyBzdHJpbmdcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRvIGFmZmVjdCB0aGUgY3JlYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29wdHMuem9uZT0nbG9jYWwnXSAtIHVzZSB0aGlzIHpvbmUgaWYgbm8gb2Zmc2V0IGlzIHNwZWNpZmllZCBpbiB0aGUgaW5wdXQgc3RyaW5nIGl0c2VsZi4gV2lsbCBhbHNvIGNvbnZlcnQgdGhlIHRpbWUgdG8gdGhpcyB6b25lXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuc2V0Wm9uZT1mYWxzZV0gLSBvdmVycmlkZSB0aGUgem9uZSB3aXRoIGEgZml4ZWQtb2Zmc2V0IHpvbmUgc3BlY2lmaWVkIGluIHRoZSBzdHJpbmcgaXRzZWxmLCBpZiBpdCBzcGVjaWZpZXMgb25lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGU9J3N5c3RlbSdzIGxvY2FsZSddIC0gYSBsb2NhbGUgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21JU08oJzIwMTYtMDUtMjVUMDk6MDg6MzQuMTIzJylcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbUlTTygnMjAxNi0wNS0yNVQwOTowODozNC4xMjMrMDY6MDAnKVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tSVNPKCcyMDE2LTA1LTI1VDA5OjA4OjM0LjEyMyswNjowMCcsIHtzZXRab25lOiB0cnVlfSlcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbUlTTygnMjAxNi0wNS0yNVQwOTowODozNC4xMjMnLCB7em9uZTogJ3V0Yyd9KVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tSVNPKCcyMDE2LVcwNS00JylcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuXG5cbiAgc3RhdGljIGZyb21JU08odGV4dCwgb3B0cyA9IHt9KSB7XG4gICAgY29uc3QgW3ZhbHMsIHBhcnNlZFpvbmVdID0gcGFyc2VJU09EYXRlKHRleHQpO1xuICAgIHJldHVybiBwYXJzZURhdGFUb0RhdGVUaW1lKHZhbHMsIHBhcnNlZFpvbmUsIG9wdHMsIFwiSVNPIDg2MDFcIiwgdGV4dCk7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYW4gUkZDIDI4MjIgc3RyaW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGhlIFJGQyAyODIyIHN0cmluZ1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgdG8gYWZmZWN0IHRoZSBjcmVhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb3B0cy56b25lPSdsb2NhbCddIC0gY29udmVydCB0aGUgdGltZSB0byB0aGlzIHpvbmUuIFNpbmNlIHRoZSBvZmZzZXQgaXMgYWx3YXlzIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nIGl0c2VsZiwgdGhpcyBoYXMgbm8gZWZmZWN0IG9uIHRoZSBpbnRlcnByZXRhdGlvbiBvZiBzdHJpbmcsIG1lcmVseSB0aGUgem9uZSB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGlzIGV4cHJlc3NlZCBpbi5cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zZXRab25lPWZhbHNlXSAtIG92ZXJyaWRlIHRoZSB6b25lIHdpdGggYSBmaXhlZC1vZmZzZXQgem9uZSBzcGVjaWZpZWQgaW4gdGhlIHN0cmluZyBpdHNlbGYsIGlmIGl0IHNwZWNpZmllcyBvbmVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nc3lzdGVtJ3MgbG9jYWxlJ10gLSBhIGxvY2FsZSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5vdXRwdXRDYWxlbmRhciAtIHRoZSBvdXRwdXQgY2FsZW5kYXIgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVJGQzI4MjIoJzI1IE5vdiAyMDE2IDEzOjIzOjEyIEdNVCcpXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21SRkMyODIyKCdGcmksIDI1IE5vdiAyMDE2IDEzOjIzOjEyICswNjAwJylcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVJGQzI4MjIoJzI1IE5vdiAyMDE2IDEzOjIzIFonKVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG5cblxuICBzdGF0aWMgZnJvbVJGQzI4MjIodGV4dCwgb3B0cyA9IHt9KSB7XG4gICAgY29uc3QgW3ZhbHMsIHBhcnNlZFpvbmVdID0gcGFyc2VSRkMyODIyRGF0ZSh0ZXh0KTtcbiAgICByZXR1cm4gcGFyc2VEYXRhVG9EYXRlVGltZSh2YWxzLCBwYXJzZWRab25lLCBvcHRzLCBcIlJGQyAyODIyXCIsIHRleHQpO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGFuIEhUVFAgaGVhZGVyIGRhdGVcbiAgICogQHNlZSBodHRwczovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWMzLmh0bWwjc2VjMy4zLjFcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSB0aGUgSFRUUCBoZWFkZXIgZGF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgdG8gYWZmZWN0IHRoZSBjcmVhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb3B0cy56b25lPSdsb2NhbCddIC0gY29udmVydCB0aGUgdGltZSB0byB0aGlzIHpvbmUuIFNpbmNlIEhUVFAgZGF0ZXMgYXJlIGFsd2F5cyBpbiBVVEMsIHRoaXMgaGFzIG5vIGVmZmVjdCBvbiB0aGUgaW50ZXJwcmV0YXRpb24gb2Ygc3RyaW5nLCBtZXJlbHkgdGhlIHpvbmUgdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpcyBleHByZXNzZWQgaW4uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuc2V0Wm9uZT1mYWxzZV0gLSBvdmVycmlkZSB0aGUgem9uZSB3aXRoIHRoZSBmaXhlZC1vZmZzZXQgem9uZSBzcGVjaWZpZWQgaW4gdGhlIHN0cmluZy4gRm9yIEhUVFAgZGF0ZXMsIHRoaXMgaXMgYWx3YXlzIFVUQywgc28gdGhpcyBvcHRpb24gaXMgZXF1aXZhbGVudCB0byBzZXR0aW5nIHRoZSBgem9uZWAgb3B0aW9uIHRvICd1dGMnLCBidXQgdGhpcyBvcHRpb24gaXMgaW5jbHVkZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggc2ltaWxhciBtZXRob2RzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlPSdzeXN0ZW0ncyBsb2NhbGUnXSAtIGEgbG9jYWxlIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm91dHB1dENhbGVuZGFyIC0gdGhlIG91dHB1dCBjYWxlbmRhciB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tSFRUUCgnU3VuLCAwNiBOb3YgMTk5NCAwODo0OTozNyBHTVQnKVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tSFRUUCgnU3VuZGF5LCAwNi1Ob3YtOTQgMDg6NDk6MzcgR01UJylcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbUhUVFAoJ1N1biBOb3YgIDYgMDg6NDk6MzcgMTk5NCcpXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cblxuXG4gIHN0YXRpYyBmcm9tSFRUUCh0ZXh0LCBvcHRzID0ge30pIHtcbiAgICBjb25zdCBbdmFscywgcGFyc2VkWm9uZV0gPSBwYXJzZUhUVFBEYXRlKHRleHQpO1xuICAgIHJldHVybiBwYXJzZURhdGFUb0RhdGVUaW1lKHZhbHMsIHBhcnNlZFpvbmUsIG9wdHMsIFwiSFRUUFwiLCBvcHRzKTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhbiBpbnB1dCBzdHJpbmcgYW5kIGZvcm1hdCBzdHJpbmcuXG4gICAqIERlZmF1bHRzIHRvIGVuLVVTIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWQsIHJlZ2FyZGxlc3Mgb2YgdGhlIHN5c3RlbSdzIGxvY2FsZS5cbiAgICogQHNlZSBodHRwczovL21vbWVudC5naXRodWIuaW8vbHV4b24vZG9jcy9tYW51YWwvcGFyc2luZy5odG1sI3RhYmxlLW9mLXRva2Vuc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRoZSBzdHJpbmcgdG8gcGFyc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZtdCAtIHRoZSBmb3JtYXQgdGhlIHN0cmluZyBpcyBleHBlY3RlZCB0byBiZSBpbiAoc2VlIHRoZSBsaW5rIGJlbG93IGZvciB0aGUgZm9ybWF0cylcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRvIGFmZmVjdCB0aGUgY3JlYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29wdHMuem9uZT0nbG9jYWwnXSAtIHVzZSB0aGlzIHpvbmUgaWYgbm8gb2Zmc2V0IGlzIHNwZWNpZmllZCBpbiB0aGUgaW5wdXQgc3RyaW5nIGl0c2VsZi4gV2lsbCBhbHNvIGNvbnZlcnQgdGhlIERhdGVUaW1lIHRvIHRoaXMgem9uZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnNldFpvbmU9ZmFsc2VdIC0gb3ZlcnJpZGUgdGhlIHpvbmUgd2l0aCBhIHpvbmUgc3BlY2lmaWVkIGluIHRoZSBzdHJpbmcgaXRzZWxmLCBpZiBpdCBzcGVjaWZpZXMgb25lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGU9J2VuLVVTJ10gLSBhIGxvY2FsZSBzdHJpbmcgdG8gdXNlIHdoZW4gcGFyc2luZy4gV2lsbCBhbHNvIHNldCB0aGUgRGF0ZVRpbWUgdG8gdGhpcyBsb2NhbGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gdXNlIHdoZW4gcGFyc2luZy4gV2lsbCBhbHNvIHNldCB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIHRvIHRoaXMgbnVtYmVyaW5nIHN5c3RlbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5vdXRwdXRDYWxlbmRhciAtIHRoZSBvdXRwdXQgY2FsZW5kYXIgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuXG5cbiAgc3RhdGljIGZyb21Gb3JtYXQodGV4dCwgZm10LCBvcHRzID0ge30pIHtcbiAgICBpZiAoaXNVbmRlZmluZWQodGV4dCkgfHwgaXNVbmRlZmluZWQoZm10KSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFwiZnJvbUZvcm1hdCByZXF1aXJlcyBhbiBpbnB1dCBzdHJpbmcgYW5kIGEgZm9ybWF0XCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHtcbiAgICAgIGxvY2FsZSA9IG51bGwsXG4gICAgICBudW1iZXJpbmdTeXN0ZW0gPSBudWxsXG4gICAgfSA9IG9wdHMsXG4gICAgICAgICAgbG9jYWxlVG9Vc2UgPSBMb2NhbGUuZnJvbU9wdHMoe1xuICAgICAgbG9jYWxlLFxuICAgICAgbnVtYmVyaW5nU3lzdGVtLFxuICAgICAgZGVmYXVsdFRvRU46IHRydWVcbiAgICB9KSxcbiAgICAgICAgICBbdmFscywgcGFyc2VkWm9uZSwgaW52YWxpZF0gPSBwYXJzZUZyb21Ub2tlbnMobG9jYWxlVG9Vc2UsIHRleHQsIGZtdCk7XG5cbiAgICBpZiAoaW52YWxpZCkge1xuICAgICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoaW52YWxpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBwYXJzZURhdGFUb0RhdGVUaW1lKHZhbHMsIHBhcnNlZFpvbmUsIG9wdHMsIGBmb3JtYXQgJHtmbXR9YCwgdGV4dCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgZnJvbUZvcm1hdCBpbnN0ZWFkXG4gICAqL1xuXG5cbiAgc3RhdGljIGZyb21TdHJpbmcodGV4dCwgZm10LCBvcHRzID0ge30pIHtcbiAgICByZXR1cm4gRGF0ZVRpbWUuZnJvbUZvcm1hdCh0ZXh0LCBmbXQsIG9wdHMpO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGEgU1FMIGRhdGUsIHRpbWUsIG9yIGRhdGV0aW1lXG4gICAqIERlZmF1bHRzIHRvIGVuLVVTIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWQsIHJlZ2FyZGxlc3Mgb2YgdGhlIHN5c3RlbSdzIGxvY2FsZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRoZSBzdHJpbmcgdG8gcGFyc2VcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRvIGFmZmVjdCB0aGUgY3JlYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29wdHMuem9uZT0nbG9jYWwnXSAtIHVzZSB0aGlzIHpvbmUgaWYgbm8gb2Zmc2V0IGlzIHNwZWNpZmllZCBpbiB0aGUgaW5wdXQgc3RyaW5nIGl0c2VsZi4gV2lsbCBhbHNvIGNvbnZlcnQgdGhlIERhdGVUaW1lIHRvIHRoaXMgem9uZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnNldFpvbmU9ZmFsc2VdIC0gb3ZlcnJpZGUgdGhlIHpvbmUgd2l0aCBhIHpvbmUgc3BlY2lmaWVkIGluIHRoZSBzdHJpbmcgaXRzZWxmLCBpZiBpdCBzcGVjaWZpZXMgb25lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGU9J2VuLVVTJ10gLSBhIGxvY2FsZSBzdHJpbmcgdG8gdXNlIHdoZW4gcGFyc2luZy4gV2lsbCBhbHNvIHNldCB0aGUgRGF0ZVRpbWUgdG8gdGhpcyBsb2NhbGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gdXNlIHdoZW4gcGFyc2luZy4gV2lsbCBhbHNvIHNldCB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIHRvIHRoaXMgbnVtYmVyaW5nIHN5c3RlbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5vdXRwdXRDYWxlbmRhciAtIHRoZSBvdXRwdXQgY2FsZW5kYXIgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVNRTCgnMjAxNy0wNS0xNScpXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzIwMTctMDUtMTUgMDk6MTI6MzQnKVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tU1FMKCcyMDE3LTA1LTE1IDA5OjEyOjM0LjM0MicpXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzIwMTctMDUtMTUgMDk6MTI6MzQuMzQyKzA2OjAwJylcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVNRTCgnMjAxNy0wNS0xNSAwOToxMjozNC4zNDIgQW1lcmljYS9Mb3NfQW5nZWxlcycpXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzIwMTctMDUtMTUgMDk6MTI6MzQuMzQyIEFtZXJpY2EvTG9zX0FuZ2VsZXMnLCB7IHNldFpvbmU6IHRydWUgfSlcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVNRTCgnMjAxNy0wNS0xNSAwOToxMjozNC4zNDInLCB7IHpvbmU6ICdBbWVyaWNhL0xvc19BbmdlbGVzJyB9KVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tU1FMKCcwOToxMjozNC4zNDInKVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG5cblxuICBzdGF0aWMgZnJvbVNRTCh0ZXh0LCBvcHRzID0ge30pIHtcbiAgICBjb25zdCBbdmFscywgcGFyc2VkWm9uZV0gPSBwYXJzZVNRTCh0ZXh0KTtcbiAgICByZXR1cm4gcGFyc2VEYXRhVG9EYXRlVGltZSh2YWxzLCBwYXJzZWRab25lLCBvcHRzLCBcIlNRTFwiLCB0ZXh0KTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlIGFuIGludmFsaWQgRGF0ZVRpbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWFzb24gLSBzaW1wbGUgc3RyaW5nIG9mIHdoeSB0aGlzIERhdGVUaW1lIGlzIGludmFsaWQuIFNob3VsZCBub3QgY29udGFpbiBwYXJhbWV0ZXJzIG9yIGFueXRoaW5nIGVsc2UgZGF0YS1kZXBlbmRlbnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtleHBsYW5hdGlvbj1udWxsXSAtIGxvbmdlciBleHBsYW5hdGlvbiwgbWF5IGluY2x1ZGUgcGFyYW1ldGVycyBhbmQgb3RoZXIgdXNlZnVsIGRlYnVnZ2luZyBpbmZvcm1hdGlvblxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG5cblxuICBzdGF0aWMgaW52YWxpZChyZWFzb24sIGV4cGxhbmF0aW9uID0gbnVsbCkge1xuICAgIGlmICghcmVhc29uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXCJuZWVkIHRvIHNwZWNpZnkgYSByZWFzb24gdGhlIERhdGVUaW1lIGlzIGludmFsaWRcIik7XG4gICAgfVxuXG4gICAgY29uc3QgaW52YWxpZCA9IHJlYXNvbiBpbnN0YW5jZW9mIEludmFsaWQgPyByZWFzb24gOiBuZXcgSW52YWxpZChyZWFzb24sIGV4cGxhbmF0aW9uKTtcblxuICAgIGlmIChTZXR0aW5ncy50aHJvd09uSW52YWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWREYXRlVGltZUVycm9yKGludmFsaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IERhdGVUaW1lKHtcbiAgICAgICAgaW52YWxpZFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBvYmplY3QgaXMgYSBEYXRlVGltZS4gV29ya3MgYWNyb3NzIGNvbnRleHQgYm91bmRhcmllc1xuICAgKiBAcGFyYW0ge29iamVjdH0gb1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cblxuXG4gIHN0YXRpYyBpc0RhdGVUaW1lKG8pIHtcbiAgICByZXR1cm4gbyAmJiBvLmlzTHV4b25EYXRlVGltZSB8fCBmYWxzZTtcbiAgfSAvLyBJTkZPXG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdmFsdWUgb2YgdW5pdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuaXQgLSBhIHVuaXQgc3VjaCBhcyAnbWludXRlJyBvciAnZGF5J1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA3LCA0KS5nZXQoJ21vbnRoJyk7IC8vPT4gN1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA3LCA0KS5nZXQoJ2RheScpOyAvLz0+IDRcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cblxuXG4gIGdldCh1bml0KSB7XG4gICAgcmV0dXJuIHRoaXNbdW5pdF07XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgRGF0ZVRpbWUgaXMgdmFsaWQuIEludmFsaWQgRGF0ZVRpbWVzIG9jY3VyIHdoZW46XG4gICAqICogVGhlIERhdGVUaW1lIHdhcyBjcmVhdGVkIGZyb20gaW52YWxpZCBjYWxlbmRhciBpbmZvcm1hdGlvbiwgc3VjaCBhcyB0aGUgMTN0aCBtb250aCBvciBGZWJydWFyeSAzMFxuICAgKiAqIFRoZSBEYXRlVGltZSB3YXMgY3JlYXRlZCBieSBhbiBvcGVyYXRpb24gb24gYW5vdGhlciBpbnZhbGlkIGRhdGVcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuXG5cbiAgZ2V0IGlzVmFsaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW52YWxpZCA9PT0gbnVsbDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhbiBlcnJvciBjb2RlIGlmIHRoaXMgRGF0ZVRpbWUgaXMgaW52YWxpZCwgb3IgbnVsbCBpZiB0aGUgRGF0ZVRpbWUgaXMgdmFsaWRcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG5cblxuICBnZXQgaW52YWxpZFJlYXNvbigpIHtcbiAgICByZXR1cm4gdGhpcy5pbnZhbGlkID8gdGhpcy5pbnZhbGlkLnJlYXNvbiA6IG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gZXhwbGFuYXRpb24gb2Ygd2h5IHRoaXMgRGF0ZVRpbWUgYmVjYW1lIGludmFsaWQsIG9yIG51bGwgaWYgdGhlIERhdGVUaW1lIGlzIHZhbGlkXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuXG5cbiAgZ2V0IGludmFsaWRFeHBsYW5hdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5pbnZhbGlkID8gdGhpcy5pbnZhbGlkLmV4cGxhbmF0aW9uIDogbnVsbDtcbiAgfVxuICAvKipcbiAgICogR2V0IHRoZSBsb2NhbGUgb2YgYSBEYXRlVGltZSwgc3VjaCAnZW4tR0InLiBUaGUgbG9jYWxlIGlzIHVzZWQgd2hlbiBmb3JtYXR0aW5nIHRoZSBEYXRlVGltZVxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cblxuXG4gIGdldCBsb2NhbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMubG9jLmxvY2FsZSA6IG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIEdldCB0aGUgbnVtYmVyaW5nIHN5c3RlbSBvZiBhIERhdGVUaW1lLCBzdWNoICdiZW5nJy4gVGhlIG51bWJlcmluZyBzeXN0ZW0gaXMgdXNlZCB3aGVuIGZvcm1hdHRpbmcgdGhlIERhdGVUaW1lXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuXG5cbiAgZ2V0IG51bWJlcmluZ1N5c3RlbSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5sb2MubnVtYmVyaW5nU3lzdGVtIDogbnVsbDtcbiAgfVxuICAvKipcbiAgICogR2V0IHRoZSBvdXRwdXQgY2FsZW5kYXIgb2YgYSBEYXRlVGltZSwgc3VjaCAnaXNsYW1pYycuIFRoZSBvdXRwdXQgY2FsZW5kYXIgaXMgdXNlZCB3aGVuIGZvcm1hdHRpbmcgdGhlIERhdGVUaW1lXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuXG5cbiAgZ2V0IG91dHB1dENhbGVuZGFyKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmxvYy5vdXRwdXRDYWxlbmRhciA6IG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIEdldCB0aGUgdGltZSB6b25lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIERhdGVUaW1lLlxuICAgKiBAdHlwZSB7Wm9uZX1cbiAgICovXG5cblxuICBnZXQgem9uZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fem9uZTtcbiAgfVxuICAvKipcbiAgICogR2V0IHRoZSBuYW1lIG9mIHRoZSB0aW1lIHpvbmUuXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuXG5cbiAgZ2V0IHpvbmVOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnpvbmUubmFtZSA6IG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIEdldCB0aGUgeWVhclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSkueWVhciAvLz0+IDIwMTdcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG5cblxuICBnZXQgeWVhcigpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLnllYXIgOiBOYU47XG4gIH1cbiAgLyoqXG4gICAqIEdldCB0aGUgcXVhcnRlclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSkucXVhcnRlciAvLz0+IDJcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG5cblxuICBnZXQgcXVhcnRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gTWF0aC5jZWlsKHRoaXMuYy5tb250aCAvIDMpIDogTmFOO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgdGhlIG1vbnRoICgxLTEyKS5cbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLm1vbnRoIC8vPT4gNVxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cblxuXG4gIGdldCBtb250aCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLm1vbnRoIDogTmFOO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgdGhlIGRheSBvZiB0aGUgbW9udGggKDEtMzBpc2gpLlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSkuZGF5IC8vPT4gMjVcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG5cblxuICBnZXQgZGF5KCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmMuZGF5IDogTmFOO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgdGhlIGhvdXIgb2YgdGhlIGRheSAoMC0yMykuXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1LCA5KS5ob3VyIC8vPT4gOVxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cblxuXG4gIGdldCBob3VyKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmMuaG91ciA6IE5hTjtcbiAgfVxuICAvKipcbiAgICogR2V0IHRoZSBtaW51dGUgb2YgdGhlIGhvdXIgKDAtNTkpLlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSwgOSwgMzApLm1pbnV0ZSAvLz0+IDMwXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuXG5cbiAgZ2V0IG1pbnV0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLm1pbnV0ZSA6IE5hTjtcbiAgfVxuICAvKipcbiAgICogR2V0IHRoZSBzZWNvbmQgb2YgdGhlIG1pbnV0ZSAoMC01OSkuXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1LCA5LCAzMCwgNTIpLnNlY29uZCAvLz0+IDUyXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuXG5cbiAgZ2V0IHNlY29uZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLnNlY29uZCA6IE5hTjtcbiAgfVxuICAvKipcbiAgICogR2V0IHRoZSBtaWxsaXNlY29uZCBvZiB0aGUgc2Vjb25kICgwLTk5OSkuXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1LCA5LCAzMCwgNTIsIDY1NCkubWlsbGlzZWNvbmQgLy89PiA2NTRcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG5cblxuICBnZXQgbWlsbGlzZWNvbmQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuYy5taWxsaXNlY29uZCA6IE5hTjtcbiAgfVxuICAvKipcbiAgICogR2V0IHRoZSB3ZWVrIHllYXJcbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDExLCAzMSkud2Vla1llYXIgLy89PiAyMDE1XG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuXG5cbiAgZ2V0IHdlZWtZZWFyKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBwb3NzaWJseUNhY2hlZFdlZWtEYXRhKHRoaXMpLndlZWtZZWFyIDogTmFOO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgdGhlIHdlZWsgbnVtYmVyIG9mIHRoZSB3ZWVrIHllYXIgKDEtNTJpc2gpLlxuICAgKiBAc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT193ZWVrX2RhdGVcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLndlZWtOdW1iZXIgLy89PiAyMVxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cblxuXG4gIGdldCB3ZWVrTnVtYmVyKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBwb3NzaWJseUNhY2hlZFdlZWtEYXRhKHRoaXMpLndlZWtOdW1iZXIgOiBOYU47XG4gIH1cbiAgLyoqXG4gICAqIEdldCB0aGUgZGF5IG9mIHRoZSB3ZWVrLlxuICAgKiAxIGlzIE1vbmRheSBhbmQgNyBpcyBTdW5kYXlcbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDExLCAzMSkud2Vla2RheSAvLz0+IDRcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG5cblxuICBnZXQgd2Vla2RheSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gcG9zc2libHlDYWNoZWRXZWVrRGF0YSh0aGlzKS53ZWVrZGF5IDogTmFOO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgdGhlIG9yZGluYWwgKG1lYW5pbmcgdGhlIGRheSBvZiB0aGUgeWVhcilcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLm9yZGluYWwgLy89PiAxNDVcbiAgICogQHR5cGUge251bWJlcnxEYXRlVGltZX1cbiAgICovXG5cblxuICBnZXQgb3JkaW5hbCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gZ3JlZ29yaWFuVG9PcmRpbmFsKHRoaXMuYykub3JkaW5hbCA6IE5hTjtcbiAgfVxuICAvKipcbiAgICogR2V0IHRoZSBodW1hbiByZWFkYWJsZSBzaG9ydCBtb250aCBuYW1lLCBzdWNoIGFzICdPY3QnLlxuICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMTAsIDMwKS5tb250aFNob3J0IC8vPT4gT2N0XG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuXG5cbiAgZ2V0IG1vbnRoU2hvcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IEluZm8ubW9udGhzKFwic2hvcnRcIiwge1xuICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZVxuICAgIH0pW3RoaXMubW9udGggLSAxXSA6IG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIEdldCB0aGUgaHVtYW4gcmVhZGFibGUgbG9uZyBtb250aCBuYW1lLCBzdWNoIGFzICdPY3RvYmVyJy5cbiAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDEwLCAzMCkubW9udGhMb25nIC8vPT4gT2N0b2JlclxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cblxuXG4gIGdldCBtb250aExvbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IEluZm8ubW9udGhzKFwibG9uZ1wiLCB7XG4gICAgICBsb2NhbGU6IHRoaXMubG9jYWxlXG4gICAgfSlbdGhpcy5tb250aCAtIDFdIDogbnVsbDtcbiAgfVxuICAvKipcbiAgICogR2V0IHRoZSBodW1hbiByZWFkYWJsZSBzaG9ydCB3ZWVrZGF5LCBzdWNoIGFzICdNb24nLlxuICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMTAsIDMwKS53ZWVrZGF5U2hvcnQgLy89PiBNb25cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG5cblxuICBnZXQgd2Vla2RheVNob3J0KCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBJbmZvLndlZWtkYXlzKFwic2hvcnRcIiwge1xuICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZVxuICAgIH0pW3RoaXMud2Vla2RheSAtIDFdIDogbnVsbDtcbiAgfVxuICAvKipcbiAgICogR2V0IHRoZSBodW1hbiByZWFkYWJsZSBsb25nIHdlZWtkYXksIHN1Y2ggYXMgJ01vbmRheScuXG4gICAqIERlZmF1bHRzIHRvIHRoZSBzeXN0ZW0ncyBsb2NhbGUgaWYgbm8gbG9jYWxlIGhhcyBiZWVuIHNwZWNpZmllZFxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAxMCwgMzApLndlZWtkYXlMb25nIC8vPT4gTW9uZGF5XG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuXG5cbiAgZ2V0IHdlZWtkYXlMb25nKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBJbmZvLndlZWtkYXlzKFwibG9uZ1wiLCB7XG4gICAgICBsb2NhbGU6IHRoaXMubG9jYWxlXG4gICAgfSlbdGhpcy53ZWVrZGF5IC0gMV0gOiBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgdGhlIFVUQyBvZmZzZXQgb2YgdGhpcyBEYXRlVGltZSBpbiBtaW51dGVzXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLm9mZnNldCAvLz0+IC0yNDBcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKCkub2Zmc2V0IC8vPT4gMFxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cblxuXG4gIGdldCBvZmZzZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/ICt0aGlzLm8gOiBOYU47XG4gIH1cbiAgLyoqXG4gICAqIEdldCB0aGUgc2hvcnQgaHVtYW4gbmFtZSBmb3IgdGhlIHpvbmUncyBjdXJyZW50IG9mZnNldCwgZm9yIGV4YW1wbGUgXCJFU1RcIiBvciBcIkVEVFwiLlxuICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG5cblxuICBnZXQgb2Zmc2V0TmFtZVNob3J0KCkge1xuICAgIGlmICh0aGlzLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnpvbmUub2Zmc2V0TmFtZSh0aGlzLnRzLCB7XG4gICAgICAgIGZvcm1hdDogXCJzaG9ydFwiLFxuICAgICAgICBsb2NhbGU6IHRoaXMubG9jYWxlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBHZXQgdGhlIGxvbmcgaHVtYW4gbmFtZSBmb3IgdGhlIHpvbmUncyBjdXJyZW50IG9mZnNldCwgZm9yIGV4YW1wbGUgXCJFYXN0ZXJuIFN0YW5kYXJkIFRpbWVcIiBvciBcIkVhc3Rlcm4gRGF5bGlnaHQgVGltZVwiLlxuICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG5cblxuICBnZXQgb2Zmc2V0TmFtZUxvbmcoKSB7XG4gICAgaWYgKHRoaXMuaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuem9uZS5vZmZzZXROYW1lKHRoaXMudHMsIHtcbiAgICAgICAgZm9ybWF0OiBcImxvbmdcIixcbiAgICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogR2V0IHdoZXRoZXIgdGhpcyB6b25lJ3Mgb2Zmc2V0IGV2ZXIgY2hhbmdlcywgYXMgaW4gYSBEU1QuXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKi9cblxuXG4gIGdldCBpc09mZnNldEZpeGVkKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnpvbmUudW5pdmVyc2FsIDogbnVsbDtcbiAgfVxuICAvKipcbiAgICogR2V0IHdoZXRoZXIgdGhlIERhdGVUaW1lIGlzIGluIGEgRFNULlxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICovXG5cblxuICBnZXQgaXNJbkRTVCgpIHtcbiAgICBpZiAodGhpcy5pc09mZnNldEZpeGVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLm9mZnNldCA+IHRoaXMuc2V0KHtcbiAgICAgICAgbW9udGg6IDFcbiAgICAgIH0pLm9mZnNldCB8fCB0aGlzLm9mZnNldCA+IHRoaXMuc2V0KHtcbiAgICAgICAgbW9udGg6IDVcbiAgICAgIH0pLm9mZnNldDtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIERhdGVUaW1lIGlzIGluIGEgbGVhcCB5ZWFyLCBmYWxzZSBvdGhlcndpc2VcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNikuaXNJbkxlYXBZZWFyIC8vPT4gdHJ1ZVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDEzKS5pc0luTGVhcFllYXIgLy89PiBmYWxzZVxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICovXG5cblxuICBnZXQgaXNJbkxlYXBZZWFyKCkge1xuICAgIHJldHVybiBpc0xlYXBZZWFyKHRoaXMueWVhcik7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBkYXlzIGluIHRoaXMgRGF0ZVRpbWUncyBtb250aFxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE2LCAyKS5kYXlzSW5Nb250aCAvLz0+IDI5XG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTYsIDMpLmRheXNJbk1vbnRoIC8vPT4gMzFcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG5cblxuICBnZXQgZGF5c0luTW9udGgoKSB7XG4gICAgcmV0dXJuIGRheXNJbk1vbnRoKHRoaXMueWVhciwgdGhpcy5tb250aCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBkYXlzIGluIHRoaXMgRGF0ZVRpbWUncyB5ZWFyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTYpLmRheXNJblllYXIgLy89PiAzNjZcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxMykuZGF5c0luWWVhciAvLz0+IDM2NVxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cblxuXG4gIGdldCBkYXlzSW5ZZWFyKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBkYXlzSW5ZZWFyKHRoaXMueWVhcikgOiBOYU47XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiB3ZWVrcyBpbiB0aGlzIERhdGVUaW1lJ3MgeWVhclxuICAgKiBAc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT193ZWVrX2RhdGVcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAwNCkud2Vla3NJbldlZWtZZWFyIC8vPT4gNTNcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxMykud2Vla3NJbldlZWtZZWFyIC8vPT4gNTJcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG5cblxuICBnZXQgd2Vla3NJbldlZWtZZWFyKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB3ZWVrc0luV2Vla1llYXIodGhpcy53ZWVrWWVhcikgOiBOYU47XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJlc29sdmVkIEludGwgb3B0aW9ucyBmb3IgdGhpcyBEYXRlVGltZS5cbiAgICogVGhpcyBpcyB1c2VmdWwgaW4gdW5kZXJzdGFuZGluZyB0aGUgYmVoYXZpb3Igb2YgZm9ybWF0dGluZyBtZXRob2RzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gdGhlIHNhbWUgb3B0aW9ucyBhcyB0b0xvY2FsZVN0cmluZ1xuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuXG5cbiAgcmVzb2x2ZWRMb2NhbGVPcHRzKG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGxvY2FsZSxcbiAgICAgIG51bWJlcmluZ1N5c3RlbSxcbiAgICAgIGNhbGVuZGFyXG4gICAgfSA9IEZvcm1hdHRlci5jcmVhdGUodGhpcy5sb2MuY2xvbmUob3B0cyksIG9wdHMpLnJlc29sdmVkT3B0aW9ucyh0aGlzKTtcbiAgICByZXR1cm4ge1xuICAgICAgbG9jYWxlLFxuICAgICAgbnVtYmVyaW5nU3lzdGVtLFxuICAgICAgb3V0cHV0Q2FsZW5kYXI6IGNhbGVuZGFyXG4gICAgfTtcbiAgfSAvLyBUUkFOU0ZPUk1cblxuICAvKipcbiAgICogXCJTZXRcIiB0aGUgRGF0ZVRpbWUncyB6b25lIHRvIFVUQy4gUmV0dXJucyBhIG5ld2x5LWNvbnN0cnVjdGVkIERhdGVUaW1lLlxuICAgKlxuICAgKiBFcXVpdmFsZW50IHRvIHtAbGluayBzZXRab25lfSgndXRjJylcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXQ9MF0gLSBvcHRpb25hbGx5LCBhbiBvZmZzZXQgZnJvbSBVVEMgaW4gbWludXRlc1xuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdHM9e31dIC0gb3B0aW9ucyB0byBwYXNzIHRvIGBzZXRab25lKClgXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cblxuXG4gIHRvVVRDKG9mZnNldCA9IDAsIG9wdHMgPSB7fSkge1xuICAgIHJldHVybiB0aGlzLnNldFpvbmUoRml4ZWRPZmZzZXRab25lLmluc3RhbmNlKG9mZnNldCksIG9wdHMpO1xuICB9XG4gIC8qKlxuICAgKiBcIlNldFwiIHRoZSBEYXRlVGltZSdzIHpvbmUgdG8gdGhlIGhvc3QncyBsb2NhbCB6b25lLiBSZXR1cm5zIGEgbmV3bHktY29uc3RydWN0ZWQgRGF0ZVRpbWUuXG4gICAqXG4gICAqIEVxdWl2YWxlbnQgdG8gYHNldFpvbmUoJ2xvY2FsJylgXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cblxuXG4gIHRvTG9jYWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0Wm9uZShTZXR0aW5ncy5kZWZhdWx0Wm9uZSk7XG4gIH1cbiAgLyoqXG4gICAqIFwiU2V0XCIgdGhlIERhdGVUaW1lJ3Mgem9uZSB0byBzcGVjaWZpZWQgem9uZS4gUmV0dXJucyBhIG5ld2x5LWNvbnN0cnVjdGVkIERhdGVUaW1lLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCB0aGUgc2V0dGVyIGtlZXBzIHRoZSB1bmRlcmx5aW5nIHRpbWUgdGhlIHNhbWUgKGFzIGluLCB0aGUgc2FtZSB0aW1lc3RhbXApLCBidXQgdGhlIG5ldyBpbnN0YW5jZSB3aWxsIHJlcG9ydCBkaWZmZXJlbnQgbG9jYWwgdGltZXMgYW5kIGNvbnNpZGVyIERTVHMgd2hlbiBtYWtpbmcgY29tcHV0YXRpb25zLCBhcyB3aXRoIHtAbGluayBwbHVzfS4gWW91IG1heSB3aXNoIHRvIHVzZSB7QGxpbmsgdG9Mb2NhbH0gYW5kIHtAbGluayB0b1VUQ30gd2hpY2ggcHJvdmlkZSBzaW1wbGUgY29udmVuaWVuY2Ugd3JhcHBlcnMgZm9yIGNvbW1vbmx5IHVzZWQgem9uZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFt6b25lPSdsb2NhbCddIC0gYSB6b25lIGlkZW50aWZpZXIuIEFzIGEgc3RyaW5nLCB0aGF0IGNhbiBiZSBhbnkgSUFOQSB6b25lIHN1cHBvcnRlZCBieSB0aGUgaG9zdCBlbnZpcm9ubWVudCwgb3IgYSBmaXhlZC1vZmZzZXQgbmFtZSBvZiB0aGUgZm9ybSAnVVRDKzMnLCBvciB0aGUgc3RyaW5ncyAnbG9jYWwnIG9yICd1dGMnLiBZb3UgbWF5IGFsc28gc3VwcGx5IGFuIGluc3RhbmNlIG9mIGEge0BsaW5rIFpvbmV9IGNsYXNzLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5rZWVwTG9jYWxUaW1lPWZhbHNlXSAtIElmIHRydWUsIGFkanVzdCB0aGUgdW5kZXJseWluZyB0aW1lIHNvIHRoYXQgdGhlIGxvY2FsIHRpbWUgc3RheXMgdGhlIHNhbWUsIGJ1dCBpbiB0aGUgdGFyZ2V0IHpvbmUuIFlvdSBzaG91bGQgcmFyZWx5IG5lZWQgdGhpcy5cbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuXG5cbiAgc2V0Wm9uZSh6b25lLCB7XG4gICAga2VlcExvY2FsVGltZSA9IGZhbHNlLFxuICAgIGtlZXBDYWxlbmRhclRpbWUgPSBmYWxzZVxuICB9ID0ge30pIHtcbiAgICB6b25lID0gbm9ybWFsaXplWm9uZSh6b25lLCBTZXR0aW5ncy5kZWZhdWx0Wm9uZSk7XG5cbiAgICBpZiAoem9uZS5lcXVhbHModGhpcy56b25lKSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSBlbHNlIGlmICghem9uZS5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gRGF0ZVRpbWUuaW52YWxpZCh1bnN1cHBvcnRlZFpvbmUoem9uZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgbmV3VFMgPSB0aGlzLnRzO1xuXG4gICAgICBpZiAoa2VlcExvY2FsVGltZSB8fCBrZWVwQ2FsZW5kYXJUaW1lKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldEd1ZXNzID0gem9uZS5vZmZzZXQodGhpcy50cyk7XG4gICAgICAgIGNvbnN0IGFzT2JqID0gdGhpcy50b09iamVjdCgpO1xuICAgICAgICBbbmV3VFNdID0gb2JqVG9UUyhhc09iaiwgb2Zmc2V0R3Vlc3MsIHpvbmUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY2xvbmUkMSh0aGlzLCB7XG4gICAgICAgIHRzOiBuZXdUUyxcbiAgICAgICAgem9uZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBcIlNldFwiIHRoZSBsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3Igb3V0cHV0Q2FsZW5kYXIuIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBEYXRlVGltZS5cbiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BlcnRpZXMgLSB0aGUgcHJvcGVydGllcyB0byBzZXRcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLnJlY29uZmlndXJlKHsgbG9jYWxlOiAnZW4tR0InIH0pXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cblxuXG4gIHJlY29uZmlndXJlKHtcbiAgICBsb2NhbGUsXG4gICAgbnVtYmVyaW5nU3lzdGVtLFxuICAgIG91dHB1dENhbGVuZGFyXG4gIH0gPSB7fSkge1xuICAgIGNvbnN0IGxvYyA9IHRoaXMubG9jLmNsb25lKHtcbiAgICAgIGxvY2FsZSxcbiAgICAgIG51bWJlcmluZ1N5c3RlbSxcbiAgICAgIG91dHB1dENhbGVuZGFyXG4gICAgfSk7XG4gICAgcmV0dXJuIGNsb25lJDEodGhpcywge1xuICAgICAgbG9jXG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIFwiU2V0XCIgdGhlIGxvY2FsZS4gUmV0dXJucyBhIG5ld2x5LWNvbnN0cnVjdGVkIERhdGVUaW1lLlxuICAgKiBKdXN0IGEgY29udmVuaWVudCBhbGlhcyBmb3IgcmVjb25maWd1cmUoeyBsb2NhbGUgfSlcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLnNldExvY2FsZSgnZW4tR0InKVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG5cblxuICBzZXRMb2NhbGUobG9jYWxlKSB7XG4gICAgcmV0dXJuIHRoaXMucmVjb25maWd1cmUoe1xuICAgICAgbG9jYWxlXG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIFwiU2V0XCIgdGhlIHZhbHVlcyBvZiBzcGVjaWZpZWQgdW5pdHMuIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBEYXRlVGltZS5cbiAgICogWW91IGNhbiBvbmx5IHNldCB1bml0cyB3aXRoIHRoaXMgbWV0aG9kOyBmb3IgXCJzZXR0aW5nXCIgbWV0YWRhdGEsIHNlZSB7QGxpbmsgcmVjb25maWd1cmV9IGFuZCB7QGxpbmsgc2V0Wm9uZX0uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZXMgLSBhIG1hcHBpbmcgb2YgdW5pdHMgdG8gbnVtYmVyc1xuICAgKiBAZXhhbXBsZSBkdC5zZXQoeyB5ZWFyOiAyMDE3IH0pXG4gICAqIEBleGFtcGxlIGR0LnNldCh7IGhvdXI6IDgsIG1pbnV0ZTogMzAgfSlcbiAgICogQGV4YW1wbGUgZHQuc2V0KHsgd2Vla2RheTogNSB9KVxuICAgKiBAZXhhbXBsZSBkdC5zZXQoeyB5ZWFyOiAyMDA1LCBvcmRpbmFsOiAyMzQgfSlcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuXG5cbiAgc2V0KHZhbHVlcykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplT2JqZWN0KHZhbHVlcywgbm9ybWFsaXplVW5pdCwgW10pLFxuICAgICAgICAgIHNldHRpbmdXZWVrU3R1ZmYgPSAhaXNVbmRlZmluZWQobm9ybWFsaXplZC53ZWVrWWVhcikgfHwgIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQud2Vla051bWJlcikgfHwgIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQud2Vla2RheSk7XG4gICAgbGV0IG1peGVkO1xuXG4gICAgaWYgKHNldHRpbmdXZWVrU3R1ZmYpIHtcbiAgICAgIG1peGVkID0gd2Vla1RvR3JlZ29yaWFuKE9iamVjdC5hc3NpZ24oZ3JlZ29yaWFuVG9XZWVrKHRoaXMuYyksIG5vcm1hbGl6ZWQpKTtcbiAgICB9IGVsc2UgaWYgKCFpc1VuZGVmaW5lZChub3JtYWxpemVkLm9yZGluYWwpKSB7XG4gICAgICBtaXhlZCA9IG9yZGluYWxUb0dyZWdvcmlhbihPYmplY3QuYXNzaWduKGdyZWdvcmlhblRvT3JkaW5hbCh0aGlzLmMpLCBub3JtYWxpemVkKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1peGVkID0gT2JqZWN0LmFzc2lnbih0aGlzLnRvT2JqZWN0KCksIG5vcm1hbGl6ZWQpOyAvLyBpZiB3ZSBkaWRuJ3Qgc2V0IHRoZSBkYXkgYnV0IHdlIGVuZGVkIHVwIG9uIGFuIG92ZXJmbG93IGRhdGUsXG4gICAgICAvLyB1c2UgdGhlIGxhc3QgZGF5IG9mIHRoZSByaWdodCBtb250aFxuXG4gICAgICBpZiAoaXNVbmRlZmluZWQobm9ybWFsaXplZC5kYXkpKSB7XG4gICAgICAgIG1peGVkLmRheSA9IE1hdGgubWluKGRheXNJbk1vbnRoKG1peGVkLnllYXIsIG1peGVkLm1vbnRoKSwgbWl4ZWQuZGF5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBbdHMsIG9dID0gb2JqVG9UUyhtaXhlZCwgdGhpcy5vLCB0aGlzLnpvbmUpO1xuICAgIHJldHVybiBjbG9uZSQxKHRoaXMsIHtcbiAgICAgIHRzLFxuICAgICAgb1xuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBBZGQgYSBwZXJpb2Qgb2YgdGltZSB0byB0aGlzIERhdGVUaW1lIGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyBEYXRlVGltZVxuICAgKlxuICAgKiBBZGRpbmcgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIG9yIG1pbGxpc2Vjb25kcyBpbmNyZWFzZXMgdGhlIHRpbWVzdGFtcCBieSB0aGUgcmlnaHQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy4gQWRkaW5nIGRheXMsIG1vbnRocywgb3IgeWVhcnMgc2hpZnRzIHRoZSBjYWxlbmRhciwgYWNjb3VudGluZyBmb3IgRFNUcyBhbmQgbGVhcCB5ZWFycyBhbG9uZyB0aGUgd2F5LiBUaHVzLCBgZHQucGx1cyh7IGhvdXJzOiAyNCB9KWAgbWF5IHJlc3VsdCBpbiBhIGRpZmZlcmVudCB0aW1lIHRoYW4gYGR0LnBsdXMoeyBkYXlzOiAxIH0pYCBpZiB0aGVyZSdzIGEgRFNUIHNoaWZ0IGluIGJldHdlZW4uXG4gICAqIEBwYXJhbSB7RHVyYXRpb258T2JqZWN0fG51bWJlcn0gZHVyYXRpb24gLSBUaGUgYW1vdW50IHRvIGFkZC4gRWl0aGVyIGEgTHV4b24gRHVyYXRpb24sIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcywgdGhlIG9iamVjdCBhcmd1bWVudCB0byBEdXJhdGlvbi5mcm9tT2JqZWN0KClcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkucGx1cygxMjMpIC8vfj4gaW4gMTIzIG1pbGxpc2Vjb25kc1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5wbHVzKHsgbWludXRlczogMTUgfSkgLy9+PiBpbiAxNSBtaW51dGVzXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnBsdXMoeyBkYXlzOiAxIH0pIC8vfj4gdGhpcyB0aW1lIHRvbW9ycm93XG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnBsdXMoeyBkYXlzOiAtMSB9KSAvL34+IHRoaXMgdGltZSB5ZXN0ZXJkYXlcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkucGx1cyh7IGhvdXJzOiAzLCBtaW51dGVzOiAxMyB9KSAvL34+IGluIDMgaHIsIDEzIG1pblxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5wbHVzKER1cmF0aW9uLmZyb21PYmplY3QoeyBob3VyczogMywgbWludXRlczogMTMgfSkpIC8vfj4gaW4gMyBociwgMTMgbWluXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cblxuXG4gIHBsdXMoZHVyYXRpb24pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgY29uc3QgZHVyID0gZnJpZW5kbHlEdXJhdGlvbihkdXJhdGlvbik7XG4gICAgcmV0dXJuIGNsb25lJDEodGhpcywgYWRqdXN0VGltZSh0aGlzLCBkdXIpKTtcbiAgfVxuICAvKipcbiAgICogU3VidHJhY3QgYSBwZXJpb2Qgb2YgdGltZSB0byB0aGlzIERhdGVUaW1lIGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyBEYXRlVGltZVxuICAgKiBTZWUge0BsaW5rIHBsdXN9XG4gICAqIEBwYXJhbSB7RHVyYXRpb258T2JqZWN0fG51bWJlcn0gZHVyYXRpb24gLSBUaGUgYW1vdW50IHRvIHN1YnRyYWN0LiBFaXRoZXIgYSBMdXhvbiBEdXJhdGlvbiwgYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLCB0aGUgb2JqZWN0IGFyZ3VtZW50IHRvIER1cmF0aW9uLmZyb21PYmplY3QoKVxuICAgQHJldHVybiB7RGF0ZVRpbWV9XG4gICovXG5cblxuICBtaW51cyhkdXJhdGlvbikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICBjb25zdCBkdXIgPSBmcmllbmRseUR1cmF0aW9uKGR1cmF0aW9uKS5uZWdhdGUoKTtcbiAgICByZXR1cm4gY2xvbmUkMSh0aGlzLCBhZGp1c3RUaW1lKHRoaXMsIGR1cikpO1xuICB9XG4gIC8qKlxuICAgKiBcIlNldFwiIHRoaXMgRGF0ZVRpbWUgdG8gdGhlIGJlZ2lubmluZyBvZiBhIHVuaXQgb2YgdGltZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuaXQgLSBUaGUgdW5pdCB0byBnbyB0byB0aGUgYmVnaW5uaW5nIG9mLiBDYW4gYmUgJ3llYXInLCAncXVhcnRlcicsICdtb250aCcsICd3ZWVrJywgJ2RheScsICdob3VyJywgJ21pbnV0ZScsICdzZWNvbmQnLCBvciAnbWlsbGlzZWNvbmQnLlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzKS5zdGFydE9mKCdtb250aCcpLnRvSVNPRGF0ZSgpOyAvLz0+ICcyMDE0LTAzLTAxJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzKS5zdGFydE9mKCd5ZWFyJykudG9JU09EYXRlKCk7IC8vPT4gJzIwMTQtMDEtMDEnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMpLnN0YXJ0T2YoJ3dlZWsnKS50b0lTT0RhdGUoKTsgLy89PiAnMjAxNC0wMy0wMycsIHdlZWtzIGFsd2F5cyBzdGFydCBvbiBNb25kYXlzXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMsIDUsIDMwKS5zdGFydE9mKCdkYXknKS50b0lTT1RpbWUoKTsgLy89PiAnMDA6MDAuMDAwLTA1OjAwJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzLCA1LCAzMCkuc3RhcnRPZignaG91cicpLnRvSVNPVGltZSgpOyAvLz0+ICcwNTowMDowMC4wMDAtMDU6MDAnXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cblxuXG4gIHN0YXJ0T2YodW5pdCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICBjb25zdCBvID0ge30sXG4gICAgICAgICAgbm9ybWFsaXplZFVuaXQgPSBEdXJhdGlvbi5ub3JtYWxpemVVbml0KHVuaXQpO1xuXG4gICAgc3dpdGNoIChub3JtYWxpemVkVW5pdCkge1xuICAgICAgY2FzZSBcInllYXJzXCI6XG4gICAgICAgIG8ubW9udGggPSAxO1xuICAgICAgLy8gZmFsbHMgdGhyb3VnaFxuXG4gICAgICBjYXNlIFwicXVhcnRlcnNcIjpcbiAgICAgIGNhc2UgXCJtb250aHNcIjpcbiAgICAgICAgby5kYXkgPSAxO1xuICAgICAgLy8gZmFsbHMgdGhyb3VnaFxuXG4gICAgICBjYXNlIFwid2Vla3NcIjpcbiAgICAgIGNhc2UgXCJkYXlzXCI6XG4gICAgICAgIG8uaG91ciA9IDA7XG4gICAgICAvLyBmYWxscyB0aHJvdWdoXG5cbiAgICAgIGNhc2UgXCJob3Vyc1wiOlxuICAgICAgICBvLm1pbnV0ZSA9IDA7XG4gICAgICAvLyBmYWxscyB0aHJvdWdoXG5cbiAgICAgIGNhc2UgXCJtaW51dGVzXCI6XG4gICAgICAgIG8uc2Vjb25kID0gMDtcbiAgICAgIC8vIGZhbGxzIHRocm91Z2hcblxuICAgICAgY2FzZSBcInNlY29uZHNcIjpcbiAgICAgICAgby5taWxsaXNlY29uZCA9IDA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgLy8gbm8gZGVmYXVsdCwgaW52YWxpZCB1bml0cyB0aHJvdyBpbiBub3JtYWxpemVVbml0KClcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFVuaXQgPT09IFwid2Vla3NcIikge1xuICAgICAgby53ZWVrZGF5ID0gMTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFVuaXQgPT09IFwicXVhcnRlcnNcIikge1xuICAgICAgY29uc3QgcSA9IE1hdGguY2VpbCh0aGlzLm1vbnRoIC8gMyk7XG4gICAgICBvLm1vbnRoID0gKHEgLSAxKSAqIDMgKyAxO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNldChvKTtcbiAgfVxuICAvKipcbiAgICogXCJTZXRcIiB0aGlzIERhdGVUaW1lIHRvIHRoZSBlbmQgKG1lYW5pbmcgdGhlIGxhc3QgbWlsbGlzZWNvbmQpIG9mIGEgdW5pdCBvZiB0aW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gVGhlIHVuaXQgdG8gZ28gdG8gdGhlIGVuZCBvZi4gQ2FuIGJlICd5ZWFyJywgJ3F1YXJ0ZXInLCAnbW9udGgnLCAnd2VlaycsICdkYXknLCAnaG91cicsICdtaW51dGUnLCAnc2Vjb25kJywgb3IgJ21pbGxpc2Vjb25kJy5cbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMykuZW5kT2YoJ21vbnRoJykudG9JU08oKTsgLy89PiAnMjAxNC0wMy0zMVQyMzo1OTo1OS45OTktMDU6MDAnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMpLmVuZE9mKCd5ZWFyJykudG9JU08oKTsgLy89PiAnMjAxNC0xMi0zMVQyMzo1OTo1OS45OTktMDU6MDAnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMpLmVuZE9mKCd3ZWVrJykudG9JU08oKTsgLy8gPT4gJzIwMTQtMDMtMDlUMjM6NTk6NTkuOTk5LTA1OjAwJywgd2Vla3Mgc3RhcnQgb24gTW9uZGF5c1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzLCA1LCAzMCkuZW5kT2YoJ2RheScpLnRvSVNPKCk7IC8vPT4gJzIwMTQtMDMtMDNUMjM6NTk6NTkuOTk5LTA1OjAwJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzLCA1LCAzMCkuZW5kT2YoJ2hvdXInKS50b0lTTygpOyAvLz0+ICcyMDE0LTAzLTAzVDA1OjU5OjU5Ljk5OS0wNTowMCdcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuXG5cbiAgZW5kT2YodW5pdCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnBsdXMoe1xuICAgICAgW3VuaXRdOiAxXG4gICAgfSkuc3RhcnRPZih1bml0KS5taW51cygxKSA6IHRoaXM7XG4gIH0gLy8gT1VUUFVUXG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgZm9ybWF0IHN0cmluZy5cbiAgICogKipZb3UgbWF5IG5vdCB3YW50IHRoaXMuKiogU2VlIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9yIGEgbW9yZSBmbGV4aWJsZSBmb3JtYXR0aW5nIHRvb2wuIEZvciBhIHRhYmxlIG9mIHRva2VucyBhbmQgdGhlaXIgaW50ZXJwcmV0YXRpb25zLCBzZWUgW2hlcmVdKGh0dHBzOi8vbW9tZW50LmdpdGh1Yi5pby9sdXhvbi9kb2NzL21hbnVhbC9mb3JtYXR0aW5nLmh0bWwjdGFibGUtb2YtdG9rZW5zKS5cbiAgICogRGVmYXVsdHMgdG8gZW4tVVMgaWYgbm8gbG9jYWxlIGhhcyBiZWVuIHNwZWNpZmllZCwgcmVnYXJkbGVzcyBvZiB0aGUgc3lzdGVtJ3MgbG9jYWxlLlxuICAgKiBAc2VlIGh0dHBzOi8vbW9tZW50LmdpdGh1Yi5pby9sdXhvbi9kb2NzL21hbnVhbC9mb3JtYXR0aW5nLmh0bWwjdGFibGUtb2YtdG9rZW5zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbXQgLSB0aGUgZm9ybWF0IHN0cmluZ1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdHMgdG8gb3ZlcnJpZGUgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b0Zvcm1hdCgneXl5eSBMTEwgZGQnKSAvLz0+ICcyMDE3IEFwciAyMidcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkuc2V0TG9jYWxlKCdmcicpLnRvRm9ybWF0KCd5eXl5IExMTCBkZCcpIC8vPT4gJzIwMTcgYXZyLiAyMidcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9Gb3JtYXQoJ3l5eXkgTExMIGRkJywgeyBsb2NhbGU6IFwiZnJcIiB9KSAvLz0+ICcyMDE3IGF2ci4gMjInXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvRm9ybWF0KFwiSEggJ2hvdXJzIGFuZCcgbW0gJ21pbnV0ZXMnXCIpIC8vPT4gJzIwIGhvdXJzIGFuZCA1NSBtaW51dGVzJ1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuXG5cbiAgdG9Gb3JtYXQoZm10LCBvcHRzID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gRm9ybWF0dGVyLmNyZWF0ZSh0aGlzLmxvYy5yZWRlZmF1bHRUb0VOKG9wdHMpKS5mb3JtYXREYXRlVGltZUZyb21TdHJpbmcodGhpcywgZm10KSA6IElOVkFMSUQkMjtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIGxvY2FsaXplZCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoaXMgZGF0ZS4gQWNjZXB0cyB0aGUgc2FtZSBvcHRpb25zIGFzIHRoZSBJbnRsLkRhdGVUaW1lRm9ybWF0IGNvbnN0cnVjdG9yIGFuZCBhbnkgcHJlc2V0cyBkZWZpbmVkIGJ5IEx1eG9uLCBzdWNoIGFzIGBEYXRlVGltZS5EQVRFX0ZVTExgIG9yIGBEYXRlVGltZS5USU1FX1NJTVBMRWAuXG4gICAqIFRoZSBleGFjdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyBicm93c2VyLXNwZWNpZmljLCBidXQgaW4gZ2VuZXJhbCBpdCB3aWxsIHJldHVybiBhbiBhcHByb3ByaWF0ZSByZXByZXNlbnRhdGlvblxuICAgKiBvZiB0aGUgRGF0ZVRpbWUgaW4gdGhlIGFzc2lnbmVkIGxvY2FsZS5cbiAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXG4gICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZVRpbWVGb3JtYXRcbiAgICogQHBhcmFtIG9wdHMge09iamVjdH0gLSBJbnRsLkRhdGVUaW1lRm9ybWF0IGNvbnN0cnVjdG9yIG9wdGlvbnMgYW5kIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b0xvY2FsZVN0cmluZygpOyAvLz0+IDQvMjAvMjAxN1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5zZXRMb2NhbGUoJ2VuLWdiJykudG9Mb2NhbGVTdHJpbmcoKTsgLy89PiAnMjAvMDQvMjAxNydcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9Mb2NhbGVTdHJpbmcoeyBsb2NhbGU6ICdlbi1nYicgfSk7IC8vPT4gJzIwLzA0LzIwMTcnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvTG9jYWxlU3RyaW5nKERhdGVUaW1lLkRBVEVfRlVMTCk7IC8vPT4gJ0FwcmlsIDIwLCAyMDE3J1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b0xvY2FsZVN0cmluZyhEYXRlVGltZS5USU1FX1NJTVBMRSk7IC8vPT4gJzExOjMyIEFNJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b0xvY2FsZVN0cmluZyhEYXRlVGltZS5EQVRFVElNRV9TSE9SVCk7IC8vPT4gJzQvMjAvMjAxNywgMTE6MzIgQU0nXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvTG9jYWxlU3RyaW5nKHsgd2Vla2RheTogJ2xvbmcnLCBtb250aDogJ2xvbmcnLCBkYXk6ICcyLWRpZ2l0JyB9KTsgLy89PiAnVGh1cnNkYXksIEFwcmlsIDIwJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b0xvY2FsZVN0cmluZyh7IHdlZWtkYXk6ICdzaG9ydCcsIG1vbnRoOiAnc2hvcnQnLCBkYXk6ICcyLWRpZ2l0JywgaG91cjogJzItZGlnaXQnLCBtaW51dGU6ICcyLWRpZ2l0JyB9KTsgLy89PiAnVGh1LCBBcHIgMjAsIDExOjI3IEFNJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b0xvY2FsZVN0cmluZyh7IGhvdXI6ICcyLWRpZ2l0JywgbWludXRlOiAnMi1kaWdpdCcsIGhvdXIxMjogZmFsc2UgfSk7IC8vPT4gJzExOjMyJ1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuXG5cbiAgdG9Mb2NhbGVTdHJpbmcob3B0cyA9IERBVEVfU0hPUlQpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gRm9ybWF0dGVyLmNyZWF0ZSh0aGlzLmxvYy5jbG9uZShvcHRzKSwgb3B0cykuZm9ybWF0RGF0ZVRpbWUodGhpcykgOiBJTlZBTElEJDI7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gYXJyYXkgb2YgZm9ybWF0IFwicGFydHNcIiwgbWVhbmluZyBpbmRpdmlkdWFsIHRva2VucyBhbG9uZyB3aXRoIG1ldGFkYXRhLiBUaGlzIGlzIGFsbG93cyBjYWxsZXJzIHRvIHBvc3QtcHJvY2VzcyBpbmRpdmlkdWFsIHNlY3Rpb25zIG9mIHRoZSBmb3JtYXR0ZWQgb3V0cHV0LlxuICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcbiAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9EYXRlVGltZUZvcm1hdC9mb3JtYXRUb1BhcnRzXG4gICAqIEBwYXJhbSBvcHRzIHtPYmplY3R9IC0gSW50bC5EYXRlVGltZUZvcm1hdCBjb25zdHJ1Y3RvciBvcHRpb25zLCBzYW1lIGFzIGB0b0xvY2FsZVN0cmluZ2AuXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvTG9jYWxlUGFydHMoKTsgLy89PiBbXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLz0+ICAgeyB0eXBlOiAnZGF5JywgdmFsdWU6ICcyNScgfSxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vPT4gICB7IHR5cGU6ICdsaXRlcmFsJywgdmFsdWU6ICcvJyB9LFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy89PiAgIHsgdHlwZTogJ21vbnRoJywgdmFsdWU6ICcwNScgfSxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vPT4gICB7IHR5cGU6ICdsaXRlcmFsJywgdmFsdWU6ICcvJyB9LFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy89PiAgIHsgdHlwZTogJ3llYXInLCB2YWx1ZTogJzE5ODInIH1cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vPT4gXVxuICAgKi9cblxuXG4gIHRvTG9jYWxlUGFydHMob3B0cyA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IEZvcm1hdHRlci5jcmVhdGUodGhpcy5sb2MuY2xvbmUob3B0cyksIG9wdHMpLmZvcm1hdERhdGVUaW1lUGFydHModGhpcykgOiBbXTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhbiBJU08gODYwMS1jb21wbGlhbnQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWVcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuc3VwcHJlc3NNaWxsaXNlY29uZHM9ZmFsc2VdIC0gZXhjbHVkZSBtaWxsaXNlY29uZHMgZnJvbSB0aGUgZm9ybWF0IGlmIHRoZXkncmUgMFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnN1cHByZXNzU2Vjb25kcz1mYWxzZV0gLSBleGNsdWRlIHNlY29uZHMgZnJvbSB0aGUgZm9ybWF0IGlmIHRoZXkncmUgMFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmluY2x1ZGVPZmZzZXQ9dHJ1ZV0gLSBpbmNsdWRlIHRoZSBvZmZzZXQsIHN1Y2ggYXMgJ1onIG9yICctMDQ6MDAnXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5mb3JtYXQ9J2V4dGVuZGVkJ10gLSBjaG9vc2UgYmV0d2VlbiB0aGUgYmFzaWMgYW5kIGV4dGVuZGVkIGZvcm1hdFxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMTk4MiwgNSwgMjUpLnRvSVNPKCkgLy89PiAnMTk4Mi0wNS0yNVQwMDowMDowMC4wMDBaJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b0lTTygpIC8vPT4gJzIwMTctMDQtMjJUMjA6NDc6MDUuMzM1LTA0OjAwJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b0lTTyh7IGluY2x1ZGVPZmZzZXQ6IGZhbHNlIH0pIC8vPT4gJzIwMTctMDQtMjJUMjA6NDc6MDUuMzM1J1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b0lTTyh7IGZvcm1hdDogJ2Jhc2ljJyB9KSAvLz0+ICcyMDE3MDQyMlQyMDQ3MDUuMzM1LTA0MDAnXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG5cblxuICB0b0lTTyhvcHRzID0ge30pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke3RoaXMudG9JU09EYXRlKG9wdHMpfVQke3RoaXMudG9JU09UaW1lKG9wdHMpfWA7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lJ3MgZGF0ZSBjb21wb25lbnRcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5mb3JtYXQ9J2V4dGVuZGVkJ10gLSBjaG9vc2UgYmV0d2VlbiB0aGUgYmFzaWMgYW5kIGV4dGVuZGVkIGZvcm1hdFxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMTk4MiwgNSwgMjUpLnRvSVNPRGF0ZSgpIC8vPT4gJzE5ODItMDUtMjUnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygxOTgyLCA1LCAyNSkudG9JU09EYXRlKHsgZm9ybWF0OiAnYmFzaWMnIH0pIC8vPT4gJzE5ODIwNTI1J1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuXG5cbiAgdG9JU09EYXRlKHtcbiAgICBmb3JtYXQgPSBcImV4dGVuZGVkXCJcbiAgfSA9IHt9KSB7XG4gICAgbGV0IGZtdCA9IGZvcm1hdCA9PT0gXCJiYXNpY1wiID8gXCJ5eXl5TU1kZFwiIDogXCJ5eXl5LU1NLWRkXCI7XG5cbiAgICBpZiAodGhpcy55ZWFyID4gOTk5OSkge1xuICAgICAgZm10ID0gXCIrXCIgKyBmbXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRvVGVjaEZvcm1hdCh0aGlzLCBmbXQpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIElTTyA4NjAxLWNvbXBsaWFudCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSdzIHdlZWsgZGF0ZVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMTk4MiwgNSwgMjUpLnRvSVNPV2Vla0RhdGUoKSAvLz0+ICcxOTgyLVcyMS0yJ1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuXG5cbiAgdG9JU09XZWVrRGF0ZSgpIHtcbiAgICByZXR1cm4gdG9UZWNoRm9ybWF0KHRoaXMsIFwia2tray0nVydXVy1jXCIpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIElTTyA4NjAxLWNvbXBsaWFudCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSdzIHRpbWUgY29tcG9uZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnN1cHByZXNzTWlsbGlzZWNvbmRzPWZhbHNlXSAtIGV4Y2x1ZGUgbWlsbGlzZWNvbmRzIGZyb20gdGhlIGZvcm1hdCBpZiB0aGV5J3JlIDBcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zdXBwcmVzc1NlY29uZHM9ZmFsc2VdIC0gZXhjbHVkZSBzZWNvbmRzIGZyb20gdGhlIGZvcm1hdCBpZiB0aGV5J3JlIDBcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlT2Zmc2V0PXRydWVdIC0gaW5jbHVkZSB0aGUgb2Zmc2V0LCBzdWNoIGFzICdaJyBvciAnLTA0OjAwJ1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmluY2x1ZGVQcmVmaXg9ZmFsc2VdIC0gaW5jbHVkZSB0aGUgYFRgIHByZWZpeFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuZm9ybWF0PSdleHRlbmRlZCddIC0gY2hvb3NlIGJldHdlZW4gdGhlIGJhc2ljIGFuZCBleHRlbmRlZCBmb3JtYXRcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKCkuc2V0KHsgaG91cjogNywgbWludXRlOiAzNCB9KS50b0lTT1RpbWUoKSAvLz0+ICcwNzozNDoxOS4zNjFaJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoKS5zZXQoeyBob3VyOiA3LCBtaW51dGU6IDM0LCBzZWNvbmRzOiAwLCBtaWxsaXNlY29uZHM6IDAgfSkudG9JU09UaW1lKHsgc3VwcHJlc3NTZWNvbmRzOiB0cnVlIH0pIC8vPT4gJzA3OjM0WidcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKCkuc2V0KHsgaG91cjogNywgbWludXRlOiAzNCB9KS50b0lTT1RpbWUoeyBmb3JtYXQ6ICdiYXNpYycgfSkgLy89PiAnMDczNDE5LjM2MVonXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygpLnNldCh7IGhvdXI6IDcsIG1pbnV0ZTogMzQgfSkudG9JU09UaW1lKHsgaW5jbHVkZVByZWZpeDogdHJ1ZSB9KSAvLz0+ICdUMDc6MzQ6MTkuMzYxWidcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cblxuXG4gIHRvSVNPVGltZSh7XG4gICAgc3VwcHJlc3NNaWxsaXNlY29uZHMgPSBmYWxzZSxcbiAgICBzdXBwcmVzc1NlY29uZHMgPSBmYWxzZSxcbiAgICBpbmNsdWRlT2Zmc2V0ID0gdHJ1ZSxcbiAgICBpbmNsdWRlUHJlZml4ID0gZmFsc2UsXG4gICAgZm9ybWF0ID0gXCJleHRlbmRlZFwiXG4gIH0gPSB7fSkge1xuICAgIHJldHVybiB0b1RlY2hUaW1lRm9ybWF0KHRoaXMsIHtcbiAgICAgIHN1cHByZXNzU2Vjb25kcyxcbiAgICAgIHN1cHByZXNzTWlsbGlzZWNvbmRzLFxuICAgICAgaW5jbHVkZU9mZnNldCxcbiAgICAgIGluY2x1ZGVQcmVmaXgsXG4gICAgICBmb3JtYXRcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhbiBSRkMgMjgyMi1jb21wYXRpYmxlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lLCBhbHdheXMgaW4gVVRDXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE0LCA3LCAxMykudG9SRkMyODIyKCkgLy89PiAnU3VuLCAxMyBKdWwgMjAxNCAwMDowMDowMCArMDAwMCdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgNywgMTMpLnRvUkZDMjgyMigpIC8vPT4gJ1N1biwgMTMgSnVsIDIwMTQgMDA6MDA6MDAgLTA0MDAnXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG5cblxuICB0b1JGQzI4MjIoKSB7XG4gICAgcmV0dXJuIHRvVGVjaEZvcm1hdCh0aGlzLCBcIkVFRSwgZGQgTExMIHl5eXkgSEg6bW06c3MgWlpaXCIsIGZhbHNlKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGFwcHJvcHJpYXRlIGZvciB1c2UgaW4gSFRUUCBoZWFkZXJzLlxuICAgKiBTcGVjaWZpY2FsbHksIHRoZSBzdHJpbmcgY29uZm9ybXMgdG8gUkZDIDExMjMuXG4gICAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1Byb3RvY29scy9yZmMyNjE2L3JmYzI2MTYtc2VjMy5odG1sI3NlYzMuMy4xXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE0LCA3LCAxMykudG9IVFRQKCkgLy89PiAnU3VuLCAxMyBKdWwgMjAxNCAwMDowMDowMCBHTVQnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE0LCA3LCAxMywgMTkpLnRvSFRUUCgpIC8vPT4gJ1N1biwgMTMgSnVsIDIwMTQgMTk6MDA6MDAgR01UJ1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuXG5cbiAgdG9IVFRQKCkge1xuICAgIHJldHVybiB0b1RlY2hGb3JtYXQodGhpcy50b1VUQygpLCBcIkVFRSwgZGQgTExMIHl5eXkgSEg6bW06c3MgJ0dNVCdcIik7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIFNRTCBEYXRlXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE0LCA3LCAxMykudG9TUUxEYXRlKCkgLy89PiAnMjAxNC0wNy0xMydcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cblxuXG4gIHRvU1FMRGF0ZSgpIHtcbiAgICByZXR1cm4gdG9UZWNoRm9ybWF0KHRoaXMsIFwieXl5eS1NTS1kZFwiKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGFwcHJvcHJpYXRlIGZvciB1c2UgaW4gU1FMIFRpbWVcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaW5jbHVkZVpvbmU9ZmFsc2VdIC0gaW5jbHVkZSB0aGUgem9uZSwgc3VjaCBhcyAnQW1lcmljYS9OZXdfWW9yaycuIE92ZXJyaWRlcyBpbmNsdWRlT2Zmc2V0LlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmluY2x1ZGVPZmZzZXQ9dHJ1ZV0gLSBpbmNsdWRlIHRoZSBvZmZzZXQsIHN1Y2ggYXMgJ1onIG9yICctMDQ6MDAnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygpLnRvU1FMKCkgLy89PiAnMDU6MTU6MTYuMzQ1J1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b1NRTCgpIC8vPT4gJzA1OjE1OjE2LjM0NSAtMDQ6MDAnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvU1FMKHsgaW5jbHVkZU9mZnNldDogZmFsc2UgfSkgLy89PiAnMDU6MTU6MTYuMzQ1J1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b1NRTCh7IGluY2x1ZGVab25lOiBmYWxzZSB9KSAvLz0+ICcwNToxNToxNi4zNDUgQW1lcmljYS9OZXdfWW9yaydcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cblxuXG4gIHRvU1FMVGltZSh7XG4gICAgaW5jbHVkZU9mZnNldCA9IHRydWUsXG4gICAgaW5jbHVkZVpvbmUgPSBmYWxzZVxuICB9ID0ge30pIHtcbiAgICByZXR1cm4gdG9UZWNoVGltZUZvcm1hdCh0aGlzLCB7XG4gICAgICBpbmNsdWRlT2Zmc2V0LFxuICAgICAgaW5jbHVkZVpvbmUsXG4gICAgICBzcGFjZVpvbmU6IHRydWVcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGFwcHJvcHJpYXRlIGZvciB1c2UgaW4gU1FMIERhdGVUaW1lXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmluY2x1ZGVab25lPWZhbHNlXSAtIGluY2x1ZGUgdGhlIHpvbmUsIHN1Y2ggYXMgJ0FtZXJpY2EvTmV3X1lvcmsnLiBPdmVycmlkZXMgaW5jbHVkZU9mZnNldC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlT2Zmc2V0PXRydWVdIC0gaW5jbHVkZSB0aGUgb2Zmc2V0LCBzdWNoIGFzICdaJyBvciAnLTA0OjAwJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNCwgNywgMTMpLnRvU1FMKCkgLy89PiAnMjAxNC0wNy0xMyAwMDowMDowMC4wMDAgWidcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgNywgMTMpLnRvU1FMKCkgLy89PiAnMjAxNC0wNy0xMyAwMDowMDowMC4wMDAgLTA0OjAwJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCA3LCAxMykudG9TUUwoeyBpbmNsdWRlT2Zmc2V0OiBmYWxzZSB9KSAvLz0+ICcyMDE0LTA3LTEzIDAwOjAwOjAwLjAwMCdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgNywgMTMpLnRvU1FMKHsgaW5jbHVkZVpvbmU6IHRydWUgfSkgLy89PiAnMjAxNC0wNy0xMyAwMDowMDowMC4wMDAgQW1lcmljYS9OZXdfWW9yaydcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cblxuXG4gIHRvU1FMKG9wdHMgPSB7fSkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7dGhpcy50b1NRTERhdGUoKX0gJHt0aGlzLnRvU1FMVGltZShvcHRzKX1gO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWUgYXBwcm9wcmlhdGUgZm9yIGRlYnVnZ2luZ1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuXG5cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudG9JU08oKSA6IElOVkFMSUQkMjtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZXBvY2ggbWlsbGlzZWNvbmRzIG9mIHRoaXMgRGF0ZVRpbWUuIEFsaWFzIG9mIHtAbGluayB0b01pbGxpc31cbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cblxuXG4gIHZhbHVlT2YoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9NaWxsaXMoKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZXBvY2ggbWlsbGlzZWNvbmRzIG9mIHRoaXMgRGF0ZVRpbWUuXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG5cblxuICB0b01pbGxpcygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy50cyA6IE5hTjtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZXBvY2ggc2Vjb25kcyBvZiB0aGlzIERhdGVUaW1lLlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuXG5cbiAgdG9TZWNvbmRzKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnRzIC8gMTAwMCA6IE5hTjtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhbiBJU08gODYwMSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGFwcHJvcHJpYXRlIGZvciB1c2UgaW4gSlNPTi5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cblxuXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b0lTTygpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgQlNPTiBzZXJpYWxpemFibGUgZXF1aXZhbGVudCB0byB0aGlzIERhdGVUaW1lLlxuICAgKiBAcmV0dXJuIHtEYXRlfVxuICAgKi9cblxuXG4gIHRvQlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b0pTRGF0ZSgpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgSmF2YVNjcmlwdCBvYmplY3Qgd2l0aCB0aGlzIERhdGVUaW1lJ3MgeWVhciwgbW9udGgsIGRheSwgYW5kIHNvIG9uLlxuICAgKiBAcGFyYW0gb3B0cyAtIG9wdGlvbnMgZm9yIGdlbmVyYXRpbmcgdGhlIG9iamVjdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmluY2x1ZGVDb25maWc9ZmFsc2VdIC0gaW5jbHVkZSBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZXMgaW4gdGhlIG91dHB1dFxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b09iamVjdCgpIC8vPT4geyB5ZWFyOiAyMDE3LCBtb250aDogNCwgZGF5OiAyMiwgaG91cjogMjAsIG1pbnV0ZTogNDksIHNlY29uZDogNDIsIG1pbGxpc2Vjb25kOiAyNjggfVxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuXG5cbiAgdG9PYmplY3Qob3B0cyA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB7fTtcbiAgICBjb25zdCBiYXNlID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5jKTtcblxuICAgIGlmIChvcHRzLmluY2x1ZGVDb25maWcpIHtcbiAgICAgIGJhc2Uub3V0cHV0Q2FsZW5kYXIgPSB0aGlzLm91dHB1dENhbGVuZGFyO1xuICAgICAgYmFzZS5udW1iZXJpbmdTeXN0ZW0gPSB0aGlzLmxvYy5udW1iZXJpbmdTeXN0ZW07XG4gICAgICBiYXNlLmxvY2FsZSA9IHRoaXMubG9jLmxvY2FsZTtcbiAgICB9XG5cbiAgICByZXR1cm4gYmFzZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIEphdmFTY3JpcHQgRGF0ZSBlcXVpdmFsZW50IHRvIHRoaXMgRGF0ZVRpbWUuXG4gICAqIEByZXR1cm4ge0RhdGV9XG4gICAqL1xuXG5cbiAgdG9KU0RhdGUoKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHRoaXMuaXNWYWxpZCA/IHRoaXMudHMgOiBOYU4pO1xuICB9IC8vIENPTVBBUkVcblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIERhdGVUaW1lcyBhcyBhIER1cmF0aW9uLlxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSBvdGhlckRhdGVUaW1lIC0gdGhlIERhdGVUaW1lIHRvIGNvbXBhcmUgdGhpcyBvbmUgdG9cbiAgICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IFt1bml0PVsnbWlsbGlzZWNvbmRzJ11dIC0gdGhlIHVuaXQgb3IgYXJyYXkgb2YgdW5pdHMgKHN1Y2ggYXMgJ2hvdXJzJyBvciAnZGF5cycpIHRvIGluY2x1ZGUgaW4gdGhlIGR1cmF0aW9uLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgdGhhdCBhZmZlY3QgdGhlIGNyZWF0aW9uIG9mIHRoZSBEdXJhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuY29udmVyc2lvbkFjY3VyYWN5PSdjYXN1YWwnXSAtIHRoZSBjb252ZXJzaW9uIHN5c3RlbSB0byB1c2VcbiAgICogQGV4YW1wbGVcbiAgICogdmFyIGkxID0gRGF0ZVRpbWUuZnJvbUlTTygnMTk4Mi0wNS0yNVQwOTo0NScpLFxuICAgKiAgICAgaTIgPSBEYXRlVGltZS5mcm9tSVNPKCcxOTgzLTEwLTE0VDEwOjMwJyk7XG4gICAqIGkyLmRpZmYoaTEpLnRvT2JqZWN0KCkgLy89PiB7IG1pbGxpc2Vjb25kczogNDM4MDc1MDAwMDAgfVxuICAgKiBpMi5kaWZmKGkxLCAnaG91cnMnKS50b09iamVjdCgpIC8vPT4geyBob3VyczogMTIxNjguNzUgfVxuICAgKiBpMi5kaWZmKGkxLCBbJ21vbnRocycsICdkYXlzJ10pLnRvT2JqZWN0KCkgLy89PiB7IG1vbnRoczogMTYsIGRheXM6IDE5LjAzMTI1IH1cbiAgICogaTIuZGlmZihpMSwgWydtb250aHMnLCAnZGF5cycsICdob3VycyddKS50b09iamVjdCgpIC8vPT4geyBtb250aHM6IDE2LCBkYXlzOiAxOSwgaG91cnM6IDAuNzUgfVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG5cblxuICBkaWZmKG90aGVyRGF0ZVRpbWUsIHVuaXQgPSBcIm1pbGxpc2Vjb25kc1wiLCBvcHRzID0ge30pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCB8fCAhb3RoZXJEYXRlVGltZS5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gRHVyYXRpb24uaW52YWxpZCh0aGlzLmludmFsaWQgfHwgb3RoZXJEYXRlVGltZS5pbnZhbGlkLCBcImNyZWF0ZWQgYnkgZGlmZmluZyBhbiBpbnZhbGlkIERhdGVUaW1lXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGR1ck9wdHMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGUsXG4gICAgICBudW1iZXJpbmdTeXN0ZW06IHRoaXMubnVtYmVyaW5nU3lzdGVtXG4gICAgfSwgb3B0cyk7XG4gICAgY29uc3QgdW5pdHMgPSBtYXliZUFycmF5KHVuaXQpLm1hcChEdXJhdGlvbi5ub3JtYWxpemVVbml0KSxcbiAgICAgICAgICBvdGhlcklzTGF0ZXIgPSBvdGhlckRhdGVUaW1lLnZhbHVlT2YoKSA+IHRoaXMudmFsdWVPZigpLFxuICAgICAgICAgIGVhcmxpZXIgPSBvdGhlcklzTGF0ZXIgPyB0aGlzIDogb3RoZXJEYXRlVGltZSxcbiAgICAgICAgICBsYXRlciA9IG90aGVySXNMYXRlciA/IG90aGVyRGF0ZVRpbWUgOiB0aGlzLFxuICAgICAgICAgIGRpZmZlZCA9IGRpZmYoZWFybGllciwgbGF0ZXIsIHVuaXRzLCBkdXJPcHRzKTtcbiAgICByZXR1cm4gb3RoZXJJc0xhdGVyID8gZGlmZmVkLm5lZ2F0ZSgpIDogZGlmZmVkO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIERhdGVUaW1lIGFuZCByaWdodCBub3cuXG4gICAqIFNlZSB7QGxpbmsgZGlmZn1cbiAgICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IFt1bml0PVsnbWlsbGlzZWNvbmRzJ11dIC0gdGhlIHVuaXQgb3IgdW5pdHMgdW5pdHMgKHN1Y2ggYXMgJ2hvdXJzJyBvciAnZGF5cycpIHRvIGluY2x1ZGUgaW4gdGhlIGR1cmF0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUgY3JlYXRpb24gb2YgdGhlIER1cmF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5jb252ZXJzaW9uQWNjdXJhY3k9J2Nhc3VhbCddIC0gdGhlIGNvbnZlcnNpb24gc3lzdGVtIHRvIHVzZVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG5cblxuICBkaWZmTm93KHVuaXQgPSBcIm1pbGxpc2Vjb25kc1wiLCBvcHRzID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5kaWZmKERhdGVUaW1lLm5vdygpLCB1bml0LCBvcHRzKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIGFuIEludGVydmFsIHNwYW5uaW5nIGJldHdlZW4gdGhpcyBEYXRlVGltZSBhbmQgYW5vdGhlciBEYXRlVGltZVxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSBvdGhlckRhdGVUaW1lIC0gdGhlIG90aGVyIGVuZCBwb2ludCBvZiB0aGUgSW50ZXJ2YWxcbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XG4gICAqL1xuXG5cbiAgdW50aWwob3RoZXJEYXRlVGltZSkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKHRoaXMsIG90aGVyRGF0ZVRpbWUpIDogdGhpcztcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBEYXRlVGltZSBpcyBpbiB0aGUgc2FtZSB1bml0IG9mIHRpbWUgYXMgYW5vdGhlciBEYXRlVGltZS5cbiAgICogSGlnaGVyLW9yZGVyIHVuaXRzIG11c3QgYWxzbyBiZSBpZGVudGljYWwgZm9yIHRoaXMgZnVuY3Rpb24gdG8gcmV0dXJuIGB0cnVlYC5cbiAgICogTm90ZSB0aGF0IHRpbWUgem9uZXMgYXJlICoqaWdub3JlZCoqIGluIHRoaXMgY29tcGFyaXNvbiwgd2hpY2ggY29tcGFyZXMgdGhlICoqbG9jYWwqKiBjYWxlbmRhciB0aW1lLiBVc2Uge0BsaW5rIHNldFpvbmV9IHRvIGNvbnZlcnQgb25lIG9mIHRoZSBkYXRlcyBpZiBuZWVkZWQuXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IG90aGVyRGF0ZVRpbWUgLSB0aGUgb3RoZXIgRGF0ZVRpbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuaXQgLSB0aGUgdW5pdCBvZiB0aW1lIHRvIGNoZWNrIHNhbWVuZXNzIG9uXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLmhhc1NhbWUob3RoZXJEVCwgJ2RheScpOyAvL34+IHRydWUgaWYgb3RoZXJEVCBpcyBpbiB0aGUgc2FtZSBjdXJyZW50IGNhbGVuZGFyIGRheVxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cblxuXG4gIGhhc1NhbWUob3RoZXJEYXRlVGltZSwgdW5pdCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgaW5wdXRNcyA9IG90aGVyRGF0ZVRpbWUudmFsdWVPZigpO1xuICAgIGNvbnN0IG90aGVyWm9uZURhdGVUaW1lID0gdGhpcy5zZXRab25lKG90aGVyRGF0ZVRpbWUuem9uZSwge1xuICAgICAga2VlcExvY2FsVGltZTogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiBvdGhlclpvbmVEYXRlVGltZS5zdGFydE9mKHVuaXQpIDw9IGlucHV0TXMgJiYgaW5wdXRNcyA8PSBvdGhlclpvbmVEYXRlVGltZS5lbmRPZih1bml0KTtcbiAgfVxuICAvKipcbiAgICogRXF1YWxpdHkgY2hlY2tcbiAgICogVHdvIERhdGVUaW1lcyBhcmUgZXF1YWwgaWZmIHRoZXkgcmVwcmVzZW50IHRoZSBzYW1lIG1pbGxpc2Vjb25kLCBoYXZlIHRoZSBzYW1lIHpvbmUgYW5kIGxvY2F0aW9uLCBhbmQgYXJlIGJvdGggdmFsaWQuXG4gICAqIFRvIGNvbXBhcmUganVzdCB0aGUgbWlsbGlzZWNvbmQgdmFsdWVzLCB1c2UgYCtkdDEgPT09ICtkdDJgLlxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSBvdGhlciAtIHRoZSBvdGhlciBEYXRlVGltZVxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cblxuXG4gIGVxdWFscyhvdGhlcikge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgJiYgb3RoZXIuaXNWYWxpZCAmJiB0aGlzLnZhbHVlT2YoKSA9PT0gb3RoZXIudmFsdWVPZigpICYmIHRoaXMuem9uZS5lcXVhbHMob3RoZXIuem9uZSkgJiYgdGhpcy5sb2MuZXF1YWxzKG90aGVyLmxvYyk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSB0aGlzIHRpbWUgcmVsYXRpdmUgdG8gbm93LCBzdWNoIGFzIFwiaW4gdHdvIGRheXNcIi4gQ2FuIG9ubHkgaW50ZXJuYXRpb25hbGl6ZSBpZiB5b3VyXG4gICAqIHBsYXRmb3JtIHN1cHBvcnRzIEludGwuUmVsYXRpdmVUaW1lRm9ybWF0LiBSb3VuZHMgZG93biBieSBkZWZhdWx0LlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnMgdGhhdCBhZmZlY3QgdGhlIG91dHB1dFxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSBbb3B0aW9ucy5iYXNlPURhdGVUaW1lLm5vdygpXSAtIHRoZSBEYXRlVGltZSB0byB1c2UgYXMgdGhlIGJhc2lzIHRvIHdoaWNoIHRoaXMgdGltZSBpcyBjb21wYXJlZC4gRGVmYXVsdHMgdG8gbm93LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuc3R5bGU9XCJsb25nXCJdIC0gdGhlIHN0eWxlIG9mIHVuaXRzLCBtdXN0IGJlIFwibG9uZ1wiLCBcInNob3J0XCIsIG9yIFwibmFycm93XCJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMudW5pdCAtIHVzZSBhIHNwZWNpZmljIHVuaXQ7IGlmIG9taXR0ZWQsIHRoZSBtZXRob2Qgd2lsbCBwaWNrIHRoZSB1bml0LiBVc2Ugb25lIG9mIFwieWVhcnNcIiwgXCJxdWFydGVyc1wiLCBcIm1vbnRoc1wiLCBcIndlZWtzXCIsIFwiZGF5c1wiLCBcImhvdXJzXCIsIFwibWludXRlc1wiLCBvciBcInNlY29uZHNcIlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnJvdW5kPXRydWVdIC0gd2hldGhlciB0byByb3VuZCB0aGUgbnVtYmVycyBpbiB0aGUgb3V0cHV0LlxuICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMucGFkZGluZz0wXSAtIHBhZGRpbmcgaW4gbWlsbGlzZWNvbmRzLiBUaGlzIGFsbG93cyB5b3UgdG8gcm91bmQgdXAgdGhlIHJlc3VsdCBpZiBpdCBmaXRzIGluc2lkZSB0aGUgdGhyZXNob2xkLiBEb24ndCB1c2UgaW4gY29tYmluYXRpb24gd2l0aCB7cm91bmQ6IGZhbHNlfSBiZWNhdXNlIHRoZSBkZWNpbWFsIG91dHB1dCB3aWxsIGluY2x1ZGUgdGhlIHBhZGRpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLmxvY2FsZSAtIG92ZXJyaWRlIHRoZSBsb2NhbGUgb2YgdGhpcyBEYXRlVGltZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5udW1iZXJpbmdTeXN0ZW0gLSBvdmVycmlkZSB0aGUgbnVtYmVyaW5nU3lzdGVtIG9mIHRoaXMgRGF0ZVRpbWUuIFRoZSBJbnRsIHN5c3RlbSBtYXkgY2hvb3NlIG5vdCB0byBob25vciB0aGlzXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnBsdXMoeyBkYXlzOiAxIH0pLnRvUmVsYXRpdmUoKSAvLz0+IFwiaW4gMSBkYXlcIlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5zZXRMb2NhbGUoXCJlc1wiKS50b1JlbGF0aXZlKHsgZGF5czogMSB9KSAvLz0+IFwiZGVudHJvIGRlIDEgZMOtYVwiXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnBsdXMoeyBkYXlzOiAxIH0pLnRvUmVsYXRpdmUoeyBsb2NhbGU6IFwiZnJcIiB9KSAvLz0+IFwiZGFucyAyMyBoZXVyZXNcIlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5taW51cyh7IGRheXM6IDIgfSkudG9SZWxhdGl2ZSgpIC8vPT4gXCIyIGRheXMgYWdvXCJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkubWludXMoeyBkYXlzOiAyIH0pLnRvUmVsYXRpdmUoeyB1bml0OiBcImhvdXJzXCIgfSkgLy89PiBcIjQ4IGhvdXJzIGFnb1wiXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLm1pbnVzKHsgaG91cnM6IDM2IH0pLnRvUmVsYXRpdmUoeyByb3VuZDogZmFsc2UgfSkgLy89PiBcIjEuNSBkYXlzIGFnb1wiXG4gICAqL1xuXG5cbiAgdG9SZWxhdGl2ZShvcHRpb25zID0ge30pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgYmFzZSA9IG9wdGlvbnMuYmFzZSB8fCBEYXRlVGltZS5mcm9tT2JqZWN0KHtcbiAgICAgIHpvbmU6IHRoaXMuem9uZVxuICAgIH0pLFxuICAgICAgICAgIHBhZGRpbmcgPSBvcHRpb25zLnBhZGRpbmcgPyB0aGlzIDwgYmFzZSA/IC1vcHRpb25zLnBhZGRpbmcgOiBvcHRpb25zLnBhZGRpbmcgOiAwO1xuICAgIHJldHVybiBkaWZmUmVsYXRpdmUoYmFzZSwgdGhpcy5wbHVzKHBhZGRpbmcpLCBPYmplY3QuYXNzaWduKG9wdGlvbnMsIHtcbiAgICAgIG51bWVyaWM6IFwiYWx3YXlzXCIsXG4gICAgICB1bml0czogW1wieWVhcnNcIiwgXCJtb250aHNcIiwgXCJkYXlzXCIsIFwiaG91cnNcIiwgXCJtaW51dGVzXCIsIFwic2Vjb25kc1wiXVxuICAgIH0pKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGRhdGUgcmVsYXRpdmUgdG8gdG9kYXksIHN1Y2ggYXMgXCJ5ZXN0ZXJkYXlcIiBvciBcIm5leHQgbW9udGhcIi5cbiAgICogT25seSBpbnRlcm5hdGlvbmFsaXplcyBvbiBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0cyBJbnRsLlJlbGF0aXZlVGltZUZvcm1hdC5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zIHRoYXQgYWZmZWN0IHRoZSBvdXRwdXRcbiAgICogQHBhcmFtIHtEYXRlVGltZX0gW29wdGlvbnMuYmFzZT1EYXRlVGltZS5ub3coKV0gLSB0aGUgRGF0ZVRpbWUgdG8gdXNlIGFzIHRoZSBiYXNpcyB0byB3aGljaCB0aGlzIHRpbWUgaXMgY29tcGFyZWQuIERlZmF1bHRzIHRvIG5vdy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMubG9jYWxlIC0gb3ZlcnJpZGUgdGhlIGxvY2FsZSBvZiB0aGlzIERhdGVUaW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLnVuaXQgLSB1c2UgYSBzcGVjaWZpYyB1bml0OyBpZiBvbWl0dGVkLCB0aGUgbWV0aG9kIHdpbGwgcGljayB0aGUgdW5pdC4gVXNlIG9uZSBvZiBcInllYXJzXCIsIFwicXVhcnRlcnNcIiwgXCJtb250aHNcIiwgXCJ3ZWVrc1wiLCBvciBcImRheXNcIlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5udW1iZXJpbmdTeXN0ZW0gLSBvdmVycmlkZSB0aGUgbnVtYmVyaW5nU3lzdGVtIG9mIHRoaXMgRGF0ZVRpbWUuIFRoZSBJbnRsIHN5c3RlbSBtYXkgY2hvb3NlIG5vdCB0byBob25vciB0aGlzXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnBsdXMoeyBkYXlzOiAxIH0pLnRvUmVsYXRpdmVDYWxlbmRhcigpIC8vPT4gXCJ0b21vcnJvd1wiXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnNldExvY2FsZShcImVzXCIpLnBsdXMoeyBkYXlzOiAxIH0pLnRvUmVsYXRpdmUoKSAvLz0+IFwiXCJtYcOxYW5hXCJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkucGx1cyh7IGRheXM6IDEgfSkudG9SZWxhdGl2ZUNhbGVuZGFyKHsgbG9jYWxlOiBcImZyXCIgfSkgLy89PiBcImRlbWFpblwiXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLm1pbnVzKHsgZGF5czogMiB9KS50b1JlbGF0aXZlQ2FsZW5kYXIoKSAvLz0+IFwiMiBkYXlzIGFnb1wiXG4gICAqL1xuXG5cbiAgdG9SZWxhdGl2ZUNhbGVuZGFyKG9wdGlvbnMgPSB7fSkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gZGlmZlJlbGF0aXZlKG9wdGlvbnMuYmFzZSB8fCBEYXRlVGltZS5mcm9tT2JqZWN0KHtcbiAgICAgIHpvbmU6IHRoaXMuem9uZVxuICAgIH0pLCB0aGlzLCBPYmplY3QuYXNzaWduKG9wdGlvbnMsIHtcbiAgICAgIG51bWVyaWM6IFwiYXV0b1wiLFxuICAgICAgdW5pdHM6IFtcInllYXJzXCIsIFwibW9udGhzXCIsIFwiZGF5c1wiXSxcbiAgICAgIGNhbGVuZGFyeTogdHJ1ZVxuICAgIH0pKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIHRoZSBtaW4gb2Ygc2V2ZXJhbCBkYXRlIHRpbWVzXG4gICAqIEBwYXJhbSB7Li4uRGF0ZVRpbWV9IGRhdGVUaW1lcyAtIHRoZSBEYXRlVGltZXMgZnJvbSB3aGljaCB0byBjaG9vc2UgdGhlIG1pbmltdW1cbiAgICogQHJldHVybiB7RGF0ZVRpbWV9IHRoZSBtaW4gRGF0ZVRpbWUsIG9yIHVuZGVmaW5lZCBpZiBjYWxsZWQgd2l0aCBubyBhcmd1bWVudFxuICAgKi9cblxuXG4gIHN0YXRpYyBtaW4oLi4uZGF0ZVRpbWVzKSB7XG4gICAgaWYgKCFkYXRlVGltZXMuZXZlcnkoRGF0ZVRpbWUuaXNEYXRlVGltZSkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcIm1pbiByZXF1aXJlcyBhbGwgYXJndW1lbnRzIGJlIERhdGVUaW1lc1wiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYmVzdEJ5KGRhdGVUaW1lcywgaSA9PiBpLnZhbHVlT2YoKSwgTWF0aC5taW4pO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG1heCBvZiBzZXZlcmFsIGRhdGUgdGltZXNcbiAgICogQHBhcmFtIHsuLi5EYXRlVGltZX0gZGF0ZVRpbWVzIC0gdGhlIERhdGVUaW1lcyBmcm9tIHdoaWNoIHRvIGNob29zZSB0aGUgbWF4aW11bVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX0gdGhlIG1heCBEYXRlVGltZSwgb3IgdW5kZWZpbmVkIGlmIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50XG4gICAqL1xuXG5cbiAgc3RhdGljIG1heCguLi5kYXRlVGltZXMpIHtcbiAgICBpZiAoIWRhdGVUaW1lcy5ldmVyeShEYXRlVGltZS5pc0RhdGVUaW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFwibWF4IHJlcXVpcmVzIGFsbCBhcmd1bWVudHMgYmUgRGF0ZVRpbWVzXCIpO1xuICAgIH1cblxuICAgIHJldHVybiBiZXN0QnkoZGF0ZVRpbWVzLCBpID0+IGkudmFsdWVPZigpLCBNYXRoLm1heCk7XG4gIH0gLy8gTUlTQ1xuXG4gIC8qKlxuICAgKiBFeHBsYWluIGhvdyBhIHN0cmluZyB3b3VsZCBiZSBwYXJzZWQgYnkgZnJvbUZvcm1hdCgpXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGhlIHN0cmluZyB0byBwYXJzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm10IC0gdGhlIGZvcm1hdCB0aGUgc3RyaW5nIGlzIGV4cGVjdGVkIHRvIGJlIGluIChzZWUgZGVzY3JpcHRpb24pXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9ucyB0YWtlbiBieSBmcm9tRm9ybWF0KClcbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKi9cblxuXG4gIHN0YXRpYyBmcm9tRm9ybWF0RXhwbGFpbih0ZXh0LCBmbXQsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGxvY2FsZSA9IG51bGwsXG4gICAgICBudW1iZXJpbmdTeXN0ZW0gPSBudWxsXG4gICAgfSA9IG9wdGlvbnMsXG4gICAgICAgICAgbG9jYWxlVG9Vc2UgPSBMb2NhbGUuZnJvbU9wdHMoe1xuICAgICAgbG9jYWxlLFxuICAgICAgbnVtYmVyaW5nU3lzdGVtLFxuICAgICAgZGVmYXVsdFRvRU46IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gZXhwbGFpbkZyb21Ub2tlbnMobG9jYWxlVG9Vc2UsIHRleHQsIGZtdCk7XG4gIH1cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHVzZSBmcm9tRm9ybWF0RXhwbGFpbiBpbnN0ZWFkXG4gICAqL1xuXG5cbiAgc3RhdGljIGZyb21TdHJpbmdFeHBsYWluKHRleHQsIGZtdCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIERhdGVUaW1lLmZyb21Gb3JtYXRFeHBsYWluKHRleHQsIGZtdCwgb3B0aW9ucyk7XG4gIH0gLy8gRk9STUFUIFBSRVNFVFNcblxuICAvKipcbiAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAxMC8xNC8xOTgzXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuXG5cbiAgc3RhdGljIGdldCBEQVRFX1NIT1JUKCkge1xuICAgIHJldHVybiBEQVRFX1NIT1JUO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdPY3QgMTQsIDE5ODMnXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuXG5cbiAgc3RhdGljIGdldCBEQVRFX01FRCgpIHtcbiAgICByZXR1cm4gREFURV9NRUQ7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ0ZyaSwgT2N0IDE0LCAxOTgzJ1xuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cblxuXG4gIHN0YXRpYyBnZXQgREFURV9NRURfV0lUSF9XRUVLREFZKCkge1xuICAgIHJldHVybiBEQVRFX01FRF9XSVRIX1dFRUtEQVk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ09jdG9iZXIgMTQsIDE5ODMnXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuXG5cbiAgc3RhdGljIGdldCBEQVRFX0ZVTEwoKSB7XG4gICAgcmV0dXJuIERBVEVfRlVMTDtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnVHVlc2RheSwgT2N0b2JlciAxNCwgMTk4MydcbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG5cblxuICBzdGF0aWMgZ2V0IERBVEVfSFVHRSgpIHtcbiAgICByZXR1cm4gREFURV9IVUdFO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMCBBTScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cblxuXG4gIHN0YXRpYyBnZXQgVElNRV9TSU1QTEUoKSB7XG4gICAgcmV0dXJuIFRJTUVfU0lNUExFO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMDoyMyBBTScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cblxuXG4gIHN0YXRpYyBnZXQgVElNRV9XSVRIX1NFQ09ORFMoKSB7XG4gICAgcmV0dXJuIFRJTUVfV0lUSF9TRUNPTkRTO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMDoyMyBBTSBFRFQnLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG5cblxuICBzdGF0aWMgZ2V0IFRJTUVfV0lUSF9TSE9SVF9PRkZTRVQoKSB7XG4gICAgcmV0dXJuIFRJTUVfV0lUSF9TSE9SVF9PRkZTRVQ7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzA5OjMwOjIzIEFNIEVhc3Rlcm4gRGF5bGlnaHQgVGltZScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cblxuXG4gIHN0YXRpYyBnZXQgVElNRV9XSVRIX0xPTkdfT0ZGU0VUKCkge1xuICAgIHJldHVybiBUSU1FX1dJVEhfTE9OR19PRkZTRVQ7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzA5OjMwJywgYWx3YXlzIDI0LWhvdXIuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuXG5cbiAgc3RhdGljIGdldCBUSU1FXzI0X1NJTVBMRSgpIHtcbiAgICByZXR1cm4gVElNRV8yNF9TSU1QTEU7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzA5OjMwOjIzJywgYWx3YXlzIDI0LWhvdXIuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuXG5cbiAgc3RhdGljIGdldCBUSU1FXzI0X1dJVEhfU0VDT05EUygpIHtcbiAgICByZXR1cm4gVElNRV8yNF9XSVRIX1NFQ09ORFM7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzA5OjMwOjIzIEVEVCcsIGFsd2F5cyAyNC1ob3VyLlxuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cblxuXG4gIHN0YXRpYyBnZXQgVElNRV8yNF9XSVRIX1NIT1JUX09GRlNFVCgpIHtcbiAgICByZXR1cm4gVElNRV8yNF9XSVRIX1NIT1JUX09GRlNFVDtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMDk6MzA6MjMgRWFzdGVybiBEYXlsaWdodCBUaW1lJywgYWx3YXlzIDI0LWhvdXIuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuXG5cbiAgc3RhdGljIGdldCBUSU1FXzI0X1dJVEhfTE9OR19PRkZTRVQoKSB7XG4gICAgcmV0dXJuIFRJTUVfMjRfV0lUSF9MT05HX09GRlNFVDtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMTAvMTQvMTk4MywgOTozMCBBTScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cblxuXG4gIHN0YXRpYyBnZXQgREFURVRJTUVfU0hPUlQoKSB7XG4gICAgcmV0dXJuIERBVEVUSU1FX1NIT1JUO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcxMC8xNC8xOTgzLCA5OjMwOjMzIEFNJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuXG5cbiAgc3RhdGljIGdldCBEQVRFVElNRV9TSE9SVF9XSVRIX1NFQ09ORFMoKSB7XG4gICAgcmV0dXJuIERBVEVUSU1FX1NIT1JUX1dJVEhfU0VDT05EUztcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnT2N0IDE0LCAxOTgzLCA5OjMwIEFNJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuXG5cbiAgc3RhdGljIGdldCBEQVRFVElNRV9NRUQoKSB7XG4gICAgcmV0dXJuIERBVEVUSU1FX01FRDtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnT2N0IDE0LCAxOTgzLCA5OjMwOjMzIEFNJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuXG5cbiAgc3RhdGljIGdldCBEQVRFVElNRV9NRURfV0lUSF9TRUNPTkRTKCkge1xuICAgIHJldHVybiBEQVRFVElNRV9NRURfV0lUSF9TRUNPTkRTO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdGcmksIDE0IE9jdCAxOTgzLCA5OjMwIEFNJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuXG5cbiAgc3RhdGljIGdldCBEQVRFVElNRV9NRURfV0lUSF9XRUVLREFZKCkge1xuICAgIHJldHVybiBEQVRFVElNRV9NRURfV0lUSF9XRUVLREFZO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdPY3RvYmVyIDE0LCAxOTgzLCA5OjMwIEFNIEVEVCcuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cblxuXG4gIHN0YXRpYyBnZXQgREFURVRJTUVfRlVMTCgpIHtcbiAgICByZXR1cm4gREFURVRJTUVfRlVMTDtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnT2N0b2JlciAxNCwgMTk4MywgOTozMDozMyBBTSBFRFQnLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG5cblxuICBzdGF0aWMgZ2V0IERBVEVUSU1FX0ZVTExfV0lUSF9TRUNPTkRTKCkge1xuICAgIHJldHVybiBEQVRFVElNRV9GVUxMX1dJVEhfU0VDT05EUztcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnRnJpZGF5LCBPY3RvYmVyIDE0LCAxOTgzLCA5OjMwIEFNIEVhc3Rlcm4gRGF5bGlnaHQgVGltZScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cblxuXG4gIHN0YXRpYyBnZXQgREFURVRJTUVfSFVHRSgpIHtcbiAgICByZXR1cm4gREFURVRJTUVfSFVHRTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnRnJpZGF5LCBPY3RvYmVyIDE0LCAxOTgzLCA5OjMwOjMzIEFNIEVhc3Rlcm4gRGF5bGlnaHQgVGltZScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cblxuXG4gIHN0YXRpYyBnZXQgREFURVRJTUVfSFVHRV9XSVRIX1NFQ09ORFMoKSB7XG4gICAgcmV0dXJuIERBVEVUSU1FX0hVR0VfV0lUSF9TRUNPTkRTO1xuICB9XG5cbn1cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBmcmllbmRseURhdGVUaW1lKGRhdGVUaW1laXNoKSB7XG4gIGlmIChEYXRlVGltZS5pc0RhdGVUaW1lKGRhdGVUaW1laXNoKSkge1xuICAgIHJldHVybiBkYXRlVGltZWlzaDtcbiAgfSBlbHNlIGlmIChkYXRlVGltZWlzaCAmJiBkYXRlVGltZWlzaC52YWx1ZU9mICYmIGlzTnVtYmVyKGRhdGVUaW1laXNoLnZhbHVlT2YoKSkpIHtcbiAgICByZXR1cm4gRGF0ZVRpbWUuZnJvbUpTRGF0ZShkYXRlVGltZWlzaCk7XG4gIH0gZWxzZSBpZiAoZGF0ZVRpbWVpc2ggJiYgdHlwZW9mIGRhdGVUaW1laXNoID09PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIERhdGVUaW1lLmZyb21PYmplY3QoZGF0ZVRpbWVpc2gpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihgVW5rbm93biBkYXRldGltZSBhcmd1bWVudDogJHtkYXRlVGltZWlzaH0sIG9mIHR5cGUgJHt0eXBlb2YgZGF0ZVRpbWVpc2h9YCk7XG4gIH1cbn1cblxuY29uc3QgVkVSU0lPTiA9IFwiMS4yNi4wXCI7XG5cbmV4cG9ydHMuRGF0ZVRpbWUgPSBEYXRlVGltZTtcbmV4cG9ydHMuRHVyYXRpb24gPSBEdXJhdGlvbjtcbmV4cG9ydHMuRml4ZWRPZmZzZXRab25lID0gRml4ZWRPZmZzZXRab25lO1xuZXhwb3J0cy5JQU5BWm9uZSA9IElBTkFab25lO1xuZXhwb3J0cy5JbmZvID0gSW5mbztcbmV4cG9ydHMuSW50ZXJ2YWwgPSBJbnRlcnZhbDtcbmV4cG9ydHMuSW52YWxpZFpvbmUgPSBJbnZhbGlkWm9uZTtcbmV4cG9ydHMuTG9jYWxab25lID0gTG9jYWxab25lO1xuZXhwb3J0cy5TZXR0aW5ncyA9IFNldHRpbmdzO1xuZXhwb3J0cy5WRVJTSU9OID0gVkVSU0lPTjtcbmV4cG9ydHMuWm9uZSA9IFpvbmU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sdXhvbi5qcy5tYXBcbiIsImltcG9ydCBkYXRldXRpbCBmcm9tICcuL2RhdGV1dGlsJztcbmltcG9ydCB7IERhdGVUaW1lIH0gZnJvbSAnbHV4b24nO1xudmFyIERhdGVXaXRoWm9uZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBEYXRlV2l0aFpvbmUoZGF0ZSwgdHppZCkge1xuICAgICAgICB0aGlzLmRhdGUgPSBkYXRlO1xuICAgICAgICB0aGlzLnR6aWQgPSB0emlkO1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRGF0ZVdpdGhab25lLnByb3RvdHlwZSwgXCJpc1VUQ1wiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuICF0aGlzLnR6aWQgfHwgdGhpcy50emlkLnRvVXBwZXJDYXNlKCkgPT09ICdVVEMnO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBEYXRlV2l0aFpvbmUucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGF0ZXN0ciA9IGRhdGV1dGlsLnRpbWVUb1VudGlsU3RyaW5nKHRoaXMuZGF0ZS5nZXRUaW1lKCksIHRoaXMuaXNVVEMpO1xuICAgICAgICBpZiAoIXRoaXMuaXNVVEMpIHtcbiAgICAgICAgICAgIHJldHVybiBcIjtUWklEPVwiICsgdGhpcy50emlkICsgXCI6XCIgKyBkYXRlc3RyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcIjpcIiArIGRhdGVzdHI7XG4gICAgfTtcbiAgICBEYXRlV2l0aFpvbmUucHJvdG90eXBlLmdldFRpbWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGUuZ2V0VGltZSgpO1xuICAgIH07XG4gICAgRGF0ZVdpdGhab25lLnByb3RvdHlwZS5yZXpvbmVkRGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNVVEMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGU7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBkYXRldGltZSA9IERhdGVUaW1lXG4gICAgICAgICAgICAgICAgLmZyb21KU0RhdGUodGhpcy5kYXRlKTtcbiAgICAgICAgICAgIHZhciByZXpvbmVkID0gZGF0ZXRpbWUuc2V0Wm9uZSh0aGlzLnR6aWQsIHsga2VlcExvY2FsVGltZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIHJldHVybiByZXpvbmVkLnRvSlNEYXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgVHlwZUVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVXNpbmcgVFpJRCB3aXRob3V0IEx1eG9uIGF2YWlsYWJsZSBpcyB1bnN1cHBvcnRlZC4gUmV0dXJuZWQgdGltZXMgYXJlIGluIFVUQywgbm90IHRoZSByZXF1ZXN0ZWQgdGltZSB6b25lJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRlO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gRGF0ZVdpdGhab25lO1xufSgpKTtcbmV4cG9ydCB7IERhdGVXaXRoWm9uZSB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0ZXdpdGh6b25lLmpzLm1hcCIsImltcG9ydCBSUnVsZSwgeyBERUZBVUxUX09QVElPTlMgfSBmcm9tICcuL3JydWxlJztcbmltcG9ydCB7IGluY2x1ZGVzLCBpc1ByZXNlbnQsIGlzQXJyYXksIGlzTnVtYmVyLCB0b0FycmF5IH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7IFdlZWtkYXkgfSBmcm9tICcuL3dlZWtkYXknO1xuaW1wb3J0IGRhdGV1dGlsIGZyb20gJy4vZGF0ZXV0aWwnO1xuaW1wb3J0IHsgRGF0ZVdpdGhab25lIH0gZnJvbSAnLi9kYXRld2l0aHpvbmUnO1xuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbnNUb1N0cmluZyhvcHRpb25zKSB7XG4gICAgdmFyIHJydWxlID0gW107XG4gICAgdmFyIGR0c3RhcnQgPSAnJztcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9wdGlvbnMpO1xuICAgIHZhciBkZWZhdWx0S2V5cyA9IE9iamVjdC5rZXlzKERFRkFVTFRfT1BUSU9OUyk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChrZXlzW2ldID09PSAndHppZCcpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgaWYgKCFpbmNsdWRlcyhkZWZhdWx0S2V5cywga2V5c1tpXSkpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgdmFyIGtleSA9IGtleXNbaV0udG9VcHBlckNhc2UoKTtcbiAgICAgICAgdmFyIHZhbHVlID0gb3B0aW9uc1trZXlzW2ldXTtcbiAgICAgICAgdmFyIG91dFZhbHVlID0gJyc7XG4gICAgICAgIGlmICghaXNQcmVzZW50KHZhbHVlKSB8fCAoaXNBcnJheSh2YWx1ZSkgJiYgIXZhbHVlLmxlbmd0aCkpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ0ZSRVEnOlxuICAgICAgICAgICAgICAgIG91dFZhbHVlID0gUlJ1bGUuRlJFUVVFTkNJRVNbb3B0aW9ucy5mcmVxXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ1dLU1QnOlxuICAgICAgICAgICAgICAgIGlmIChpc051bWJlcih2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0VmFsdWUgPSBuZXcgV2Vla2RheSh2YWx1ZSkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG91dFZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdCWVdFRUtEQVknOlxuICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgTk9URTogQllXRUVLREFZIGlzIGEgc3BlY2lhbCBjYXNlLlxuICAgICAgICAgICAgICAgIFJSdWxlKCkgZGVjb25zdHJ1Y3RzIHRoZSBydWxlLm9wdGlvbnMuYnl3ZWVrZGF5IGFycmF5XG4gICAgICAgICAgICAgICAgaW50byBhbiBhcnJheSBvZiBXZWVrZGF5IGFyZ3VtZW50cy5cbiAgICAgICAgICAgICAgICBPbiB0aGUgb3RoZXIgaGFuZCwgcnVsZS5vcmlnT3B0aW9ucyBpcyBhbiBhcnJheSBvZiBXZWVrZGF5cy5cbiAgICAgICAgICAgICAgICBXZSBuZWVkIHRvIGhhbmRsZSBib3RoIGNhc2VzIGhlcmUuXG4gICAgICAgICAgICAgICAgSXQgbWlnaHQgYmUgd29ydGggY2hhbmdlIFJSdWxlIHRvIGtlZXAgdGhlIFdlZWtkYXlzLlxuICAgICAgXG4gICAgICAgICAgICAgICAgQWxzbywgQllXRUVLREFZICh1c2VkIGJ5IFJSdWxlKSB2cy4gQllEQVkgKFJGQylcbiAgICAgIFxuICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAga2V5ID0gJ0JZREFZJztcbiAgICAgICAgICAgICAgICBvdXRWYWx1ZSA9IHRvQXJyYXkodmFsdWUpLm1hcChmdW5jdGlvbiAod2RheSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAod2RheSBpbnN0YW5jZW9mIFdlZWtkYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3ZGF5O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KHdkYXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdlZWtkYXkod2RheVswXSwgd2RheVsxXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXZWVrZGF5KHdkYXkpO1xuICAgICAgICAgICAgICAgIH0pLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdEVFNUQVJUJzpcbiAgICAgICAgICAgICAgICBkdHN0YXJ0ID0gYnVpbGREdHN0YXJ0KHZhbHVlLCBvcHRpb25zLnR6aWQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnVU5USUwnOlxuICAgICAgICAgICAgICAgIG91dFZhbHVlID0gZGF0ZXV0aWwudGltZVRvVW50aWxTdHJpbmcodmFsdWUsICFvcHRpb25zLnR6aWQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0clZhbHVlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZhbHVlLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJWYWx1ZXNbal0gPSBTdHJpbmcodmFsdWVbal0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG91dFZhbHVlID0gc3RyVmFsdWVzLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvdXRWYWx1ZSA9IFN0cmluZyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChvdXRWYWx1ZSkge1xuICAgICAgICAgICAgcnJ1bGUucHVzaChba2V5LCBvdXRWYWx1ZV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhciBydWxlcyA9IHJydWxlLm1hcChmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgdmFyIGtleSA9IF9hWzBdLCB2YWx1ZSA9IF9hWzFdO1xuICAgICAgICByZXR1cm4ga2V5ICsgXCI9XCIgKyB2YWx1ZS50b1N0cmluZygpO1xuICAgIH0pLmpvaW4oJzsnKTtcbiAgICB2YXIgcnVsZVN0cmluZyA9ICcnO1xuICAgIGlmIChydWxlcyAhPT0gJycpIHtcbiAgICAgICAgcnVsZVN0cmluZyA9IFwiUlJVTEU6XCIgKyBydWxlcztcbiAgICB9XG4gICAgcmV0dXJuIFtkdHN0YXJ0LCBydWxlU3RyaW5nXS5maWx0ZXIoZnVuY3Rpb24gKHgpIHsgcmV0dXJuICEheDsgfSkuam9pbignXFxuJyk7XG59XG5mdW5jdGlvbiBidWlsZER0c3RhcnQoZHRzdGFydCwgdHppZCkge1xuICAgIGlmICghZHRzdGFydCkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiAnRFRTVEFSVCcgKyBuZXcgRGF0ZVdpdGhab25lKG5ldyBEYXRlKGR0c3RhcnQpLCB0emlkKS50b1N0cmluZygpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b3B0aW9uc3Rvc3RyaW5nLmpzLm1hcCIsImltcG9ydCBJdGVyUmVzdWx0IGZyb20gJy4vaXRlcnJlc3VsdCc7XG5pbXBvcnQgZGF0ZXV0aWwgZnJvbSAnLi9kYXRldXRpbCc7XG5pbXBvcnQgeyBpc0FycmF5IH0gZnJvbSAnLi9oZWxwZXJzJztcbnZhciBDYWNoZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDYWNoZSgpIHtcbiAgICAgICAgdGhpcy5hbGwgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5iZWZvcmUgPSBbXTtcbiAgICAgICAgdGhpcy5hZnRlciA9IFtdO1xuICAgICAgICB0aGlzLmJldHdlZW4gPSBbXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHdoYXQgLSBhbGwvYmVmb3JlL2FmdGVyL2JldHdlZW5cbiAgICAgKiBAcGFyYW0ge0FycmF5LERhdGV9IHZhbHVlIC0gYW4gYXJyYXkgb2YgZGF0ZXMsIG9uZSBkYXRlLCBvciBudWxsXG4gICAgICogQHBhcmFtIHtPYmplY3Q/fSBhcmdzIC0gX2l0ZXIgYXJndW1lbnRzXG4gICAgICovXG4gICAgQ2FjaGUucHJvdG90eXBlLl9jYWNoZUFkZCA9IGZ1bmN0aW9uICh3aGF0LCB2YWx1ZSwgYXJncykge1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHZhbHVlID1cbiAgICAgICAgICAgICAgICB2YWx1ZSBpbnN0YW5jZW9mIERhdGVcbiAgICAgICAgICAgICAgICAgICAgPyBkYXRldXRpbC5jbG9uZSh2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgOiBkYXRldXRpbC5jbG9uZURhdGVzKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAod2hhdCA9PT0gJ2FsbCcpIHtcbiAgICAgICAgICAgIHRoaXMuYWxsID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhcmdzLl92YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpc1t3aGF0XS5wdXNoKGFyZ3MpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIGZhbHNlIC0gbm90IGluIHRoZSBjYWNoZVxuICAgICAqICAgICAgICAgbnVsbCAgLSBjYWNoZWQsIGJ1dCB6ZXJvIG9jY3VycmVuY2VzIChiZWZvcmUvYWZ0ZXIpXG4gICAgICogICAgICAgICBEYXRlICAtIGNhY2hlZCAoYmVmb3JlL2FmdGVyKVxuICAgICAqICAgICAgICAgW10gICAgLSBjYWNoZWQsIGJ1dCB6ZXJvIG9jY3VycmVuY2VzIChhbGwvYmV0d2VlbilcbiAgICAgKiAgICAgICAgIFtEYXRlMSwgRGF0ZU5dIC0gY2FjaGVkIChhbGwvYmV0d2VlbilcbiAgICAgKi9cbiAgICBDYWNoZS5wcm90b3R5cGUuX2NhY2hlR2V0ID0gZnVuY3Rpb24gKHdoYXQsIGFyZ3MpIHtcbiAgICAgICAgdmFyIGNhY2hlZCA9IGZhbHNlO1xuICAgICAgICB2YXIgYXJnc0tleXMgPSBhcmdzID8gT2JqZWN0LmtleXMoYXJncykgOiBbXTtcbiAgICAgICAgdmFyIGZpbmRDYWNoZURpZmYgPSBmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBrZXkgPSBhcmdzS2V5c1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoU3RyaW5nKGFyZ3Nba2V5XSkgIT09IFN0cmluZyhpdGVtW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIGNhY2hlZE9iamVjdCA9IHRoaXNbd2hhdF07XG4gICAgICAgIGlmICh3aGF0ID09PSAnYWxsJykge1xuICAgICAgICAgICAgY2FjaGVkID0gdGhpcy5hbGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNBcnJheShjYWNoZWRPYmplY3QpKSB7XG4gICAgICAgICAgICAvLyBMZXQncyBzZWUgd2hldGhlciB3ZSd2ZSBhbHJlYWR5IGNhbGxlZCB0aGVcbiAgICAgICAgICAgIC8vICd3aGF0JyBtZXRob2Qgd2l0aCB0aGUgc2FtZSAnYXJncydcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2FjaGVkT2JqZWN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBjYWNoZWRPYmplY3RbaV07XG4gICAgICAgICAgICAgICAgaWYgKGFyZ3NLZXlzLmxlbmd0aCAmJiBmaW5kQ2FjaGVEaWZmKGl0ZW0pKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYWNoZWQgPSBpdGVtLl92YWx1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNhY2hlZCAmJiB0aGlzLmFsbCkge1xuICAgICAgICAgICAgLy8gTm90IGluIHRoZSBjYWNoZSwgYnV0IHdlIGFscmVhZHkga25vdyBhbGwgdGhlIG9jY3VycmVuY2VzLFxuICAgICAgICAgICAgLy8gc28gd2UgY2FuIGZpbmQgdGhlIGNvcnJlY3QgZGF0ZXMgZnJvbSB0aGUgY2FjaGVkIG9uZXMuXG4gICAgICAgICAgICB2YXIgaXRlclJlc3VsdCA9IG5ldyBJdGVyUmVzdWx0KHdoYXQsIGFyZ3MpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmFsbC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICghaXRlclJlc3VsdC5hY2NlcHQodGhpcy5hbGxbaV0pKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhY2hlZCA9IGl0ZXJSZXN1bHQuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIHRoaXMuX2NhY2hlQWRkKHdoYXQsIGNhY2hlZCwgYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzQXJyYXkoY2FjaGVkKVxuICAgICAgICAgICAgPyBkYXRldXRpbC5jbG9uZURhdGVzKGNhY2hlZClcbiAgICAgICAgICAgIDogY2FjaGVkIGluc3RhbmNlb2YgRGF0ZVxuICAgICAgICAgICAgICAgID8gZGF0ZXV0aWwuY2xvbmUoY2FjaGVkKVxuICAgICAgICAgICAgICAgIDogY2FjaGVkO1xuICAgIH07XG4gICAgcmV0dXJuIENhY2hlO1xufSgpKTtcbmV4cG9ydCB7IENhY2hlIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jYWNoZS5qcy5tYXAiLCJpbXBvcnQgeyBfX3NwcmVhZEFycmF5cyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgcmFuZ2UsIHJlcGVhdCB9IGZyb20gJy4vaGVscGVycyc7XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRGF0ZSBtYXNrc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEV2ZXJ5IG1hc2sgaXMgNyBkYXlzIGxvbmdlciB0byBoYW5kbGUgY3Jvc3MteWVhciB3ZWVrbHkgcGVyaW9kcy5cbnZhciBNMzY1TUFTSyA9IF9fc3ByZWFkQXJyYXlzKHJlcGVhdCgxLCAzMSksIHJlcGVhdCgyLCAyOCksIHJlcGVhdCgzLCAzMSksIHJlcGVhdCg0LCAzMCksIHJlcGVhdCg1LCAzMSksIHJlcGVhdCg2LCAzMCksIHJlcGVhdCg3LCAzMSksIHJlcGVhdCg4LCAzMSksIHJlcGVhdCg5LCAzMCksIHJlcGVhdCgxMCwgMzEpLCByZXBlYXQoMTEsIDMwKSwgcmVwZWF0KDEyLCAzMSksIHJlcGVhdCgxLCA3KSk7XG52YXIgTTM2Nk1BU0sgPSBfX3NwcmVhZEFycmF5cyhyZXBlYXQoMSwgMzEpLCByZXBlYXQoMiwgMjkpLCByZXBlYXQoMywgMzEpLCByZXBlYXQoNCwgMzApLCByZXBlYXQoNSwgMzEpLCByZXBlYXQoNiwgMzApLCByZXBlYXQoNywgMzEpLCByZXBlYXQoOCwgMzEpLCByZXBlYXQoOSwgMzApLCByZXBlYXQoMTAsIDMxKSwgcmVwZWF0KDExLCAzMCksIHJlcGVhdCgxMiwgMzEpLCByZXBlYXQoMSwgNykpO1xudmFyIE0yOCA9IHJhbmdlKDEsIDI5KTtcbnZhciBNMjkgPSByYW5nZSgxLCAzMCk7XG52YXIgTTMwID0gcmFuZ2UoMSwgMzEpO1xudmFyIE0zMSA9IHJhbmdlKDEsIDMyKTtcbnZhciBNREFZMzY2TUFTSyA9IF9fc3ByZWFkQXJyYXlzKE0zMSwgTTI5LCBNMzEsIE0zMCwgTTMxLCBNMzAsIE0zMSwgTTMxLCBNMzAsIE0zMSwgTTMwLCBNMzEsIE0zMS5zbGljZSgwLCA3KSk7XG52YXIgTURBWTM2NU1BU0sgPSBfX3NwcmVhZEFycmF5cyhNMzEsIE0yOCwgTTMxLCBNMzAsIE0zMSwgTTMwLCBNMzEsIE0zMSwgTTMwLCBNMzEsIE0zMCwgTTMxLCBNMzEuc2xpY2UoMCwgNykpO1xudmFyIE5NMjggPSByYW5nZSgtMjgsIDApO1xudmFyIE5NMjkgPSByYW5nZSgtMjksIDApO1xudmFyIE5NMzAgPSByYW5nZSgtMzAsIDApO1xudmFyIE5NMzEgPSByYW5nZSgtMzEsIDApO1xudmFyIE5NREFZMzY2TUFTSyA9IF9fc3ByZWFkQXJyYXlzKE5NMzEsIE5NMjksIE5NMzEsIE5NMzAsIE5NMzEsIE5NMzAsIE5NMzEsIE5NMzEsIE5NMzAsIE5NMzEsIE5NMzAsIE5NMzEsIE5NMzEuc2xpY2UoMCwgNykpO1xudmFyIE5NREFZMzY1TUFTSyA9IF9fc3ByZWFkQXJyYXlzKE5NMzEsIE5NMjgsIE5NMzEsIE5NMzAsIE5NMzEsIE5NMzAsIE5NMzEsIE5NMzEsIE5NMzAsIE5NMzEsIE5NMzAsIE5NMzEsIE5NMzEuc2xpY2UoMCwgNykpO1xudmFyIE0zNjZSQU5HRSA9IFswLCAzMSwgNjAsIDkxLCAxMjEsIDE1MiwgMTgyLCAyMTMsIDI0NCwgMjc0LCAzMDUsIDMzNSwgMzY2XTtcbnZhciBNMzY1UkFOR0UgPSBbMCwgMzEsIDU5LCA5MCwgMTIwLCAxNTEsIDE4MSwgMjEyLCAyNDMsIDI3MywgMzA0LCAzMzQsIDM2NV07XG52YXIgV0RBWU1BU0sgPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciB3ZGF5bWFzayA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNTU7IGkrKylcbiAgICAgICAgd2RheW1hc2sgPSB3ZGF5bWFzay5jb25jYXQocmFuZ2UoNykpO1xuICAgIHJldHVybiB3ZGF5bWFzaztcbn0pKCk7XG5leHBvcnQgeyBXREFZTUFTSywgTTM2NU1BU0ssIE0zNjVSQU5HRSwgTTM2Nk1BU0ssIE0zNjZSQU5HRSwgTURBWTM2NU1BU0ssIE1EQVkzNjZNQVNLLCBOTURBWTM2NU1BU0ssIE5NREFZMzY2TUFTSyB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWFza3MuanMubWFwIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBkYXRldXRpbCBmcm9tICcuLi9kYXRldXRpbCc7XG5pbXBvcnQgeyBlbXB0eSwgcmVwZWF0LCBweW1vZCwgaW5jbHVkZXMgfSBmcm9tICcuLi9oZWxwZXJzJztcbmltcG9ydCB7IE0zNjVNQVNLLCBNREFZMzY1TUFTSywgTk1EQVkzNjVNQVNLLCBXREFZTUFTSywgTTM2NVJBTkdFLCBNMzY2TUFTSywgTURBWTM2Nk1BU0ssIE5NREFZMzY2TUFTSywgTTM2NlJBTkdFIH0gZnJvbSAnLi4vbWFza3MnO1xuZXhwb3J0IGZ1bmN0aW9uIHJlYnVpbGRZZWFyKHllYXIsIG9wdGlvbnMpIHtcbiAgICB2YXIgZmlyc3R5ZGF5ID0gbmV3IERhdGUoRGF0ZS5VVEMoeWVhciwgMCwgMSkpO1xuICAgIHZhciB5ZWFybGVuID0gZGF0ZXV0aWwuaXNMZWFwWWVhcih5ZWFyKSA/IDM2NiA6IDM2NTtcbiAgICB2YXIgbmV4dHllYXJsZW4gPSBkYXRldXRpbC5pc0xlYXBZZWFyKHllYXIgKyAxKSA/IDM2NiA6IDM2NTtcbiAgICB2YXIgeWVhcm9yZGluYWwgPSBkYXRldXRpbC50b09yZGluYWwoZmlyc3R5ZGF5KTtcbiAgICB2YXIgeWVhcndlZWtkYXkgPSBkYXRldXRpbC5nZXRXZWVrZGF5KGZpcnN0eWRheSk7XG4gICAgdmFyIHJlc3VsdCA9IF9fYXNzaWduKF9fYXNzaWduKHsgeWVhcmxlbjogeWVhcmxlbixcbiAgICAgICAgbmV4dHllYXJsZW46IG5leHR5ZWFybGVuLFxuICAgICAgICB5ZWFyb3JkaW5hbDogeWVhcm9yZGluYWwsXG4gICAgICAgIHllYXJ3ZWVrZGF5OiB5ZWFyd2Vla2RheSB9LCBiYXNlWWVhck1hc2tzKHllYXIpKSwgeyB3bm9tYXNrOiBudWxsIH0pO1xuICAgIGlmIChlbXB0eShvcHRpb25zLmJ5d2Vla25vKSkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICByZXN1bHQud25vbWFzayA9IHJlcGVhdCgwLCB5ZWFybGVuICsgNyk7XG4gICAgdmFyIGZpcnN0d2tzdDtcbiAgICB2YXIgd3llYXJsZW47XG4gICAgdmFyIG5vMXdrc3QgPSBmaXJzdHdrc3QgPSBweW1vZCg3IC0geWVhcndlZWtkYXkgKyBvcHRpb25zLndrc3QsIDcpO1xuICAgIGlmIChubzF3a3N0ID49IDQpIHtcbiAgICAgICAgbm8xd2tzdCA9IDA7XG4gICAgICAgIC8vIE51bWJlciBvZiBkYXlzIGluIHRoZSB5ZWFyLCBwbHVzIHRoZSBkYXlzIHdlIGdvdFxuICAgICAgICAvLyBmcm9tIGxhc3QgeWVhci5cbiAgICAgICAgd3llYXJsZW4gPVxuICAgICAgICAgICAgcmVzdWx0LnllYXJsZW4gKyBweW1vZCh5ZWFyd2Vla2RheSAtIG9wdGlvbnMud2tzdCwgNyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBOdW1iZXIgb2YgZGF5cyBpbiB0aGUgeWVhciwgbWludXMgdGhlIGRheXMgd2VcbiAgICAgICAgLy8gbGVmdCBpbiBsYXN0IHllYXIuXG4gICAgICAgIHd5ZWFybGVuID0geWVhcmxlbiAtIG5vMXdrc3Q7XG4gICAgfVxuICAgIHZhciBkaXYgPSBNYXRoLmZsb29yKHd5ZWFybGVuIC8gNyk7XG4gICAgdmFyIG1vZCA9IHB5bW9kKHd5ZWFybGVuLCA3KTtcbiAgICB2YXIgbnVtd2Vla3MgPSBNYXRoLmZsb29yKGRpdiArIG1vZCAvIDQpO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgb3B0aW9ucy5ieXdlZWtuby5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgbiA9IG9wdGlvbnMuYnl3ZWVrbm9bal07XG4gICAgICAgIGlmIChuIDwgMCkge1xuICAgICAgICAgICAgbiArPSBudW13ZWVrcyArIDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEobiA+IDAgJiYgbiA8PSBudW13ZWVrcykpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpID0gdm9pZCAwO1xuICAgICAgICBpZiAobiA+IDEpIHtcbiAgICAgICAgICAgIGkgPSBubzF3a3N0ICsgKG4gLSAxKSAqIDc7XG4gICAgICAgICAgICBpZiAobm8xd2tzdCAhPT0gZmlyc3R3a3N0KSB7XG4gICAgICAgICAgICAgICAgaSAtPSA3IC0gZmlyc3R3a3N0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaSA9IG5vMXdrc3Q7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCA3OyBrKyspIHtcbiAgICAgICAgICAgIHJlc3VsdC53bm9tYXNrW2ldID0gMTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIGlmIChyZXN1bHQud2RheW1hc2tbaV0gPT09IG9wdGlvbnMud2tzdClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaW5jbHVkZXMob3B0aW9ucy5ieXdlZWtubywgMSkpIHtcbiAgICAgICAgLy8gQ2hlY2sgd2VlayBudW1iZXIgMSBvZiBuZXh0IHllYXIgYXMgd2VsbFxuICAgICAgICAvLyBvcmlnLVRPRE8gOiBDaGVjayAtbnVtd2Vla3MgZm9yIG5leHQgeWVhci5cbiAgICAgICAgdmFyIGkgPSBubzF3a3N0ICsgbnVtd2Vla3MgKiA3O1xuICAgICAgICBpZiAobm8xd2tzdCAhPT0gZmlyc3R3a3N0KVxuICAgICAgICAgICAgaSAtPSA3IC0gZmlyc3R3a3N0O1xuICAgICAgICBpZiAoaSA8IHllYXJsZW4pIHtcbiAgICAgICAgICAgIC8vIElmIHdlZWsgc3RhcnRzIGluIG5leHQgeWVhciwgd2VcbiAgICAgICAgICAgIC8vIGRvbid0IGNhcmUgYWJvdXQgaXQuXG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDc7IGorKykge1xuICAgICAgICAgICAgICAgIHJlc3VsdC53bm9tYXNrW2ldID0gMTtcbiAgICAgICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC53ZGF5bWFza1tpXSA9PT0gb3B0aW9ucy53a3N0KVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAobm8xd2tzdCkge1xuICAgICAgICAvLyBDaGVjayBsYXN0IHdlZWsgbnVtYmVyIG9mIGxhc3QgeWVhciBhc1xuICAgICAgICAvLyB3ZWxsLiBJZiBubzF3a3N0IGlzIDAsIGVpdGhlciB0aGUgeWVhclxuICAgICAgICAvLyBzdGFydGVkIG9uIHdlZWsgc3RhcnQsIG9yIHdlZWsgbnVtYmVyIDFcbiAgICAgICAgLy8gZ290IGRheXMgZnJvbSBsYXN0IHllYXIsIHNvIHRoZXJlIGFyZSBub1xuICAgICAgICAvLyBkYXlzIGZyb20gbGFzdCB5ZWFyJ3MgbGFzdCB3ZWVrIG51bWJlciBpblxuICAgICAgICAvLyB0aGlzIHllYXIuXG4gICAgICAgIHZhciBsbnVtd2Vla3MgPSB2b2lkIDA7XG4gICAgICAgIGlmICghaW5jbHVkZXMob3B0aW9ucy5ieXdlZWtubywgLTEpKSB7XG4gICAgICAgICAgICB2YXIgbHllYXJ3ZWVrZGF5ID0gZGF0ZXV0aWwuZ2V0V2Vla2RheShuZXcgRGF0ZShEYXRlLlVUQyh5ZWFyIC0gMSwgMCwgMSkpKTtcbiAgICAgICAgICAgIHZhciBsbm8xd2tzdCA9IHB5bW9kKDcgLSBseWVhcndlZWtkYXkudmFsdWVPZigpICsgb3B0aW9ucy53a3N0LCA3KTtcbiAgICAgICAgICAgIHZhciBseWVhcmxlbiA9IGRhdGV1dGlsLmlzTGVhcFllYXIoeWVhciAtIDEpID8gMzY2IDogMzY1O1xuICAgICAgICAgICAgdmFyIHdlZWtzdCA9IHZvaWQgMDtcbiAgICAgICAgICAgIGlmIChsbm8xd2tzdCA+PSA0KSB7XG4gICAgICAgICAgICAgICAgbG5vMXdrc3QgPSAwO1xuICAgICAgICAgICAgICAgIHdlZWtzdCA9IGx5ZWFybGVuICsgcHltb2QobHllYXJ3ZWVrZGF5IC0gb3B0aW9ucy53a3N0LCA3KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHdlZWtzdCA9IHllYXJsZW4gLSBubzF3a3N0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG51bXdlZWtzID0gTWF0aC5mbG9vcig1MiArIHB5bW9kKHdlZWtzdCwgNykgLyA0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxudW13ZWVrcyA9IC0xO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbmNsdWRlcyhvcHRpb25zLmJ5d2Vla25vLCBsbnVtd2Vla3MpKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vMXdrc3Q7IGkrKylcbiAgICAgICAgICAgICAgICByZXN1bHQud25vbWFza1tpXSA9IDE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGJhc2VZZWFyTWFza3MoeWVhcikge1xuICAgIHZhciB5ZWFybGVuID0gZGF0ZXV0aWwuaXNMZWFwWWVhcih5ZWFyKSA/IDM2NiA6IDM2NTtcbiAgICB2YXIgZmlyc3R5ZGF5ID0gbmV3IERhdGUoRGF0ZS5VVEMoeWVhciwgMCwgMSkpO1xuICAgIHZhciB3ZGF5ID0gZGF0ZXV0aWwuZ2V0V2Vla2RheShmaXJzdHlkYXkpO1xuICAgIGlmICh5ZWFybGVuID09PSAzNjUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1tYXNrOiBNMzY1TUFTSyxcbiAgICAgICAgICAgIG1kYXltYXNrOiBNREFZMzY1TUFTSyxcbiAgICAgICAgICAgIG5tZGF5bWFzazogTk1EQVkzNjVNQVNLLFxuICAgICAgICAgICAgd2RheW1hc2s6IFdEQVlNQVNLLnNsaWNlKHdkYXkpLFxuICAgICAgICAgICAgbXJhbmdlOiBNMzY1UkFOR0VcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbW1hc2s6IE0zNjZNQVNLLFxuICAgICAgICBtZGF5bWFzazogTURBWTM2Nk1BU0ssXG4gICAgICAgIG5tZGF5bWFzazogTk1EQVkzNjZNQVNLLFxuICAgICAgICB3ZGF5bWFzazogV0RBWU1BU0suc2xpY2Uod2RheSksXG4gICAgICAgIG1yYW5nZTogTTM2NlJBTkdFXG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXllYXJpbmZvLmpzLm1hcCIsImltcG9ydCBSUnVsZSBmcm9tICcuLi9ycnVsZSc7XG5pbXBvcnQgeyBlbXB0eSwgcmVwZWF0LCBweW1vZCB9IGZyb20gJy4uL2hlbHBlcnMnO1xuZXhwb3J0IGZ1bmN0aW9uIHJlYnVpbGRNb250aCh5ZWFyLCBtb250aCwgeWVhcmxlbiwgbXJhbmdlLCB3ZGF5bWFzaywgb3B0aW9ucykge1xuICAgIHZhciByZXN1bHQgPSB7XG4gICAgICAgIGxhc3R5ZWFyOiB5ZWFyLFxuICAgICAgICBsYXN0bW9udGg6IG1vbnRoLFxuICAgICAgICBud2RheW1hc2s6IFtdXG4gICAgfTtcbiAgICB2YXIgcmFuZ2VzID0gW107XG4gICAgaWYgKG9wdGlvbnMuZnJlcSA9PT0gUlJ1bGUuWUVBUkxZKSB7XG4gICAgICAgIGlmIChlbXB0eShvcHRpb25zLmJ5bW9udGgpKSB7XG4gICAgICAgICAgICByYW5nZXMgPSBbWzAsIHllYXJsZW5dXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgb3B0aW9ucy5ieW1vbnRoLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgbW9udGggPSBvcHRpb25zLmJ5bW9udGhbal07XG4gICAgICAgICAgICAgICAgcmFuZ2VzLnB1c2gobXJhbmdlLnNsaWNlKG1vbnRoIC0gMSwgbW9udGggKyAxKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAob3B0aW9ucy5mcmVxID09PSBSUnVsZS5NT05USExZKSB7XG4gICAgICAgIHJhbmdlcyA9IFttcmFuZ2Uuc2xpY2UobW9udGggLSAxLCBtb250aCArIDEpXTtcbiAgICB9XG4gICAgaWYgKGVtcHR5KHJhbmdlcykpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLy8gV2Vla2x5IGZyZXF1ZW5jeSB3b24ndCBnZXQgaGVyZSwgc28gd2UgbWF5IG5vdFxuICAgIC8vIGNhcmUgYWJvdXQgY3Jvc3MteWVhciB3ZWVrbHkgcGVyaW9kcy5cbiAgICByZXN1bHQubndkYXltYXNrID0gcmVwZWF0KDAsIHllYXJsZW4pO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgcmFuZ2VzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciByYW5nID0gcmFuZ2VzW2pdO1xuICAgICAgICB2YXIgZmlyc3QgPSByYW5nWzBdO1xuICAgICAgICB2YXIgbGFzdCA9IHJhbmdbMV0gLSAxO1xuICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IG9wdGlvbnMuYnlud2Vla2RheS5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgdmFyIGkgPSB2b2lkIDA7XG4gICAgICAgICAgICB2YXIgX2EgPSBvcHRpb25zLmJ5bndlZWtkYXlba10sIHdkYXkgPSBfYVswXSwgbiA9IF9hWzFdO1xuICAgICAgICAgICAgaWYgKG4gPCAwKSB7XG4gICAgICAgICAgICAgICAgaSA9IGxhc3QgKyAobiArIDEpICogNztcbiAgICAgICAgICAgICAgICBpIC09IHB5bW9kKHdkYXltYXNrW2ldIC0gd2RheSwgNyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpID0gZmlyc3QgKyAobiAtIDEpICogNztcbiAgICAgICAgICAgICAgICBpICs9IHB5bW9kKDcgLSB3ZGF5bWFza1tpXSArIHdkYXksIDcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpcnN0IDw9IGkgJiYgaSA8PSBsYXN0KVxuICAgICAgICAgICAgICAgIHJlc3VsdC5ud2RheW1hc2tbaV0gPSAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tb250aGluZm8uanMubWFwIiwiZXhwb3J0IGZ1bmN0aW9uIGVhc3Rlcih5LCBvZmZzZXQpIHtcbiAgICBpZiAob2Zmc2V0ID09PSB2b2lkIDApIHsgb2Zmc2V0ID0gMDsgfVxuICAgIHZhciBhID0geSAlIDE5O1xuICAgIHZhciBiID0gTWF0aC5mbG9vcih5IC8gMTAwKTtcbiAgICB2YXIgYyA9IHkgJSAxMDA7XG4gICAgdmFyIGQgPSBNYXRoLmZsb29yKGIgLyA0KTtcbiAgICB2YXIgZSA9IGIgJSA0O1xuICAgIHZhciBmID0gTWF0aC5mbG9vcigoYiArIDgpIC8gMjUpO1xuICAgIHZhciBnID0gTWF0aC5mbG9vcigoYiAtIGYgKyAxKSAvIDMpO1xuICAgIHZhciBoID0gTWF0aC5mbG9vcigxOSAqIGEgKyBiIC0gZCAtIGcgKyAxNSkgJSAzMDtcbiAgICB2YXIgaSA9IE1hdGguZmxvb3IoYyAvIDQpO1xuICAgIHZhciBrID0gYyAlIDQ7XG4gICAgdmFyIGwgPSBNYXRoLmZsb29yKDMyICsgMiAqIGUgKyAyICogaSAtIGggLSBrKSAlIDc7XG4gICAgdmFyIG0gPSBNYXRoLmZsb29yKChhICsgMTEgKiBoICsgMjIgKiBsKSAvIDQ1MSk7XG4gICAgdmFyIG1vbnRoID0gTWF0aC5mbG9vcigoaCArIGwgLSA3ICogbSArIDExNCkgLyAzMSk7XG4gICAgdmFyIGRheSA9ICgoaCArIGwgLSA3ICogbSArIDExNCkgJSAzMSkgKyAxO1xuICAgIHZhciBkYXRlID0gRGF0ZS5VVEMoeSwgbW9udGggLSAxLCBkYXkgKyBvZmZzZXQpO1xuICAgIHZhciB5ZWFyU3RhcnQgPSBEYXRlLlVUQyh5LCAwLCAxKTtcbiAgICByZXR1cm4gW01hdGguY2VpbCgoZGF0ZSAtIHllYXJTdGFydCkgLyAoMTAwMCAqIDYwICogNjAgKiAyNCkpXTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVhc3Rlci5qcy5tYXAiLCJpbXBvcnQgZGF0ZXV0aWwgZnJvbSAnLi4vZGF0ZXV0aWwnO1xuaW1wb3J0IHsgbm90RW1wdHksIHJlcGVhdCwgcmFuZ2UsIGlzUHJlc2VudCB9IGZyb20gJy4uL2hlbHBlcnMnO1xuaW1wb3J0IHsgRnJlcXVlbmN5IH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgcmVidWlsZFllYXIgfSBmcm9tICcuL3llYXJpbmZvJztcbmltcG9ydCB7IHJlYnVpbGRNb250aCB9IGZyb20gJy4vbW9udGhpbmZvJztcbmltcG9ydCB7IGVhc3RlciB9IGZyb20gJy4vZWFzdGVyJztcbmltcG9ydCB7IFRpbWUgfSBmcm9tICcuLi9kYXRldGltZSc7XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gSXRlcmluZm9cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG52YXIgSXRlcmluZm8gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gSXRlcmluZm8ob3B0aW9ucykge1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIH1cbiAgICBJdGVyaW5mby5wcm90b3R5cGUucmVidWlsZCA9IGZ1bmN0aW9uICh5ZWFyLCBtb250aCkge1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgaWYgKHllYXIgIT09IHRoaXMubGFzdHllYXIpIHtcbiAgICAgICAgICAgIHRoaXMueWVhcmluZm8gPSByZWJ1aWxkWWVhcih5ZWFyLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm90RW1wdHkob3B0aW9ucy5ieW53ZWVrZGF5KSAmJlxuICAgICAgICAgICAgKG1vbnRoICE9PSB0aGlzLmxhc3Rtb250aCB8fCB5ZWFyICE9PSB0aGlzLmxhc3R5ZWFyKSkge1xuICAgICAgICAgICAgdmFyIF9hID0gdGhpcy55ZWFyaW5mbywgeWVhcmxlbiA9IF9hLnllYXJsZW4sIG1yYW5nZSA9IF9hLm1yYW5nZSwgd2RheW1hc2sgPSBfYS53ZGF5bWFzaztcbiAgICAgICAgICAgIHRoaXMubW9udGhpbmZvID0gcmVidWlsZE1vbnRoKHllYXIsIG1vbnRoLCB5ZWFybGVuLCBtcmFuZ2UsIHdkYXltYXNrLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNQcmVzZW50KG9wdGlvbnMuYnllYXN0ZXIpKSB7XG4gICAgICAgICAgICB0aGlzLmVhc3Rlcm1hc2sgPSBlYXN0ZXIoeWVhciwgb3B0aW9ucy5ieWVhc3Rlcik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJdGVyaW5mby5wcm90b3R5cGUsIFwibGFzdHllYXJcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1vbnRoaW5mbyA/IHRoaXMubW9udGhpbmZvLmxhc3R5ZWFyIDogbnVsbDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEl0ZXJpbmZvLnByb3RvdHlwZSwgXCJsYXN0bW9udGhcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1vbnRoaW5mbyA/IHRoaXMubW9udGhpbmZvLmxhc3Rtb250aCA6IG51bGw7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJdGVyaW5mby5wcm90b3R5cGUsIFwieWVhcmxlblwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMueWVhcmluZm8ueWVhcmxlbjtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEl0ZXJpbmZvLnByb3RvdHlwZSwgXCJ5ZWFyb3JkaW5hbFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMueWVhcmluZm8ueWVhcm9yZGluYWw7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJdGVyaW5mby5wcm90b3R5cGUsIFwibXJhbmdlXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy55ZWFyaW5mby5tcmFuZ2U7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJdGVyaW5mby5wcm90b3R5cGUsIFwid2RheW1hc2tcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnllYXJpbmZvLndkYXltYXNrO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSXRlcmluZm8ucHJvdG90eXBlLCBcIm1tYXNrXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy55ZWFyaW5mby5tbWFzaztcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEl0ZXJpbmZvLnByb3RvdHlwZSwgXCJ3bm9tYXNrXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy55ZWFyaW5mby53bm9tYXNrO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSXRlcmluZm8ucHJvdG90eXBlLCBcIm53ZGF5bWFza1wiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubW9udGhpbmZvID8gdGhpcy5tb250aGluZm8ubndkYXltYXNrIDogW107XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJdGVyaW5mby5wcm90b3R5cGUsIFwibmV4dHllYXJsZW5cIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnllYXJpbmZvLm5leHR5ZWFybGVuO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSXRlcmluZm8ucHJvdG90eXBlLCBcIm1kYXltYXNrXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy55ZWFyaW5mby5tZGF5bWFzaztcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEl0ZXJpbmZvLnByb3RvdHlwZSwgXCJubWRheW1hc2tcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnllYXJpbmZvLm5tZGF5bWFzaztcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgSXRlcmluZm8ucHJvdG90eXBlLnlkYXlzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBbcmFuZ2UodGhpcy55ZWFybGVuKSwgMCwgdGhpcy55ZWFybGVuXTtcbiAgICB9O1xuICAgIEl0ZXJpbmZvLnByb3RvdHlwZS5tZGF5c2V0ID0gZnVuY3Rpb24gKF8sIG1vbnRoLCBfXykge1xuICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLm1yYW5nZVttb250aCAtIDFdO1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5tcmFuZ2VbbW9udGhdO1xuICAgICAgICB2YXIgc2V0ID0gcmVwZWF0KG51bGwsIHRoaXMueWVhcmxlbik7XG4gICAgICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKVxuICAgICAgICAgICAgc2V0W2ldID0gaTtcbiAgICAgICAgcmV0dXJuIFtzZXQsIHN0YXJ0LCBlbmRdO1xuICAgIH07XG4gICAgSXRlcmluZm8ucHJvdG90eXBlLndkYXlzZXQgPSBmdW5jdGlvbiAoeWVhciwgbW9udGgsIGRheSkge1xuICAgICAgICAvLyBXZSBuZWVkIHRvIGhhbmRsZSBjcm9zcy15ZWFyIHdlZWtzIGhlcmUuXG4gICAgICAgIHZhciBzZXQgPSByZXBlYXQobnVsbCwgdGhpcy55ZWFybGVuICsgNyk7XG4gICAgICAgIHZhciBpID0gZGF0ZXV0aWwudG9PcmRpbmFsKG5ldyBEYXRlKERhdGUuVVRDKHllYXIsIG1vbnRoIC0gMSwgZGF5KSkpIC1cbiAgICAgICAgICAgIHRoaXMueWVhcm9yZGluYWw7XG4gICAgICAgIHZhciBzdGFydCA9IGk7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgNzsgaisrKSB7XG4gICAgICAgICAgICBzZXRbaV0gPSBpO1xuICAgICAgICAgICAgKytpO1xuICAgICAgICAgICAgaWYgKHRoaXMud2RheW1hc2tbaV0gPT09IHRoaXMub3B0aW9ucy53a3N0KVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbc2V0LCBzdGFydCwgaV07XG4gICAgfTtcbiAgICBJdGVyaW5mby5wcm90b3R5cGUuZGRheXNldCA9IGZ1bmN0aW9uICh5ZWFyLCBtb250aCwgZGF5KSB7XG4gICAgICAgIHZhciBzZXQgPSByZXBlYXQobnVsbCwgdGhpcy55ZWFybGVuKTtcbiAgICAgICAgdmFyIGkgPSBkYXRldXRpbC50b09yZGluYWwobmV3IERhdGUoRGF0ZS5VVEMoeWVhciwgbW9udGggLSAxLCBkYXkpKSkgLVxuICAgICAgICAgICAgdGhpcy55ZWFyb3JkaW5hbDtcbiAgICAgICAgc2V0W2ldID0gaTtcbiAgICAgICAgcmV0dXJuIFtzZXQsIGksIGkgKyAxXTtcbiAgICB9O1xuICAgIEl0ZXJpbmZvLnByb3RvdHlwZS5odGltZXNldCA9IGZ1bmN0aW9uIChob3VyLCBfLCBzZWNvbmQsIG1pbGxpc2Vjb25kKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBzZXQgPSBbXTtcbiAgICAgICAgdGhpcy5vcHRpb25zLmJ5bWludXRlLmZvckVhY2goZnVuY3Rpb24gKG1pbnV0ZSkge1xuICAgICAgICAgICAgc2V0ID0gc2V0LmNvbmNhdChfdGhpcy5tdGltZXNldChob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGRhdGV1dGlsLnNvcnQoc2V0KTtcbiAgICAgICAgcmV0dXJuIHNldDtcbiAgICB9O1xuICAgIEl0ZXJpbmZvLnByb3RvdHlwZS5tdGltZXNldCA9IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIF8sIG1pbGxpc2Vjb25kKSB7XG4gICAgICAgIHZhciBzZXQgPSB0aGlzLm9wdGlvbnMuYnlzZWNvbmQubWFwKGZ1bmN0aW9uIChzZWNvbmQpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVGltZShob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQpO1xuICAgICAgICB9KTtcbiAgICAgICAgZGF0ZXV0aWwuc29ydChzZXQpO1xuICAgICAgICByZXR1cm4gc2V0O1xuICAgIH07XG4gICAgSXRlcmluZm8ucHJvdG90eXBlLnN0aW1lc2V0ID0gZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZCkge1xuICAgICAgICByZXR1cm4gW25ldyBUaW1lKGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZCldO1xuICAgIH07XG4gICAgSXRlcmluZm8ucHJvdG90eXBlLmdldGRheXNldCA9IGZ1bmN0aW9uIChmcmVxKSB7XG4gICAgICAgIHN3aXRjaCAoZnJlcSkge1xuICAgICAgICAgICAgY2FzZSBGcmVxdWVuY3kuWUVBUkxZOiByZXR1cm4gdGhpcy55ZGF5c2V0LmJpbmQodGhpcyk7XG4gICAgICAgICAgICBjYXNlIEZyZXF1ZW5jeS5NT05USExZOiByZXR1cm4gdGhpcy5tZGF5c2V0LmJpbmQodGhpcyk7XG4gICAgICAgICAgICBjYXNlIEZyZXF1ZW5jeS5XRUVLTFk6IHJldHVybiB0aGlzLndkYXlzZXQuYmluZCh0aGlzKTtcbiAgICAgICAgICAgIGNhc2UgRnJlcXVlbmN5LkRBSUxZOiByZXR1cm4gdGhpcy5kZGF5c2V0LmJpbmQodGhpcyk7XG4gICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gdGhpcy5kZGF5c2V0LmJpbmQodGhpcyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEl0ZXJpbmZvLnByb3RvdHlwZS5nZXR0aW1lc2V0ID0gZnVuY3Rpb24gKGZyZXEpIHtcbiAgICAgICAgc3dpdGNoIChmcmVxKSB7XG4gICAgICAgICAgICBjYXNlIEZyZXF1ZW5jeS5IT1VSTFk6IHJldHVybiB0aGlzLmh0aW1lc2V0LmJpbmQodGhpcyk7XG4gICAgICAgICAgICBjYXNlIEZyZXF1ZW5jeS5NSU5VVEVMWTogcmV0dXJuIHRoaXMubXRpbWVzZXQuYmluZCh0aGlzKTtcbiAgICAgICAgICAgIGNhc2UgRnJlcXVlbmN5LlNFQ09ORExZOiByZXR1cm4gdGhpcy5zdGltZXNldC5iaW5kKHRoaXMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gSXRlcmluZm87XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgSXRlcmluZm87XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgZGF0ZXV0aWwgZnJvbSAnLi4vZGF0ZXV0aWwnO1xuaW1wb3J0IHsgcHltb2QsIGlzUHJlc2VudCwgaW5jbHVkZXMgfSBmcm9tICcuLi9oZWxwZXJzJztcbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBvc2xpc3QoYnlzZXRwb3MsIHRpbWVzZXQsIHN0YXJ0LCBlbmQsIGlpLCBkYXlzZXQpIHtcbiAgICB2YXIgcG9zbGlzdCA9IFtdO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgYnlzZXRwb3MubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGRheXBvcyA9IHZvaWQgMDtcbiAgICAgICAgdmFyIHRpbWVwb3MgPSB2b2lkIDA7XG4gICAgICAgIHZhciBwb3MgPSBieXNldHBvc1tqXTtcbiAgICAgICAgaWYgKHBvcyA8IDApIHtcbiAgICAgICAgICAgIGRheXBvcyA9IE1hdGguZmxvb3IocG9zIC8gdGltZXNldC5sZW5ndGgpO1xuICAgICAgICAgICAgdGltZXBvcyA9IHB5bW9kKHBvcywgdGltZXNldC5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGF5cG9zID0gTWF0aC5mbG9vcigocG9zIC0gMSkgLyB0aW1lc2V0Lmxlbmd0aCk7XG4gICAgICAgICAgICB0aW1lcG9zID0gcHltb2QocG9zIC0gMSwgdGltZXNldC5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0bXAgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgayA9IHN0YXJ0OyBrIDwgZW5kOyBrKyspIHtcbiAgICAgICAgICAgIHZhciB2YWwgPSBkYXlzZXRba107XG4gICAgICAgICAgICBpZiAoIWlzUHJlc2VudCh2YWwpKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgdG1wLnB1c2godmFsKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaSA9IHZvaWQgMDtcbiAgICAgICAgaWYgKGRheXBvcyA8IDApIHtcbiAgICAgICAgICAgIGkgPSB0bXAuc2xpY2UoZGF5cG9zKVswXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGkgPSB0bXBbZGF5cG9zXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdGltZSA9IHRpbWVzZXRbdGltZXBvc107XG4gICAgICAgIHZhciBkYXRlID0gZGF0ZXV0aWwuZnJvbU9yZGluYWwoaWkueWVhcm9yZGluYWwgKyBpKTtcbiAgICAgICAgdmFyIHJlcyA9IGRhdGV1dGlsLmNvbWJpbmUoZGF0ZSwgdGltZSk7XG4gICAgICAgIC8vIFhYWDogY2FuIHRoaXMgZXZlciBiZSBpbiB0aGUgYXJyYXk/XG4gICAgICAgIC8vIC0gY29tcGFyZSB0aGUgYWN0dWFsIGRhdGUgaW5zdGVhZD9cbiAgICAgICAgaWYgKCFpbmNsdWRlcyhwb3NsaXN0LCByZXMpKVxuICAgICAgICAgICAgcG9zbGlzdC5wdXNoKHJlcyk7XG4gICAgfVxuICAgIGRhdGV1dGlsLnNvcnQocG9zbGlzdCk7XG4gICAgcmV0dXJuIHBvc2xpc3Q7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wb3NsaXN0LmpzLm1hcCIsImltcG9ydCB7IGZyZXFJc0RhaWx5T3JHcmVhdGVyIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IGRhdGV1dGlsIGZyb20gJy4uL2RhdGV1dGlsJztcbmltcG9ydCBJdGVyaW5mbyBmcm9tICcuLi9pdGVyaW5mby9pbmRleCc7XG5pbXBvcnQgUlJ1bGUgZnJvbSAnLi4vcnJ1bGUnO1xuaW1wb3J0IHsgYnVpbGRUaW1lc2V0IH0gZnJvbSAnLi4vcGFyc2VvcHRpb25zJztcbmltcG9ydCB7IG5vdEVtcHR5LCBpbmNsdWRlcywgaXNQcmVzZW50IH0gZnJvbSAnLi4vaGVscGVycyc7XG5pbXBvcnQgeyBEYXRlV2l0aFpvbmUgfSBmcm9tICcuLi9kYXRld2l0aHpvbmUnO1xuaW1wb3J0IHsgYnVpbGRQb3NsaXN0IH0gZnJvbSAnLi9wb3NsaXN0JztcbmltcG9ydCB7IERhdGVUaW1lIH0gZnJvbSAnLi4vZGF0ZXRpbWUnO1xuZXhwb3J0IGZ1bmN0aW9uIGl0ZXIoaXRlclJlc3VsdCwgb3B0aW9ucykge1xuICAgIHZhciBkdHN0YXJ0ID0gb3B0aW9ucy5kdHN0YXJ0LCBmcmVxID0gb3B0aW9ucy5mcmVxLCBpbnRlcnZhbCA9IG9wdGlvbnMuaW50ZXJ2YWwsIHVudGlsID0gb3B0aW9ucy51bnRpbCwgYnlzZXRwb3MgPSBvcHRpb25zLmJ5c2V0cG9zO1xuICAgIHZhciBjb3VudCA9IG9wdGlvbnMuY291bnQ7XG4gICAgaWYgKGNvdW50ID09PSAwIHx8IGludGVydmFsID09PSAwKSB7XG4gICAgICAgIHJldHVybiBlbWl0UmVzdWx0KGl0ZXJSZXN1bHQpO1xuICAgIH1cbiAgICB2YXIgY291bnRlckRhdGUgPSBEYXRlVGltZS5mcm9tRGF0ZShkdHN0YXJ0KTtcbiAgICB2YXIgaWkgPSBuZXcgSXRlcmluZm8ob3B0aW9ucyk7XG4gICAgaWkucmVidWlsZChjb3VudGVyRGF0ZS55ZWFyLCBjb3VudGVyRGF0ZS5tb250aCk7XG4gICAgdmFyIHRpbWVzZXQgPSBtYWtlVGltZXNldChpaSwgY291bnRlckRhdGUsIG9wdGlvbnMpO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHZhciBfYSA9IGlpLmdldGRheXNldChmcmVxKShjb3VudGVyRGF0ZS55ZWFyLCBjb3VudGVyRGF0ZS5tb250aCwgY291bnRlckRhdGUuZGF5KSwgZGF5c2V0ID0gX2FbMF0sIHN0YXJ0ID0gX2FbMV0sIGVuZCA9IF9hWzJdO1xuICAgICAgICB2YXIgZmlsdGVyZWQgPSByZW1vdmVGaWx0ZXJlZERheXMoZGF5c2V0LCBzdGFydCwgZW5kLCBpaSwgb3B0aW9ucyk7XG4gICAgICAgIGlmIChub3RFbXB0eShieXNldHBvcykpIHtcbiAgICAgICAgICAgIHZhciBwb3NsaXN0ID0gYnVpbGRQb3NsaXN0KGJ5c2V0cG9zLCB0aW1lc2V0LCBzdGFydCwgZW5kLCBpaSwgZGF5c2V0KTtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcG9zbGlzdC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHZhciByZXMgPSBwb3NsaXN0W2pdO1xuICAgICAgICAgICAgICAgIGlmICh1bnRpbCAmJiByZXMgPiB1bnRpbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1pdFJlc3VsdChpdGVyUmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlcyA+PSBkdHN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXpvbmVkRGF0ZSA9IHJlem9uZUlmTmVlZGVkKHJlcywgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXRlclJlc3VsdC5hY2NlcHQocmV6b25lZERhdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1pdFJlc3VsdChpdGVyUmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoY291bnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC0tY291bnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvdW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtaXRSZXN1bHQoaXRlclJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gc3RhcnQ7IGogPCBlbmQ7IGorKykge1xuICAgICAgICAgICAgICAgIHZhciBjdXJyZW50RGF5ID0gZGF5c2V0W2pdO1xuICAgICAgICAgICAgICAgIGlmICghaXNQcmVzZW50KGN1cnJlbnREYXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgZGF0ZSA9IGRhdGV1dGlsLmZyb21PcmRpbmFsKGlpLnllYXJvcmRpbmFsICsgY3VycmVudERheSk7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCB0aW1lc2V0Lmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0aW1lID0gdGltZXNldFtrXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlcyA9IGRhdGV1dGlsLmNvbWJpbmUoZGF0ZSwgdGltZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1bnRpbCAmJiByZXMgPiB1bnRpbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtaXRSZXN1bHQoaXRlclJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyA+PSBkdHN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmV6b25lZERhdGUgPSByZXpvbmVJZk5lZWRlZChyZXMsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpdGVyUmVzdWx0LmFjY2VwdChyZXpvbmVkRGF0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1pdFJlc3VsdChpdGVyUmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tY291bnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb3VudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1pdFJlc3VsdChpdGVyUmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuaW50ZXJ2YWwgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBlbWl0UmVzdWx0KGl0ZXJSZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEhhbmRsZSBmcmVxdWVuY3kgYW5kIGludGVydmFsXG4gICAgICAgIGNvdW50ZXJEYXRlLmFkZChvcHRpb25zLCBmaWx0ZXJlZCk7XG4gICAgICAgIGlmIChjb3VudGVyRGF0ZS55ZWFyID4gZGF0ZXV0aWwuTUFYWUVBUikge1xuICAgICAgICAgICAgcmV0dXJuIGVtaXRSZXN1bHQoaXRlclJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmcmVxSXNEYWlseU9yR3JlYXRlcihmcmVxKSkge1xuICAgICAgICAgICAgdGltZXNldCA9IGlpLmdldHRpbWVzZXQoZnJlcSkoY291bnRlckRhdGUuaG91ciwgY291bnRlckRhdGUubWludXRlLCBjb3VudGVyRGF0ZS5zZWNvbmQsIDApO1xuICAgICAgICB9XG4gICAgICAgIGlpLnJlYnVpbGQoY291bnRlckRhdGUueWVhciwgY291bnRlckRhdGUubW9udGgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGlzRmlsdGVyZWQoaWksIGN1cnJlbnREYXksIG9wdGlvbnMpIHtcbiAgICB2YXIgYnltb250aCA9IG9wdGlvbnMuYnltb250aCwgYnl3ZWVrbm8gPSBvcHRpb25zLmJ5d2Vla25vLCBieXdlZWtkYXkgPSBvcHRpb25zLmJ5d2Vla2RheSwgYnllYXN0ZXIgPSBvcHRpb25zLmJ5ZWFzdGVyLCBieW1vbnRoZGF5ID0gb3B0aW9ucy5ieW1vbnRoZGF5LCBieW5tb250aGRheSA9IG9wdGlvbnMuYnlubW9udGhkYXksIGJ5eWVhcmRheSA9IG9wdGlvbnMuYnl5ZWFyZGF5O1xuICAgIHJldHVybiAoKG5vdEVtcHR5KGJ5bW9udGgpICYmICFpbmNsdWRlcyhieW1vbnRoLCBpaS5tbWFza1tjdXJyZW50RGF5XSkpIHx8XG4gICAgICAgIChub3RFbXB0eShieXdlZWtubykgJiYgIWlpLndub21hc2tbY3VycmVudERheV0pIHx8XG4gICAgICAgIChub3RFbXB0eShieXdlZWtkYXkpICYmICFpbmNsdWRlcyhieXdlZWtkYXksIGlpLndkYXltYXNrW2N1cnJlbnREYXldKSkgfHxcbiAgICAgICAgKG5vdEVtcHR5KGlpLm53ZGF5bWFzaykgJiYgIWlpLm53ZGF5bWFza1tjdXJyZW50RGF5XSkgfHxcbiAgICAgICAgKGJ5ZWFzdGVyICE9PSBudWxsICYmICFpbmNsdWRlcyhpaS5lYXN0ZXJtYXNrLCBjdXJyZW50RGF5KSkgfHxcbiAgICAgICAgKChub3RFbXB0eShieW1vbnRoZGF5KSB8fCBub3RFbXB0eShieW5tb250aGRheSkpICYmXG4gICAgICAgICAgICAhaW5jbHVkZXMoYnltb250aGRheSwgaWkubWRheW1hc2tbY3VycmVudERheV0pICYmXG4gICAgICAgICAgICAhaW5jbHVkZXMoYnlubW9udGhkYXksIGlpLm5tZGF5bWFza1tjdXJyZW50RGF5XSkpIHx8XG4gICAgICAgIChub3RFbXB0eShieXllYXJkYXkpICYmXG4gICAgICAgICAgICAoKGN1cnJlbnREYXkgPCBpaS55ZWFybGVuICYmXG4gICAgICAgICAgICAgICAgIWluY2x1ZGVzKGJ5eWVhcmRheSwgY3VycmVudERheSArIDEpICYmXG4gICAgICAgICAgICAgICAgIWluY2x1ZGVzKGJ5eWVhcmRheSwgLWlpLnllYXJsZW4gKyBjdXJyZW50RGF5KSkgfHxcbiAgICAgICAgICAgICAgICAoY3VycmVudERheSA+PSBpaS55ZWFybGVuICYmXG4gICAgICAgICAgICAgICAgICAgICFpbmNsdWRlcyhieXllYXJkYXksIGN1cnJlbnREYXkgKyAxIC0gaWkueWVhcmxlbikgJiZcbiAgICAgICAgICAgICAgICAgICAgIWluY2x1ZGVzKGJ5eWVhcmRheSwgLWlpLm5leHR5ZWFybGVuICsgY3VycmVudERheSAtIGlpLnllYXJsZW4pKSkpKTtcbn1cbmZ1bmN0aW9uIHJlem9uZUlmTmVlZGVkKGRhdGUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IERhdGVXaXRoWm9uZShkYXRlLCBvcHRpb25zLnR6aWQpLnJlem9uZWREYXRlKCk7XG59XG5mdW5jdGlvbiBlbWl0UmVzdWx0KGl0ZXJSZXN1bHQpIHtcbiAgICByZXR1cm4gaXRlclJlc3VsdC5nZXRWYWx1ZSgpO1xufVxuZnVuY3Rpb24gcmVtb3ZlRmlsdGVyZWREYXlzKGRheXNldCwgc3RhcnQsIGVuZCwgaWksIG9wdGlvbnMpIHtcbiAgICB2YXIgZmlsdGVyZWQgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBkYXlDb3VudGVyID0gc3RhcnQ7IGRheUNvdW50ZXIgPCBlbmQ7IGRheUNvdW50ZXIrKykge1xuICAgICAgICB2YXIgY3VycmVudERheSA9IGRheXNldFtkYXlDb3VudGVyXTtcbiAgICAgICAgZmlsdGVyZWQgPSBpc0ZpbHRlcmVkKGlpLCBjdXJyZW50RGF5LCBvcHRpb25zKTtcbiAgICAgICAgaWYgKGZpbHRlcmVkKVxuICAgICAgICAgICAgZGF5c2V0W2N1cnJlbnREYXldID0gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGZpbHRlcmVkO1xufVxuZnVuY3Rpb24gbWFrZVRpbWVzZXQoaWksIGNvdW50ZXJEYXRlLCBvcHRpb25zKSB7XG4gICAgdmFyIGZyZXEgPSBvcHRpb25zLmZyZXEsIGJ5aG91ciA9IG9wdGlvbnMuYnlob3VyLCBieW1pbnV0ZSA9IG9wdGlvbnMuYnltaW51dGUsIGJ5c2Vjb25kID0gb3B0aW9ucy5ieXNlY29uZDtcbiAgICBpZiAoZnJlcUlzRGFpbHlPckdyZWF0ZXIoZnJlcSkpIHtcbiAgICAgICAgcmV0dXJuIGJ1aWxkVGltZXNldChvcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKChmcmVxID49IFJSdWxlLkhPVVJMWSAmJlxuICAgICAgICBub3RFbXB0eShieWhvdXIpICYmXG4gICAgICAgICFpbmNsdWRlcyhieWhvdXIsIGNvdW50ZXJEYXRlLmhvdXIpKSB8fFxuICAgICAgICAoZnJlcSA+PSBSUnVsZS5NSU5VVEVMWSAmJlxuICAgICAgICAgICAgbm90RW1wdHkoYnltaW51dGUpICYmXG4gICAgICAgICAgICAhaW5jbHVkZXMoYnltaW51dGUsIGNvdW50ZXJEYXRlLm1pbnV0ZSkpIHx8XG4gICAgICAgIChmcmVxID49IFJSdWxlLlNFQ09ORExZICYmXG4gICAgICAgICAgICBub3RFbXB0eShieXNlY29uZCkgJiZcbiAgICAgICAgICAgICFpbmNsdWRlcyhieXNlY29uZCwgY291bnRlckRhdGUuc2Vjb25kKSkpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICByZXR1cm4gaWkuZ2V0dGltZXNldChmcmVxKShjb3VudGVyRGF0ZS5ob3VyLCBjb3VudGVyRGF0ZS5taW51dGUsIGNvdW50ZXJEYXRlLnNlY29uZCwgY291bnRlckRhdGUubWlsbGlzZWNvbmQpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiaW1wb3J0IGRhdGV1dGlsIGZyb20gJy4vZGF0ZXV0aWwnO1xuaW1wb3J0IEl0ZXJSZXN1bHQgZnJvbSAnLi9pdGVycmVzdWx0JztcbmltcG9ydCBDYWxsYmFja0l0ZXJSZXN1bHQgZnJvbSAnLi9jYWxsYmFja2l0ZXJyZXN1bHQnO1xuaW1wb3J0IHsgZnJvbVRleHQsIHBhcnNlVGV4dCwgdG9UZXh0LCBpc0Z1bGx5Q29udmVydGlibGUgfSBmcm9tICcuL25scC9pbmRleCc7XG5pbXBvcnQgeyBGcmVxdWVuY3kgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IHBhcnNlT3B0aW9ucywgaW5pdGlhbGl6ZU9wdGlvbnMgfSBmcm9tICcuL3BhcnNlb3B0aW9ucyc7XG5pbXBvcnQgeyBwYXJzZVN0cmluZyB9IGZyb20gJy4vcGFyc2VzdHJpbmcnO1xuaW1wb3J0IHsgb3B0aW9uc1RvU3RyaW5nIH0gZnJvbSAnLi9vcHRpb25zdG9zdHJpbmcnO1xuaW1wb3J0IHsgQ2FjaGUgfSBmcm9tICcuL2NhY2hlJztcbmltcG9ydCB7IFdlZWtkYXkgfSBmcm9tICcuL3dlZWtkYXknO1xuaW1wb3J0IHsgaXRlciB9IGZyb20gJy4vaXRlci9pbmRleCc7XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUlJ1bGVcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgdmFyIERheXMgPSB7XG4gICAgTU86IG5ldyBXZWVrZGF5KDApLFxuICAgIFRVOiBuZXcgV2Vla2RheSgxKSxcbiAgICBXRTogbmV3IFdlZWtkYXkoMiksXG4gICAgVEg6IG5ldyBXZWVrZGF5KDMpLFxuICAgIEZSOiBuZXcgV2Vla2RheSg0KSxcbiAgICBTQTogbmV3IFdlZWtkYXkoNSksXG4gICAgU1U6IG5ldyBXZWVrZGF5KDYpXG59O1xuZXhwb3J0IHZhciBERUZBVUxUX09QVElPTlMgPSB7XG4gICAgZnJlcTogRnJlcXVlbmN5LllFQVJMWSxcbiAgICBkdHN0YXJ0OiBudWxsLFxuICAgIGludGVydmFsOiAxLFxuICAgIHdrc3Q6IERheXMuTU8sXG4gICAgY291bnQ6IG51bGwsXG4gICAgdW50aWw6IG51bGwsXG4gICAgdHppZDogbnVsbCxcbiAgICBieXNldHBvczogbnVsbCxcbiAgICBieW1vbnRoOiBudWxsLFxuICAgIGJ5bW9udGhkYXk6IG51bGwsXG4gICAgYnlubW9udGhkYXk6IG51bGwsXG4gICAgYnl5ZWFyZGF5OiBudWxsLFxuICAgIGJ5d2Vla25vOiBudWxsLFxuICAgIGJ5d2Vla2RheTogbnVsbCxcbiAgICBieW53ZWVrZGF5OiBudWxsLFxuICAgIGJ5aG91cjogbnVsbCxcbiAgICBieW1pbnV0ZTogbnVsbCxcbiAgICBieXNlY29uZDogbnVsbCxcbiAgICBieWVhc3RlcjogbnVsbFxufTtcbmV4cG9ydCB2YXIgZGVmYXVsdEtleXMgPSBPYmplY3Qua2V5cyhERUZBVUxUX09QVElPTlMpO1xuLyoqXG4gKlxuICogQHBhcmFtIHtPcHRpb25zP30gb3B0aW9ucyAtIHNlZSA8aHR0cDovL2xhYml4Lm9yZy9weXRob24tZGF0ZXV0aWwvI2hlYWQtY2YwMDRlZTlhNzU1OTI3OTdlMDc2NzUyYjJhODg5YzEwZjQ0NTQxOD5cbiAqICAgICAgICBUaGUgb25seSByZXF1aXJlZCBvcHRpb24gaXMgYGZyZXFgLCBvbmUgb2YgUlJ1bGUuWUVBUkxZLCBSUnVsZS5NT05USExZLCAuLi5cbiAqIEBjb25zdHJ1Y3RvclxuICovXG52YXIgUlJ1bGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUlJ1bGUob3B0aW9ucywgbm9DYWNoZSkge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICBpZiAobm9DYWNoZSA9PT0gdm9pZCAwKSB7IG5vQ2FjaGUgPSBmYWxzZTsgfVxuICAgICAgICAvLyBSRkMgc3RyaW5nXG4gICAgICAgIHRoaXMuX2NhY2hlID0gbm9DYWNoZSA/IG51bGwgOiBuZXcgQ2FjaGUoKTtcbiAgICAgICAgLy8gdXNlZCBieSB0b1N0cmluZygpXG4gICAgICAgIHRoaXMub3JpZ09wdGlvbnMgPSBpbml0aWFsaXplT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgdmFyIHBhcnNlZE9wdGlvbnMgPSBwYXJzZU9wdGlvbnMob3B0aW9ucykucGFyc2VkT3B0aW9ucztcbiAgICAgICAgdGhpcy5vcHRpb25zID0gcGFyc2VkT3B0aW9ucztcbiAgICB9XG4gICAgUlJ1bGUucGFyc2VUZXh0ID0gZnVuY3Rpb24gKHRleHQsIGxhbmd1YWdlKSB7XG4gICAgICAgIHJldHVybiBwYXJzZVRleHQodGV4dCwgbGFuZ3VhZ2UpO1xuICAgIH07XG4gICAgUlJ1bGUuZnJvbVRleHQgPSBmdW5jdGlvbiAodGV4dCwgbGFuZ3VhZ2UpIHtcbiAgICAgICAgcmV0dXJuIGZyb21UZXh0KHRleHQsIGxhbmd1YWdlKTtcbiAgICB9O1xuICAgIFJSdWxlLmZyb21TdHJpbmcgPSBmdW5jdGlvbiAoc3RyKSB7XG4gICAgICAgIHJldHVybiBuZXcgUlJ1bGUoUlJ1bGUucGFyc2VTdHJpbmcoc3RyKSB8fCB1bmRlZmluZWQpO1xuICAgIH07XG4gICAgUlJ1bGUucHJvdG90eXBlLl9pdGVyID0gZnVuY3Rpb24gKGl0ZXJSZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXIoaXRlclJlc3VsdCwgdGhpcy5vcHRpb25zKTtcbiAgICB9O1xuICAgIFJSdWxlLnByb3RvdHlwZS5fY2FjaGVHZXQgPSBmdW5jdGlvbiAod2hhdCwgYXJncykge1xuICAgICAgICBpZiAoIXRoaXMuX2NhY2hlKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FjaGUuX2NhY2hlR2V0KHdoYXQsIGFyZ3MpO1xuICAgIH07XG4gICAgUlJ1bGUucHJvdG90eXBlLl9jYWNoZUFkZCA9IGZ1bmN0aW9uICh3aGF0LCB2YWx1ZSwgYXJncykge1xuICAgICAgICBpZiAoIXRoaXMuX2NhY2hlKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FjaGUuX2NhY2hlQWRkKHdoYXQsIHZhbHVlLCBhcmdzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdG9yIC0gb3B0aW9uYWwgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZFxuICAgICAqICAgICAgICAgICAgICAgICAgIG9uIGVhY2ggZGF0ZSB0aGF0IGlzIGFkZGVkLiBJdCBjYW4gcmV0dXJuIGZhbHNlXG4gICAgICogICAgICAgICAgICAgICAgICAgdG8gc3RvcCB0aGUgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm4gQXJyYXkgY29udGFpbmluZyBhbGwgcmVjdXJyZW5jZXMuXG4gICAgICovXG4gICAgUlJ1bGUucHJvdG90eXBlLmFsbCA9IGZ1bmN0aW9uIChpdGVyYXRvcikge1xuICAgICAgICBpZiAoaXRlcmF0b3IpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pdGVyKG5ldyBDYWxsYmFja0l0ZXJSZXN1bHQoJ2FsbCcsIHt9LCBpdGVyYXRvcikpO1xuICAgICAgICB9XG4gICAgICAgIHZhciByZXN1bHQgPSB0aGlzLl9jYWNoZUdldCgnYWxsJyk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXN1bHQgPSB0aGlzLl9pdGVyKG5ldyBJdGVyUmVzdWx0KCdhbGwnLCB7fSkpO1xuICAgICAgICAgICAgdGhpcy5fY2FjaGVBZGQoJ2FsbCcsIHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWxsIHRoZSBvY2N1cnJlbmNlcyBvZiB0aGUgcnJ1bGUgYmV0d2VlbiBhZnRlciBhbmQgYmVmb3JlLlxuICAgICAqIFRoZSBpbmMga2V5d29yZCBkZWZpbmVzIHdoYXQgaGFwcGVucyBpZiBhZnRlciBhbmQvb3IgYmVmb3JlIGFyZVxuICAgICAqIHRoZW1zZWx2ZXMgb2NjdXJyZW5jZXMuIFdpdGggaW5jID09IFRydWUsIHRoZXkgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGVcbiAgICAgKiBsaXN0LCBpZiB0aGV5IGFyZSBmb3VuZCBpbiB0aGUgcmVjdXJyZW5jZSBzZXQuXG4gICAgICogQHJldHVybiBBcnJheVxuICAgICAqL1xuICAgIFJSdWxlLnByb3RvdHlwZS5iZXR3ZWVuID0gZnVuY3Rpb24gKGFmdGVyLCBiZWZvcmUsIGluYywgaXRlcmF0b3IpIHtcbiAgICAgICAgaWYgKGluYyA9PT0gdm9pZCAwKSB7IGluYyA9IGZhbHNlOyB9XG4gICAgICAgIGlmICghZGF0ZXV0aWwuaXNWYWxpZERhdGUoYWZ0ZXIpIHx8ICFkYXRldXRpbC5pc1ZhbGlkRGF0ZShiZWZvcmUpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGRhdGUgcGFzc2VkIGluIHRvIFJSdWxlLmJldHdlZW4nKTtcbiAgICAgICAgdmFyIGFyZ3MgPSB7XG4gICAgICAgICAgICBiZWZvcmU6IGJlZm9yZSxcbiAgICAgICAgICAgIGFmdGVyOiBhZnRlcixcbiAgICAgICAgICAgIGluYzogaW5jXG4gICAgICAgIH07XG4gICAgICAgIGlmIChpdGVyYXRvcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZXIobmV3IENhbGxiYWNrSXRlclJlc3VsdCgnYmV0d2VlbicsIGFyZ3MsIGl0ZXJhdG9yKSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuX2NhY2hlR2V0KCdiZXR3ZWVuJywgYXJncyk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXN1bHQgPSB0aGlzLl9pdGVyKG5ldyBJdGVyUmVzdWx0KCdiZXR3ZWVuJywgYXJncykpO1xuICAgICAgICAgICAgdGhpcy5fY2FjaGVBZGQoJ2JldHdlZW4nLCByZXN1bHQsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBsYXN0IHJlY3VycmVuY2UgYmVmb3JlIHRoZSBnaXZlbiBkYXRldGltZSBpbnN0YW5jZS5cbiAgICAgKiBUaGUgaW5jIGtleXdvcmQgZGVmaW5lcyB3aGF0IGhhcHBlbnMgaWYgZHQgaXMgYW4gb2NjdXJyZW5jZS5cbiAgICAgKiBXaXRoIGluYyA9PSBUcnVlLCBpZiBkdCBpdHNlbGYgaXMgYW4gb2NjdXJyZW5jZSwgaXQgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAcmV0dXJuIERhdGUgb3IgbnVsbFxuICAgICAqL1xuICAgIFJSdWxlLnByb3RvdHlwZS5iZWZvcmUgPSBmdW5jdGlvbiAoZHQsIGluYykge1xuICAgICAgICBpZiAoaW5jID09PSB2b2lkIDApIHsgaW5jID0gZmFsc2U7IH1cbiAgICAgICAgaWYgKCFkYXRldXRpbC5pc1ZhbGlkRGF0ZShkdCkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZGF0ZSBwYXNzZWQgaW4gdG8gUlJ1bGUuYmVmb3JlJyk7XG4gICAgICAgIHZhciBhcmdzID0geyBkdDogZHQsIGluYzogaW5jIH07XG4gICAgICAgIHZhciByZXN1bHQgPSB0aGlzLl9jYWNoZUdldCgnYmVmb3JlJywgYXJncyk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXN1bHQgPSB0aGlzLl9pdGVyKG5ldyBJdGVyUmVzdWx0KCdiZWZvcmUnLCBhcmdzKSk7XG4gICAgICAgICAgICB0aGlzLl9jYWNoZUFkZCgnYmVmb3JlJywgcmVzdWx0LCBhcmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZmlyc3QgcmVjdXJyZW5jZSBhZnRlciB0aGUgZ2l2ZW4gZGF0ZXRpbWUgaW5zdGFuY2UuXG4gICAgICogVGhlIGluYyBrZXl3b3JkIGRlZmluZXMgd2hhdCBoYXBwZW5zIGlmIGR0IGlzIGFuIG9jY3VycmVuY2UuXG4gICAgICogV2l0aCBpbmMgPT0gVHJ1ZSwgaWYgZHQgaXRzZWxmIGlzIGFuIG9jY3VycmVuY2UsIGl0IHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHJldHVybiBEYXRlIG9yIG51bGxcbiAgICAgKi9cbiAgICBSUnVsZS5wcm90b3R5cGUuYWZ0ZXIgPSBmdW5jdGlvbiAoZHQsIGluYykge1xuICAgICAgICBpZiAoaW5jID09PSB2b2lkIDApIHsgaW5jID0gZmFsc2U7IH1cbiAgICAgICAgaWYgKCFkYXRldXRpbC5pc1ZhbGlkRGF0ZShkdCkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZGF0ZSBwYXNzZWQgaW4gdG8gUlJ1bGUuYWZ0ZXInKTtcbiAgICAgICAgdmFyIGFyZ3MgPSB7IGR0OiBkdCwgaW5jOiBpbmMgfTtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuX2NhY2hlR2V0KCdhZnRlcicsIGFyZ3MpO1xuICAgICAgICBpZiAocmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5faXRlcihuZXcgSXRlclJlc3VsdCgnYWZ0ZXInLCBhcmdzKSk7XG4gICAgICAgICAgICB0aGlzLl9jYWNoZUFkZCgnYWZ0ZXInLCByZXN1bHQsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcmVjdXJyZW5jZXMgaW4gdGhpcyBzZXQuIEl0IHdpbGwgaGF2ZSBnbyB0cm91Z2hcbiAgICAgKiB0aGUgd2hvbGUgcmVjdXJyZW5jZSwgaWYgdGhpcyBoYXNuJ3QgYmVlbiBkb25lIGJlZm9yZS5cbiAgICAgKi9cbiAgICBSUnVsZS5wcm90b3R5cGUuY291bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFsbCgpLmxlbmd0aDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSBycnVsZSBpbnRvIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb25cbiAgICAgKiBAc2VlIDxodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyNDQ1LnR4dD5cbiAgICAgKiBAcmV0dXJuIFN0cmluZ1xuICAgICAqL1xuICAgIFJSdWxlLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnNUb1N0cmluZyh0aGlzLm9yaWdPcHRpb25zKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFdpbGwgY29udmVydCBhbGwgcnVsZXMgZGVzY3JpYmVkIGluIG5scDpUb1RleHRcbiAgICAgKiB0byB0ZXh0LlxuICAgICAqL1xuICAgIFJSdWxlLnByb3RvdHlwZS50b1RleHQgPSBmdW5jdGlvbiAoZ2V0dGV4dCwgbGFuZ3VhZ2UsIGRhdGVGb3JtYXR0ZXIpIHtcbiAgICAgICAgcmV0dXJuIHRvVGV4dCh0aGlzLCBnZXR0ZXh0LCBsYW5ndWFnZSwgZGF0ZUZvcm1hdHRlcik7XG4gICAgfTtcbiAgICBSUnVsZS5wcm90b3R5cGUuaXNGdWxseUNvbnZlcnRpYmxlVG9UZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gaXNGdWxseUNvbnZlcnRpYmxlKHRoaXMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQHJldHVybiBhIFJSdWxlIGluc3RhbmNlIHdpdGggdGhlIHNhbWUgZnJlcSBhbmQgb3B0aW9uc1xuICAgICAqICAgICAgICAgIGFzIHRoaXMgb25lIChjYWNoZSBpcyBub3QgY2xvbmVkKVxuICAgICAqL1xuICAgIFJSdWxlLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSUnVsZSh0aGlzLm9yaWdPcHRpb25zKTtcbiAgICB9O1xuICAgIC8vIFJSdWxlIGNsYXNzICdjb25zdGFudHMnXG4gICAgUlJ1bGUuRlJFUVVFTkNJRVMgPSBbXG4gICAgICAgICdZRUFSTFknLFxuICAgICAgICAnTU9OVEhMWScsXG4gICAgICAgICdXRUVLTFknLFxuICAgICAgICAnREFJTFknLFxuICAgICAgICAnSE9VUkxZJyxcbiAgICAgICAgJ01JTlVURUxZJyxcbiAgICAgICAgJ1NFQ09ORExZJ1xuICAgIF07XG4gICAgUlJ1bGUuWUVBUkxZID0gRnJlcXVlbmN5LllFQVJMWTtcbiAgICBSUnVsZS5NT05USExZID0gRnJlcXVlbmN5Lk1PTlRITFk7XG4gICAgUlJ1bGUuV0VFS0xZID0gRnJlcXVlbmN5LldFRUtMWTtcbiAgICBSUnVsZS5EQUlMWSA9IEZyZXF1ZW5jeS5EQUlMWTtcbiAgICBSUnVsZS5IT1VSTFkgPSBGcmVxdWVuY3kuSE9VUkxZO1xuICAgIFJSdWxlLk1JTlVURUxZID0gRnJlcXVlbmN5Lk1JTlVURUxZO1xuICAgIFJSdWxlLlNFQ09ORExZID0gRnJlcXVlbmN5LlNFQ09ORExZO1xuICAgIFJSdWxlLk1PID0gRGF5cy5NTztcbiAgICBSUnVsZS5UVSA9IERheXMuVFU7XG4gICAgUlJ1bGUuV0UgPSBEYXlzLldFO1xuICAgIFJSdWxlLlRIID0gRGF5cy5USDtcbiAgICBSUnVsZS5GUiA9IERheXMuRlI7XG4gICAgUlJ1bGUuU0EgPSBEYXlzLlNBO1xuICAgIFJSdWxlLlNVID0gRGF5cy5TVTtcbiAgICBSUnVsZS5wYXJzZVN0cmluZyA9IHBhcnNlU3RyaW5nO1xuICAgIFJSdWxlLm9wdGlvbnNUb1N0cmluZyA9IG9wdGlvbnNUb1N0cmluZztcbiAgICByZXR1cm4gUlJ1bGU7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUlJ1bGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ycnVsZS5qcy5tYXAiLCJpbXBvcnQgeyBEYXRlV2l0aFpvbmUgfSBmcm9tICcuL2RhdGV3aXRoem9uZSc7XG5pbXBvcnQgeyBpdGVyIH0gZnJvbSAnLi9pdGVyL2luZGV4JztcbmltcG9ydCBkYXRldXRpbCBmcm9tICcuL2RhdGV1dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBpdGVyU2V0KGl0ZXJSZXN1bHQsIF9ycnVsZSwgX2V4cnVsZSwgX3JkYXRlLCBfZXhkYXRlLCB0emlkKSB7XG4gICAgdmFyIF9leGRhdGVIYXNoID0ge307XG4gICAgdmFyIF9hY2NlcHQgPSBpdGVyUmVzdWx0LmFjY2VwdDtcbiAgICBmdW5jdGlvbiBldmFsRXhkYXRlKGFmdGVyLCBiZWZvcmUpIHtcbiAgICAgICAgX2V4cnVsZS5mb3JFYWNoKGZ1bmN0aW9uIChycnVsZSkge1xuICAgICAgICAgICAgcnJ1bGUuYmV0d2VlbihhZnRlciwgYmVmb3JlLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRlKSB7XG4gICAgICAgICAgICAgICAgX2V4ZGF0ZUhhc2hbTnVtYmVyKGRhdGUpXSA9IHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9leGRhdGUuZm9yRWFjaChmdW5jdGlvbiAoZGF0ZSkge1xuICAgICAgICB2YXIgem9uZWREYXRlID0gbmV3IERhdGVXaXRoWm9uZShkYXRlLCB0emlkKS5yZXpvbmVkRGF0ZSgpO1xuICAgICAgICBfZXhkYXRlSGFzaFtOdW1iZXIoem9uZWREYXRlKV0gPSB0cnVlO1xuICAgIH0pO1xuICAgIGl0ZXJSZXN1bHQuYWNjZXB0ID0gZnVuY3Rpb24gKGRhdGUpIHtcbiAgICAgICAgdmFyIGR0ID0gTnVtYmVyKGRhdGUpO1xuICAgICAgICBpZiAoaXNOYU4oZHQpKVxuICAgICAgICAgICAgcmV0dXJuIF9hY2NlcHQuY2FsbCh0aGlzLCBkYXRlKTtcbiAgICAgICAgaWYgKCFfZXhkYXRlSGFzaFtkdF0pIHtcbiAgICAgICAgICAgIGV2YWxFeGRhdGUobmV3IERhdGUoZHQgLSAxKSwgbmV3IERhdGUoZHQgKyAxKSk7XG4gICAgICAgICAgICBpZiAoIV9leGRhdGVIYXNoW2R0XSkge1xuICAgICAgICAgICAgICAgIF9leGRhdGVIYXNoW2R0XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9hY2NlcHQuY2FsbCh0aGlzLCBkYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIGlmIChpdGVyUmVzdWx0Lm1ldGhvZCA9PT0gJ2JldHdlZW4nKSB7XG4gICAgICAgIGV2YWxFeGRhdGUoaXRlclJlc3VsdC5hcmdzLmFmdGVyLCBpdGVyUmVzdWx0LmFyZ3MuYmVmb3JlKTtcbiAgICAgICAgaXRlclJlc3VsdC5hY2NlcHQgPSBmdW5jdGlvbiAoZGF0ZSkge1xuICAgICAgICAgICAgdmFyIGR0ID0gTnVtYmVyKGRhdGUpO1xuICAgICAgICAgICAgaWYgKCFfZXhkYXRlSGFzaFtkdF0pIHtcbiAgICAgICAgICAgICAgICBfZXhkYXRlSGFzaFtkdF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBfYWNjZXB0LmNhbGwodGhpcywgZGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBfcmRhdGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHpvbmVkRGF0ZSA9IG5ldyBEYXRlV2l0aFpvbmUoX3JkYXRlW2ldLCB0emlkKS5yZXpvbmVkRGF0ZSgpO1xuICAgICAgICBpZiAoIWl0ZXJSZXN1bHQuYWNjZXB0KG5ldyBEYXRlKHpvbmVkRGF0ZS5nZXRUaW1lKCkpKSlcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBfcnJ1bGUuZm9yRWFjaChmdW5jdGlvbiAocnJ1bGUpIHtcbiAgICAgICAgaXRlcihpdGVyUmVzdWx0LCBycnVsZS5vcHRpb25zKTtcbiAgICB9KTtcbiAgICB2YXIgcmVzID0gaXRlclJlc3VsdC5fcmVzdWx0O1xuICAgIGRhdGV1dGlsLnNvcnQocmVzKTtcbiAgICBzd2l0Y2ggKGl0ZXJSZXN1bHQubWV0aG9kKSB7XG4gICAgICAgIGNhc2UgJ2FsbCc6XG4gICAgICAgIGNhc2UgJ2JldHdlZW4nOlxuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgY2FzZSAnYmVmb3JlJzpcbiAgICAgICAgICAgIHJldHVybiAoKHJlcy5sZW5ndGggJiYgcmVzW3Jlcy5sZW5ndGggLSAxXSkgfHwgbnVsbCk7XG4gICAgICAgIGNhc2UgJ2FmdGVyJzpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiAoKHJlcy5sZW5ndGggJiYgcmVzWzBdKSB8fCBudWxsKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pdGVyc2V0LmpzLm1hcCIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUlJ1bGUgZnJvbSAnLi9ycnVsZSc7XG5pbXBvcnQgUlJ1bGVTZXQgZnJvbSAnLi9ycnVsZXNldCc7XG5pbXBvcnQgZGF0ZXV0aWwgZnJvbSAnLi9kYXRldXRpbCc7XG5pbXBvcnQgeyBpbmNsdWRlcywgc3BsaXQgfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHsgcGFyc2VTdHJpbmcsIHBhcnNlRHRzdGFydCB9IGZyb20gJy4vcGFyc2VzdHJpbmcnO1xuLyoqXG4gKiBSUnVsZVN0clxuICogIFRvIHBhcnNlIGEgc2V0IG9mIHJydWxlIHN0cmluZ3NcbiAqL1xudmFyIERFRkFVTFRfT1BUSU9OUyA9IHtcbiAgICBkdHN0YXJ0OiBudWxsLFxuICAgIGNhY2hlOiBmYWxzZSxcbiAgICB1bmZvbGQ6IGZhbHNlLFxuICAgIGZvcmNlc2V0OiBmYWxzZSxcbiAgICBjb21wYXRpYmxlOiBmYWxzZSxcbiAgICB0emlkOiBudWxsXG59O1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSW5wdXQocywgb3B0aW9ucykge1xuICAgIHZhciBycnVsZXZhbHMgPSBbXTtcbiAgICB2YXIgcmRhdGV2YWxzID0gW107XG4gICAgdmFyIGV4cnVsZXZhbHMgPSBbXTtcbiAgICB2YXIgZXhkYXRldmFscyA9IFtdO1xuICAgIHZhciBfYSA9IHBhcnNlRHRzdGFydChzKSwgZHRzdGFydCA9IF9hLmR0c3RhcnQsIHR6aWQgPSBfYS50emlkO1xuICAgIHZhciBsaW5lcyA9IHNwbGl0SW50b0xpbmVzKHMsIG9wdGlvbnMudW5mb2xkKTtcbiAgICBsaW5lcy5mb3JFYWNoKGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgICAgIGlmICghbGluZSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdmFyIF9hID0gYnJlYWtEb3duTGluZShsaW5lKSwgbmFtZSA9IF9hLm5hbWUsIHBhcm1zID0gX2EucGFybXMsIHZhbHVlID0gX2EudmFsdWU7XG4gICAgICAgIHN3aXRjaCAobmFtZS50b1VwcGVyQ2FzZSgpKSB7XG4gICAgICAgICAgICBjYXNlICdSUlVMRSc6XG4gICAgICAgICAgICAgICAgaWYgKHBhcm1zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1bnN1cHBvcnRlZCBSUlVMRSBwYXJtOiBcIiArIHBhcm1zLmpvaW4oJywnKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJydWxldmFscy5wdXNoKHBhcnNlU3RyaW5nKGxpbmUpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ1JEQVRFJzpcbiAgICAgICAgICAgICAgICB2YXIgX2IgPSAvUkRBVEUoPzo7VFpJRD0oW146PV0rKSk/L2kuZXhlYyhsaW5lKSwgXyA9IF9iWzBdLCByZGF0ZVR6aWQgPSBfYlsxXTtcbiAgICAgICAgICAgICAgICBpZiAocmRhdGVUemlkICYmICF0emlkKSB7XG4gICAgICAgICAgICAgICAgICAgIHR6aWQgPSByZGF0ZVR6aWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJkYXRldmFscyA9IHJkYXRldmFscy5jb25jYXQocGFyc2VSRGF0ZSh2YWx1ZSwgcGFybXMpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0VYUlVMRSc6XG4gICAgICAgICAgICAgICAgaWYgKHBhcm1zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1bnN1cHBvcnRlZCBFWFJVTEUgcGFybTogXCIgKyBwYXJtcy5qb2luKCcsJykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBleHJ1bGV2YWxzLnB1c2gocGFyc2VTdHJpbmcodmFsdWUpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0VYREFURSc6XG4gICAgICAgICAgICAgICAgZXhkYXRldmFscyA9IGV4ZGF0ZXZhbHMuY29uY2F0KHBhcnNlUkRhdGUodmFsdWUsIHBhcm1zKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdEVFNUQVJUJzpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bnN1cHBvcnRlZCBwcm9wZXJ0eTogJyArIG5hbWUpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZHRzdGFydDogZHRzdGFydCxcbiAgICAgICAgdHppZDogdHppZCxcbiAgICAgICAgcnJ1bGV2YWxzOiBycnVsZXZhbHMsXG4gICAgICAgIHJkYXRldmFsczogcmRhdGV2YWxzLFxuICAgICAgICBleHJ1bGV2YWxzOiBleHJ1bGV2YWxzLFxuICAgICAgICBleGRhdGV2YWxzOiBleGRhdGV2YWxzXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGJ1aWxkUnVsZShzLCBvcHRpb25zKSB7XG4gICAgdmFyIF9hID0gcGFyc2VJbnB1dChzLCBvcHRpb25zKSwgcnJ1bGV2YWxzID0gX2EucnJ1bGV2YWxzLCByZGF0ZXZhbHMgPSBfYS5yZGF0ZXZhbHMsIGV4cnVsZXZhbHMgPSBfYS5leHJ1bGV2YWxzLCBleGRhdGV2YWxzID0gX2EuZXhkYXRldmFscywgZHRzdGFydCA9IF9hLmR0c3RhcnQsIHR6aWQgPSBfYS50emlkO1xuICAgIHZhciBub0NhY2hlID0gb3B0aW9ucy5jYWNoZSA9PT0gZmFsc2U7XG4gICAgaWYgKG9wdGlvbnMuY29tcGF0aWJsZSkge1xuICAgICAgICBvcHRpb25zLmZvcmNlc2V0ID0gdHJ1ZTtcbiAgICAgICAgb3B0aW9ucy51bmZvbGQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5mb3JjZXNldCB8fFxuICAgICAgICBycnVsZXZhbHMubGVuZ3RoID4gMSB8fFxuICAgICAgICByZGF0ZXZhbHMubGVuZ3RoIHx8XG4gICAgICAgIGV4cnVsZXZhbHMubGVuZ3RoIHx8XG4gICAgICAgIGV4ZGF0ZXZhbHMubGVuZ3RoKSB7XG4gICAgICAgIHZhciByc2V0XzEgPSBuZXcgUlJ1bGVTZXQobm9DYWNoZSk7XG4gICAgICAgIHJzZXRfMS5kdHN0YXJ0KGR0c3RhcnQpO1xuICAgICAgICByc2V0XzEudHppZCh0emlkIHx8IHVuZGVmaW5lZCk7XG4gICAgICAgIHJydWxldmFscy5mb3JFYWNoKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgICAgIHJzZXRfMS5ycnVsZShuZXcgUlJ1bGUoZ3Jvb21ScnVsZU9wdGlvbnModmFsLCBkdHN0YXJ0LCB0emlkKSwgbm9DYWNoZSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmRhdGV2YWxzLmZvckVhY2goZnVuY3Rpb24gKGRhdGUpIHtcbiAgICAgICAgICAgIHJzZXRfMS5yZGF0ZShkYXRlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGV4cnVsZXZhbHMuZm9yRWFjaChmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgICByc2V0XzEuZXhydWxlKG5ldyBSUnVsZShncm9vbVJydWxlT3B0aW9ucyh2YWwsIGR0c3RhcnQsIHR6aWQpLCBub0NhY2hlKSk7XG4gICAgICAgIH0pO1xuICAgICAgICBleGRhdGV2YWxzLmZvckVhY2goZnVuY3Rpb24gKGRhdGUpIHtcbiAgICAgICAgICAgIHJzZXRfMS5leGRhdGUoZGF0ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAob3B0aW9ucy5jb21wYXRpYmxlICYmIG9wdGlvbnMuZHRzdGFydClcbiAgICAgICAgICAgIHJzZXRfMS5yZGF0ZShkdHN0YXJ0KTtcbiAgICAgICAgcmV0dXJuIHJzZXRfMTtcbiAgICB9XG4gICAgdmFyIHZhbCA9IHJydWxldmFsc1swXSB8fCB7fTtcbiAgICByZXR1cm4gbmV3IFJSdWxlKGdyb29tUnJ1bGVPcHRpb25zKHZhbCwgdmFsLmR0c3RhcnQgfHwgb3B0aW9ucy5kdHN0YXJ0IHx8IGR0c3RhcnQsIHZhbC50emlkIHx8IG9wdGlvbnMudHppZCB8fCB0emlkKSwgbm9DYWNoZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcnJ1bGVzdHIocywgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgcmV0dXJuIGJ1aWxkUnVsZShzLCBpbml0aWFsaXplT3B0aW9ucyhvcHRpb25zKSk7XG59XG5mdW5jdGlvbiBncm9vbVJydWxlT3B0aW9ucyh2YWwsIGR0c3RhcnQsIHR6aWQpIHtcbiAgICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe30sIHZhbCksIHsgZHRzdGFydDogZHRzdGFydCxcbiAgICAgICAgdHppZDogdHppZCB9KTtcbn1cbmZ1bmN0aW9uIGluaXRpYWxpemVPcHRpb25zKG9wdGlvbnMpIHtcbiAgICB2YXIgaW52YWxpZCA9IFtdO1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob3B0aW9ucyk7XG4gICAgdmFyIGRlZmF1bHRLZXlzID0gT2JqZWN0LmtleXMoREVGQVVMVF9PUFRJT05TKTtcbiAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBpZiAoIWluY2x1ZGVzKGRlZmF1bHRLZXlzLCBrZXkpKVxuICAgICAgICAgICAgaW52YWxpZC5wdXNoKGtleSk7XG4gICAgfSk7XG4gICAgaWYgKGludmFsaWQubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBvcHRpb25zOiAnICsgaW52YWxpZC5qb2luKCcsICcpKTtcbiAgICB9XG4gICAgcmV0dXJuIF9fYXNzaWduKF9fYXNzaWduKHt9LCBERUZBVUxUX09QVElPTlMpLCBvcHRpb25zKTtcbn1cbmZ1bmN0aW9uIGV4dHJhY3ROYW1lKGxpbmUpIHtcbiAgICBpZiAobGluZS5pbmRleE9mKCc6JykgPT09IC0xKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnUlJVTEUnLFxuICAgICAgICAgICAgdmFsdWU6IGxpbmVcbiAgICAgICAgfTtcbiAgICB9XG4gICAgdmFyIF9hID0gc3BsaXQobGluZSwgJzonLCAxKSwgbmFtZSA9IF9hWzBdLCB2YWx1ZSA9IF9hWzFdO1xuICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgIH07XG59XG5mdW5jdGlvbiBicmVha0Rvd25MaW5lKGxpbmUpIHtcbiAgICB2YXIgX2EgPSBleHRyYWN0TmFtZShsaW5lKSwgbmFtZSA9IF9hLm5hbWUsIHZhbHVlID0gX2EudmFsdWU7XG4gICAgdmFyIHBhcm1zID0gbmFtZS5zcGxpdCgnOycpO1xuICAgIGlmICghcGFybXMpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZW1wdHkgcHJvcGVydHkgbmFtZScpO1xuICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IHBhcm1zWzBdLnRvVXBwZXJDYXNlKCksXG4gICAgICAgIHBhcm1zOiBwYXJtcy5zbGljZSgxKSxcbiAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgfTtcbn1cbmZ1bmN0aW9uIHNwbGl0SW50b0xpbmVzKHMsIHVuZm9sZCkge1xuICAgIGlmICh1bmZvbGQgPT09IHZvaWQgMCkgeyB1bmZvbGQgPSBmYWxzZTsgfVxuICAgIHMgPSBzICYmIHMudHJpbSgpO1xuICAgIGlmICghcylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGVtcHR5IHN0cmluZycpO1xuICAgIC8vIE1vcmUgaW5mbyBhYm91dCAndW5mb2xkJyBvcHRpb25cbiAgICAvLyBHbyBoZWFkIHRvIGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzI0NDUudHh0XG4gICAgaWYgKCF1bmZvbGQpIHtcbiAgICAgICAgcmV0dXJuIHMuc3BsaXQoL1xccy8pO1xuICAgIH1cbiAgICB2YXIgbGluZXMgPSBzLnNwbGl0KCdcXG4nKTtcbiAgICB2YXIgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBsaW5lcy5sZW5ndGgpIHtcbiAgICAgICAgLy8gVE9ET1xuICAgICAgICB2YXIgbGluZSA9IChsaW5lc1tpXSA9IGxpbmVzW2ldLnJlcGxhY2UoL1xccyskL2csICcnKSk7XG4gICAgICAgIGlmICghbGluZSkge1xuICAgICAgICAgICAgbGluZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGkgPiAwICYmIGxpbmVbMF0gPT09ICcgJykge1xuICAgICAgICAgICAgbGluZXNbaSAtIDFdICs9IGxpbmUuc2xpY2UoMSk7XG4gICAgICAgICAgICBsaW5lcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpICs9IDE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGxpbmVzO1xufVxuZnVuY3Rpb24gdmFsaWRhdGVEYXRlUGFybShwYXJtcykge1xuICAgIHBhcm1zLmZvckVhY2goZnVuY3Rpb24gKHBhcm0pIHtcbiAgICAgICAgaWYgKCEvKFZBTFVFPURBVEUoLVRJTUUpPyl8KFRaSUQ9KS8udGVzdChwYXJtKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bnN1cHBvcnRlZCBSREFURS9FWERBVEUgcGFybTogJyArIHBhcm0pO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5mdW5jdGlvbiBwYXJzZVJEYXRlKHJkYXRldmFsLCBwYXJtcykge1xuICAgIHZhbGlkYXRlRGF0ZVBhcm0ocGFybXMpO1xuICAgIHJldHVybiByZGF0ZXZhbFxuICAgICAgICAuc3BsaXQoJywnKVxuICAgICAgICAubWFwKGZ1bmN0aW9uIChkYXRlc3RyKSB7IHJldHVybiBkYXRldXRpbC51bnRpbFN0cmluZ1RvRGF0ZShkYXRlc3RyKTsgfSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ycnVsZXN0ci5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBSUnVsZSBmcm9tICcuL3JydWxlJztcbmltcG9ydCBkYXRldXRpbCBmcm9tICcuL2RhdGV1dGlsJztcbmltcG9ydCB7IGluY2x1ZGVzIH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7IGl0ZXJTZXQgfSBmcm9tICcuL2l0ZXJzZXQnO1xuaW1wb3J0IHsgcnJ1bGVzdHIgfSBmcm9tICcuL3JydWxlc3RyJztcbmltcG9ydCB7IG9wdGlvbnNUb1N0cmluZyB9IGZyb20gJy4vb3B0aW9uc3Rvc3RyaW5nJztcbmZ1bmN0aW9uIGNyZWF0ZUdldHRlclNldHRlcihmaWVsZE5hbWUpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIHJldHVybiBmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgICAgaWYgKGZpZWxkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIF90aGlzW1wiX1wiICsgZmllbGROYW1lXSA9IGZpZWxkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChfdGhpc1tcIl9cIiArIGZpZWxkTmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzW1wiX1wiICsgZmllbGROYW1lXTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IF90aGlzLl9ycnVsZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGZpZWxkXzEgPSBfdGhpcy5fcnJ1bGVbaV0ub3JpZ09wdGlvbnNbZmllbGROYW1lXTtcbiAgICAgICAgICAgIGlmIChmaWVsZF8xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkXzE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufVxudmFyIFJSdWxlU2V0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhSUnVsZVNldCwgX3N1cGVyKTtcbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbj99IG5vQ2FjaGVcbiAgICAgKiAgVGhlIHNhbWUgc3RyYXRhZ3kgYXMgUlJ1bGUgb24gY2FjaGUsIGRlZmF1bHQgdG8gZmFsc2VcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBSUnVsZVNldChub0NhY2hlKSB7XG4gICAgICAgIGlmIChub0NhY2hlID09PSB2b2lkIDApIHsgbm9DYWNoZSA9IGZhbHNlOyB9XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHt9LCBub0NhY2hlKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5kdHN0YXJ0ID0gY3JlYXRlR2V0dGVyU2V0dGVyLmFwcGx5KF90aGlzLCBbJ2R0c3RhcnQnXSk7XG4gICAgICAgIF90aGlzLnR6aWQgPSBjcmVhdGVHZXR0ZXJTZXR0ZXIuYXBwbHkoX3RoaXMsIFsndHppZCddKTtcbiAgICAgICAgX3RoaXMuX3JydWxlID0gW107XG4gICAgICAgIF90aGlzLl9yZGF0ZSA9IFtdO1xuICAgICAgICBfdGhpcy5fZXhydWxlID0gW107XG4gICAgICAgIF90aGlzLl9leGRhdGUgPSBbXTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBSUnVsZVNldC5wcm90b3R5cGUuX2l0ZXIgPSBmdW5jdGlvbiAoaXRlclJlc3VsdCkge1xuICAgICAgICByZXR1cm4gaXRlclNldChpdGVyUmVzdWx0LCB0aGlzLl9ycnVsZSwgdGhpcy5fZXhydWxlLCB0aGlzLl9yZGF0ZSwgdGhpcy5fZXhkYXRlLCB0aGlzLnR6aWQoKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIFJSdWxlIHRvIHRoZSBzZXRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UlJ1bGV9XG4gICAgICovXG4gICAgUlJ1bGVTZXQucHJvdG90eXBlLnJydWxlID0gZnVuY3Rpb24gKHJydWxlKSB7XG4gICAgICAgIF9hZGRSdWxlKHJydWxlLCB0aGlzLl9ycnVsZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIEVYUlVMRSB0byB0aGUgc2V0XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1JSdWxlfVxuICAgICAqL1xuICAgIFJSdWxlU2V0LnByb3RvdHlwZS5leHJ1bGUgPSBmdW5jdGlvbiAocnJ1bGUpIHtcbiAgICAgICAgX2FkZFJ1bGUocnJ1bGUsIHRoaXMuX2V4cnVsZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIFJEYXRlIHRvIHRoZSBzZXRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RGF0ZX1cbiAgICAgKi9cbiAgICBSUnVsZVNldC5wcm90b3R5cGUucmRhdGUgPSBmdW5jdGlvbiAoZGF0ZSkge1xuICAgICAgICBfYWRkRGF0ZShkYXRlLCB0aGlzLl9yZGF0ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIEVYREFURSB0byB0aGUgc2V0XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0RhdGV9XG4gICAgICovXG4gICAgUlJ1bGVTZXQucHJvdG90eXBlLmV4ZGF0ZSA9IGZ1bmN0aW9uIChkYXRlKSB7XG4gICAgICAgIF9hZGREYXRlKGRhdGUsIHRoaXMuX2V4ZGF0ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgbGlzdCBvZiBpbmNsdWRlZCBycnVsZXMgaW4gdGhpcyByZWN1cnJlbmNlIHNldC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gTGlzdCBvZiBycnVsZXNcbiAgICAgKi9cbiAgICBSUnVsZVNldC5wcm90b3R5cGUucnJ1bGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcnJ1bGUubWFwKGZ1bmN0aW9uIChlKSB7IHJldHVybiBycnVsZXN0cihlLnRvU3RyaW5nKCkpOyB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCBsaXN0IG9mIGV4Y2x1ZGVkIHJydWxlcyBpbiB0aGlzIHJlY3VycmVuY2Ugc2V0LlxuICAgICAqXG4gICAgICogQHJldHVybiBMaXN0IG9mIGV4cnVsZXNcbiAgICAgKi9cbiAgICBSUnVsZVNldC5wcm90b3R5cGUuZXhydWxlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4cnVsZS5tYXAoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIHJydWxlc3RyKGUudG9TdHJpbmcoKSk7IH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IGxpc3Qgb2YgaW5jbHVkZWQgZGF0ZXRpbWVzIGluIHRoaXMgcmVjdXJyZW5jZSBzZXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIExpc3Qgb2YgcmRhdGVzXG4gICAgICovXG4gICAgUlJ1bGVTZXQucHJvdG90eXBlLnJkYXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JkYXRlLm1hcChmdW5jdGlvbiAoZSkgeyByZXR1cm4gbmV3IERhdGUoZS5nZXRUaW1lKCkpOyB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCBsaXN0IG9mIGluY2x1ZGVkIGRhdGV0aW1lcyBpbiB0aGlzIHJlY3VycmVuY2Ugc2V0LlxuICAgICAqXG4gICAgICogQHJldHVybiBMaXN0IG9mIGV4ZGF0ZXNcbiAgICAgKi9cbiAgICBSUnVsZVNldC5wcm90b3R5cGUuZXhkYXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4ZGF0ZS5tYXAoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIG5ldyBEYXRlKGUuZ2V0VGltZSgpKTsgfSk7XG4gICAgfTtcbiAgICBSUnVsZVNldC5wcm90b3R5cGUudmFsdWVPZiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICBpZiAoIXRoaXMuX3JydWxlLmxlbmd0aCAmJiB0aGlzLl9kdHN0YXJ0KSB7XG4gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KG9wdGlvbnNUb1N0cmluZyh7IGR0c3RhcnQ6IHRoaXMuX2R0c3RhcnQgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3JydWxlLmZvckVhY2goZnVuY3Rpb24gKHJydWxlKSB7XG4gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KHJydWxlLnRvU3RyaW5nKCkuc3BsaXQoJ1xcbicpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX2V4cnVsZS5mb3JFYWNoKGZ1bmN0aW9uIChleHJ1bGUpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQoZXhydWxlLnRvU3RyaW5nKCkuc3BsaXQoJ1xcbicpXG4gICAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAobGluZSkgeyByZXR1cm4gbGluZS5yZXBsYWNlKC9eUlJVTEU6LywgJ0VYUlVMRTonKTsgfSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChsaW5lKSB7IHJldHVybiAhL15EVFNUQVJULy50ZXN0KGxpbmUpOyB9KSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGhpcy5fcmRhdGUubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChyZGF0ZXNUb1N0cmluZygnUkRBVEUnLCB0aGlzLl9yZGF0ZSwgdGhpcy50emlkKCkpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fZXhkYXRlLmxlbmd0aCkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2gocmRhdGVzVG9TdHJpbmcoJ0VYREFURScsIHRoaXMuX2V4ZGF0ZSwgdGhpcy50emlkKCkpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogdG8gZ2VuZXJhdGUgcmVjdXJyZW5jZSBmaWVsZCBzdWNoIGFzOlxuICAgICAqICAgRFRTVEFSVDoxOTk3MDkwMlQwMTAwMDBaXG4gICAgICogICBSUlVMRTpGUkVRPVlFQVJMWTtDT1VOVD0yO0JZREFZPVRVXG4gICAgICogICBSUlVMRTpGUkVRPVlFQVJMWTtDT1VOVD0xO0JZREFZPVRIXG4gICAgICovXG4gICAgUlJ1bGVTZXQucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZU9mKCkuam9pbignXFxuJyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgUlJ1bGVTZXQgT2JqZWN0IGNvbXBsZXRlbHkgYmFzZSBvbiBjdXJyZW50IGluc3RhbmNlXG4gICAgICovXG4gICAgUlJ1bGVTZXQucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcnJzID0gbmV3IFJSdWxlU2V0KCEhdGhpcy5fY2FjaGUpO1xuICAgICAgICB0aGlzLl9ycnVsZS5mb3JFYWNoKGZ1bmN0aW9uIChydWxlKSB7IHJldHVybiBycnMucnJ1bGUocnVsZS5jbG9uZSgpKTsgfSk7XG4gICAgICAgIHRoaXMuX2V4cnVsZS5mb3JFYWNoKGZ1bmN0aW9uIChydWxlKSB7IHJldHVybiBycnMuZXhydWxlKHJ1bGUuY2xvbmUoKSk7IH0pO1xuICAgICAgICB0aGlzLl9yZGF0ZS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRlKSB7IHJldHVybiBycnMucmRhdGUobmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkpKTsgfSk7XG4gICAgICAgIHRoaXMuX2V4ZGF0ZS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRlKSB7IHJldHVybiBycnMuZXhkYXRlKG5ldyBEYXRlKGRhdGUuZ2V0VGltZSgpKSk7IH0pO1xuICAgICAgICByZXR1cm4gcnJzO1xuICAgIH07XG4gICAgcmV0dXJuIFJSdWxlU2V0O1xufShSUnVsZSkpO1xuZXhwb3J0IGRlZmF1bHQgUlJ1bGVTZXQ7XG5mdW5jdGlvbiBfYWRkUnVsZShycnVsZSwgY29sbGVjdGlvbikge1xuICAgIGlmICghKHJydWxlIGluc3RhbmNlb2YgUlJ1bGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoU3RyaW5nKHJydWxlKSArICcgaXMgbm90IFJSdWxlIGluc3RhbmNlJyk7XG4gICAgfVxuICAgIGlmICghaW5jbHVkZXMoY29sbGVjdGlvbi5tYXAoU3RyaW5nKSwgU3RyaW5nKHJydWxlKSkpIHtcbiAgICAgICAgY29sbGVjdGlvbi5wdXNoKHJydWxlKTtcbiAgICB9XG59XG5mdW5jdGlvbiBfYWRkRGF0ZShkYXRlLCBjb2xsZWN0aW9uKSB7XG4gICAgaWYgKCEoZGF0ZSBpbnN0YW5jZW9mIERhdGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoU3RyaW5nKGRhdGUpICsgJyBpcyBub3QgRGF0ZSBpbnN0YW5jZScpO1xuICAgIH1cbiAgICBpZiAoIWluY2x1ZGVzKGNvbGxlY3Rpb24ubWFwKE51bWJlciksIE51bWJlcihkYXRlKSkpIHtcbiAgICAgICAgY29sbGVjdGlvbi5wdXNoKGRhdGUpO1xuICAgICAgICBkYXRldXRpbC5zb3J0KGNvbGxlY3Rpb24pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJkYXRlc1RvU3RyaW5nKHBhcmFtLCByZGF0ZXMsIHR6aWQpIHtcbiAgICB2YXIgaXNVVEMgPSAhdHppZCB8fCB0emlkLnRvVXBwZXJDYXNlKCkgPT09ICdVVEMnO1xuICAgIHZhciBoZWFkZXIgPSBpc1VUQyA/IHBhcmFtICsgXCI6XCIgOiBwYXJhbSArIFwiO1RaSUQ9XCIgKyB0emlkICsgXCI6XCI7XG4gICAgdmFyIGRhdGVTdHJpbmcgPSByZGF0ZXNcbiAgICAgICAgLm1hcChmdW5jdGlvbiAocmRhdGUpIHsgcmV0dXJuIGRhdGV1dGlsLnRpbWVUb1VudGlsU3RyaW5nKHJkYXRlLnZhbHVlT2YoKSwgaXNVVEMpOyB9KVxuICAgICAgICAuam9pbignLCcpO1xuICAgIHJldHVybiBcIlwiICsgaGVhZGVyICsgZGF0ZVN0cmluZztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJydWxlc2V0LmpzLm1hcCIsImltcG9ydCBSUnVsZSwgeyBCeVdlZWtkYXksIEZyZXF1ZW5jeSBhcyBSRnJlcXVlbmN5LCBXZWVrZGF5IH0gZnJvbSAncnJ1bGUnO1xuXG5leHBvcnQgZW51bSBGcmVxdWVuY3kge1xuICBOb25lID0gJ05PTkUnLFxuICBEYWlseSA9ICdEQUlMWScsXG4gIFdlZWtseSA9ICdXRUVLTFknLFxuICBNb250aGx5ID0gJ01PTlRITFknLFxuICBZZWFybHkgPSAnWUVBUkxZJyxcbn1cblxuZXhwb3J0IGNsYXNzIFJlcGVhdEFkYXB0ZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHJydWxlOiBSUnVsZTtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiB7IGlkOiBudW1iZXI7IGhvb2s6ICh2YWw6IGFueSkgPT4gdm9pZCB9W107XG5cbiAgY29uc3RydWN0b3IocnJ1bGU6IFJSdWxlKSB7XG4gICAgdGhpcy5ycnVsZSA9IHJydWxlO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzdWJzY3JpYmUgZnVuY3Rpb24gaW1wbGVtZW50cyB0aGUgU3RvcmUgaW50ZXJmYWNlIGluIFN2ZWx0ZS4gVGhlXG4gICAqIHN1YnNjcmliZXJzIG11c3QgYmUgY2FsbGVkIGFueSB0aW1lIHRoZXJlIGlzIGEgY2hhbmdlIHRvIHRoZSB0YXNrLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN1YnNjcmliZSA9IChcbiAgICBzdWJzY3JpcHRpb246ICh2YWx1ZTogYW55KSA9PiB2b2lkLFxuICApOiAoKCkgPT4gdm9pZCkgPT4ge1xuICAgIGNvbnN0IG1heElEID0gdGhpcy5zdWJzY3JpcHRpb25zLnJlZHVjZShcbiAgICAgIChwcmV2LCB7IGlkIH0pOiBudW1iZXIgPT4gTWF0aC5tYXgocHJldiwgaWQpLFxuICAgICAgMCxcbiAgICApO1xuICAgIGNvbnN0IG5ld0lEID0gbWF4SUQgKyAxO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goeyBpZDogbmV3SUQsIGhvb2s6IHN1YnNjcmlwdGlvbiB9KTtcbiAgICBzdWJzY3JpcHRpb24odGhpcyk7XG5cbiAgICAvLyBSZXR1cm4gYW4gdW5zdWJzY3JpYmUgZnVuY3Rpb25cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zID0gdGhpcy5zdWJzY3JpcHRpb25zLmZpbHRlcigoeyBpZCB9KSA9PiBpZCAhPT0gbmV3SUQpO1xuICAgICAgY29uc29sZS5sb2coYFJlbW92aW5nIHN1YnNjcmlwdGlvbiAke25ld0lEfWApO1xuICAgIH07XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBzZXQgZnVuY3Rpb24gaW1wbGVtZW50cyB0aGUgU3RvcmUgaW50ZXJmYWNlIGluIFN2ZWx0ZS4gV2UgYXJlIG5vdFxuICAgKiBhY3R1YWxseSB1c2luZyBpdCB0byBzdG9yZSBuZXcgdmFsdWVzLCBidXQgaXQgaXMgbmVlZGVkIHdoZW4gYmluZGluZyB0b1xuICAgKiBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNldCA9IChfOiBhbnkpOiB2b2lkID0+IHt9O1xuXG4gIHB1YmxpYyBpc1ZhbGlkID0gKCk6IGJvb2xlYW4gPT4gdGhpcy5ycnVsZS50b1N0cmluZygpICE9PSAnJztcblxuICBwdWJsaWMgbmV4dCA9IChjb3VudDogbnVtYmVyKTogRGF0ZVtdID0+XG4gICAgdGhpcy5ycnVsZS5hbGwoKF8sIGxlbikgPT4gbGVuIDwgY291bnQpO1xuXG4gIHB1YmxpYyB0b1RleHQgPSAoKTogc3RyaW5nID0+XG4gICAgdGhpcy5ycnVsZS5pc0Z1bGx5Q29udmVydGlibGVUb1RleHQoKVxuICAgICAgPyB0aGlzLnJydWxlLnRvVGV4dCgpXG4gICAgICA6IHRoaXMucnJ1bGUudG9TdHJpbmcoKTtcblxuICBwdWJsaWMgdG9TdHJpbmcgPSAoKTogc3RyaW5nID0+IHRoaXMucnJ1bGUudG9TdHJpbmcoKTtcblxuICBwdWJsaWMgYXNSUnVsZSA9ICgpOiBSUnVsZSA9PiBSUnVsZS5mcm9tVGV4dCh0aGlzLnRvVGV4dCgpKTtcblxuICBwdWJsaWMgZ2V0IGZyZXF1ZW5jeSgpOiBGcmVxdWVuY3kge1xuICAgIHN3aXRjaCAodGhpcy5ycnVsZS5vcHRpb25zLmZyZXEpIHtcbiAgICAgIGNhc2UgUkZyZXF1ZW5jeS5ZRUFSTFk6XG4gICAgICAgIHJldHVybiBGcmVxdWVuY3kuWWVhcmx5O1xuICAgICAgY2FzZSBSRnJlcXVlbmN5Lk1PTlRITFk6XG4gICAgICAgIHJldHVybiBGcmVxdWVuY3kuTW9udGhseTtcbiAgICAgIGNhc2UgUkZyZXF1ZW5jeS5XRUVLTFk6XG4gICAgICAgIHJldHVybiBGcmVxdWVuY3kuV2Vla2x5O1xuICAgICAgY2FzZSBSRnJlcXVlbmN5LkRBSUxZOlxuICAgICAgICByZXR1cm4gRnJlcXVlbmN5LkRhaWx5O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gVE9ETzogRGlzcGxheSBhIG5vdGlmaWNhdGlvbiBpbnN0ZWFkP1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEludmFsaWQgZnJlcXVlbmN5ICR7dGhpcy5ycnVsZS5vcHRpb25zLmZyZXF9IGluIHJlcGV0aXRpb25gLFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXQgZnJlcXVlbmN5KGZyZXF1ZW5jeTogRnJlcXVlbmN5KSB7XG4gICAgc3dpdGNoIChmcmVxdWVuY3kpIHtcbiAgICAgIGNhc2UgRnJlcXVlbmN5LlllYXJseTpcbiAgICAgICAgdGhpcy5ycnVsZS5vcHRpb25zLmZyZXEgPSBSRnJlcXVlbmN5LllFQVJMWTtcbiAgICAgICAgdGhpcy5ycnVsZS5vcmlnT3B0aW9ucy5mcmVxID0gUkZyZXF1ZW5jeS5ZRUFSTFk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBGcmVxdWVuY3kuTW9udGhseTpcbiAgICAgICAgdGhpcy5ycnVsZS5vcHRpb25zLmZyZXEgPSBSRnJlcXVlbmN5Lk1PTlRITFk7XG4gICAgICAgIHRoaXMucnJ1bGUub3JpZ09wdGlvbnMuZnJlcSA9IFJGcmVxdWVuY3kuTU9OVEhMWTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEZyZXF1ZW5jeS5XZWVrbHk6XG4gICAgICAgIHRoaXMucnJ1bGUub3B0aW9ucy5mcmVxID0gUkZyZXF1ZW5jeS5XRUVLTFk7XG4gICAgICAgIHRoaXMucnJ1bGUub3JpZ09wdGlvbnMuZnJlcSA9IFJGcmVxdWVuY3kuV0VFS0xZO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRnJlcXVlbmN5LkRhaWx5OlxuICAgICAgICB0aGlzLnJydWxlLm9wdGlvbnMuZnJlcSA9IFJGcmVxdWVuY3kuREFJTFk7XG4gICAgICAgIHRoaXMucnJ1bGUub3JpZ09wdGlvbnMuZnJlcSA9IFJGcmVxdWVuY3kuREFJTFk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gVE9ETzogRGlzcGxheSBhIG5vdGlmaWNhdGlvbiBpbnN0ZWFkP1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZnJlcXVlbmN5ICR7ZnJlcXVlbmN5fSByZXF1ZXN0ZWRgKTtcbiAgICB9XG5cbiAgICAvLyByZXNldCBvdGhlciBjb25maWcgb3B0aW9uc1xuICAgIHRoaXMucnJ1bGUub3B0aW9ucy5ieW1vbnRoID0gdW5kZWZpbmVkO1xuICAgIHRoaXMucnJ1bGUub3JpZ09wdGlvbnMuYnltb250aCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnJydWxlLm9wdGlvbnMuYnltb250aGRheSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnJydWxlLm9yaWdPcHRpb25zLmJ5bW9udGhkYXkgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5ycnVsZS5vcHRpb25zLmJ5d2Vla2RheSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnJydWxlLm9yaWdPcHRpb25zLmJ5d2Vla2RheSA9IHVuZGVmaW5lZDtcblxuICAgIHRoaXMubm90aWZ5KCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVydmFsKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucnJ1bGUub3B0aW9ucy5pbnRlcnZhbDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJ2YWwobjogbnVtYmVyKSB7XG4gICAgLy8gZG8gbm90IHNldCB0byBudWxsIG9yIDBcbiAgICBjb25zdCBuZXdWYWwgPSBuID8gbiA6IDE7XG5cbiAgICBpZiAobmV3VmFsICE9PSB0aGlzLnJydWxlLm9wdGlvbnMuaW50ZXJ2YWwpIHtcbiAgICAgIHRoaXMucnJ1bGUub3B0aW9ucy5pbnRlcnZhbCA9IG4gPyBuIDogMTtcbiAgICAgIHRoaXMubm90aWZ5KCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldERheXNPZldlZWsgPSAoaWRzOiBudW1iZXJbXSk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHdlZWtkYXlMaXN0OiBXZWVrZGF5W10gPSBuZXcgQXJyYXkoaWRzLmxlbmd0aCk7XG4gICAgY29uc3QgbnVtYmVyTGlzdDogbnVtYmVyW10gPSBuZXcgQXJyYXkoaWRzLmxlbmd0aCk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgd2Vla2RheUxpc3RbaV0gPSBuZXcgV2Vla2RheShpZHNbaV0pO1xuICAgICAgbnVtYmVyTGlzdFtpXSA9IGlkc1tpXTtcbiAgICB9XG5cbiAgICB0aGlzLnJydWxlLm9yaWdPcHRpb25zLmJ5d2Vla2RheSA9IHdlZWtkYXlMaXN0O1xuICAgIHRoaXMucnJ1bGUub3B0aW9ucy5ieXdlZWtkYXkgPSBudW1iZXJMaXN0O1xuXG4gICAgdGhpcy5ub3RpZnkoKTtcbiAgfTtcblxuICBwdWJsaWMgZ2V0IGRheXNPZldlZWsoKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IHdlZWtkYXlzID0gdGhpcy5ycnVsZS5vcmlnT3B0aW9ucy5ieXdlZWtkYXk7XG4gICAgaWYgKCF3ZWVrZGF5cykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh3ZWVrZGF5cykpIHtcbiAgICAgIHJldHVybiB3ZWVrZGF5cy5tYXAodGhpcy5CeVdlZWtkYXlUb051bWJlcik7XG4gICAgfVxuICAgIHJldHVybiBbdGhpcy5CeVdlZWtkYXlUb051bWJlcih3ZWVrZGF5cyldO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXlPZk1vbnRoKCk6IG51bWJlciB8IG51bGwge1xuICAgIGNvbnN0IGRheSA9IHRoaXMucnJ1bGUub3JpZ09wdGlvbnMuYnltb250aGRheTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXkpKSB7XG4gICAgICBpZiAoZGF5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIGRheVswXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBkYXk7XG4gIH1cblxuICBwdWJsaWMgc2V0IGRheU9mTW9udGgobjogbnVtYmVyKSB7XG4gICAgdGhpcy5ycnVsZS5vcmlnT3B0aW9ucy5ieW1vbnRoZGF5ID0gbjtcbiAgICB0aGlzLnJydWxlLm9wdGlvbnMuYnltb250aGRheSA9IFtuXTtcblxuICAgIC8vIEluY29tcGF0aWJsZSB3aXRoIGRheSBvZiBtb250aFxuICAgIHRoaXMucnJ1bGUub3JpZ09wdGlvbnMuYnl3ZWVrZGF5ID0gW107XG5cbiAgICB0aGlzLm5vdGlmeSgpO1xuICB9XG5cbiAgcHVibGljIHNldCBsYXN0RGF5T2ZNb250aCh2YWw6IGJvb2xlYW4pIHtcbiAgICBpZiAodmFsKSB7XG4gICAgICB0aGlzLnJydWxlLm9yaWdPcHRpb25zLmJ5bW9udGhkYXkgPSAtMTtcbiAgICAgIHRoaXMucnJ1bGUub3B0aW9ucy5ieW1vbnRoZGF5ID0gWy0xXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5ycnVsZS5vcmlnT3B0aW9ucy5ieW1vbnRoZGF5ID0gW107XG4gICAgICB0aGlzLnJydWxlLm9wdGlvbnMuYnltb250aGRheSA9IFtdO1xuICAgIH1cblxuICAgIHRoaXMubm90aWZ5KCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGxhc3REYXlPZk1vbnRoKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGRheSA9IHRoaXMucnJ1bGUub3JpZ09wdGlvbnMuYnltb250aGRheTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXkpKSB7XG4gICAgICByZXR1cm4gZGF5Lmxlbmd0aCA+IDAgPyBkYXlbMF0gPT09IC0xIDogZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBkYXkgPT09IC0xO1xuICB9XG5cbiAgcHVibGljIHNldFdlZWtEYXlzT2ZNb250aCA9IChcbiAgICBzZWxlY3RlZDogeyB3ZWVrOiBzdHJpbmc7IHdlZWtEYXk6IHN0cmluZyB9W10sXG4gICk6IHZvaWQgPT4ge1xuICAgIHRoaXMucnJ1bGUub3JpZ09wdGlvbnMuYnl3ZWVrZGF5ID0gc2VsZWN0ZWQubWFwKFxuICAgICAgKHsgd2Vlaywgd2Vla0RheSB9KTogV2Vla2RheSA9PlxuICAgICAgICBuZXcgV2Vla2RheShwYXJzZUludCh3ZWVrRGF5LCAxMCksIHBhcnNlSW50KHdlZWssIDEwKSksXG4gICAgKTtcblxuICAgIC8vIEluY29tcGF0aWJsZSB3aXRoIHdlZWsgZGF5cyBvZiBtb250aFxuICAgIHRoaXMucnJ1bGUub3JpZ09wdGlvbnMuYnltb250aGRheSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnJydWxlLm9wdGlvbnMuYnltb250aGRheSA9IFtdO1xuXG4gICAgdGhpcy5ub3RpZnkoKTtcbiAgfTtcblxuICBwdWJsaWMgZ2V0V2Vla0RheXNPZk1vbnRoID0gKCk6IHsgd2Vlazogc3RyaW5nOyB3ZWVrRGF5OiBzdHJpbmcgfVtdID0+IHtcbiAgICBjb25zdCB3ZWVrZGF5cyA9IHRoaXMucnJ1bGUub3JpZ09wdGlvbnMuYnl3ZWVrZGF5O1xuICAgIGlmIChBcnJheS5pc0FycmF5KHdlZWtkYXlzKSkge1xuICAgICAgcmV0dXJuIHdlZWtkYXlzXG4gICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgKGRheSk6IGRheSBpcyBXZWVrZGF5ID0+XG4gICAgICAgICAgICB0eXBlb2YgZGF5ICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgZGF5ICE9PSAnbnVtYmVyJyxcbiAgICAgICAgKVxuICAgICAgICAuZmlsdGVyKChkYXkpID0+IGRheS5uICE9PSB1bmRlZmluZWQpXG4gICAgICAgIC5tYXAoKGRheSkgPT4gKHtcbiAgICAgICAgICB3ZWVrOiBkYXkubi50b1N0cmluZygpLFxuICAgICAgICAgIHdlZWtEYXk6IGRheS53ZWVrZGF5LnRvU3RyaW5nKCksXG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBUaGlzIG1pZ2h0IGJlIG92ZXJseSByZXN0cmljdGl2ZSwgaWYgcGVvcGxlIHdyaXRlIGN1c3RvbSBSUnVsZSBzeW50YXguXG4gICAgcmV0dXJuIFtdO1xuICB9O1xuXG4gIHB1YmxpYyBnZXQgbW9udGhzT2ZZZWFyKCk6IG51bWJlcltdIHtcbiAgICBjb25zdCBtb250aHMgPSB0aGlzLnJydWxlLm9yaWdPcHRpb25zLmJ5bW9udGg7XG4gICAgaWYgKG1vbnRocyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbW9udGhzID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIFttb250aHNdO1xuICAgIH1cbiAgICByZXR1cm4gbW9udGhzO1xuICB9XG5cbiAgcHVibGljIHNldE1vbnRoc09mWWVhciA9IChpZHM6IG51bWJlcltdKTogdm9pZCA9PiB7XG4gICAgdGhpcy5ycnVsZS5vcmlnT3B0aW9ucy5ieW1vbnRoID0gaWRzO1xuICAgIHRoaXMucnJ1bGUub3B0aW9ucy5ieW1vbnRoID0gdGhpcy5ycnVsZS5vcmlnT3B0aW9ucy5ieW1vbnRoO1xuXG4gICAgdGhpcy5ub3RpZnkoKTtcbiAgfTtcblxuICAvKipcbiAgICogTm90aWZ5IHN1YnNjcmlwdGlvbnMgb2YgYSBjaGFuZ2UuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IG5vdGlmeSA9ICgpOiB2b2lkID0+XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2goKHsgaG9vayB9KSA9PiBob29rKHRoaXMpKTtcblxuICBwcml2YXRlIEJ5V2Vla2RheVRvTnVtYmVyKHdkOiBCeVdlZWtkYXkpOiBudW1iZXIge1xuICAgIGlmICh0eXBlb2Ygd2QgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gd2Q7XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygd2QgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gMDsgLy8gVE9ET1xuICAgIH1cbiAgICByZXR1cm4gd2Qud2Vla2RheTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgYWRkVGFza01vdmUsXG4gIGFkZFRhc2tSZXBldGl0aW9uLFxuICBnZXRIZWFkZXJEZXB0aCxcbiAgbWFya1Rhc2tBc0NvcGllZCxcbiAgcmVtb3ZlTGluZXMsXG59IGZyb20gJy4vZmlsZS1oZWxwZXJzJztcbmltcG9ydCB7IFJlcGVhdEFkYXB0ZXIgfSBmcm9tICcuL3JlcGVhdCc7XG5pbXBvcnQgdHlwZSB7IElTZXR0aW5ncyB9IGZyb20gJy4vc2V0dGluZ3MnO1xuaW1wb3J0IHR5cGUgeyBWYXVsdEludGVybWVkaWF0ZSB9IGZyb20gJy4vdmF1bHQnO1xuaW1wb3J0IHR5cGUgeyBNb21lbnQgfSBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHR5cGUgeyBURmlsZSB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB7IE5vdGljZSB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCBSUnVsZSwgeyBGcmVxdWVuY3kgfSBmcm9tICdycnVsZSc7XG5cbmNvbnN0IHRhc2tSZSA9IC9eXFxzKi0gXFxbWyB4WD5cXC1dXFxdIC87XG5cbi8qKlxuICogTWF0Y2hlcyB0aGUgdGV4dCBmb2xsb3dpbmcgYSBzZW1pY29sb24gb3IgY2FsZW5kYXIgZW1vamkuXG4gKiBEb2VzIG5vdCBtYXRjaCBsaW5rcyBvciA8PlxuICovXG5jb25zdCByZXBlYXRTY2hlZHVsZVJlID0gL1s78J+ThV1cXHMqKFstYS16QS1aMC05ID07OlxcLF0rKS87XG5cbmV4cG9ydCBjbGFzcyBUYXNrTGluZSB7XG4gIHB1YmxpYyByZWFkb25seSBsaW5lTnVtOiBudW1iZXI7XG4gIHB1YmxpYyByZWFkb25seSBzdWJDb250ZW50OiBzdHJpbmdbXTtcbiAgcHVibGljIHJlYWRvbmx5IGhlYWRpbmdzOiBzdHJpbmdbXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGZpbGU6IFRGaWxlO1xuICBwcml2YXRlIHJlYWRvbmx5IHZhdWx0OiBWYXVsdEludGVybWVkaWF0ZTtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nczogSVNldHRpbmdzO1xuXG4gIHByaXZhdGUgX2xpbmU6IHN0cmluZztcblxuICBwcml2YXRlIF9yZXBlYXRzOiBib29sZWFuO1xuICBwcml2YXRlIF9yZXBlYXRDb25maWc6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBsaW5lTnVtOiBudW1iZXIsXG4gICAgZmlsZTogVEZpbGUsXG4gICAgZmlsZUxpbmVzOiBzdHJpbmdbXSwgLy8gQ2FuIG5vdCB1c2UgYXN5bmMgaW4gYSBjb25zdHJ1Y3RvclxuICAgIHZhdWx0OiBWYXVsdEludGVybWVkaWF0ZSxcbiAgICBzZXR0aW5nczogSVNldHRpbmdzLFxuICApIHtcbiAgICB0aGlzLl9saW5lID0gZmlsZUxpbmVzW2xpbmVOdW1dO1xuICAgIHRoaXMubGluZU51bSA9IGxpbmVOdW07XG4gICAgdGhpcy5maWxlID0gZmlsZTtcbiAgICB0aGlzLnZhdWx0ID0gdmF1bHQ7XG4gICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzO1xuXG4gICAgaWYgKCF0aGlzLmlzVGFzaygpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zdWJDb250ZW50ID0gdGhpcy5nZXRTdWJDb250ZW50KGZpbGVMaW5lcyk7XG4gICAgdGhpcy5oZWFkaW5ncyA9IHRoaXMuZ2V0SGVhZGluZ3MoZmlsZUxpbmVzKTtcblxuICAgIGNvbnN0IHJlcGVhdE1hdGNoZXMgPSByZXBlYXRTY2hlZHVsZVJlLmV4ZWModGhpcy5fbGluZSk7XG4gICAgaWYgKHJlcGVhdE1hdGNoZXMgJiYgcmVwZWF0TWF0Y2hlcy5sZW5ndGggPT09IDIpIHtcbiAgICAgIHRoaXMuX3JlcGVhdHMgPSB0cnVlO1xuICAgICAgdGhpcy5fcmVwZWF0Q29uZmlnID0gcmVwZWF0TWF0Y2hlc1sxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcmVwZWF0cyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBsaW5lIHJldHVybnMgdGhlIGN1cnJlbnQgKHBvc3NpYmx5IG1vZGlmaWVkKSB2YWx1ZSBvZiB0aGlzIHRhc2sgbGluZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgbGluZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9saW5lO1xuICB9XG5cbiAgcHVibGljIGdldCByZXBlYXRzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9yZXBlYXRzO1xuICB9XG5cbiAgcHVibGljIGdldCByZXBlYXRlcigpOiBSZXBlYXRBZGFwdGVyIHtcbiAgICBpZiAodGhpcy5fcmVwZWF0Q29uZmlnKSB7XG4gICAgICByZXR1cm4gbmV3IFJlcGVhdEFkYXB0ZXIoUlJ1bGUuZnJvbVRleHQodGhpcy5fcmVwZWF0Q29uZmlnKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBSZXBlYXRBZGFwdGVyKFxuICAgICAgbmV3IFJSdWxlKHsgZnJlcTogRnJlcXVlbmN5LldFRUtMWSwgaW50ZXJ2YWw6IDEgfSksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29tcGxldGUoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbWF0Y2hlcyA9IHRhc2tSZS5leGVjKHRoaXMuX2xpbmUpO1xuICAgIGlmICghbWF0Y2hlcykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGlubmVyQ2hhciA9IG1hdGNoZXNbMF0udHJpbVN0YXJ0KClbM107XG4gICAgcmV0dXJuIGlubmVyQ2hhciA9PT0gJ3gnIHx8IGlubmVyQ2hhciA9PT0gJ1gnO1xuICB9XG5cbiAgcHVibGljIGdldCBpbmNvbXBsZXRlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG1hdGNoZXMgPSB0YXNrUmUuZXhlYyh0aGlzLl9saW5lKTtcbiAgICBpZiAoIW1hdGNoZXMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBpbm5lckNoYXIgPSBtYXRjaGVzWzBdLnRyaW1TdGFydCgpWzNdO1xuICAgIHJldHVybiBpbm5lckNoYXIgPT09ICcgJztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2tpcHBlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBtYXRjaGVzID0gdGFza1JlLmV4ZWModGhpcy5fbGluZSk7XG4gICAgaWYgKCFtYXRjaGVzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgaW5uZXJDaGFyID0gbWF0Y2hlc1swXS50cmltU3RhcnQoKVszXTtcbiAgICByZXR1cm4gaW5uZXJDaGFyID09PSAnLSc7XG4gIH1cblxuICAvLyBDb252ZXJ0cyB0aGUgbGluZSB0byBiZSB1c2VkIGluIHBsYWNlcyB3aGVyZSBpdCB3YXMgY29waWVkIHRvIGFub3RoZXIgbm90ZVxuICAvLyBiZWNhdXNlIGl0IHJlcGVhdHMuXG4gIC8vIFNvbWV0aGluZyBsaWtlOlxuICAvLyAtIFsgXSBUaGlzIGlzIHRoZSB0YXNrIDsgRXZlcnkgU3VuZGF5XG4gIC8vIC0gWyBdIFRoaXMgaXMgdGhlIHRhc2sgOyBFdmVyeSBTdW5kYXlcbiAgcHVibGljIGxpbmVBc1JlcGVhdGVkID0gKCk6IHN0cmluZyA9PiB0aGlzLmxpbmUucmVwbGFjZSgvXFxbW3hYXVxcXS8sICdbIF0nKTtcblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpbmUgc3RvcmVkIGlzIGFjdHVhbGx5IGEgdmFsaWQgTWFya2Rvd24gdGFzay4gTk9URTpcbiAgICogVGhpcyB1c2VzIHJlZ2V4IGFuZCBpcyBub3QgcXVpdGUgYXMgcGVyZm9ybWFudCBhcyBUYXNrSGFuZGxlci5pc0xpbmVUYXNrKClcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpc1Rhc2sgPSAoKTogYm9vbGVhbiA9PiB0YXNrUmUudGVzdCh0aGlzLmxpbmUpO1xuXG4gIC8qKlxuICAgKiBTYXZlIHRoZSBjb250ZW50cyBvZiB0aGlzIFRhc2tMaW5lIGJhY2sgdG8gdGhlIGZpbGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc2F2ZSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCBmaWxlQ29udGVudHMgPSBhd2FpdCB0aGlzLnZhdWx0LnJlYWRGaWxlKHRoaXMuZmlsZSwgZmFsc2UpO1xuICAgIGNvbnN0IGxpbmVzID0gZmlsZUNvbnRlbnRzLnNwbGl0KCdcXG4nKTtcbiAgICBsaW5lc1t0aGlzLmxpbmVOdW1dID0gdGhpcy5fbGluZTtcbiAgICBjb25zdCBuZXdGaWxlQ29udGVudHMgPSBsaW5lcy5qb2luKCdcXG4nKTtcblxuICAgIGF3YWl0IHRoaXMudmF1bHQud3JpdGVGaWxlKHRoaXMuZmlsZSwgbmV3RmlsZUNvbnRlbnRzKTtcbiAgfTtcblxuICBwdWJsaWMgcmVhZG9ubHkgY3JlYXRlTmV4dFJlcGV0aXRpb24gPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKCF0aGlzLl9yZXBlYXRzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudE5vdGVEYXRlID0gdGhpcy52YXVsdC5maW5kTW9tZW50Rm9yRGFpbHlOb3RlKHRoaXMuZmlsZSk7XG4gICAgY29uc3QgbmV4dERhdGUgPSB3aW5kb3dcbiAgICAgIC5tb21lbnQoXG4gICAgICAgIHRoaXMucmVwZWF0ZXIuYXNSUnVsZSgpLmFmdGVyKGN1cnJlbnROb3RlRGF0ZS5lbmRPZignZGF5JykudG9EYXRlKCkpLFxuICAgICAgKVxuICAgICAgLnN0YXJ0T2YoJ2RheScpO1xuXG4gICAgY29uc29sZS5kZWJ1Zyh7XG4gICAgICBtc2c6ICdDcmVhdGluZyBuZXh0IHRhc2sgcmVwZXRpdGlvbicsXG4gICAgICByZXBlYXRlcjogdGhpcy5yZXBlYXRlci50b1N0cmluZygpLFxuICAgICAgY29tcGxldGVkX25vdGVfZGF0ZTogY3VycmVudE5vdGVEYXRlLFxuICAgICAgbmV4dF9ub3RlX2RhdGU6IG5leHREYXRlLFxuICAgIH0pO1xuXG4gICAgY29uc3QgbmV4dE9jY3VyZW5jZUZpbGUgPSBhd2FpdCB0aGlzLnZhdWx0LmdldERhaWx5Tm90ZShuZXh0RGF0ZSk7XG4gICAgcmV0dXJuIGFkZFRhc2tSZXBldGl0aW9uKFxuICAgICAgbmV4dE9jY3VyZW5jZUZpbGUsXG4gICAgICB0aGlzLFxuICAgICAgdGhpcy5zZXR0aW5ncyxcbiAgICAgIHRoaXMudmF1bHQsXG4gICAgKTtcbiAgfTtcblxuICBwdWJsaWMgcmVhZG9ubHkgbW92ZSA9IGFzeW5jIChkYXRlOiBNb21lbnQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCBuZXdGaWxlID0gYXdhaXQgdGhpcy52YXVsdC5nZXREYWlseU5vdGUoZGF0ZSk7XG5cbiAgICBhd2FpdCBhZGRUYXNrTW92ZShuZXdGaWxlLCB0aGlzLCB0aGlzLnNldHRpbmdzLCB0aGlzLnZhdWx0KTtcblxuICAgIGlmICh0aGlzLnNldHRpbmdzLnByZXNlcnZlTW92ZWRUYXNrcykge1xuICAgICAgLy8gTUFSSyBXSVRIIFs+XSwgYW5kIHByZXNlcnZlXG4gICAgICByZXR1cm4gbWFya1Rhc2tBc0NvcGllZChcbiAgICAgICAgdGhpcy5maWxlLFxuICAgICAgICB0aGlzLmxpbmVOdW0sXG4gICAgICAgIHRoaXMuc3ViQ29udGVudC5sZW5ndGggKyAxLFxuICAgICAgICB0aGlzLnZhdWx0LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgdGhpcyB0YXNrIGFuZCBzdWJjb250ZW50XG4gICAgcmV0dXJuIHJlbW92ZUxpbmVzKFxuICAgICAgdGhpcy5maWxlLFxuICAgICAgdGhpcy5saW5lTnVtLFxuICAgICAgdGhpcy5zdWJDb250ZW50Lmxlbmd0aCArIDEsXG4gICAgICB0aGlzLnZhdWx0LFxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEFwcGx5IHRoZSBwcm92aWRlZCByZXBlYXRlciB0byB0aGlzIHRhc2ssIHVwZGF0aW5nIHRoZSBjdXJyZW50IHZhbHVlIGlmXG4gICAqIHRoZXJlIGlzIGFscmVhZHkgYSByZXBlYXQgY29uZmlnLCBvciBjcmVhdGluZyBvbmUgaWYgbm90LiBBIGJsb2NrSUQgd2lsbFxuICAgKiBiZSBnZW5lcmF0ZWQgaWYgb25lIGRvZXMgbm90IGFscmVhZHkgZXhpc3QuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaGFuZGxlUmVwZWF0ZXJVcGRhdGVkID0gKFxuICAgIHJlcGVhdGVyOiBSZXBlYXRBZGFwdGVyLFxuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAoIXRoaXMuX3JlcGVhdENvbmZpZykge1xuICAgICAgLy8gQWRkaW5nIGEgcmVwZWF0IGNvbmZpZyB0byBhIHRhc2sgdGhhdCBwcmV2aW91c2x5IGRpZCBub3QgaGF2ZSBvbmVcbiAgICAgIHRoaXMuX2xpbmUgPSB0aGlzLl9saW5lLnRyaW1SaWdodCgpICsgJyDwn5OFICcgKyByZXBlYXRlci50b1RleHQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbGluZSA9IHRoaXMuX2xpbmVcbiAgICAgICAgLnJlcGxhY2UodGhpcy5fcmVwZWF0Q29uZmlnLCByZXBlYXRlci50b1RleHQoKSArICcgJylcbiAgICAgICAgLnRyaW0oKTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZXBlYXRDb25maWcgPSByZXBlYXRlci50b1RleHQoKTtcbiAgICB0aGlzLl9yZXBlYXRzID0gcmVwZWF0ZXIuaXNWYWxpZCgpO1xuICAgIHJldHVybiB0aGlzLnNhdmUoKTtcbiAgfTtcblxuICBwdWJsaWMgcmVhZG9ubHkgc2tpcE9jY3VyZW5jZSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAoIXRoaXMuX3JlcGVhdENvbmZpZykge1xuICAgICAgbmV3IE5vdGljZSgnQ2Fubm90IHNraXAgYW4gb2NjdXJlbmNlIG9mIGEgbm9uLXJlcGVhdGluZyB0YXNrJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmluY29tcGxldGUpIHtcbiAgICAgIG5ldyBOb3RpY2UoXG4gICAgICAgICdDYW5ub3Qgc2tpcCBhIHRhc2sgd2hpY2ggaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkLCBtb3ZlZCwgb3Igc2tpcHBlZCcsXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuY3JlYXRlTmV4dFJlcGV0aXRpb24oKTtcblxuICAgIHRoaXMuX2xpbmUgPSB0aGlzLl9saW5lLnJlcGxhY2UoL1xcWyBcXF0vLCAnWy1dJyk7XG4gICAgcmV0dXJuIHRoaXMuc2F2ZSgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBnZXRTdWJDb250ZW50IGNoZWNrcyBmb3IgbGluZXMgd2hpY2ggYXJlIG5lc3RlZCB1bmRlciB0aGlzIHRhc2suIFRoZXkgbWF5XG4gICAqIHN0YXJ0IHdpdGggYW55IGNoYXJhY3RlciwgdGhleSBqdXN0IG11c3QgYmUgaW5kZW50ZWQgbW9yZSB0aGFuIHRoaXMgbGluZS5cbiAgICpcbiAgICogTm8gYmxhbmsgbGluZXMgYXJlIGFsbG93ZWQgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBuZXN0ZWQgY29udGVudC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZ2V0U3ViQ29udGVudCA9IChsaW5lczogc3RyaW5nW10pOiBzdHJpbmdbXSA9PiB7XG4gICAgY29uc3QgdG9SZXR1cm46IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgdGFza0luZGVudExldmVsID0gZ2V0TGluZUluZGVudExldmVsKHRoaXMuX2xpbmUpO1xuICAgIC8vIFN0YXJ0aW5nIG9uIHRoZSBsaW5lIGFmdGVyIHRhc2ssIGxvb2sgZm9yIHN1YiBsaW5lc1xuICAgIGZvciAobGV0IGkgPSB0aGlzLmxpbmVOdW0gKyAxOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRMaW5lID0gbGluZXNbaV07XG4gICAgICBpZiAoZ2V0TGluZUluZGVudExldmVsKGN1cnJlbnRMaW5lKSA+IHRhc2tJbmRlbnRMZXZlbCkge1xuICAgICAgICB0b1JldHVybi5wdXNoKGN1cnJlbnRMaW5lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdG9SZXR1cm47XG4gIH07XG5cbiAgLyoqXG4gICAqIGdldEhlYWRpbmdzIHJldHVybnMgYWxsIGhlYWRpbmdzIHRoaXMgdGFzayBpcyB1bmRlciB1cCB0byBhbmQgaW5jbHVkaW5nXG4gICAqIHRoZSBzZXR0aW5ncy50YXNrc0hlYWRlci4gSWYgdGhlIHRhc2sgaXMgbm90IG5lc3RlZCB1bmRlclxuICAgKiBzZXR0aW5ncy50YXNrc0hlYWRlciwgbm8gaGVhZGluZ3Mgd2lsbCBiZSByZXR1cm5lZC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZ2V0SGVhZGluZ3MgPSAobGluZXM6IHN0cmluZ1tdKTogc3RyaW5nW10gPT4ge1xuICAgIGNvbnN0IGhlYWRpbmdzOiBzdHJpbmdbXSA9IFtdO1xuICAgIC8vIFNlYXJjaCB1cCB0aHJvdWdoIHRoZSBmaWxlIGZyb20gdGhpcyB0YXNrLCBsb29raW5nIGZvciB0aGUgZmlyc3QgaGVhZGluZ1xuICAgIGxldCBuZXh0SGVhZGluZyA9IC0xO1xuICAgIGZvciAobGV0IGkgPSB0aGlzLmxpbmVOdW0gLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgaWYgKGdldEhlYWRlckRlcHRoKGxpbmVzW2ldKSA+IDApIHtcbiAgICAgICAgbmV4dEhlYWRpbmcgPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobmV4dEhlYWRpbmcgPT09IC0xKSB7XG4gICAgICAvLyBmb3VuZCBubyBoZWFkaW5ncyBhYm92ZSB0aGlzIHRhc2sgbGluZVxuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGRvIHtcbiAgICAgIGhlYWRpbmdzLnB1c2gobGluZXNbbmV4dEhlYWRpbmddKTtcbiAgICAgIGlmIChsaW5lc1tuZXh0SGVhZGluZ10gPT09IHRoaXMuc2V0dGluZ3MudGFza3NIZWFkZXIpIHtcbiAgICAgICAgLy8gVGhpcyBpcyB0aGUgdG9wIGxldmVsIHRoYXQgd2UgY2FyZSBhYm91dCwgc28gc3RvcCBzZWFyY2hpbmdcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIG5leHRIZWFkaW5nID0gZ2V0UGFyZW50SGVhZGVySW5kZXgobmV4dEhlYWRpbmcsIGxpbmVzKTtcbiAgICB9IHdoaWxlIChuZXh0SGVhZGluZyA+IC0xKTtcblxuICAgIHJldHVybiBoZWFkaW5ncy5yZXZlcnNlKCk7XG4gIH07XG59XG5cbmNvbnN0IGdldFBhcmVudEhlYWRlckluZGV4ID0gKFxuICBzdGFydGluZ0hlYWRlcklkeDogbnVtYmVyLFxuICBsaW5lczogc3RyaW5nW10sXG4pOiBudW1iZXIgPT4ge1xuICBjb25zdCBzdGFydGluZ0hlYWRlckRlcHRoID0gZ2V0SGVhZGVyRGVwdGgobGluZXNbc3RhcnRpbmdIZWFkZXJJZHhdKTtcblxuICBmb3IgKGxldCBpID0gc3RhcnRpbmdIZWFkZXJJZHggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGNvbnN0IGN1cnJlbnRIZWFkZXJEZXB0aCA9IGdldEhlYWRlckRlcHRoKGxpbmVzW2ldKTtcbiAgICBpZiAoY3VycmVudEhlYWRlckRlcHRoID4gMCAmJiBjdXJyZW50SGVhZGVyRGVwdGggPCBzdGFydGluZ0hlYWRlckRlcHRoKSB7XG4gICAgICByZXR1cm4gaTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufTtcblxuY29uc3QgZ2V0TGluZUluZGVudExldmVsID0gKGxpbmU6IHN0cmluZyk6IG51bWJlciA9PlxuICBsaW5lLmxlbmd0aCAtIGxpbmUudHJpbVN0YXJ0KCkubGVuZ3RoO1xuIiwiaW1wb3J0IHsgZmlsZUlzRGFpbHlOb3RlIH0gZnJvbSAnLi9maWxlLWhlbHBlcnMnO1xuaW1wb3J0IHR5cGUgeyBJU2V0dGluZ3MgfSBmcm9tICcuL3NldHRpbmdzJztcbmltcG9ydCB7IFRhc2tMaW5lIH0gZnJvbSAnLi90YXNrLWxpbmUnO1xuaW1wb3J0IHR5cGUgeyBWYXVsdEludGVybWVkaWF0ZSB9IGZyb20gJy4vdmF1bHQnO1xuaW1wb3J0IHR5cGUgeyBNb21lbnQgfSBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHR5cGUgeyBNZXRhZGF0YUNhY2hlLCBURmlsZSB9IGZyb20gJ29ic2lkaWFuJztcblxuLy8gVE9ETzogU3dpdGNoIHRhc2tDYWNoZSB0byB1c2UgdGhlIFRhc2tDYWNoZSBjbGFzc1xuXG5leHBvcnQgY2xhc3MgVGFza0hhbmRsZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzOiBJU2V0dGluZ3M7XG4gIHByaXZhdGUgcmVhZG9ubHkgdmF1bHQ6IFZhdWx0SW50ZXJtZWRpYXRlO1xuICBwcml2YXRlIHJlYWRvbmx5IG1ldGFkYXRhQ2FjaGU6IE1ldGFkYXRhQ2FjaGU7XG4gIHByaXZhdGUgdGFza0NhY2hlOiBSZWNvcmQ8c3RyaW5nLCBUYXNrTGluZVtdPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICB2YXVsdDogVmF1bHRJbnRlcm1lZGlhdGUsXG4gICAgbWV0YWRhdGFDYWNoZTogTWV0YWRhdGFDYWNoZSxcbiAgICBzZXR0aW5nczogSVNldHRpbmdzLFxuICApIHtcbiAgICB0aGlzLnZhdWx0ID0gdmF1bHQ7XG4gICAgdGhpcy5tZXRhZGF0YUNhY2hlID0gbWV0YWRhdGFDYWNoZTtcbiAgICB0aGlzLnNldHRpbmdzID0gc2V0dGluZ3M7XG4gICAgdGhpcy50YXNrQ2FjaGUgPSB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTY2FuIHRoZSB3aG9sZSBmaWxlLCBsb29raW5nIGZvciB0YXNrcyB3aXRoIHJlcGV0aXRpb24gY29uZmlncy5cbiAgICogRm9yIGVhY2ggdGFzayBmb3VuZCwgZW5zdXJlIHRoYXQgc3Vic2VxdWVudCB0YXNrcyBoYXZlIGJlZW4gY3JlYXRlZC5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiB3aWxsOlxuICAgKiAtIE1vZGlmeSB0aGUgcHJvdmlkZWQgZmlsZSB0byBhZGQgYmxvY2sgcmVmZXJlbmNlcyB0byByZXBlYXRpbmcgdGFza3NcbiAgICogLSBDcmVhdGUgbWlzc2luZyBkYWlseSBub3RlcyBuZWVkZWQgYnkgcmVwZWF0aW5nIHRhc2tzXG4gICAqIC0gSW5zZXJ0IGFsbCBvY2N1cmVuY2VzIG9mIGEgZmluaXRlIHJlcGVhdGluZyB0YXNrXG4gICAqIC0gSW5zZXJ0IGEgY29uZmlndXJhYmxlIG51bWJlciBvZiBpbmZpbml0ZSByZXBlYXRpbmcgdGFza3NcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwcm9jZXNzRmlsZSA9IGFzeW5jIChmaWxlOiBURmlsZSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmICghZmlsZUlzRGFpbHlOb3RlKGZpbGUsIHRoaXMudmF1bHQpKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKFxuICAgICAgICAnU2xhdGVkOiBOb3QgaW4gYSBkYWlseSBub3RlLCBub3QgcHJvY2Vzc2luZyBjb250YWluZWQgdGFza3MnLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0YXNrcyA9IGF3YWl0IHRoaXMuZ2V0RmlsZVRhc2tzKGZpbGUpO1xuICAgIGNvbnN0IG5ld2x5Q29tcGxldGVkVGFza3MgPSB0aGlzLmZpbHRlck5ld2x5Q29tcGxldGVkVGFza3MoXG4gICAgICBmaWxlLmJhc2VuYW1lLFxuICAgICAgdGFza3MsXG4gICAgKTtcbiAgICB0aGlzLnRhc2tDYWNoZVtmaWxlLmJhc2VuYW1lXSA9IHRhc2tzO1xuICAgIHJldHVybiB0aGlzLnByb3BvZ2F0ZUNvbXBsZXRlZFRhc2tzKG5ld2x5Q29tcGxldGVkVGFza3MpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBtb3ZlSW5jb21wbGV0ZWQgbW92ZXMgYWxsIHRhc2tzIGluIGEgZmlsZSB3aGljaCBhcmUgbm90IGNvbXBsZXRlIHRvIHRoZVxuICAgKiBkYWlseSBub3RlIGZvciB0aGUgcHJvdmlkZWQgbW9tZW50LlxuICAgKlxuICAgKiBUYXNrcyBhcmUgbW92ZWQgb25lIGF0IGEgdGltZSBzbyB0aGF0IHdlIGRvIG5vdCBkdXBsaWNhdGUgc3ViLXRhc2tzLCBhbmRcbiAgICogc28gdGhhdCB3ZSBhcmUgbm90IGNvbmZ1c2VkIGJ5IGNoYW5naW5nIGxpbmUgbnVtYmVycyBpbiB0aGUgc291cmNlIGZpbGUgYXNcbiAgICogd2UgcmVtb3ZlIHRhc2tzLiBJdCdzIG5vdCB2ZXJ5IGVmZmljaWVudCwgYnV0IGl0IGRvZXMgc2VlbSB0byB3b3JrLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1vdmVJbmNvbXBsZXRlZCA9IGFzeW5jIChcbiAgICBmaWxlOiBURmlsZSxcbiAgICB0bzogTW9tZW50LFxuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgdGFza3MgPSBhd2FpdCB0aGlzLmdldEZpbGVUYXNrcyhmaWxlKTtcbiAgICAgIGlmICghdGFza3MgfHwgIXRhc2tzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBmaXJzdEluY29tcGxldGUgPSB0YXNrcy5maW5kKCh0YXNrKSA9PiB0YXNrLmluY29tcGxldGUpO1xuICAgICAgaWYgKCFmaXJzdEluY29tcGxldGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBmaXJzdEluY29tcGxldGUubW92ZSh0byk7XG4gICAgfVxuICB9O1xuXG4gIHB1YmxpYyByZWFkb25seSBnZXRDYWNoZWRUYXNrc0ZvckZpbGUgPSAoZmlsZTogVEZpbGUpOiBUYXNrTGluZVtdID0+XG4gICAgdGhpcy50YXNrQ2FjaGVbZmlsZS5iYXNlbmFtZV07XG5cbiAgcHVibGljIHJlYWRvbmx5IGdldEZpbGVUYXNrcyA9IGFzeW5jIChmaWxlOiBURmlsZSk6IFByb21pc2U8VGFza0xpbmVbXT4gPT4ge1xuICAgIGNvbnN0IGNhY2hlZExpc3RJdGVtcyA9IHRoaXMubWV0YWRhdGFDYWNoZS5nZXRGaWxlQ2FjaGUoZmlsZSkubGlzdEl0ZW1zO1xuICAgIGlmICghY2FjaGVkTGlzdEl0ZW1zIHx8IGNhY2hlZExpc3RJdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlQ29udGVudHMgPSBhd2FpdCB0aGlzLnZhdWx0LnJlYWRGaWxlKGZpbGUsIGZhbHNlKTtcbiAgICBjb25zdCBzcGxpdEZpbGVDb250ZW50cyA9IGZpbGVDb250ZW50cy5zcGxpdCgnXFxuJyk7XG5cbiAgICAvLyBUT0RPOiBQYXNzIGluZm8gYWJvdXQgbGlzdCBzdGFydCBhbmQgcGFyZW50XG5cbiAgICByZXR1cm4gY2FjaGVkTGlzdEl0ZW1zXG4gICAgICAuZmlsdGVyKChsaSkgPT4gbGkudGFzaylcbiAgICAgIC5tYXAoKGxpKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgVGFza0xpbmUoXG4gICAgICAgICAgbGkucG9zaXRpb24uc3RhcnQubGluZSxcbiAgICAgICAgICBmaWxlLFxuICAgICAgICAgIHNwbGl0RmlsZUNvbnRlbnRzLFxuICAgICAgICAgIHRoaXMudmF1bHQsXG4gICAgICAgICAgdGhpcy5zZXR0aW5ncyxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBUZXN0IGlmIHRoaXMgbGluZSBpcyBhIHRhc2suIFRoaXMgaXMgY2FsbGVkIGZvciBldmVyeSBsaW5lIGluIGEgZmlsZSBhZnRlclxuICAgKiBldmVyeSBzYXZlLCBzbyBwZXJmb3JtYW5jZSBpcyBlc3NlbnRpYWwuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXNMaW5lVGFzayA9IChsaW5lOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgICBjb25zdCB0cmltbWVkID0gbGluZS50cmltU3RhcnQoKTtcblxuICAgIC8vIFdlIGNhbiBydWxlIG91dCBhbnl0aGluZyB0aGF0IGlzIG5vdCBhIGxpc3QgYnkgdGVzdGluZyBhIHNpbmdsZSBjaGFyXG4gICAgaWYgKHRyaW1tZWRbMF0gIT09ICctJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICB0cmltbWVkLnN0YXJ0c1dpdGgoJy0gWyBdICcpIHx8XG4gICAgICB0cmltbWVkLnN0YXJ0c1dpdGgoJy0gW3hdICcpIHx8XG4gICAgICB0cmltbWVkLnN0YXJ0c1dpdGgoJy0gW1hdICcpIHx8XG4gICAgICB0cmltbWVkLnN0YXJ0c1dpdGgoJy0gWy1dICcpXG4gICAgKTtcbiAgfTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGZpbHRlck5ld2x5Q29tcGxldGVkVGFza3MgPSAoXG4gICAgZmlsZW5hbWU6IHN0cmluZyxcbiAgICB0YXNrczogVGFza0xpbmVbXSxcbiAgKTogVGFza0xpbmVbXSA9PiB7XG4gICAgY29uc3QgcHJldlRhc2tzID0gdGhpcy50YXNrQ2FjaGVbZmlsZW5hbWVdO1xuICAgIHJldHVybiB0YXNrcy5maWx0ZXIoKHRhc2spID0+IHtcbiAgICAgIGlmICghdGFzay5jb21wbGV0ZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICghcHJldlRhc2tzKSB7XG4gICAgICAgIC8vIGl0J3MgY29tcGxldGUgYW5kIHRoZXJlIHdlcmUgbm8gcHJldmlvdXMgdGFza3MsIHNvIG11c3QgYmUgbmV3XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByZXZUYXNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBwcmV2VGFzayA9IHByZXZUYXNrc1tpXTtcbiAgICAgICAgaWYgKHRhc2subGluZSA9PT0gcHJldlRhc2subGluZSkge1xuICAgICAgICAgIC8vIGlmIHByZXZUYXNrIGNvbXBsZXRlIHRoZW4gbm90IG5ld2x5IGNvbXBsZXRlZFxuICAgICAgICAgIHJldHVybiAhcHJldlRhc2suY29tcGxldGU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQSBuZXdseSBhZGRlZCB0YXNrIHRoYXQgaXMgYWxzbyBjb21wbGV0ZS5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIG5leHQgb2NjdXJlbmNlIGZvciBlYWNoIG9mIHRoZSBwcm92aWRlZCB0YXNrcy5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvcG9nYXRlQ29tcGxldGVkVGFza3MgPSBhc3luYyAoXG4gICAgdGFza3M6IFRhc2tMaW5lW10sXG4gICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgdGFza3NcbiAgICAgICAgLmZpbHRlcigodGFzaykgPT4gdGFzay5yZXBlYXRzKVxuICAgICAgICAubWFwKCh0YXNrKSA9PiB0YXNrLmNyZWF0ZU5leHRSZXBldGl0aW9uKCkpLFxuICAgICk7XG4gIH07XG59XG4iLCJmdW5jdGlvbiBub29wKCkgeyB9XG5jb25zdCBpZGVudGl0eSA9IHggPT4geDtcbmZ1bmN0aW9uIGFzc2lnbih0YXIsIHNyYykge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBmb3IgKGNvbnN0IGsgaW4gc3JjKVxuICAgICAgICB0YXJba10gPSBzcmNba107XG4gICAgcmV0dXJuIHRhcjtcbn1cbmZ1bmN0aW9uIGlzX3Byb21pc2UodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJztcbn1cbmZ1bmN0aW9uIGFkZF9sb2NhdGlvbihlbGVtZW50LCBmaWxlLCBsaW5lLCBjb2x1bW4sIGNoYXIpIHtcbiAgICBlbGVtZW50Ll9fc3ZlbHRlX21ldGEgPSB7XG4gICAgICAgIGxvYzogeyBmaWxlLCBsaW5lLCBjb2x1bW4sIGNoYXIgfVxuICAgIH07XG59XG5mdW5jdGlvbiBydW4oZm4pIHtcbiAgICByZXR1cm4gZm4oKTtcbn1cbmZ1bmN0aW9uIGJsYW5rX29iamVjdCgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShudWxsKTtcbn1cbmZ1bmN0aW9uIHJ1bl9hbGwoZm5zKSB7XG4gICAgZm5zLmZvckVhY2gocnVuKTtcbn1cbmZ1bmN0aW9uIGlzX2Z1bmN0aW9uKHRoaW5nKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGluZyA9PT0gJ2Z1bmN0aW9uJztcbn1cbmZ1bmN0aW9uIHNhZmVfbm90X2VxdWFsKGEsIGIpIHtcbiAgICByZXR1cm4gYSAhPSBhID8gYiA9PSBiIDogYSAhPT0gYiB8fCAoKGEgJiYgdHlwZW9mIGEgPT09ICdvYmplY3QnKSB8fCB0eXBlb2YgYSA9PT0gJ2Z1bmN0aW9uJyk7XG59XG5mdW5jdGlvbiBub3RfZXF1YWwoYSwgYikge1xuICAgIHJldHVybiBhICE9IGEgPyBiID09IGIgOiBhICE9PSBiO1xufVxuZnVuY3Rpb24gaXNfZW1wdHkob2JqKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikubGVuZ3RoID09PSAwO1xufVxuZnVuY3Rpb24gdmFsaWRhdGVfc3RvcmUoc3RvcmUsIG5hbWUpIHtcbiAgICBpZiAoc3RvcmUgIT0gbnVsbCAmJiB0eXBlb2Ygc3RvcmUuc3Vic2NyaWJlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7bmFtZX0nIGlzIG5vdCBhIHN0b3JlIHdpdGggYSAnc3Vic2NyaWJlJyBtZXRob2RgKTtcbiAgICB9XG59XG5mdW5jdGlvbiBzdWJzY3JpYmUoc3RvcmUsIC4uLmNhbGxiYWNrcykge1xuICAgIGlmIChzdG9yZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBub29wO1xuICAgIH1cbiAgICBjb25zdCB1bnN1YiA9IHN0b3JlLnN1YnNjcmliZSguLi5jYWxsYmFja3MpO1xuICAgIHJldHVybiB1bnN1Yi51bnN1YnNjcmliZSA/ICgpID0+IHVuc3ViLnVuc3Vic2NyaWJlKCkgOiB1bnN1Yjtcbn1cbmZ1bmN0aW9uIGdldF9zdG9yZV92YWx1ZShzdG9yZSkge1xuICAgIGxldCB2YWx1ZTtcbiAgICBzdWJzY3JpYmUoc3RvcmUsIF8gPT4gdmFsdWUgPSBfKSgpO1xuICAgIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGNvbXBvbmVudF9zdWJzY3JpYmUoY29tcG9uZW50LCBzdG9yZSwgY2FsbGJhY2spIHtcbiAgICBjb21wb25lbnQuJCQub25fZGVzdHJveS5wdXNoKHN1YnNjcmliZShzdG9yZSwgY2FsbGJhY2spKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZV9zbG90KGRlZmluaXRpb24sIGN0eCwgJCRzY29wZSwgZm4pIHtcbiAgICBpZiAoZGVmaW5pdGlvbikge1xuICAgICAgICBjb25zdCBzbG90X2N0eCA9IGdldF9zbG90X2NvbnRleHQoZGVmaW5pdGlvbiwgY3R4LCAkJHNjb3BlLCBmbik7XG4gICAgICAgIHJldHVybiBkZWZpbml0aW9uWzBdKHNsb3RfY3R4KTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRfc2xvdF9jb250ZXh0KGRlZmluaXRpb24sIGN0eCwgJCRzY29wZSwgZm4pIHtcbiAgICByZXR1cm4gZGVmaW5pdGlvblsxXSAmJiBmblxuICAgICAgICA/IGFzc2lnbigkJHNjb3BlLmN0eC5zbGljZSgpLCBkZWZpbml0aW9uWzFdKGZuKGN0eCkpKVxuICAgICAgICA6ICQkc2NvcGUuY3R4O1xufVxuZnVuY3Rpb24gZ2V0X3Nsb3RfY2hhbmdlcyhkZWZpbml0aW9uLCAkJHNjb3BlLCBkaXJ0eSwgZm4pIHtcbiAgICBpZiAoZGVmaW5pdGlvblsyXSAmJiBmbikge1xuICAgICAgICBjb25zdCBsZXRzID0gZGVmaW5pdGlvblsyXShmbihkaXJ0eSkpO1xuICAgICAgICBpZiAoJCRzY29wZS5kaXJ0eSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbGV0cztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGxldHMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBjb25zdCBtZXJnZWQgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IGxlbiA9IE1hdGgubWF4KCQkc2NvcGUuZGlydHkubGVuZ3RoLCBsZXRzLmxlbmd0aCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICAgICAgICAgICAgbWVyZ2VkW2ldID0gJCRzY29wZS5kaXJ0eVtpXSB8IGxldHNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbWVyZ2VkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAkJHNjb3BlLmRpcnR5IHwgbGV0cztcbiAgICB9XG4gICAgcmV0dXJuICQkc2NvcGUuZGlydHk7XG59XG5mdW5jdGlvbiB1cGRhdGVfc2xvdChzbG90LCBzbG90X2RlZmluaXRpb24sIGN0eCwgJCRzY29wZSwgZGlydHksIGdldF9zbG90X2NoYW5nZXNfZm4sIGdldF9zbG90X2NvbnRleHRfZm4pIHtcbiAgICBjb25zdCBzbG90X2NoYW5nZXMgPSBnZXRfc2xvdF9jaGFuZ2VzKHNsb3RfZGVmaW5pdGlvbiwgJCRzY29wZSwgZGlydHksIGdldF9zbG90X2NoYW5nZXNfZm4pO1xuICAgIGlmIChzbG90X2NoYW5nZXMpIHtcbiAgICAgICAgY29uc3Qgc2xvdF9jb250ZXh0ID0gZ2V0X3Nsb3RfY29udGV4dChzbG90X2RlZmluaXRpb24sIGN0eCwgJCRzY29wZSwgZ2V0X3Nsb3RfY29udGV4dF9mbik7XG4gICAgICAgIHNsb3QucChzbG90X2NvbnRleHQsIHNsb3RfY2hhbmdlcyk7XG4gICAgfVxufVxuZnVuY3Rpb24gdXBkYXRlX3Nsb3Rfc3ByZWFkKHNsb3QsIHNsb3RfZGVmaW5pdGlvbiwgY3R4LCAkJHNjb3BlLCBkaXJ0eSwgZ2V0X3Nsb3RfY2hhbmdlc19mbiwgZ2V0X3Nsb3Rfc3ByZWFkX2NoYW5nZXNfZm4sIGdldF9zbG90X2NvbnRleHRfZm4pIHtcbiAgICBjb25zdCBzbG90X2NoYW5nZXMgPSBnZXRfc2xvdF9zcHJlYWRfY2hhbmdlc19mbihkaXJ0eSkgfCBnZXRfc2xvdF9jaGFuZ2VzKHNsb3RfZGVmaW5pdGlvbiwgJCRzY29wZSwgZGlydHksIGdldF9zbG90X2NoYW5nZXNfZm4pO1xuICAgIGlmIChzbG90X2NoYW5nZXMpIHtcbiAgICAgICAgY29uc3Qgc2xvdF9jb250ZXh0ID0gZ2V0X3Nsb3RfY29udGV4dChzbG90X2RlZmluaXRpb24sIGN0eCwgJCRzY29wZSwgZ2V0X3Nsb3RfY29udGV4dF9mbik7XG4gICAgICAgIHNsb3QucChzbG90X2NvbnRleHQsIHNsb3RfY2hhbmdlcyk7XG4gICAgfVxufVxuZnVuY3Rpb24gZXhjbHVkZV9pbnRlcm5hbF9wcm9wcyhwcm9wcykge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAoY29uc3QgayBpbiBwcm9wcylcbiAgICAgICAgaWYgKGtbMF0gIT09ICckJylcbiAgICAgICAgICAgIHJlc3VsdFtrXSA9IHByb3BzW2tdO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBjb21wdXRlX3Jlc3RfcHJvcHMocHJvcHMsIGtleXMpIHtcbiAgICBjb25zdCByZXN0ID0ge307XG4gICAga2V5cyA9IG5ldyBTZXQoa2V5cyk7XG4gICAgZm9yIChjb25zdCBrIGluIHByb3BzKVxuICAgICAgICBpZiAoIWtleXMuaGFzKGspICYmIGtbMF0gIT09ICckJylcbiAgICAgICAgICAgIHJlc3Rba10gPSBwcm9wc1trXTtcbiAgICByZXR1cm4gcmVzdDtcbn1cbmZ1bmN0aW9uIGNvbXB1dGVfc2xvdHMoc2xvdHMpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBzbG90cykge1xuICAgICAgICByZXN1bHRba2V5XSA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBvbmNlKGZuKSB7XG4gICAgbGV0IHJhbiA9IGZhbHNlO1xuICAgIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICBpZiAocmFuKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICByYW4gPSB0cnVlO1xuICAgICAgICBmbi5jYWxsKHRoaXMsIC4uLmFyZ3MpO1xuICAgIH07XG59XG5mdW5jdGlvbiBudWxsX3RvX2VtcHR5KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09IG51bGwgPyAnJyA6IHZhbHVlO1xufVxuZnVuY3Rpb24gc2V0X3N0b3JlX3ZhbHVlKHN0b3JlLCByZXQsIHZhbHVlID0gcmV0KSB7XG4gICAgc3RvcmUuc2V0KHZhbHVlKTtcbiAgICByZXR1cm4gcmV0O1xufVxuY29uc3QgaGFzX3Byb3AgPSAob2JqLCBwcm9wKSA9PiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbmZ1bmN0aW9uIGFjdGlvbl9kZXN0cm95ZXIoYWN0aW9uX3Jlc3VsdCkge1xuICAgIHJldHVybiBhY3Rpb25fcmVzdWx0ICYmIGlzX2Z1bmN0aW9uKGFjdGlvbl9yZXN1bHQuZGVzdHJveSkgPyBhY3Rpb25fcmVzdWx0LmRlc3Ryb3kgOiBub29wO1xufVxuXG5jb25zdCBpc19jbGllbnQgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJztcbmxldCBub3cgPSBpc19jbGllbnRcbiAgICA/ICgpID0+IHdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKVxuICAgIDogKCkgPT4gRGF0ZS5ub3coKTtcbmxldCByYWYgPSBpc19jbGllbnQgPyBjYiA9PiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoY2IpIDogbm9vcDtcbi8vIHVzZWQgaW50ZXJuYWxseSBmb3IgdGVzdGluZ1xuZnVuY3Rpb24gc2V0X25vdyhmbikge1xuICAgIG5vdyA9IGZuO1xufVxuZnVuY3Rpb24gc2V0X3JhZihmbikge1xuICAgIHJhZiA9IGZuO1xufVxuXG5jb25zdCB0YXNrcyA9IG5ldyBTZXQoKTtcbmZ1bmN0aW9uIHJ1bl90YXNrcyhub3cpIHtcbiAgICB0YXNrcy5mb3JFYWNoKHRhc2sgPT4ge1xuICAgICAgICBpZiAoIXRhc2suYyhub3cpKSB7XG4gICAgICAgICAgICB0YXNrcy5kZWxldGUodGFzayk7XG4gICAgICAgICAgICB0YXNrLmYoKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGlmICh0YXNrcy5zaXplICE9PSAwKVxuICAgICAgICByYWYocnVuX3Rhc2tzKTtcbn1cbi8qKlxuICogRm9yIHRlc3RpbmcgcHVycG9zZXMgb25seSFcbiAqL1xuZnVuY3Rpb24gY2xlYXJfbG9vcHMoKSB7XG4gICAgdGFza3MuY2xlYXIoKTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB0YXNrIHRoYXQgcnVucyBvbiBlYWNoIHJhZiBmcmFtZVxuICogdW50aWwgaXQgcmV0dXJucyBhIGZhbHN5IHZhbHVlIG9yIGlzIGFib3J0ZWRcbiAqL1xuZnVuY3Rpb24gbG9vcChjYWxsYmFjaykge1xuICAgIGxldCB0YXNrO1xuICAgIGlmICh0YXNrcy5zaXplID09PSAwKVxuICAgICAgICByYWYocnVuX3Rhc2tzKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBwcm9taXNlOiBuZXcgUHJvbWlzZShmdWxmaWxsID0+IHtcbiAgICAgICAgICAgIHRhc2tzLmFkZCh0YXNrID0geyBjOiBjYWxsYmFjaywgZjogZnVsZmlsbCB9KTtcbiAgICAgICAgfSksXG4gICAgICAgIGFib3J0KCkge1xuICAgICAgICAgICAgdGFza3MuZGVsZXRlKHRhc2spO1xuICAgICAgICB9XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kKHRhcmdldCwgbm9kZSkge1xuICAgIHRhcmdldC5hcHBlbmRDaGlsZChub2RlKTtcbn1cbmZ1bmN0aW9uIGluc2VydCh0YXJnZXQsIG5vZGUsIGFuY2hvcikge1xuICAgIHRhcmdldC5pbnNlcnRCZWZvcmUobm9kZSwgYW5jaG9yIHx8IG51bGwpO1xufVxuZnVuY3Rpb24gZGV0YWNoKG5vZGUpIHtcbiAgICBub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7XG59XG5mdW5jdGlvbiBkZXN0cm95X2VhY2goaXRlcmF0aW9ucywgZGV0YWNoaW5nKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVyYXRpb25zLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGlmIChpdGVyYXRpb25zW2ldKVxuICAgICAgICAgICAgaXRlcmF0aW9uc1tpXS5kKGRldGFjaGluZyk7XG4gICAgfVxufVxuZnVuY3Rpb24gZWxlbWVudChuYW1lKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmFtZSk7XG59XG5mdW5jdGlvbiBlbGVtZW50X2lzKG5hbWUsIGlzKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmFtZSwgeyBpcyB9KTtcbn1cbmZ1bmN0aW9uIG9iamVjdF93aXRob3V0X3Byb3BlcnRpZXMob2JqLCBleGNsdWRlKSB7XG4gICAgY29uc3QgdGFyZ2V0ID0ge307XG4gICAgZm9yIChjb25zdCBrIGluIG9iaikge1xuICAgICAgICBpZiAoaGFzX3Byb3Aob2JqLCBrKVxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgJiYgZXhjbHVkZS5pbmRleE9mKGspID09PSAtMSkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgdGFyZ2V0W2tdID0gb2JqW2tdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG59XG5mdW5jdGlvbiBzdmdfZWxlbWVudChuYW1lKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCBuYW1lKTtcbn1cbmZ1bmN0aW9uIHRleHQoZGF0YSkge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShkYXRhKTtcbn1cbmZ1bmN0aW9uIHNwYWNlKCkge1xuICAgIHJldHVybiB0ZXh0KCcgJyk7XG59XG5mdW5jdGlvbiBlbXB0eSgpIHtcbiAgICByZXR1cm4gdGV4dCgnJyk7XG59XG5mdW5jdGlvbiBsaXN0ZW4obm9kZSwgZXZlbnQsIGhhbmRsZXIsIG9wdGlvbnMpIHtcbiAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIsIG9wdGlvbnMpO1xuICAgIHJldHVybiAoKSA9PiBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIsIG9wdGlvbnMpO1xufVxuZnVuY3Rpb24gcHJldmVudF9kZWZhdWx0KGZuKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHJldHVybiBmbi5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICB9O1xufVxuZnVuY3Rpb24gc3RvcF9wcm9wYWdhdGlvbihmbikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgcmV0dXJuIGZuLmNhbGwodGhpcywgZXZlbnQpO1xuICAgIH07XG59XG5mdW5jdGlvbiBzZWxmKGZuKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmIChldmVudC50YXJnZXQgPT09IHRoaXMpXG4gICAgICAgICAgICBmbi5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICB9O1xufVxuZnVuY3Rpb24gYXR0cihub2RlLCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpXG4gICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZSk7XG4gICAgZWxzZSBpZiAobm9kZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKSAhPT0gdmFsdWUpXG4gICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWUpO1xufVxuZnVuY3Rpb24gc2V0X2F0dHJpYnV0ZXMobm9kZSwgYXR0cmlidXRlcykge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCBkZXNjcmlwdG9ycyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG5vZGUuX19wcm90b19fKTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgIGlmIChhdHRyaWJ1dGVzW2tleV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChrZXkgPT09ICdzdHlsZScpIHtcbiAgICAgICAgICAgIG5vZGUuc3R5bGUuY3NzVGV4dCA9IGF0dHJpYnV0ZXNba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChrZXkgPT09ICdfX3ZhbHVlJykge1xuICAgICAgICAgICAgbm9kZS52YWx1ZSA9IG5vZGVba2V5XSA9IGF0dHJpYnV0ZXNba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkZXNjcmlwdG9yc1trZXldICYmIGRlc2NyaXB0b3JzW2tleV0uc2V0KSB7XG4gICAgICAgICAgICBub2RlW2tleV0gPSBhdHRyaWJ1dGVzW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhdHRyKG5vZGUsIGtleSwgYXR0cmlidXRlc1trZXldKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHNldF9zdmdfYXR0cmlidXRlcyhub2RlLCBhdHRyaWJ1dGVzKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gYXR0cmlidXRlcykge1xuICAgICAgICBhdHRyKG5vZGUsIGtleSwgYXR0cmlidXRlc1trZXldKTtcbiAgICB9XG59XG5mdW5jdGlvbiBzZXRfY3VzdG9tX2VsZW1lbnRfZGF0YShub2RlLCBwcm9wLCB2YWx1ZSkge1xuICAgIGlmIChwcm9wIGluIG5vZGUpIHtcbiAgICAgICAgbm9kZVtwcm9wXSA9IHZhbHVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgYXR0cihub2RlLCBwcm9wLCB2YWx1ZSk7XG4gICAgfVxufVxuZnVuY3Rpb24geGxpbmtfYXR0cihub2RlLCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG4gICAgbm9kZS5zZXRBdHRyaWJ1dGVOUygnaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycsIGF0dHJpYnV0ZSwgdmFsdWUpO1xufVxuZnVuY3Rpb24gZ2V0X2JpbmRpbmdfZ3JvdXBfdmFsdWUoZ3JvdXAsIF9fdmFsdWUsIGNoZWNrZWQpIHtcbiAgICBjb25zdCB2YWx1ZSA9IG5ldyBTZXQoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdyb3VwLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGlmIChncm91cFtpXS5jaGVja2VkKVxuICAgICAgICAgICAgdmFsdWUuYWRkKGdyb3VwW2ldLl9fdmFsdWUpO1xuICAgIH1cbiAgICBpZiAoIWNoZWNrZWQpIHtcbiAgICAgICAgdmFsdWUuZGVsZXRlKF9fdmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gQXJyYXkuZnJvbSh2YWx1ZSk7XG59XG5mdW5jdGlvbiB0b19udW1iZXIodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09ICcnID8gbnVsbCA6ICt2YWx1ZTtcbn1cbmZ1bmN0aW9uIHRpbWVfcmFuZ2VzX3RvX2FycmF5KHJhbmdlcykge1xuICAgIGNvbnN0IGFycmF5ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgYXJyYXkucHVzaCh7IHN0YXJ0OiByYW5nZXMuc3RhcnQoaSksIGVuZDogcmFuZ2VzLmVuZChpKSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xufVxuZnVuY3Rpb24gY2hpbGRyZW4oZWxlbWVudCkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKGVsZW1lbnQuY2hpbGROb2Rlcyk7XG59XG5mdW5jdGlvbiBjbGFpbV9lbGVtZW50KG5vZGVzLCBuYW1lLCBhdHRyaWJ1dGVzLCBzdmcpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgICAgIGxldCBqID0gMDtcbiAgICAgICAgICAgIGNvbnN0IHJlbW92ZSA9IFtdO1xuICAgICAgICAgICAgd2hpbGUgKGogPCBub2RlLmF0dHJpYnV0ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXR0cmlidXRlID0gbm9kZS5hdHRyaWJ1dGVzW2orK107XG4gICAgICAgICAgICAgICAgaWYgKCFhdHRyaWJ1dGVzW2F0dHJpYnV0ZS5uYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICByZW1vdmUucHVzaChhdHRyaWJ1dGUubmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCByZW1vdmUubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShyZW1vdmVba10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5vZGVzLnNwbGljZShpLCAxKVswXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3ZnID8gc3ZnX2VsZW1lbnQobmFtZSkgOiBlbGVtZW50KG5hbWUpO1xufVxuZnVuY3Rpb24gY2xhaW1fdGV4dChub2RlcywgZGF0YSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgICAgbm9kZS5kYXRhID0gJycgKyBkYXRhO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGVzLnNwbGljZShpLCAxKVswXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGV4dChkYXRhKTtcbn1cbmZ1bmN0aW9uIGNsYWltX3NwYWNlKG5vZGVzKSB7XG4gICAgcmV0dXJuIGNsYWltX3RleHQobm9kZXMsICcgJyk7XG59XG5mdW5jdGlvbiBzZXRfZGF0YSh0ZXh0LCBkYXRhKSB7XG4gICAgZGF0YSA9ICcnICsgZGF0YTtcbiAgICBpZiAodGV4dC53aG9sZVRleHQgIT09IGRhdGEpXG4gICAgICAgIHRleHQuZGF0YSA9IGRhdGE7XG59XG5mdW5jdGlvbiBzZXRfaW5wdXRfdmFsdWUoaW5wdXQsIHZhbHVlKSB7XG4gICAgaW5wdXQudmFsdWUgPSB2YWx1ZSA9PSBudWxsID8gJycgOiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIHNldF9pbnB1dF90eXBlKGlucHV0LCB0eXBlKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaW5wdXQudHlwZSA9IHR5cGU7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG59XG5mdW5jdGlvbiBzZXRfc3R5bGUobm9kZSwga2V5LCB2YWx1ZSwgaW1wb3J0YW50KSB7XG4gICAgbm9kZS5zdHlsZS5zZXRQcm9wZXJ0eShrZXksIHZhbHVlLCBpbXBvcnRhbnQgPyAnaW1wb3J0YW50JyA6ICcnKTtcbn1cbmZ1bmN0aW9uIHNlbGVjdF9vcHRpb24oc2VsZWN0LCB2YWx1ZSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0Lm9wdGlvbnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gc2VsZWN0Lm9wdGlvbnNbaV07XG4gICAgICAgIGlmIChvcHRpb24uX192YWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBzZWxlY3Rfb3B0aW9ucyhzZWxlY3QsIHZhbHVlKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Qub3B0aW9ucy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBjb25zdCBvcHRpb24gPSBzZWxlY3Qub3B0aW9uc1tpXTtcbiAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gfnZhbHVlLmluZGV4T2Yob3B0aW9uLl9fdmFsdWUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNlbGVjdF92YWx1ZShzZWxlY3QpIHtcbiAgICBjb25zdCBzZWxlY3RlZF9vcHRpb24gPSBzZWxlY3QucXVlcnlTZWxlY3RvcignOmNoZWNrZWQnKSB8fCBzZWxlY3Qub3B0aW9uc1swXTtcbiAgICByZXR1cm4gc2VsZWN0ZWRfb3B0aW9uICYmIHNlbGVjdGVkX29wdGlvbi5fX3ZhbHVlO1xufVxuZnVuY3Rpb24gc2VsZWN0X211bHRpcGxlX3ZhbHVlKHNlbGVjdCkge1xuICAgIHJldHVybiBbXS5tYXAuY2FsbChzZWxlY3QucXVlcnlTZWxlY3RvckFsbCgnOmNoZWNrZWQnKSwgb3B0aW9uID0+IG9wdGlvbi5fX3ZhbHVlKTtcbn1cbi8vIHVuZm9ydHVuYXRlbHkgdGhpcyBjYW4ndCBiZSBhIGNvbnN0YW50IGFzIHRoYXQgd291bGRuJ3QgYmUgdHJlZS1zaGFrZWFibGVcbi8vIHNvIHdlIGNhY2hlIHRoZSByZXN1bHQgaW5zdGVhZFxubGV0IGNyb3Nzb3JpZ2luO1xuZnVuY3Rpb24gaXNfY3Jvc3NvcmlnaW4oKSB7XG4gICAgaWYgKGNyb3Nzb3JpZ2luID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY3Jvc3NvcmlnaW4gPSBmYWxzZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgdm9pZCB3aW5kb3cucGFyZW50LmRvY3VtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY3Jvc3NvcmlnaW4gPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjcm9zc29yaWdpbjtcbn1cbmZ1bmN0aW9uIGFkZF9yZXNpemVfbGlzdGVuZXIobm9kZSwgZm4pIHtcbiAgICBjb25zdCBjb21wdXRlZF9zdHlsZSA9IGdldENvbXB1dGVkU3R5bGUobm9kZSk7XG4gICAgaWYgKGNvbXB1dGVkX3N0eWxlLnBvc2l0aW9uID09PSAnc3RhdGljJykge1xuICAgICAgICBub2RlLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICB9XG4gICAgY29uc3QgaWZyYW1lID0gZWxlbWVudCgnaWZyYW1lJyk7XG4gICAgaWZyYW1lLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnZGlzcGxheTogYmxvY2s7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwOyBsZWZ0OiAwOyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlOyAnICtcbiAgICAgICAgJ292ZXJmbG93OiBoaWRkZW47IGJvcmRlcjogMDsgb3BhY2l0eTogMDsgcG9pbnRlci1ldmVudHM6IG5vbmU7IHotaW5kZXg6IC0xOycpO1xuICAgIGlmcmFtZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcbiAgICBpZnJhbWUudGFiSW5kZXggPSAtMTtcbiAgICBjb25zdCBjcm9zc29yaWdpbiA9IGlzX2Nyb3Nzb3JpZ2luKCk7XG4gICAgbGV0IHVuc3Vic2NyaWJlO1xuICAgIGlmIChjcm9zc29yaWdpbikge1xuICAgICAgICBpZnJhbWUuc3JjID0gXCJkYXRhOnRleHQvaHRtbCw8c2NyaXB0Pm9ucmVzaXplPWZ1bmN0aW9uKCl7cGFyZW50LnBvc3RNZXNzYWdlKDAsJyonKX08L3NjcmlwdD5cIjtcbiAgICAgICAgdW5zdWJzY3JpYmUgPSBsaXN0ZW4od2luZG93LCAnbWVzc2FnZScsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50LnNvdXJjZSA9PT0gaWZyYW1lLmNvbnRlbnRXaW5kb3cpXG4gICAgICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZnJhbWUuc3JjID0gJ2Fib3V0OmJsYW5rJztcbiAgICAgICAgaWZyYW1lLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgIHVuc3Vic2NyaWJlID0gbGlzdGVuKGlmcmFtZS5jb250ZW50V2luZG93LCAncmVzaXplJywgZm4pO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBhcHBlbmQobm9kZSwgaWZyYW1lKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBpZiAoY3Jvc3NvcmlnaW4pIHtcbiAgICAgICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodW5zdWJzY3JpYmUgJiYgaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZGV0YWNoKGlmcmFtZSk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHRvZ2dsZV9jbGFzcyhlbGVtZW50LCBuYW1lLCB0b2dnbGUpIHtcbiAgICBlbGVtZW50LmNsYXNzTGlzdFt0b2dnbGUgPyAnYWRkJyA6ICdyZW1vdmUnXShuYW1lKTtcbn1cbmZ1bmN0aW9uIGN1c3RvbV9ldmVudCh0eXBlLCBkZXRhaWwpIHtcbiAgICBjb25zdCBlID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7XG4gICAgZS5pbml0Q3VzdG9tRXZlbnQodHlwZSwgZmFsc2UsIGZhbHNlLCBkZXRhaWwpO1xuICAgIHJldHVybiBlO1xufVxuZnVuY3Rpb24gcXVlcnlfc2VsZWN0b3JfYWxsKHNlbGVjdG9yLCBwYXJlbnQgPSBkb2N1bWVudC5ib2R5KSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20ocGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpKTtcbn1cbmNsYXNzIEh0bWxUYWcge1xuICAgIGNvbnN0cnVjdG9yKGFuY2hvciA9IG51bGwpIHtcbiAgICAgICAgdGhpcy5hID0gYW5jaG9yO1xuICAgICAgICB0aGlzLmUgPSB0aGlzLm4gPSBudWxsO1xuICAgIH1cbiAgICBtKGh0bWwsIHRhcmdldCwgYW5jaG9yID0gbnVsbCkge1xuICAgICAgICBpZiAoIXRoaXMuZSkge1xuICAgICAgICAgICAgdGhpcy5lID0gZWxlbWVudCh0YXJnZXQubm9kZU5hbWUpO1xuICAgICAgICAgICAgdGhpcy50ID0gdGFyZ2V0O1xuICAgICAgICAgICAgdGhpcy5oKGh0bWwpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaShhbmNob3IpO1xuICAgIH1cbiAgICBoKGh0bWwpIHtcbiAgICAgICAgdGhpcy5lLmlubmVySFRNTCA9IGh0bWw7XG4gICAgICAgIHRoaXMubiA9IEFycmF5LmZyb20odGhpcy5lLmNoaWxkTm9kZXMpO1xuICAgIH1cbiAgICBpKGFuY2hvcikge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubi5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgaW5zZXJ0KHRoaXMudCwgdGhpcy5uW2ldLCBhbmNob3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHAoaHRtbCkge1xuICAgICAgICB0aGlzLmQoKTtcbiAgICAgICAgdGhpcy5oKGh0bWwpO1xuICAgICAgICB0aGlzLmkodGhpcy5hKTtcbiAgICB9XG4gICAgZCgpIHtcbiAgICAgICAgdGhpcy5uLmZvckVhY2goZGV0YWNoKTtcbiAgICB9XG59XG5mdW5jdGlvbiBhdHRyaWJ1dGVfdG9fb2JqZWN0KGF0dHJpYnV0ZXMpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZSBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgIHJlc3VsdFthdHRyaWJ1dGUubmFtZV0gPSBhdHRyaWJ1dGUudmFsdWU7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBnZXRfY3VzdG9tX2VsZW1lbnRzX3Nsb3RzKGVsZW1lbnQpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBlbGVtZW50LmNoaWxkTm9kZXMuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgICByZXN1bHRbbm9kZS5zbG90IHx8ICdkZWZhdWx0J10gPSB0cnVlO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmNvbnN0IGFjdGl2ZV9kb2NzID0gbmV3IFNldCgpO1xubGV0IGFjdGl2ZSA9IDA7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vZGFya3NreWFwcC9zdHJpbmctaGFzaC9ibG9iL21hc3Rlci9pbmRleC5qc1xuZnVuY3Rpb24gaGFzaChzdHIpIHtcbiAgICBsZXQgaGFzaCA9IDUzODE7XG4gICAgbGV0IGkgPSBzdHIubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pXG4gICAgICAgIGhhc2ggPSAoKGhhc2ggPDwgNSkgLSBoYXNoKSBeIHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgIHJldHVybiBoYXNoID4+PiAwO1xufVxuZnVuY3Rpb24gY3JlYXRlX3J1bGUobm9kZSwgYSwgYiwgZHVyYXRpb24sIGRlbGF5LCBlYXNlLCBmbiwgdWlkID0gMCkge1xuICAgIGNvbnN0IHN0ZXAgPSAxNi42NjYgLyBkdXJhdGlvbjtcbiAgICBsZXQga2V5ZnJhbWVzID0gJ3tcXG4nO1xuICAgIGZvciAobGV0IHAgPSAwOyBwIDw9IDE7IHAgKz0gc3RlcCkge1xuICAgICAgICBjb25zdCB0ID0gYSArIChiIC0gYSkgKiBlYXNlKHApO1xuICAgICAgICBrZXlmcmFtZXMgKz0gcCAqIDEwMCArIGAleyR7Zm4odCwgMSAtIHQpfX1cXG5gO1xuICAgIH1cbiAgICBjb25zdCBydWxlID0ga2V5ZnJhbWVzICsgYDEwMCUgeyR7Zm4oYiwgMSAtIGIpfX1cXG59YDtcbiAgICBjb25zdCBuYW1lID0gYF9fc3ZlbHRlXyR7aGFzaChydWxlKX1fJHt1aWR9YDtcbiAgICBjb25zdCBkb2MgPSBub2RlLm93bmVyRG9jdW1lbnQ7XG4gICAgYWN0aXZlX2RvY3MuYWRkKGRvYyk7XG4gICAgY29uc3Qgc3R5bGVzaGVldCA9IGRvYy5fX3N2ZWx0ZV9zdHlsZXNoZWV0IHx8IChkb2MuX19zdmVsdGVfc3R5bGVzaGVldCA9IGRvYy5oZWFkLmFwcGVuZENoaWxkKGVsZW1lbnQoJ3N0eWxlJykpLnNoZWV0KTtcbiAgICBjb25zdCBjdXJyZW50X3J1bGVzID0gZG9jLl9fc3ZlbHRlX3J1bGVzIHx8IChkb2MuX19zdmVsdGVfcnVsZXMgPSB7fSk7XG4gICAgaWYgKCFjdXJyZW50X3J1bGVzW25hbWVdKSB7XG4gICAgICAgIGN1cnJlbnRfcnVsZXNbbmFtZV0gPSB0cnVlO1xuICAgICAgICBzdHlsZXNoZWV0Lmluc2VydFJ1bGUoYEBrZXlmcmFtZXMgJHtuYW1lfSAke3J1bGV9YCwgc3R5bGVzaGVldC5jc3NSdWxlcy5sZW5ndGgpO1xuICAgIH1cbiAgICBjb25zdCBhbmltYXRpb24gPSBub2RlLnN0eWxlLmFuaW1hdGlvbiB8fCAnJztcbiAgICBub2RlLnN0eWxlLmFuaW1hdGlvbiA9IGAke2FuaW1hdGlvbiA/IGAke2FuaW1hdGlvbn0sIGAgOiAnJ30ke25hbWV9ICR7ZHVyYXRpb259bXMgbGluZWFyICR7ZGVsYXl9bXMgMSBib3RoYDtcbiAgICBhY3RpdmUgKz0gMTtcbiAgICByZXR1cm4gbmFtZTtcbn1cbmZ1bmN0aW9uIGRlbGV0ZV9ydWxlKG5vZGUsIG5hbWUpIHtcbiAgICBjb25zdCBwcmV2aW91cyA9IChub2RlLnN0eWxlLmFuaW1hdGlvbiB8fCAnJykuc3BsaXQoJywgJyk7XG4gICAgY29uc3QgbmV4dCA9IHByZXZpb3VzLmZpbHRlcihuYW1lXG4gICAgICAgID8gYW5pbSA9PiBhbmltLmluZGV4T2YobmFtZSkgPCAwIC8vIHJlbW92ZSBzcGVjaWZpYyBhbmltYXRpb25cbiAgICAgICAgOiBhbmltID0+IGFuaW0uaW5kZXhPZignX19zdmVsdGUnKSA9PT0gLTEgLy8gcmVtb3ZlIGFsbCBTdmVsdGUgYW5pbWF0aW9uc1xuICAgICk7XG4gICAgY29uc3QgZGVsZXRlZCA9IHByZXZpb3VzLmxlbmd0aCAtIG5leHQubGVuZ3RoO1xuICAgIGlmIChkZWxldGVkKSB7XG4gICAgICAgIG5vZGUuc3R5bGUuYW5pbWF0aW9uID0gbmV4dC5qb2luKCcsICcpO1xuICAgICAgICBhY3RpdmUgLT0gZGVsZXRlZDtcbiAgICAgICAgaWYgKCFhY3RpdmUpXG4gICAgICAgICAgICBjbGVhcl9ydWxlcygpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNsZWFyX3J1bGVzKCkge1xuICAgIHJhZigoKSA9PiB7XG4gICAgICAgIGlmIChhY3RpdmUpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGFjdGl2ZV9kb2NzLmZvckVhY2goZG9jID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlc2hlZXQgPSBkb2MuX19zdmVsdGVfc3R5bGVzaGVldDtcbiAgICAgICAgICAgIGxldCBpID0gc3R5bGVzaGVldC5jc3NSdWxlcy5sZW5ndGg7XG4gICAgICAgICAgICB3aGlsZSAoaS0tKVxuICAgICAgICAgICAgICAgIHN0eWxlc2hlZXQuZGVsZXRlUnVsZShpKTtcbiAgICAgICAgICAgIGRvYy5fX3N2ZWx0ZV9ydWxlcyA9IHt9O1xuICAgICAgICB9KTtcbiAgICAgICAgYWN0aXZlX2RvY3MuY2xlYXIoKTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlX2FuaW1hdGlvbihub2RlLCBmcm9tLCBmbiwgcGFyYW1zKSB7XG4gICAgaWYgKCFmcm9tKVxuICAgICAgICByZXR1cm4gbm9vcDtcbiAgICBjb25zdCB0byA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgaWYgKGZyb20ubGVmdCA9PT0gdG8ubGVmdCAmJiBmcm9tLnJpZ2h0ID09PSB0by5yaWdodCAmJiBmcm9tLnRvcCA9PT0gdG8udG9wICYmIGZyb20uYm90dG9tID09PSB0by5ib3R0b20pXG4gICAgICAgIHJldHVybiBub29wO1xuICAgIGNvbnN0IHsgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDMwMCwgZWFzaW5nID0gaWRlbnRpdHksIFxuICAgIC8vIEB0cy1pZ25vcmUgdG9kbzogc2hvdWxkIHRoaXMgYmUgc2VwYXJhdGVkIGZyb20gZGVzdHJ1Y3R1cmluZz8gT3Igc3RhcnQvZW5kIGFkZGVkIHRvIHB1YmxpYyBhcGkgYW5kIGRvY3VtZW50YXRpb24/XG4gICAgc3RhcnQ6IHN0YXJ0X3RpbWUgPSBub3coKSArIGRlbGF5LCBcbiAgICAvLyBAdHMtaWdub3JlIHRvZG86XG4gICAgZW5kID0gc3RhcnRfdGltZSArIGR1cmF0aW9uLCB0aWNrID0gbm9vcCwgY3NzIH0gPSBmbihub2RlLCB7IGZyb20sIHRvIH0sIHBhcmFtcyk7XG4gICAgbGV0IHJ1bm5pbmcgPSB0cnVlO1xuICAgIGxldCBzdGFydGVkID0gZmFsc2U7XG4gICAgbGV0IG5hbWU7XG4gICAgZnVuY3Rpb24gc3RhcnQoKSB7XG4gICAgICAgIGlmIChjc3MpIHtcbiAgICAgICAgICAgIG5hbWUgPSBjcmVhdGVfcnVsZShub2RlLCAwLCAxLCBkdXJhdGlvbiwgZGVsYXksIGVhc2luZywgY3NzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRlbGF5KSB7XG4gICAgICAgICAgICBzdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBzdG9wKCkge1xuICAgICAgICBpZiAoY3NzKVxuICAgICAgICAgICAgZGVsZXRlX3J1bGUobm9kZSwgbmFtZSk7XG4gICAgICAgIHJ1bm5pbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgbG9vcChub3cgPT4ge1xuICAgICAgICBpZiAoIXN0YXJ0ZWQgJiYgbm93ID49IHN0YXJ0X3RpbWUpIHtcbiAgICAgICAgICAgIHN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFydGVkICYmIG5vdyA+PSBlbmQpIHtcbiAgICAgICAgICAgIHRpY2soMSwgMCk7XG4gICAgICAgICAgICBzdG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFydW5uaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXJ0ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHAgPSBub3cgLSBzdGFydF90aW1lO1xuICAgICAgICAgICAgY29uc3QgdCA9IDAgKyAxICogZWFzaW5nKHAgLyBkdXJhdGlvbik7XG4gICAgICAgICAgICB0aWNrKHQsIDEgLSB0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgICBzdGFydCgpO1xuICAgIHRpY2soMCwgMSk7XG4gICAgcmV0dXJuIHN0b3A7XG59XG5mdW5jdGlvbiBmaXhfcG9zaXRpb24obm9kZSkge1xuICAgIGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShub2RlKTtcbiAgICBpZiAoc3R5bGUucG9zaXRpb24gIT09ICdhYnNvbHV0ZScgJiYgc3R5bGUucG9zaXRpb24gIT09ICdmaXhlZCcpIHtcbiAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBzdHlsZTtcbiAgICAgICAgY29uc3QgYSA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIG5vZGUuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICBub2RlLnN0eWxlLndpZHRoID0gd2lkdGg7XG4gICAgICAgIG5vZGUuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICBhZGRfdHJhbnNmb3JtKG5vZGUsIGEpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFkZF90cmFuc2Zvcm0obm9kZSwgYSkge1xuICAgIGNvbnN0IGIgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGlmIChhLmxlZnQgIT09IGIubGVmdCB8fCBhLnRvcCAhPT0gYi50b3ApIHtcbiAgICAgICAgY29uc3Qgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKG5vZGUpO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBzdHlsZS50cmFuc2Zvcm0gPT09ICdub25lJyA/ICcnIDogc3R5bGUudHJhbnNmb3JtO1xuICAgICAgICBub2RlLnN0eWxlLnRyYW5zZm9ybSA9IGAke3RyYW5zZm9ybX0gdHJhbnNsYXRlKCR7YS5sZWZ0IC0gYi5sZWZ0fXB4LCAke2EudG9wIC0gYi50b3B9cHgpYDtcbiAgICB9XG59XG5cbmxldCBjdXJyZW50X2NvbXBvbmVudDtcbmZ1bmN0aW9uIHNldF9jdXJyZW50X2NvbXBvbmVudChjb21wb25lbnQpIHtcbiAgICBjdXJyZW50X2NvbXBvbmVudCA9IGNvbXBvbmVudDtcbn1cbmZ1bmN0aW9uIGdldF9jdXJyZW50X2NvbXBvbmVudCgpIHtcbiAgICBpZiAoIWN1cnJlbnRfY29tcG9uZW50KVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Z1bmN0aW9uIGNhbGxlZCBvdXRzaWRlIGNvbXBvbmVudCBpbml0aWFsaXphdGlvbicpO1xuICAgIHJldHVybiBjdXJyZW50X2NvbXBvbmVudDtcbn1cbmZ1bmN0aW9uIGJlZm9yZVVwZGF0ZShmbikge1xuICAgIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLmJlZm9yZV91cGRhdGUucHVzaChmbik7XG59XG5mdW5jdGlvbiBvbk1vdW50KGZuKSB7XG4gICAgZ2V0X2N1cnJlbnRfY29tcG9uZW50KCkuJCQub25fbW91bnQucHVzaChmbik7XG59XG5mdW5jdGlvbiBhZnRlclVwZGF0ZShmbikge1xuICAgIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLmFmdGVyX3VwZGF0ZS5wdXNoKGZuKTtcbn1cbmZ1bmN0aW9uIG9uRGVzdHJveShmbikge1xuICAgIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLm9uX2Rlc3Ryb3kucHVzaChmbik7XG59XG5mdW5jdGlvbiBjcmVhdGVFdmVudERpc3BhdGNoZXIoKSB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gZ2V0X2N1cnJlbnRfY29tcG9uZW50KCk7XG4gICAgcmV0dXJuICh0eXBlLCBkZXRhaWwpID0+IHtcbiAgICAgICAgY29uc3QgY2FsbGJhY2tzID0gY29tcG9uZW50LiQkLmNhbGxiYWNrc1t0eXBlXTtcbiAgICAgICAgaWYgKGNhbGxiYWNrcykge1xuICAgICAgICAgICAgLy8gVE9ETyBhcmUgdGhlcmUgc2l0dWF0aW9ucyB3aGVyZSBldmVudHMgY291bGQgYmUgZGlzcGF0Y2hlZFxuICAgICAgICAgICAgLy8gaW4gYSBzZXJ2ZXIgKG5vbi1ET00pIGVudmlyb25tZW50P1xuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBjdXN0b21fZXZlbnQodHlwZSwgZGV0YWlsKTtcbiAgICAgICAgICAgIGNhbGxiYWNrcy5zbGljZSgpLmZvckVhY2goZm4gPT4ge1xuICAgICAgICAgICAgICAgIGZuLmNhbGwoY29tcG9uZW50LCBldmVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG59XG5mdW5jdGlvbiBzZXRDb250ZXh0KGtleSwgY29udGV4dCkge1xuICAgIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLmNvbnRleHQuc2V0KGtleSwgY29udGV4dCk7XG59XG5mdW5jdGlvbiBnZXRDb250ZXh0KGtleSkge1xuICAgIHJldHVybiBnZXRfY3VycmVudF9jb21wb25lbnQoKS4kJC5jb250ZXh0LmdldChrZXkpO1xufVxuZnVuY3Rpb24gaGFzQ29udGV4dChrZXkpIHtcbiAgICByZXR1cm4gZ2V0X2N1cnJlbnRfY29tcG9uZW50KCkuJCQuY29udGV4dC5oYXMoa2V5KTtcbn1cbi8vIFRPRE8gZmlndXJlIG91dCBpZiB3ZSBzdGlsbCB3YW50IHRvIHN1cHBvcnRcbi8vIHNob3J0aGFuZCBldmVudHMsIG9yIGlmIHdlIHdhbnQgdG8gaW1wbGVtZW50XG4vLyBhIHJlYWwgYnViYmxpbmcgbWVjaGFuaXNtXG5mdW5jdGlvbiBidWJibGUoY29tcG9uZW50LCBldmVudCkge1xuICAgIGNvbnN0IGNhbGxiYWNrcyA9IGNvbXBvbmVudC4kJC5jYWxsYmFja3NbZXZlbnQudHlwZV07XG4gICAgaWYgKGNhbGxiYWNrcykge1xuICAgICAgICBjYWxsYmFja3Muc2xpY2UoKS5mb3JFYWNoKGZuID0+IGZuKGV2ZW50KSk7XG4gICAgfVxufVxuXG5jb25zdCBkaXJ0eV9jb21wb25lbnRzID0gW107XG5jb25zdCBpbnRyb3MgPSB7IGVuYWJsZWQ6IGZhbHNlIH07XG5jb25zdCBiaW5kaW5nX2NhbGxiYWNrcyA9IFtdO1xuY29uc3QgcmVuZGVyX2NhbGxiYWNrcyA9IFtdO1xuY29uc3QgZmx1c2hfY2FsbGJhY2tzID0gW107XG5jb25zdCByZXNvbHZlZF9wcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5sZXQgdXBkYXRlX3NjaGVkdWxlZCA9IGZhbHNlO1xuZnVuY3Rpb24gc2NoZWR1bGVfdXBkYXRlKCkge1xuICAgIGlmICghdXBkYXRlX3NjaGVkdWxlZCkge1xuICAgICAgICB1cGRhdGVfc2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgICAgcmVzb2x2ZWRfcHJvbWlzZS50aGVuKGZsdXNoKTtcbiAgICB9XG59XG5mdW5jdGlvbiB0aWNrKCkge1xuICAgIHNjaGVkdWxlX3VwZGF0ZSgpO1xuICAgIHJldHVybiByZXNvbHZlZF9wcm9taXNlO1xufVxuZnVuY3Rpb24gYWRkX3JlbmRlcl9jYWxsYmFjayhmbikge1xuICAgIHJlbmRlcl9jYWxsYmFja3MucHVzaChmbik7XG59XG5mdW5jdGlvbiBhZGRfZmx1c2hfY2FsbGJhY2soZm4pIHtcbiAgICBmbHVzaF9jYWxsYmFja3MucHVzaChmbik7XG59XG5sZXQgZmx1c2hpbmcgPSBmYWxzZTtcbmNvbnN0IHNlZW5fY2FsbGJhY2tzID0gbmV3IFNldCgpO1xuZnVuY3Rpb24gZmx1c2goKSB7XG4gICAgaWYgKGZsdXNoaW5nKVxuICAgICAgICByZXR1cm47XG4gICAgZmx1c2hpbmcgPSB0cnVlO1xuICAgIGRvIHtcbiAgICAgICAgLy8gZmlyc3QsIGNhbGwgYmVmb3JlVXBkYXRlIGZ1bmN0aW9uc1xuICAgICAgICAvLyBhbmQgdXBkYXRlIGNvbXBvbmVudHNcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaXJ0eV9jb21wb25lbnRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSBkaXJ0eV9jb21wb25lbnRzW2ldO1xuICAgICAgICAgICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KGNvbXBvbmVudCk7XG4gICAgICAgICAgICB1cGRhdGUoY29tcG9uZW50LiQkKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRfY3VycmVudF9jb21wb25lbnQobnVsbCk7XG4gICAgICAgIGRpcnR5X2NvbXBvbmVudHMubGVuZ3RoID0gMDtcbiAgICAgICAgd2hpbGUgKGJpbmRpbmdfY2FsbGJhY2tzLmxlbmd0aClcbiAgICAgICAgICAgIGJpbmRpbmdfY2FsbGJhY2tzLnBvcCgpKCk7XG4gICAgICAgIC8vIHRoZW4sIG9uY2UgY29tcG9uZW50cyBhcmUgdXBkYXRlZCwgY2FsbFxuICAgICAgICAvLyBhZnRlclVwZGF0ZSBmdW5jdGlvbnMuIFRoaXMgbWF5IGNhdXNlXG4gICAgICAgIC8vIHN1YnNlcXVlbnQgdXBkYXRlcy4uLlxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlbmRlcl9jYWxsYmFja3MubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gcmVuZGVyX2NhbGxiYWNrc1tpXTtcbiAgICAgICAgICAgIGlmICghc2Vlbl9jYWxsYmFja3MuaGFzKGNhbGxiYWNrKSkge1xuICAgICAgICAgICAgICAgIC8vIC4uLnNvIGd1YXJkIGFnYWluc3QgaW5maW5pdGUgbG9vcHNcbiAgICAgICAgICAgICAgICBzZWVuX2NhbGxiYWNrcy5hZGQoY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyX2NhbGxiYWNrcy5sZW5ndGggPSAwO1xuICAgIH0gd2hpbGUgKGRpcnR5X2NvbXBvbmVudHMubGVuZ3RoKTtcbiAgICB3aGlsZSAoZmx1c2hfY2FsbGJhY2tzLmxlbmd0aCkge1xuICAgICAgICBmbHVzaF9jYWxsYmFja3MucG9wKCkoKTtcbiAgICB9XG4gICAgdXBkYXRlX3NjaGVkdWxlZCA9IGZhbHNlO1xuICAgIGZsdXNoaW5nID0gZmFsc2U7XG4gICAgc2Vlbl9jYWxsYmFja3MuY2xlYXIoKTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZSgkJCkge1xuICAgIGlmICgkJC5mcmFnbWVudCAhPT0gbnVsbCkge1xuICAgICAgICAkJC51cGRhdGUoKTtcbiAgICAgICAgcnVuX2FsbCgkJC5iZWZvcmVfdXBkYXRlKTtcbiAgICAgICAgY29uc3QgZGlydHkgPSAkJC5kaXJ0eTtcbiAgICAgICAgJCQuZGlydHkgPSBbLTFdO1xuICAgICAgICAkJC5mcmFnbWVudCAmJiAkJC5mcmFnbWVudC5wKCQkLmN0eCwgZGlydHkpO1xuICAgICAgICAkJC5hZnRlcl91cGRhdGUuZm9yRWFjaChhZGRfcmVuZGVyX2NhbGxiYWNrKTtcbiAgICB9XG59XG5cbmxldCBwcm9taXNlO1xuZnVuY3Rpb24gd2FpdCgpIHtcbiAgICBpZiAoIXByb21pc2UpIHtcbiAgICAgICAgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICBwcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgcHJvbWlzZSA9IG51bGw7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcHJvbWlzZTtcbn1cbmZ1bmN0aW9uIGRpc3BhdGNoKG5vZGUsIGRpcmVjdGlvbiwga2luZCkge1xuICAgIG5vZGUuZGlzcGF0Y2hFdmVudChjdXN0b21fZXZlbnQoYCR7ZGlyZWN0aW9uID8gJ2ludHJvJyA6ICdvdXRybyd9JHtraW5kfWApKTtcbn1cbmNvbnN0IG91dHJvaW5nID0gbmV3IFNldCgpO1xubGV0IG91dHJvcztcbmZ1bmN0aW9uIGdyb3VwX291dHJvcygpIHtcbiAgICBvdXRyb3MgPSB7XG4gICAgICAgIHI6IDAsXG4gICAgICAgIGM6IFtdLFxuICAgICAgICBwOiBvdXRyb3MgLy8gcGFyZW50IGdyb3VwXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNoZWNrX291dHJvcygpIHtcbiAgICBpZiAoIW91dHJvcy5yKSB7XG4gICAgICAgIHJ1bl9hbGwob3V0cm9zLmMpO1xuICAgIH1cbiAgICBvdXRyb3MgPSBvdXRyb3MucDtcbn1cbmZ1bmN0aW9uIHRyYW5zaXRpb25faW4oYmxvY2ssIGxvY2FsKSB7XG4gICAgaWYgKGJsb2NrICYmIGJsb2NrLmkpIHtcbiAgICAgICAgb3V0cm9pbmcuZGVsZXRlKGJsb2NrKTtcbiAgICAgICAgYmxvY2suaShsb2NhbCk7XG4gICAgfVxufVxuZnVuY3Rpb24gdHJhbnNpdGlvbl9vdXQoYmxvY2ssIGxvY2FsLCBkZXRhY2gsIGNhbGxiYWNrKSB7XG4gICAgaWYgKGJsb2NrICYmIGJsb2NrLm8pIHtcbiAgICAgICAgaWYgKG91dHJvaW5nLmhhcyhibG9jaykpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIG91dHJvaW5nLmFkZChibG9jayk7XG4gICAgICAgIG91dHJvcy5jLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgb3V0cm9pbmcuZGVsZXRlKGJsb2NrKTtcbiAgICAgICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIGlmIChkZXRhY2gpXG4gICAgICAgICAgICAgICAgICAgIGJsb2NrLmQoMSk7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGJsb2NrLm8obG9jYWwpO1xuICAgIH1cbn1cbmNvbnN0IG51bGxfdHJhbnNpdGlvbiA9IHsgZHVyYXRpb246IDAgfTtcbmZ1bmN0aW9uIGNyZWF0ZV9pbl90cmFuc2l0aW9uKG5vZGUsIGZuLCBwYXJhbXMpIHtcbiAgICBsZXQgY29uZmlnID0gZm4obm9kZSwgcGFyYW1zKTtcbiAgICBsZXQgcnVubmluZyA9IGZhbHNlO1xuICAgIGxldCBhbmltYXRpb25fbmFtZTtcbiAgICBsZXQgdGFzaztcbiAgICBsZXQgdWlkID0gMDtcbiAgICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgICAgICBpZiAoYW5pbWF0aW9uX25hbWUpXG4gICAgICAgICAgICBkZWxldGVfcnVsZShub2RlLCBhbmltYXRpb25fbmFtZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdvKCkge1xuICAgICAgICBjb25zdCB7IGRlbGF5ID0gMCwgZHVyYXRpb24gPSAzMDAsIGVhc2luZyA9IGlkZW50aXR5LCB0aWNrID0gbm9vcCwgY3NzIH0gPSBjb25maWcgfHwgbnVsbF90cmFuc2l0aW9uO1xuICAgICAgICBpZiAoY3NzKVxuICAgICAgICAgICAgYW5pbWF0aW9uX25hbWUgPSBjcmVhdGVfcnVsZShub2RlLCAwLCAxLCBkdXJhdGlvbiwgZGVsYXksIGVhc2luZywgY3NzLCB1aWQrKyk7XG4gICAgICAgIHRpY2soMCwgMSk7XG4gICAgICAgIGNvbnN0IHN0YXJ0X3RpbWUgPSBub3coKSArIGRlbGF5O1xuICAgICAgICBjb25zdCBlbmRfdGltZSA9IHN0YXJ0X3RpbWUgKyBkdXJhdGlvbjtcbiAgICAgICAgaWYgKHRhc2spXG4gICAgICAgICAgICB0YXNrLmFib3J0KCk7XG4gICAgICAgIHJ1bm5pbmcgPSB0cnVlO1xuICAgICAgICBhZGRfcmVuZGVyX2NhbGxiYWNrKCgpID0+IGRpc3BhdGNoKG5vZGUsIHRydWUsICdzdGFydCcpKTtcbiAgICAgICAgdGFzayA9IGxvb3Aobm93ID0+IHtcbiAgICAgICAgICAgIGlmIChydW5uaW5nKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vdyA+PSBlbmRfdGltZSkge1xuICAgICAgICAgICAgICAgICAgICB0aWNrKDEsIDApO1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChub2RlLCB0cnVlLCAnZW5kJyk7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5vdyA+PSBzdGFydF90aW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBlYXNpbmcoKG5vdyAtIHN0YXJ0X3RpbWUpIC8gZHVyYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICB0aWNrKHQsIDEgLSB0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcnVubmluZztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGxldCBzdGFydGVkID0gZmFsc2U7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnQoKSB7XG4gICAgICAgICAgICBpZiAoc3RhcnRlZClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBkZWxldGVfcnVsZShub2RlKTtcbiAgICAgICAgICAgIGlmIChpc19mdW5jdGlvbihjb25maWcpKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnID0gY29uZmlnKCk7XG4gICAgICAgICAgICAgICAgd2FpdCgpLnRoZW4oZ28pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZ28oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgaW52YWxpZGF0ZSgpIHtcbiAgICAgICAgICAgIHN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgfSxcbiAgICAgICAgZW5kKCkge1xuICAgICAgICAgICAgaWYgKHJ1bm5pbmcpIHtcbiAgICAgICAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgICAgICAgICAgcnVubmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZV9vdXRfdHJhbnNpdGlvbihub2RlLCBmbiwgcGFyYW1zKSB7XG4gICAgbGV0IGNvbmZpZyA9IGZuKG5vZGUsIHBhcmFtcyk7XG4gICAgbGV0IHJ1bm5pbmcgPSB0cnVlO1xuICAgIGxldCBhbmltYXRpb25fbmFtZTtcbiAgICBjb25zdCBncm91cCA9IG91dHJvcztcbiAgICBncm91cC5yICs9IDE7XG4gICAgZnVuY3Rpb24gZ28oKSB7XG4gICAgICAgIGNvbnN0IHsgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDMwMCwgZWFzaW5nID0gaWRlbnRpdHksIHRpY2sgPSBub29wLCBjc3MgfSA9IGNvbmZpZyB8fCBudWxsX3RyYW5zaXRpb247XG4gICAgICAgIGlmIChjc3MpXG4gICAgICAgICAgICBhbmltYXRpb25fbmFtZSA9IGNyZWF0ZV9ydWxlKG5vZGUsIDEsIDAsIGR1cmF0aW9uLCBkZWxheSwgZWFzaW5nLCBjc3MpO1xuICAgICAgICBjb25zdCBzdGFydF90aW1lID0gbm93KCkgKyBkZWxheTtcbiAgICAgICAgY29uc3QgZW5kX3RpbWUgPSBzdGFydF90aW1lICsgZHVyYXRpb247XG4gICAgICAgIGFkZF9yZW5kZXJfY2FsbGJhY2soKCkgPT4gZGlzcGF0Y2gobm9kZSwgZmFsc2UsICdzdGFydCcpKTtcbiAgICAgICAgbG9vcChub3cgPT4ge1xuICAgICAgICAgICAgaWYgKHJ1bm5pbmcpIHtcbiAgICAgICAgICAgICAgICBpZiAobm93ID49IGVuZF90aW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRpY2soMCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKG5vZGUsIGZhbHNlLCAnZW5kJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghLS1ncm91cC5yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHdpbGwgcmVzdWx0IGluIGBlbmQoKWAgYmVpbmcgY2FsbGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gd2UgZG9uJ3QgbmVlZCB0byBjbGVhbiB1cCBoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgICBydW5fYWxsKGdyb3VwLmMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5vdyA+PSBzdGFydF90aW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBlYXNpbmcoKG5vdyAtIHN0YXJ0X3RpbWUpIC8gZHVyYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICB0aWNrKDEgLSB0LCB0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcnVubmluZztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChpc19mdW5jdGlvbihjb25maWcpKSB7XG4gICAgICAgIHdhaXQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbmZpZyA9IGNvbmZpZygpO1xuICAgICAgICAgICAgZ28oKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBnbygpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBlbmQocmVzZXQpIHtcbiAgICAgICAgICAgIGlmIChyZXNldCAmJiBjb25maWcudGljaykge1xuICAgICAgICAgICAgICAgIGNvbmZpZy50aWNrKDEsIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJ1bm5pbmcpIHtcbiAgICAgICAgICAgICAgICBpZiAoYW5pbWF0aW9uX25hbWUpXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZV9ydWxlKG5vZGUsIGFuaW1hdGlvbl9uYW1lKTtcbiAgICAgICAgICAgICAgICBydW5uaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlX2JpZGlyZWN0aW9uYWxfdHJhbnNpdGlvbihub2RlLCBmbiwgcGFyYW1zLCBpbnRybykge1xuICAgIGxldCBjb25maWcgPSBmbihub2RlLCBwYXJhbXMpO1xuICAgIGxldCB0ID0gaW50cm8gPyAwIDogMTtcbiAgICBsZXQgcnVubmluZ19wcm9ncmFtID0gbnVsbDtcbiAgICBsZXQgcGVuZGluZ19wcm9ncmFtID0gbnVsbDtcbiAgICBsZXQgYW5pbWF0aW9uX25hbWUgPSBudWxsO1xuICAgIGZ1bmN0aW9uIGNsZWFyX2FuaW1hdGlvbigpIHtcbiAgICAgICAgaWYgKGFuaW1hdGlvbl9uYW1lKVxuICAgICAgICAgICAgZGVsZXRlX3J1bGUobm9kZSwgYW5pbWF0aW9uX25hbWUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpbml0KHByb2dyYW0sIGR1cmF0aW9uKSB7XG4gICAgICAgIGNvbnN0IGQgPSBwcm9ncmFtLmIgLSB0O1xuICAgICAgICBkdXJhdGlvbiAqPSBNYXRoLmFicyhkKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGE6IHQsXG4gICAgICAgICAgICBiOiBwcm9ncmFtLmIsXG4gICAgICAgICAgICBkLFxuICAgICAgICAgICAgZHVyYXRpb24sXG4gICAgICAgICAgICBzdGFydDogcHJvZ3JhbS5zdGFydCxcbiAgICAgICAgICAgIGVuZDogcHJvZ3JhbS5zdGFydCArIGR1cmF0aW9uLFxuICAgICAgICAgICAgZ3JvdXA6IHByb2dyYW0uZ3JvdXBcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ28oYikge1xuICAgICAgICBjb25zdCB7IGRlbGF5ID0gMCwgZHVyYXRpb24gPSAzMDAsIGVhc2luZyA9IGlkZW50aXR5LCB0aWNrID0gbm9vcCwgY3NzIH0gPSBjb25maWcgfHwgbnVsbF90cmFuc2l0aW9uO1xuICAgICAgICBjb25zdCBwcm9ncmFtID0ge1xuICAgICAgICAgICAgc3RhcnQ6IG5vdygpICsgZGVsYXksXG4gICAgICAgICAgICBiXG4gICAgICAgIH07XG4gICAgICAgIGlmICghYikge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSB0b2RvOiBpbXByb3ZlIHR5cGluZ3NcbiAgICAgICAgICAgIHByb2dyYW0uZ3JvdXAgPSBvdXRyb3M7XG4gICAgICAgICAgICBvdXRyb3MuciArPSAxO1xuICAgICAgICB9XG4gICAgICAgIGlmIChydW5uaW5nX3Byb2dyYW0gfHwgcGVuZGluZ19wcm9ncmFtKSB7XG4gICAgICAgICAgICBwZW5kaW5nX3Byb2dyYW0gPSBwcm9ncmFtO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhbiBpbnRybywgYW5kIHRoZXJlJ3MgYSBkZWxheSwgd2UgbmVlZCB0byBkb1xuICAgICAgICAgICAgLy8gYW4gaW5pdGlhbCB0aWNrIGFuZC9vciBhcHBseSBDU1MgYW5pbWF0aW9uIGltbWVkaWF0ZWx5XG4gICAgICAgICAgICBpZiAoY3NzKSB7XG4gICAgICAgICAgICAgICAgY2xlYXJfYW5pbWF0aW9uKCk7XG4gICAgICAgICAgICAgICAgYW5pbWF0aW9uX25hbWUgPSBjcmVhdGVfcnVsZShub2RlLCB0LCBiLCBkdXJhdGlvbiwgZGVsYXksIGVhc2luZywgY3NzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChiKVxuICAgICAgICAgICAgICAgIHRpY2soMCwgMSk7XG4gICAgICAgICAgICBydW5uaW5nX3Byb2dyYW0gPSBpbml0KHByb2dyYW0sIGR1cmF0aW9uKTtcbiAgICAgICAgICAgIGFkZF9yZW5kZXJfY2FsbGJhY2soKCkgPT4gZGlzcGF0Y2gobm9kZSwgYiwgJ3N0YXJ0JykpO1xuICAgICAgICAgICAgbG9vcChub3cgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChwZW5kaW5nX3Byb2dyYW0gJiYgbm93ID4gcGVuZGluZ19wcm9ncmFtLnN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJ1bm5pbmdfcHJvZ3JhbSA9IGluaXQocGVuZGluZ19wcm9ncmFtLCBkdXJhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIHBlbmRpbmdfcHJvZ3JhbSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKG5vZGUsIHJ1bm5pbmdfcHJvZ3JhbS5iLCAnc3RhcnQnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJfYW5pbWF0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb25fbmFtZSA9IGNyZWF0ZV9ydWxlKG5vZGUsIHQsIHJ1bm5pbmdfcHJvZ3JhbS5iLCBydW5uaW5nX3Byb2dyYW0uZHVyYXRpb24sIDAsIGVhc2luZywgY29uZmlnLmNzcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJ1bm5pbmdfcHJvZ3JhbSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobm93ID49IHJ1bm5pbmdfcHJvZ3JhbS5lbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpY2sodCA9IHJ1bm5pbmdfcHJvZ3JhbS5iLCAxIC0gdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChub2RlLCBydW5uaW5nX3Byb2dyYW0uYiwgJ2VuZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwZW5kaW5nX3Byb2dyYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSdyZSBkb25lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bm5pbmdfcHJvZ3JhbS5iKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludHJvIOKAlCB3ZSBjYW4gdGlkeSB1cCBpbW1lZGlhdGVseVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhcl9hbmltYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG91dHJvIOKAlCBuZWVkcyB0byBiZSBjb29yZGluYXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIS0tcnVubmluZ19wcm9ncmFtLmdyb3VwLnIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5fYWxsKHJ1bm5pbmdfcHJvZ3JhbS5ncm91cC5jKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBydW5uaW5nX3Byb2dyYW0gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5vdyA+PSBydW5uaW5nX3Byb2dyYW0uc3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHAgPSBub3cgLSBydW5uaW5nX3Byb2dyYW0uc3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ID0gcnVubmluZ19wcm9ncmFtLmEgKyBydW5uaW5nX3Byb2dyYW0uZCAqIGVhc2luZyhwIC8gcnVubmluZ19wcm9ncmFtLmR1cmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpY2sodCwgMSAtIHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAhIShydW5uaW5nX3Byb2dyYW0gfHwgcGVuZGluZ19wcm9ncmFtKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHJ1bihiKSB7XG4gICAgICAgICAgICBpZiAoaXNfZnVuY3Rpb24oY29uZmlnKSkge1xuICAgICAgICAgICAgICAgIHdhaXQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBjb25maWcgPSBjb25maWcoKTtcbiAgICAgICAgICAgICAgICAgICAgZ28oYik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBnbyhiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZW5kKCkge1xuICAgICAgICAgICAgY2xlYXJfYW5pbWF0aW9uKCk7XG4gICAgICAgICAgICBydW5uaW5nX3Byb2dyYW0gPSBwZW5kaW5nX3Byb2dyYW0gPSBudWxsO1xuICAgICAgICB9XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlX3Byb21pc2UocHJvbWlzZSwgaW5mbykge1xuICAgIGNvbnN0IHRva2VuID0gaW5mby50b2tlbiA9IHt9O1xuICAgIGZ1bmN0aW9uIHVwZGF0ZSh0eXBlLCBpbmRleCwga2V5LCB2YWx1ZSkge1xuICAgICAgICBpZiAoaW5mby50b2tlbiAhPT0gdG9rZW4pXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGluZm8ucmVzb2x2ZWQgPSB2YWx1ZTtcbiAgICAgICAgbGV0IGNoaWxkX2N0eCA9IGluZm8uY3R4O1xuICAgICAgICBpZiAoa2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNoaWxkX2N0eCA9IGNoaWxkX2N0eC5zbGljZSgpO1xuICAgICAgICAgICAgY2hpbGRfY3R4W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBibG9jayA9IHR5cGUgJiYgKGluZm8uY3VycmVudCA9IHR5cGUpKGNoaWxkX2N0eCk7XG4gICAgICAgIGxldCBuZWVkc19mbHVzaCA9IGZhbHNlO1xuICAgICAgICBpZiAoaW5mby5ibG9jaykge1xuICAgICAgICAgICAgaWYgKGluZm8uYmxvY2tzKSB7XG4gICAgICAgICAgICAgICAgaW5mby5ibG9ja3MuZm9yRWFjaCgoYmxvY2ssIGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgIT09IGluZGV4ICYmIGJsb2NrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cF9vdXRyb3MoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25fb3V0KGJsb2NrLCAxLCAxLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8uYmxvY2tzW2ldID09PSBibG9jaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmJsb2Nrc1tpXSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja19vdXRyb3MoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaW5mby5ibG9jay5kKDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYmxvY2suYygpO1xuICAgICAgICAgICAgdHJhbnNpdGlvbl9pbihibG9jaywgMSk7XG4gICAgICAgICAgICBibG9jay5tKGluZm8ubW91bnQoKSwgaW5mby5hbmNob3IpO1xuICAgICAgICAgICAgbmVlZHNfZmx1c2ggPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGluZm8uYmxvY2sgPSBibG9jaztcbiAgICAgICAgaWYgKGluZm8uYmxvY2tzKVxuICAgICAgICAgICAgaW5mby5ibG9ja3NbaW5kZXhdID0gYmxvY2s7XG4gICAgICAgIGlmIChuZWVkc19mbHVzaCkge1xuICAgICAgICAgICAgZmx1c2goKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNfcHJvbWlzZShwcm9taXNlKSkge1xuICAgICAgICBjb25zdCBjdXJyZW50X2NvbXBvbmVudCA9IGdldF9jdXJyZW50X2NvbXBvbmVudCgpO1xuICAgICAgICBwcm9taXNlLnRoZW4odmFsdWUgPT4ge1xuICAgICAgICAgICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KGN1cnJlbnRfY29tcG9uZW50KTtcbiAgICAgICAgICAgIHVwZGF0ZShpbmZvLnRoZW4sIDEsIGluZm8udmFsdWUsIHZhbHVlKTtcbiAgICAgICAgICAgIHNldF9jdXJyZW50X2NvbXBvbmVudChudWxsKTtcbiAgICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICAgICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KGN1cnJlbnRfY29tcG9uZW50KTtcbiAgICAgICAgICAgIHVwZGF0ZShpbmZvLmNhdGNoLCAyLCBpbmZvLmVycm9yLCBlcnJvcik7XG4gICAgICAgICAgICBzZXRfY3VycmVudF9jb21wb25lbnQobnVsbCk7XG4gICAgICAgICAgICBpZiAoIWluZm8uaGFzQ2F0Y2gpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGlmIHdlIHByZXZpb3VzbHkgaGFkIGEgdGhlbi9jYXRjaCBibG9jaywgZGVzdHJveSBpdFxuICAgICAgICBpZiAoaW5mby5jdXJyZW50ICE9PSBpbmZvLnBlbmRpbmcpIHtcbiAgICAgICAgICAgIHVwZGF0ZShpbmZvLnBlbmRpbmcsIDApO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmIChpbmZvLmN1cnJlbnQgIT09IGluZm8udGhlbikge1xuICAgICAgICAgICAgdXBkYXRlKGluZm8udGhlbiwgMSwgaW5mby52YWx1ZSwgcHJvbWlzZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpbmZvLnJlc29sdmVkID0gcHJvbWlzZTtcbiAgICB9XG59XG5cbmNvbnN0IGdsb2JhbHMgPSAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCdcbiAgICA/IHdpbmRvd1xuICAgIDogdHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnXG4gICAgICAgID8gZ2xvYmFsVGhpc1xuICAgICAgICA6IGdsb2JhbCk7XG5cbmZ1bmN0aW9uIGRlc3Ryb3lfYmxvY2soYmxvY2ssIGxvb2t1cCkge1xuICAgIGJsb2NrLmQoMSk7XG4gICAgbG9va3VwLmRlbGV0ZShibG9jay5rZXkpO1xufVxuZnVuY3Rpb24gb3V0cm9fYW5kX2Rlc3Ryb3lfYmxvY2soYmxvY2ssIGxvb2t1cCkge1xuICAgIHRyYW5zaXRpb25fb3V0KGJsb2NrLCAxLCAxLCAoKSA9PiB7XG4gICAgICAgIGxvb2t1cC5kZWxldGUoYmxvY2sua2V5KTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGZpeF9hbmRfZGVzdHJveV9ibG9jayhibG9jaywgbG9va3VwKSB7XG4gICAgYmxvY2suZigpO1xuICAgIGRlc3Ryb3lfYmxvY2soYmxvY2ssIGxvb2t1cCk7XG59XG5mdW5jdGlvbiBmaXhfYW5kX291dHJvX2FuZF9kZXN0cm95X2Jsb2NrKGJsb2NrLCBsb29rdXApIHtcbiAgICBibG9jay5mKCk7XG4gICAgb3V0cm9fYW5kX2Rlc3Ryb3lfYmxvY2soYmxvY2ssIGxvb2t1cCk7XG59XG5mdW5jdGlvbiB1cGRhdGVfa2V5ZWRfZWFjaChvbGRfYmxvY2tzLCBkaXJ0eSwgZ2V0X2tleSwgZHluYW1pYywgY3R4LCBsaXN0LCBsb29rdXAsIG5vZGUsIGRlc3Ryb3ksIGNyZWF0ZV9lYWNoX2Jsb2NrLCBuZXh0LCBnZXRfY29udGV4dCkge1xuICAgIGxldCBvID0gb2xkX2Jsb2Nrcy5sZW5ndGg7XG4gICAgbGV0IG4gPSBsaXN0Lmxlbmd0aDtcbiAgICBsZXQgaSA9IG87XG4gICAgY29uc3Qgb2xkX2luZGV4ZXMgPSB7fTtcbiAgICB3aGlsZSAoaS0tKVxuICAgICAgICBvbGRfaW5kZXhlc1tvbGRfYmxvY2tzW2ldLmtleV0gPSBpO1xuICAgIGNvbnN0IG5ld19ibG9ja3MgPSBbXTtcbiAgICBjb25zdCBuZXdfbG9va3VwID0gbmV3IE1hcCgpO1xuICAgIGNvbnN0IGRlbHRhcyA9IG5ldyBNYXAoKTtcbiAgICBpID0gbjtcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkX2N0eCA9IGdldF9jb250ZXh0KGN0eCwgbGlzdCwgaSk7XG4gICAgICAgIGNvbnN0IGtleSA9IGdldF9rZXkoY2hpbGRfY3R4KTtcbiAgICAgICAgbGV0IGJsb2NrID0gbG9va3VwLmdldChrZXkpO1xuICAgICAgICBpZiAoIWJsb2NrKSB7XG4gICAgICAgICAgICBibG9jayA9IGNyZWF0ZV9lYWNoX2Jsb2NrKGtleSwgY2hpbGRfY3R4KTtcbiAgICAgICAgICAgIGJsb2NrLmMoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkeW5hbWljKSB7XG4gICAgICAgICAgICBibG9jay5wKGNoaWxkX2N0eCwgZGlydHkpO1xuICAgICAgICB9XG4gICAgICAgIG5ld19sb29rdXAuc2V0KGtleSwgbmV3X2Jsb2Nrc1tpXSA9IGJsb2NrKTtcbiAgICAgICAgaWYgKGtleSBpbiBvbGRfaW5kZXhlcylcbiAgICAgICAgICAgIGRlbHRhcy5zZXQoa2V5LCBNYXRoLmFicyhpIC0gb2xkX2luZGV4ZXNba2V5XSkpO1xuICAgIH1cbiAgICBjb25zdCB3aWxsX21vdmUgPSBuZXcgU2V0KCk7XG4gICAgY29uc3QgZGlkX21vdmUgPSBuZXcgU2V0KCk7XG4gICAgZnVuY3Rpb24gaW5zZXJ0KGJsb2NrKSB7XG4gICAgICAgIHRyYW5zaXRpb25faW4oYmxvY2ssIDEpO1xuICAgICAgICBibG9jay5tKG5vZGUsIG5leHQpO1xuICAgICAgICBsb29rdXAuc2V0KGJsb2NrLmtleSwgYmxvY2spO1xuICAgICAgICBuZXh0ID0gYmxvY2suZmlyc3Q7XG4gICAgICAgIG4tLTtcbiAgICB9XG4gICAgd2hpbGUgKG8gJiYgbikge1xuICAgICAgICBjb25zdCBuZXdfYmxvY2sgPSBuZXdfYmxvY2tzW24gLSAxXTtcbiAgICAgICAgY29uc3Qgb2xkX2Jsb2NrID0gb2xkX2Jsb2Nrc1tvIC0gMV07XG4gICAgICAgIGNvbnN0IG5ld19rZXkgPSBuZXdfYmxvY2sua2V5O1xuICAgICAgICBjb25zdCBvbGRfa2V5ID0gb2xkX2Jsb2NrLmtleTtcbiAgICAgICAgaWYgKG5ld19ibG9jayA9PT0gb2xkX2Jsb2NrKSB7XG4gICAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgICAgICBuZXh0ID0gbmV3X2Jsb2NrLmZpcnN0O1xuICAgICAgICAgICAgby0tO1xuICAgICAgICAgICAgbi0tO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFuZXdfbG9va3VwLmhhcyhvbGRfa2V5KSkge1xuICAgICAgICAgICAgLy8gcmVtb3ZlIG9sZCBibG9ja1xuICAgICAgICAgICAgZGVzdHJveShvbGRfYmxvY2ssIGxvb2t1cCk7XG4gICAgICAgICAgICBvLS07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWxvb2t1cC5oYXMobmV3X2tleSkgfHwgd2lsbF9tb3ZlLmhhcyhuZXdfa2V5KSkge1xuICAgICAgICAgICAgaW5zZXJ0KG5ld19ibG9jayk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZGlkX21vdmUuaGFzKG9sZF9rZXkpKSB7XG4gICAgICAgICAgICBvLS07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZGVsdGFzLmdldChuZXdfa2V5KSA+IGRlbHRhcy5nZXQob2xkX2tleSkpIHtcbiAgICAgICAgICAgIGRpZF9tb3ZlLmFkZChuZXdfa2V5KTtcbiAgICAgICAgICAgIGluc2VydChuZXdfYmxvY2spO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgd2lsbF9tb3ZlLmFkZChvbGRfa2V5KTtcbiAgICAgICAgICAgIG8tLTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB3aGlsZSAoby0tKSB7XG4gICAgICAgIGNvbnN0IG9sZF9ibG9jayA9IG9sZF9ibG9ja3Nbb107XG4gICAgICAgIGlmICghbmV3X2xvb2t1cC5oYXMob2xkX2Jsb2NrLmtleSkpXG4gICAgICAgICAgICBkZXN0cm95KG9sZF9ibG9jaywgbG9va3VwKTtcbiAgICB9XG4gICAgd2hpbGUgKG4pXG4gICAgICAgIGluc2VydChuZXdfYmxvY2tzW24gLSAxXSk7XG4gICAgcmV0dXJuIG5ld19ibG9ja3M7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZV9lYWNoX2tleXMoY3R4LCBsaXN0LCBnZXRfY29udGV4dCwgZ2V0X2tleSkge1xuICAgIGNvbnN0IGtleXMgPSBuZXcgU2V0KCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGdldF9rZXkoZ2V0X2NvbnRleHQoY3R4LCBsaXN0LCBpKSk7XG4gICAgICAgIGlmIChrZXlzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBoYXZlIGR1cGxpY2F0ZSBrZXlzIGluIGEga2V5ZWQgZWFjaCcpO1xuICAgICAgICB9XG4gICAgICAgIGtleXMuYWRkKGtleSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXRfc3ByZWFkX3VwZGF0ZShsZXZlbHMsIHVwZGF0ZXMpIHtcbiAgICBjb25zdCB1cGRhdGUgPSB7fTtcbiAgICBjb25zdCB0b19udWxsX291dCA9IHt9O1xuICAgIGNvbnN0IGFjY291bnRlZF9mb3IgPSB7ICQkc2NvcGU6IDEgfTtcbiAgICBsZXQgaSA9IGxldmVscy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgICBjb25zdCBvID0gbGV2ZWxzW2ldO1xuICAgICAgICBjb25zdCBuID0gdXBkYXRlc1tpXTtcbiAgICAgICAgaWYgKG4pIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIG8pIHtcbiAgICAgICAgICAgICAgICBpZiAoIShrZXkgaW4gbikpXG4gICAgICAgICAgICAgICAgICAgIHRvX251bGxfb3V0W2tleV0gPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbikge1xuICAgICAgICAgICAgICAgIGlmICghYWNjb3VudGVkX2ZvcltrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVtrZXldID0gbltrZXldO1xuICAgICAgICAgICAgICAgICAgICBhY2NvdW50ZWRfZm9yW2tleV0gPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldmVsc1tpXSA9IG47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvKSB7XG4gICAgICAgICAgICAgICAgYWNjb3VudGVkX2ZvcltrZXldID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0b19udWxsX291dCkge1xuICAgICAgICBpZiAoIShrZXkgaW4gdXBkYXRlKSlcbiAgICAgICAgICAgIHVwZGF0ZVtrZXldID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gdXBkYXRlO1xufVxuZnVuY3Rpb24gZ2V0X3NwcmVhZF9vYmplY3Qoc3ByZWFkX3Byb3BzKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBzcHJlYWRfcHJvcHMgPT09ICdvYmplY3QnICYmIHNwcmVhZF9wcm9wcyAhPT0gbnVsbCA/IHNwcmVhZF9wcm9wcyA6IHt9O1xufVxuXG4vLyBzb3VyY2U6IGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2luZGljZXMuaHRtbFxuY29uc3QgYm9vbGVhbl9hdHRyaWJ1dGVzID0gbmV3IFNldChbXG4gICAgJ2FsbG93ZnVsbHNjcmVlbicsXG4gICAgJ2FsbG93cGF5bWVudHJlcXVlc3QnLFxuICAgICdhc3luYycsXG4gICAgJ2F1dG9mb2N1cycsXG4gICAgJ2F1dG9wbGF5JyxcbiAgICAnY2hlY2tlZCcsXG4gICAgJ2NvbnRyb2xzJyxcbiAgICAnZGVmYXVsdCcsXG4gICAgJ2RlZmVyJyxcbiAgICAnZGlzYWJsZWQnLFxuICAgICdmb3Jtbm92YWxpZGF0ZScsXG4gICAgJ2hpZGRlbicsXG4gICAgJ2lzbWFwJyxcbiAgICAnbG9vcCcsXG4gICAgJ211bHRpcGxlJyxcbiAgICAnbXV0ZWQnLFxuICAgICdub21vZHVsZScsXG4gICAgJ25vdmFsaWRhdGUnLFxuICAgICdvcGVuJyxcbiAgICAncGxheXNpbmxpbmUnLFxuICAgICdyZWFkb25seScsXG4gICAgJ3JlcXVpcmVkJyxcbiAgICAncmV2ZXJzZWQnLFxuICAgICdzZWxlY3RlZCdcbl0pO1xuXG5jb25zdCBpbnZhbGlkX2F0dHJpYnV0ZV9uYW1lX2NoYXJhY3RlciA9IC9bXFxzJ1wiPi89XFx1e0ZERDB9LVxcdXtGREVGfVxcdXtGRkZFfVxcdXtGRkZGfVxcdXsxRkZGRX1cXHV7MUZGRkZ9XFx1ezJGRkZFfVxcdXsyRkZGRn1cXHV7M0ZGRkV9XFx1ezNGRkZGfVxcdXs0RkZGRX1cXHV7NEZGRkZ9XFx1ezVGRkZFfVxcdXs1RkZGRn1cXHV7NkZGRkV9XFx1ezZGRkZGfVxcdXs3RkZGRX1cXHV7N0ZGRkZ9XFx1ezhGRkZFfVxcdXs4RkZGRn1cXHV7OUZGRkV9XFx1ezlGRkZGfVxcdXtBRkZGRX1cXHV7QUZGRkZ9XFx1e0JGRkZFfVxcdXtCRkZGRn1cXHV7Q0ZGRkV9XFx1e0NGRkZGfVxcdXtERkZGRX1cXHV7REZGRkZ9XFx1e0VGRkZFfVxcdXtFRkZGRn1cXHV7RkZGRkV9XFx1e0ZGRkZGfVxcdXsxMEZGRkV9XFx1ezEwRkZGRn1dL3U7XG4vLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNhdHRyaWJ1dGVzLTJcbi8vIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNub25jaGFyYWN0ZXJcbmZ1bmN0aW9uIHNwcmVhZChhcmdzLCBjbGFzc2VzX3RvX2FkZCkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBPYmplY3QuYXNzaWduKHt9LCAuLi5hcmdzKTtcbiAgICBpZiAoY2xhc3Nlc190b19hZGQpIHtcbiAgICAgICAgaWYgKGF0dHJpYnV0ZXMuY2xhc3MgPT0gbnVsbCkge1xuICAgICAgICAgICAgYXR0cmlidXRlcy5jbGFzcyA9IGNsYXNzZXNfdG9fYWRkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYXR0cmlidXRlcy5jbGFzcyArPSAnICcgKyBjbGFzc2VzX3RvX2FkZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgc3RyID0gJyc7XG4gICAgT2JqZWN0LmtleXMoYXR0cmlidXRlcykuZm9yRWFjaChuYW1lID0+IHtcbiAgICAgICAgaWYgKGludmFsaWRfYXR0cmlidXRlX25hbWVfY2hhcmFjdGVyLnRlc3QobmFtZSkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXR0cmlidXRlc1tuYW1lXTtcbiAgICAgICAgaWYgKHZhbHVlID09PSB0cnVlKVxuICAgICAgICAgICAgc3RyICs9ICcgJyArIG5hbWU7XG4gICAgICAgIGVsc2UgaWYgKGJvb2xlYW5fYXR0cmlidXRlcy5oYXMobmFtZS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlKVxuICAgICAgICAgICAgICAgIHN0ciArPSAnICcgKyBuYW1lO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHN0ciArPSBgICR7bmFtZX09XCIke1N0cmluZyh2YWx1ZSkucmVwbGFjZSgvXCIvZywgJyYjMzQ7JykucmVwbGFjZSgvJy9nLCAnJiMzOTsnKX1cImA7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gc3RyO1xufVxuY29uc3QgZXNjYXBlZCA9IHtcbiAgICAnXCInOiAnJnF1b3Q7JyxcbiAgICBcIidcIjogJyYjMzk7JyxcbiAgICAnJic6ICcmYW1wOycsXG4gICAgJzwnOiAnJmx0OycsXG4gICAgJz4nOiAnJmd0Oydcbn07XG5mdW5jdGlvbiBlc2NhcGUoaHRtbCkge1xuICAgIHJldHVybiBTdHJpbmcoaHRtbCkucmVwbGFjZSgvW1wiJyY8Pl0vZywgbWF0Y2ggPT4gZXNjYXBlZFttYXRjaF0pO1xufVxuZnVuY3Rpb24gZWFjaChpdGVtcywgZm4pIHtcbiAgICBsZXQgc3RyID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBzdHIgKz0gZm4oaXRlbXNbaV0sIGkpO1xuICAgIH1cbiAgICByZXR1cm4gc3RyO1xufVxuY29uc3QgbWlzc2luZ19jb21wb25lbnQgPSB7XG4gICAgJCRyZW5kZXI6ICgpID0+ICcnXG59O1xuZnVuY3Rpb24gdmFsaWRhdGVfY29tcG9uZW50KGNvbXBvbmVudCwgbmFtZSkge1xuICAgIGlmICghY29tcG9uZW50IHx8ICFjb21wb25lbnQuJCRyZW5kZXIpIHtcbiAgICAgICAgaWYgKG5hbWUgPT09ICdzdmVsdGU6Y29tcG9uZW50JylcbiAgICAgICAgICAgIG5hbWUgKz0gJyB0aGlzPXsuLi59JztcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGA8JHtuYW1lfT4gaXMgbm90IGEgdmFsaWQgU1NSIGNvbXBvbmVudC4gWW91IG1heSBuZWVkIHRvIHJldmlldyB5b3VyIGJ1aWxkIGNvbmZpZyB0byBlbnN1cmUgdGhhdCBkZXBlbmRlbmNpZXMgYXJlIGNvbXBpbGVkLCByYXRoZXIgdGhhbiBpbXBvcnRlZCBhcyBwcmUtY29tcGlsZWQgbW9kdWxlc2ApO1xuICAgIH1cbiAgICByZXR1cm4gY29tcG9uZW50O1xufVxuZnVuY3Rpb24gZGVidWcoZmlsZSwgbGluZSwgY29sdW1uLCB2YWx1ZXMpIHtcbiAgICBjb25zb2xlLmxvZyhge0BkZWJ1Z30gJHtmaWxlID8gZmlsZSArICcgJyA6ICcnfSgke2xpbmV9OiR7Y29sdW1ufSlgKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS5sb2codmFsdWVzKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG4gICAgcmV0dXJuICcnO1xufVxubGV0IG9uX2Rlc3Ryb3k7XG5mdW5jdGlvbiBjcmVhdGVfc3NyX2NvbXBvbmVudChmbikge1xuICAgIGZ1bmN0aW9uICQkcmVuZGVyKHJlc3VsdCwgcHJvcHMsIGJpbmRpbmdzLCBzbG90cykge1xuICAgICAgICBjb25zdCBwYXJlbnRfY29tcG9uZW50ID0gY3VycmVudF9jb21wb25lbnQ7XG4gICAgICAgIGNvbnN0ICQkID0ge1xuICAgICAgICAgICAgb25fZGVzdHJveSxcbiAgICAgICAgICAgIGNvbnRleHQ6IG5ldyBNYXAocGFyZW50X2NvbXBvbmVudCA/IHBhcmVudF9jb21wb25lbnQuJCQuY29udGV4dCA6IFtdKSxcbiAgICAgICAgICAgIC8vIHRoZXNlIHdpbGwgYmUgaW1tZWRpYXRlbHkgZGlzY2FyZGVkXG4gICAgICAgICAgICBvbl9tb3VudDogW10sXG4gICAgICAgICAgICBiZWZvcmVfdXBkYXRlOiBbXSxcbiAgICAgICAgICAgIGFmdGVyX3VwZGF0ZTogW10sXG4gICAgICAgICAgICBjYWxsYmFja3M6IGJsYW5rX29iamVjdCgpXG4gICAgICAgIH07XG4gICAgICAgIHNldF9jdXJyZW50X2NvbXBvbmVudCh7ICQkIH0pO1xuICAgICAgICBjb25zdCBodG1sID0gZm4ocmVzdWx0LCBwcm9wcywgYmluZGluZ3MsIHNsb3RzKTtcbiAgICAgICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KHBhcmVudF9jb21wb25lbnQpO1xuICAgICAgICByZXR1cm4gaHRtbDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmVuZGVyOiAocHJvcHMgPSB7fSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgICAgICAgICBvbl9kZXN0cm95ID0gW107XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7IHRpdGxlOiAnJywgaGVhZDogJycsIGNzczogbmV3IFNldCgpIH07XG4gICAgICAgICAgICBjb25zdCBodG1sID0gJCRyZW5kZXIocmVzdWx0LCBwcm9wcywge30sIG9wdGlvbnMpO1xuICAgICAgICAgICAgcnVuX2FsbChvbl9kZXN0cm95KTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaHRtbCxcbiAgICAgICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogQXJyYXkuZnJvbShyZXN1bHQuY3NzKS5tYXAoY3NzID0+IGNzcy5jb2RlKS5qb2luKCdcXG4nKSxcbiAgICAgICAgICAgICAgICAgICAgbWFwOiBudWxsIC8vIFRPRE9cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGhlYWQ6IHJlc3VsdC50aXRsZSArIHJlc3VsdC5oZWFkXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAkJHJlbmRlclxuICAgIH07XG59XG5mdW5jdGlvbiBhZGRfYXR0cmlidXRlKG5hbWUsIHZhbHVlLCBib29sZWFuKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwgfHwgKGJvb2xlYW4gJiYgIXZhbHVlKSlcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIHJldHVybiBgICR7bmFtZX0ke3ZhbHVlID09PSB0cnVlID8gJycgOiBgPSR7dHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IEpTT04uc3RyaW5naWZ5KGVzY2FwZSh2YWx1ZSkpIDogYFwiJHt2YWx1ZX1cImB9YH1gO1xufVxuZnVuY3Rpb24gYWRkX2NsYXNzZXMoY2xhc3Nlcykge1xuICAgIHJldHVybiBjbGFzc2VzID8gYCBjbGFzcz1cIiR7Y2xhc3Nlc31cImAgOiAnJztcbn1cblxuZnVuY3Rpb24gYmluZChjb21wb25lbnQsIG5hbWUsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgaW5kZXggPSBjb21wb25lbnQuJCQucHJvcHNbbmFtZV07XG4gICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29tcG9uZW50LiQkLmJvdW5kW2luZGV4XSA9IGNhbGxiYWNrO1xuICAgICAgICBjYWxsYmFjayhjb21wb25lbnQuJCQuY3R4W2luZGV4XSk7XG4gICAgfVxufVxuZnVuY3Rpb24gY3JlYXRlX2NvbXBvbmVudChibG9jaykge1xuICAgIGJsb2NrICYmIGJsb2NrLmMoKTtcbn1cbmZ1bmN0aW9uIGNsYWltX2NvbXBvbmVudChibG9jaywgcGFyZW50X25vZGVzKSB7XG4gICAgYmxvY2sgJiYgYmxvY2subChwYXJlbnRfbm9kZXMpO1xufVxuZnVuY3Rpb24gbW91bnRfY29tcG9uZW50KGNvbXBvbmVudCwgdGFyZ2V0LCBhbmNob3IpIHtcbiAgICBjb25zdCB7IGZyYWdtZW50LCBvbl9tb3VudCwgb25fZGVzdHJveSwgYWZ0ZXJfdXBkYXRlIH0gPSBjb21wb25lbnQuJCQ7XG4gICAgZnJhZ21lbnQgJiYgZnJhZ21lbnQubSh0YXJnZXQsIGFuY2hvcik7XG4gICAgLy8gb25Nb3VudCBoYXBwZW5zIGJlZm9yZSB0aGUgaW5pdGlhbCBhZnRlclVwZGF0ZVxuICAgIGFkZF9yZW5kZXJfY2FsbGJhY2soKCkgPT4ge1xuICAgICAgICBjb25zdCBuZXdfb25fZGVzdHJveSA9IG9uX21vdW50Lm1hcChydW4pLmZpbHRlcihpc19mdW5jdGlvbik7XG4gICAgICAgIGlmIChvbl9kZXN0cm95KSB7XG4gICAgICAgICAgICBvbl9kZXN0cm95LnB1c2goLi4ubmV3X29uX2Rlc3Ryb3kpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gRWRnZSBjYXNlIC0gY29tcG9uZW50IHdhcyBkZXN0cm95ZWQgaW1tZWRpYXRlbHksXG4gICAgICAgICAgICAvLyBtb3N0IGxpa2VseSBhcyBhIHJlc3VsdCBvZiBhIGJpbmRpbmcgaW5pdGlhbGlzaW5nXG4gICAgICAgICAgICBydW5fYWxsKG5ld19vbl9kZXN0cm95KTtcbiAgICAgICAgfVxuICAgICAgICBjb21wb25lbnQuJCQub25fbW91bnQgPSBbXTtcbiAgICB9KTtcbiAgICBhZnRlcl91cGRhdGUuZm9yRWFjaChhZGRfcmVuZGVyX2NhbGxiYWNrKTtcbn1cbmZ1bmN0aW9uIGRlc3Ryb3lfY29tcG9uZW50KGNvbXBvbmVudCwgZGV0YWNoaW5nKSB7XG4gICAgY29uc3QgJCQgPSBjb21wb25lbnQuJCQ7XG4gICAgaWYgKCQkLmZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgICAgIHJ1bl9hbGwoJCQub25fZGVzdHJveSk7XG4gICAgICAgICQkLmZyYWdtZW50ICYmICQkLmZyYWdtZW50LmQoZGV0YWNoaW5nKTtcbiAgICAgICAgLy8gVE9ETyBudWxsIG91dCBvdGhlciByZWZzLCBpbmNsdWRpbmcgY29tcG9uZW50LiQkIChidXQgbmVlZCB0b1xuICAgICAgICAvLyBwcmVzZXJ2ZSBmaW5hbCBzdGF0ZT8pXG4gICAgICAgICQkLm9uX2Rlc3Ryb3kgPSAkJC5mcmFnbWVudCA9IG51bGw7XG4gICAgICAgICQkLmN0eCA9IFtdO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG1ha2VfZGlydHkoY29tcG9uZW50LCBpKSB7XG4gICAgaWYgKGNvbXBvbmVudC4kJC5kaXJ0eVswXSA9PT0gLTEpIHtcbiAgICAgICAgZGlydHlfY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7XG4gICAgICAgIHNjaGVkdWxlX3VwZGF0ZSgpO1xuICAgICAgICBjb21wb25lbnQuJCQuZGlydHkuZmlsbCgwKTtcbiAgICB9XG4gICAgY29tcG9uZW50LiQkLmRpcnR5WyhpIC8gMzEpIHwgMF0gfD0gKDEgPDwgKGkgJSAzMSkpO1xufVxuZnVuY3Rpb24gaW5pdChjb21wb25lbnQsIG9wdGlvbnMsIGluc3RhbmNlLCBjcmVhdGVfZnJhZ21lbnQsIG5vdF9lcXVhbCwgcHJvcHMsIGRpcnR5ID0gWy0xXSkge1xuICAgIGNvbnN0IHBhcmVudF9jb21wb25lbnQgPSBjdXJyZW50X2NvbXBvbmVudDtcbiAgICBzZXRfY3VycmVudF9jb21wb25lbnQoY29tcG9uZW50KTtcbiAgICBjb25zdCAkJCA9IGNvbXBvbmVudC4kJCA9IHtcbiAgICAgICAgZnJhZ21lbnQ6IG51bGwsXG4gICAgICAgIGN0eDogbnVsbCxcbiAgICAgICAgLy8gc3RhdGVcbiAgICAgICAgcHJvcHMsXG4gICAgICAgIHVwZGF0ZTogbm9vcCxcbiAgICAgICAgbm90X2VxdWFsLFxuICAgICAgICBib3VuZDogYmxhbmtfb2JqZWN0KCksXG4gICAgICAgIC8vIGxpZmVjeWNsZVxuICAgICAgICBvbl9tb3VudDogW10sXG4gICAgICAgIG9uX2Rlc3Ryb3k6IFtdLFxuICAgICAgICBiZWZvcmVfdXBkYXRlOiBbXSxcbiAgICAgICAgYWZ0ZXJfdXBkYXRlOiBbXSxcbiAgICAgICAgY29udGV4dDogbmV3IE1hcChwYXJlbnRfY29tcG9uZW50ID8gcGFyZW50X2NvbXBvbmVudC4kJC5jb250ZXh0IDogW10pLFxuICAgICAgICAvLyBldmVyeXRoaW5nIGVsc2VcbiAgICAgICAgY2FsbGJhY2tzOiBibGFua19vYmplY3QoKSxcbiAgICAgICAgZGlydHksXG4gICAgICAgIHNraXBfYm91bmQ6IGZhbHNlXG4gICAgfTtcbiAgICBsZXQgcmVhZHkgPSBmYWxzZTtcbiAgICAkJC5jdHggPSBpbnN0YW5jZVxuICAgICAgICA/IGluc3RhbmNlKGNvbXBvbmVudCwgb3B0aW9ucy5wcm9wcyB8fCB7fSwgKGksIHJldCwgLi4ucmVzdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByZXN0Lmxlbmd0aCA/IHJlc3RbMF0gOiByZXQ7XG4gICAgICAgICAgICBpZiAoJCQuY3R4ICYmIG5vdF9lcXVhbCgkJC5jdHhbaV0sICQkLmN0eFtpXSA9IHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGlmICghJCQuc2tpcF9ib3VuZCAmJiAkJC5ib3VuZFtpXSlcbiAgICAgICAgICAgICAgICAgICAgJCQuYm91bmRbaV0odmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChyZWFkeSlcbiAgICAgICAgICAgICAgICAgICAgbWFrZV9kaXJ0eShjb21wb25lbnQsIGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfSlcbiAgICAgICAgOiBbXTtcbiAgICAkJC51cGRhdGUoKTtcbiAgICByZWFkeSA9IHRydWU7XG4gICAgcnVuX2FsbCgkJC5iZWZvcmVfdXBkYXRlKTtcbiAgICAvLyBgZmFsc2VgIGFzIGEgc3BlY2lhbCBjYXNlIG9mIG5vIERPTSBjb21wb25lbnRcbiAgICAkJC5mcmFnbWVudCA9IGNyZWF0ZV9mcmFnbWVudCA/IGNyZWF0ZV9mcmFnbWVudCgkJC5jdHgpIDogZmFsc2U7XG4gICAgaWYgKG9wdGlvbnMudGFyZ2V0KSB7XG4gICAgICAgIGlmIChvcHRpb25zLmh5ZHJhdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGVzID0gY2hpbGRyZW4ob3B0aW9ucy50YXJnZXQpO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgICAgICAgICQkLmZyYWdtZW50ICYmICQkLmZyYWdtZW50Lmwobm9kZXMpO1xuICAgICAgICAgICAgbm9kZXMuZm9yRWFjaChkZXRhY2gpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgICAgICAgICQkLmZyYWdtZW50ICYmICQkLmZyYWdtZW50LmMoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5pbnRybylcbiAgICAgICAgICAgIHRyYW5zaXRpb25faW4oY29tcG9uZW50LiQkLmZyYWdtZW50KTtcbiAgICAgICAgbW91bnRfY29tcG9uZW50KGNvbXBvbmVudCwgb3B0aW9ucy50YXJnZXQsIG9wdGlvbnMuYW5jaG9yKTtcbiAgICAgICAgZmx1c2goKTtcbiAgICB9XG4gICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KHBhcmVudF9jb21wb25lbnQpO1xufVxubGV0IFN2ZWx0ZUVsZW1lbnQ7XG5pZiAodHlwZW9mIEhUTUxFbGVtZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgU3ZlbHRlRWxlbWVudCA9IGNsYXNzIGV4dGVuZHMgSFRNTEVsZW1lbnQge1xuICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICAgIHN1cGVyKCk7XG4gICAgICAgICAgICB0aGlzLmF0dGFjaFNoYWRvdyh7IG1vZGU6ICdvcGVuJyB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgdG9kbzogaW1wcm92ZSB0eXBpbmdzXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLiQkLnNsb3R0ZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlIHRvZG86IGltcHJvdmUgdHlwaW5nc1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy4kJC5zbG90dGVkW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhhdHRyLCBfb2xkVmFsdWUsIG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzW2F0dHJdID0gbmV3VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgJGRlc3Ryb3koKSB7XG4gICAgICAgICAgICBkZXN0cm95X2NvbXBvbmVudCh0aGlzLCAxKTtcbiAgICAgICAgICAgIHRoaXMuJGRlc3Ryb3kgPSBub29wO1xuICAgICAgICB9XG4gICAgICAgICRvbih0eXBlLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgLy8gVE9ETyBzaG91bGQgdGhpcyBkZWxlZ2F0ZSB0byBhZGRFdmVudExpc3RlbmVyP1xuICAgICAgICAgICAgY29uc3QgY2FsbGJhY2tzID0gKHRoaXMuJCQuY2FsbGJhY2tzW3R5cGVdIHx8ICh0aGlzLiQkLmNhbGxiYWNrc1t0eXBlXSA9IFtdKSk7XG4gICAgICAgICAgICBjYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gY2FsbGJhY2tzLmluZGV4T2YoY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICAkc2V0KCQkcHJvcHMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLiQkc2V0ICYmICFpc19lbXB0eSgkJHByb3BzKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuJCQuc2tpcF9ib3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy4kJHNldCgkJHByb3BzKTtcbiAgICAgICAgICAgICAgICB0aGlzLiQkLnNraXBfYm91bmQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG59XG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIFN2ZWx0ZSBjb21wb25lbnRzLiBVc2VkIHdoZW4gZGV2PWZhbHNlLlxuICovXG5jbGFzcyBTdmVsdGVDb21wb25lbnQge1xuICAgICRkZXN0cm95KCkge1xuICAgICAgICBkZXN0cm95X2NvbXBvbmVudCh0aGlzLCAxKTtcbiAgICAgICAgdGhpcy4kZGVzdHJveSA9IG5vb3A7XG4gICAgfVxuICAgICRvbih0eXBlLCBjYWxsYmFjaykge1xuICAgICAgICBjb25zdCBjYWxsYmFja3MgPSAodGhpcy4kJC5jYWxsYmFja3NbdHlwZV0gfHwgKHRoaXMuJCQuY2FsbGJhY2tzW3R5cGVdID0gW10pKTtcbiAgICAgICAgY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBjYWxsYmFja3MuaW5kZXhPZihjYWxsYmFjayk7XG4gICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKVxuICAgICAgICAgICAgICAgIGNhbGxiYWNrcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICAkc2V0KCQkcHJvcHMpIHtcbiAgICAgICAgaWYgKHRoaXMuJCRzZXQgJiYgIWlzX2VtcHR5KCQkcHJvcHMpKSB7XG4gICAgICAgICAgICB0aGlzLiQkLnNraXBfYm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy4kJHNldCgkJHByb3BzKTtcbiAgICAgICAgICAgIHRoaXMuJCQuc2tpcF9ib3VuZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkaXNwYXRjaF9kZXYodHlwZSwgZGV0YWlsKSB7XG4gICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21fZXZlbnQodHlwZSwgT2JqZWN0LmFzc2lnbih7IHZlcnNpb246ICczLjMyLjMnIH0sIGRldGFpbCkpKTtcbn1cbmZ1bmN0aW9uIGFwcGVuZF9kZXYodGFyZ2V0LCBub2RlKSB7XG4gICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01JbnNlcnQnLCB7IHRhcmdldCwgbm9kZSB9KTtcbiAgICBhcHBlbmQodGFyZ2V0LCBub2RlKTtcbn1cbmZ1bmN0aW9uIGluc2VydF9kZXYodGFyZ2V0LCBub2RlLCBhbmNob3IpIHtcbiAgICBkaXNwYXRjaF9kZXYoJ1N2ZWx0ZURPTUluc2VydCcsIHsgdGFyZ2V0LCBub2RlLCBhbmNob3IgfSk7XG4gICAgaW5zZXJ0KHRhcmdldCwgbm9kZSwgYW5jaG9yKTtcbn1cbmZ1bmN0aW9uIGRldGFjaF9kZXYobm9kZSkge1xuICAgIGRpc3BhdGNoX2RldignU3ZlbHRlRE9NUmVtb3ZlJywgeyBub2RlIH0pO1xuICAgIGRldGFjaChub2RlKTtcbn1cbmZ1bmN0aW9uIGRldGFjaF9iZXR3ZWVuX2RldihiZWZvcmUsIGFmdGVyKSB7XG4gICAgd2hpbGUgKGJlZm9yZS5uZXh0U2libGluZyAmJiBiZWZvcmUubmV4dFNpYmxpbmcgIT09IGFmdGVyKSB7XG4gICAgICAgIGRldGFjaF9kZXYoYmVmb3JlLm5leHRTaWJsaW5nKTtcbiAgICB9XG59XG5mdW5jdGlvbiBkZXRhY2hfYmVmb3JlX2RldihhZnRlcikge1xuICAgIHdoaWxlIChhZnRlci5wcmV2aW91c1NpYmxpbmcpIHtcbiAgICAgICAgZGV0YWNoX2RldihhZnRlci5wcmV2aW91c1NpYmxpbmcpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGRldGFjaF9hZnRlcl9kZXYoYmVmb3JlKSB7XG4gICAgd2hpbGUgKGJlZm9yZS5uZXh0U2libGluZykge1xuICAgICAgICBkZXRhY2hfZGV2KGJlZm9yZS5uZXh0U2libGluZyk7XG4gICAgfVxufVxuZnVuY3Rpb24gbGlzdGVuX2Rldihub2RlLCBldmVudCwgaGFuZGxlciwgb3B0aW9ucywgaGFzX3ByZXZlbnRfZGVmYXVsdCwgaGFzX3N0b3BfcHJvcGFnYXRpb24pIHtcbiAgICBjb25zdCBtb2RpZmllcnMgPSBvcHRpb25zID09PSB0cnVlID8gWydjYXB0dXJlJ10gOiBvcHRpb25zID8gQXJyYXkuZnJvbShPYmplY3Qua2V5cyhvcHRpb25zKSkgOiBbXTtcbiAgICBpZiAoaGFzX3ByZXZlbnRfZGVmYXVsdClcbiAgICAgICAgbW9kaWZpZXJzLnB1c2goJ3ByZXZlbnREZWZhdWx0Jyk7XG4gICAgaWYgKGhhc19zdG9wX3Byb3BhZ2F0aW9uKVxuICAgICAgICBtb2RpZmllcnMucHVzaCgnc3RvcFByb3BhZ2F0aW9uJyk7XG4gICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01BZGRFdmVudExpc3RlbmVyJywgeyBub2RlLCBldmVudCwgaGFuZGxlciwgbW9kaWZpZXJzIH0pO1xuICAgIGNvbnN0IGRpc3Bvc2UgPSBsaXN0ZW4obm9kZSwgZXZlbnQsIGhhbmRsZXIsIG9wdGlvbnMpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGRpc3BhdGNoX2RldignU3ZlbHRlRE9NUmVtb3ZlRXZlbnRMaXN0ZW5lcicsIHsgbm9kZSwgZXZlbnQsIGhhbmRsZXIsIG1vZGlmaWVycyB9KTtcbiAgICAgICAgZGlzcG9zZSgpO1xuICAgIH07XG59XG5mdW5jdGlvbiBhdHRyX2Rldihub2RlLCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG4gICAgYXR0cihub2RlLCBhdHRyaWJ1dGUsIHZhbHVlKTtcbiAgICBpZiAodmFsdWUgPT0gbnVsbClcbiAgICAgICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01SZW1vdmVBdHRyaWJ1dGUnLCB7IG5vZGUsIGF0dHJpYnV0ZSB9KTtcbiAgICBlbHNlXG4gICAgICAgIGRpc3BhdGNoX2RldignU3ZlbHRlRE9NU2V0QXR0cmlidXRlJywgeyBub2RlLCBhdHRyaWJ1dGUsIHZhbHVlIH0pO1xufVxuZnVuY3Rpb24gcHJvcF9kZXYobm9kZSwgcHJvcGVydHksIHZhbHVlKSB7XG4gICAgbm9kZVtwcm9wZXJ0eV0gPSB2YWx1ZTtcbiAgICBkaXNwYXRjaF9kZXYoJ1N2ZWx0ZURPTVNldFByb3BlcnR5JywgeyBub2RlLCBwcm9wZXJ0eSwgdmFsdWUgfSk7XG59XG5mdW5jdGlvbiBkYXRhc2V0X2Rldihub2RlLCBwcm9wZXJ0eSwgdmFsdWUpIHtcbiAgICBub2RlLmRhdGFzZXRbcHJvcGVydHldID0gdmFsdWU7XG4gICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01TZXREYXRhc2V0JywgeyBub2RlLCBwcm9wZXJ0eSwgdmFsdWUgfSk7XG59XG5mdW5jdGlvbiBzZXRfZGF0YV9kZXYodGV4dCwgZGF0YSkge1xuICAgIGRhdGEgPSAnJyArIGRhdGE7XG4gICAgaWYgKHRleHQud2hvbGVUZXh0ID09PSBkYXRhKVxuICAgICAgICByZXR1cm47XG4gICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01TZXREYXRhJywgeyBub2RlOiB0ZXh0LCBkYXRhIH0pO1xuICAgIHRleHQuZGF0YSA9IGRhdGE7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZV9lYWNoX2FyZ3VtZW50KGFyZykge1xuICAgIGlmICh0eXBlb2YgYXJnICE9PSAnc3RyaW5nJyAmJiAhKGFyZyAmJiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiAnbGVuZ3RoJyBpbiBhcmcpKSB7XG4gICAgICAgIGxldCBtc2cgPSAneyNlYWNofSBvbmx5IGl0ZXJhdGVzIG92ZXIgYXJyYXktbGlrZSBvYmplY3RzLic7XG4gICAgICAgIGlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIGFyZyAmJiBTeW1ib2wuaXRlcmF0b3IgaW4gYXJnKSB7XG4gICAgICAgICAgICBtc2cgKz0gJyBZb3UgY2FuIHVzZSBhIHNwcmVhZCB0byBjb252ZXJ0IHRoaXMgaXRlcmFibGUgaW50byBhbiBhcnJheS4nO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHZhbGlkYXRlX3Nsb3RzKG5hbWUsIHNsb3QsIGtleXMpIHtcbiAgICBmb3IgKGNvbnN0IHNsb3Rfa2V5IG9mIE9iamVjdC5rZXlzKHNsb3QpKSB7XG4gICAgICAgIGlmICghfmtleXMuaW5kZXhPZihzbG90X2tleSkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgPCR7bmFtZX0+IHJlY2VpdmVkIGFuIHVuZXhwZWN0ZWQgc2xvdCBcIiR7c2xvdF9rZXl9XCIuYCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIFN2ZWx0ZSBjb21wb25lbnRzIHdpdGggc29tZSBtaW5vciBkZXYtZW5oYW5jZW1lbnRzLiBVc2VkIHdoZW4gZGV2PXRydWUuXG4gKi9cbmNsYXNzIFN2ZWx0ZUNvbXBvbmVudERldiBleHRlbmRzIFN2ZWx0ZUNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICBpZiAoIW9wdGlvbnMgfHwgKCFvcHRpb25zLnRhcmdldCAmJiAhb3B0aW9ucy4kJGlubGluZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIid0YXJnZXQnIGlzIGEgcmVxdWlyZWQgb3B0aW9uXCIpO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuICAgICRkZXN0cm95KCkge1xuICAgICAgICBzdXBlci4kZGVzdHJveSgpO1xuICAgICAgICB0aGlzLiRkZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdDb21wb25lbnQgd2FzIGFscmVhZHkgZGVzdHJveWVkJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuICAgICAgICB9O1xuICAgIH1cbiAgICAkY2FwdHVyZV9zdGF0ZSgpIHsgfVxuICAgICRpbmplY3Rfc3RhdGUoKSB7IH1cbn1cbi8qKlxuICogQmFzZSBjbGFzcyB0byBjcmVhdGUgc3Ryb25nbHkgdHlwZWQgU3ZlbHRlIGNvbXBvbmVudHMuXG4gKiBUaGlzIG9ubHkgZXhpc3RzIGZvciB0eXBpbmcgcHVycG9zZXMgYW5kIHNob3VsZCBiZSB1c2VkIGluIGAuZC50c2AgZmlsZXMuXG4gKlxuICogIyMjIEV4YW1wbGU6XG4gKlxuICogWW91IGhhdmUgY29tcG9uZW50IGxpYnJhcnkgb24gbnBtIGNhbGxlZCBgY29tcG9uZW50LWxpYnJhcnlgLCBmcm9tIHdoaWNoXG4gKiB5b3UgZXhwb3J0IGEgY29tcG9uZW50IGNhbGxlZCBgTXlDb21wb25lbnRgLiBGb3IgU3ZlbHRlK1R5cGVTY3JpcHQgdXNlcnMsXG4gKiB5b3Ugd2FudCB0byBwcm92aWRlIHR5cGluZ3MuIFRoZXJlZm9yZSB5b3UgY3JlYXRlIGEgYGluZGV4LmQudHNgOlxuICogYGBgdHNcbiAqIGltcG9ydCB7IFN2ZWx0ZUNvbXBvbmVudFR5cGVkIH0gZnJvbSBcInN2ZWx0ZVwiO1xuICogZXhwb3J0IGNsYXNzIE15Q29tcG9uZW50IGV4dGVuZHMgU3ZlbHRlQ29tcG9uZW50VHlwZWQ8e2Zvbzogc3RyaW5nfT4ge31cbiAqIGBgYFxuICogVHlwaW5nIHRoaXMgbWFrZXMgaXQgcG9zc2libGUgZm9yIElERXMgbGlrZSBWUyBDb2RlIHdpdGggdGhlIFN2ZWx0ZSBleHRlbnNpb25cbiAqIHRvIHByb3ZpZGUgaW50ZWxsaXNlbnNlIGFuZCB0byB1c2UgdGhlIGNvbXBvbmVudCBsaWtlIHRoaXMgaW4gYSBTdmVsdGUgZmlsZVxuICogd2l0aCBUeXBlU2NyaXB0OlxuICogYGBgc3ZlbHRlXG4gKiA8c2NyaXB0IGxhbmc9XCJ0c1wiPlxuICogXHRpbXBvcnQgeyBNeUNvbXBvbmVudCB9IGZyb20gXCJjb21wb25lbnQtbGlicmFyeVwiO1xuICogPC9zY3JpcHQ+XG4gKiA8TXlDb21wb25lbnQgZm9vPXsnYmFyJ30gLz5cbiAqIGBgYFxuICpcbiAqICMjIyMgV2h5IG5vdCBtYWtlIHRoaXMgcGFydCBvZiBgU3ZlbHRlQ29tcG9uZW50KERldilgP1xuICogQmVjYXVzZVxuICogYGBgdHNcbiAqIGNsYXNzIEFTdWJjbGFzc09mU3ZlbHRlQ29tcG9uZW50IGV4dGVuZHMgU3ZlbHRlQ29tcG9uZW50PHtmb286IHN0cmluZ30+IHt9XG4gKiBjb25zdCBjb21wb25lbnQ6IHR5cGVvZiBTdmVsdGVDb21wb25lbnQgPSBBU3ViY2xhc3NPZlN2ZWx0ZUNvbXBvbmVudDtcbiAqIGBgYFxuICogd2lsbCB0aHJvdyBhIHR5cGUgZXJyb3IsIHNvIHdlIG5lZWQgdG8gc2VwZXJhdGUgdGhlIG1vcmUgc3RyaWN0bHkgdHlwZWQgY2xhc3MuXG4gKi9cbmNsYXNzIFN2ZWx0ZUNvbXBvbmVudFR5cGVkIGV4dGVuZHMgU3ZlbHRlQ29tcG9uZW50RGV2IHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGxvb3BfZ3VhcmQodGltZW91dCkge1xuICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXJ0ID4gdGltZW91dCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbmZpbml0ZSBsb29wIGRldGVjdGVkJyk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5leHBvcnQgeyBIdG1sVGFnLCBTdmVsdGVDb21wb25lbnQsIFN2ZWx0ZUNvbXBvbmVudERldiwgU3ZlbHRlQ29tcG9uZW50VHlwZWQsIFN2ZWx0ZUVsZW1lbnQsIGFjdGlvbl9kZXN0cm95ZXIsIGFkZF9hdHRyaWJ1dGUsIGFkZF9jbGFzc2VzLCBhZGRfZmx1c2hfY2FsbGJhY2ssIGFkZF9sb2NhdGlvbiwgYWRkX3JlbmRlcl9jYWxsYmFjaywgYWRkX3Jlc2l6ZV9saXN0ZW5lciwgYWRkX3RyYW5zZm9ybSwgYWZ0ZXJVcGRhdGUsIGFwcGVuZCwgYXBwZW5kX2RldiwgYXNzaWduLCBhdHRyLCBhdHRyX2RldiwgYXR0cmlidXRlX3RvX29iamVjdCwgYmVmb3JlVXBkYXRlLCBiaW5kLCBiaW5kaW5nX2NhbGxiYWNrcywgYmxhbmtfb2JqZWN0LCBidWJibGUsIGNoZWNrX291dHJvcywgY2hpbGRyZW4sIGNsYWltX2NvbXBvbmVudCwgY2xhaW1fZWxlbWVudCwgY2xhaW1fc3BhY2UsIGNsYWltX3RleHQsIGNsZWFyX2xvb3BzLCBjb21wb25lbnRfc3Vic2NyaWJlLCBjb21wdXRlX3Jlc3RfcHJvcHMsIGNvbXB1dGVfc2xvdHMsIGNyZWF0ZUV2ZW50RGlzcGF0Y2hlciwgY3JlYXRlX2FuaW1hdGlvbiwgY3JlYXRlX2JpZGlyZWN0aW9uYWxfdHJhbnNpdGlvbiwgY3JlYXRlX2NvbXBvbmVudCwgY3JlYXRlX2luX3RyYW5zaXRpb24sIGNyZWF0ZV9vdXRfdHJhbnNpdGlvbiwgY3JlYXRlX3Nsb3QsIGNyZWF0ZV9zc3JfY29tcG9uZW50LCBjdXJyZW50X2NvbXBvbmVudCwgY3VzdG9tX2V2ZW50LCBkYXRhc2V0X2RldiwgZGVidWcsIGRlc3Ryb3lfYmxvY2ssIGRlc3Ryb3lfY29tcG9uZW50LCBkZXN0cm95X2VhY2gsIGRldGFjaCwgZGV0YWNoX2FmdGVyX2RldiwgZGV0YWNoX2JlZm9yZV9kZXYsIGRldGFjaF9iZXR3ZWVuX2RldiwgZGV0YWNoX2RldiwgZGlydHlfY29tcG9uZW50cywgZGlzcGF0Y2hfZGV2LCBlYWNoLCBlbGVtZW50LCBlbGVtZW50X2lzLCBlbXB0eSwgZXNjYXBlLCBlc2NhcGVkLCBleGNsdWRlX2ludGVybmFsX3Byb3BzLCBmaXhfYW5kX2Rlc3Ryb3lfYmxvY2ssIGZpeF9hbmRfb3V0cm9fYW5kX2Rlc3Ryb3lfYmxvY2ssIGZpeF9wb3NpdGlvbiwgZmx1c2gsIGdldENvbnRleHQsIGdldF9iaW5kaW5nX2dyb3VwX3ZhbHVlLCBnZXRfY3VycmVudF9jb21wb25lbnQsIGdldF9jdXN0b21fZWxlbWVudHNfc2xvdHMsIGdldF9zbG90X2NoYW5nZXMsIGdldF9zbG90X2NvbnRleHQsIGdldF9zcHJlYWRfb2JqZWN0LCBnZXRfc3ByZWFkX3VwZGF0ZSwgZ2V0X3N0b3JlX3ZhbHVlLCBnbG9iYWxzLCBncm91cF9vdXRyb3MsIGhhbmRsZV9wcm9taXNlLCBoYXNDb250ZXh0LCBoYXNfcHJvcCwgaWRlbnRpdHksIGluaXQsIGluc2VydCwgaW5zZXJ0X2RldiwgaW50cm9zLCBpbnZhbGlkX2F0dHJpYnV0ZV9uYW1lX2NoYXJhY3RlciwgaXNfY2xpZW50LCBpc19jcm9zc29yaWdpbiwgaXNfZW1wdHksIGlzX2Z1bmN0aW9uLCBpc19wcm9taXNlLCBsaXN0ZW4sIGxpc3Rlbl9kZXYsIGxvb3AsIGxvb3BfZ3VhcmQsIG1pc3NpbmdfY29tcG9uZW50LCBtb3VudF9jb21wb25lbnQsIG5vb3AsIG5vdF9lcXVhbCwgbm93LCBudWxsX3RvX2VtcHR5LCBvYmplY3Rfd2l0aG91dF9wcm9wZXJ0aWVzLCBvbkRlc3Ryb3ksIG9uTW91bnQsIG9uY2UsIG91dHJvX2FuZF9kZXN0cm95X2Jsb2NrLCBwcmV2ZW50X2RlZmF1bHQsIHByb3BfZGV2LCBxdWVyeV9zZWxlY3Rvcl9hbGwsIHJhZiwgcnVuLCBydW5fYWxsLCBzYWZlX25vdF9lcXVhbCwgc2NoZWR1bGVfdXBkYXRlLCBzZWxlY3RfbXVsdGlwbGVfdmFsdWUsIHNlbGVjdF9vcHRpb24sIHNlbGVjdF9vcHRpb25zLCBzZWxlY3RfdmFsdWUsIHNlbGYsIHNldENvbnRleHQsIHNldF9hdHRyaWJ1dGVzLCBzZXRfY3VycmVudF9jb21wb25lbnQsIHNldF9jdXN0b21fZWxlbWVudF9kYXRhLCBzZXRfZGF0YSwgc2V0X2RhdGFfZGV2LCBzZXRfaW5wdXRfdHlwZSwgc2V0X2lucHV0X3ZhbHVlLCBzZXRfbm93LCBzZXRfcmFmLCBzZXRfc3RvcmVfdmFsdWUsIHNldF9zdHlsZSwgc2V0X3N2Z19hdHRyaWJ1dGVzLCBzcGFjZSwgc3ByZWFkLCBzdG9wX3Byb3BhZ2F0aW9uLCBzdWJzY3JpYmUsIHN2Z19lbGVtZW50LCB0ZXh0LCB0aWNrLCB0aW1lX3Jhbmdlc190b19hcnJheSwgdG9fbnVtYmVyLCB0b2dnbGVfY2xhc3MsIHRyYW5zaXRpb25faW4sIHRyYW5zaXRpb25fb3V0LCB1cGRhdGVfa2V5ZWRfZWFjaCwgdXBkYXRlX3Nsb3QsIHVwZGF0ZV9zbG90X3NwcmVhZCwgdmFsaWRhdGVfY29tcG9uZW50LCB2YWxpZGF0ZV9lYWNoX2FyZ3VtZW50LCB2YWxpZGF0ZV9lYWNoX2tleXMsIHZhbGlkYXRlX3Nsb3RzLCB2YWxpZGF0ZV9zdG9yZSwgeGxpbmtfYXR0ciB9O1xuIiwiPHNjcmlwdCBsYW5nPVwidHNcIj5cbiAgaW1wb3J0IHR5cGUgeyBNb21lbnQgfSBmcm9tICdtb21lbnQnO1xuICBpbXBvcnQgeyBDYWxlbmRhciB9IGZyb20gJ29ic2lkaWFuLWNhbGVuZGFyLXVpJztcblxuICBpbXBvcnQgdHlwZSB7IFRhc2tMaW5lIH0gZnJvbSAnc3JjL3Rhc2stbGluZSc7XG5cbiAgLy8gQ3JlYXRpb24gUGFyYW1ldGVyc1xuICBleHBvcnQgbGV0IHRhc2s6IFRhc2tMaW5lO1xuICBleHBvcnQgbGV0IGNsb3NlOiAoKSA9PiB2b2lkO1xuXG4gIC8vIEludGVybmFsIFByb3BlcnRpZXNcbiAgY29uc3QgdG9kYXkgPSB3aW5kb3cubW9tZW50KCk7XG5cbiAgY29uc3Qgb25DbGlja0RheSA9IGFzeW5jIChcbiAgICBkYXRlOiBNb21lbnQsXG4gICAgaXNNZXRhUHJlc3NlZDogYm9vbGVhbixcbiAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgYXdhaXQgdGFzay5tb3ZlKGRhdGUuc3RhcnRPZignZGF5JykpO1xuICAgIGNsb3NlKCk7XG4gIH07XG48L3NjcmlwdD5cblxuPHA+U2VsZWN0IGEgZGF5IGZvciB0aGUgdGFzayB0byBiZSBtb3ZlZCB0bzo8L3A+XG5cbjxDYWxlbmRhclxuICB7b25DbGlja0RheX1cbiAge3RvZGF5fVxuICBzaG93V2Vla051bXM9e2ZhbHNlfVxuICBsb2NhbGVEYXRhPXt0b2RheS5sb2NhbGVEYXRhKCl9XG4vPlxuIiwiPHNjcmlwdCBsYW5nPVwidHNcIj5cbiAgdHlwZSBJQnV0dG9uID0ge1xuICAgIGlkOiBudW1iZXI7XG4gICAgdGV4dD86IHN0cmluZztcbiAgICBpY29uPzogc3RyaW5nO1xuICB9O1xuXG4gIHR5cGUgQnV0dG9uID0ge1xuICAgIGlkOiBudW1iZXI7XG4gICAgdGV4dD86IHN0cmluZztcbiAgICBpY29uPzogc3RyaW5nO1xuICAgIGFjdGl2ZTogYm9vbGVhbjtcbiAgfTtcblxuICBleHBvcnQgbGV0IGJ1dHRvbnM6IElCdXR0b25bXTtcbiAgZXhwb3J0IGxldCBhY3RpdmVCdXR0b25JRHM6IG51bWJlcltdO1xuICBleHBvcnQgbGV0IG9uVXBkYXRlOiAoaWRzOiBudW1iZXJbXSkgPT4gdm9pZDtcbiAgZXhwb3J0IGxldCBleHRyYUJ1dHRvbkNsYXNzOiBzdHJpbmcgPSAnJztcblxuICAkOiBhY3RpdmVDbGFzcyA9ICdtb2QtY3RhICcgKyBleHRyYUJ1dHRvbkNsYXNzO1xuICAkOiBpbmFjdGl2ZUNsYXNzID0gZXh0cmFCdXR0b25DbGFzcztcblxuICAkOiBfYnV0dG9ucyA9IGJ1dHRvbnMubWFwKFxuICAgIChidG4pOiBCdXR0b24gPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IGJ0bi5pZCxcbiAgICAgICAgdGV4dDogYnRuLnRleHQsXG4gICAgICAgIGljb246IGJ0bi5pY29uLFxuICAgICAgICBhY3RpdmU6IGFjdGl2ZUJ1dHRvbklEcy5pbmNsdWRlcyhidG4uaWQpLFxuICAgICAgfTtcbiAgICB9LFxuICApO1xuXG4gIGNvbnN0IG5ld1RvZ2dsZUJ1dHRvbiA9IChidXR0b246IEJ1dHRvbik6ICgoZTogTW91c2VFdmVudCkgPT4gdm9pZCkgPT4ge1xuICAgIHJldHVybiAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgYnV0dG9uLmFjdGl2ZSA9ICFidXR0b24uYWN0aXZlO1xuICAgICAgY29uc3QgdGFyZ2V0ID0gPEhUTUxCdXR0b25FbGVtZW50PmUudGFyZ2V0O1xuICAgICAgaWYgKHRhcmdldC5oYXNDbGFzcygnbW9kLWN0YScpKSB7XG4gICAgICAgIHRhcmdldC5yZW1vdmVDbGFzcygnbW9kLWN0YScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0LmFkZENsYXNzKCdtb2QtY3RhJyk7XG4gICAgICB9XG5cbiAgICAgIG9uVXBkYXRlKF9idXR0b25zLmZpbHRlcigoYikgPT4gYi5hY3RpdmUpLm1hcCgoYikgPT4gYi5pZCkpO1xuICAgIH07XG4gIH07XG48L3NjcmlwdD5cblxueyNlYWNoIF9idXR0b25zIGFzIGJ1dHRvbn1cbiAgPGJ1dHRvblxuICAgIGNsYXNzPXtidXR0b24uYWN0aXZlID8gYWN0aXZlQ2xhc3MgOiBpbmFjdGl2ZUNsYXNzfVxuICAgIG9uOmNsaWNrPXtuZXdUb2dnbGVCdXR0b24oYnV0dG9uKX1cbiAgPlxuICAgIHsjaWYgYnV0dG9uLmljb259XG4gICAgICB7QGh0bWwgYnV0dG9uLmljb259XG4gICAgey9pZn1cbiAgICB7I2lmIGJ1dHRvbi50ZXh0fVxuICAgICAge2J1dHRvbi50ZXh0fVxuICAgIHsvaWZ9XG4gIDwvYnV0dG9uPlxuey9lYWNofVxuIiwiaW1wb3J0IHsgbm9vcCwgc2FmZV9ub3RfZXF1YWwsIHN1YnNjcmliZSwgcnVuX2FsbCwgaXNfZnVuY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbmRleC5tanMnO1xuZXhwb3J0IHsgZ2V0X3N0b3JlX3ZhbHVlIGFzIGdldCB9IGZyb20gJy4uL2ludGVybmFsL2luZGV4Lm1qcyc7XG5cbmNvbnN0IHN1YnNjcmliZXJfcXVldWUgPSBbXTtcbi8qKlxuICogQ3JlYXRlcyBhIGBSZWFkYWJsZWAgc3RvcmUgdGhhdCBhbGxvd3MgcmVhZGluZyBieSBzdWJzY3JpcHRpb24uXG4gKiBAcGFyYW0gdmFsdWUgaW5pdGlhbCB2YWx1ZVxuICogQHBhcmFtIHtTdGFydFN0b3BOb3RpZmllcn1zdGFydCBzdGFydCBhbmQgc3RvcCBub3RpZmljYXRpb25zIGZvciBzdWJzY3JpcHRpb25zXG4gKi9cbmZ1bmN0aW9uIHJlYWRhYmxlKHZhbHVlLCBzdGFydCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHN1YnNjcmliZTogd3JpdGFibGUodmFsdWUsIHN0YXJ0KS5zdWJzY3JpYmVcbiAgICB9O1xufVxuLyoqXG4gKiBDcmVhdGUgYSBgV3JpdGFibGVgIHN0b3JlIHRoYXQgYWxsb3dzIGJvdGggdXBkYXRpbmcgYW5kIHJlYWRpbmcgYnkgc3Vic2NyaXB0aW9uLlxuICogQHBhcmFtIHsqPX12YWx1ZSBpbml0aWFsIHZhbHVlXG4gKiBAcGFyYW0ge1N0YXJ0U3RvcE5vdGlmaWVyPX1zdGFydCBzdGFydCBhbmQgc3RvcCBub3RpZmljYXRpb25zIGZvciBzdWJzY3JpcHRpb25zXG4gKi9cbmZ1bmN0aW9uIHdyaXRhYmxlKHZhbHVlLCBzdGFydCA9IG5vb3ApIHtcbiAgICBsZXQgc3RvcDtcbiAgICBjb25zdCBzdWJzY3JpYmVycyA9IFtdO1xuICAgIGZ1bmN0aW9uIHNldChuZXdfdmFsdWUpIHtcbiAgICAgICAgaWYgKHNhZmVfbm90X2VxdWFsKHZhbHVlLCBuZXdfdmFsdWUpKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IG5ld192YWx1ZTtcbiAgICAgICAgICAgIGlmIChzdG9wKSB7IC8vIHN0b3JlIGlzIHJlYWR5XG4gICAgICAgICAgICAgICAgY29uc3QgcnVuX3F1ZXVlID0gIXN1YnNjcmliZXJfcXVldWUubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3Vic2NyaWJlcnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IHN1YnNjcmliZXJzW2ldO1xuICAgICAgICAgICAgICAgICAgICBzWzFdKCk7XG4gICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXJfcXVldWUucHVzaChzLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChydW5fcXVldWUpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdWJzY3JpYmVyX3F1ZXVlLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyX3F1ZXVlW2ldWzBdKHN1YnNjcmliZXJfcXVldWVbaSArIDFdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyX3F1ZXVlLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZShmbikge1xuICAgICAgICBzZXQoZm4odmFsdWUpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc3Vic2NyaWJlKHJ1biwgaW52YWxpZGF0ZSA9IG5vb3ApIHtcbiAgICAgICAgY29uc3Qgc3Vic2NyaWJlciA9IFtydW4sIGludmFsaWRhdGVdO1xuICAgICAgICBzdWJzY3JpYmVycy5wdXNoKHN1YnNjcmliZXIpO1xuICAgICAgICBpZiAoc3Vic2NyaWJlcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBzdG9wID0gc3RhcnQoc2V0KSB8fCBub29wO1xuICAgICAgICB9XG4gICAgICAgIHJ1bih2YWx1ZSk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHN1YnNjcmliZXJzLmluZGV4T2Yoc3Vic2NyaWJlcik7XG4gICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdWJzY3JpYmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBzdG9wKCk7XG4gICAgICAgICAgICAgICAgc3RvcCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7IHNldCwgdXBkYXRlLCBzdWJzY3JpYmUgfTtcbn1cbmZ1bmN0aW9uIGRlcml2ZWQoc3RvcmVzLCBmbiwgaW5pdGlhbF92YWx1ZSkge1xuICAgIGNvbnN0IHNpbmdsZSA9ICFBcnJheS5pc0FycmF5KHN0b3Jlcyk7XG4gICAgY29uc3Qgc3RvcmVzX2FycmF5ID0gc2luZ2xlXG4gICAgICAgID8gW3N0b3Jlc11cbiAgICAgICAgOiBzdG9yZXM7XG4gICAgY29uc3QgYXV0byA9IGZuLmxlbmd0aCA8IDI7XG4gICAgcmV0dXJuIHJlYWRhYmxlKGluaXRpYWxfdmFsdWUsIChzZXQpID0+IHtcbiAgICAgICAgbGV0IGluaXRlZCA9IGZhbHNlO1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBbXTtcbiAgICAgICAgbGV0IHBlbmRpbmcgPSAwO1xuICAgICAgICBsZXQgY2xlYW51cCA9IG5vb3A7XG4gICAgICAgIGNvbnN0IHN5bmMgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAocGVuZGluZykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGZuKHNpbmdsZSA/IHZhbHVlc1swXSA6IHZhbHVlcywgc2V0KTtcbiAgICAgICAgICAgIGlmIChhdXRvKSB7XG4gICAgICAgICAgICAgICAgc2V0KHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjbGVhbnVwID0gaXNfZnVuY3Rpb24ocmVzdWx0KSA/IHJlc3VsdCA6IG5vb3A7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHVuc3Vic2NyaWJlcnMgPSBzdG9yZXNfYXJyYXkubWFwKChzdG9yZSwgaSkgPT4gc3Vic2NyaWJlKHN0b3JlLCAodmFsdWUpID0+IHtcbiAgICAgICAgICAgIHZhbHVlc1tpXSA9IHZhbHVlO1xuICAgICAgICAgICAgcGVuZGluZyAmPSB+KDEgPDwgaSk7XG4gICAgICAgICAgICBpZiAoaW5pdGVkKSB7XG4gICAgICAgICAgICAgICAgc3luYygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgICAgICBwZW5kaW5nIHw9ICgxIDw8IGkpO1xuICAgICAgICB9KSk7XG4gICAgICAgIGluaXRlZCA9IHRydWU7XG4gICAgICAgIHN5bmMoKTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHN0b3AoKSB7XG4gICAgICAgICAgICBydW5fYWxsKHVuc3Vic2NyaWJlcnMpO1xuICAgICAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICB9O1xuICAgIH0pO1xufVxuXG5leHBvcnQgeyBkZXJpdmVkLCByZWFkYWJsZSwgd3JpdGFibGUgfTtcbiIsIjxzY3JpcHQgbGFuZz1cInRzXCI+XG4gIGltcG9ydCB7IHdyaXRhYmxlIH0gZnJvbSAnc3ZlbHRlL3N0b3JlJztcblxuICBleHBvcnQgbGV0IG9uVXBkYXRlOiAoc2VsZWN0ZWQ6IHsgd2Vlazogc3RyaW5nOyB3ZWVrRGF5OiBzdHJpbmcgfVtdKSA9PiB2b2lkO1xuICBleHBvcnQgbGV0IGluaXRpYWxTZWxlY3RlZDogeyB3ZWVrOiBzdHJpbmc7IHdlZWtEYXk6IHN0cmluZyB9W107XG5cbiAgLy8gQnkgdXNpbmcgYSBTdG9yZSwgd2UgY2FuIGJpbmQgdG8gaXQgZWFzaWVyIGluIHRoZSB7I2VhY2h9IGJsb2NrIGJlbG93LlxuICBjb25zdCBzZWxlY3RlZFdlZWtzID0gd3JpdGFibGUoXG4gICAgaW5pdGlhbFNlbGVjdGVkLm1hcCgoeyB3ZWVrLCB3ZWVrRGF5IH0sIGkpID0+IHtcbiAgICAgIHJldHVybiB7IGlkOiBpLCB3ZWVrOiB3ZWVrLCB3ZWVrRGF5OiB3ZWVrRGF5IH07XG4gICAgfSksXG4gICk7XG5cbiAgLy8gU2VuZCB0aGUgdXBkYXRlcyBiYWNrIHVwc3RyZWFtLlxuICBzZWxlY3RlZFdlZWtzLnN1YnNjcmliZSgodXBkYXRlZFZhbCkgPT4ge1xuICAgIG9uVXBkYXRlKFxuICAgICAgdXBkYXRlZFZhbC5tYXAoKHsgd2Vlaywgd2Vla0RheSB9KSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgd2Vlazogd2VlayxcbiAgICAgICAgICB3ZWVrRGF5OiB3ZWVrRGF5LFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgKTtcbiAgfSk7XG5cbiAgLy8gQ3JlYXRlIGEgZnVuY3Rpb24gd2hpY2ggd2hlbiBjYWxsZWQgd2lsbCByZW1vdmUgdGhlIHByb3ZpZGVkIElEIGZyb20gdGhlXG4gIC8vIGxpc3Qgb2Ygc2VsZWN0ZWQgd2Vla3MuXG4gIGNvbnN0IG5ld1JlbW92ZVdlZWsgPSAocmVtb3ZlSUQ6IG51bWJlcik6ICgoKSA9PiB2b2lkKSA9PiB7XG4gICAgcmV0dXJuICgpOiB2b2lkID0+IHtcbiAgICAgIHNlbGVjdGVkV2Vla3MudXBkYXRlKChjdXJyKSA9PiBjdXJyLmZpbHRlcigoeyBpZCB9KSA9PiBpZCAhPT0gcmVtb3ZlSUQpKTtcbiAgICB9O1xuICB9O1xuXG4gIC8vIEFkZCBhIFwiRmlyc3QgTW9uZGF5XCIgaXRlbSB0byB0aGUgbGlzdC5cbiAgY29uc3QgYWRkV2VlayA9ICgpOiB2b2lkID0+IHtcbiAgICBzZWxlY3RlZFdlZWtzLnVwZGF0ZSgoY3VycikgPT4ge1xuICAgICAgY29uc3QgbWF4SUQgPSBjdXJyLnJlZHVjZSgocHJldiwgeyBpZCB9KSA9PiBNYXRoLm1heChwcmV2LCBpZCksIDApO1xuICAgICAgY3Vyci5wdXNoKHtcbiAgICAgICAgaWQ6IG1heElEICsgMSxcbiAgICAgICAgd2VlazogJzEnLFxuICAgICAgICB3ZWVrRGF5OiAnMCcsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBjdXJyO1xuICAgIH0pO1xuICB9O1xuXG4gIC8vIElmIHRoZSBsaXN0IGV2ZXJ5IGhhcyAwIGl0ZW1zIChvbmx5IGlmIGluaXRpYWxpemVkIGVtcHR5KSwgdGhlbiBhZGQgb25lLlxuICBpZiAoJHNlbGVjdGVkV2Vla3MubGVuZ3RoID09PSAwKSB7XG4gICAgYWRkV2VlaygpO1xuICB9XG48L3NjcmlwdD5cblxuPGRpdiBpZD1cInNsYXRlZC1zZWxlY3RlZC13ZWVrc1wiPlxuICA8dWw+XG4gICAgeyNlYWNoICRzZWxlY3RlZFdlZWtzIGFzIHdlZWt9XG4gICAgICA8bGk+XG4gICAgICAgIDxzZWxlY3QgY2xhc3M9XCJkcm9wZG93blwiIGJpbmQ6dmFsdWU9e3dlZWsud2Vla30+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjFcIj5GaXJzdDwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIyXCI+U2Vjb25kPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjNcIj5UaGlyZDwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCI0XCI+Rm91cnRoPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjVcIj5GaWZ0aDwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCItMVwiPkxhc3Q8L29wdGlvbj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgIDxzZWxlY3QgY2xhc3M9XCJkcm9wZG93blwiIGJpbmQ6dmFsdWU9e3dlZWsud2Vla0RheX0+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjZcIj5TdW5kYXk8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiMFwiPk1vbmRheTwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIxXCI+VHVlc2RheTwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIyXCI+V2VkbmVzZGF5PC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjNcIj5UaHVyc2RheTwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCI0XCI+RnJpZGF5PC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjVcIj5TYXR1cmRheTwvb3B0aW9uPlxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgeyNpZiAkc2VsZWN0ZWRXZWVrcy5sZW5ndGggPiAxfVxuICAgICAgICAgIDxidXR0b24gb246Y2xpY2s9e25ld1JlbW92ZVdlZWsod2Vlay5pZCl9Pi08L2J1dHRvbj5cbiAgICAgICAgey9pZn1cbiAgICAgIDwvbGk+XG4gICAgey9lYWNofVxuICA8L3VsPlxuICA8YnV0dG9uIG9uOmNsaWNrPXthZGRXZWVrfT4rPC9idXR0b24+XG48L2Rpdj5cbiIsIjxzY3JpcHQgbGFuZz1cInRzXCI+XG4gIGltcG9ydCBCdXR0b25Hcm91cCBmcm9tICcuL0J1dHRvbkdyb3VwLnN2ZWx0ZSc7XG4gIGltcG9ydCBXZWVrRGF5c09mTW9udGhTZWxlY3RvciBmcm9tICcuL1dlZWtEYXlzT2ZNb250aFNlbGVjdG9yLnN2ZWx0ZSc7XG4gIGltcG9ydCB7IEZyZXF1ZW5jeSB9IGZyb20gJ3NyYy9yZXBlYXQnO1xuICBpbXBvcnQgdHlwZSB7IFRhc2tMaW5lIH0gZnJvbSAnc3JjL3Rhc2stbGluZSc7XG5cbiAgLy8gUmVwZXRpdGlvbiB0eXBlczpcbiAgLy8gLSBEYWlseSB3aXRoIGludGVydmFsXG4gIC8vIC0gV2Vla2x5IHdpdGggd2Vla2RheSBzZWxlY3RvciBhbmQgaW50ZXJ2YWxcbiAgLy8gLSBNb250aGx5IHdpdGggZGF5IG9mIG1vbnRoIHNlbGN0b3IgKGluY2x1ZGluZyBcImxhc3QgZGF5XCIpIGFuZCBpbnRlcnZhbFxuICAvLyAtIE1vbnRobHkgd2l0aCBbMS01LCBsYXN0XSwgd2Vla2RheSBzZWxlY3RvciwgYW5kIGludGVydmFsXG4gIC8vIC0gWWVhcmx5IHdpdGggbW9udGggc2VsZWN0b3IsIFsxLTUsIGxhc3RdLCB3ZWVrZGF5IHNlbGVjdG9yLCBhbmQgaW50ZXJ2YWxcbiAgLy8gLSBBbGwgb2YgdGhlIGFib3ZlIHdpdGg6XG4gIC8vICAgLSBcIlVudGlsLi4uXCJcbiAgLy8gICAtIFwiRm9yIC4uLiBvY2N1cmVuY2VzXCJcblxuICAvLyBUaXBzOlxuICAvLyAtIGRheSBvZiBtb250aCBjYW4gYmUgc2VsZWN0ZWQgd2l0aCBuZWdhdGl2ZXMgKC0xID0gbGFzdCBkYXkpXG4gIC8vIC0gbXVsdGlwbGUgZGF5cyBvZiBtb250aCBjYW4gYmUgc2VsZWN0ZWQgKDE1LC0xKVxuICAvLyAtIG50aCB3ZWVrZGF5IGlzIHJlcHJlc2VudGVkIGFzICcxRlInIG9yICctMVNVJ1xuICAvLyAtIExvdHMgbW9yZSBleGFtcGxlczogaHR0cHM6Ly93d3cua2FuemFraS5jb20vZG9jcy9pY2FsL3JydWxlLmh0bWxcblxuICBleHBvcnQgbGV0IHRhc2s6IFRhc2tMaW5lO1xuICBleHBvcnQgbGV0IGNsb3NlOiAoKSA9PiB2b2lkO1xuXG4gIC8vIFRPRE86IFN1cHBvcnQgbG9jYWxpemF0aW9uc1xuICBjb25zdCB3ZWVrZGF5cyA9IFtcbiAgICB7IGlkOiA2LCB0ZXh0OiAnUycgfSxcbiAgICB7IGlkOiAwLCB0ZXh0OiAnTScgfSxcbiAgICB7IGlkOiAxLCB0ZXh0OiAnVCcgfSxcbiAgICB7IGlkOiAyLCB0ZXh0OiAnVycgfSxcbiAgICB7IGlkOiAzLCB0ZXh0OiAnVCcgfSxcbiAgICB7IGlkOiA0LCB0ZXh0OiAnRicgfSxcbiAgICB7IGlkOiA1LCB0ZXh0OiAnUycgfSxcbiAgXTtcblxuICAvLyBUT0RPOiBTdXBwb3J0IGxvY2FsaXphdGlvbnNcbiAgY29uc3QgbW9udGhzID0gW1xuICAgIHsgaWQ6IDEsIHRleHQ6ICdKYW4nIH0sXG4gICAgeyBpZDogMiwgdGV4dDogJ0ZlYicgfSxcbiAgICB7IGlkOiAzLCB0ZXh0OiAnTWFyJyB9LFxuICAgIHsgaWQ6IDQsIHRleHQ6ICdBcHInIH0sXG4gICAgeyBpZDogNSwgdGV4dDogJ01heScgfSxcbiAgICB7IGlkOiA2LCB0ZXh0OiAnSnVuJyB9LFxuICAgIHsgaWQ6IDcsIHRleHQ6ICdKdWwnIH0sXG4gICAgeyBpZDogOCwgdGV4dDogJ0F1ZycgfSxcbiAgICB7IGlkOiA5LCB0ZXh0OiAnU2VwJyB9LFxuICAgIHsgaWQ6IDEwLCB0ZXh0OiAnT2N0JyB9LFxuICAgIHsgaWQ6IDExLCB0ZXh0OiAnTm92JyB9LFxuICAgIHsgaWQ6IDEyLCB0ZXh0OiAnRGVjJyB9LFxuICBdO1xuXG4gIGNvbnN0IHJlcGVhdGVyID0gdGFzay5yZXBlYXRlcjtcblxuICBjb25zdCBzYXZlID0gKCkgPT4ge1xuICAgIGNvbnNvbGUuZGVidWcoJ1VwZGF0aW5nIHRhc2suLi4nKTtcbiAgICB0YXNrLmhhbmRsZVJlcGVhdGVyVXBkYXRlZChyZXBlYXRlcik7XG4gICAgY2xvc2UoKTtcbiAgfTtcblxuICBjb25zdCBzdGFydGluZ1JlcGVhdFR5cGUgPVxuICAgIHRhc2sucmVwZWF0ZXIuZ2V0V2Vla0RheXNPZk1vbnRoKCkubGVuZ3RoID4gMCA/ICdldmVyeScgOiAnb25UaGUnO1xuICBsZXQgbW9udGhseVJlcGVhdFR5cGUgPSBzdGFydGluZ1JlcGVhdFR5cGU7XG5cbiAgY29uc29sZS5kZWJ1Zyh0YXNrKTtcbjwvc2NyaXB0PlxuXG48ZGl2IGNsYXNzPVwic2xhdGVkLW1vZGFsXCI+XG4gIDxoMT5UYXNrIFJlcGV0aXRpb248L2gxPlxuICA8ZGl2PlxuICAgIDxzcGFuPkV2ZXJ5PC9zcGFuPlxuICAgIDxpbnB1dFxuICAgICAgaWQ9XCJzbGF0ZWQtaW50ZXJ2YWwtc2VsZWN0b3JcIlxuICAgICAgYmluZDp2YWx1ZT17JHJlcGVhdGVyLmludGVydmFsfVxuICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICBtaW49XCIxXCIgLz5cblxuICAgIDwhLS0gc3ZlbHRlLWlnbm9yZSBhMTF5LW5vLW9uY2hhbmdlIC0tPlxuICAgIDxzZWxlY3RcbiAgICAgIGlkPVwic2xhdGVkLWZyZXF1ZW5jeS1zZWxlY3RvclwiXG4gICAgICBjbGFzcz1cImRyb3Bkb3duXCJcbiAgICAgIGJpbmQ6dmFsdWU9eyRyZXBlYXRlci5mcmVxdWVuY3l9PlxuICAgICAgPG9wdGlvbiB2YWx1ZT17RnJlcXVlbmN5LkRhaWx5fT5cbiAgICAgICAgeyRyZXBlYXRlci5pbnRlcnZhbCA+IDEgPyAnRGF5cycgOiAnRGF5J31cbiAgICAgIDwvb3B0aW9uPlxuICAgICAgPG9wdGlvbiB2YWx1ZT17RnJlcXVlbmN5LldlZWtseX0+XG4gICAgICAgIHskcmVwZWF0ZXIuaW50ZXJ2YWwgPiAxID8gJ1dlZWtzJyA6ICdXZWVrJ31cbiAgICAgIDwvb3B0aW9uPlxuICAgICAgPG9wdGlvbiB2YWx1ZT17RnJlcXVlbmN5Lk1vbnRobHl9PlxuICAgICAgICB7JHJlcGVhdGVyLmludGVydmFsID4gMSA/ICdNb250aHMnIDogJ01vbnRoJ31cbiAgICAgIDwvb3B0aW9uPlxuICAgICAgPG9wdGlvbiB2YWx1ZT17RnJlcXVlbmN5LlllYXJseX0+XG4gICAgICAgIHskcmVwZWF0ZXIuaW50ZXJ2YWwgPiAxID8gJ1llYXJzJyA6ICdZZWFyJ31cbiAgICAgIDwvb3B0aW9uPlxuICAgIDwvc2VsZWN0PlxuXG4gICAgeyNpZiAkcmVwZWF0ZXIuZnJlcXVlbmN5ID09PSBGcmVxdWVuY3kuV2Vla2x5fVxuICAgICAgPGRpdiBjbGFzcz1cInNsYXRlZC1kYXlzLWJ0bi1ncm91cFwiPlxuICAgICAgICA8QnV0dG9uR3JvdXBcbiAgICAgICAgICBidXR0b25zPXt3ZWVrZGF5c31cbiAgICAgICAgICBhY3RpdmVCdXR0b25JRHM9e3JlcGVhdGVyLmRheXNPZldlZWt9XG4gICAgICAgICAgb25VcGRhdGU9e3JlcGVhdGVyLnNldERheXNPZldlZWt9IC8+XG4gICAgICA8L2Rpdj5cbiAgICB7L2lmfVxuXG4gICAgeyNpZiAkcmVwZWF0ZXIuZnJlcXVlbmN5ID09PSBGcmVxdWVuY3kuWWVhcmx5fVxuICAgICAgPGRpdiBjbGFzcz1cInNsYXRlZC1tb250aHMtYnRuLWdyb3VwXCI+XG4gICAgICAgIDxCdXR0b25Hcm91cFxuICAgICAgICAgIGJ1dHRvbnM9e21vbnRoc31cbiAgICAgICAgICBhY3RpdmVCdXR0b25JRHM9e3JlcGVhdGVyLm1vbnRoc09mWWVhcn1cbiAgICAgICAgICBvblVwZGF0ZT17cmVwZWF0ZXIuc2V0TW9udGhzT2ZZZWFyfSAvPlxuICAgICAgPC9kaXY+XG4gICAgey9pZn1cblxuICAgIHsjaWYgJHJlcGVhdGVyLmZyZXF1ZW5jeSA9PT0gRnJlcXVlbmN5Lk1vbnRobHkgfHwgJHJlcGVhdGVyLmZyZXF1ZW5jeSA9PT0gRnJlcXVlbmN5LlllYXJseX1cbiAgICAgIDxkaXY+XG4gICAgICAgIDxzZWxlY3QgY2xhc3M9XCJkcm9wZG93blwiIGJpbmQ6dmFsdWU9e21vbnRobHlSZXBlYXRUeXBlfT5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPXsnb25UaGUnfT5vbiB0aGU8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPXsnZXZlcnknfT5ldmVyeTwvb3B0aW9uPlxuICAgICAgICA8L3NlbGVjdD5cblxuICAgICAgICB7I2lmIG1vbnRobHlSZXBlYXRUeXBlID09ICdvblRoZSd9XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBpZD1cInNsYXRlZC1vbnRoZS1zZWxlY3RvclwiXG4gICAgICAgICAgICBiaW5kOnZhbHVlPXskcmVwZWF0ZXIuZGF5T2ZNb250aH1cbiAgICAgICAgICAgIGRpc2FibGVkPXskcmVwZWF0ZXIuZGF5T2ZNb250aCA9PT0gLTF9XG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjFcIlxuICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiIC8+XG4gICAgICAgICAgPGxhYmVsPlxuICAgICAgICAgICAgPGlucHV0IGJpbmQ6Y2hlY2tlZD17JHJlcGVhdGVyLmxhc3REYXlPZk1vbnRofSB0eXBlPVwiY2hlY2tib3hcIiAvPlxuICAgICAgICAgICAgTGFzdCBEYXlcbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICB7OmVsc2V9XG4gICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICA8V2Vla0RheXNPZk1vbnRoU2VsZWN0b3JcbiAgICAgICAgICAgICAgaW5pdGlhbFNlbGVjdGVkPXtyZXBlYXRlci5nZXRXZWVrRGF5c09mTW9udGgoKX1cbiAgICAgICAgICAgICAgb25VcGRhdGU9e3JlcGVhdGVyLnNldFdlZWtEYXlzT2ZNb250aH0gLz5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIHsvaWZ9XG4gICAgICA8L2Rpdj5cbiAgICB7L2lmfVxuICA8L2Rpdj5cblxuICA8aDI+UHJldmlldzwvaDI+XG5cbiAgPGlucHV0XG4gICAgaWQ9XCJzbGF0ZWQtcmVwZXRpdGlvbi1wcmV2aWV3XCJcbiAgICBkaXNhYmxlZFxuICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICB2YWx1ZT17JHJlcGVhdGVyLnRvVGV4dCgpfSAvPlxuXG4gIDxidXR0b24gaWQ9XCJzbGF0ZWQtc2F2ZS1yZXBldGl0aW9uLWNvbmZpZ1wiIG9uOmNsaWNrPXtzYXZlfT4gU2F2ZSA8L2J1dHRvbj5cbjwvZGl2PlxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG52YXIgb2JzaWRpYW4gPSByZXF1aXJlKCdvYnNpZGlhbicpO1xuXG5jb25zdCBERUZBVUxUX0RBSUxZX05PVEVfRk9STUFUID0gXCJZWVlZLU1NLUREXCI7XG5jb25zdCBERUZBVUxUX1dFRUtMWV9OT1RFX0ZPUk1BVCA9IFwiZ2dnZy1bV113d1wiO1xuY29uc3QgREVGQVVMVF9NT05USExZX05PVEVfRk9STUFUID0gXCJZWVlZLU1NXCI7XG5cbmZ1bmN0aW9uIHNob3VsZFVzZVBlcmlvZGljTm90ZXNTZXR0aW5ncyhwZXJpb2RpY2l0eSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgY29uc3QgcGVyaW9kaWNOb3RlcyA9IHdpbmRvdy5hcHAucGx1Z2lucy5nZXRQbHVnaW4oXCJwZXJpb2RpYy1ub3Rlc1wiKTtcbiAgICByZXR1cm4gcGVyaW9kaWNOb3RlcyAmJiBwZXJpb2RpY05vdGVzLnNldHRpbmdzPy5bcGVyaW9kaWNpdHldPy5lbmFibGVkO1xufVxuLyoqXG4gKiBSZWFkIHRoZSB1c2VyIHNldHRpbmdzIGZvciB0aGUgYGRhaWx5LW5vdGVzYCBwbHVnaW5cbiAqIHRvIGtlZXAgYmVoYXZpb3Igb2YgY3JlYXRpbmcgYSBuZXcgbm90ZSBpbi1zeW5jLlxuICovXG5mdW5jdGlvbiBnZXREYWlseU5vdGVTZXR0aW5ncygpIHtcbiAgICB0cnkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICBjb25zdCB7IGludGVybmFsUGx1Z2lucywgcGx1Z2lucyB9ID0gd2luZG93LmFwcDtcbiAgICAgICAgaWYgKHNob3VsZFVzZVBlcmlvZGljTm90ZXNTZXR0aW5ncyhcImRhaWx5XCIpKSB7XG4gICAgICAgICAgICBjb25zdCB7IGZvcm1hdCwgZm9sZGVyLCB0ZW1wbGF0ZSB9ID0gcGx1Z2lucy5nZXRQbHVnaW4oXCJwZXJpb2RpYy1ub3Rlc1wiKT8uc2V0dGluZ3M/LmRhaWx5IHx8IHt9O1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBmb3JtYXQ6IGZvcm1hdCB8fCBERUZBVUxUX0RBSUxZX05PVEVfRk9STUFULFxuICAgICAgICAgICAgICAgIGZvbGRlcjogZm9sZGVyPy50cmltKCkgfHwgXCJcIixcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogdGVtcGxhdGU/LnRyaW0oKSB8fCBcIlwiLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IGZvbGRlciwgZm9ybWF0LCB0ZW1wbGF0ZSB9ID0gaW50ZXJuYWxQbHVnaW5zLmdldFBsdWdpbkJ5SWQoXCJkYWlseS1ub3Rlc1wiKT8uaW5zdGFuY2U/Lm9wdGlvbnMgfHwge307XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmb3JtYXQ6IGZvcm1hdCB8fCBERUZBVUxUX0RBSUxZX05PVEVfRk9STUFULFxuICAgICAgICAgICAgZm9sZGVyOiBmb2xkZXI/LnRyaW0oKSB8fCBcIlwiLFxuICAgICAgICAgICAgdGVtcGxhdGU6IHRlbXBsYXRlPy50cmltKCkgfHwgXCJcIixcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmluZm8oXCJObyBjdXN0b20gZGFpbHkgbm90ZSBzZXR0aW5ncyBmb3VuZCFcIiwgZXJyKTtcbiAgICB9XG59XG4vKipcbiAqIFJlYWQgdGhlIHVzZXIgc2V0dGluZ3MgZm9yIHRoZSBgd2Vla2x5LW5vdGVzYCBwbHVnaW5cbiAqIHRvIGtlZXAgYmVoYXZpb3Igb2YgY3JlYXRpbmcgYSBuZXcgbm90ZSBpbi1zeW5jLlxuICovXG5mdW5jdGlvbiBnZXRXZWVrbHlOb3RlU2V0dGluZ3MoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgY29uc3QgcGx1Z2luTWFuYWdlciA9IHdpbmRvdy5hcHAucGx1Z2lucztcbiAgICAgICAgY29uc3QgY2FsZW5kYXJTZXR0aW5ncyA9IHBsdWdpbk1hbmFnZXIuZ2V0UGx1Z2luKFwiY2FsZW5kYXJcIik/Lm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IHBlcmlvZGljTm90ZXNTZXR0aW5ncyA9IHBsdWdpbk1hbmFnZXIuZ2V0UGx1Z2luKFwicGVyaW9kaWMtbm90ZXNcIilcbiAgICAgICAgICAgID8uc2V0dGluZ3M/LndlZWtseTtcbiAgICAgICAgaWYgKHNob3VsZFVzZVBlcmlvZGljTm90ZXNTZXR0aW5ncyhcIndlZWtseVwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBmb3JtYXQ6IHBlcmlvZGljTm90ZXNTZXR0aW5ncy5mb3JtYXQgfHwgREVGQVVMVF9XRUVLTFlfTk9URV9GT1JNQVQsXG4gICAgICAgICAgICAgICAgZm9sZGVyOiBwZXJpb2RpY05vdGVzU2V0dGluZ3MuZm9sZGVyPy50cmltKCkgfHwgXCJcIixcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogcGVyaW9kaWNOb3Rlc1NldHRpbmdzLnRlbXBsYXRlPy50cmltKCkgfHwgXCJcIixcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSBjYWxlbmRhclNldHRpbmdzIHx8IHt9O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZm9ybWF0OiBzZXR0aW5ncy53ZWVrbHlOb3RlRm9ybWF0IHx8IERFRkFVTFRfV0VFS0xZX05PVEVfRk9STUFULFxuICAgICAgICAgICAgZm9sZGVyOiBzZXR0aW5ncy53ZWVrbHlOb3RlRm9sZGVyPy50cmltKCkgfHwgXCJcIixcbiAgICAgICAgICAgIHRlbXBsYXRlOiBzZXR0aW5ncy53ZWVrbHlOb3RlVGVtcGxhdGU/LnRyaW0oKSB8fCBcIlwiLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhcIk5vIGN1c3RvbSB3ZWVrbHkgbm90ZSBzZXR0aW5ncyBmb3VuZCFcIiwgZXJyKTtcbiAgICB9XG59XG4vKipcbiAqIFJlYWQgdGhlIHVzZXIgc2V0dGluZ3MgZm9yIHRoZSBgcGVyaW9kaWMtbm90ZXNgIHBsdWdpblxuICogdG8ga2VlcCBiZWhhdmlvciBvZiBjcmVhdGluZyBhIG5ldyBub3RlIGluLXN5bmMuXG4gKi9cbmZ1bmN0aW9uIGdldE1vbnRobHlOb3RlU2V0dGluZ3MoKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCBwbHVnaW5NYW5hZ2VyID0gd2luZG93LmFwcC5wbHVnaW5zO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gKHNob3VsZFVzZVBlcmlvZGljTm90ZXNTZXR0aW5ncyhcIm1vbnRobHlcIikgJiZcbiAgICAgICAgICAgIHBsdWdpbk1hbmFnZXIuZ2V0UGx1Z2luKFwicGVyaW9kaWMtbm90ZXNcIik/LnNldHRpbmdzPy5tb250aGx5KSB8fFxuICAgICAgICAgICAge307XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmb3JtYXQ6IHNldHRpbmdzLmZvcm1hdCB8fCBERUZBVUxUX01PTlRITFlfTk9URV9GT1JNQVQsXG4gICAgICAgICAgICBmb2xkZXI6IHNldHRpbmdzLmZvbGRlcj8udHJpbSgpIHx8IFwiXCIsXG4gICAgICAgICAgICB0ZW1wbGF0ZTogc2V0dGluZ3MudGVtcGxhdGU/LnRyaW0oKSB8fCBcIlwiLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhcIk5vIGN1c3RvbSBtb250aGx5IG5vdGUgc2V0dGluZ3MgZm91bmQhXCIsIGVycik7XG4gICAgfVxufVxuXG4vLyBDcmVkaXQ6IEBjcmVhdGlvbml4L3BhdGguanNcbmZ1bmN0aW9uIGpvaW4oLi4ucGFydFNlZ21lbnRzKSB7XG4gICAgLy8gU3BsaXQgdGhlIGlucHV0cyBpbnRvIGEgbGlzdCBvZiBwYXRoIGNvbW1hbmRzLlxuICAgIGxldCBwYXJ0cyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwLCBsID0gcGFydFNlZ21lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBwYXJ0cyA9IHBhcnRzLmNvbmNhdChwYXJ0U2VnbWVudHNbaV0uc3BsaXQoXCIvXCIpKTtcbiAgICB9XG4gICAgLy8gSW50ZXJwcmV0IHRoZSBwYXRoIGNvbW1hbmRzIHRvIGdldCB0aGUgbmV3IHJlc29sdmVkIHBhdGguXG4gICAgY29uc3QgbmV3UGFydHMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBjb25zdCBwYXJ0ID0gcGFydHNbaV07XG4gICAgICAgIC8vIFJlbW92ZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBzbGFzaGVzXG4gICAgICAgIC8vIEFsc28gcmVtb3ZlIFwiLlwiIHNlZ21lbnRzXG4gICAgICAgIGlmICghcGFydCB8fCBwYXJ0ID09PSBcIi5cIilcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAvLyBQdXNoIG5ldyBwYXRoIHNlZ21lbnRzLlxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBuZXdQYXJ0cy5wdXNoKHBhcnQpO1xuICAgIH1cbiAgICAvLyBQcmVzZXJ2ZSB0aGUgaW5pdGlhbCBzbGFzaCBpZiB0aGVyZSB3YXMgb25lLlxuICAgIGlmIChwYXJ0c1swXSA9PT0gXCJcIilcbiAgICAgICAgbmV3UGFydHMudW5zaGlmdChcIlwiKTtcbiAgICAvLyBUdXJuIGJhY2sgaW50byBhIHNpbmdsZSBzdHJpbmcgcGF0aC5cbiAgICByZXR1cm4gbmV3UGFydHMuam9pbihcIi9cIik7XG59XG5mdW5jdGlvbiBiYXNlbmFtZShmdWxsUGF0aCkge1xuICAgIGxldCBiYXNlID0gZnVsbFBhdGguc3Vic3RyaW5nKGZ1bGxQYXRoLmxhc3RJbmRleE9mKFwiL1wiKSArIDEpO1xuICAgIGlmIChiYXNlLmxhc3RJbmRleE9mKFwiLlwiKSAhPSAtMSlcbiAgICAgICAgYmFzZSA9IGJhc2Uuc3Vic3RyaW5nKDAsIGJhc2UubGFzdEluZGV4T2YoXCIuXCIpKTtcbiAgICByZXR1cm4gYmFzZTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZUZvbGRlckV4aXN0cyhwYXRoKSB7XG4gICAgY29uc3QgZGlycyA9IHBhdGgucmVwbGFjZSgvXFxcXC9nLCBcIi9cIikuc3BsaXQoXCIvXCIpO1xuICAgIGRpcnMucG9wKCk7IC8vIHJlbW92ZSBiYXNlbmFtZVxuICAgIGlmIChkaXJzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBkaXIgPSBqb2luKC4uLmRpcnMpO1xuICAgICAgICBpZiAoIXdpbmRvdy5hcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKGRpcikpIHtcbiAgICAgICAgICAgIGF3YWl0IHdpbmRvdy5hcHAudmF1bHQuY3JlYXRlRm9sZGVyKGRpcik7XG4gICAgICAgIH1cbiAgICB9XG59XG5hc3luYyBmdW5jdGlvbiBnZXROb3RlUGF0aChkaXJlY3RvcnksIGZpbGVuYW1lKSB7XG4gICAgaWYgKCFmaWxlbmFtZS5lbmRzV2l0aChcIi5tZFwiKSkge1xuICAgICAgICBmaWxlbmFtZSArPSBcIi5tZFwiO1xuICAgIH1cbiAgICBjb25zdCBwYXRoID0gb2JzaWRpYW4ubm9ybWFsaXplUGF0aChqb2luKGRpcmVjdG9yeSwgZmlsZW5hbWUpKTtcbiAgICBhd2FpdCBlbnN1cmVGb2xkZXJFeGlzdHMocGF0aCk7XG4gICAgcmV0dXJuIHBhdGg7XG59XG5hc3luYyBmdW5jdGlvbiBnZXRUZW1wbGF0ZUluZm8odGVtcGxhdGUpIHtcbiAgICBjb25zdCB7IG1ldGFkYXRhQ2FjaGUsIHZhdWx0IH0gPSB3aW5kb3cuYXBwO1xuICAgIGNvbnN0IHRlbXBsYXRlUGF0aCA9IG9ic2lkaWFuLm5vcm1hbGl6ZVBhdGgodGVtcGxhdGUpO1xuICAgIGlmICh0ZW1wbGF0ZVBhdGggPT09IFwiL1wiKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoW1wiXCIsIG51bGxdKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdGVtcGxhdGVGaWxlID0gbWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdCh0ZW1wbGF0ZVBhdGgsIFwiXCIpO1xuICAgICAgICBjb25zdCBjb250ZW50cyA9IGF3YWl0IHZhdWx0LmNhY2hlZFJlYWQodGVtcGxhdGVGaWxlKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgY29uc3QgSUZvbGRJbmZvID0gd2luZG93LmFwcC5mb2xkTWFuYWdlci5sb2FkKHRlbXBsYXRlRmlsZSk7XG4gICAgICAgIHJldHVybiBbY29udGVudHMsIElGb2xkSW5mb107XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHJlYWQgdGhlIGRhaWx5IG5vdGUgdGVtcGxhdGUgJyR7dGVtcGxhdGVQYXRofSdgLCBlcnIpO1xuICAgICAgICBuZXcgb2JzaWRpYW4uTm90aWNlKFwiRmFpbGVkIHRvIHJlYWQgdGhlIGRhaWx5IG5vdGUgdGVtcGxhdGVcIik7XG4gICAgICAgIHJldHVybiBbXCJcIiwgbnVsbF07XG4gICAgfVxufVxuXG4vKipcbiAqIGRhdGVVSUQgaXMgYSB3YXkgb2Ygd2Vla2x5IGlkZW50aWZ5aW5nIGRhaWx5L3dlZWtseS9tb250aGx5IG5vdGVzLlxuICogVGhleSBhcmUgcHJlZml4ZWQgd2l0aCB0aGUgZ3JhbnVsYXJpdHkgdG8gYXZvaWQgYW1iaWd1aXR5LlxuICovXG5mdW5jdGlvbiBnZXREYXRlVUlEKGRhdGUsIGdyYW51bGFyaXR5ID0gXCJkYXlcIikge1xuICAgIGNvbnN0IHRzID0gZGF0ZS5jbG9uZSgpLnN0YXJ0T2YoZ3JhbnVsYXJpdHkpLmZvcm1hdCgpO1xuICAgIHJldHVybiBgJHtncmFudWxhcml0eX0tJHt0c31gO1xufVxuZnVuY3Rpb24gcmVtb3ZlRXNjYXBlZENoYXJhY3RlcnMoZm9ybWF0KSB7XG4gICAgcmV0dXJuIGZvcm1hdC5yZXBsYWNlKC9cXFtbXlxcXV0qXFxdL2csIFwiXCIpOyAvLyByZW1vdmUgZXZlcnl0aGluZyB3aXRoaW4gYnJhY2tldHNcbn1cbi8qKlxuICogWFhYOiBXaGVuIHBhcnNpbmcgZGF0ZXMgdGhhdCBjb250YWluIGJvdGggd2VlayBudW1iZXJzIGFuZCBtb250aHMsXG4gKiBNb21lbnQgY2hvc2VzIHRvIGlnbm9yZSB0aGUgd2VlayBudW1iZXJzLiBGb3IgdGhlIHdlZWsgZGF0ZVVJRCwgd2VcbiAqIHdhbnQgdGhlIG9wcG9zaXRlIGJlaGF2aW9yLiBTdHJpcCB0aGUgTU1NIGZyb20gdGhlIGZvcm1hdCB0byBwYXRjaC5cbiAqL1xuZnVuY3Rpb24gaXNGb3JtYXRBbWJpZ3VvdXMoZm9ybWF0LCBncmFudWxhcml0eSkge1xuICAgIGlmIChncmFudWxhcml0eSA9PT0gXCJ3ZWVrXCIpIHtcbiAgICAgICAgY29uc3QgY2xlYW5Gb3JtYXQgPSByZW1vdmVFc2NhcGVkQ2hhcmFjdGVycyhmb3JtYXQpO1xuICAgICAgICByZXR1cm4gKC93ezEsMn0vaS50ZXN0KGNsZWFuRm9ybWF0KSAmJlxuICAgICAgICAgICAgKC9NezEsNH0vLnRlc3QoY2xlYW5Gb3JtYXQpIHx8IC9EezEsNH0vLnRlc3QoY2xlYW5Gb3JtYXQpKSk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGdldERhdGVGcm9tRmlsZShmaWxlLCBncmFudWxhcml0eSkge1xuICAgIHJldHVybiBnZXREYXRlRnJvbUZpbGVuYW1lKGZpbGUuYmFzZW5hbWUsIGdyYW51bGFyaXR5KTtcbn1cbmZ1bmN0aW9uIGdldERhdGVGcm9tUGF0aChwYXRoLCBncmFudWxhcml0eSkge1xuICAgIHJldHVybiBnZXREYXRlRnJvbUZpbGVuYW1lKGJhc2VuYW1lKHBhdGgpLCBncmFudWxhcml0eSk7XG59XG5mdW5jdGlvbiBnZXREYXRlRnJvbUZpbGVuYW1lKGZpbGVuYW1lLCBncmFudWxhcml0eSkge1xuICAgIGNvbnN0IGdldFNldHRpbmdzID0ge1xuICAgICAgICBkYXk6IGdldERhaWx5Tm90ZVNldHRpbmdzLFxuICAgICAgICB3ZWVrOiBnZXRXZWVrbHlOb3RlU2V0dGluZ3MsXG4gICAgICAgIG1vbnRoOiBnZXRNb250aGx5Tm90ZVNldHRpbmdzLFxuICAgIH07XG4gICAgY29uc3QgZm9ybWF0ID0gZ2V0U2V0dGluZ3NbZ3JhbnVsYXJpdHldKCkuZm9ybWF0LnNwbGl0KFwiL1wiKS5wb3AoKTtcbiAgICBjb25zdCBub3RlRGF0ZSA9IHdpbmRvdy5tb21lbnQoZmlsZW5hbWUsIGZvcm1hdCwgdHJ1ZSk7XG4gICAgaWYgKCFub3RlRGF0ZS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChpc0Zvcm1hdEFtYmlndW91cyhmb3JtYXQsIGdyYW51bGFyaXR5KSkge1xuICAgICAgICBpZiAoZ3JhbnVsYXJpdHkgPT09IFwid2Vla1wiKSB7XG4gICAgICAgICAgICBjb25zdCBjbGVhbkZvcm1hdCA9IHJlbW92ZUVzY2FwZWRDaGFyYWN0ZXJzKGZvcm1hdCk7XG4gICAgICAgICAgICBpZiAoL3d7MSwyfS9pLnRlc3QoY2xlYW5Gb3JtYXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5tb21lbnQoZmlsZW5hbWUsIFxuICAgICAgICAgICAgICAgIC8vIElmIGZvcm1hdCBjb250YWlucyB3ZWVrLCByZW1vdmUgZGF5ICYgbW9udGggZm9ybWF0dGluZ1xuICAgICAgICAgICAgICAgIGZvcm1hdC5yZXBsYWNlKC9NezEsNH0vZywgXCJcIikucmVwbGFjZSgvRHsxLDR9L2csIFwiXCIpLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5vdGVEYXRlO1xufVxuXG5jbGFzcyBEYWlseU5vdGVzRm9sZGVyTWlzc2luZ0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xufVxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIG1pbWljcyB0aGUgYmVoYXZpb3Igb2YgdGhlIGRhaWx5LW5vdGVzIHBsdWdpblxuICogc28gaXQgd2lsbCByZXBsYWNlIHt7ZGF0ZX19LCB7e3RpdGxlfX0sIGFuZCB7e3RpbWV9fSB3aXRoIHRoZVxuICogZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAqXG4gKiBOb3RlOiBpdCBoYXMgYW4gYWRkZWQgYm9udXMgdGhhdCBpdCdzIG5vdCAndG9kYXknIHNwZWNpZmljLlxuICovXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVEYWlseU5vdGUoZGF0ZSkge1xuICAgIGNvbnN0IGFwcCA9IHdpbmRvdy5hcHA7XG4gICAgY29uc3QgeyB2YXVsdCB9ID0gYXBwO1xuICAgIGNvbnN0IG1vbWVudCA9IHdpbmRvdy5tb21lbnQ7XG4gICAgY29uc3QgeyB0ZW1wbGF0ZSwgZm9ybWF0LCBmb2xkZXIgfSA9IGdldERhaWx5Tm90ZVNldHRpbmdzKCk7XG4gICAgY29uc3QgW3RlbXBsYXRlQ29udGVudHMsIElGb2xkSW5mb10gPSBhd2FpdCBnZXRUZW1wbGF0ZUluZm8odGVtcGxhdGUpO1xuICAgIGNvbnN0IGZpbGVuYW1lID0gZGF0ZS5mb3JtYXQoZm9ybWF0KTtcbiAgICBjb25zdCBub3JtYWxpemVkUGF0aCA9IGF3YWl0IGdldE5vdGVQYXRoKGZvbGRlciwgZmlsZW5hbWUpO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNyZWF0ZWRGaWxlID0gYXdhaXQgdmF1bHQuY3JlYXRlKG5vcm1hbGl6ZWRQYXRoLCB0ZW1wbGF0ZUNvbnRlbnRzXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqZGF0ZVxccyp9fS9naSwgZmlsZW5hbWUpXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqdGltZVxccyp9fS9naSwgbW9tZW50KCkuZm9ybWF0KFwiSEg6bW1cIikpXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqdGl0bGVcXHMqfX0vZ2ksIGZpbGVuYW1lKVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKihkYXRlfHRpbWUpXFxzKigoWystXVxcZCspKFt5cW13ZGhzXSkpP1xccyooOi4rPyk/fX0vZ2ksIChfLCBfdGltZU9yRGF0ZSwgY2FsYywgdGltZURlbHRhLCB1bml0LCBtb21lbnRGb3JtYXQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5vdyA9IG1vbWVudCgpO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudERhdGUgPSBkYXRlLmNsb25lKCkuc2V0KHtcbiAgICAgICAgICAgICAgICBob3VyOiBub3cuZ2V0KFwiaG91clwiKSxcbiAgICAgICAgICAgICAgICBtaW51dGU6IG5vdy5nZXQoXCJtaW51dGVcIiksXG4gICAgICAgICAgICAgICAgc2Vjb25kOiBub3cuZ2V0KFwic2Vjb25kXCIpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoY2FsYykge1xuICAgICAgICAgICAgICAgIGN1cnJlbnREYXRlLmFkZChwYXJzZUludCh0aW1lRGVsdGEsIDEwKSwgdW5pdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobW9tZW50Rm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnREYXRlLmZvcm1hdChtb21lbnRGb3JtYXQuc3Vic3RyaW5nKDEpLnRyaW0oKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudERhdGUuZm9ybWF0KGZvcm1hdCk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqeWVzdGVyZGF5XFxzKn19L2dpLCBkYXRlLmNsb25lKCkuc3VidHJhY3QoMSwgXCJkYXlcIikuZm9ybWF0KGZvcm1hdCkpXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqdG9tb3Jyb3dcXHMqfX0vZ2ksIGRhdGUuY2xvbmUoKS5hZGQoMSwgXCJkXCIpLmZvcm1hdChmb3JtYXQpKSk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIGFwcC5mb2xkTWFuYWdlci5zYXZlKGNyZWF0ZWRGaWxlLCBJRm9sZEluZm8pO1xuICAgICAgICByZXR1cm4gY3JlYXRlZEZpbGU7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBmaWxlOiAnJHtub3JtYWxpemVkUGF0aH0nYCwgZXJyKTtcbiAgICAgICAgbmV3IG9ic2lkaWFuLk5vdGljZShcIlVuYWJsZSB0byBjcmVhdGUgbmV3IGZpbGUuXCIpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldERhaWx5Tm90ZShkYXRlLCBkYWlseU5vdGVzKSB7XG4gICAgcmV0dXJuIGRhaWx5Tm90ZXNbZ2V0RGF0ZVVJRChkYXRlLCBcImRheVwiKV0gPz8gbnVsbDtcbn1cbmZ1bmN0aW9uIGdldEFsbERhaWx5Tm90ZXMoKSB7XG4gICAgLyoqXG4gICAgICogRmluZCBhbGwgZGFpbHkgbm90ZXMgaW4gdGhlIGRhaWx5IG5vdGUgZm9sZGVyXG4gICAgICovXG4gICAgY29uc3QgeyB2YXVsdCB9ID0gd2luZG93LmFwcDtcbiAgICBjb25zdCB7IGZvbGRlciB9ID0gZ2V0RGFpbHlOb3RlU2V0dGluZ3MoKTtcbiAgICBjb25zdCBkYWlseU5vdGVzRm9sZGVyID0gdmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKG9ic2lkaWFuLm5vcm1hbGl6ZVBhdGgoZm9sZGVyKSk7XG4gICAgaWYgKCFkYWlseU5vdGVzRm9sZGVyKSB7XG4gICAgICAgIHRocm93IG5ldyBEYWlseU5vdGVzRm9sZGVyTWlzc2luZ0Vycm9yKFwiRmFpbGVkIHRvIGZpbmQgZGFpbHkgbm90ZXMgZm9sZGVyXCIpO1xuICAgIH1cbiAgICBjb25zdCBkYWlseU5vdGVzID0ge307XG4gICAgb2JzaWRpYW4uVmF1bHQucmVjdXJzZUNoaWxkcmVuKGRhaWx5Tm90ZXNGb2xkZXIsIChub3RlKSA9PiB7XG4gICAgICAgIGlmIChub3RlIGluc3RhbmNlb2Ygb2JzaWRpYW4uVEZpbGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBnZXREYXRlRnJvbUZpbGUobm90ZSwgXCJkYXlcIik7XG4gICAgICAgICAgICBpZiAoZGF0ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGVTdHJpbmcgPSBnZXREYXRlVUlEKGRhdGUsIFwiZGF5XCIpO1xuICAgICAgICAgICAgICAgIGRhaWx5Tm90ZXNbZGF0ZVN0cmluZ10gPSBub3RlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGRhaWx5Tm90ZXM7XG59XG5cbmNsYXNzIFdlZWtseU5vdGVzRm9sZGVyTWlzc2luZ0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xufVxuZnVuY3Rpb24gZ2V0RGF5c09mV2VlaygpIHtcbiAgICBjb25zdCB7IG1vbWVudCB9ID0gd2luZG93O1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgbGV0IHdlZWtTdGFydCA9IG1vbWVudC5sb2NhbGVEYXRhKCkuX3dlZWsuZG93O1xuICAgIGNvbnN0IGRheXNPZldlZWsgPSBbXG4gICAgICAgIFwic3VuZGF5XCIsXG4gICAgICAgIFwibW9uZGF5XCIsXG4gICAgICAgIFwidHVlc2RheVwiLFxuICAgICAgICBcIndlZG5lc2RheVwiLFxuICAgICAgICBcInRodXJzZGF5XCIsXG4gICAgICAgIFwiZnJpZGF5XCIsXG4gICAgICAgIFwic2F0dXJkYXlcIixcbiAgICBdO1xuICAgIHdoaWxlICh3ZWVrU3RhcnQpIHtcbiAgICAgICAgZGF5c09mV2Vlay5wdXNoKGRheXNPZldlZWsuc2hpZnQoKSk7XG4gICAgICAgIHdlZWtTdGFydC0tO1xuICAgIH1cbiAgICByZXR1cm4gZGF5c09mV2Vlaztcbn1cbmZ1bmN0aW9uIGdldERheU9mV2Vla051bWVyaWNhbFZhbHVlKGRheU9mV2Vla05hbWUpIHtcbiAgICByZXR1cm4gZ2V0RGF5c09mV2VlaygpLmluZGV4T2YoZGF5T2ZXZWVrTmFtZS50b0xvd2VyQ2FzZSgpKTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVdlZWtseU5vdGUoZGF0ZSkge1xuICAgIGNvbnN0IHsgdmF1bHQgfSA9IHdpbmRvdy5hcHA7XG4gICAgY29uc3QgeyB0ZW1wbGF0ZSwgZm9ybWF0LCBmb2xkZXIgfSA9IGdldFdlZWtseU5vdGVTZXR0aW5ncygpO1xuICAgIGNvbnN0IFt0ZW1wbGF0ZUNvbnRlbnRzLCBJRm9sZEluZm9dID0gYXdhaXQgZ2V0VGVtcGxhdGVJbmZvKHRlbXBsYXRlKTtcbiAgICBjb25zdCBmaWxlbmFtZSA9IGRhdGUuZm9ybWF0KGZvcm1hdCk7XG4gICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBhd2FpdCBnZXROb3RlUGF0aChmb2xkZXIsIGZpbGVuYW1lKTtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBjcmVhdGVkRmlsZSA9IGF3YWl0IHZhdWx0LmNyZWF0ZShub3JtYWxpemVkUGF0aCwgdGVtcGxhdGVDb250ZW50c1xuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKihkYXRlfHRpbWUpXFxzKigoWystXVxcZCspKFt5cW13ZGhzXSkpP1xccyooOi4rPyk/fX0vZ2ksIChfLCBfdGltZU9yRGF0ZSwgY2FsYywgdGltZURlbHRhLCB1bml0LCBtb21lbnRGb3JtYXQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5vdyA9IHdpbmRvdy5tb21lbnQoKTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnREYXRlID0gZGF0ZS5jbG9uZSgpLnNldCh7XG4gICAgICAgICAgICAgICAgaG91cjogbm93LmdldChcImhvdXJcIiksXG4gICAgICAgICAgICAgICAgbWludXRlOiBub3cuZ2V0KFwibWludXRlXCIpLFxuICAgICAgICAgICAgICAgIHNlY29uZDogbm93LmdldChcInNlY29uZFwiKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGNhbGMpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50RGF0ZS5hZGQocGFyc2VJbnQodGltZURlbHRhLCAxMCksIHVuaXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1vbWVudEZvcm1hdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50RGF0ZS5mb3JtYXQobW9tZW50Rm9ybWF0LnN1YnN0cmluZygxKS50cmltKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnREYXRlLmZvcm1hdChmb3JtYXQpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKnRpdGxlXFxzKn19L2dpLCBmaWxlbmFtZSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyp0aW1lXFxzKn19L2dpLCB3aW5kb3cubW9tZW50KCkuZm9ybWF0KFwiSEg6bW1cIikpXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqKHN1bmRheXxtb25kYXl8dHVlc2RheXx3ZWRuZXNkYXl8dGh1cnNkYXl8ZnJpZGF5fHNhdHVyZGF5KVxccyo6KC4qPyl9fS9naSwgKF8sIGRheU9mV2VlaywgbW9tZW50Rm9ybWF0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYXkgPSBnZXREYXlPZldlZWtOdW1lcmljYWxWYWx1ZShkYXlPZldlZWspO1xuICAgICAgICAgICAgcmV0dXJuIGRhdGUud2Vla2RheShkYXkpLmZvcm1hdChtb21lbnRGb3JtYXQudHJpbSgpKTtcbiAgICAgICAgfSkpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICB3aW5kb3cuYXBwLmZvbGRNYW5hZ2VyLnNhdmUoY3JlYXRlZEZpbGUsIElGb2xkSW5mbyk7XG4gICAgICAgIHJldHVybiBjcmVhdGVkRmlsZTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIGZpbGU6ICcke25vcm1hbGl6ZWRQYXRofSdgLCBlcnIpO1xuICAgICAgICBuZXcgb2JzaWRpYW4uTm90aWNlKFwiVW5hYmxlIHRvIGNyZWF0ZSBuZXcgZmlsZS5cIik7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0V2Vla2x5Tm90ZShkYXRlLCB3ZWVrbHlOb3Rlcykge1xuICAgIHJldHVybiB3ZWVrbHlOb3Rlc1tnZXREYXRlVUlEKGRhdGUsIFwid2Vla1wiKV0gPz8gbnVsbDtcbn1cbmZ1bmN0aW9uIGdldEFsbFdlZWtseU5vdGVzKCkge1xuICAgIGNvbnN0IHdlZWtseU5vdGVzID0ge307XG4gICAgaWYgKCFhcHBIYXNXZWVrbHlOb3Rlc1BsdWdpbkxvYWRlZCgpKSB7XG4gICAgICAgIHJldHVybiB3ZWVrbHlOb3RlcztcbiAgICB9XG4gICAgY29uc3QgeyB2YXVsdCB9ID0gd2luZG93LmFwcDtcbiAgICBjb25zdCB7IGZvbGRlciB9ID0gZ2V0V2Vla2x5Tm90ZVNldHRpbmdzKCk7XG4gICAgY29uc3Qgd2Vla2x5Tm90ZXNGb2xkZXIgPSB2YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgob2JzaWRpYW4ubm9ybWFsaXplUGF0aChmb2xkZXIpKTtcbiAgICBpZiAoIXdlZWtseU5vdGVzRm9sZGVyKSB7XG4gICAgICAgIHRocm93IG5ldyBXZWVrbHlOb3Rlc0ZvbGRlck1pc3NpbmdFcnJvcihcIkZhaWxlZCB0byBmaW5kIHdlZWtseSBub3RlcyBmb2xkZXJcIik7XG4gICAgfVxuICAgIG9ic2lkaWFuLlZhdWx0LnJlY3Vyc2VDaGlsZHJlbih3ZWVrbHlOb3Rlc0ZvbGRlciwgKG5vdGUpID0+IHtcbiAgICAgICAgaWYgKG5vdGUgaW5zdGFuY2VvZiBvYnNpZGlhbi5URmlsZSkge1xuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IGdldERhdGVGcm9tRmlsZShub3RlLCBcIndlZWtcIik7XG4gICAgICAgICAgICBpZiAoZGF0ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGVTdHJpbmcgPSBnZXREYXRlVUlEKGRhdGUsIFwid2Vla1wiKTtcbiAgICAgICAgICAgICAgICB3ZWVrbHlOb3Rlc1tkYXRlU3RyaW5nXSA9IG5vdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gd2Vla2x5Tm90ZXM7XG59XG5cbmNsYXNzIE1vbnRobHlOb3Rlc0ZvbGRlck1pc3NpbmdFcnJvciBleHRlbmRzIEVycm9yIHtcbn1cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBtaW1pY3MgdGhlIGJlaGF2aW9yIG9mIHRoZSBkYWlseS1ub3RlcyBwbHVnaW5cbiAqIHNvIGl0IHdpbGwgcmVwbGFjZSB7e2RhdGV9fSwge3t0aXRsZX19LCBhbmQge3t0aW1lfX0gd2l0aCB0aGVcbiAqIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gKlxuICogTm90ZTogaXQgaGFzIGFuIGFkZGVkIGJvbnVzIHRoYXQgaXQncyBub3QgJ3RvZGF5JyBzcGVjaWZpYy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlTW9udGhseU5vdGUoZGF0ZSkge1xuICAgIGNvbnN0IHsgdmF1bHQgfSA9IHdpbmRvdy5hcHA7XG4gICAgY29uc3QgeyB0ZW1wbGF0ZSwgZm9ybWF0LCBmb2xkZXIgfSA9IGdldE1vbnRobHlOb3RlU2V0dGluZ3MoKTtcbiAgICBjb25zdCBbdGVtcGxhdGVDb250ZW50cywgSUZvbGRJbmZvXSA9IGF3YWl0IGdldFRlbXBsYXRlSW5mbyh0ZW1wbGF0ZSk7XG4gICAgY29uc3QgZmlsZW5hbWUgPSBkYXRlLmZvcm1hdChmb3JtYXQpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gYXdhaXQgZ2V0Tm90ZVBhdGgoZm9sZGVyLCBmaWxlbmFtZSk7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY3JlYXRlZEZpbGUgPSBhd2FpdCB2YXVsdC5jcmVhdGUobm9ybWFsaXplZFBhdGgsIHRlbXBsYXRlQ29udGVudHNcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyooZGF0ZXx0aW1lKVxccyooKFsrLV1cXGQrKShbeXFtd2Roc10pKT9cXHMqKDouKz8pP319L2dpLCAoXywgX3RpbWVPckRhdGUsIGNhbGMsIHRpbWVEZWx0YSwgdW5pdCwgbW9tZW50Rm9ybWF0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBub3cgPSB3aW5kb3cubW9tZW50KCk7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50RGF0ZSA9IGRhdGUuY2xvbmUoKS5zZXQoe1xuICAgICAgICAgICAgICAgIGhvdXI6IG5vdy5nZXQoXCJob3VyXCIpLFxuICAgICAgICAgICAgICAgIG1pbnV0ZTogbm93LmdldChcIm1pbnV0ZVwiKSxcbiAgICAgICAgICAgICAgICBzZWNvbmQ6IG5vdy5nZXQoXCJzZWNvbmRcIiksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChjYWxjKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudERhdGUuYWRkKHBhcnNlSW50KHRpbWVEZWx0YSwgMTApLCB1bml0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtb21lbnRGb3JtYXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudERhdGUuZm9ybWF0KG1vbWVudEZvcm1hdC5zdWJzdHJpbmcoMSkudHJpbSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50RGF0ZS5mb3JtYXQoZm9ybWF0KTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccypkYXRlXFxzKn19L2dpLCBmaWxlbmFtZSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyp0aW1lXFxzKn19L2dpLCB3aW5kb3cubW9tZW50KCkuZm9ybWF0KFwiSEg6bW1cIikpXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqdGl0bGVcXHMqfX0vZ2ksIGZpbGVuYW1lKSk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIHdpbmRvdy5hcHAuZm9sZE1hbmFnZXIuc2F2ZShjcmVhdGVkRmlsZSwgSUZvbGRJbmZvKTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZWRGaWxlO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgZmlsZTogJyR7bm9ybWFsaXplZFBhdGh9J2AsIGVycik7XG4gICAgICAgIG5ldyBvYnNpZGlhbi5Ob3RpY2UoXCJVbmFibGUgdG8gY3JlYXRlIG5ldyBmaWxlLlwiKTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRNb250aGx5Tm90ZShkYXRlLCBtb250aGx5Tm90ZXMpIHtcbiAgICByZXR1cm4gbW9udGhseU5vdGVzW2dldERhdGVVSUQoZGF0ZSwgXCJtb250aFwiKV0gPz8gbnVsbDtcbn1cbmZ1bmN0aW9uIGdldEFsbE1vbnRobHlOb3RlcygpIHtcbiAgICBjb25zdCBtb250aGx5Tm90ZXMgPSB7fTtcbiAgICBpZiAoIWFwcEhhc01vbnRobHlOb3Rlc1BsdWdpbkxvYWRlZCgpKSB7XG4gICAgICAgIHJldHVybiBtb250aGx5Tm90ZXM7XG4gICAgfVxuICAgIGNvbnN0IHsgdmF1bHQgfSA9IHdpbmRvdy5hcHA7XG4gICAgY29uc3QgeyBmb2xkZXIgfSA9IGdldE1vbnRobHlOb3RlU2V0dGluZ3MoKTtcbiAgICBjb25zdCBtb250aGx5Tm90ZXNGb2xkZXIgPSB2YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgob2JzaWRpYW4ubm9ybWFsaXplUGF0aChmb2xkZXIpKTtcbiAgICBpZiAoIW1vbnRobHlOb3Rlc0ZvbGRlcikge1xuICAgICAgICB0aHJvdyBuZXcgTW9udGhseU5vdGVzRm9sZGVyTWlzc2luZ0Vycm9yKFwiRmFpbGVkIHRvIGZpbmQgbW9udGhseSBub3RlcyBmb2xkZXJcIik7XG4gICAgfVxuICAgIG9ic2lkaWFuLlZhdWx0LnJlY3Vyc2VDaGlsZHJlbihtb250aGx5Tm90ZXNGb2xkZXIsIChub3RlKSA9PiB7XG4gICAgICAgIGlmIChub3RlIGluc3RhbmNlb2Ygb2JzaWRpYW4uVEZpbGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBnZXREYXRlRnJvbUZpbGUobm90ZSwgXCJtb250aFwiKTtcbiAgICAgICAgICAgIGlmIChkYXRlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZVN0cmluZyA9IGdldERhdGVVSUQoZGF0ZSwgXCJtb250aFwiKTtcbiAgICAgICAgICAgICAgICBtb250aGx5Tm90ZXNbZGF0ZVN0cmluZ10gPSBub3RlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG1vbnRobHlOb3Rlcztcbn1cblxuZnVuY3Rpb24gYXBwSGFzRGFpbHlOb3Rlc1BsdWdpbkxvYWRlZCgpIHtcbiAgICBjb25zdCB7IGFwcCB9ID0gd2luZG93O1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgY29uc3QgZGFpbHlOb3Rlc1BsdWdpbiA9IGFwcC5pbnRlcm5hbFBsdWdpbnMucGx1Z2luc1tcImRhaWx5LW5vdGVzXCJdO1xuICAgIGlmIChkYWlseU5vdGVzUGx1Z2luICYmIGRhaWx5Tm90ZXNQbHVnaW4uZW5hYmxlZCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCBwZXJpb2RpY05vdGVzID0gYXBwLnBsdWdpbnMuZ2V0UGx1Z2luKFwicGVyaW9kaWMtbm90ZXNcIik7XG4gICAgcmV0dXJuIHBlcmlvZGljTm90ZXMgJiYgcGVyaW9kaWNOb3Rlcy5zZXR0aW5ncz8uZGFpbHk/LmVuYWJsZWQ7XG59XG4vKipcbiAqIFhYWDogXCJXZWVrbHkgTm90ZXNcIiBsaXZlIGluIGVpdGhlciB0aGUgQ2FsZW5kYXIgcGx1Z2luIG9yIHRoZSBwZXJpb2RpYy1ub3RlcyBwbHVnaW4uXG4gKiBDaGVjayBib3RoIHVudGlsIHRoZSB3ZWVrbHkgbm90ZXMgZmVhdHVyZSBpcyByZW1vdmVkIGZyb20gdGhlIENhbGVuZGFyIHBsdWdpbi5cbiAqL1xuZnVuY3Rpb24gYXBwSGFzV2Vla2x5Tm90ZXNQbHVnaW5Mb2FkZWQoKSB7XG4gICAgY29uc3QgeyBhcHAgfSA9IHdpbmRvdztcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGlmIChhcHAucGx1Z2lucy5nZXRQbHVnaW4oXCJjYWxlbmRhclwiKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCBwZXJpb2RpY05vdGVzID0gYXBwLnBsdWdpbnMuZ2V0UGx1Z2luKFwicGVyaW9kaWMtbm90ZXNcIik7XG4gICAgcmV0dXJuIHBlcmlvZGljTm90ZXMgJiYgcGVyaW9kaWNOb3Rlcy5zZXR0aW5ncz8ud2Vla2x5Py5lbmFibGVkO1xufVxuZnVuY3Rpb24gYXBwSGFzTW9udGhseU5vdGVzUGx1Z2luTG9hZGVkKCkge1xuICAgIGNvbnN0IHsgYXBwIH0gPSB3aW5kb3c7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCBwZXJpb2RpY05vdGVzID0gYXBwLnBsdWdpbnMuZ2V0UGx1Z2luKFwicGVyaW9kaWMtbm90ZXNcIik7XG4gICAgcmV0dXJuIHBlcmlvZGljTm90ZXMgJiYgcGVyaW9kaWNOb3Rlcy5zZXR0aW5ncz8ubW9udGhseT8uZW5hYmxlZDtcbn1cbmZ1bmN0aW9uIGdldFBlcmlvZGljTm90ZVNldHRpbmdzKGdyYW51bGFyaXR5KSB7XG4gICAgY29uc3QgZ2V0U2V0dGluZ3MgPSB7XG4gICAgICAgIGRheTogZ2V0RGFpbHlOb3RlU2V0dGluZ3MsXG4gICAgICAgIHdlZWs6IGdldFdlZWtseU5vdGVTZXR0aW5ncyxcbiAgICAgICAgbW9udGg6IGdldE1vbnRobHlOb3RlU2V0dGluZ3MsXG4gICAgfVtncmFudWxhcml0eV07XG4gICAgcmV0dXJuIGdldFNldHRpbmdzKCk7XG59XG5mdW5jdGlvbiBjcmVhdGVQZXJpb2RpY05vdGUoZ3JhbnVsYXJpdHksIGRhdGUpIHtcbiAgICBjb25zdCBjcmVhdGVGbiA9IHtcbiAgICAgICAgZGF5OiBjcmVhdGVEYWlseU5vdGUsXG4gICAgICAgIG1vbnRoOiBjcmVhdGVNb250aGx5Tm90ZSxcbiAgICAgICAgd2VlazogY3JlYXRlV2Vla2x5Tm90ZSxcbiAgICB9O1xuICAgIHJldHVybiBjcmVhdGVGbltncmFudWxhcml0eV0oZGF0ZSk7XG59XG5cbmV4cG9ydHMuREVGQVVMVF9EQUlMWV9OT1RFX0ZPUk1BVCA9IERFRkFVTFRfREFJTFlfTk9URV9GT1JNQVQ7XG5leHBvcnRzLkRFRkFVTFRfTU9OVEhMWV9OT1RFX0ZPUk1BVCA9IERFRkFVTFRfTU9OVEhMWV9OT1RFX0ZPUk1BVDtcbmV4cG9ydHMuREVGQVVMVF9XRUVLTFlfTk9URV9GT1JNQVQgPSBERUZBVUxUX1dFRUtMWV9OT1RFX0ZPUk1BVDtcbmV4cG9ydHMuYXBwSGFzRGFpbHlOb3Rlc1BsdWdpbkxvYWRlZCA9IGFwcEhhc0RhaWx5Tm90ZXNQbHVnaW5Mb2FkZWQ7XG5leHBvcnRzLmFwcEhhc01vbnRobHlOb3Rlc1BsdWdpbkxvYWRlZCA9IGFwcEhhc01vbnRobHlOb3Rlc1BsdWdpbkxvYWRlZDtcbmV4cG9ydHMuYXBwSGFzV2Vla2x5Tm90ZXNQbHVnaW5Mb2FkZWQgPSBhcHBIYXNXZWVrbHlOb3Rlc1BsdWdpbkxvYWRlZDtcbmV4cG9ydHMuY3JlYXRlRGFpbHlOb3RlID0gY3JlYXRlRGFpbHlOb3RlO1xuZXhwb3J0cy5jcmVhdGVNb250aGx5Tm90ZSA9IGNyZWF0ZU1vbnRobHlOb3RlO1xuZXhwb3J0cy5jcmVhdGVQZXJpb2RpY05vdGUgPSBjcmVhdGVQZXJpb2RpY05vdGU7XG5leHBvcnRzLmNyZWF0ZVdlZWtseU5vdGUgPSBjcmVhdGVXZWVrbHlOb3RlO1xuZXhwb3J0cy5nZXRBbGxEYWlseU5vdGVzID0gZ2V0QWxsRGFpbHlOb3RlcztcbmV4cG9ydHMuZ2V0QWxsTW9udGhseU5vdGVzID0gZ2V0QWxsTW9udGhseU5vdGVzO1xuZXhwb3J0cy5nZXRBbGxXZWVrbHlOb3RlcyA9IGdldEFsbFdlZWtseU5vdGVzO1xuZXhwb3J0cy5nZXREYWlseU5vdGUgPSBnZXREYWlseU5vdGU7XG5leHBvcnRzLmdldERhaWx5Tm90ZVNldHRpbmdzID0gZ2V0RGFpbHlOb3RlU2V0dGluZ3M7XG5leHBvcnRzLmdldERhdGVGcm9tRmlsZSA9IGdldERhdGVGcm9tRmlsZTtcbmV4cG9ydHMuZ2V0RGF0ZUZyb21QYXRoID0gZ2V0RGF0ZUZyb21QYXRoO1xuZXhwb3J0cy5nZXREYXRlVUlEID0gZ2V0RGF0ZVVJRDtcbmV4cG9ydHMuZ2V0TW9udGhseU5vdGUgPSBnZXRNb250aGx5Tm90ZTtcbmV4cG9ydHMuZ2V0TW9udGhseU5vdGVTZXR0aW5ncyA9IGdldE1vbnRobHlOb3RlU2V0dGluZ3M7XG5leHBvcnRzLmdldFBlcmlvZGljTm90ZVNldHRpbmdzID0gZ2V0UGVyaW9kaWNOb3RlU2V0dGluZ3M7XG5leHBvcnRzLmdldFRlbXBsYXRlSW5mbyA9IGdldFRlbXBsYXRlSW5mbztcbmV4cG9ydHMuZ2V0V2Vla2x5Tm90ZSA9IGdldFdlZWtseU5vdGU7XG5leHBvcnRzLmdldFdlZWtseU5vdGVTZXR0aW5ncyA9IGdldFdlZWtseU5vdGVTZXR0aW5ncztcbiIsImltcG9ydCB0eXBlIHsgTW9tZW50IH0gZnJvbSAnbW9tZW50JztcbmltcG9ydCB0eXBlIHsgVEZpbGUsIFZhdWx0IH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHtcbiAgY3JlYXRlRGFpbHlOb3RlLFxuICBnZXRBbGxEYWlseU5vdGVzLFxuICBnZXRBbGxNb250aGx5Tm90ZXMsXG4gIGdldEFsbFdlZWtseU5vdGVzLFxuICBnZXREYWlseU5vdGUsXG4gIGdldERhaWx5Tm90ZVNldHRpbmdzLFxuICBnZXRNb250aGx5Tm90ZVNldHRpbmdzLFxuICBnZXRXZWVrbHlOb3RlU2V0dGluZ3MsXG4gIElQZXJpb2RpY05vdGVTZXR0aW5ncyxcbn0gZnJvbSAnb2JzaWRpYW4tZGFpbHktbm90ZXMtaW50ZXJmYWNlJztcblxuZXhwb3J0IHR5cGUgUGVyaW9kaWNOb3RlSUQgPSBzdHJpbmc7XG5cbnR5cGUgSUdyYW51bGFyaXR5ID0gJ2RheScgfCAnd2VlaycgfCAnbW9udGgnO1xuXG5leHBvcnQgY2xhc3MgVmF1bHRJbnRlcm1lZGlhdGUge1xuICBwcml2YXRlIHJlYWRvbmx5IHZhdWx0OiBWYXVsdDtcblxuICBjb25zdHJ1Y3Rvcih2YXVsdDogVmF1bHQpIHtcbiAgICB0aGlzLnZhdWx0ID0gdmF1bHQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0RGFpbHlOb3RlcyA9ICgpOiBSZWNvcmQ8c3RyaW5nLCBURmlsZT4gPT4gZ2V0QWxsRGFpbHlOb3RlcygpO1xuICBwdWJsaWMgZ2V0V2Vla2x5Tm90ZXMgPSAoKTogUmVjb3JkPHN0cmluZywgVEZpbGU+ID0+IGdldEFsbFdlZWtseU5vdGVzKCk7XG4gIHB1YmxpYyBnZXRNb250aGx5Tm90ZXMgPSAoKTogUmVjb3JkPHN0cmluZywgVEZpbGU+ID0+IGdldEFsbE1vbnRobHlOb3RlcygpO1xuXG4gIHB1YmxpYyBnZXREYWlseU5vdGUgPSAoZGF0ZTogTW9tZW50KTogUHJvbWlzZTxURmlsZT4gPT4ge1xuICAgIGNvbnN0IGRlc2lyZWROb3RlID0gZ2V0RGFpbHlOb3RlKGRhdGUsIGdldEFsbERhaWx5Tm90ZXMoKSk7XG4gICAgaWYgKGRlc2lyZWROb3RlKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGRlc2lyZWROb3RlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlRGFpbHlOb3RlKGRhdGUpO1xuICB9O1xuXG4gIHB1YmxpYyBjcmVhdGVEYWlseU5vdGUgPSAoZGF0ZTogTW9tZW50KTogUHJvbWlzZTxURmlsZT4gPT5cbiAgICBjcmVhdGVEYWlseU5vdGUoZGF0ZSk7XG5cbiAgcHVibGljIGZpbmRNb21lbnRGb3JEYWlseU5vdGUgPSAoZmlsZTogVEZpbGUpOiBNb21lbnQgfCB1bmRlZmluZWQgPT4ge1xuICAgIGNvbnN0IHsgZm9ybWF0IH0gPSBnZXREYWlseU5vdGVTZXR0aW5ncygpO1xuICAgIGNvbnN0IGRhdGUgPSB3aW5kb3cubW9tZW50KGZpbGUuYmFzZW5hbWUsIGZvcm1hdCwgdHJ1ZSk7XG4gICAgcmV0dXJuIGRhdGUuaXNWYWxpZCgpID8gZGF0ZSA6IG51bGw7XG4gIH07XG5cbiAgcHVibGljIGZpbGVOYW1lRm9yTW9tZW50ID0gKGRhdGU6IE1vbWVudCk6IHN0cmluZyA9PlxuICAgIGRhdGUuZm9ybWF0KGdldERhaWx5Tm90ZVNldHRpbmdzKCkuZm9ybWF0KTtcblxuICBwdWJsaWMgcmVhZEZpbGUgPSAoZmlsZTogVEZpbGUsIHVzZUNhY2hlOiBib29sZWFuKTogUHJvbWlzZTxzdHJpbmc+ID0+XG4gICAgdXNlQ2FjaGUgPyB0aGlzLnZhdWx0LmNhY2hlZFJlYWQoZmlsZSkgOiB0aGlzLnZhdWx0LnJlYWQoZmlsZSk7XG5cbiAgcHVibGljIHdyaXRlRmlsZSA9IChmaWxlOiBURmlsZSwgZGF0YTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PlxuICAgIHRoaXMudmF1bHQubW9kaWZ5KGZpbGUsIGRhdGEpO1xuXG4gIC8qKlxuICAgKiBOT1RFOiBVbnRlc3RlZCwgZW5kZWQgdXAgbmVlZGluZyBhZnRlciB3cml0aW5nIHRoaXMsXG4gICAqIGJ1dCBpdCBzZWVtZWQgdXNlZnVsIHNvIEkga2VwdCBpdCBqdXN0IGluIGNhc2UuXG4gICAqXG4gICAqIFJldHVybnMgYSBwZXJpb2RpYyBub3RlIElEIGZvciB0aGUgZmlsZS5cbiAgICogTk9URTogVGhlIHZhbHVlcyByZXR1cm5lZCBhcmUgbm90IGFjdHVhbGx5IGZpbGUgbmFtZXMsIGJ1dCB2YWx1ZXMgc2ltaWxhciB0bzpcbiAgICogICAtIGRheS0yMDIxLTAyLTEyVDAwOjAwOjAwLTA4OjAwXG4gICAqICAgLSB3ZWVrLTIwMjEtMDItMjFUMDA6MDA6MDAtMDg6MDBcbiAgICogICAtIG1vbnRoLTIwMjEtMDItMDFUMDA6MDA6MDAtMDg6MDBcbiAgICovXG4gIHB1YmxpYyBnZXRQZXJpb2RpY05vdGVJREZvckZpbGUgPSAoZmlsZTogVEZpbGUpOiBQZXJpb2RpY05vdGVJRCA9PiB7XG4gICAgY29uc3QgZFNldHRpbmdzID0gZ2V0RGFpbHlOb3RlU2V0dGluZ3MoKTtcbiAgICBsZXQgdWlkID0gdGhpcy5nZXREYXRlVUlEKGZpbGUsIGRTZXR0aW5ncywgJ2RheScpO1xuICAgIGlmICh1aWQpIHtcbiAgICAgIHJldHVybiB1aWQ7XG4gICAgfVxuXG4gICAgY29uc3Qgd1NldHRpbmdzID0gZ2V0V2Vla2x5Tm90ZVNldHRpbmdzKCk7XG4gICAgdWlkID0gdGhpcy5nZXREYXRlVUlEKGZpbGUsIHdTZXR0aW5ncywgJ3dlZWsnKTtcbiAgICBpZiAodWlkKSB7XG4gICAgICByZXR1cm4gdWlkO1xuICAgIH1cblxuICAgIGNvbnN0IG1TZXR0aW5ncyA9IGdldE1vbnRobHlOb3RlU2V0dGluZ3MoKTtcbiAgICB1aWQgPSB0aGlzLmdldERhdGVVSUQoZmlsZSwgbVNldHRpbmdzLCAnbW9udGgnKTtcbiAgICBpZiAodWlkKSB7XG4gICAgICByZXR1cm4gdWlkO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogTk9URTogVW50ZXN0ZWQsIGVuZGVkIHVwIG5lZWRpbmcgYWZ0ZXIgd3JpdGluZyB0aGlzLFxuICAgKiBidXQgaXQgc2VlbWVkIHVzZWZ1bCBzbyBJIGtlcHQgaXQganVzdCBpbiBjYXNlLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBnZXREYXRlVUlEID0gKFxuICAgIGZpbGU6IFRGaWxlLFxuICAgIHNldHRpbmdzOiBJUGVyaW9kaWNOb3RlU2V0dGluZ3MsXG4gICAgZ3JhbnVsYXJpdHk6IElHcmFudWxhcml0eSxcbiAgKTogUGVyaW9kaWNOb3RlSUQgfCB1bmRlZmluZWQgPT4ge1xuICAgIGlmIChzZXR0aW5ncy5mb2xkZXIgJiYgIWZpbGUucGF0aC5zdGFydHNXaXRoKHNldHRpbmdzLmZvbGRlcikpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIE5vdCBpbiB0aGUgcmlnaHQgZm9sZGVyXG4gICAgfVxuXG4gICAgY29uc3QgZGF0ZSA9IHdpbmRvdy5tb21lbnQoZmlsZS5iYXNlbmFtZSwgc2V0dGluZ3MuZm9ybWF0LCB0cnVlKTtcbiAgICBpZiAoZGF0ZS5pc1ZhbGlkKCkpIHtcbiAgICAgIHJldHVybiBgJHtncmFudWxhcml0eX0tJHtkYXRlLnN0YXJ0T2YoZ3JhbnVsYXJpdHkpLmZvcm1hdCgpfWA7XG4gICAgfVxuICB9O1xufVxuIiwiaW1wb3J0IHsgYnV5TWVBQ29mZmVlLCBFbGVtZW50LCBwYXlwYWwsIHNraXBwZWRJY29uU3ZnIH0gZnJvbSAnLi9ncmFwaGljcyc7XG5pbXBvcnQge1xuICBzaG91bGRDb25maWd1cmVHbG9iYWxNb21lbnQsXG4gIHRyeVRvQ29uZmlndXJlR2xvYmFsTW9tZW50LFxufSBmcm9tICcuL2xvY2FsaXphdGlvbic7XG5pbXBvcnQgeyBJU2V0dGluZ3MsIHNldHRpbmdzV2l0aERlZmF1bHRzIH0gZnJvbSAnLi9zZXR0aW5ncyc7XG5pbXBvcnQgeyBUYXNrQ2FjaGUgfSBmcm9tICcuL3Rhc2stY2FjaGUnO1xuaW1wb3J0IHsgVGFza0hhbmRsZXIgfSBmcm9tICcuL3Rhc2staGFuZGxlcic7XG5pbXBvcnQgeyBUYXNrTGluZSB9IGZyb20gJy4vdGFzay1saW5lJztcbmltcG9ydCBUYXNrTW92ZSBmcm9tICcuL3VpL1Rhc2tNb3ZlLnN2ZWx0ZSc7XG5pbXBvcnQgVGFza1JlcGVhdCBmcm9tICcuL3VpL1Rhc2tSZXBlYXQuc3ZlbHRlJztcbmltcG9ydCB7IFZhdWx0SW50ZXJtZWRpYXRlIH0gZnJvbSAnLi92YXVsdCc7XG5pbXBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgTW9tZW50VHlwZSwgV2Vla1NwZWMgfSBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHtcbiAgQXBwLFxuICBNYXJrZG93blBvc3RQcm9jZXNzb3JDb250ZXh0LFxuICBNYXJrZG93blByZXZpZXdSZW5kZXJlcixcbiAgTWFya2Rvd25WaWV3LFxuICBNb2RhbCxcbiAgTm90aWNlLFxuICBQbHVnaW4sXG4gIFBsdWdpblNldHRpbmdUYWIsXG4gIFNldHRpbmcsXG4gIFRGaWxlLFxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IElXZWVrU3RhcnRPcHRpb24gfSBmcm9tICdvYnNpZGlhbi1jYWxlbmRhci11aSc7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgbW9tZW50OiB0eXBlb2YgTW9tZW50VHlwZTtcbiAgICBfYnVuZGxlZExvY2FsZVdlZWtTcGVjOiBXZWVrU3BlYztcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTbGF0ZWRQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xuICBwdWJsaWMgc2V0dGluZ3M6IElTZXR0aW5ncztcblxuICBwcml2YXRlIHZhdWx0OiBWYXVsdEludGVybWVkaWF0ZTtcbiAgcHJpdmF0ZSB0YXNrSGFuZGxlcjogVGFza0hhbmRsZXI7XG4gIHByaXZhdGUgdGFza0NhY2hlOiBUYXNrQ2FjaGU7XG5cbiAgcHJpdmF0ZSBsYXN0RmlsZTogVEZpbGUgfCB1bmRlZmluZWQ7XG5cbiAgcHVibGljIGFzeW5jIG9ubG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmxvYWRTZXR0aW5ncygpO1xuXG4gICAgdGhpcy52YXVsdCA9IG5ldyBWYXVsdEludGVybWVkaWF0ZSh0aGlzLmFwcC52YXVsdCk7XG4gICAgdGhpcy50YXNrSGFuZGxlciA9IG5ldyBUYXNrSGFuZGxlcihcbiAgICAgIHRoaXMudmF1bHQsXG4gICAgICB0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLFxuICAgICAgdGhpcy5zZXR0aW5ncyxcbiAgICApO1xuICAgIHRoaXMudGFza0NhY2hlID0gbmV3IFRhc2tDYWNoZSh0aGlzLnRhc2tIYW5kbGVyLCB0aGlzLnZhdWx0KTtcblxuICAgIHRoaXMuYXBwLndvcmtzcGFjZS5vbkxheW91dFJlYWR5KCgpID0+IHtcbiAgICAgIHRoaXMudGFza0NhY2hlLmluaXRpYWxpemUoKTtcbiAgICB9KTtcblxuICAgIE1hcmtkb3duUHJldmlld1JlbmRlcmVyLnJlZ2lzdGVyUG9zdFByb2Nlc3Nvcih0aGlzLnJlbmRlck1vdmVkVGFza3MpO1xuXG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KFxuICAgICAgdGhpcy5hcHAud29ya3NwYWNlLm9uKCdmaWxlLW9wZW4nLCAoZmlsZTogVEZpbGUpID0+IHtcbiAgICAgICAgaWYgKCFmaWxlIHx8ICFmaWxlLmJhc2VuYW1lKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhpcyBjYWxsYmFjayBpcyBmaXJlZCB3aGVuZXZlciBhIGZpbGUgcmVjZWl2ZXMgZm9jdXNcbiAgICAgICAgLy8gbm90IGp1c3Qgd2hlbiB0aGUgZmlsZSBpcyBmaXJzdCBvcGVuZWQuXG4gICAgICAgIGNvbnNvbGUuZGVidWcoJ1NsYXRlZDogRmlsZSBvcGVuZWQ6ICcgKyBmaWxlLmJhc2VuYW1lKTtcblxuICAgICAgICBpZiAodGhpcy5sYXN0RmlsZSkge1xuICAgICAgICAgIHRoaXMudGFza0hhbmRsZXIucHJvY2Vzc0ZpbGUodGhpcy5sYXN0RmlsZSk7XG4gICAgICAgICAgdGhpcy50YXNrQ2FjaGUuZmlsZU9wZW5Ib29rKHRoaXMubGFzdEZpbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sYXN0RmlsZSA9IGZpbGU7XG4gICAgICAgIHRoaXMudGFza0hhbmRsZXIucHJvY2Vzc0ZpbGUoZmlsZSk7XG4gICAgICAgIHRoaXMudGFza0NhY2hlLmZpbGVPcGVuSG9vayhmaWxlKTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICB0aGlzLmFkZENvbW1hbmQoe1xuICAgICAgaWQ6ICd0YXNrLXNraXAnLFxuICAgICAgbmFtZTogJ1NraXAgVGFzayBPY2N1cmVuY2UnLFxuICAgICAgY2hlY2tDYWxsYmFjazogKGNoZWNraW5nOiBib29sZWFuKSA9PiB7XG4gICAgICAgIGlmIChjaGVja2luZykge1xuICAgICAgICAgIHJldHVybiB0aGlzLnRhc2tDaGVja2VyKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLndpdGhUYXNrTGluZSgodGwpID0+IHRsLnNraXBPY2N1cmVuY2UoKSk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5hZGRDb21tYW5kKHtcbiAgICAgIGlkOiAndGFzay1tb3ZlLW1vZGFsJyxcbiAgICAgIG5hbWU6ICdNb3ZlIFRhc2snLFxuICAgICAgY2hlY2tDYWxsYmFjazogKGNoZWNraW5nOiBib29sZWFuKSA9PiB7XG4gICAgICAgIGlmIChjaGVja2luZykge1xuICAgICAgICAgIHJldHVybiB0aGlzLnRhc2tDaGVja2VyKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLndpdGhUYXNrTGluZSgodGFzazogVGFza0xpbmUpID0+IHtcbiAgICAgICAgICBuZXcgVGFza01vdmVNb2RhbCh0aGlzLmFwcCwgdGFzaykub3BlbigpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLmFkZENvbW1hbmQoe1xuICAgICAgaWQ6ICd0YXNrLXJlcGVhdC1tb2RhbCcsXG4gICAgICBuYW1lOiAnQ29uZmlndXJlIFRhc2sgUmVwZXRpdGlvbicsXG4gICAgICBjaGVja0NhbGxiYWNrOiAoY2hlY2tpbmc6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKGNoZWNraW5nKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMudGFza0NoZWNrZXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMud2l0aFRhc2tMaW5lKCh0YXNrOiBUYXNrTGluZSkgPT4ge1xuICAgICAgICAgIG5ldyBUYXNrUmVwZWF0TW9kYWwodGhpcy5hcHAsIHRhc2spLm9wZW4oKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5hZGRDb21tYW5kKHtcbiAgICAgIGlkOiAnbW92ZS1pbmNvbXBsZXRlZC10b2RheScsXG4gICAgICBuYW1lOiAnTW92ZSBpbmNvbXBsZXRlIHRhc2tzIGZyb20gY3VycmVudCBmaWxlIHRvIHRvZGF5JyxcbiAgICAgIGNoZWNrQ2FsbGJhY2s6IChjaGVja2luZzogYm9vbGVhbikgPT4ge1xuICAgICAgICBjb25zdCBhY3RpdmVMZWFmID0gdGhpcy5hcHAud29ya3NwYWNlLmFjdGl2ZUxlYWY7XG4gICAgICAgIGlmICghKGFjdGl2ZUxlYWYudmlldyBpbnN0YW5jZW9mIE1hcmtkb3duVmlldykpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hlY2tpbmcpIHtcbiAgICAgICAgICAvLyBEaXNhbGxvdyBtb3ZpbmcgdGFza3MgaWYgY3VycmVudGx5IGxvb2tpbmcgYXQgdG9kYXkncyBub3RlXG4gICAgICAgICAgY29uc3QgbSA9IHRoaXMudmF1bHQuZmluZE1vbWVudEZvckRhaWx5Tm90ZShhY3RpdmVMZWFmLnZpZXcuZmlsZSk7XG4gICAgICAgICAgcmV0dXJuICEobSAmJiBtLmlzU2FtZShuZXcgRGF0ZSgpLCAnZGF5JykpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50YXNrSGFuZGxlci5tb3ZlSW5jb21wbGV0ZWQoXG4gICAgICAgICAgYWN0aXZlTGVhZi52aWV3LmZpbGUsXG4gICAgICAgICAgd2luZG93Lm1vbWVudCgpLnN0YXJ0T2YoJ2RheScpLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMuYWRkU2V0dGluZ1RhYihuZXcgU2V0dGluZ3NUYWIodGhpcy5hcHAsIHRoaXMpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZFNldHRpbmdzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5nc1dpdGhEZWZhdWx0cyhhd2FpdCB0aGlzLmxvYWREYXRhKCkpO1xuXG4gICAgaWYgKHNob3VsZENvbmZpZ3VyZUdsb2JhbE1vbWVudCh0aGlzLmFwcCkpIHtcbiAgICAgIHRyeVRvQ29uZmlndXJlR2xvYmFsTW9tZW50KHRoaXMuYXBwLCB0aGlzLnNldHRpbmdzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IHRhc2tDaGVja2VyID0gKCk6IGJvb2xlYW4gPT4ge1xuICAgIGlmIChcbiAgICAgIHRoaXMuYXBwLndvcmtzcGFjZS5hY3RpdmVMZWFmID09PSB1bmRlZmluZWQgfHxcbiAgICAgICEodGhpcy5hcHAud29ya3NwYWNlLmFjdGl2ZUxlYWYudmlldyBpbnN0YW5jZW9mIE1hcmtkb3duVmlldylcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBhY3RpdmVMZWFmID0gdGhpcy5hcHAud29ya3NwYWNlLmFjdGl2ZUxlYWY7XG4gICAgaWYgKCEoYWN0aXZlTGVhZi52aWV3IGluc3RhbmNlb2YgTWFya2Rvd25WaWV3KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVkaXRvciA9IGFjdGl2ZUxlYWYudmlldy5zb3VyY2VNb2RlLmNtRWRpdG9yO1xuICAgIGNvbnN0IGN1cnJlbnRMaW5lID0gZWRpdG9yLmdldExpbmUoZWRpdG9yLmdldEN1cnNvcigpLmxpbmUpO1xuICAgIHJldHVybiB0aGlzLnRhc2tIYW5kbGVyLmlzTGluZVRhc2soY3VycmVudExpbmUpO1xuICB9O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgd2l0aFRhc2tMaW5lID0gYXN5bmMgKFxuICAgIGZuOiAodGFzazogVGFza0xpbmUpID0+IHZvaWQsXG4gICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IGFjdGl2ZUxlYWYgPSB0aGlzLmFwcC53b3Jrc3BhY2UuYWN0aXZlTGVhZjtcbiAgICBpZiAoIShhY3RpdmVMZWFmLnZpZXcgaW5zdGFuY2VvZiBNYXJrZG93blZpZXcpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZWRpdG9yID0gYWN0aXZlTGVhZi52aWV3LnNvdXJjZU1vZGUuY21FZGl0b3I7XG4gICAgY29uc3QgY3Vyc29yUG9zID0gZWRpdG9yLmdldEN1cnNvcigpO1xuICAgIGNvbnN0IHRhc2sgPSBuZXcgVGFza0xpbmUoXG4gICAgICBjdXJzb3JQb3MubGluZSxcbiAgICAgIGFjdGl2ZUxlYWYudmlldy5maWxlLFxuICAgICAgKGF3YWl0IHRoaXMudmF1bHQucmVhZEZpbGUoYWN0aXZlTGVhZi52aWV3LmZpbGUsIHRydWUpKS5zcGxpdCgnXFxuJyksXG4gICAgICB0aGlzLnZhdWx0LFxuICAgICAgdGhpcy5zZXR0aW5ncyxcbiAgICApO1xuICAgIGZuKHRhc2spO1xuICB9O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyTW92ZWRUYXNrcyA9IChcbiAgICBlbDogSFRNTEVsZW1lbnQsXG4gICAgY3R4OiBNYXJrZG93blBvc3RQcm9jZXNzb3JDb250ZXh0LFxuICApOiBQcm9taXNlPGFueT4gfCB2b2lkID0+IHtcbiAgICAvLyBUT0RPOiBXaGVuIHByb2Nlc3NpbmcgYmVmb3JlIHJlbmRlcmluZyBpcyBwb3NzaWJsZSBpbiB0aGUgT2JzaWRpYW4gQVBJLFxuICAgIC8vICAgICAgIHN3aXRjaCB0byB1c2luZyBUYXNrTGluZS5zdmVsdGVcblxuICAgIE9iamVjdC52YWx1ZXMoZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2xpJykpXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAobGlzdEl0ZW0pID0+XG4gICAgICAgICAgIWxpc3RJdGVtLmhhc0NsYXNzKCd0YXNrLWxpc3QtaXRlbScpICYmXG4gICAgICAgICAgbGlzdEl0ZW0uZ2V0VGV4dCgpLnRyaW1TdGFydCgpLnN0YXJ0c1dpdGgoJ1stXScpLFxuICAgICAgKVxuICAgICAgLmZvckVhY2goKGxpc3RJdGVtKSA9PiB7XG4gICAgICAgIGxldCBpbm5lckVsOiBIVE1MRWxlbWVudCA9IGxpc3RJdGVtO1xuICAgICAgICBjb25zdCBwRWxlbWVudHMgPSBsaXN0SXRlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgncCcpO1xuICAgICAgICBpZiAocEVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbGluZXMgaW4gdGhlIGxpc3Qgd2hpY2ggZG8gbm90IHN0YXJ0IHdpdGggYSBgLWAgdGhlblxuICAgICAgICAgIC8vIHRoZSByZW5kZXJlciB3aWxsIHdyYXAgZXZlcnl0aGluZyBpbiBgcGAgZWxlbWVudHMuIEluIHRoaXMgY2FzZVxuICAgICAgICAgIC8vIGxvb2sgYXQgdGhlIGZpcnN0IHRleHQgbm9kZSBpbiB0aGUgcCBlbGVtZW50LlxuICAgICAgICAgIGlubmVyRWwgPSBwRWxlbWVudHNbMF07XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVtb3ZlZFByZWZpeCA9ICcnO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlubmVyRWwuY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGNoaWxkID0gaW5uZXJFbC5jaGlsZE5vZGVzW2ldO1xuICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSAhPT0gMykge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVtb3ZlZFByZWZpeCA9IGNoaWxkLnRleHRDb250ZW50LnNsaWNlKDAsIDQpO1xuICAgICAgICAgIGNoaWxkLnRleHRDb250ZW50ID0gY2hpbGQudGV4dENvbnRlbnQuc2xpY2UoNCk7XG4gICAgICAgICAgYnJlYWs7IC8vIE9ubHkgcGVyZm9ybSB0aGUgcmVwbGFjZW1lbnQgb24gdGhlIGZpcnN0IHRleHRub2RlIGluIGFuIDxsaT5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGljb24gPSAoKCk6IHN0cmluZyA9PiB7XG4gICAgICAgICAgc3dpdGNoIChyZW1vdmVkUHJlZml4KSB7XG4gICAgICAgICAgICBjYXNlICdbLV0gJzpcbiAgICAgICAgICAgICAgcmV0dXJuIHNraXBwZWRJY29uU3ZnO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVW5yZWNvZ25pemVkIHRhc2sgdHlwZTogJyArIHJlbW92ZWRQcmVmaXgpO1xuICAgICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgICAgfVxuICAgICAgICB9KSgpO1xuXG4gICAgICAgIGxpc3RJdGVtLmFkZENsYXNzKCd0YXNrLWxpc3QtaXRlbScpO1xuICAgICAgICBpZiAoaWNvbiA9PT0gc2tpcHBlZEljb25TdmcpIHtcbiAgICAgICAgICBsaXN0SXRlbS5hZGRDbGFzcygnaXMtc2tpcHBlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlubmVyRWwuaW5zZXJ0QmVmb3JlKEVsZW1lbnQoaWNvbiksIGlubmVyRWwuZmlyc3RDaGlsZCk7XG4gICAgICB9KTtcbiAgfTtcbn1cblxuY2xhc3MgTm90aWZpY2F0aW9uTW9kYWwgZXh0ZW5kcyBNb2RhbCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGl0bGU6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBib2R5OiBIVE1MRWxlbWVudDtcblxuICBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgdGl0bGU6IHN0cmluZywgYm9keTogSFRNTEVsZW1lbnQpIHtcbiAgICBzdXBlcihhcHApO1xuICAgIHRoaXMudGl0bGUgPSB0aXRsZTtcbiAgICB0aGlzLmJvZHkgPSBib2R5O1xuICB9XG5cbiAgcHVibGljIG9uT3BlbiA9ICgpOiB2b2lkID0+IHtcbiAgICBjb25zdCB7IHRpdGxlRWwsIGNvbnRlbnRFbCB9ID0gdGhpcztcbiAgICB0aXRsZUVsLnNldFRleHQodGhpcy50aXRsZSk7XG4gICAgY29udGVudEVsLmFwcGVuZENoaWxkKHRoaXMuYm9keSk7XG4gIH07XG59XG5cbmNsYXNzIFRhc2tNb3ZlTW9kYWwgZXh0ZW5kcyBNb2RhbCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGFzazogVGFza0xpbmU7XG5cbiAgY29uc3RydWN0b3IoYXBwOiBBcHAsIHRhc2s6IFRhc2tMaW5lKSB7XG4gICAgc3VwZXIoYXBwKTtcbiAgICB0aGlzLnRhc2sgPSB0YXNrO1xuICB9XG5cbiAgcHVibGljIG9uT3BlbiA9ICgpOiB2b2lkID0+IHtcbiAgICBjb25zdCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcbiAgICBuZXcgVGFza01vdmUoe1xuICAgICAgdGFyZ2V0OiBjb250ZW50RWwsXG4gICAgICBwcm9wczoge1xuICAgICAgICB0YXNrOiB0aGlzLnRhc2ssXG4gICAgICAgIGNsb3NlOiAoKSA9PiB0aGlzLmNsb3NlKCksXG4gICAgICB9LFxuICAgIH0pO1xuICB9O1xuXG4gIHB1YmxpYyBvbkNsb3NlID0gKCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHsgY29udGVudEVsIH0gPSB0aGlzO1xuICAgIGNvbnRlbnRFbC5lbXB0eSgpO1xuICB9O1xufVxuXG5jbGFzcyBUYXNrUmVwZWF0TW9kYWwgZXh0ZW5kcyBNb2RhbCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGFzazogVGFza0xpbmU7XG5cbiAgY29uc3RydWN0b3IoYXBwOiBBcHAsIHRhc2s6IFRhc2tMaW5lKSB7XG4gICAgc3VwZXIoYXBwKTtcbiAgICB0aGlzLnRhc2sgPSB0YXNrO1xuICB9XG5cbiAgcHVibGljIG9uT3BlbiA9ICgpOiB2b2lkID0+IHtcbiAgICBjb25zdCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcbiAgICBuZXcgVGFza1JlcGVhdCh7XG4gICAgICB0YXJnZXQ6IGNvbnRlbnRFbCxcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIHRhc2s6IHRoaXMudGFzayxcbiAgICAgICAgY2xvc2U6ICgpID0+IHRoaXMuY2xvc2UoKSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH07XG5cbiAgcHVibGljIG9uQ2xvc2UgPSAoKTogdm9pZCA9PiB7XG4gICAgY29uc3QgeyBjb250ZW50RWwgfSA9IHRoaXM7XG4gICAgY29udGVudEVsLmVtcHR5KCk7XG4gIH07XG59XG5cbmNsYXNzIFNldHRpbmdzVGFiIGV4dGVuZHMgUGx1Z2luU2V0dGluZ1RhYiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luOiBTbGF0ZWRQbHVnaW47XG5cbiAgY29uc3RydWN0b3IoYXBwOiBBcHAsIHBsdWdpbjogU2xhdGVkUGx1Z2luKSB7XG4gICAgc3VwZXIoYXBwLCBwbHVnaW4pO1xuICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xuICB9XG5cbiAgcHVibGljIGRpc3BsYXkoKTogdm9pZCB7XG4gICAgY29uc3QgeyBjb250YWluZXJFbCB9ID0gdGhpcztcbiAgICBjb250YWluZXJFbC5lbXB0eSgpO1xuXG4gICAgY29udGFpbmVyRWwuY3JlYXRlRWwoJ2gyJywgeyB0ZXh0OiAnU2xhdGVkIFBsdWdpbiAtIFNldHRpbmdzJyB9KTtcblxuICAgIGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdwJywge1xuICAgICAgdGV4dDogJ1RoaXMgcGx1Z2luIGlzIGluIGJldGEgdGVzdGluZy4gQmFjayB1cCB5b3VyIGRhdGEhJyxcbiAgICB9KTtcbiAgICBjb250YWluZXJFbC5jcmVhdGVFbCgncCcsIHtcbiAgICAgIHRleHQ6ICdJZiB5b3UgZW5jb3VudGVyIGJ1Z3MsIG9yIGhhdmUgZmVhdHVyZSByZXF1ZXN0cywgcGxlYXNlIHN1Ym1pdCB0aGVtIG9uIEdpdGh1Yi4nLFxuICAgIH0pO1xuICAgIGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdwJywgeyB0ZXh0OiAnVGhhbmsgeW91LicgfSk7XG5cbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgIC5zZXROYW1lKCdFbXB0eSBsaW5lIGFmdGVyIGhlYWRpbmdzJylcbiAgICAgIC5zZXREZXNjKFxuICAgICAgICAnV2hlbiBjcmVhdGluZyBoZWFkaW5ncyBvciBhZGRpbmcgdGFza3MsIGxlYXZlIGFuIGVtcHR5IGxpbmUgYmVsb3cgYW55IGhlYWRpbmdzLicsXG4gICAgICApXG4gICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHtcbiAgICAgICAgdG9nZ2xlXG4gICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmJsYW5rTGluZUFmdGVySGVhZGVyKVxuICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmJsYW5rTGluZUFmdGVySGVhZGVyID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5zYXZlRGF0YSh0aGlzLnBsdWdpbi5zZXR0aW5ncyk7XG4gICAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgLnNldE5hbWUoJ1ByZXNlcnZlIGluY29tcGxldGUgdGFza3Mgd2hlbiBtb3ZpbmcnKVxuICAgICAgLnNldERlc2MoXG4gICAgICAgICdXaGVuIG1vdmluZyBhIHRhc2sgdG8gYSBkaWZmZXJlbnQgbm90ZSwgbWFyayB0aGUgdGFzayBhcyBtb3ZlZCB3aXRoIFs+XSBpbiB0aGUgY3VycmVudCBub3RlIHJhdGhlciB0aGFuIGRlbGV0aW5nIGl0LicsXG4gICAgICApXG4gICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHtcbiAgICAgICAgdG9nZ2xlXG4gICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnByZXNlcnZlTW92ZWRUYXNrcylcbiAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5wcmVzZXJ2ZU1vdmVkVGFza3MgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLnNhdmVEYXRhKHRoaXMucGx1Z2luLnNldHRpbmdzKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAuc2V0TmFtZSgnVGFza3Mgc2VjdGlvbiBoZWFkZXInKVxuICAgICAgLnNldERlc2MoXG4gICAgICAgICdNYXJrZG93biBoZWFkZXIgdG8gdXNlIHdoZW4gY3JlYXRpbmcgdGFza3Mgc2VjdGlvbiBpbiBhIGRvY3VtZW50JyxcbiAgICAgIClcbiAgICAgIC5hZGRUZXh0KCh0ZXh0KSA9PiB7XG4gICAgICAgIHRleHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MudGFza3NIZWFkZXIpLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgIGlmICghdmFsdWUuc3RhcnRzV2l0aCgnIycpKSB7XG4gICAgICAgICAgICBuZXcgTm90aWNlKCdUYXNrcyBzZWN0aW9uIGhlYWRlciBtdXN0IHN0YXJ0IHdpdGggXCIjXCInKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy50YXNrc0hlYWRlciA9IHZhbHVlO1xuICAgICAgICAgIHRoaXMucGx1Z2luLnNhdmVEYXRhKHRoaXMucGx1Z2luLnNldHRpbmdzKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgIGlmIChzaG91bGRDb25maWd1cmVHbG9iYWxNb21lbnQodGhpcy5hcHApKSB7XG4gICAgICBjb25zdCBzeXNMb2NhbGUgPSBuYXZpZ2F0b3IubGFuZ3VhZ2U/LnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIGNvbnN0IGxvY2FsaXplZFdlZWtkYXlzID0gd2luZG93Lm1vbWVudC53ZWVrZGF5cygpO1xuICAgICAgY29uc3QgbG9jYWxlV2Vla1N0YXJ0TnVtID0gd2luZG93Ll9idW5kbGVkTG9jYWxlV2Vla1NwZWM/LmRvdztcbiAgICAgIGNvbnN0IGxvY2FsZVdlZWtTdGFydCA9IHdpbmRvdy5tb21lbnQud2Vla2RheXMoKVtsb2NhbGVXZWVrU3RhcnROdW1dO1xuICAgICAgY29uc3Qgd2Vla2RheXMgPSBbXG4gICAgICAgICdzdW5kYXknLFxuICAgICAgICAnbW9uZGF5JyxcbiAgICAgICAgJ3R1ZXNkYXknLFxuICAgICAgICAnd2VkbmVzZGF5JyxcbiAgICAgICAgJ3RodXJzZGF5JyxcbiAgICAgICAgJ2ZyaWRheScsXG4gICAgICAgICdzYXR1cmRheScsXG4gICAgICBdO1xuXG4gICAgICBuZXcgU2V0dGluZyh0aGlzLmNvbnRhaW5lckVsKVxuICAgICAgICAuc2V0TmFtZSgnU3RhcnQgd2VlayBvbjonKVxuICAgICAgICAuc2V0RGVzYyhcbiAgICAgICAgICBcIkNob29zZSB3aGF0IGRheSBvZiB0aGUgd2VlayB0byBzdGFydC4gU2VsZWN0ICdMb2NhbGUgZGVmYXVsdCcgdG8gdXNlIHRoZSBkZWZhdWx0IHNwZWNpZmllZCBieSBtb21lbnQuanNcIixcbiAgICAgICAgKVxuICAgICAgICAuYWRkRHJvcGRvd24oKGRyb3Bkb3duKSA9PiB7XG4gICAgICAgICAgZHJvcGRvd24uYWRkT3B0aW9uKCdsb2NhbGUnLCBgTG9jYWxlIGRlZmF1bHQgKCR7bG9jYWxlV2Vla1N0YXJ0fSlgKTtcbiAgICAgICAgICBsb2NhbGl6ZWRXZWVrZGF5cy5mb3JFYWNoKChkYXksIGkpID0+IHtcbiAgICAgICAgICAgIGRyb3Bkb3duLmFkZE9wdGlvbih3ZWVrZGF5c1tpXSwgZGF5KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBkcm9wZG93bi5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy53ZWVrU3RhcnQpO1xuICAgICAgICAgIGRyb3Bkb3duLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3Mud2Vla1N0YXJ0ID0gdmFsdWUgYXMgSVdlZWtTdGFydE9wdGlvbjtcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLnNhdmVEYXRhKHRoaXMucGx1Z2luLnNldHRpbmdzKTtcbiAgICAgICAgICAgIHRyeVRvQ29uZmlndXJlR2xvYmFsTW9tZW50KHRoaXMuYXBwLCB0aGlzLnBsdWdpbi5zZXR0aW5ncyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgLnNldE5hbWUoJ092ZXJyaWRlIGxvY2FsZTonKVxuICAgICAgICAuc2V0RGVzYyhcbiAgICAgICAgICAnU2V0IHRoaXMgaWYgeW91IHdhbnQgdG8gdXNlIGEgbG9jYWxlIGRpZmZlcmVudCBmcm9tIHRoZSBkZWZhdWx0JyxcbiAgICAgICAgKVxuICAgICAgICAuYWRkRHJvcGRvd24oKGRyb3Bkb3duKSA9PiB7XG4gICAgICAgICAgZHJvcGRvd24uYWRkT3B0aW9uKCdzeXN0ZW0tZGVmYXVsdCcsIGBTYW1lIGFzIHN5c3RlbSAoJHtzeXNMb2NhbGV9KWApO1xuICAgICAgICAgIHdpbmRvdy5tb21lbnQubG9jYWxlcygpLmZvckVhY2goKGxvY2FsZSkgPT4ge1xuICAgICAgICAgICAgZHJvcGRvd24uYWRkT3B0aW9uKGxvY2FsZSwgbG9jYWxlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBkcm9wZG93bi5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5sb2NhbGVPdmVycmlkZSk7XG4gICAgICAgICAgZHJvcGRvd24ub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5sb2NhbGVPdmVycmlkZSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xuICAgICAgICAgICAgdHJ5VG9Db25maWd1cmVHbG9iYWxNb21lbnQodGhpcy5hcHAsIHRoaXMucGx1Z2luLnNldHRpbmdzKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZGl2ID0gY29udGFpbmVyRWwuY3JlYXRlRWwoJ2RpdicsIHtcbiAgICAgIGNsczogJ3NsYXRlZC1kb25hdGlvbicsXG4gICAgfSk7XG5cbiAgICBjb25zdCBkb25hdGVUZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpO1xuICAgIGRvbmF0ZVRleHQuYXBwZW5kVGV4dChcbiAgICAgICdJZiB0aGlzIHBsdWdpbiBhZGRzIHZhbHVlIGZvciB5b3UgYW5kIHlvdSB3b3VsZCBsaWtlIHRvIGhlbHAgc3VwcG9ydCAnICtcbiAgICAgICAgJ2NvbnRpbnVlZCBkZXZlbG9wbWVudCwgcGxlYXNlIHVzZSB0aGUgYnV0dG9ucyBiZWxvdzonLFxuICAgICk7XG4gICAgZGl2LmFwcGVuZENoaWxkKGRvbmF0ZVRleHQpO1xuXG4gICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuXG4gICAgZGl2LmFwcGVuZENoaWxkKFxuICAgICAgY3JlYXRlRG9uYXRlQnV0dG9uKFxuICAgICAgICAnaHR0cHM6Ly9wYXlwYWwubWUvdGdyb3NpbmdlcicsXG4gICAgICAgIHBhcnNlci5wYXJzZUZyb21TdHJpbmcocGF5cGFsLCAndGV4dC94bWwnKS5kb2N1bWVudEVsZW1lbnQsXG4gICAgICApLFxuICAgICk7XG5cbiAgICBkaXYuYXBwZW5kQ2hpbGQoXG4gICAgICBjcmVhdGVEb25hdGVCdXR0b24oXG4gICAgICAgICdodHRwczovL3d3dy5idXltZWFjb2ZmZWUuY29tL3Rncm9zaW5nZXInLFxuICAgICAgICBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGJ1eU1lQUNvZmZlZSwgJ3RleHQveG1sJykuZG9jdW1lbnRFbGVtZW50LFxuICAgICAgKSxcbiAgICApO1xuICB9XG59XG5cbmNvbnN0IGNyZWF0ZURvbmF0ZUJ1dHRvbiA9IChsaW5rOiBzdHJpbmcsIGltZzogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudCA9PiB7XG4gIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gIGEuc2V0QXR0cmlidXRlKCdocmVmJywgbGluayk7XG4gIGEuYWRkQ2xhc3MoJ3NsYXRlZC1kb25hdGUtYnV0dG9uJyk7XG4gIGEuYXBwZW5kQ2hpbGQoaW1nKTtcbiAgcmV0dXJuIGE7XG59O1xuIl0sIm5hbWVzIjpbImVtcHR5IiwiZGF0ZXV0aWwiLCJpc051bWJlciIsInBhZFN0YXJ0Iiwid2Vla2RheXMiLCJEYXRlVGltZSIsIkRFRkFVTFRfT1BUSU9OUyIsImluaXRpYWxpemVPcHRpb25zIiwiRnJlcXVlbmN5IiwiUkZyZXF1ZW5jeSIsIk5vdGljZSIsIm5vb3AiLCJydW4iLCJibGFua19vYmplY3QiLCJydW5fYWxsIiwiaXNfZnVuY3Rpb24iLCJzYWZlX25vdF9lcXVhbCIsImlzX2VtcHR5IiwiYXBwZW5kIiwiaW5zZXJ0IiwiZGV0YWNoIiwiZGVzdHJveV9lYWNoIiwiZWxlbWVudCIsInRleHQiLCJzcGFjZSIsImxpc3RlbiIsImF0dHIiLCJjaGlsZHJlbiIsInNldF9kYXRhIiwiY3VycmVudF9jb21wb25lbnQiLCJzZXRfY3VycmVudF9jb21wb25lbnQiLCJkaXJ0eV9jb21wb25lbnRzIiwiYmluZGluZ19jYWxsYmFja3MiLCJyZW5kZXJfY2FsbGJhY2tzIiwiZmx1c2hfY2FsbGJhY2tzIiwicmVzb2x2ZWRfcHJvbWlzZSIsInVwZGF0ZV9zY2hlZHVsZWQiLCJzY2hlZHVsZV91cGRhdGUiLCJmbHVzaCIsImFkZF9yZW5kZXJfY2FsbGJhY2siLCJmbHVzaGluZyIsInNlZW5fY2FsbGJhY2tzIiwidXBkYXRlIiwib3V0cm9pbmciLCJvdXRyb3MiLCJncm91cF9vdXRyb3MiLCJjaGVja19vdXRyb3MiLCJ0cmFuc2l0aW9uX2luIiwidHJhbnNpdGlvbl9vdXQiLCJjcmVhdGVfY29tcG9uZW50IiwibW91bnRfY29tcG9uZW50IiwiZGVzdHJveV9jb21wb25lbnQiLCJtYWtlX2RpcnR5IiwiaW5pdCIsIlN2ZWx0ZUNvbXBvbmVudCIsIm9ic2lkaWFuIiwiZ2V0RGF0ZVVJRCIsImdldEFsbERhaWx5Tm90ZXMiLCJnZXRBbGxXZWVrbHlOb3RlcyIsImdldEFsbE1vbnRobHlOb3RlcyIsImdldERhaWx5Tm90ZSIsImNyZWF0ZURhaWx5Tm90ZSIsImdldERhaWx5Tm90ZVNldHRpbmdzIiwiZ2V0V2Vla2x5Tm90ZVNldHRpbmdzIiwiZ2V0TW9udGhseU5vdGVTZXR0aW5ncyIsIlBsdWdpbiIsIk1hcmtkb3duVmlldyIsIk1hcmtkb3duUHJldmlld1JlbmRlcmVyIiwiTW9kYWwiLCJQbHVnaW5TZXR0aW5nVGFiIiwiU2V0dGluZyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUFDLFFBQVEsQ0FBQyxJQUFJLFFBQVEsS0FBSyxJQUFJLElBQUksUUFBUSxLQUFLLEVBQUUsRUFBRTtBQUNyRSxJQUFJLE9BQU8sU0FBUyxDQUFDO0FBQ3JCLEdBQUcsTUFBTTtBQUNULElBQUksTUFBTSxDQUFDLEdBQUcsVUFBVSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDakQsSUFBSSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDekIsR0FBRztBQUNILENBQUM7QUFDRCxTQUFTLE9BQU8sQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFVBQVUsR0FBRyxLQUFLLEVBQUU7QUFDckQsRUFBRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUM7QUFDckMsUUFBUSxPQUFPLEdBQUcsVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztBQUN2RCxFQUFFLE9BQU8sT0FBTyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUM7QUFDM0MsQ0FBQztBQUNEO0FBQ0EsU0FBUyxVQUFVLENBQUMsSUFBSSxFQUFFO0FBQzFCLEVBQUUsT0FBTyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsSUFBSSxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ2xFLENBQUM7QUFDRCxTQUFTLFVBQVUsQ0FBQyxJQUFJLEVBQUU7QUFDMUIsRUFBRSxPQUFPLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3RDLENBQUM7QUFDRCxTQUFTLFdBQVcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO0FBQ2xDLEVBQUUsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQztBQUM5QyxRQUFRLE9B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QUksQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7QUFDcEYsUUFBUSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRTtBQUN0QyxJQUFJLElBQUk7QUFDUixJQUFJLEtBQUs7QUFDVCxJQUFJLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO0FBQzFHLEdBQUcsQ0FBQztBQUNKLFFBQVEsV0FBVyxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUM7QUFDMUMsSUFBSSxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7QUFDNUMsSUFBSSxRQUFRLEVBQUUsR0FBRyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7QUFDckQsSUFBSSxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7QUFDL0MsSUFBSSxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7QUFDNUMsSUFBSSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFDekMsSUFB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QyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbk8sSUFBSSxRQUFRLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuTyxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZCLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDdkIsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUN2QixJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZCLElBQUksV0FBVyxHQUFHLGNBQWMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlHLElBQUksV0FBVyxHQUFHLGNBQWMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlHLElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN6QixJQUFJLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDekIsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3pCLElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN6QixJQUFJLFlBQVksR0FBRyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1SCxJQUFJLFlBQVksR0FBRyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1SCxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzdFLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDN0UsSUFBSSxRQUFRLEdBQUcsQ0FBQyxZQUFZO0FBQzVCLElBQUksSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDO0FBQ3RCLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUU7QUFDL0IsUUFBUSxRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3QyxJQUFJLE9BQU8sUUFBUSxDQUFDO0FBQ3BCLENBQUMsR0FBRzs7QUN2QkcsU0FBUyxXQUFXLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRTtBQUMzQyxJQUFJLElBQUksU0FBUyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25ELElBQUksSUFBSSxPQUFPLEdBQUdBLFVBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUN4RCxJQUFJLElBQUksV0FBVyxHQUFHQSxVQUFRLENBQUMsVUFBVSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2hFLElBQUksSUFBSSxXQUFXLEdBQUdBLFVBQVEsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDcEQsSUFBSSxJQUFJLFdBQVcsR0FBR0EsVUFBUSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUNyRCxJQUFJLElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxPQUFPLEVBQUUsT0FBTztBQUNyRCxRQUFRLFdBQVcsRUFBRSxXQUFXO0FBQ2hDLFFBQVEsV0FBVyxFQUFFLFdBQVc7QUFDaEMsUUFBUSxXQUFXLEVBQUUsV0FBVyxFQUFFLEVBQUUsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUM3RSxJQUFJLElBQUlELE9BQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUU7QUFDakMsUUFBUSxPQUFPLE1BQU0sQ0FBQztBQUN0QixLQUFLO0FBQ0wsSUFBSSxNQUFNLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEVBQUUsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzVDLElBQUksSUFBSSxTQUFTLENBQUM7QUFDbEIsSUFBSSxJQUFJLFFBQVEsQ0FBQztBQUNqQixJQUFJLElBQUksT0FBTyxHQUFHLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLFdBQVcsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3ZFLElBQUksSUFBSSxPQUFPLElBQUksQ0FBQyxFQUFFO0FBQ3RCLFFBQVEsT0FBTyxHQUFHLENBQUMsQ0FBQztBQUNwQjtBQUNBO0FBQ0EsUUFBUSxRQUFRO0FBQ2hCLFlBQVksTUFBTSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDbEUsS0FBSztBQUNMLFNBQVM7QUFDVDtBQUNBO0FBQ0EsUUFBUSxRQUFRLEdBQUcsT0FBTyxHQUFHLE9BQU8sQ0FBQztBQUNyQyxLQUFLO0FBQ0wsSUFBSSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN2QyxJQUFJLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDakMsSUFBSSxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDN0MsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDdEQsUUFBUSxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BDLFFBQVEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO0FBQ25CLFlBQVksQ0FBQyxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFDOUIsU0FBUztBQUNULFFBQVEsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLFFBQVEsQ0FBQyxFQUFFO0FBQ3ZDLFlBQVksU0FBUztBQUNyQixTQUFTO0FBQ1QsUUFBUSxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztBQUN2QixRQUFRLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUNuQixZQUFZLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN0QyxZQUFZLElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRTtBQUN2QyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUM7QUFDbkMsYUFBYTtBQUNiLFNBQVM7QUFDVCxhQUFhO0FBQ2IsWUFBWSxDQUFDLEdBQUcsT0FBTyxDQUFDO0FBQ3hCLFNBQVM7QUFDVCxRQUFRLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDcEMsWUFBWSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNsQyxZQUFZLENBQUMsRUFBRSxDQUFDO0FBQ2hCLFlBQVksSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQyxJQUFJO0FBQ25ELGdCQUFnQixNQUFNO0FBQ3RCLFNBQVM7QUFDVCxLQUFLO0FBQ0wsSUFBSSxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxFQUFFO0FBQ3ZDO0FBQ0E7QUFDQSxRQUFRLElBQUksQ0FBQyxHQUFHLE9BQU8sR0FBRyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZDLFFBQVEsSUFBSSxPQUFPLEtBQUssU0FBUztBQUNqQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDO0FBQy9CLFFBQVEsSUFBSSxDQUFDLEdBQUcsT0FBTyxFQUFFO0FBQ3pCO0FBQ0E7QUFDQSxZQUFZLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDeEMsZ0JBQWdCLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3ZCLGdCQUFnQixJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDLElBQUk7QUFDdkQsb0JBQW9CLE1BQU07QUFDMUIsYUFBYTtBQUNiLFNBQVM7QUFDVCxLQUFLO0FBQ0wsSUFBSSxJQUFJLE9BQU8sRUFBRTtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDO0FBQy9CLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDN0MsWUFBWSxJQUFJLFlBQVksR0FBR0MsVUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2RixZQUFZLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLE9BQU8sRUFBRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDL0UsWUFBWSxJQUFJLFFBQVEsR0FBR0EsVUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNyRSxZQUFZLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDO0FBQ2hDLFlBQVksSUFBSSxRQUFRLElBQUksQ0FBQyxFQUFFO0FBQy9CLGdCQUFnQixRQUFRLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLGdCQUFnQixNQUFNLEdBQUcsUUFBUSxHQUFHLEtBQUssQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMxRSxhQUFhO0FBQ2IsaUJBQWlCO0FBQ2pCLGdCQUFnQixNQUFNLEdBQUcsT0FBTyxHQUFHLE9BQU8sQ0FBQztBQUMzQyxhQUFhO0FBQ2IsWUFBWSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM5RCxTQUFTO0FBQ1QsYUFBYTtBQUNiLFlBQVksU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzNCLFNBQVM7QUFDVCxRQUFRLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLEVBQUU7QUFDbkQsWUFBWSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUMsRUFBRTtBQUM1QyxnQkFBZ0IsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEMsU0FBUztBQUNULEtBQUs7QUFDTCxJQUFJLE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUM7QUFDRCxTQUFTLGFBQWEsQ0FBQyxJQUFJLEVBQUU7QUFDN0IsSUFBSSxJQUFJLE9BQU8sR0FBR0EsVUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3hELElBQUksSUFBSSxTQUFTLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkQsSUFBSSxJQUFJLElBQUksR0FBR0EsVUFBUSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUM5QyxJQUFJLElBQUksT0FBTyxLQUFLLEdBQUcsRUFBRTtBQUN6QixRQUFRLE9BQU87QUFDZixZQUFZLEtBQUssRUFBRSxRQUFRO0FBQzNCLFlBQVksUUFBUSxFQUFFLFdBQVc7QUFDakMsWUFBWSxTQUFTLEVBQUUsWUFBWTtBQUNuQyxZQUFZLFFBQVEsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztBQUMxQyxZQUFZLE1BQU0sRUFBRSxTQUFTO0FBQzdCLFNBQVMsQ0FBQztBQUNWLEtBQUs7QUFDTCxJQUFJLE9BQU87QUFDWCxRQUFRLEtBQUssRUFBRSxRQUFRO0FBQ3ZCLFFBQVEsUUFBUSxFQUFFLFdBQVc7QUFDN0IsUUFBUSxTQUFTLEVBQUUsWUFBWTtBQUMvQixRQUFRLFFBQVEsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztBQUN0QyxRQUFRLE1BQU0sRUFBRSxTQUFTO0FBQ3pCLEtBQUssQ0FBQztBQUNOOztBQ2hJTyxTQUFTLFlBQVksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRTtBQUM5RSxJQUFJLElBQUksTUFBTSxHQUFHO0FBQ2pCLFFBQVEsUUFBUSxFQUFFLElBQUk7QUFDdEIsUUFBUSxTQUFTLEVBQUUsS0FBSztBQUN4QixRQUFRLFNBQVMsRUFBRSxFQUFFO0FBQ3JCLEtBQUssQ0FBQztBQUNOLElBQUksSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ3BCLElBQUksSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxNQUFNLEVBQUU7QUFDdkMsUUFBUSxJQUFJRCxPQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO0FBQ3BDLFlBQVksTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUNwQyxTQUFTO0FBQ1QsYUFBYTtBQUNiLFlBQVksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzdELGdCQUFnQixLQUFLLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQyxnQkFBZ0IsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEUsYUFBYTtBQUNiLFNBQVM7QUFDVCxLQUFLO0FBQ0wsU0FBUyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLE9BQU8sRUFBRTtBQUM3QyxRQUFRLE1BQU0sR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0RCxLQUFLO0FBQ0wsSUFBSSxJQUFJQSxPQUFLLENBQUMsTUFBTSxDQUFDLEVBQUU7QUFDdkIsUUFBUSxPQUFPLE1BQU0sQ0FBQztBQUN0QixLQUFLO0FBQ0w7QUFDQTtBQUNBLElBQUksTUFBTSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzFDLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDNUMsUUFBUSxJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0IsUUFBUSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsUUFBUSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQy9CLFFBQVEsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzVELFlBQVksSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7QUFDM0IsWUFBWSxJQUFJLEVBQUUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwRSxZQUFZLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUN2QixnQkFBZ0IsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3ZDLGdCQUFnQixDQUFDLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDbEQsYUFBYTtBQUNiLGlCQUFpQjtBQUNqQixnQkFBZ0IsQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3hDLGdCQUFnQixDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3RELGFBQWE7QUFDYixZQUFZLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSTtBQUN2QyxnQkFBZ0IsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEMsU0FBUztBQUNULEtBQUs7QUFDTCxJQUFJLE9BQU8sTUFBTSxDQUFDO0FBQ2xCOztBQ2pETyxTQUFTLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFO0FBQ2xDLElBQUksSUFBSSxNQUFNLEtBQUssS0FBSyxDQUFDLEVBQUUsRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUU7QUFDMUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ25CLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDaEMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ3BCLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDOUIsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2xCLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7QUFDckMsSUFBSSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDeEMsSUFBSSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ3JELElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDOUIsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2xCLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdkQsSUFBSSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUNwRCxJQUFJLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZELElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMvQyxJQUFJ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QVMsR0FBRyxPQUFPLENBQUMsU0FBUyxFQUFFLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxFQUFFLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxFQUFFLFdBQVcsR0FBRyxPQUFPLENBQUMsV0FBVyxFQUFFLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDO0FBQzlOLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUMxRSxTQUFTLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDdkQsU0FBUyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztBQUM5RSxTQUFTLFFBQVEsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQzdELFNBQVMsUUFBUSxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ25FLFNBQVMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksUUFBUSxDQUFDLFdBQVcsQ0FBQztBQUN2RCxZQUFZLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQzFELFlBQVksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztBQUM3RCxTQUFTLFFBQVEsQ0FBQyxTQUFTLENBQUM7QUFDNUIsYUFBYSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUMsT0FBTztBQUNyQyxnQkFBZ0IsQ0FBQyxRQUFR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 diff --git a/.obsidian/plugins/slated-obsidian/manifest.json b/.obsidian/plugins/slated-obsidian/manifest.json deleted file mode 100644 index e918bcf2d..000000000 --- a/.obsidian/plugins/slated-obsidian/manifest.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "id": "slated-obsidian", - "name": "Slated", - "author": "Tony Grosinger", - "authorUrl": "https://grosinger.net", - "description": "Task Management - schedule, move, and repeat tasks", - "isDesktopOnly": false, - "version": "0.5.1", - "minAppVersion": "0.12.1", - "js": "main.js" -} diff --git a/.obsidian/plugins/slated-obsidian/styles.css b/.obsidian/plugins/slated-obsidian/styles.css deleted file mode 100644 index 1fa154ebc..000000000 --- a/.obsidian/plugins/slated-obsidian/styles.css +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Custom preview-mode rendering - */ - -.slated-task-icon { - height: 17px; - width: 17px; - margin-left: 5px; - margin-right: 6px; - position: relative; - top: 3px; - fill: var(--text-muted); - stroke: var(--text-muted); -} - -/* - * Slated Task View - */ - -.slated-task-view-filter-icon { - height: 20px; - width: 20px; - margin-left: 5px; - margin-right: 6px; - position: relative; - top: 3px; - fill: var(--text-on-accent); - stroke: var(--text-on-accent); -} - -.slated-task-view-filter-button { - padding: 8px 5px; -} - -/* - * Task Repetition Modal - */ - -.slated-modal input { - border-radius: 0.5em; - padding: 19px 14px; -} - -#slated-interval-selector { - width: 60px; -} - -#slated-frequency-selector { - width: 103px; -} - -#slated-onthe-selector { - width: 60px; -} - -.slated-months-btn-group button { - padding: 6px 8px; - margin: 3px 6px 3px 0; -} - -.slated-days-btn-group button { - padding: 6px 8px; - margin: 3px 6px 3px 0; -} - -#slated-selected-weeks ul { - list-style: none; -} - -#slated-repetition-preview { - width: 100%; -} - -#slated-save-repetition-config { - margin-top: 3px; -} - -/* - * Task Move Modal - */ - -.slated-move-option label { - color: var(--text-muted); - font-size: small; -} - -/* - * Donate - in Settings - */ - -.slated-donation { - width: 70%; - margin: 0 auto; - text-align: center; -} - -.slated-donate-button { - margin: 10px; -} diff --git a/.obsidian/plugins/sliding-panes-obsidian/data.json b/.obsidian/plugins/sliding-panes-obsidian/data.json deleted file mode 100644 index 84cbf796e..000000000 --- a/.obsidian/plugins/sliding-panes-obsidian/data.json +++ /dev/null @@ -1 +0,0 @@ -{"headerWidth":32,"leafWidth":700,"leafAutoWidth":false,"disabled":false,"rotateHeaders":true,"headerAlt":false,"orienation":"mixed","stackingEnabled":true,"smoothAnimation":false} \ No newline at end of file diff --git a/.obsidian/plugins/sliding-panes-obsidian/main.js b/.obsidian/plugins/sliding-panes-obsidian/main.js deleted file mode 100644 index 8e434e3c8..000000000 --- a/.obsidian/plugins/sliding-panes-obsidian/main.js +++ /dev/null @@ -1,589 +0,0 @@ -'use strict'; - -var obsidian = require('obsidian'); - -/*! ***************************************************************************** -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -***************************************************************************** */ -/* global Reflect, Promise */ - -var extendStatics = function(d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); -}; - -function __extends(d, b) { - if (typeof b !== "function" && b !== null) - throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -} - -function __awaiter(thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -} - -function __generator(thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -} - -var SlidingPanesSettings = /** @class */ (function () { - function SlidingPanesSettings() { - this.headerWidth = 32; - this.leafWidth = 700; - this.leafAutoWidth = false; - this.disabled = false; - this.rotateHeaders = true; - this.headerAlt = false; - this.orienation = "mixed"; - this.stackingEnabled = true; - this.smoothAnimation = true; - } - return SlidingPanesSettings; -}()); -var SlidingPanesSettingTab = /** @class */ (function (_super) { - __extends(SlidingPanesSettingTab, _super); - function SlidingPanesSettingTab(app, plugin) { - var _this = _super.call(this, app, plugin) || this; - _this.plugin = plugin; - return _this; - } - SlidingPanesSettingTab.prototype.display = function () { - var _this = this; - var containerEl = this.containerEl; - containerEl.empty(); - new obsidian.Setting(containerEl) - .setName("Toggle Sliding Panes") - .setDesc("Turns sliding panes on or off globally") - .addToggle(function (toggle) { return toggle.setValue(!_this.plugin.settings.disabled) - .onChange(function (value) { - _this.plugin.settings.disabled = !value; - _this.plugin.saveData(_this.plugin.settings); - if (_this.plugin.settings.disabled) { - _this.plugin.disable(); - } - else { - _this.plugin.enable(); - } - }); }); - new obsidian.Setting(containerEl) - .setName('Smooth Animation') - .setDesc('Whether to use smooth animation (on) or snapping (off)') - .addToggle(function (toggle) { return toggle.setValue(_this.plugin.settings.smoothAnimation) - .onChange(function (value) { - _this.plugin.settings.smoothAnimation = value; - _this.plugin.saveData(_this.plugin.settings); - _this.plugin.refresh(); - }); }); - new obsidian.Setting(containerEl) - .setName('Leaf Auto Width') - .setDesc('If on, the width of the pane should fill the available space') - .addToggle(function (toggle) { return toggle.setValue(_this.plugin.settings.leafAutoWidth) - .onChange(function (value) { - _this.plugin.settings.leafAutoWidth = value; - _this.plugin.saveData(_this.plugin.settings); - _this.plugin.refresh(); - }); }); - new obsidian.Setting(containerEl) - .setName('Leaf Width') - .setDesc('The width of a single pane (only if auto width is off)') - .addText(function (text) { return text.setPlaceholder('Example: 700') - .setValue((_this.plugin.settings.leafWidth || '') + '') - .onChange(function (value) { - _this.plugin.settings.leafWidth = parseInt(value.trim()); - _this.plugin.saveData(_this.plugin.settings); - _this.plugin.refresh(); - }); }); - new obsidian.Setting(containerEl) - .setName("Toggle rotated headers") - .setDesc("Rotates headers to use as spines") - .addToggle(function (toggle) { return toggle.setValue(_this.plugin.settings.rotateHeaders) - .onChange(function (value) { - _this.plugin.settings.rotateHeaders = value; - _this.plugin.saveData(_this.plugin.settings); - _this.plugin.refresh(); - }); }); - new obsidian.Setting(containerEl) - .setName("Swap rotated header direction") - .setDesc("Swaps the direction of rotated headers") - .addToggle(function (toggle) { return toggle.setValue(_this.plugin.settings.headerAlt) - .onChange(function (value) { - _this.plugin.settings.headerAlt = value; - _this.plugin.saveData(_this.plugin.settings); - _this.plugin.refresh(); - }); }); - new obsidian.Setting(containerEl) - .setName("Header text orientation") - .setDesc("Select the header text orientation") - .addDropdown(function (dropdown) { - dropdown.addOption("sideway", "Sideway"); - dropdown.addOption("mixed", "Mixed"); - dropdown.addOption("upright", "Upright"); - dropdown.setValue(_this.plugin.settings.orienation); - dropdown.onChange(function (value) { - _this.plugin.settings.orienation = value; - _this.plugin.saveData(_this.plugin.settings); - _this.plugin.refresh(); - }); - }); - new obsidian.Setting(containerEl) - .setName("Toggle stacking") - .setDesc("Panes will stack up to the left and right") - .addToggle(function (toggle) { return toggle.setValue(_this.plugin.settings.stackingEnabled) - .onChange(function (value) { - _this.plugin.settings.stackingEnabled = value; - _this.plugin.saveData(_this.plugin.settings); - _this.plugin.refresh(); - }); }); - new obsidian.Setting(containerEl) - .setName('Spine Width') - .setDesc('The width of the rotated header (or gap) for stacking') - .addText(function (text) { return text.setPlaceholder('Example: 32') - .setValue((_this.plugin.settings.headerWidth || '') + '') - .onChange(function (value) { - _this.plugin.settings.headerWidth = parseInt(value.trim()); - _this.plugin.saveData(_this.plugin.settings); - _this.plugin.refresh(); - }); }); - }; - return SlidingPanesSettingTab; -}(obsidian.PluginSettingTab)); -var SlidingPanesCommands = /** @class */ (function () { - function SlidingPanesCommands(plugin) { - this.plugin = plugin; - } - SlidingPanesCommands.prototype.addToggleSettingCommand = function (id, name, settingName) { - var _this = this; - this.plugin.addCommand({ - id: id, - name: name, - callback: function () { - // switch the setting, save and refresh - //@ts-ignore - _this.plugin.settings[settingName] = !_this.plugin.settings[settingName]; - _this.plugin.saveData(_this.plugin.settings); - _this.plugin.refresh(); - } - }); - }; - SlidingPanesCommands.prototype.addCommands = function () { - var _this = this; - // add the toggle on/off command - this.plugin.addCommand({ - id: 'toggle-sliding-panes', - name: 'Toggle Sliding Panes', - callback: function () { - // switch the disabled setting and save - _this.plugin.settings.disabled = !_this.plugin.settings.disabled; - _this.plugin.saveData(_this.plugin.settings); - // disable or enable as necessary - _this.plugin.settings.disabled ? _this.plugin.disable() : _this.plugin.enable(); - } - }); - // add a command to toggle smooth animation - this.addToggleSettingCommand('toggle-sliding-panes-smooth-animation', 'Toggle Smooth Animation', 'smoothAnimation'); - // add a command to toggle leaf auto width - this.addToggleSettingCommand('toggle-sliding-panes-leaf-auto-width', 'Toggle Leaf Auto Width', 'leafAutoWidth'); - // add a command to toggle stacking - this.addToggleSettingCommand('toggle-sliding-panes-stacking', 'Toggle Stacking', 'stackingEnabled'); - // add a command to toggle rotated headers - this.addToggleSettingCommand('toggle-sliding-panes-rotated-headers', 'Toggle Rotated Headers', 'rotateHeaders'); - // add a command to toggle swapped header direction - this.addToggleSettingCommand('toggle-sliding-panes-header-alt', 'Swap rotated header direction', 'headerAlt'); - }; - return SlidingPanesCommands; -}()); - -var SlidingPanesPlugin = /** @class */ (function (_super) { - __extends(SlidingPanesPlugin, _super); - function SlidingPanesPlugin() { - var _this = _super !== null && _super.apply(this, arguments) || this; - // helper variables - _this.activeLeafIndex = 0; - _this.prevRootLeaves = []; - // enable andy mode - _this.enable = function () { - // add the event handlers - _this.registerEvent(_this.app.workspace.on('resize', _this.handleResize)); - _this.registerEvent(_this.app.workspace.on('layout-change', _this.handleLayoutChange)); - _this.registerEvent(_this.app.workspace.on('file-open', _this.handleFileOpen)); - _this.registerEvent(_this.app.vault.on('delete', _this.handleDelete)); - // wait for layout to be ready to perform the rest - _this.app.workspace.layoutReady ? _this.reallyEnable() : _this.app.workspace.on('layout-ready', _this.reallyEnable); - }; - // really enable things (once the layout is ready) - _this.reallyEnable = function () { - // we don't need the event handler anymore - _this.app.workspace.off('layout-ready', _this.reallyEnable); - // backup the function so I can restore it - _this.rootSplitAny.oldOnChildResizeStart = _this.rootSplitAny.onChildResizeStart; - _this.rootSplitAny.onChildResizeStart = _this.onChildResizeStart; - // add some extra classes that can't fit in the styles.css - // because they use settings - _this.addStyle(); - // do all the calucations necessary for the workspace leaves - _this.recalculateLeaves(); - }; - // shut down andy mode - _this.disable = function () { - // get rid of the extra style tag we added - _this.removeStyle(); - // iterate through the root leaves to remove the stuff we added - _this.rootLeaves.forEach(_this.clearLeaf); - // restore the default functionality - _this.rootSplitAny.onChildResizeStart = _this.rootSplitAny.oldOnChildResizeStart; - }; - _this.clearLeaf = function (leaf) { - leaf.containerEl.style.width = null; - leaf.containerEl.style.left = null; - leaf.containerEl.style.right = null; - leaf.containerEl.classList.remove('mod-am-left-of-active'); - leaf.containerEl.classList.remove('mod-am-right-of-active'); - var iconEl = leaf.view.iconEl; - var iconText = iconEl.getAttribute("aria-label"); - if (iconText.includes("(")) { - iconEl.setAttribute("aria-label", iconText.substring(iconText.lastIndexOf('(') + 1, iconText.lastIndexOf(')'))); - } - }; - // refresh funcion for when we change settings - _this.refresh = function () { - // re-load the style - _this.updateStyle(); - // recalculate leaf positions - _this.recalculateLeaves(); - }; - // remove the stlying elements we've created - _this.removeStyle = function () { - var el = document.getElementById('plugin-sliding-panes'); - if (el) - el.remove(); - document.body.classList.remove('plugin-sliding-panes'); - document.body.classList.remove('plugin-sliding-panes-rotate-header'); - document.body.classList.remove('plugin-sliding-panes-header-alt'); - document.body.classList.remove('plugin-sliding-panes-stacking'); - }; - // add the styling elements we need - _this.addStyle = function () { - // add a css block for our settings-dependent styles - var css = document.createElement('style'); - css.id = 'plugin-sliding-panes'; - document.getElementsByTagName("head")[0].appendChild(css); - // add the main class - document.body.classList.add('plugin-sliding-panes'); - // update the style with the settings-dependent styles - _this.updateStyle(); - }; - // update the styles (at the start, or as the result of a settings change) - _this.updateStyle = function () { - // if we've got rotate headers on, add the class which enables it - document.body.classList.toggle('plugin-sliding-panes-rotate-header', _this.settings.rotateHeaders); - document.body.classList.toggle('plugin-sliding-panes-header-alt', _this.settings.headerAlt); - // do the same for stacking - document.body.classList.toggle('plugin-sliding-panes-stacking', _this.settings.stackingEnabled); - // get the custom css element - var el = document.getElementById('plugin-sliding-panes'); - if (!el) - throw "plugin-sliding-panes element not found!"; - else { - // set the settings-dependent css - el.innerText = "body.plugin-sliding-panes{--header-width:" + _this.settings.headerWidth + "px;}"; - if (!_this.settings.leafAutoWidth) { - el.innerText += "body.plugin-sliding-panes .mod-root>.workspace-leaf{width:" + (_this.settings.leafWidth + _this.settings.headerWidth) + "px;}"; - } - } - if (_this.settings.rotateHeaders) { - _this.selectOrientation(_this.settings.orienation); - } - }; - _this.handleResize = function () { - if (_this.app.workspace.layoutReady) { - _this.recalculateLeaves(); - } - }; - _this.handleLayoutChange = function () { - var rootLeaves = _this.rootLeaves; - if (rootLeaves.length < _this.prevRootLeaves.length) { - _this.prevRootLeaves.forEach(function (leaf) { - if (!rootLeaves.contains(leaf)) { - _this.clearLeaf(leaf); - } - }); - } - _this.prevRootLeaves = _this.rootLeaves; - //this.recalculateLeaves(); - }; - // Recalculate the leaf sizing and positions - _this.recalculateLeaves = function () { - // rootSplit.children is undocumented for now, but it's easier to use for what we're doing. - // we only want leaves at the root of the root split - // (this is to fix compatibility with backlinks in document and other such plugins) - var rootContainerEl = _this.rootContainerEl; - var rootLeaves = _this.rootLeaves; - var leafCount = rootLeaves.length; - var totalWidth = 0; - // iterate through all the root-level leaves - var widthChange = false; - rootLeaves.forEach(function (leaf, i) { - // @ts-ignore to get the undocumented containerEl - var containerEl = leaf.containerEl; - containerEl.style.flex = null; - var oldWidth = containerEl.clientWidth; - if (_this.settings.leafAutoWidth) { - containerEl.style.width = (rootContainerEl.clientWidth - ((leafCount - 1) * _this.settings.headerWidth)) + "px"; - } - else { - containerEl.style.width = null; - } - if (oldWidth == containerEl.clientWidth) - widthChange = true; - containerEl.style.left = _this.settings.stackingEnabled - ? (i * _this.settings.headerWidth) + "px" - : null; - containerEl.style.right = _this.settings.stackingEnabled - ? (((leafCount - i) * _this.settings.headerWidth) - containerEl.clientWidth) + "px" - : null; - // keep track of the total width of all leaves - totalWidth += containerEl.clientWidth; - var iconEl = leaf.view.iconEl; - var iconText = iconEl.getAttribute("aria-label"); - if (!iconText.includes("(")) { - iconEl.setAttribute("aria-label", leaf.getDisplayText() + " (" + iconText + ")"); - } - }); - // if the total width of all leaves is less than the width available, - // add back the flex class so they fill the space - if (totalWidth < rootContainerEl.clientWidth) { - rootLeaves.forEach(function (leaf) { - leaf.containerEl.style.flex = '1 0 0'; - }); - } - if (widthChange) - _this.focusActiveLeaf(!_this.settings.leafAutoWidth); - }; - // this function is called, not only when a file opens, but when the active pane is switched - _this.handleFileOpen = function (e) { - // put a small timeout on it because when a file is opened on the far right - // it wasn't focussing properly. The timeout fixes this - setTimeout(function () { - // focus on the newly selected leaf - _this.focusActiveLeaf(); - }, 10); - }; - // hande when a file is deleted - _this.handleDelete = function (file) { - // close any leaves with the deleted file open - // detaching a leaf while iterating messes with the iteration - var leavesToDetach = []; - _this.app.workspace.iterateRootLeaves(function (leaf) { - if (leaf.view instanceof obsidian.FileView && leaf.view.file == file) { - leavesToDetach.push(leaf); - } - }); - leavesToDetach.forEach(function (leaf) { return leaf.detach(); }); - }; - // overriden function for rootSplit child resize - _this.onChildResizeStart = function (leaf, event) { - // only really apply this to vertical splits - if (_this.rootSplitAny.direction === "vertical") { - // this is the width the leaf started at before resize - var startWidth_1 = leaf.containerEl.clientWidth; - // the mousemove event to trigger while resizing - var mousemove_1 = function (e) { - // get the difference between the first position and current - var deltaX = e.pageX - event.pageX; - // adjust the start width by the delta - leaf.containerEl.style.width = startWidth_1 + deltaX + "px"; - }; - // the mouseup event to trigger at the end of resizing - var mouseup_1 = function () { - // if stacking is enabled, we need to re-jig the "right" value - if (_this.settings.stackingEnabled) { - // we need the leaf count and index to calculate the correct value - var rootLeaves = _this.rootLeaves; - var leafCount = rootLeaves.length; - var leafIndex = rootLeaves.findIndex(function (l) { return l == leaf; }); - leaf.containerEl.style.right = (((leafCount - leafIndex - 1) * _this.settings.headerWidth) - leaf.containerEl.clientWidth) + "px"; - } - // remove these event listeners. We're done with them - document.removeEventListener("mousemove", mousemove_1); - document.removeEventListener("mouseup", mouseup_1); - }; - // Add the above two event listeners - document.addEventListener("mousemove", mousemove_1); - document.addEventListener("mouseup", mouseup_1); - } - }; - return _this; - } - Object.defineProperty(SlidingPanesPlugin.prototype, "rootSplit", { - // helper gets for any casts (for undocumented API stuff) - get: function () { return this.app.workspace.rootSplit; }, - enumerable: false, - configurable: true - }); - Object.defineProperty(SlidingPanesPlugin.prototype, "rootSplitAny", { - get: function () { return this.rootSplit; }, - enumerable: false, - configurable: true - }); - Object.defineProperty(SlidingPanesPlugin.prototype, "rootContainerEl", { - get: function () { return this.app.workspace.rootSplit.containerEl; }, - enumerable: false, - configurable: true - }); - Object.defineProperty(SlidingPanesPlugin.prototype, "rootLeaves", { - get: function () { - var rootContainerEl = this.rootContainerEl; - var rootLeaves = []; - this.app.workspace.iterateRootLeaves(function (leaf) { - if (leaf.containerEl.parentElement === rootContainerEl) { - rootLeaves.push(leaf); - } - }); - return rootLeaves; - }, - enumerable: false, - configurable: true - }); - // when the plugin is loaded - SlidingPanesPlugin.prototype.onload = function () { - return __awaiter(this, void 0, void 0, function () { - var _a, _b, _c, _d; - return __generator(this, function (_e) { - switch (_e.label) { - case 0: - // load settings - _a = this; - _c = (_b = Object).assign; - _d = [new SlidingPanesSettings()]; - return [4 /*yield*/, this.loadData()]; - case 1: - // load settings - _a.settings = _c.apply(_b, _d.concat([_e.sent()])); - // if it's not disabled in the settings, enable it - if (!this.settings.disabled) - this.enable(); - // add the settings tab - this.addSettingTab(new SlidingPanesSettingTab(this.app, this)); - // add the commands - new SlidingPanesCommands(this).addCommands(); - return [2 /*return*/]; - } - }); - }); - }; - // on unload, perform the same steps as disable - SlidingPanesPlugin.prototype.onunload = function () { - this.disable(); - }; - SlidingPanesPlugin.prototype.selectOrientation = function (orient) { - document.body.classList.toggle('plugin-sliding-select-orientation-mixed', orient == 'mixed'); - document.body.classList.toggle('plugin-sliding-select-orientation-upright', orient == 'upright'); - document.body.classList.toggle('plugin-sliding-select-orientation-sideway', orient == 'sideway'); - }; - SlidingPanesPlugin.prototype.focusActiveLeaf = function (animated) { - var _this = this; - if (animated === void 0) { animated = true; } - // get back to the leaf which has been andy'd (`any` because parentSplit is undocumented) - var activeLeaf = this.app.workspace.activeLeaf; - while (activeLeaf != null && activeLeaf.parentSplit != null && activeLeaf.parentSplit != this.app.workspace.rootSplit) { - activeLeaf = activeLeaf.parentSplit; - } - if (activeLeaf != null && this.rootSplit) { - var rootContainerEl = this.rootContainerEl; - var rootLeaves = this.rootLeaves; - var leafCount = rootLeaves.length; - // get the index of the active leaf - // also, get the position of this leaf, so we can scroll to it - // as leaves are resizable, we have to iterate through all leaves to the - // left until we get to the active one and add all their widths together - var position_1 = 0; - this.activeLeafIndex = -1; - rootLeaves.forEach(function (leaf, index) { - // @ts-ignore to get the undocumented containerEl - var containerEl = leaf.containerEl; - // this is the active one - if (leaf == activeLeaf) { - _this.activeLeafIndex = index; - containerEl.classList.remove('mod-am-left-of-active'); - containerEl.classList.remove('mod-am-right-of-active'); - } - else if (_this.activeLeafIndex == -1 || index < _this.activeLeafIndex) { - // this is before the active one, add the width - position_1 += containerEl.clientWidth; - containerEl.classList.add('mod-am-left-of-active'); - containerEl.classList.remove('mod-am-right-of-active'); - } - else { - // this is right of the active one - containerEl.classList.remove('mod-am-left-of-active'); - containerEl.classList.add('mod-am-right-of-active'); - } - }); - // get this leaf's left value (the amount of space to the left for sticky headers) - var left = parseInt(activeLeaf.containerEl.style.left) || 0; - // the amount of space to the right we need to leave for sticky headers - var headersToRightWidth = this.settings.stackingEnabled ? (leafCount - this.activeLeafIndex - 1) * this.settings.headerWidth : 0; - // determine whether to request 'smooth' animations or 'auto' snap - var behavior = animated && this.settings.smoothAnimation ? 'smooth' : 'auto'; - // it's too far left - if (rootContainerEl.scrollLeft > position_1 - left) { - // scroll the left side of the pane into view - rootContainerEl.scrollTo({ left: position_1 - left, top: 0, behavior: behavior }); - } - // it's too far right - else if (rootContainerEl.scrollLeft + rootContainerEl.clientWidth < position_1 + activeLeaf.containerEl.clientWidth + headersToRightWidth) { - // scroll the right side of the pane into view - rootContainerEl.scrollTo({ left: position_1 + activeLeaf.containerEl.clientWidth + headersToRightWidth - rootContainerEl.clientWidth, top: 0, behavior: behavior }); - } - } - }; - return SlidingPanesPlugin; -}(obsidian.Plugin)); - -module.exports = SlidingPanesPlugin; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsInNyYy9zZXR0aW5ncy50cyIsInNyYy9tYWluLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XHJcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgb1trMl0gPSBtW2tdO1xyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xyXG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xyXG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XHJcbiAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXHJcbiAgICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXHJcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xyXG4gICAgcmV0dXJuIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tKSB7XHJcbiAgICBmb3IgKHZhciBpID0gMCwgaWwgPSBmcm9tLmxlbmd0aCwgaiA9IHRvLmxlbmd0aDsgaSA8IGlsOyBpKyssIGorKylcclxuICAgICAgICB0b1tqXSA9IGZyb21baV07XHJcbiAgICByZXR1cm4gdG87XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcclxufSkgOiBmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcclxuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiBraW5kID09PSBcIm1cIiA/IGYgOiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlcikgOiBmID8gZi52YWx1ZSA6IHN0YXRlLmdldChyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcclxufVxyXG4iLCJpbXBvcnQgeyBBcHAsIFBsdWdpbiwgUGx1Z2luU2V0dGluZ1RhYiwgU2V0dGluZyB9IGZyb20gJ29ic2lkaWFuJztcblxuZXhwb3J0IHR5cGUgT3JpZW50YXRpb24gPSBcInNpZGV3YXlcIiB8IFwibWl4ZWRcIiB8IFwidXByaWdodFwiXG5cbmRlY2xhcmUgY2xhc3MgU2xpZGluZ1BhbmVzUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcbiAgc2V0dGluZ3M6IFNsaWRpbmdQYW5lc1NldHRpbmdzO1xuICBkaXNhYmxlKCk6IHZvaWQ7XG4gIGVuYWJsZSgpOiB2b2lkO1xuICByZWZyZXNoKCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBTbGlkaW5nUGFuZXNTZXR0aW5ncyB7XG4gIGhlYWRlcldpZHRoOiBudW1iZXIgPSAzMjtcbiAgbGVhZldpZHRoOiBudW1iZXIgPSA3MDA7XG4gIGxlYWZBdXRvV2lkdGg6IGJvb2xlYW4gPSBmYWxzZTtcbiAgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcm90YXRlSGVhZGVyczogYm9vbGVhbiA9IHRydWU7XG4gIGhlYWRlckFsdDogYm9vbGVhbiA9IGZhbHNlO1xuICBvcmllbmF0aW9uOiBPcmllbnRhdGlvbiA9IFwibWl4ZWRcIjtcbiAgc3RhY2tpbmdFbmFibGVkOiBib29sZWFuID0gdHJ1ZTtcbiAgc21vb3RoQW5pbWF0aW9uOiBib29sZWFuID0gdHJ1ZTtcbn1cblxuZXhwb3J0IGNsYXNzIFNsaWRpbmdQYW5lc1NldHRpbmdUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcblxuICBwbHVnaW46IFNsaWRpbmdQYW5lc1BsdWdpbjtcbiAgY29uc3RydWN0b3IoYXBwOiBBcHAsIHBsdWdpbjogU2xpZGluZ1BhbmVzUGx1Z2luKSB7XG4gICAgc3VwZXIoYXBwLCBwbHVnaW4pO1xuICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xuICB9XG5cbiAgZGlzcGxheSgpOiB2b2lkIHtcbiAgICBsZXQgeyBjb250YWluZXJFbCB9ID0gdGhpcztcblxuICAgIGNvbnRhaW5lckVsLmVtcHR5KCk7XG5cbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgIC5zZXROYW1lKFwiVG9nZ2xlIFNsaWRpbmcgUGFuZXNcIilcbiAgICAgIC5zZXREZXNjKFwiVHVybnMgc2xpZGluZyBwYW5lcyBvbiBvciBvZmYgZ2xvYmFsbHlcIilcbiAgICAgIC5hZGRUb2dnbGUodG9nZ2xlID0+IHRvZ2dsZS5zZXRWYWx1ZSghdGhpcy5wbHVnaW4uc2V0dGluZ3MuZGlzYWJsZWQpXG4gICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5kaXNhYmxlZCA9ICF2YWx1ZTtcbiAgICAgICAgICB0aGlzLnBsdWdpbi5zYXZlRGF0YSh0aGlzLnBsdWdpbi5zZXR0aW5ncyk7XG4gICAgICAgICAgaWYgKHRoaXMucGx1Z2luLnNldHRpbmdzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5kaXNhYmxlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4uZW5hYmxlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSk7XG5cbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgIC5zZXROYW1lKCdTbW9vdGggQW5pbWF0aW9uJylcbiAgICAgIC5zZXREZXNjKCdXaGV0aGVyIHRvIHVzZSBzbW9vdGggYW5pbWF0aW9uIChvbikgb3Igc25hcHBpbmcgKG9mZiknKVxuICAgICAgLmFkZFRvZ2dsZSh0b2dnbGUgPT4gdG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnNtb290aEFuaW1hdGlvbilcbiAgICAgICAgLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLnNtb290aEFuaW1hdGlvbiA9IHZhbHVlO1xuICAgICAgICAgIHRoaXMucGx1Z2luLnNhdmVEYXRhKHRoaXMucGx1Z2luLnNldHRpbmdzKTtcbiAgICAgICAgICB0aGlzLnBsdWdpbi5yZWZyZXNoKCk7XG4gICAgICAgIH0pKTtcblxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgLnNldE5hbWUoJ0xlYWYgQXV0byBXaWR0aCcpXG4gICAgICAuc2V0RGVzYygnSWYgb24sIHRoZSB3aWR0aCBvZiB0aGUgcGFuZSBzaG91bGQgZmlsbCB0aGUgYXZhaWxhYmxlIHNwYWNlJylcbiAgICAgIC5hZGRUb2dnbGUodG9nZ2xlID0+IHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5sZWFmQXV0b1dpZHRoKVxuICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MubGVhZkF1dG9XaWR0aCA9IHZhbHVlO1xuICAgICAgICAgIHRoaXMucGx1Z2luLnNhdmVEYXRhKHRoaXMucGx1Z2luLnNldHRpbmdzKTtcbiAgICAgICAgICB0aGlzLnBsdWdpbi5yZWZyZXNoKCk7XG4gICAgICAgIH0pKTtcblxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgLnNldE5hbWUoJ0xlYWYgV2lkdGgnKVxuICAgICAgLnNldERlc2MoJ1RoZSB3aWR0aCBvZiBhIHNpbmdsZSBwYW5lIChvbmx5IGlmIGF1dG8gd2lkdGggaXMgb2ZmKScpXG4gICAgICAuYWRkVGV4dCh0ZXh0ID0+IHRleHQuc2V0UGxhY2Vob2xkZXIoJ0V4YW1wbGU6IDcwMCcpXG4gICAgICAgIC5zZXRWYWx1ZSgodGhpcy5wbHVnaW4uc2V0dGluZ3MubGVhZldpZHRoIHx8ICcnKSArICcnKVxuICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MubGVhZldpZHRoID0gcGFyc2VJbnQodmFsdWUudHJpbSgpKTtcbiAgICAgICAgICB0aGlzLnBsdWdpbi5zYXZlRGF0YSh0aGlzLnBsdWdpbi5zZXR0aW5ncyk7XG4gICAgICAgICAgdGhpcy5wbHVnaW4ucmVmcmVzaCgpO1xuICAgICAgICB9KSk7XG5cbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgIC5zZXROYW1lKFwiVG9nZ2xlIHJvdGF0ZWQgaGVhZGVyc1wiKVxuICAgICAgLnNldERlc2MoXCJSb3RhdGVzIGhlYWRlcnMgdG8gdXNlIGFzIHNwaW5lc1wiKVxuICAgICAgLmFkZFRvZ2dsZSh0b2dnbGUgPT4gdG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnJvdGF0ZUhlYWRlcnMpXG4gICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5yb3RhdGVIZWFkZXJzID0gdmFsdWU7XG4gICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xuICAgICAgICAgIHRoaXMucGx1Z2luLnJlZnJlc2goKTtcbiAgICAgICAgfSkpO1xuXG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAuc2V0TmFtZShcIlN3YXAgcm90YXRlZCBoZWFkZXIgZGlyZWN0aW9uXCIpXG4gICAgICAuc2V0RGVzYyhcIlN3YXBzIHRoZSBkaXJlY3Rpb24gb2Ygcm90YXRlZCBoZWFkZXJzXCIpXG4gICAgICAuYWRkVG9nZ2xlKHRvZ2dsZSA9PiB0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuaGVhZGVyQWx0KVxuICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuaGVhZGVyQWx0ID0gdmFsdWU7XG4gICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xuICAgICAgICAgIHRoaXMucGx1Z2luLnJlZnJlc2goKTtcbiAgICAgICAgfSkpO1xuXG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgLnNldE5hbWUoXCJIZWFkZXIgdGV4dCBvcmllbnRhdGlvblwiKVxuICAgIC5zZXREZXNjKFwiU2VsZWN0IHRoZSBoZWFkZXIgdGV4dCBvcmllbnRhdGlvblwiKVxuICAgIC5hZGREcm9wZG93bigoZHJvcGRvd24pID0+IHtcbiAgICAgIGRyb3Bkb3duLmFkZE9wdGlvbihcInNpZGV3YXlcIiwgXCJTaWRld2F5XCIpXG4gICAgICBkcm9wZG93bi5hZGRPcHRpb24oXCJtaXhlZFwiLCBcIk1peGVkXCIpXG4gICAgICBkcm9wZG93bi5hZGRPcHRpb24oXCJ1cHJpZ2h0XCIsIFwiVXByaWdodFwiKVxuICAgICAgZHJvcGRvd24uc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3Mub3JpZW5hdGlvbilcbiAgICAgIGRyb3Bkb3duLm9uQ2hhbmdlKCh2YWx1ZTogT3JpZW50YXRpb24pID0+IHtcbiAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3Mub3JpZW5hdGlvbiA9IHZhbHVlO1xuICAgICAgICB0aGlzLnBsdWdpbi5zYXZlRGF0YSh0aGlzLnBsdWdpbi5zZXR0aW5ncyk7XG4gICAgICAgIHRoaXMucGx1Z2luLnJlZnJlc2goKTtcbiAgICAgIH0pfSk7XG5cbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgIC5zZXROYW1lKFwiVG9nZ2xlIHN0YWNraW5nXCIpXG4gICAgICAuc2V0RGVzYyhcIlBhbmVzIHdpbGwgc3RhY2sgdXAgdG8gdGhlIGxlZnQgYW5kIHJpZ2h0XCIpXG4gICAgICAuYWRkVG9nZ2xlKHRvZ2dsZSA9PiB0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3Muc3RhY2tpbmdFbmFibGVkKVxuICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3Muc3RhY2tpbmdFbmFibGVkID0gdmFsdWU7XG4gICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xuICAgICAgICAgIHRoaXMucGx1Z2luLnJlZnJlc2goKTtcbiAgICAgICAgfSkpO1xuXG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAuc2V0TmFtZSgnU3BpbmUgV2lkdGgnKVxuICAgICAgLnNldERlc2MoJ1RoZSB3aWR0aCBvZiB0aGUgcm90YXRlZCBoZWFkZXIgKG9yIGdhcCkgZm9yIHN0YWNraW5nJylcbiAgICAgIC5hZGRUZXh0KHRleHQgPT4gdGV4dC5zZXRQbGFjZWhvbGRlcignRXhhbXBsZTogMzInKVxuICAgICAgICAuc2V0VmFsdWUoKHRoaXMucGx1Z2luLnNldHRpbmdzLmhlYWRlcldpZHRoIHx8ICcnKSArICcnKVxuICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuaGVhZGVyV2lkdGggPSBwYXJzZUludCh2YWx1ZS50cmltKCkpO1xuICAgICAgICAgIHRoaXMucGx1Z2luLnNhdmVEYXRhKHRoaXMucGx1Z2luLnNldHRpbmdzKTtcbiAgICAgICAgICB0aGlzLnBsdWdpbi5yZWZyZXNoKCk7XG4gICAgICAgIH0pKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2xpZGluZ1BhbmVzQ29tbWFuZHMge1xuICBwbHVnaW46IFNsaWRpbmdQYW5lc1BsdWdpbjtcbiAgY29uc3RydWN0b3IocGx1Z2luOiBTbGlkaW5nUGFuZXNQbHVnaW4pIHtcbiAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcbiAgfVxuXG4gIGFkZFRvZ2dsZVNldHRpbmdDb21tYW5kKGlkOnN0cmluZywgbmFtZTpzdHJpbmcsIHNldHRpbmdOYW1lOnN0cmluZykge1xuICAgIHRoaXMucGx1Z2luLmFkZENvbW1hbmQoe1xuICAgICAgaWQ6IGlkLFxuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIGNhbGxiYWNrOiAoKSA9PiB7XG4gICAgICAgIC8vIHN3aXRjaCB0aGUgc2V0dGluZywgc2F2ZSBhbmQgcmVmcmVzaFxuICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3Nbc2V0dGluZ05hbWVdID0gIXRoaXMucGx1Z2luLnNldHRpbmdzW3NldHRpbmdOYW1lXTtcbiAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xuICAgICAgICB0aGlzLnBsdWdpbi5yZWZyZXNoKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhZGRDb21tYW5kcygpOiB2b2lkIHtcbiAgICAvLyBhZGQgdGhlIHRvZ2dsZSBvbi9vZmYgY29tbWFuZFxuICAgIHRoaXMucGx1Z2luLmFkZENvbW1hbmQoe1xuICAgICAgaWQ6ICd0b2dnbGUtc2xpZGluZy1wYW5lcycsXG4gICAgICBuYW1lOiAnVG9nZ2xlIFNsaWRpbmcgUGFuZXMnLFxuICAgICAgY2FsbGJhY2s6ICgpID0+IHtcbiAgICAgICAgLy8gc3dpdGNoIHRoZSBkaXNhYmxlZCBzZXR0aW5nIGFuZCBzYXZlXG4gICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmRpc2FibGVkID0gIXRoaXMucGx1Z2luLnNldHRpbmdzLmRpc2FibGVkO1xuICAgICAgICB0aGlzLnBsdWdpbi5zYXZlRGF0YSh0aGlzLnBsdWdpbi5zZXR0aW5ncyk7XG5cbiAgICAgICAgLy8gZGlzYWJsZSBvciBlbmFibGUgYXMgbmVjZXNzYXJ5XG4gICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmRpc2FibGVkID8gdGhpcy5wbHVnaW4uZGlzYWJsZSgpIDogdGhpcy5wbHVnaW4uZW5hYmxlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBhZGQgYSBjb21tYW5kIHRvIHRvZ2dsZSBzbW9vdGggYW5pbWF0aW9uXG4gICAgdGhpcy5hZGRUb2dnbGVTZXR0aW5nQ29tbWFuZCgndG9nZ2xlLXNsaWRpbmctcGFuZXMtc21vb3RoLWFuaW1hdGlvbicsICdUb2dnbGUgU21vb3RoIEFuaW1hdGlvbicsICdzbW9vdGhBbmltYXRpb24nKTtcblxuICAgIC8vIGFkZCBhIGNvbW1hbmQgdG8gdG9nZ2xlIGxlYWYgYXV0byB3aWR0aFxuICAgIHRoaXMuYWRkVG9nZ2xlU2V0dGluZ0NvbW1hbmQoJ3RvZ2dsZS1zbGlkaW5nLXBhbmVzLWxlYWYtYXV0by13aWR0aCcsICdUb2dnbGUgTGVhZiBBdXRvIFdpZHRoJywgJ2xlYWZBdXRvV2lkdGgnKTtcbiAgICBcbiAgICAvLyBhZGQgYSBjb21tYW5kIHRvIHRvZ2dsZSBzdGFja2luZ1xuICAgIHRoaXMuYWRkVG9nZ2xlU2V0dGluZ0NvbW1hbmQoJ3RvZ2dsZS1zbGlkaW5nLXBhbmVzLXN0YWNraW5nJywgJ1RvZ2dsZSBTdGFja2luZycsICdzdGFja2luZ0VuYWJsZWQnKTtcblxuICAgIC8vIGFkZCBhIGNvbW1hbmQgdG8gdG9nZ2xlIHJvdGF0ZWQgaGVhZGVyc1xuICAgIHRoaXMuYWRkVG9nZ2xlU2V0dGluZ0NvbW1hbmQoJ3RvZ2dsZS1zbGlkaW5nLXBhbmVzLXJvdGF0ZWQtaGVhZGVycycsICdUb2dnbGUgUm90YXRlZCBIZWFkZXJzJywgJ3JvdGF0ZUhlYWRlcnMnKTtcblxuICAgIC8vIGFkZCBhIGNvbW1hbmQgdG8gdG9nZ2xlIHN3YXBwZWQgaGVhZGVyIGRpcmVjdGlvblxuICAgIHRoaXMuYWRkVG9nZ2xlU2V0dGluZ0NvbW1hbmQoJ3RvZ2dsZS1zbGlkaW5nLXBhbmVzLWhlYWRlci1hbHQnLCAnU3dhcCByb3RhdGVkIGhlYWRlciBkaXJlY3Rpb24nLCAnaGVhZGVyQWx0Jyk7XG4gIH1cbn0iLCJpbXBvcnQgJy4vc3R5bGVzLnNjc3MnXG5pbXBvcnQgeyBGaWxlVmlldywgUGx1Z2luLCBUQWJzdHJhY3RGaWxlLCBXb3Jrc3BhY2VMZWFmLCBXb3Jrc3BhY2VJdGVtLCBXb3Jrc3BhY2VTcGxpdCB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB7IFdvcmtzcGFjZUl0ZW1FeHQgfSBmcm9tICcuL29ic2lkaWFuLWV4dCc7XG5pbXBvcnQgeyBFZGl0b3IsIFBvc2l0aW9uLCBUb2tlbiB9IGZyb20gJ2NvZGVtaXJyb3InO1xuaW1wb3J0IHsgU2xpZGluZ1BhbmVzU2V0dGluZ3MsIFNsaWRpbmdQYW5lc1NldHRpbmdUYWIsIFNsaWRpbmdQYW5lc0NvbW1hbmRzLCBPcmllbnRhdGlvbiB9IGZyb20gJy4vc2V0dGluZ3MnO1xuXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNsaWRpbmdQYW5lc1BsdWdpbiBleHRlbmRzIFBsdWdpbiB7XG4gIHNldHRpbmdzOiBTbGlkaW5nUGFuZXNTZXR0aW5ncztcblxuICAvLyBoZWxwZXIgdmFyaWFibGVzXG4gIHByaXZhdGUgYWN0aXZlTGVhZkluZGV4OiBudW1iZXIgPSAwO1xuXG4gIC8vIGhlbHBlciBnZXRzIGZvciBhbnkgY2FzdHMgKGZvciB1bmRvY3VtZW50ZWQgQVBJIHN0dWZmKVxuICBwcml2YXRlIGdldCByb290U3BsaXQoKTogV29ya3NwYWNlU3BsaXQgeyByZXR1cm4gdGhpcy5hcHAud29ya3NwYWNlLnJvb3RTcGxpdDsgfVxuICBwcml2YXRlIGdldCByb290U3BsaXRBbnkoKTogYW55IHsgcmV0dXJuIHRoaXMucm9vdFNwbGl0IGFzIGFueTsgfVxuICBwcml2YXRlIGdldCByb290Q29udGFpbmVyRWwoKTogSFRNTEVsZW1lbnQgeyByZXR1cm4gKHRoaXMuYXBwLndvcmtzcGFjZS5yb290U3BsaXQgYXMgV29ya3NwYWNlSXRlbSBhcyBXb3Jrc3BhY2VJdGVtRXh0KS5jb250YWluZXJFbDsgfVxuICBwcml2YXRlIGdldCByb290TGVhdmVzKCk6IFdvcmtzcGFjZUxlYWZbXSB7XG4gICAgY29uc3Qgcm9vdENvbnRhaW5lckVsID0gdGhpcy5yb290Q29udGFpbmVyRWw7XG4gICAgbGV0IHJvb3RMZWF2ZXM6IFdvcmtzcGFjZUxlYWZbXSA9IFtdO1xuICAgIHRoaXMuYXBwLndvcmtzcGFjZS5pdGVyYXRlUm9vdExlYXZlcygobGVhZjogYW55KSA9PiB7XG4gICAgICBpZiAobGVhZi5jb250YWluZXJFbC5wYXJlbnRFbGVtZW50ID09PSByb290Q29udGFpbmVyRWwpIHtcbiAgICAgICAgcm9vdExlYXZlcy5wdXNoKGxlYWYpO1xuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIHJvb3RMZWF2ZXM7XG4gIH1cbiAgcHJpdmF0ZSBwcmV2Um9vdExlYXZlczogV29ya3NwYWNlTGVhZltdID0gW107XG5cbiAgLy8gd2hlbiB0aGUgcGx1Z2luIGlzIGxvYWRlZFxuICBhc3luYyBvbmxvYWQoKSB7XG4gICAgLy8gbG9hZCBzZXR0aW5nc1xuICAgIHRoaXMuc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKG5ldyBTbGlkaW5nUGFuZXNTZXR0aW5ncygpLCBhd2FpdCB0aGlzLmxvYWREYXRhKCkpO1xuXG4gICAgLy8gaWYgaXQncyBub3QgZGlzYWJsZWQgaW4gdGhlIHNldHRpbmdzLCBlbmFibGUgaXRcbiAgICBpZiAoIXRoaXMuc2V0dGluZ3MuZGlzYWJsZWQpIHRoaXMuZW5hYmxlKCk7XG5cbiAgICAvLyBhZGQgdGhlIHNldHRpbmdzIHRhYlxuICAgIHRoaXMuYWRkU2V0dGluZ1RhYihuZXcgU2xpZGluZ1BhbmVzU2V0dGluZ1RhYih0aGlzLmFwcCwgdGhpcykpO1xuICAgIC8vIGFkZCB0aGUgY29tbWFuZHNcbiAgICBuZXcgU2xpZGluZ1BhbmVzQ29tbWFuZHModGhpcykuYWRkQ29tbWFuZHMoKTtcbiAgfVxuXG4gIC8vIG9uIHVubG9hZCwgcGVyZm9ybSB0aGUgc2FtZSBzdGVwcyBhcyBkaXNhYmxlXG4gIG9udW5sb2FkKCkge1xuICAgIHRoaXMuZGlzYWJsZSgpO1xuICB9XG5cbiAgLy8gZW5hYmxlIGFuZHkgbW9kZVxuICBlbmFibGUgPSAoKSA9PiB7XG4gICAgLy8gYWRkIHRoZSBldmVudCBoYW5kbGVyc1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC53b3Jrc3BhY2Uub24oJ3Jlc2l6ZScsIHRoaXMuaGFuZGxlUmVzaXplKSk7XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLndvcmtzcGFjZS5vbignbGF5b3V0LWNoYW5nZScsIHRoaXMuaGFuZGxlTGF5b3V0Q2hhbmdlKSk7XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLndvcmtzcGFjZS5vbignZmlsZS1vcGVuJywgdGhpcy5oYW5kbGVGaWxlT3BlbikpO1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC52YXVsdC5vbignZGVsZXRlJywgdGhpcy5oYW5kbGVEZWxldGUpKTtcblxuICAgIC8vIHdhaXQgZm9yIGxheW91dCB0byBiZSByZWFkeSB0byBwZXJmb3JtIHRoZSByZXN0XG4gICAgdGhpcy5hcHAud29ya3NwYWNlLmxheW91dFJlYWR5ID8gdGhpcy5yZWFsbHlFbmFibGUoKSA6IHRoaXMuYXBwLndvcmtzcGFjZS5vbignbGF5b3V0LXJlYWR5JywgdGhpcy5yZWFsbHlFbmFibGUpO1xuICB9XG5cbiAgLy8gcmVhbGx5IGVuYWJsZSB0aGluZ3MgKG9uY2UgdGhlIGxheW91dCBpcyByZWFkeSlcbiAgcmVhbGx5RW5hYmxlID0gKCkgPT4ge1xuICAgIC8vIHdlIGRvbid0IG5lZWQgdGhlIGV2ZW50IGhhbmRsZXIgYW55bW9yZVxuICAgIHRoaXMuYXBwLndvcmtzcGFjZS5vZmYoJ2xheW91dC1yZWFkeScsIHRoaXMucmVhbGx5RW5hYmxlKTtcblxuICAgIC8vIGJhY2t1cCB0aGUgZnVuY3Rpb24gc28gSSBjYW4gcmVzdG9yZSBpdFxuICAgIHRoaXMucm9vdFNwbGl0QW55Lm9sZE9uQ2hpbGRSZXNpemVTdGFydCA9IHRoaXMucm9vdFNwbGl0QW55Lm9uQ2hpbGRSZXNpemVTdGFydDtcbiAgICB0aGlzLnJvb3RTcGxpdEFueS5vbkNoaWxkUmVzaXplU3RhcnQgPSB0aGlzLm9uQ2hpbGRSZXNpemVTdGFydDtcblxuICAgIC8vIGFkZCBzb21lIGV4dHJhIGNsYXNzZXMgdGhhdCBjYW4ndCBmaXQgaW4gdGhlIHN0eWxlcy5jc3NcbiAgICAvLyBiZWNhdXNlIHRoZXkgdXNlIHNldHRpbmdzXG4gICAgdGhpcy5hZGRTdHlsZSgpO1xuXG4gICAgLy8gZG8gYWxsIHRoZSBjYWx1Y2F0aW9ucyBuZWNlc3NhcnkgZm9yIHRoZSB3b3Jrc3BhY2UgbGVhdmVzXG4gICAgdGhpcy5yZWNhbGN1bGF0ZUxlYXZlcygpO1xuICB9XG5cbiAgLy8gc2h1dCBkb3duIGFuZHkgbW9kZVxuICBkaXNhYmxlID0gKCkgPT4ge1xuXG4gICAgLy8gZ2V0IHJpZCBvZiB0aGUgZXh0cmEgc3R5bGUgdGFnIHdlIGFkZGVkXG4gICAgdGhpcy5yZW1vdmVTdHlsZSgpO1xuXG4gICAgLy8gaXRlcmF0ZSB0aHJvdWdoIHRoZSByb290IGxlYXZlcyB0byByZW1vdmUgdGhlIHN0dWZmIHdlIGFkZGVkXG4gICAgdGhpcy5yb290TGVhdmVzLmZvckVhY2godGhpcy5jbGVhckxlYWYpO1xuXG4gICAgLy8gcmVzdG9yZSB0aGUgZGVmYXVsdCBmdW5jdGlvbmFsaXR5XG4gICAgdGhpcy5yb290U3BsaXRBbnkub25DaGlsZFJlc2l6ZVN0YXJ0ID0gdGhpcy5yb290U3BsaXRBbnkub2xkT25DaGlsZFJlc2l6ZVN0YXJ0O1xuICB9XG5cbiAgY2xlYXJMZWFmID0gKGxlYWY6IGFueSkgPT4ge1xuICAgIGxlYWYuY29udGFpbmVyRWwuc3R5bGUud2lkdGggPSBudWxsO1xuICAgIGxlYWYuY29udGFpbmVyRWwuc3R5bGUubGVmdCA9IG51bGw7XG4gICAgbGVhZi5jb250YWluZXJFbC5zdHlsZS5yaWdodCA9IG51bGw7XG4gICAgbGVhZi5jb250YWluZXJFbC5jbGFzc0xpc3QucmVtb3ZlKCdtb2QtYW0tbGVmdC1vZi1hY3RpdmUnKTtcbiAgICBsZWFmLmNvbnRhaW5lckVsLmNsYXNzTGlzdC5yZW1vdmUoJ21vZC1hbS1yaWdodC1vZi1hY3RpdmUnKTtcblxuICAgIGNvbnN0IGljb25FbCA9IChsZWFmLnZpZXcgYXMgYW55KS5pY29uRWw7XG4gICAgY29uc3QgaWNvblRleHQ6c3RyaW5nID0gaWNvbkVsLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIik7XG4gICAgaWYgKGljb25UZXh0LmluY2x1ZGVzKFwiKFwiKSkge1xuICAgICAgaWNvbkVsLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgaWNvblRleHQuc3Vic3RyaW5nKGljb25UZXh0Lmxhc3RJbmRleE9mKCcoJykgKyAxLCBpY29uVGV4dC5sYXN0SW5kZXhPZignKScpKSk7XG4gICAgfVxuICB9XG5cbiAgLy8gcmVmcmVzaCBmdW5jaW9uIGZvciB3aGVuIHdlIGNoYW5nZSBzZXR0aW5nc1xuICByZWZyZXNoID0gKCkgPT4ge1xuICAgIC8vIHJlLWxvYWQgdGhlIHN0eWxlXG4gICAgdGhpcy51cGRhdGVTdHlsZSgpXG4gICAgLy8gcmVjYWxjdWxhdGUgbGVhZiBwb3NpdGlvbnNcbiAgICB0aGlzLnJlY2FsY3VsYXRlTGVhdmVzKCk7XG4gIH1cblxuICAvLyByZW1vdmUgdGhlIHN0bHlpbmcgZWxlbWVudHMgd2UndmUgY3JlYXRlZFxuICByZW1vdmVTdHlsZSA9ICgpID0+IHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwbHVnaW4tc2xpZGluZy1wYW5lcycpO1xuICAgIGlmIChlbCkgZWwucmVtb3ZlKCk7XG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdwbHVnaW4tc2xpZGluZy1wYW5lcycpO1xuICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgncGx1Z2luLXNsaWRpbmctcGFuZXMtcm90YXRlLWhlYWRlcicpO1xuICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgncGx1Z2luLXNsaWRpbmctcGFuZXMtaGVhZGVyLWFsdCcpO1xuICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgncGx1Z2luLXNsaWRpbmctcGFuZXMtc3RhY2tpbmcnKTtcbiAgfVxuXG4gIC8vIGFkZCB0aGUgc3R5bGluZyBlbGVtZW50cyB3ZSBuZWVkXG4gIGFkZFN0eWxlID0gKCkgPT4ge1xuICAgIC8vIGFkZCBhIGNzcyBibG9jayBmb3Igb3VyIHNldHRpbmdzLWRlcGVuZGVudCBzdHlsZXNcbiAgICBjb25zdCBjc3MgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgIGNzcy5pZCA9ICdwbHVnaW4tc2xpZGluZy1wYW5lcyc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJoZWFkXCIpWzBdLmFwcGVuZENoaWxkKGNzcyk7XG5cbiAgICAvLyBhZGQgdGhlIG1haW4gY2xhc3NcbiAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ3BsdWdpbi1zbGlkaW5nLXBhbmVzJyk7XG5cbiAgICAvLyB1cGRhdGUgdGhlIHN0eWxlIHdpdGggdGhlIHNldHRpbmdzLWRlcGVuZGVudCBzdHlsZXNcbiAgICB0aGlzLnVwZGF0ZVN0eWxlKCk7XG4gIH1cblxuICAvLyB1cGRhdGUgdGhlIHN0eWxlcyAoYXQgdGhlIHN0YXJ0LCBvciBhcyB0aGUgcmVzdWx0IG9mIGEgc2V0dGluZ3MgY2hhbmdlKVxuICB1cGRhdGVTdHlsZSA9ICgpID0+IHtcbiAgICAvLyBpZiB3ZSd2ZSBnb3Qgcm90YXRlIGhlYWRlcnMgb24sIGFkZCB0aGUgY2xhc3Mgd2hpY2ggZW5hYmxlcyBpdFxuICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnRvZ2dsZSgncGx1Z2luLXNsaWRpbmctcGFuZXMtcm90YXRlLWhlYWRlcicsIHRoaXMuc2V0dGluZ3Mucm90YXRlSGVhZGVycyk7XG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCdwbHVnaW4tc2xpZGluZy1wYW5lcy1oZWFkZXItYWx0JywgdGhpcy5zZXR0aW5ncy5oZWFkZXJBbHQpXG4gICAgLy8gZG8gdGhlIHNhbWUgZm9yIHN0YWNraW5nXG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCdwbHVnaW4tc2xpZGluZy1wYW5lcy1zdGFja2luZycsIHRoaXMuc2V0dGluZ3Muc3RhY2tpbmdFbmFibGVkKTtcbiAgICBcbiAgICAvLyBnZXQgdGhlIGN1c3RvbSBjc3MgZWxlbWVudFxuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BsdWdpbi1zbGlkaW5nLXBhbmVzJyk7XG4gICAgaWYgKCFlbCkgdGhyb3cgXCJwbHVnaW4tc2xpZGluZy1wYW5lcyBlbGVtZW50IG5vdCBmb3VuZCFcIjtcbiAgICBlbHNlIHtcbiAgICAgIC8vIHNldCB0aGUgc2V0dGluZ3MtZGVwZW5kZW50IGNzc1xuICAgICAgZWwuaW5uZXJUZXh0ID0gYGJvZHkucGx1Z2luLXNsaWRpbmctcGFuZXN7LS1oZWFkZXItd2lkdGg6JHt0aGlzLnNldHRpbmdzLmhlYWRlcldpZHRofXB4O31gO1xuICAgICAgaWYgKCF0aGlzLnNldHRpbmdzLmxlYWZBdXRvV2lkdGgpIHtcbiAgICAgICAgZWwuaW5uZXJUZXh0ICs9IGBib2R5LnBsdWdpbi1zbGlkaW5nLXBhbmVzIC5tb2Qtcm9vdD4ud29ya3NwYWNlLWxlYWZ7d2lkdGg6JHt0aGlzLnNldHRpbmdzLmxlYWZXaWR0aCArIHRoaXMuc2V0dGluZ3MuaGVhZGVyV2lkdGh9cHg7fWA7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIGlmICh0aGlzLnNldHRpbmdzLnJvdGF0ZUhlYWRlcnMpe1xuICAgICAgdGhpcy5zZWxlY3RPcmllbnRhdGlvbih0aGlzLnNldHRpbmdzLm9yaWVuYXRpb24pO1xuICAgIH1cbiAgfVxuXG4gIHNlbGVjdE9yaWVudGF0aW9uKG9yaWVudDogT3JpZW50YXRpb24pIHtcbiAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC50b2dnbGUoJ3BsdWdpbi1zbGlkaW5nLXNlbGVjdC1vcmllbnRhdGlvbi1taXhlZCcsIG9yaWVudCA9PSAnbWl4ZWQnKTtcbiAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC50b2dnbGUoJ3BsdWdpbi1zbGlkaW5nLXNlbGVjdC1vcmllbnRhdGlvbi11cHJpZ2h0Jywgb3JpZW50ID09ICd1cHJpZ2h0Jyk7XG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCdwbHVnaW4tc2xpZGluZy1zZWxlY3Qtb3JpZW50YXRpb24tc2lkZXdheScsIG9yaWVudCA9PSAnc2lkZXdheScpO1xuICB9XG5cbiAgaGFuZGxlUmVzaXplID0gKCkgPT4ge1xuICAgIGlmICh0aGlzLmFwcC53b3Jrc3BhY2UubGF5b3V0UmVhZHkpIHtcbiAgICAgIHRoaXMucmVjYWxjdWxhdGVMZWF2ZXMoKTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVMYXlvdXRDaGFuZ2UgPSAoKSA9PiB7XG4gICAgY29uc3Qgcm9vdExlYXZlcyA9IHRoaXMucm9vdExlYXZlcztcbiAgICBpZiAocm9vdExlYXZlcy5sZW5ndGggPCB0aGlzLnByZXZSb290TGVhdmVzLmxlbmd0aCkge1xuICAgICAgdGhpcy5wcmV2Um9vdExlYXZlcy5mb3JFYWNoKChsZWFmOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKCFyb290TGVhdmVzLmNvbnRhaW5zKGxlYWYpKSB7XG4gICAgICAgICAgdGhpcy5jbGVhckxlYWYobGVhZik7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIHRoaXMucHJldlJvb3RMZWF2ZXMgPSB0aGlzLnJvb3RMZWF2ZXM7XG4gICAgLy90aGlzLnJlY2FsY3VsYXRlTGVhdmVzKCk7XG4gIH1cblxuICAvLyBSZWNhbGN1bGF0ZSB0aGUgbGVhZiBzaXppbmcgYW5kIHBvc2l0aW9uc1xuICByZWNhbGN1bGF0ZUxlYXZlcyA9ICgpID0+IHtcbiAgICAvLyByb290U3BsaXQuY2hpbGRyZW4gaXMgdW5kb2N1bWVudGVkIGZvciBub3csIGJ1dCBpdCdzIGVhc2llciB0byB1c2UgZm9yIHdoYXQgd2UncmUgZG9pbmcuXG4gICAgLy8gd2Ugb25seSB3YW50IGxlYXZlcyBhdCB0aGUgcm9vdCBvZiB0aGUgcm9vdCBzcGxpdFxuICAgIC8vICh0aGlzIGlzIHRvIGZpeCBjb21wYXRpYmlsaXR5IHdpdGggYmFja2xpbmtzIGluIGRvY3VtZW50IGFuZCBvdGhlciBzdWNoIHBsdWdpbnMpXG4gICAgY29uc3Qgcm9vdENvbnRhaW5lckVsID0gdGhpcy5yb290Q29udGFpbmVyRWw7XG4gICAgY29uc3Qgcm9vdExlYXZlcyA9IHRoaXMucm9vdExlYXZlcztcbiAgICBjb25zdCBsZWFmQ291bnQgPSByb290TGVhdmVzLmxlbmd0aDtcblxuICAgIGxldCB0b3RhbFdpZHRoID0gMDtcblxuICAgIC8vIGl0ZXJhdGUgdGhyb3VnaCBhbGwgdGhlIHJvb3QtbGV2ZWwgbGVhdmVzXG4gICAgbGV0IHdpZHRoQ2hhbmdlID0gZmFsc2U7XG4gICAgcm9vdExlYXZlcy5mb3JFYWNoKChsZWFmOiBXb3Jrc3BhY2VMZWFmLCBpOiBudW1iZXIpID0+IHtcblxuICAgICAgLy8gQHRzLWlnbm9yZSB0byBnZXQgdGhlIHVuZG9jdW1lbnRlZCBjb250YWluZXJFbFxuICAgICAgY29uc3QgY29udGFpbmVyRWwgPSBsZWFmLmNvbnRhaW5lckVsO1xuXG4gICAgICBjb250YWluZXJFbC5zdHlsZS5mbGV4ID0gbnVsbDtcbiAgICAgIGNvbnN0IG9sZFdpZHRoID0gY29udGFpbmVyRWwuY2xpZW50V2lkdGg7XG4gICAgICBpZiAodGhpcy5zZXR0aW5ncy5sZWFmQXV0b1dpZHRoKSB7XG4gICAgICAgIGNvbnRhaW5lckVsLnN0eWxlLndpZHRoID0gKHJvb3RDb250YWluZXJFbC5jbGllbnRXaWR0aCAtICgobGVhZkNvdW50IC0gMSkgKiB0aGlzLnNldHRpbmdzLmhlYWRlcldpZHRoKSkgKyBcInB4XCI7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgY29udGFpbmVyRWwuc3R5bGUud2lkdGggPSBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKG9sZFdpZHRoID09IGNvbnRhaW5lckVsLmNsaWVudFdpZHRoKSB3aWR0aENoYW5nZSA9IHRydWU7XG5cbiAgICAgIGNvbnRhaW5lckVsLnN0eWxlLmxlZnQgPSB0aGlzLnNldHRpbmdzLnN0YWNraW5nRW5hYmxlZFxuICAgICAgICA/IChpICogdGhpcy5zZXR0aW5ncy5oZWFkZXJXaWR0aCkgKyBcInB4XCJcbiAgICAgICAgOiBudWxsO1xuICAgICAgY29udGFpbmVyRWwuc3R5bGUucmlnaHQgPSB0aGlzLnNldHRpbmdzLnN0YWNraW5nRW5hYmxlZFxuICAgICAgICA/ICgoKGxlYWZDb3VudCAtIGkpICogdGhpcy5zZXR0aW5ncy5oZWFkZXJXaWR0aCkgLSBjb250YWluZXJFbC5jbGllbnRXaWR0aCkgKyBcInB4XCJcbiAgICAgICAgOiBudWxsO1xuICAgICAgLy8ga2VlcCB0cmFjayBvZiB0aGUgdG90YWwgd2lkdGggb2YgYWxsIGxlYXZlc1xuICAgICAgdG90YWxXaWR0aCArPSBjb250YWluZXJFbC5jbGllbnRXaWR0aDtcblxuICAgICAgY29uc3QgaWNvbkVsID0gKGxlYWYudmlldyBhcyBhbnkpLmljb25FbDtcbiAgICAgIGNvbnN0IGljb25UZXh0ID0gaWNvbkVsLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIik7XG4gICAgICBpZiAoIWljb25UZXh0LmluY2x1ZGVzKFwiKFwiKSkge1xuICAgICAgICBpY29uRWwuc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCBgJHtsZWFmLmdldERpc3BsYXlUZXh0KCl9ICgke2ljb25UZXh0fSlgKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIGlmIHRoZSB0b3RhbCB3aWR0aCBvZiBhbGwgbGVhdmVzIGlzIGxlc3MgdGhhbiB0aGUgd2lkdGggYXZhaWxhYmxlLFxuICAgIC8vIGFkZCBiYWNrIHRoZSBmbGV4IGNsYXNzIHNvIHRoZXkgZmlsbCB0aGUgc3BhY2VcbiAgICBpZiAodG90YWxXaWR0aCA8IHJvb3RDb250YWluZXJFbC5jbGllbnRXaWR0aCkge1xuICAgICAgcm9vdExlYXZlcy5mb3JFYWNoKChsZWFmOiBhbnkpID0+IHtcbiAgICAgICAgbGVhZi5jb250YWluZXJFbC5zdHlsZS5mbGV4ID0gJzEgMCAwJztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmKHdpZHRoQ2hhbmdlKSB0aGlzLmZvY3VzQWN0aXZlTGVhZighdGhpcy5zZXR0aW5ncy5sZWFmQXV0b1dpZHRoKTtcbiAgfVxuXG4gIC8vIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCBub3Qgb25seSB3aGVuIGEgZmlsZSBvcGVucywgYnV0IHdoZW4gdGhlIGFjdGl2ZSBwYW5lIGlzIHN3aXRjaGVkXG4gIGhhbmRsZUZpbGVPcGVuID0gKGU6IGFueSk6IHZvaWQgPT4ge1xuICAgIC8vIHB1dCBhIHNtYWxsIHRpbWVvdXQgb24gaXQgYmVjYXVzZSB3aGVuIGEgZmlsZSBpcyBvcGVuZWQgb24gdGhlIGZhciByaWdodCBcbiAgICAvLyBpdCB3YXNuJ3QgZm9jdXNzaW5nIHByb3Blcmx5LiBUaGUgdGltZW91dCBmaXhlcyB0aGlzXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAvLyBmb2N1cyBvbiB0aGUgbmV3bHkgc2VsZWN0ZWQgbGVhZlxuICAgICAgdGhpcy5mb2N1c0FjdGl2ZUxlYWYoKTtcbiAgICB9LCAxMCk7XG4gIH07XG5cbiAgZm9jdXNBY3RpdmVMZWFmKGFuaW1hdGVkOiBib29sZWFuID0gdHJ1ZSkge1xuICAgIC8vIGdldCBiYWNrIHRvIHRoZSBsZWFmIHdoaWNoIGhhcyBiZWVuIGFuZHknZCAoYGFueWAgYmVjYXVzZSBwYXJlbnRTcGxpdCBpcyB1bmRvY3VtZW50ZWQpXG4gICAgbGV0IGFjdGl2ZUxlYWY6IFdvcmtzcGFjZUl0ZW1FeHQgPSB0aGlzLmFwcC53b3Jrc3BhY2UuYWN0aXZlTGVhZiBhcyBXb3Jrc3BhY2VJdGVtIGFzIFdvcmtzcGFjZUl0ZW1FeHQ7XG4gICAgd2hpbGUgKGFjdGl2ZUxlYWYgIT0gbnVsbCAmJiBhY3RpdmVMZWFmLnBhcmVudFNwbGl0ICE9IG51bGwgJiYgYWN0aXZlTGVhZi5wYXJlbnRTcGxpdCAhPSB0aGlzLmFwcC53b3Jrc3BhY2Uucm9vdFNwbGl0KSB7XG4gICAgICBhY3RpdmVMZWFmID0gYWN0aXZlTGVhZi5wYXJlbnRTcGxpdCBhcyBXb3Jrc3BhY2VJdGVtRXh0O1xuICAgIH1cbiAgICBcbiAgICBpZiAoYWN0aXZlTGVhZiAhPSBudWxsICYmIHRoaXMucm9vdFNwbGl0KSB7XG5cbiAgICAgIGNvbnN0IHJvb3RDb250YWluZXJFbCA9IHRoaXMucm9vdENvbnRhaW5lckVsO1xuICAgICAgY29uc3Qgcm9vdExlYXZlcyA9IHRoaXMucm9vdExlYXZlcztcbiAgICAgIGNvbnN0IGxlYWZDb3VudCA9IHJvb3RMZWF2ZXMubGVuZ3RoO1xuXG4gICAgICAvLyBnZXQgdGhlIGluZGV4IG9mIHRoZSBhY3RpdmUgbGVhZlxuICAgICAgLy8gYWxzbywgZ2V0IHRoZSBwb3NpdGlvbiBvZiB0aGlzIGxlYWYsIHNvIHdlIGNhbiBzY3JvbGwgdG8gaXRcbiAgICAgIC8vIGFzIGxlYXZlcyBhcmUgcmVzaXphYmxlLCB3ZSBoYXZlIHRvIGl0ZXJhdGUgdGhyb3VnaCBhbGwgbGVhdmVzIHRvIHRoZVxuICAgICAgLy8gbGVmdCB1bnRpbCB3ZSBnZXQgdG8gdGhlIGFjdGl2ZSBvbmUgYW5kIGFkZCBhbGwgdGhlaXIgd2lkdGhzIHRvZ2V0aGVyXG4gICAgICBsZXQgcG9zaXRpb24gPSAwO1xuICAgICAgdGhpcy5hY3RpdmVMZWFmSW5kZXggPSAtMTtcbiAgICAgIHJvb3RMZWF2ZXMuZm9yRWFjaCgobGVhZjogV29ya3NwYWNlSXRlbSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAvLyBAdHMtaWdub3JlIHRvIGdldCB0aGUgdW5kb2N1bWVudGVkIGNvbnRhaW5lckVsXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lckVsID0gbGVhZi5jb250YWluZXJFbDtcblxuICAgICAgICAvLyB0aGlzIGlzIHRoZSBhY3RpdmUgb25lXG4gICAgICAgIGlmIChsZWFmID09IGFjdGl2ZUxlYWYpIHtcbiAgICAgICAgICB0aGlzLmFjdGl2ZUxlYWZJbmRleCA9IGluZGV4O1xuICAgICAgICAgIGNvbnRhaW5lckVsLmNsYXNzTGlzdC5yZW1vdmUoJ21vZC1hbS1sZWZ0LW9mLWFjdGl2ZScpO1xuICAgICAgICAgIGNvbnRhaW5lckVsLmNsYXNzTGlzdC5yZW1vdmUoJ21vZC1hbS1yaWdodC1vZi1hY3RpdmUnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmKHRoaXMuYWN0aXZlTGVhZkluZGV4ID09IC0xIHx8IGluZGV4IDwgdGhpcy5hY3RpdmVMZWFmSW5kZXgpIHtcbiAgICAgICAgICAvLyB0aGlzIGlzIGJlZm9yZSB0aGUgYWN0aXZlIG9uZSwgYWRkIHRoZSB3aWR0aFxuICAgICAgICAgIHBvc2l0aW9uICs9IGNvbnRhaW5lckVsLmNsaWVudFdpZHRoO1xuICAgICAgICAgIGNvbnRhaW5lckVsLmNsYXNzTGlzdC5hZGQoJ21vZC1hbS1sZWZ0LW9mLWFjdGl2ZScpO1xuICAgICAgICAgIGNvbnRhaW5lckVsLmNsYXNzTGlzdC5yZW1vdmUoJ21vZC1hbS1yaWdodC1vZi1hY3RpdmUnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAvLyB0aGlzIGlzIHJpZ2h0IG9mIHRoZSBhY3RpdmUgb25lXG4gICAgICAgICAgY29udGFpbmVyRWwuY2xhc3NMaXN0LnJlbW92ZSgnbW9kLWFtLWxlZnQtb2YtYWN0aXZlJyk7XG4gICAgICAgICAgY29udGFpbmVyRWwuY2xhc3NMaXN0LmFkZCgnbW9kLWFtLXJpZ2h0LW9mLWFjdGl2ZScpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgLy8gZ2V0IHRoaXMgbGVhZidzIGxlZnQgdmFsdWUgKHRoZSBhbW91bnQgb2Ygc3BhY2UgdG8gdGhlIGxlZnQgZm9yIHN0aWNreSBoZWFkZXJzKVxuICAgICAgY29uc3QgbGVmdCA9IHBhcnNlSW50KGFjdGl2ZUxlYWYuY29udGFpbmVyRWwuc3R5bGUubGVmdCkgfHwgMDtcbiAgICAgIC8vIHRoZSBhbW91bnQgb2Ygc3BhY2UgdG8gdGhlIHJpZ2h0IHdlIG5lZWQgdG8gbGVhdmUgZm9yIHN0aWNreSBoZWFkZXJzXG4gICAgICBjb25zdCBoZWFkZXJzVG9SaWdodFdpZHRoID0gdGhpcy5zZXR0aW5ncy5zdGFja2luZ0VuYWJsZWQgPyAobGVhZkNvdW50IC0gdGhpcy5hY3RpdmVMZWFmSW5kZXggLSAxKSAqIHRoaXMuc2V0dGluZ3MuaGVhZGVyV2lkdGggOiAwO1xuXG4gICAgICAvLyBkZXRlcm1pbmUgd2hldGhlciB0byByZXF1ZXN0ICdzbW9vdGgnIGFuaW1hdGlvbnMgb3IgJ2F1dG8nIHNuYXBcbiAgICAgIGxldCBiZWhhdmlvcjogU2Nyb2xsQmVoYXZpb3IgPSBhbmltYXRlZCAmJiB0aGlzLnNldHRpbmdzLnNtb290aEFuaW1hdGlvbiA/ICdzbW9vdGgnIDogJ2F1dG8nO1xuXG4gICAgICAvLyBpdCdzIHRvbyBmYXIgbGVmdFxuICAgICAgaWYgKHJvb3RDb250YWluZXJFbC5zY3JvbGxMZWZ0ID4gcG9zaXRpb24gLSBsZWZ0KSB7XG4gICAgICAgIC8vIHNjcm9sbCB0aGUgbGVmdCBzaWRlIG9mIHRoZSBwYW5lIGludG8gdmlld1xuICAgICAgICByb290Q29udGFpbmVyRWwuc2Nyb2xsVG8oeyBsZWZ0OiBwb3NpdGlvbiAtIGxlZnQsIHRvcDogMCwgYmVoYXZpb3I6IGJlaGF2aW9yIH0pO1xuICAgICAgfVxuICAgICAgLy8gaXQncyB0b28gZmFyIHJpZ2h0XG4gICAgICBlbHNlIGlmIChyb290Q29udGFpbmVyRWwuc2Nyb2xsTGVmdCArIHJvb3RDb250YWluZXJFbC5jbGllbnRXaWR0aCA8IHBvc2l0aW9uICsgYWN0aXZlTGVhZi5jb250YWluZXJFbC5jbGllbnRXaWR0aCArIGhlYWRlcnNUb1JpZ2h0V2lkdGgpIHtcbiAgICAgICAgLy8gc2Nyb2xsIHRoZSByaWdodCBzaWRlIG9mIHRoZSBwYW5lIGludG8gdmlld1xuICAgICAgICByb290Q29udGFpbmVyRWwuc2Nyb2xsVG8oeyBsZWZ0OiBwb3NpdGlvbiArIGFjdGl2ZUxlYWYuY29udGFpbmVyRWwuY2xpZW50V2lkdGggKyBoZWFkZXJzVG9SaWdodFdpZHRoIC0gcm9vdENvbnRhaW5lckVsLmNsaWVudFdpZHRoLCB0b3A6IDAsIGJlaGF2aW9yOiBiZWhhdmlvciB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBoYW5kZSB3aGVuIGEgZmlsZSBpcyBkZWxldGVkXG4gIGhhbmRsZURlbGV0ZSA9IChmaWxlOiBUQWJzdHJhY3RGaWxlKSA9PiB7XG4gICAgLy8gY2xvc2UgYW55IGxlYXZlcyB3aXRoIHRoZSBkZWxldGVkIGZpbGUgb3BlblxuICAgIC8vIGRldGFjaGluZyBhIGxlYWYgd2hpbGUgaXRlcmF0aW5nIG1lc3NlcyB3aXRoIHRoZSBpdGVyYXRpb25cbiAgICBjb25zdCBsZWF2ZXNUb0RldGFjaDogV29ya3NwYWNlTGVhZltdID0gW107XG4gICAgdGhpcy5hcHAud29ya3NwYWNlLml0ZXJhdGVSb290TGVhdmVzKChsZWFmOiBXb3Jrc3BhY2VMZWFmKSA9PiB7XG4gICAgICBpZiAobGVhZi52aWV3IGluc3RhbmNlb2YgRmlsZVZpZXcgJiYgbGVhZi52aWV3LmZpbGUgPT0gZmlsZSkge1xuICAgICAgICBsZWF2ZXNUb0RldGFjaC5wdXNoKGxlYWYpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGxlYXZlc1RvRGV0YWNoLmZvckVhY2gobGVhZiA9PiBsZWFmLmRldGFjaCgpKTtcbiAgfTtcblxuICAvLyBvdmVycmlkZW4gZnVuY3Rpb24gZm9yIHJvb3RTcGxpdCBjaGlsZCByZXNpemVcbiAgb25DaGlsZFJlc2l6ZVN0YXJ0ID0gKGxlYWY6IGFueSwgZXZlbnQ6IGFueSkgPT4ge1xuXG4gICAgLy8gb25seSByZWFsbHkgYXBwbHkgdGhpcyB0byB2ZXJ0aWNhbCBzcGxpdHNcbiAgICBpZiAodGhpcy5yb290U3BsaXRBbnkuZGlyZWN0aW9uID09PSBcInZlcnRpY2FsXCIpIHtcbiAgICAgIC8vIHRoaXMgaXMgdGhlIHdpZHRoIHRoZSBsZWFmIHN0YXJ0ZWQgYXQgYmVmb3JlIHJlc2l6ZVxuICAgICAgY29uc3Qgc3RhcnRXaWR0aCA9IGxlYWYuY29udGFpbmVyRWwuY2xpZW50V2lkdGg7XG5cbiAgICAgIC8vIHRoZSBtb3VzZW1vdmUgZXZlbnQgdG8gdHJpZ2dlciB3aGlsZSByZXNpemluZ1xuICAgICAgY29uc3QgbW91c2Vtb3ZlID0gKGU6IGFueSkgPT4ge1xuICAgICAgICAvLyBnZXQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZmlyc3QgcG9zaXRpb24gYW5kIGN1cnJlbnRcbiAgICAgICAgY29uc3QgZGVsdGFYID0gZS5wYWdlWCAtIGV2ZW50LnBhZ2VYO1xuICAgICAgICAvLyBhZGp1c3QgdGhlIHN0YXJ0IHdpZHRoIGJ5IHRoZSBkZWx0YVxuICAgICAgICBsZWFmLmNvbnRhaW5lckVsLnN0eWxlLndpZHRoID0gYCR7c3RhcnRXaWR0aCArIGRlbHRhWH1weGA7XG4gICAgICB9XG5cbiAgICAgIC8vIHRoZSBtb3VzZXVwIGV2ZW50IHRvIHRyaWdnZXIgYXQgdGhlIGVuZCBvZiByZXNpemluZ1xuICAgICAgY29uc3QgbW91c2V1cCA9ICgpID0+IHtcbiAgICAgICAgLy8gaWYgc3RhY2tpbmcgaXMgZW5hYmxlZCwgd2UgbmVlZCB0byByZS1qaWcgdGhlIFwicmlnaHRcIiB2YWx1ZVxuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5zdGFja2luZ0VuYWJsZWQpIHtcbiAgICAgICAgICAvLyB3ZSBuZWVkIHRoZSBsZWFmIGNvdW50IGFuZCBpbmRleCB0byBjYWxjdWxhdGUgdGhlIGNvcnJlY3QgdmFsdWVcbiAgICAgICAgICBjb25zdCByb290TGVhdmVzID0gdGhpcy5yb290TGVhdmVzO1xuICAgICAgICAgIGNvbnN0IGxlYWZDb3VudCA9IHJvb3RMZWF2ZXMubGVuZ3RoO1xuICAgICAgICAgIGNvbnN0IGxlYWZJbmRleCA9IHJvb3RMZWF2ZXMuZmluZEluZGV4KChsOiBhbnkpID0+IGwgPT0gbGVhZik7XG4gICAgICAgICAgbGVhZi5jb250YWluZXJFbC5zdHlsZS5yaWdodCA9ICgoKGxlYWZDb3VudCAtIGxlYWZJbmRleCAtIDEpICogdGhpcy5zZXR0aW5ncy5oZWFkZXJXaWR0aCkgLSBsZWFmLmNvbnRhaW5lckVsLmNsaWVudFdpZHRoKSArIFwicHhcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJlbW92ZSB0aGVzZSBldmVudCBsaXN0ZW5lcnMuIFdlJ3JlIGRvbmUgd2l0aCB0aGVtXG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgbW91c2Vtb3ZlKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgbW91c2V1cCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCB0aGUgYWJvdmUgdHdvIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCBtb3VzZW1vdmUpO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgbW91c2V1cCk7XG4gICAgfVxuICB9XG59XG4iXSwibmFtZXMiOlsiU2V0dGluZyIsIlBsdWdpblNldHRpbmdUYWIiLCJGaWxlVmlldyIsIlBsdWdpbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxhQUFhLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ25DLElBQUksYUFBYSxHQUFHLE1BQU0sQ0FBQyxjQUFjO0FBQ3pDLFNBQVMsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLFlBQVksS0FBSyxJQUFJLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNwRixRQUFRLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUMxRyxJQUFJLE9BQU8sYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMvQixDQUFDLENBQUM7QUFDRjtBQUNPLFNBQVMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDaEMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxLQUFLLFVBQVUsSUFBSSxDQUFDLEtBQUssSUFBSTtBQUM3QyxRQUFRLE1BQU0sSUFBSSxTQUFTLENBQUMsc0JBQXNCLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLCtCQUErQixDQUFDLENBQUM7QUFDbEcsSUFBSSxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLElBQUksU0FBUyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxFQUFFO0FBQzNDLElBQUksQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLEtBQUssSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztBQUN6RixDQUFDO0FBdUNEO0FBQ08sU0FBUyxTQUFTLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFO0FBQzdELElBQUksU0FBUyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxLQUFLLFlBQVksQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxVQUFVLE9BQU8sRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFO0FBQ2hILElBQUksT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDLEVBQUUsVUFBVSxPQUFPLEVBQUUsTUFBTSxFQUFFO0FBQy9ELFFBQVEsU0FBUyxTQUFTLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtBQUNuRyxRQUFRLFNBQVMsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtBQUN0RyxRQUFRLFNBQVMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRTtBQUN0SCxRQUFRLElBQUksQ0FBQyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxVQUFVLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUM5RSxLQUFLLENBQUMsQ0FBQztBQUNQLENBQUM7QUFDRDtBQUNPLFNBQVMsV0FBVyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUU7QUFDM0MsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3JILElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLE9BQU8sTUFBTSxLQUFLLFVBQVUsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLFdBQVcsRUFBRSxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDN0osSUFBSSxTQUFTLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLFVBQVUsQ0FBQyxFQUFFLEVBQUUsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUN0RSxJQUFJLFNBQVMsSUFBSSxDQUFDLEVBQUUsRUFBRTtBQUN0QixRQUFRLElBQUksQ0FBQyxFQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsaUNBQWlDLENBQUMsQ0FBQztBQUN0RSxRQUFRLE9BQU8sQ0FBQyxFQUFFLElBQUk7QUFDdEIsWUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN6SyxZQUFZLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDcEQsWUFBWSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDekIsZ0JBQWdCLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLE1BQU07QUFDOUMsZ0JBQWdCLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUN4RSxnQkFBZ0IsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztBQUNqRSxnQkFBZ0IsS0FBSyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsU0FBUztBQUNqRSxnQkFBZ0I7QUFDaEIsb0JBQW9CLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUU7QUFDaEksb0JBQW9CLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUU7QUFDMUcsb0JBQW9CLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMs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 diff --git a/.obsidian/plugins/sliding-panes-obsidian/manifest.json b/.obsidian/plugins/sliding-panes-obsidian/manifest.json deleted file mode 100644 index 0cebe1278..000000000 --- a/.obsidian/plugins/sliding-panes-obsidian/manifest.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "id": "sliding-panes-obsidian", - "name": "Sliding Panes (Andy's Mode)", - "author": "death_au", - "authorUrl": "https://github.com/deathau", - "description": "Sliding Panes! Based on the style of [Andy Matuschak's Notes](https://notes.andymatuschak.org/)", - "isDesktopOnly": false, - "version": "3.2.3", - "minAppVersion": "0.10.3" -} \ No newline at end of file diff --git a/.obsidian/plugins/sliding-panes-obsidian/styles.css b/.obsidian/plugins/sliding-panes-obsidian/styles.css deleted file mode 100644 index 1bbb3a222..000000000 --- a/.obsidian/plugins/sliding-panes-obsidian/styles.css +++ /dev/null @@ -1,115 +0,0 @@ -body.plugin-sliding-panes .workspace > .mod-root { - overflow-x: auto; - overflow-y: hidden; -} -body.plugin-sliding-panes .workspace > .mod-root > .workspace-leaf { - display: block; - flex: none; -} -body.plugin-sliding-panes .workspace > .mod-root > .workspace-leaf .workspace-leaf-content { - position: relative; -} -body.plugin-sliding-panes .workspace > .mod-root .mod-am-right-of-active .cm-s-obsidian > div:not([class]) { - left: -50% !important; -} -body.plugin-sliding-panes .workspace > .mod-root .mod-am-left-of-active .cm-s-obsidian > div:not([class]) { - left: 150% !important; -} - -body.plugin-sliding-panes-stacking .workspace > .mod-root > .workspace-leaf { - box-shadow: 0px 0px 20px 20px rgba(0, 0, 0, 0.25); - position: sticky; -} - -body.plugin-sliding-panes-rotate-header .workspace > .mod-root > .workspace-leaf { - /* first we'll add a bit of gap for the spines */ - /* active titles have different border colours */ -} -body.plugin-sliding-panes-rotate-header .workspace > .mod-root > .workspace-leaf > .workspace-leaf-content { - padding-left: var(--header-width); - /* this is where the magic happens */ - /* get rid of the gap left by the now-missing horizontal title */ -} -body.plugin-sliding-panes-rotate-header .workspace > .mod-root > .workspace-leaf > .workspace-leaf-content > .view-header { - writing-mode: vertical-lr; - text-orientation: sideways; - border-right: 1px solid var(--background-secondary-alt); - border-left: 2px solid var(--background-secondary-alt); - border-top: none; - border-bottom: none; - width: var(--header-width); - height: auto; - position: absolute; - left: 0; - top: 0; - bottom: 0; - /* unset the title container height and swap padding */ - /* swap the padding/margin around for the header and actions icons */ -} -body.plugin-sliding-panes-rotate-header .workspace > .mod-root > .workspace-leaf > .workspace-leaf-content > .view-header > .view-header-title-container { - height: unset; - padding-left: unset; - padding-top: 0; - /* get rid of unnecessary padding */ - /* fix the long-title-obscuring shadows */ -} -body.plugin-sliding-panes-rotate-header .workspace > .mod-root > .workspace-leaf > .workspace-leaf-content > .view-header > .view-header-title-container > .view-header-title { - padding-right: 0; - padding-top: 15px; - padding-bottom: 15px; -} -body.plugin-sliding-panes-rotate-header .workspace > .mod-root > .workspace-leaf > .workspace-leaf-content > .view-header > .view-header-title-container:after { - width: 100%; - height: 15px; - top: unset; - bottom: 0; - background: linear-gradient(to bottom, transparent, var(--background-secondary)); -} -body.plugin-sliding-panes-rotate-header .workspace > .mod-root > .workspace-leaf > .workspace-leaf-content > .view-header > .view-header-title-container:before { - content: ""; - position: absolute; - width: 100%; - height: 15px; - top: 0; - bottom: unset; - background: linear-gradient(to top, transparent, var(--background-secondary)); -} -body.plugin-sliding-panes-rotate-header .workspace > .mod-root > .workspace-leaf > .workspace-leaf-content > .view-header .view-header-icon, -body.plugin-sliding-panes-rotate-header .workspace > .mod-root > .workspace-leaf > .workspace-leaf-content > .view-header .view-actions { - padding: 0; -} -body.plugin-sliding-panes-rotate-header .workspace > .mod-root > .workspace-leaf > .workspace-leaf-content > .view-header .view-header-icon { - margin: 8px 0 3px 0; -} -body.plugin-sliding-panes-rotate-header .workspace > .mod-root > .workspace-leaf > .workspace-leaf-content > .view-header .view-action { - margin: 8px 0; -} -body.plugin-sliding-panes-rotate-header .workspace > .mod-root > .workspace-leaf > .workspace-leaf-content > .view-content { - height: 100%; -} -body.plugin-sliding-panes-rotate-header .workspace > .mod-root > .workspace-leaf.mod-active > .workspace-leaf-content > .view-header { - border-right: 2px solid var(--interactive-accent); - border-bottom: none; -} -body.plugin-sliding-panes-rotate-header .workspace > .mod-root > .workspace-leaf.mod-active > .workspace-leaf-content > .view-header > .view-header-title-container:after { - background: linear-gradient(to bottom, transparent, var(--background-primary-alt)); -} -body.plugin-sliding-panes-rotate-header .workspace > .mod-root > .workspace-leaf.mod-active > .workspace-leaf-content > .view-header > .view-header-title-container:before { - background: linear-gradient(to top, transparent, var(--background-primary-alt)); -} - -body.plugin-sliding-panes-rotate-header.plugin-sliding-panes-header-alt .workspace > .mod-root > .workspace-leaf > .workspace-leaf-content > .view-header .view-header-title-container { - transform: rotate(180deg); - text-align: right; - margin-top: 10px; -} - -body.plugin-sliding-panes-rotate-header.plugin-sliding-select-orientation-sideway .workspace > .mod-root > .workspace-leaf > .workspace-leaf-content > .view-header { - text-orientation: sideways !important; -} -body.plugin-sliding-panes-rotate-header.plugin-sliding-select-orientation-mixed .workspace > .mod-root > .workspace-leaf > .workspace-leaf-content > .view-header { - text-orientation: mixed !important; -} -body.plugin-sliding-panes-rotate-header.plugin-sliding-select-orientation-upright .workspace > .mod-root > .workspace-leaf > .workspace-leaf-content > .view-header { - text-orientation: upright !important; -} \ No newline at end of file diff --git a/.obsidian/plugins/templater-obsidian/main.js b/.obsidian/plugins/templater-obsidian/main.js deleted file mode 100644 index acaa80bbc..000000000 --- a/.obsidian/plugins/templater-obsidian/main.js +++ /dev/null @@ -1,3572 +0,0 @@ -'use strict'; - -var obsidian = require('obsidian'); -var fs = require('fs'); -var path = require('path'); -var child_process = require('child_process'); -var util = require('util'); - -function _interopNamespace(e) { - if (e && e.__esModule) return e; - var n = Object.create(null); - if (e) { - Object.keys(e).forEach(function (k) { - if (k !== 'default') { - var d = Object.getOwnPropertyDescriptor(e, k); - Object.defineProperty(n, k, d.get ? d : { - enumerable: true, - get: function () { - return e[k]; - } - }); - } - }); - } - n['default'] = e; - return Object.freeze(n); -} - -var path__namespace = /*#__PURE__*/_interopNamespace(path); - -/*! ***************************************************************************** -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -***************************************************************************** */ - -function __awaiter(thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -} - -class TemplaterError extends Error { - constructor(msg, console_msg) { - super(msg); - this.console_msg = console_msg; - this.name = this.constructor.name; - Error.captureStackTrace(this, this.constructor); - } -} - -const DEFAULT_SETTINGS = { - command_timeout: 5, - template_folder: "", - templates_pairs: [["", ""]], - trigger_on_file_creation: false, - enable_system_commands: false, - shell_path: "", - script_folder: undefined, - empty_file_template: undefined, - syntax_highlighting: true, -}; -class TemplaterSettingTab extends obsidian.PluginSettingTab { - constructor(app, plugin) { - super(app, plugin); - this.app = app; - this.plugin = plugin; - } - display() { - const { containerEl } = this; - let desc; - containerEl.empty(); - new obsidian.Setting(containerEl) - .setName("Template folder location") - .setDesc("Files in this folder will be available as templates.") - .addText(text => { - text.setPlaceholder("Example: folder 1/folder 2") - .setValue(this.plugin.settings.template_folder) - .onChange((new_folder) => { - this.plugin.settings.template_folder = new_folder; - this.plugin.saveSettings(); - }); - }); - new obsidian.Setting(containerEl) - .setName("Timeout") - .setDesc("Maximum timeout in seconds for a system command.") - .addText(text => { - text.setPlaceholder("Timeout") - .setValue(this.plugin.settings.command_timeout.toString()) - .onChange((new_value) => { - const new_timeout = Number(new_value); - if (isNaN(new_timeout)) { - this.plugin.log_error(new TemplaterError("Timeout must be a number")); - return; - } - this.plugin.settings.command_timeout = new_timeout; - this.plugin.saveSettings(); - }); - }); - desc = document.createDocumentFragment(); - desc.append("Templater provides multiples predefined variables / functions that you can use.", desc.createEl("br"), "Check the ", desc.createEl("a", { - href: "https://silentvoid13.github.io/Templater/", - text: "documentation" - }), " to get a list of all the available internal variables / functions."); - new obsidian.Setting(containerEl) - .setName("Internal Variables and Functions") - .setDesc(desc); - desc = document.createDocumentFragment(); - desc.append("Adds syntax highlighting for Templater commands in edit mode."); - new obsidian.Setting(containerEl) - .setName("Syntax Highlighting") - .setDesc(desc) - .addToggle(toggle => { - toggle - .setValue(this.plugin.settings.syntax_highlighting) - .onChange(syntax_highlighting => { - this.plugin.settings.syntax_highlighting = syntax_highlighting; - this.plugin.saveSettings(); - this.plugin.update_syntax_highlighting(); - }); - }); - desc = document.createDocumentFragment(); - desc.append("Templater will listen for the new file creation event, and replace every command it finds in the new file's content.", desc.createEl("br"), "This makes Templater compatible with other plugins like the Daily note core plugin, Calendar plugin, Review plugin, Note refactor plugin, ...", desc.createEl("br"), desc.createEl("b", { - text: "Warning: ", - }), "This can be dangerous if you create new files with unknown / unsafe content on creation. Make sure that every new file's content is safe on creation."); - new obsidian.Setting(containerEl) - .setName("Trigger Templater on new file creation") - .setDesc(desc) - .addToggle(toggle => { - toggle - .setValue(this.plugin.settings.trigger_on_file_creation) - .onChange(trigger_on_file_creation => { - this.plugin.settings.trigger_on_file_creation = trigger_on_file_creation; - this.plugin.saveSettings(); - this.plugin.update_trigger_file_on_creation(); - // Force refresh - this.display(); - }); - }); - if (this.plugin.settings.trigger_on_file_creation) { - desc = document.createDocumentFragment(); - desc.append("Templater will automatically apply this template to new empty files when they are created.", desc.createEl("br"), "The .md extension for the file shouldn't be specified."); - new obsidian.Setting(containerEl) - .setName("Empty file template") - .setDesc(desc) - .addText(text => { - text.setPlaceholder("folder 1/template_file") - .setValue(this.plugin.settings.empty_file_template) - .onChange((empty_file_template) => { - this.plugin.settings.empty_file_template = empty_file_template; - this.plugin.saveSettings(); - }); - }); - } - desc = document.createDocumentFragment(); - desc.append("All JavaScript files in this folder will be loaded as CommonJS modules, to import custom user functions.", desc.createEl("br"), "The folder needs to be accessible from the vault.", desc.createEl("br"), "Check the ", desc.createEl("a", { - href: "https://silentvoid13.github.io/Templater/", - text: "documentation", - }), " for more informations."); - new obsidian.Setting(containerEl) - .setName("Script files folder location") - .setDesc(desc) - .addText(text => { - text.setPlaceholder("Example: folder 1/folder 2") - .setValue(this.plugin.settings.script_folder) - .onChange((new_folder) => { - this.plugin.settings.script_folder = new_folder; - this.plugin.saveSettings(); - }); - }); - desc = document.createDocumentFragment(); - desc.append("Allows you to create user functions linked to system commands.", desc.createEl("br"), desc.createEl("b", { - text: "Warning: " - }), "It can be dangerous to execute arbitrary system commands from untrusted sources. Only run system commands that you understand, from trusted sources."); - new obsidian.Setting(containerEl) - .setName("Enable System Commands") - .setDesc(desc) - .addToggle(toggle => { - toggle - .setValue(this.plugin.settings.enable_system_commands) - .onChange(enable_system_commands => { - this.plugin.settings.enable_system_commands = enable_system_commands; - this.plugin.saveSettings(); - // Force refresh - this.display(); - }); - }); - if (this.plugin.settings.enable_system_commands) { - desc = document.createDocumentFragment(); - desc.append("Full path to the shell binary to execute the command with.", desc.createEl("br"), "This setting is optional and will default to the system's default shell if not specified.", desc.createEl("br"), "You can use forward slashes ('/') as path separators on all platforms if in doubt."); - new obsidian.Setting(containerEl) - .setName("Shell binary location") - .setDesc(desc) - .addText(text => { - text.setPlaceholder("Example: /bin/bash, ...") - .setValue(this.plugin.settings.shell_path) - .onChange((shell_path) => { - this.plugin.settings.shell_path = shell_path; - this.plugin.saveSettings(); - }); - }); - let i = 1; - this.plugin.settings.templates_pairs.forEach((template_pair) => { - const div = containerEl.createEl('div'); - div.addClass("templater_div"); - const title = containerEl.createEl('h4', { - text: 'User Function n°' + i, - }); - title.addClass("templater_title"); - const setting = new obsidian.Setting(containerEl) - .addExtraButton(extra => { - extra.setIcon("cross") - .setTooltip("Delete") - .onClick(() => { - const index = this.plugin.settings.templates_pairs.indexOf(template_pair); - if (index > -1) { - this.plugin.settings.templates_pairs.splice(index, 1); - // Force refresh - this.plugin.saveSettings(); - this.display(); - } - }); - }) - .addText(text => { - const t = text.setPlaceholder('Function name') - .setValue(template_pair[0]) - .onChange((new_value) => { - const index = this.plugin.settings.templates_pairs.indexOf(template_pair); - if (index > -1) { - this.plugin.settings.templates_pairs[index][0] = new_value; - this.plugin.saveSettings(); - } - }); - t.inputEl.addClass("templater_template"); - return t; - }) - .addTextArea(text => { - const t = text.setPlaceholder('System Command') - .setValue(template_pair[1]) - .onChange((new_cmd) => { - const index = this.plugin.settings.templates_pairs.indexOf(template_pair); - if (index > -1) { - this.plugin.settings.templates_pairs[index][1] = new_cmd; - this.plugin.saveSettings(); - } - }); - t.inputEl.setAttr("rows", 4); - t.inputEl.addClass("templater_cmd"); - return t; - }); - setting.infoEl.remove(); - div.appendChild(title); - div.appendChild(containerEl.lastChild); - i += 1; - }); - const div = containerEl.createEl('div'); - div.addClass("templater_div2"); - const setting = new obsidian.Setting(containerEl) - .addButton(button => { - const b = button.setButtonText("Add New User Function").onClick(() => { - this.plugin.settings.templates_pairs.push(["", ""]); - // Force refresh - this.display(); - }); - b.buttonEl.addClass("templater_button"); - return b; - }); - setting.infoEl.remove(); - div.appendChild(containerEl.lastChild); - } - } -} - -const obsidian_module = require("obsidian"); -function delay(ms) { - return new Promise(resolve => setTimeout(resolve, ms)); -} -function escapeRegExp$1(str) { - return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string -} -function resolveTFile(app, file_str) { - file_str = obsidian.normalizePath(file_str); - const file = app.vault.getAbstractFileByPath(file_str); - if (!file) { - throw new TemplaterError(`File "${file_str}" doesn't exist`); - } - if (!(file instanceof obsidian.TFile)) { - throw new TemplaterError(`${file_str} is a folder, not a file`); - } - return file; -} -function getTFilesFromFolder(app, folder_str) { - folder_str = obsidian.normalizePath(folder_str); - const folder = app.vault.getAbstractFileByPath(folder_str); - if (!folder) { - throw new TemplaterError(`Folder "${folder_str}" doesn't exist`); - } - if (!(folder instanceof obsidian.TFolder)) { - throw new TemplaterError(`${folder_str} is a file, not a folder`); - } - let files = []; - obsidian.Vault.recurseChildren(folder, (file) => { - if (file instanceof obsidian.TFile) { - files.push(file); - } - }); - files.sort((a, b) => { - return a.basename.localeCompare(b.basename); - }); - return files; -} - -var OpenMode; -(function (OpenMode) { - OpenMode[OpenMode["InsertTemplate"] = 0] = "InsertTemplate"; - OpenMode[OpenMode["CreateNoteTemplate"] = 1] = "CreateNoteTemplate"; -})(OpenMode || (OpenMode = {})); -class TemplaterFuzzySuggestModal extends obsidian.FuzzySuggestModal { - constructor(app, plugin) { - super(app); - this.app = app; - this.plugin = plugin; - } - getItems() { - if (this.plugin.settings.template_folder === "") { - return this.app.vault.getMarkdownFiles(); - } - return getTFilesFromFolder(this.app, this.plugin.settings.template_folder); - } - getItemText(item) { - return item.basename; - } - onChooseItem(item, _evt) { - switch (this.open_mode) { - case OpenMode.InsertTemplate: - this.plugin.templater.append_template(item); - break; - case OpenMode.CreateNoteTemplate: - this.plugin.templater.create_new_note_from_template(item, this.creation_folder); - break; - } - } - start() { - try { - this.open(); - } - catch (e) { - this.plugin.log_error(e); - } - } - insert_template() { - this.open_mode = OpenMode.InsertTemplate; - this.start(); - } - create_new_note_from_template(folder) { - this.creation_folder = folder; - this.open_mode = OpenMode.CreateNoteTemplate; - this.start(); - } -} - -const UNSUPPORTED_MOBILE_TEMPLATE = "Error_MobileUnsupportedTemplate"; -const ICON_DATA = ``; - -class CursorJumper { - constructor(app) { - this.app = app; - this.cursor_regex = new RegExp("<%\\s*tp.file.cursor\\((?[0-9]{0,2})\\)\\s*%>", "g"); - } - jump_to_next_cursor_location() { - return __awaiter(this, void 0, void 0, function* () { - const active_view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView); - if (!active_view) { - return; - } - const active_file = active_view.file; - yield active_view.save(); - const content = yield this.app.vault.read(active_file); - const { new_content, positions } = this.replace_and_get_cursor_positions(content); - if (positions) { - yield this.app.vault.modify(active_file, new_content); - this.set_cursor_location(positions); - } - }); - } - get_editor_position_from_index(content, index) { - const substr = content.substr(0, index); - let l = 0; - let offset = -1; - let r = -1; - for (; (r = substr.indexOf("\n", r + 1)) !== -1; l++, offset = r) - ; - offset += 1; - const ch = content.substr(offset, index - offset).length; - return { line: l, ch: ch }; - } - replace_and_get_cursor_positions(content) { - let cursor_matches = []; - let match; - while ((match = this.cursor_regex.exec(content)) != null) { - cursor_matches.push(match); - } - if (cursor_matches.length === 0) { - return {}; - } - cursor_matches.sort((m1, m2) => { - return Number(m1.groups["order"]) - Number(m2.groups["order"]); - }); - const match_str = cursor_matches[0][0]; - cursor_matches = cursor_matches.filter(m => { - return m[0] === match_str; - }); - const positions = []; - let index_offset = 0; - for (let match of cursor_matches) { - const index = match.index - index_offset; - positions.push(this.get_editor_position_from_index(content, index)); - content = content.replace(new RegExp(escapeRegExp$1(match[0])), ""); - index_offset += match[0].length; - // For tp.file.cursor(), we keep the default top to bottom - if (match[1] === "") { - break; - } - } - return { new_content: content, positions: positions }; - } - set_cursor_location(positions) { - const active_view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView); - if (!active_view) { - return; - } - const editor = active_view.editor; - editor.focus(); - let selections = []; - for (let pos of positions) { - selections.push({ from: pos }); - } - let transaction = { - selections: selections - }; - editor.transaction(transaction); - } -} - -function setPrototypeOf(obj, proto) { - // eslint-disable-line @typescript-eslint/no-explicit-any - if (Object.setPrototypeOf) { - Object.setPrototypeOf(obj, proto); - } - else { - obj.__proto__ = proto; - } -} -// This is pretty much the only way to get nice, extended Errors -// without using ES6 -/** - * This returns a new Error with a custom prototype. Note that it's _not_ a constructor - * - * @param message Error message - * - * **Example** - * - * ```js - * throw EtaErr("template not found") - * ``` - */ -function EtaErr(message) { - var err = new Error(message); - setPrototypeOf(err, EtaErr.prototype); - return err; -} -EtaErr.prototype = Object.create(Error.prototype, { - name: { value: 'Eta Error', enumerable: false } -}); -/** - * Throws an EtaErr with a nicely formatted error and message showing where in the template the error occurred. - */ -function ParseErr(message, str, indx) { - var whitespace = str.slice(0, indx).split(/\n/); - var lineNo = whitespace.length; - var colNo = whitespace[lineNo - 1].length + 1; - message += - ' at line ' + - lineNo + - ' col ' + - colNo + - ':\n\n' + - ' ' + - str.split(/\n/)[lineNo - 1] + - '\n' + - ' ' + - Array(colNo).join(' ') + - '^'; - throw EtaErr(message); -} - -/** - * @returns The global Promise function - */ -var promiseImpl = new Function('return this')().Promise; -/** - * @returns A new AsyncFunction constuctor - */ -function getAsyncFunctionConstructor() { - try { - return new Function('return (async function(){}).constructor')(); - } - catch (e) { - if (e instanceof SyntaxError) { - throw EtaErr("This environment doesn't support async/await"); - } - else { - throw e; - } - } -} -/** - * str.trimLeft polyfill - * - * @param str - Input string - * @returns The string with left whitespace removed - * - */ -function trimLeft(str) { - // eslint-disable-next-line no-extra-boolean-cast - if (!!String.prototype.trimLeft) { - return str.trimLeft(); - } - else { - return str.replace(/^\s+/, ''); - } -} -/** - * str.trimRight polyfill - * - * @param str - Input string - * @returns The string with right whitespace removed - * - */ -function trimRight(str) { - // eslint-disable-next-line no-extra-boolean-cast - if (!!String.prototype.trimRight) { - return str.trimRight(); - } - else { - return str.replace(/\s+$/, ''); // TODO: do we really need to replace BOM's? - } -} - -// TODO: allow '-' to trim up until newline. Use [^\S\n\r] instead of \s -/* END TYPES */ -function hasOwnProp(obj, prop) { - return Object.prototype.hasOwnProperty.call(obj, prop); -} -function copyProps(toObj, fromObj) { - for (var key in fromObj) { - if (hasOwnProp(fromObj, key)) { - toObj[key] = fromObj[key]; - } - } - return toObj; -} -/** - * Takes a string within a template and trims it, based on the preceding tag's whitespace control and `config.autoTrim` - */ -function trimWS(str, config, wsLeft, wsRight) { - var leftTrim; - var rightTrim; - if (Array.isArray(config.autoTrim)) { - // kinda confusing - // but _}} will trim the left side of the following string - leftTrim = config.autoTrim[1]; - rightTrim = config.autoTrim[0]; - } - else { - leftTrim = rightTrim = config.autoTrim; - } - if (wsLeft || wsLeft === false) { - leftTrim = wsLeft; - } - if (wsRight || wsRight === false) { - rightTrim = wsRight; - } - if (!rightTrim && !leftTrim) { - return str; - } - if (leftTrim === 'slurp' && rightTrim === 'slurp') { - return str.trim(); - } - if (leftTrim === '_' || leftTrim === 'slurp') { - // console.log('trimming left' + leftTrim) - // full slurp - str = trimLeft(str); - } - else if (leftTrim === '-' || leftTrim === 'nl') { - // nl trim - str = str.replace(/^(?:\r\n|\n|\r)/, ''); - } - if (rightTrim === '_' || rightTrim === 'slurp') { - // full slurp - str = trimRight(str); - } - else if (rightTrim === '-' || rightTrim === 'nl') { - // nl trim - str = str.replace(/(?:\r\n|\n|\r)$/, ''); // TODO: make sure this gets \r\n - } - return str; -} -/** - * A map of special HTML characters to their XML-escaped equivalents - */ -var escMap = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - "'": ''' -}; -function replaceChar(s) { - return escMap[s]; -} -/** - * XML-escapes an input value after converting it to a string - * - * @param str - Input value (usually a string) - * @returns XML-escaped string - */ -function XMLEscape(str) { - // eslint-disable-line @typescript-eslint/no-explicit-any - // To deal with XSS. Based on Escape implementations of Mustache.JS and Marko, then customized. - var newStr = String(str); - if (/[&<>"']/.test(newStr)) { - return newStr.replace(/[&<>"']/g, replaceChar); - } - else { - return newStr; - } -} - -/* END TYPES */ -var templateLitReg = /`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})*}|(?!\${)[^\\`])*`/g; -var singleQuoteReg = /'(?:\\[\s\w"'\\`]|[^\n\r'\\])*?'/g; -var doubleQuoteReg = /"(?:\\[\s\w"'\\`]|[^\n\r"\\])*?"/g; -/** Escape special regular expression characters inside a string */ -function escapeRegExp(string) { - // From MDN - return string.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string -} -function parse(str, config) { - var buffer = []; - var trimLeftOfNextStr = false; - var lastIndex = 0; - var parseOptions = config.parse; - if (config.plugins) { - for (var i = 0; i < config.plugins.length; i++) { - var plugin = config.plugins[i]; - if (plugin.processTemplate) { - str = plugin.processTemplate(str, config); - } - } - } - /* Adding for EJS compatibility */ - if (config.rmWhitespace) { - // Code taken directly from EJS - // Have to use two separate replaces here as `^` and `$` operators don't - // work well with `\r` and empty lines don't work well with the `m` flag. - // Essentially, this replaces the whitespace at the beginning and end of - // each line and removes multiple newlines. - str = str.replace(/[\r\n]+/g, '\n').replace(/^\s+|\s+$/gm, ''); - } - /* End rmWhitespace option */ - templateLitReg.lastIndex = 0; - singleQuoteReg.lastIndex = 0; - doubleQuoteReg.lastIndex = 0; - function pushString(strng, shouldTrimRightOfString) { - if (strng) { - // if string is truthy it must be of type 'string' - strng = trimWS(strng, config, trimLeftOfNextStr, // this will only be false on the first str, the next ones will be null or undefined - shouldTrimRightOfString); - if (strng) { - // replace \ with \\, ' with \' - // we're going to convert all CRLF to LF so it doesn't take more than one replace - strng = strng.replace(/\\|'/g, '\\$&').replace(/\r\n|\n|\r/g, '\\n'); - buffer.push(strng); - } - } - } - var prefixes = [parseOptions.exec, parseOptions.interpolate, parseOptions.raw].reduce(function (accumulator, prefix) { - if (accumulator && prefix) { - return accumulator + '|' + escapeRegExp(prefix); - } - else if (prefix) { - // accumulator is falsy - return escapeRegExp(prefix); - } - else { - // prefix and accumulator are both falsy - return accumulator; - } - }, ''); - var parseOpenReg = new RegExp('([^]*?)' + escapeRegExp(config.tags[0]) + '(-|_)?\\s*(' + prefixes + ')?\\s*(?![\\s+\\-_' + prefixes + '])', 'g'); - var parseCloseReg = new RegExp('\'|"|`|\\/\\*|(\\s*(-|_)?' + escapeRegExp(config.tags[1]) + ')', 'g'); - // TODO: benchmark having the \s* on either side vs using str.trim() - var m; - while ((m = parseOpenReg.exec(str))) { - lastIndex = m[0].length + m.index; - var precedingString = m[1]; - var wsLeft = m[2]; - var prefix = m[3] || ''; // by default either ~, =, or empty - pushString(precedingString, wsLeft); - parseCloseReg.lastIndex = lastIndex; - var closeTag = void 0; - var currentObj = false; - while ((closeTag = parseCloseReg.exec(str))) { - if (closeTag[1]) { - var content = str.slice(lastIndex, closeTag.index); - parseOpenReg.lastIndex = lastIndex = parseCloseReg.lastIndex; - trimLeftOfNextStr = closeTag[2]; - var currentType = prefix === parseOptions.exec - ? 'e' - : prefix === parseOptions.raw - ? 'r' - : prefix === parseOptions.interpolate - ? 'i' - : ''; - currentObj = { t: currentType, val: content }; - break; - } - else { - var char = closeTag[0]; - if (char === '/*') { - var commentCloseInd = str.indexOf('*/', parseCloseReg.lastIndex); - if (commentCloseInd === -1) { - ParseErr('unclosed comment', str, closeTag.index); - } - parseCloseReg.lastIndex = commentCloseInd; - } - else if (char === "'") { - singleQuoteReg.lastIndex = closeTag.index; - var singleQuoteMatch = singleQuoteReg.exec(str); - if (singleQuoteMatch) { - parseCloseReg.lastIndex = singleQuoteReg.lastIndex; - } - else { - ParseErr('unclosed string', str, closeTag.index); - } - } - else if (char === '"') { - doubleQuoteReg.lastIndex = closeTag.index; - var doubleQuoteMatch = doubleQuoteReg.exec(str); - if (doubleQuoteMatch) { - parseCloseReg.lastIndex = doubleQuoteReg.lastIndex; - } - else { - ParseErr('unclosed string', str, closeTag.index); - } - } - else if (char === '`') { - templateLitReg.lastIndex = closeTag.index; - var templateLitMatch = templateLitReg.exec(str); - if (templateLitMatch) { - parseCloseReg.lastIndex = templateLitReg.lastIndex; - } - else { - ParseErr('unclosed string', str, closeTag.index); - } - } - } - } - if (currentObj) { - buffer.push(currentObj); - } - else { - ParseErr('unclosed tag', str, m.index + precedingString.length); - } - } - pushString(str.slice(lastIndex, str.length), false); - if (config.plugins) { - for (var i = 0; i < config.plugins.length; i++) { - var plugin = config.plugins[i]; - if (plugin.processAST) { - buffer = plugin.processAST(buffer, config); - } - } - } - return buffer; -} - -/* END TYPES */ -/** - * Compiles a template string to a function string. Most often users just use `compile()`, which calls `compileToString` and creates a new function using the result - * - * **Example** - * - * ```js - * compileToString("Hi <%= it.user %>", eta.config) - * // "var tR='',include=E.include.bind(E),includeFile=E.includeFile.bind(E);tR+='Hi ';tR+=E.e(it.user);if(cb){cb(null,tR)} return tR" - * ``` - */ -function compileToString(str, config) { - var buffer = parse(str, config); - var res = "var tR='',__l,__lP" + - (config.include ? ',include=E.include.bind(E)' : '') + - (config.includeFile ? ',includeFile=E.includeFile.bind(E)' : '') + - '\nfunction layout(p,d){__l=p;__lP=d}\n' + - (config.globalAwait ? 'const _prs = [];\n' : '') + - (config.useWith ? 'with(' + config.varName + '||{}){' : '') + - compileScope(buffer, config) + - (config.includeFile - ? 'if(__l)tR=' + - (config.async ? 'await ' : '') + - ("includeFile(__l,Object.assign(" + config.varName + ",{body:tR},__lP))\n") - : config.include - ? 'if(__l)tR=' + - (config.async ? 'await ' : '') + - ("include(__l,Object.assign(" + config.varName + ",{body:tR},__lP))\n") - : '') + - 'if(cb){cb(null,tR)} return tR' + - (config.useWith ? '}' : ''); - if (config.plugins) { - for (var i = 0; i < config.plugins.length; i++) { - var plugin = config.plugins[i]; - if (plugin.processFnString) { - res = plugin.processFnString(res, config); - } - } - } - return res; -} -/** - * Loops through the AST generated by `parse` and transform each item into JS calls - * - * **Example** - * - * ```js - * // AST version of 'Hi <%= it.user %>' - * let templateAST = ['Hi ', { val: 'it.user', t: 'i' }] - * compileScope(templateAST, eta.config) - * // "tR+='Hi ';tR+=E.e(it.user);" - * ``` - */ -function compileScope(buff, config) { - var i; - var buffLength = buff.length; - var returnStr = ''; - var REPLACEMENT_STR = "rJ2KqXzxQg"; - for (i = 0; i < buffLength; i++) { - var currentBlock = buff[i]; - if (typeof currentBlock === 'string') { - var str = currentBlock; - // we know string exists - returnStr += "tR+='" + str + "'\n"; - } - else { - var type = currentBlock.t; // ~, s, !, ?, r - var content = currentBlock.val || ''; - if (type === 'r') { - // raw - if (config.globalAwait) { - returnStr += "_prs.push(" + content + ");\n"; - returnStr += "tR+='" + REPLACEMENT_STR + "'\n"; - } - else { - if (config.filter) { - content = 'E.filter(' + content + ')'; - } - returnStr += 'tR+=' + content + '\n'; - } - } - else if (type === 'i') { - // interpolate - if (config.globalAwait) { - returnStr += "_prs.push(" + content + ");\n"; - returnStr += "tR+='" + REPLACEMENT_STR + "'\n"; - } - else { - if (config.filter) { - content = 'E.filter(' + content + ')'; - } - returnStr += 'tR+=' + content + '\n'; - if (config.autoEscape) { - content = 'E.e(' + content + ')'; - } - returnStr += 'tR+=' + content + '\n'; - } - } - else if (type === 'e') { - // execute - returnStr += content + '\n'; // you need a \n in case you have <% } %> - } - } - } - if (config.globalAwait) { - returnStr += "const _rst = await Promise.all(_prs);\ntR = tR.replace(/" + REPLACEMENT_STR + "/g, () => _rst.shift());\n"; - } - return returnStr; -} - -/** - * Handles storage and accessing of values - * - * In this case, we use it to store compiled template functions - * Indexed by their `name` or `filename` - */ -var Cacher = /** @class */ (function () { - function Cacher(cache) { - this.cache = cache; - } - Cacher.prototype.define = function (key, val) { - this.cache[key] = val; - }; - Cacher.prototype.get = function (key) { - // string | array. - // TODO: allow array of keys to look down - // TODO: create plugin to allow referencing helpers, filters with dot notation - return this.cache[key]; - }; - Cacher.prototype.remove = function (key) { - delete this.cache[key]; - }; - Cacher.prototype.reset = function () { - this.cache = {}; - }; - Cacher.prototype.load = function (cacheObj) { - copyProps(this.cache, cacheObj); - }; - return Cacher; -}()); - -/* END TYPES */ -/** - * Eta's template storage - * - * Stores partials and cached templates - */ -var templates = new Cacher({}); - -/* END TYPES */ -/** - * Include a template based on its name (or filepath, if it's already been cached). - * - * Called like `include(templateNameOrPath, data)` - */ -function includeHelper(templateNameOrPath, data) { - var template = this.templates.get(templateNameOrPath); - if (!template) { - throw EtaErr('Could not fetch template "' + templateNameOrPath + '"'); - } - return template(data, this); -} -/** Eta's base (global) configuration */ -var config = { - async: false, - autoEscape: true, - autoTrim: [false, 'nl'], - cache: false, - e: XMLEscape, - include: includeHelper, - parse: { - exec: '', - interpolate: '=', - raw: '~' - }, - plugins: [], - rmWhitespace: false, - tags: ['<%', '%>'], - templates: templates, - useWith: false, - varName: 'it' -}; -/** - * Takes one or two partial (not necessarily complete) configuration objects, merges them 1 layer deep into eta.config, and returns the result - * - * @param override Partial configuration object - * @param baseConfig Partial configuration object to merge before `override` - * - * **Example** - * - * ```js - * let customConfig = getConfig({tags: ['!#', '#!']}) - * ``` - */ -function getConfig(override, baseConfig) { - // TODO: run more tests on this - var res = {}; // Linked - copyProps(res, config); // Creates deep clone of eta.config, 1 layer deep - if (baseConfig) { - copyProps(res, baseConfig); - } - if (override) { - copyProps(res, override); - } - return res; -} - -/* END TYPES */ -/** - * Takes a template string and returns a template function that can be called with (data, config, [cb]) - * - * @param str - The template string - * @param config - A custom configuration object (optional) - * - * **Example** - * - * ```js - * let compiledFn = eta.compile("Hi <%= it.user %>") - * // function anonymous() - * let compiledFnStr = compiledFn.toString() - * // "function anonymous(it,E,cb\n) {\nvar tR='',include=E.include.bind(E),includeFile=E.includeFile.bind(E);tR+='Hi ';tR+=E.e(it.user);if(cb){cb(null,tR)} return tR\n}" - * ``` - */ -function compile(str, config) { - var options = getConfig(config || {}); - /* ASYNC HANDLING */ - // The below code is modified from mde/ejs. All credit should go to them. - var ctor = options.async ? getAsyncFunctionConstructor() : Function; - /* END ASYNC HANDLING */ - try { - return new ctor(options.varName, 'E', // EtaConfig - 'cb', // optional callback - compileToString(str, options)); // eslint-disable-line no-new-func - } - catch (e) { - if (e instanceof SyntaxError) { - throw EtaErr('Bad template syntax\n\n' + - e.message + - '\n' + - Array(e.message.length + 1).join('=') + - '\n' + - compileToString(str, options) + - '\n' // This will put an extra newline before the callstack for extra readability - ); - } - else { - throw e; - } - } -} - -var _BOM = /^\uFEFF/; -/* END TYPES */ -/** - * Get the path to the included file from the parent file path and the - * specified path. - * - * If `name` does not have an extension, it will default to `.eta` - * - * @param name specified path - * @param parentfile parent file path - * @param isDirectory whether parentfile is a directory - * @return absolute path to template - */ -function getWholeFilePath(name, parentfile, isDirectory) { - var includePath = path__namespace.resolve(isDirectory ? parentfile : path__namespace.dirname(parentfile), // returns directory the parent file is in - name // file - ) + (path__namespace.extname(name) ? '' : '.eta'); - return includePath; -} -/** - * Get the absolute path to an included template - * - * If this is called with an absolute path (for example, starting with '/' or 'C:\') - * then Eta will attempt to resolve the absolute path within options.views. If it cannot, - * Eta will fallback to options.root or '/' - * - * If this is called with a relative path, Eta will: - * - Look relative to the current template (if the current template has the `filename` property) - * - Look inside each directory in options.views - * - * Note: if Eta is unable to find a template using path and options, it will throw an error. - * - * @param path specified path - * @param options compilation options - * @return absolute path to template - */ -function getPath(path, options) { - var includePath = false; - var views = options.views; - var searchedPaths = []; - // If these four values are the same, - // getPath() will return the same result every time. - // We can cache the result to avoid expensive - // file operations. - var pathOptions = JSON.stringify({ - filename: options.filename, - path: path, - root: options.root, - views: options.views - }); - if (options.cache && options.filepathCache && options.filepathCache[pathOptions]) { - // Use the cached filepath - return options.filepathCache[pathOptions]; - } - /** Add a filepath to the list of paths we've checked for a template */ - function addPathToSearched(pathSearched) { - if (!searchedPaths.includes(pathSearched)) { - searchedPaths.push(pathSearched); - } - } - /** - * Take a filepath (like 'partials/mypartial.eta'). Attempt to find the template file inside `views`; - * return the resulting template file path, or `false` to indicate that the template was not found. - * - * @param views the filepath that holds templates, or an array of filepaths that hold templates - * @param path the path to the template - */ - function searchViews(views, path) { - var filePath; - // If views is an array, then loop through each directory - // And attempt to find the template - if (Array.isArray(views) && - views.some(function (v) { - filePath = getWholeFilePath(path, v, true); - addPathToSearched(filePath); - return fs.existsSync(filePath); - })) { - // If the above returned true, we know that the filePath was just set to a path - // That exists (Array.some() returns as soon as it finds a valid element) - return filePath; - } - else if (typeof views === 'string') { - // Search for the file if views is a single directory - filePath = getWholeFilePath(path, views, true); - addPathToSearched(filePath); - if (fs.existsSync(filePath)) { - return filePath; - } - } - // Unable to find a file - return false; - } - // Path starts with '/', 'C:\', etc. - var match = /^[A-Za-z]+:\\|^\//.exec(path); - // Absolute path, like /partials/partial.eta - if (match && match.length) { - // We have to trim the beginning '/' off the path, or else - // path.resolve(dir, path) will always resolve to just path - var formattedPath = path.replace(/^\/*/, ''); - // First, try to resolve the path within options.views - includePath = searchViews(views, formattedPath); - if (!includePath) { - // If that fails, searchViews will return false. Try to find the path - // inside options.root (by default '/', the base of the filesystem) - var pathFromRoot = getWholeFilePath(formattedPath, options.root || '/', true); - addPathToSearched(pathFromRoot); - includePath = pathFromRoot; - } - } - else { - // Relative paths - // Look relative to a passed filename first - if (options.filename) { - var filePath = getWholeFilePath(path, options.filename); - addPathToSearched(filePath); - if (fs.existsSync(filePath)) { - includePath = filePath; - } - } - // Then look for the template in options.views - if (!includePath) { - includePath = searchViews(views, path); - } - if (!includePath) { - throw EtaErr('Could not find the template "' + path + '". Paths tried: ' + searchedPaths); - } - } - // If caching and filepathCache are enabled, - // cache the input & output of this function. - if (options.cache && options.filepathCache) { - options.filepathCache[pathOptions] = includePath; - } - return includePath; -} -/** - * Reads a file synchronously - */ -function readFile(filePath) { - try { - return fs.readFileSync(filePath).toString().replace(_BOM, ''); // TODO: is replacing BOM's necessary? - } - catch (_a) { - throw EtaErr("Failed to read template at '" + filePath + "'"); - } -} - -// express is set like: app.engine('html', require('eta').renderFile) -/* END TYPES */ -/** - * Reads a template, compiles it into a function, caches it if caching isn't disabled, returns the function - * - * @param filePath Absolute path to template file - * @param options Eta configuration overrides - * @param noCache Optionally, make Eta not cache the template - */ -function loadFile(filePath, options, noCache) { - var config = getConfig(options); - var template = readFile(filePath); - try { - var compiledTemplate = compile(template, config); - if (!noCache) { - config.templates.define(config.filename, compiledTemplate); - } - return compiledTemplate; - } - catch (e) { - throw EtaErr('Loading file: ' + filePath + ' failed:\n\n' + e.message); - } -} -/** - * Get the template from a string or a file, either compiled on-the-fly or - * read from cache (if enabled), and cache the template if needed. - * - * If `options.cache` is true, this function reads the file from - * `options.filename` so it must be set prior to calling this function. - * - * @param options compilation options - * @return Eta template function - */ -function handleCache$1(options) { - var filename = options.filename; - if (options.cache) { - var func = options.templates.get(filename); - if (func) { - return func; - } - return loadFile(filename, options); - } - // Caching is disabled, so pass noCache = true - return loadFile(filename, options, true); -} -/** - * Get the template function. - * - * If `options.cache` is `true`, then the template is cached. - * - * This returns a template function and the config object with which that template function should be called. - * - * @remarks - * - * It's important that this returns a config object with `filename` set. - * Otherwise, the included file would not be able to use relative paths - * - * @param path path for the specified file (if relative, specify `views` on `options`) - * @param options compilation options - * @return [Eta template function, new config object] - */ -function includeFile(path, options) { - // the below creates a new options object, using the parent filepath of the old options object and the path - var newFileOptions = getConfig({ filename: getPath(path, options) }, options); - // TODO: make sure properties are currectly copied over - return [handleCache$1(newFileOptions), newFileOptions]; -} - -/* END TYPES */ -/** - * Called with `includeFile(path, data)` - */ -function includeFileHelper(path, data) { - var templateAndConfig = includeFile(path, this); - return templateAndConfig[0](data, templateAndConfig[1]); -} - -/* END TYPES */ -function handleCache(template, options) { - if (options.cache && options.name && options.templates.get(options.name)) { - return options.templates.get(options.name); - } - var templateFunc = typeof template === 'function' ? template : compile(template, options); - // Note that we don't have to check if it already exists in the cache; - // it would have returned earlier if it had - if (options.cache && options.name) { - options.templates.define(options.name, templateFunc); - } - return templateFunc; -} -/** - * Render a template - * - * If `template` is a string, Eta will compile it to a function and then call it with the provided data. - * If `template` is a template function, Eta will call it with the provided data. - * - * If `config.async` is `false`, Eta will return the rendered template. - * - * If `config.async` is `true` and there's a callback function, Eta will call the callback with `(err, renderedTemplate)`. - * If `config.async` is `true` and there's not a callback function, Eta will return a Promise that resolves to the rendered template. - * - * If `config.cache` is `true` and `config` has a `name` or `filename` property, Eta will cache the template on the first render and use the cached template for all subsequent renders. - * - * @param template Template string or template function - * @param data Data to render the template with - * @param config Optional config options - * @param cb Callback function - */ -function render(template, data, config, cb) { - var options = getConfig(config || {}); - if (options.async) { - if (cb) { - // If user passes callback - try { - // Note: if there is an error while rendering the template, - // It will bubble up and be caught here - var templateFn = handleCache(template, options); - templateFn(data, options, cb); - } - catch (err) { - return cb(err); - } - } - else { - // No callback, try returning a promise - if (typeof promiseImpl === 'function') { - return new promiseImpl(function (resolve, reject) { - try { - resolve(handleCache(template, options)(data, options)); - } - catch (err) { - reject(err); - } - }); - } - else { - throw EtaErr("Please provide a callback function, this env doesn't support Promises"); - } - } - } - else { - return handleCache(template, options)(data, options); - } -} -/** - * Render a template asynchronously - * - * If `template` is a string, Eta will compile it to a function and call it with the provided data. - * If `template` is a function, Eta will call it with the provided data. - * - * If there is a callback function, Eta will call it with `(err, renderedTemplate)`. - * If there is not a callback function, Eta will return a Promise that resolves to the rendered template - * - * @param template Template string or template function - * @param data Data to render the template with - * @param config Optional config options - * @param cb Callback function - */ -function renderAsync(template, data, config, cb) { - // Using Object.assign to lower bundle size, using spread operator makes it larger because of typescript injected polyfills - return render(template, data, Object.assign({}, config, { async: true }), cb); -} - -// @denoify-ignore -config.includeFile = includeFileHelper; -config.filepathCache = {}; - -class InternalModule { - constructor(app, plugin) { - this.app = app; - this.plugin = plugin; - this.static_templates = new Map(); - this.dynamic_templates = new Map(); - } - getName() { - return this.name; - } - init() { - return __awaiter(this, void 0, void 0, function* () { - yield this.createStaticTemplates(); - this.static_context = Object.fromEntries(this.static_templates); - }); - } - generateContext(config) { - return __awaiter(this, void 0, void 0, function* () { - this.config = config; - yield this.updateTemplates(); - return Object.assign(Object.assign({}, this.static_context), Object.fromEntries(this.dynamic_templates)); - }); - } -} - -class InternalModuleDate extends InternalModule { - constructor() { - super(...arguments); - this.name = "date"; - } - createStaticTemplates() { - return __awaiter(this, void 0, void 0, function* () { - this.static_templates.set("now", this.generate_now()); - this.static_templates.set("tomorrow", this.generate_tomorrow()); - this.static_templates.set("weekday", this.generate_weekday()); - this.static_templates.set("yesterday", this.generate_yesterday()); - }); - } - updateTemplates() { - return __awaiter(this, void 0, void 0, function* () { }); - } - generate_now() { - return (format = "YYYY-MM-DD", offset, reference, reference_format) => { - if (reference && !window.moment(reference, reference_format).isValid()) { - throw new TemplaterError("Invalid reference date format, try specifying one with the argument 'reference_format'"); - } - let duration; - if (typeof offset === "string") { - duration = window.moment.duration(offset); - } - else if (typeof offset === "number") { - duration = window.moment.duration(offset, "days"); - } - return window.moment(reference, reference_format).add(duration).format(format); - }; - } - generate_tomorrow() { - return (format = "YYYY-MM-DD") => { - return window.moment().add(1, 'days').format(format); - }; - } - generate_weekday() { - return (format = "YYYY-MM-DD", weekday, reference, reference_format) => { - if (reference && !window.moment(reference, reference_format).isValid()) { - throw new TemplaterError("Invalid reference date format, try specifying one with the argument 'reference_format'"); - } - return window.moment(reference, reference_format).weekday(weekday).format(format); - }; - } - generate_yesterday() { - return (format = "YYYY-MM-DD") => { - return window.moment().add(-1, 'days').format(format); - }; - } -} - -const DEPTH_LIMIT = 10; -class InternalModuleFile extends InternalModule { - constructor() { - super(...arguments); - this.name = "file"; - this.include_depth = 0; - this.create_new_depth = 0; - this.linkpath_regex = new RegExp("^\\[\\[(.*)\\]\\]$"); - } - createStaticTemplates() { - return __awaiter(this, void 0, void 0, function* () { - this.static_templates.set("creation_date", this.generate_creation_date()); - this.static_templates.set("create_new", this.generate_create_new()); - this.static_templates.set("cursor", this.generate_cursor()); - this.static_templates.set("cursor_append", this.generate_cursor_append()); - this.static_templates.set("exists", this.generate_exists()); - this.static_templates.set("find_tfile", this.generate_find_tfile()); - this.static_templates.set("folder", this.generate_folder()); - this.static_templates.set("include", this.generate_include()); - this.static_templates.set("last_modified_date", this.generate_last_modified_date()); - this.static_templates.set("move", this.generate_move()); - this.static_templates.set("path", this.generate_path()); - this.static_templates.set("rename", this.generate_rename()); - this.static_templates.set("selection", this.generate_selection()); - }); - } - updateTemplates() { - return __awaiter(this, void 0, void 0, function* () { - this.dynamic_templates.set("content", yield this.generate_content()); - this.dynamic_templates.set("tags", this.generate_tags()); - this.dynamic_templates.set("title", this.generate_title()); - }); - } - generate_content() { - return __awaiter(this, void 0, void 0, function* () { - return yield this.app.vault.read(this.config.target_file); - }); - } - generate_create_new() { - return (template, filename, open_new = false, folder) => __awaiter(this, void 0, void 0, function* () { - this.create_new_depth += 1; - if (this.create_new_depth > DEPTH_LIMIT) { - this.create_new_depth = 0; - throw new TemplaterError("Reached create_new depth limit (max = 10)"); - } - const new_file = yield this.plugin.templater.create_new_note_from_template(template, folder, filename, open_new); - this.create_new_depth -= 1; - return new_file; - }); - } - generate_creation_date() { - return (format = "YYYY-MM-DD HH:mm") => { - return window.moment(this.config.target_file.stat.ctime).format(format); - }; - } - generate_cursor() { - return (order) => { - // Hack to prevent empty output - return `<% tp.file.cursor(${order !== null && order !== void 0 ? order : ''}) %>`; - }; - } - generate_cursor_append() { - return (content) => { - const active_view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView); - if (active_view === null) { - this.plugin.log_error(new TemplaterError("No active view, can't append to cursor.")); - return; - } - const editor = active_view.editor; - const doc = editor.getDoc(); - doc.replaceSelection(content); - return ""; - }; - } - generate_exists() { - return (filename) => { - // TODO: Remove this, only here to support the old way - let match; - if ((match = this.linkpath_regex.exec(filename)) !== null) { - filename = match[1]; - } - const file = this.app.metadataCache.getFirstLinkpathDest(filename, ""); - return file != null; - }; - } - generate_find_tfile() { - return (filename) => { - const path = obsidian.normalizePath(filename); - return this.app.metadataCache.getFirstLinkpathDest(path, ""); - }; - } - generate_folder() { - return (relative = false) => { - let parent = this.config.target_file.parent; - let folder; - if (relative) { - folder = parent.path; - } - else { - folder = parent.name; - } - return folder; - }; - } - generate_include() { - return (include_link) => __awaiter(this, void 0, void 0, function* () { - var _a; - // TODO: Add mutex for this, this may currently lead to a race condition. - // While not very impactful, that could still be annoying. - this.include_depth += 1; - if (this.include_depth > DEPTH_LIMIT) { - this.include_depth = 0; - throw new TemplaterError("Reached inclusion depth limit (max = 10)"); - } - let inc_file_content; - if (include_link instanceof obsidian.TFile) { - inc_file_content = yield this.app.vault.read(include_link); - } - else { - let match; - if ((match = this.linkpath_regex.exec(include_link)) === null) { - throw new TemplaterError("Invalid file format, provide an obsidian link between quotes."); - } - const { path, subpath } = obsidian.parseLinktext(match[1]); - const inc_file = this.app.metadataCache.getFirstLinkpathDest(path, ""); - if (!inc_file) { - throw new TemplaterError(`File ${include_link} doesn't exist`); - } - inc_file_content = yield this.app.vault.read(inc_file); - if (subpath) { - const cache = this.app.metadataCache.getFileCache(inc_file); - if (cache) { - const result = obsidian.resolveSubpath(cache, subpath); - if (result) { - inc_file_content = inc_file_content.slice(result.start.offset, (_a = result.end) === null || _a === void 0 ? void 0 : _a.offset); - } - } - } - } - const parsed_content = yield this.plugin.templater.parser.parseTemplates(inc_file_content); - this.include_depth -= 1; - return parsed_content; - }); - } - generate_last_modified_date() { - return (format = "YYYY-MM-DD HH:mm") => { - return window.moment(this.config.target_file.stat.mtime).format(format); - }; - } - generate_move() { - return (path) => __awaiter(this, void 0, void 0, function* () { - const new_path = obsidian.normalizePath(`${path}.${this.config.target_file.extension}`); - yield this.app.fileManager.renameFile(this.config.target_file, new_path); - return ""; - }); - } - generate_path() { - return (relative = false) => { - // TODO: Add mobile support - if (obsidian.Platform.isMobileApp) { - return UNSUPPORTED_MOBILE_TEMPLATE; - } - if (!(this.app.vault.adapter instanceof obsidian.FileSystemAdapter)) { - throw new TemplaterError("app.vault is not a FileSystemAdapter instance"); - } - const vault_path = this.app.vault.adapter.getBasePath(); - if (relative) { - return this.config.target_file.path; - } - else { - return `${vault_path}/${this.config.target_file.path}`; - } - }; - } - generate_rename() { - return (new_title) => __awaiter(this, void 0, void 0, function* () { - if (new_title.match(/[\\\/:]+/g)) { - throw new TemplaterError("File name cannot contain any of these characters: \\ / :"); - } - const new_path = obsidian.normalizePath(`${this.config.target_file.parent.path}/${new_title}.${this.config.target_file.extension}`); - yield this.app.fileManager.renameFile(this.config.target_file, new_path); - return ""; - }); - } - generate_selection() { - return () => { - const active_view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView); - if (active_view == null) { - throw new TemplaterError("Active view is null, can't read selection."); - } - const editor = active_view.editor; - return editor.getSelection(); - }; - } - // TODO: Turn this into a function - generate_tags() { - const cache = this.app.metadataCache.getFileCache(this.config.target_file); - return obsidian.getAllTags(cache); - } - // TODO: Turn this into a function - generate_title() { - return this.config.target_file.basename; - } -} - -class InternalModuleWeb extends InternalModule { - constructor() { - super(...arguments); - this.name = "web"; - } - createStaticTemplates() { - return __awaiter(this, void 0, void 0, function* () { - this.static_templates.set("daily_quote", this.generate_daily_quote()); - this.static_templates.set("random_picture", this.generate_random_picture()); - //this.static_templates.set("get_request", this.generate_get_request()); - }); - } - updateTemplates() { - return __awaiter(this, void 0, void 0, function* () { }); - } - getRequest(url) { - return __awaiter(this, void 0, void 0, function* () { - let response = yield fetch(url); - if (!response.ok) { - throw new TemplaterError("Error performing GET request"); - } - return response; - }); - } - generate_daily_quote() { - return () => __awaiter(this, void 0, void 0, function* () { - let response = yield this.getRequest("https://quotes.rest/qod"); - let json = yield response.json(); - let author = json.contents.quotes[0].author; - let quote = json.contents.quotes[0].quote; - let new_content = `> ${quote}\n> — ${author}`; - return new_content; - }); - } - generate_random_picture() { - return (size, query) => __awaiter(this, void 0, void 0, function* () { - let response = yield this.getRequest(`https://source.unsplash.com/random/${size !== null && size !== void 0 ? size : ''}?${query !== null && query !== void 0 ? query : ''}`); - let url = response.url; - return `![tp.web.random_picture](${url})`; - }); - } - generate_get_request() { - return (url) => __awaiter(this, void 0, void 0, function* () { - let response = yield this.getRequest(url); - let json = yield response.json(); - return json; - }); - } -} - -class InternalModuleFrontmatter extends InternalModule { - constructor() { - super(...arguments); - this.name = "frontmatter"; - } - createStaticTemplates() { - return __awaiter(this, void 0, void 0, function* () { }); - } - updateTemplates() { - return __awaiter(this, void 0, void 0, function* () { - const cache = this.app.metadataCache.getFileCache(this.config.target_file); - this.dynamic_templates = new Map(Object.entries((cache === null || cache === void 0 ? void 0 : cache.frontmatter) || {})); - }); - } -} - -class PromptModal extends obsidian.Modal { - constructor(app, prompt_text, default_value) { - super(app); - this.prompt_text = prompt_text; - this.default_value = default_value; - this.submitted = false; - } - onOpen() { - this.titleEl.setText(this.prompt_text); - this.createForm(); - } - onClose() { - this.contentEl.empty(); - if (!this.submitted) { - this.reject(new TemplaterError("Cancelled prompt")); - } - } - createForm() { - var _a; - const div = this.contentEl.createDiv(); - div.addClass("templater-prompt-div"); - const form = div.createEl("form"); - form.addClass("templater-prompt-form"); - form.type = "submit"; - form.onsubmit = (e) => { - this.submitted = true; - e.preventDefault(); - this.resolve(this.promptEl.value); - this.close(); - }; - this.promptEl = form.createEl("input"); - this.promptEl.type = "text"; - this.promptEl.placeholder = "Type text here..."; - this.promptEl.value = (_a = this.default_value) !== null && _a !== void 0 ? _a : ""; - this.promptEl.addClass("templater-prompt-input"); - this.promptEl.select(); - } - openAndGetValue(resolve, reject) { - return __awaiter(this, void 0, void 0, function* () { - this.resolve = resolve; - this.reject = reject; - this.open(); - }); - } -} - -class SuggesterModal extends obsidian.FuzzySuggestModal { - constructor(app, text_items, items, placeholder) { - super(app); - this.text_items = text_items; - this.items = items; - this.submitted = false; - this.setPlaceholder(placeholder); - } - getItems() { - return this.items; - } - onClose() { - if (!this.submitted) { - this.reject(new TemplaterError("Cancelled prompt")); - } - } - selectSuggestion(value, evt) { - this.submitted = true; - this.close(); - this.onChooseSuggestion(value, evt); - } - getItemText(item) { - if (this.text_items instanceof Function) { - return this.text_items(item); - } - return this.text_items[this.items.indexOf(item)] || "Undefined Text Item"; - } - onChooseItem(item, _evt) { - this.resolve(item); - } - openAndGetValue(resolve, reject) { - return __awaiter(this, void 0, void 0, function* () { - this.resolve = resolve; - this.reject = reject; - this.open(); - }); - } -} - -class InternalModuleSystem extends InternalModule { - constructor() { - super(...arguments); - this.name = "system"; - } - createStaticTemplates() { - return __awaiter(this, void 0, void 0, function* () { - this.static_templates.set("clipboard", this.generate_clipboard()); - this.static_templates.set("prompt", this.generate_prompt()); - this.static_templates.set("suggester", this.generate_suggester()); - }); - } - updateTemplates() { - return __awaiter(this, void 0, void 0, function* () { }); - } - generate_clipboard() { - return () => __awaiter(this, void 0, void 0, function* () { - // TODO: Add mobile support - if (obsidian.Platform.isMobileApp) { - return UNSUPPORTED_MOBILE_TEMPLATE; - } - return yield navigator.clipboard.readText(); - }); - } - generate_prompt() { - return (prompt_text, default_value, throw_on_cancel = false) => __awaiter(this, void 0, void 0, function* () { - const prompt = new PromptModal(this.app, prompt_text, default_value); - const promise = new Promise((resolve, reject) => prompt.openAndGetValue(resolve, reject)); - try { - return yield promise; - } - catch (error) { - if (throw_on_cancel) { - throw error; - } - return null; - } - }); - } - generate_suggester() { - return (text_items, items, throw_on_cancel = false, placeholder = "") => __awaiter(this, void 0, void 0, function* () { - const suggester = new SuggesterModal(this.app, text_items, items, placeholder); - const promise = new Promise((resolve, reject) => suggester.openAndGetValue(resolve, reject)); - try { - return yield promise; - } - catch (error) { - if (throw_on_cancel) { - throw error; - } - return null; - } - }); - } -} - -class InternalModuleConfig extends InternalModule { - constructor() { - super(...arguments); - this.name = "config"; - } - createStaticTemplates() { - return __awaiter(this, void 0, void 0, function* () { }); - } - updateTemplates() { - return __awaiter(this, void 0, void 0, function* () { }); - } - generateContext(config) { - return __awaiter(this, void 0, void 0, function* () { - return config; - }); - } -} - -class InternalTemplateParser { - constructor(app, plugin) { - this.app = app; - this.plugin = plugin; - this.modules_array = new Array(); - this.modules_array.push(new InternalModuleDate(this.app, this.plugin)); - this.modules_array.push(new InternalModuleFile(this.app, this.plugin)); - this.modules_array.push(new InternalModuleWeb(this.app, this.plugin)); - this.modules_array.push(new InternalModuleFrontmatter(this.app, this.plugin)); - this.modules_array.push(new InternalModuleSystem(this.app, this.plugin)); - this.modules_array.push(new InternalModuleConfig(this.app, this.plugin)); - } - init() { - return __awaiter(this, void 0, void 0, function* () { - for (const mod of this.modules_array) { - yield mod.init(); - } - }); - } - generateContext(config) { - return __awaiter(this, void 0, void 0, function* () { - const modules_context = {}; - for (const mod of this.modules_array) { - modules_context[mod.getName()] = yield mod.generateContext(config); - } - return modules_context; - }); - } -} - -class UserTemplateParser { - constructor(app, plugin) { - this.app = app; - this.plugin = plugin; - this.user_system_command_functions = new Map(); - this.user_script_functions = new Map(); - this.setup(); - } - setup() { - if (obsidian.Platform.isMobileApp || !(this.app.vault.adapter instanceof obsidian.FileSystemAdapter)) { - this.cwd = ""; - } - else { - this.cwd = this.app.vault.adapter.getBasePath(); - this.exec_promise = util.promisify(child_process.exec); - } - } - init() { - return __awaiter(this, void 0, void 0, function* () { }); - } - generate_user_script_functions(config) { - return __awaiter(this, void 0, void 0, function* () { - let files = getTFilesFromFolder(this.app, this.plugin.settings.script_folder); - for (let file of files) { - if (file.extension.toLowerCase() === "js") { - yield this.load_user_script_function(config, file); - } - } - }); - } - load_user_script_function(config, file) { - return __awaiter(this, void 0, void 0, function* () { - if (!(this.app.vault.adapter instanceof obsidian.FileSystemAdapter)) { - throw new TemplaterError("app.vault is not a FileSystemAdapter instance"); - } - let vault_path = this.app.vault.adapter.getBasePath(); - let file_path = `${vault_path}/${file.path}`; - // https://stackoverflow.com/questions/26633901/reload-module-at-runtime - // https://stackoverflow.com/questions/1972242/how-to-auto-reload-files-in-node-js - if (Object.keys(window.require.cache).contains(file_path)) { - delete window.require.cache[window.require.resolve(file_path)]; - } - const user_function = yield Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require(file_path)); }); - if (!user_function.default) { - throw new TemplaterError(`Failed to load user script ${file_path}. No exports detected.`); - } - if (!(user_function.default instanceof Function)) { - throw new TemplaterError(`Failed to load user script ${file_path}. Default export is not a function.`); - } - this.user_script_functions.set(`${file.basename}`, user_function.default); - }); - } - // TODO: Add mobile support - generate_system_command_user_functions(config) { - return __awaiter(this, void 0, void 0, function* () { - const context = yield this.plugin.templater.parser.generateContext(config, ContextMode.INTERNAL); - for (let [template, cmd] of this.plugin.settings.templates_pairs) { - if (template === "" || cmd === "") { - continue; - } - if (obsidian.Platform.isMobileApp) { - this.user_system_command_functions.set(template, (user_args) => { - return UNSUPPORTED_MOBILE_TEMPLATE; - }); - } - else { - cmd = yield this.plugin.templater.parser.parseTemplates(cmd, context); - this.user_system_command_functions.set(template, (user_args) => __awaiter(this, void 0, void 0, function* () { - const process_env = Object.assign(Object.assign({}, process.env), user_args); - const cmd_options = Object.assign({ timeout: this.plugin.settings.command_timeout * 1000, cwd: this.cwd, env: process_env }, (this.plugin.settings.shell_path !== "" && { shell: this.plugin.settings.shell_path })); - try { - const { stdout } = yield this.exec_promise(cmd, cmd_options); - return stdout.trimRight(); - } - catch (error) { - throw new TemplaterError(`Error with User Template ${template}`, error); - } - })); - } - } - }); - } - generateContext(config) { - return __awaiter(this, void 0, void 0, function* () { - this.user_system_command_functions.clear(); - this.user_script_functions.clear(); - if (this.plugin.settings.enable_system_commands) { - yield this.generate_system_command_user_functions(config); - } - // TODO: Add mobile support - if (obsidian.Platform.isDesktopApp && this.plugin.settings.script_folder) { - yield this.generate_user_script_functions(config); - } - return Object.assign(Object.assign({}, Object.fromEntries(this.user_system_command_functions)), Object.fromEntries(this.user_script_functions)); - }); - } -} - -var ContextMode; -(function (ContextMode) { - ContextMode[ContextMode["INTERNAL"] = 0] = "INTERNAL"; - ContextMode[ContextMode["USER_INTERNAL"] = 1] = "USER_INTERNAL"; -})(ContextMode || (ContextMode = {})); -class TemplateParser { - constructor(app, plugin) { - this.app = app; - this.plugin = plugin; - this.internalTemplateParser = new InternalTemplateParser(this.app, this.plugin); - this.userTemplateParser = new UserTemplateParser(this.app, this.plugin); - } - init() { - return __awaiter(this, void 0, void 0, function* () { - yield this.internalTemplateParser.init(); - yield this.userTemplateParser.init(); - }); - } - setCurrentContext(config, context_mode) { - return __awaiter(this, void 0, void 0, function* () { - this.current_context = yield this.generateContext(config, context_mode); - }); - } - additionalContext() { - return { - obsidian: obsidian_module, - }; - } - generateContext(config, context_mode = ContextMode.USER_INTERNAL) { - return __awaiter(this, void 0, void 0, function* () { - const context = {}; - const additional_context = this.additionalContext(); - const internal_context = yield this.internalTemplateParser.generateContext(config); - let user_context = {}; - if (!this.current_context) { - // If a user system command is using tp.file.include, we need the context to be set. - this.current_context = internal_context; - } - Object.assign(context, additional_context); - switch (context_mode) { - case ContextMode.INTERNAL: - Object.assign(context, internal_context); - break; - case ContextMode.USER_INTERNAL: - user_context = yield this.userTemplateParser.generateContext(config); - Object.assign(context, Object.assign(Object.assign({}, internal_context), { user: user_context })); - break; - } - return context; - }); - } - parseTemplates(content, context) { - return __awaiter(this, void 0, void 0, function* () { - if (!context) { - context = this.current_context; - } - content = (yield renderAsync(content, context, { - varName: "tp", - parse: { - exec: "*", - interpolate: "~", - raw: "", - }, - autoTrim: false, - globalAwait: true, - })); - return content; - }); - } -} - -var RunMode; -(function (RunMode) { - RunMode[RunMode["CreateNewFromTemplate"] = 0] = "CreateNewFromTemplate"; - RunMode[RunMode["AppendActiveFile"] = 1] = "AppendActiveFile"; - RunMode[RunMode["OverwriteFile"] = 2] = "OverwriteFile"; - RunMode[RunMode["OverwriteActiveFile"] = 3] = "OverwriteActiveFile"; - RunMode[RunMode["DynamicProcessor"] = 4] = "DynamicProcessor"; -})(RunMode || (RunMode = {})); -class Templater { - constructor(app, plugin) { - this.app = app; - this.plugin = plugin; - this.cursor_jumper = new CursorJumper(this.app); - this.parser = new TemplateParser(this.app, this.plugin); - } - setup() { - return __awaiter(this, void 0, void 0, function* () { - yield this.parser.init(); - }); - } - create_running_config(template_file, target_file, run_mode) { - return { - template_file: template_file, - target_file: target_file, - run_mode: run_mode, - }; - } - read_and_parse_template(config) { - return __awaiter(this, void 0, void 0, function* () { - const template_content = yield this.app.vault.read(config.template_file); - return this.parse_template(config, template_content); - }); - } - parse_template(config, template_content) { - return __awaiter(this, void 0, void 0, function* () { - yield this.parser.setCurrentContext(config, ContextMode.USER_INTERNAL); - const content = yield this.parser.parseTemplates(template_content); - return content; - }); - } - create_new_note_from_template(template, folder, filename, open_new_note = true) { - return __awaiter(this, void 0, void 0, function* () { - if (!folder) { - folder = this.app.fileManager.getNewFileParent(""); - } - // TODO: Change that, not stable atm - // @ts-ignore - const created_note = yield this.app.fileManager.createNewMarkdownFile(folder, filename !== null && filename !== void 0 ? filename : "Untitled"); - let running_config; - let output_content; - if (template instanceof obsidian.TFile) { - running_config = this.create_running_config(template, created_note, RunMode.CreateNewFromTemplate); - output_content = yield this.plugin.errorWrapper(() => __awaiter(this, void 0, void 0, function* () { return this.read_and_parse_template(running_config); })); - } - else { - running_config = this.create_running_config(undefined, created_note, RunMode.CreateNewFromTemplate); - output_content = yield this.plugin.errorWrapper(() => __awaiter(this, void 0, void 0, function* () { return this.parse_template(running_config, template); })); - } - if (output_content == null) { - yield this.app.vault.delete(created_note); - return; - } - yield this.app.vault.modify(created_note, output_content); - if (open_new_note) { - const active_leaf = this.app.workspace.activeLeaf; - if (!active_leaf) { - this.plugin.log_error(new TemplaterError("No active leaf")); - return; - } - yield active_leaf.openFile(created_note, { state: { mode: 'source' }, eState: { rename: 'all' } }); - yield this.cursor_jumper.jump_to_next_cursor_location(); - } - return created_note; - }); - } - append_template(template_file) { - return __awaiter(this, void 0, void 0, function* () { - const active_view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView); - if (active_view === null) { - this.plugin.log_error(new TemplaterError("No active view, can't append templates.")); - return; - } - const running_config = this.create_running_config(template_file, active_view.file, RunMode.AppendActiveFile); - const output_content = yield this.plugin.errorWrapper(() => __awaiter(this, void 0, void 0, function* () { return this.read_and_parse_template(running_config); })); - if (output_content == null) { - return; - } - const editor = active_view.editor; - const doc = editor.getDoc(); - doc.replaceSelection(output_content); - yield this.cursor_jumper.jump_to_next_cursor_location(); - }); - } - overwrite_active_file_templates() { - const active_view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView); - if (active_view === null) { - this.plugin.log_error(new TemplaterError("Active view is null, can't overwrite content")); - return; - } - this.overwrite_file_templates(active_view.file, true); - } - overwrite_file_templates(file, active_file = false) { - return __awaiter(this, void 0, void 0, function* () { - const running_config = this.create_running_config(file, file, active_file ? RunMode.OverwriteActiveFile : RunMode.OverwriteFile); - const output_content = yield this.plugin.errorWrapper(() => __awaiter(this, void 0, void 0, function* () { return this.read_and_parse_template(running_config); })); - if (output_content == null) { - return; - } - yield this.app.vault.modify(file, output_content); - if (this.app.workspace.getActiveFile() === file) { - yield this.cursor_jumper.jump_to_next_cursor_location(); - } - }); - } - process_dynamic_templates(el, ctx) { - return __awaiter(this, void 0, void 0, function* () { - const dynamic_command_regex = /(<%(?:-|_)?\s*[*~]{0,1})\+((?:.|\s)*?%>)/g; - const walker = document.createNodeIterator(el, NodeFilter.SHOW_TEXT); - let node; - let pass = false; - while ((node = walker.nextNode())) { - let content = node.nodeValue; - let match; - if ((match = dynamic_command_regex.exec(content)) != null) { - const file = this.app.metadataCache.getFirstLinkpathDest("", ctx.sourcePath); - if (!file || !(file instanceof obsidian.TFile)) { - return; - } - if (!pass) { - pass = true; - const running_config = this.create_running_config(file, file, RunMode.DynamicProcessor); - yield this.parser.setCurrentContext(running_config, ContextMode.USER_INTERNAL); - } - while (match != null) { - // Not the most efficient way to exclude the '+' from the command but I couldn't find something better - const complete_command = match[1] + match[2]; - const command_output = yield this.plugin.errorWrapper(() => __awaiter(this, void 0, void 0, function* () { - return yield this.parser.parseTemplates(complete_command); - })); - if (command_output == null) { - return; - } - let start = dynamic_command_regex.lastIndex - match[0].length; - let end = dynamic_command_regex.lastIndex; - content = content.substring(0, start) + command_output + content.substring(end); - dynamic_command_regex.lastIndex += (command_output.length - match[0].length); - match = dynamic_command_regex.exec(content); - } - node.nodeValue = content; - } - } - }); - } -} - -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: https://codemirror.net/LICENSE - -(function(mod) { - mod(window.CodeMirror); -})(function(CodeMirror) { - -CodeMirror.defineMode("javascript", function(config, parserConfig) { - var indentUnit = config.indentUnit; - var statementIndent = parserConfig.statementIndent; - var jsonldMode = parserConfig.jsonld; - var jsonMode = parserConfig.json || jsonldMode; - var trackScope = parserConfig.trackScope !== false; - var isTS = parserConfig.typescript; - var wordRE = parserConfig.wordCharacters || /[\w$\xa1-\uffff]/; - - // Tokenizer - - var keywords = function(){ - function kw(type) {return {type: type, style: "keyword"};} - var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c"), D = kw("keyword d"); - var operator = kw("operator"), atom = {type: "atom", style: "atom"}; - - return { - "if": kw("if"), "while": A, "with": A, "else": B, "do": B, "try": B, "finally": B, - "return": D, "break": D, "continue": D, "new": kw("new"), "delete": C, "void": C, "throw": C, - "debugger": kw("debugger"), "var": kw("var"), "const": kw("var"), "let": kw("var"), - "function": kw("function"), "catch": kw("catch"), - "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"), - "in": operator, "typeof": operator, "instanceof": operator, - "true": atom, "false": atom, "null": atom, "undefined": atom, "NaN": atom, "Infinity": atom, - "this": kw("this"), "class": kw("class"), "super": kw("atom"), - "yield": C, "export": kw("export"), "import": kw("import"), "extends": C, - "await": C - }; - }(); - - var isOperatorChar = /[+\-*&%=<>!?|~^@]/; - var isJsonldKeyword = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/; - - function readRegexp(stream) { - var escaped = false, next, inSet = false; - while ((next = stream.next()) != null) { - if (!escaped) { - if (next == "/" && !inSet) return; - if (next == "[") inSet = true; - else if (inSet && next == "]") inSet = false; - } - escaped = !escaped && next == "\\"; - } - } - - // Used as scratch variables to communicate multiple values without - // consing up tons of objects. - var type, content; - function ret(tp, style, cont) { - type = tp; content = cont; - return style; - } - function tokenBase(stream, state) { - var ch = stream.next(); - if (ch == '"' || ch == "'") { - state.tokenize = tokenString(ch); - return state.tokenize(stream, state); - } else if (ch == "." && stream.match(/^\d[\d_]*(?:[eE][+\-]?[\d_]+)?/)) { - return ret("number", "number"); - } else if (ch == "." && stream.match("..")) { - return ret("spread", "meta"); - } else if (/[\[\]{}\(\),;\:\.]/.test(ch)) { - return ret(ch); - } else if (ch == "=" && stream.eat(">")) { - return ret("=>", "operator"); - } else if (ch == "0" && stream.match(/^(?:x[\dA-Fa-f_]+|o[0-7_]+|b[01_]+)n?/)) { - return ret("number", "number"); - } else if (/\d/.test(ch)) { - stream.match(/^[\d_]*(?:n|(?:\.[\d_]*)?(?:[eE][+\-]?[\d_]+)?)?/); - return ret("number", "number"); - } else if (ch == "/") { - if (stream.eat("*")) { - state.tokenize = tokenComment; - return tokenComment(stream, state); - } else if (stream.eat("/")) { - stream.skipToEnd(); - return ret("comment", "comment"); - } else if (expressionAllowed(stream, state, 1)) { - readRegexp(stream); - stream.match(/^\b(([gimyus])(?![gimyus]*\2))+\b/); - return ret("regexp", "string-2"); - } else { - stream.eat("="); - return ret("operator", "operator", stream.current()); - } - } else if (ch == "`") { - state.tokenize = tokenQuasi; - return tokenQuasi(stream, state); - } else if (ch == "#" && stream.peek() == "!") { - stream.skipToEnd(); - return ret("meta", "meta"); - } else if (ch == "#" && stream.eatWhile(wordRE)) { - return ret("variable", "property") - } else if (ch == "<" && stream.match("!--") || - (ch == "-" && stream.match("->") && !/\S/.test(stream.string.slice(0, stream.start)))) { - stream.skipToEnd(); - return ret("comment", "comment") - } else if (isOperatorChar.test(ch)) { - if (ch != ">" || !state.lexical || state.lexical.type != ">") { - if (stream.eat("=")) { - if (ch == "!" || ch == "=") stream.eat("="); - } else if (/[<>*+\-|&?]/.test(ch)) { - stream.eat(ch); - if (ch == ">") stream.eat(ch); - } - } - if (ch == "?" && stream.eat(".")) return ret(".") - return ret("operator", "operator", stream.current()); - } else if (wordRE.test(ch)) { - stream.eatWhile(wordRE); - var word = stream.current(); - if (state.lastType != ".") { - if (keywords.propertyIsEnumerable(word)) { - var kw = keywords[word]; - return ret(kw.type, kw.style, word) - } - if (word == "async" && stream.match(/^(\s|\/\*([^*]|\*(?!\/))*?\*\/)*[\[\(\w]/, false)) - return ret("async", "keyword", word) - } - return ret("variable", "variable", word) - } - } - - function tokenString(quote) { - return function(stream, state) { - var escaped = false, next; - if (jsonldMode && stream.peek() == "@" && stream.match(isJsonldKeyword)){ - state.tokenize = tokenBase; - return ret("jsonld-keyword", "meta"); - } - while ((next = stream.next()) != null) { - if (next == quote && !escaped) break; - escaped = !escaped && next == "\\"; - } - if (!escaped) state.tokenize = tokenBase; - return ret("string", "string"); - }; - } - - function tokenComment(stream, state) { - var maybeEnd = false, ch; - while (ch = stream.next()) { - if (ch == "/" && maybeEnd) { - state.tokenize = tokenBase; - break; - } - maybeEnd = (ch == "*"); - } - return ret("comment", "comment"); - } - - function tokenQuasi(stream, state) { - var escaped = false, next; - while ((next = stream.next()) != null) { - if (!escaped && (next == "`" || next == "$" && stream.eat("{"))) { - state.tokenize = tokenBase; - break; - } - escaped = !escaped && next == "\\"; - } - return ret("quasi", "string-2", stream.current()); - } - - var brackets = "([{}])"; - // This is a crude lookahead trick to try and notice that we're - // parsing the argument patterns for a fat-arrow function before we - // actually hit the arrow token. It only works if the arrow is on - // the same line as the arguments and there's no strange noise - // (comments) in between. Fallback is to only notice when we hit the - // arrow, and not declare the arguments as locals for the arrow - // body. - function findFatArrow(stream, state) { - if (state.fatArrowAt) state.fatArrowAt = null; - var arrow = stream.string.indexOf("=>", stream.start); - if (arrow < 0) return; - - if (isTS) { // Try to skip TypeScript return type declarations after the arguments - var m = /:\s*(?:\w+(?:<[^>]*>|\[\])?|\{[^}]*\})\s*$/.exec(stream.string.slice(stream.start, arrow)); - if (m) arrow = m.index; - } - - var depth = 0, sawSomething = false; - for (var pos = arrow - 1; pos >= 0; --pos) { - var ch = stream.string.charAt(pos); - var bracket = brackets.indexOf(ch); - if (bracket >= 0 && bracket < 3) { - if (!depth) { ++pos; break; } - if (--depth == 0) { if (ch == "(") sawSomething = true; break; } - } else if (bracket >= 3 && bracket < 6) { - ++depth; - } else if (wordRE.test(ch)) { - sawSomething = true; - } else if (/["'\/`]/.test(ch)) { - for (;; --pos) { - if (pos == 0) return - var next = stream.string.charAt(pos - 1); - if (next == ch && stream.string.charAt(pos - 2) != "\\") { pos--; break } - } - } else if (sawSomething && !depth) { - ++pos; - break; - } - } - if (sawSomething && !depth) state.fatArrowAt = pos; - } - - // Parser - - var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, - "regexp": true, "this": true, "import": true, "jsonld-keyword": true}; - - function JSLexical(indented, column, type, align, prev, info) { - this.indented = indented; - this.column = column; - this.type = type; - this.prev = prev; - this.info = info; - if (align != null) this.align = align; - } - - function inScope(state, varname) { - if (!trackScope) return false - for (var v = state.localVars; v; v = v.next) - if (v.name == varname) return true; - for (var cx = state.context; cx; cx = cx.prev) { - for (var v = cx.vars; v; v = v.next) - if (v.name == varname) return true; - } - } - - function parseJS(state, style, type, content, stream) { - var cc = state.cc; - // Communicate our context to the combinators. - // (Less wasteful than consing up a hundred closures on every call.) - cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc; cx.style = style; - - if (!state.lexical.hasOwnProperty("align")) - state.lexical.align = true; - - while(true) { - var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement; - if (combinator(type, content)) { - while(cc.length && cc[cc.length - 1].lex) - cc.pop()(); - if (cx.marked) return cx.marked; - if (type == "variable" && inScope(state, content)) return "variable-2"; - return style; - } - } - } - - // Combinator utils - - var cx = {state: null, column: null, marked: null, cc: null}; - function pass() { - for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]); - } - function cont() { - pass.apply(null, arguments); - return true; - } - function inList(name, list) { - for (var v = list; v; v = v.next) if (v.name == name) return true - return false; - } - function register(varname) { - var state = cx.state; - cx.marked = "def"; - if (!trackScope) return - if (state.context) { - if (state.lexical.info == "var" && state.context && state.context.block) { - // FIXME function decls are also not block scoped - var newContext = registerVarScoped(varname, state.context); - if (newContext != null) { - state.context = newContext; - return - } - } else if (!inList(varname, state.localVars)) { - state.localVars = new Var(varname, state.localVars); - return - } - } - // Fall through means this is global - if (parserConfig.globalVars && !inList(varname, state.globalVars)) - state.globalVars = new Var(varname, state.globalVars); - } - function registerVarScoped(varname, context) { - if (!context) { - return null - } else if (context.block) { - var inner = registerVarScoped(varname, context.prev); - if (!inner) return null - if (inner == context.prev) return context - return new Context(inner, context.vars, true) - } else if (inList(varname, context.vars)) { - return context - } else { - return new Context(context.prev, new Var(varname, context.vars), false) - } - } - - function isModifier(name) { - return name == "public" || name == "private" || name == "protected" || name == "abstract" || name == "readonly" - } - - // Combinators - - function Context(prev, vars, block) { this.prev = prev; this.vars = vars; this.block = block; } - function Var(name, next) { this.name = name; this.next = next; } - - var defaultVars = new Var("this", new Var("arguments", null)); - function pushcontext() { - cx.state.context = new Context(cx.state.context, cx.state.localVars, false); - cx.state.localVars = defaultVars; - } - function pushblockcontext() { - cx.state.context = new Context(cx.state.context, cx.state.localVars, true); - cx.state.localVars = null; - } - function popcontext() { - cx.state.localVars = cx.state.context.vars; - cx.state.context = cx.state.context.prev; - } - popcontext.lex = true; - function pushlex(type, info) { - var result = function() { - var state = cx.state, indent = state.indented; - if (state.lexical.type == "stat") indent = state.lexical.indented; - else for (var outer = state.lexical; outer && outer.type == ")" && outer.align; outer = outer.prev) - indent = outer.indented; - state.lexical = new JSLexical(indent, cx.stream.column(), type, null, state.lexical, info); - }; - result.lex = true; - return result; - } - function poplex() { - var state = cx.state; - if (state.lexical.prev) { - if (state.lexical.type == ")") - state.indented = state.lexical.indented; - state.lexical = state.lexical.prev; - } - } - poplex.lex = true; - - function expect(wanted) { - function exp(type) { - if (type == wanted) return cont(); - else if (wanted == ";" || type == "}" || type == ")" || type == "]") return pass(); - else return cont(exp); - } return exp; - } - - function statement(type, value) { - if (type == "var") return cont(pushlex("vardef", value), vardef, expect(";"), poplex); - if (type == "keyword a") return cont(pushlex("form"), parenExpr, statement, poplex); - if (type == "keyword b") return cont(pushlex("form"), statement, poplex); - if (type == "keyword d") return cx.stream.match(/^\s*$/, false) ? cont() : cont(pushlex("stat"), maybeexpression, expect(";"), poplex); - if (type == "debugger") return cont(expect(";")); - if (type == "{") return cont(pushlex("}"), pushblockcontext, block, poplex, popcontext); - if (type == ";") return cont(); - if (type == "if") { - if (cx.state.lexical.info == "else" && cx.state.cc[cx.state.cc.length - 1] == poplex) - cx.state.cc.pop()(); - return cont(pushlex("form"), parenExpr, statement, poplex, maybeelse); - } - if (type == "function") return cont(functiondef); - if (type == "for") return cont(pushlex("form"), pushblockcontext, forspec, statement, popcontext, poplex); - if (type == "class" || (isTS && value == "interface")) { - cx.marked = "keyword"; - return cont(pushlex("form", type == "class" ? type : value), className, poplex) - } - if (type == "variable") { - if (isTS && value == "declare") { - cx.marked = "keyword"; - return cont(statement) - } else if (isTS && (value == "module" || value == "enum" || value == "type") && cx.stream.match(/^\s*\w/, false)) { - cx.marked = "keyword"; - if (value == "enum") return cont(enumdef); - else if (value == "type") return cont(typename, expect("operator"), typeexpr, expect(";")); - else return cont(pushlex("form"), pattern, expect("{"), pushlex("}"), block, poplex, poplex) - } else if (isTS && value == "namespace") { - cx.marked = "keyword"; - return cont(pushlex("form"), expression, statement, poplex) - } else if (isTS && value == "abstract") { - cx.marked = "keyword"; - return cont(statement) - } else { - return cont(pushlex("stat"), maybelabel); - } - } - if (type == "switch") return cont(pushlex("form"), parenExpr, expect("{"), pushlex("}", "switch"), pushblockcontext, - block, poplex, poplex, popcontext); - if (type == "case") return cont(expression, expect(":")); - if (type == "default") return cont(expect(":")); - if (type == "catch") return cont(pushlex("form"), pushcontext, maybeCatchBinding, statement, poplex, popcontext); - if (type == "export") return cont(pushlex("stat"), afterExport, poplex); - if (type == "import") return cont(pushlex("stat"), afterImport, poplex); - if (type == "async") return cont(statement) - if (value == "@") return cont(expression, statement) - return pass(pushlex("stat"), expression, expect(";"), poplex); - } - function maybeCatchBinding(type) { - if (type == "(") return cont(funarg, expect(")")) - } - function expression(type, value) { - return expressionInner(type, value, false); - } - function expressionNoComma(type, value) { - return expressionInner(type, value, true); - } - function parenExpr(type) { - if (type != "(") return pass() - return cont(pushlex(")"), maybeexpression, expect(")"), poplex) - } - function expressionInner(type, value, noComma) { - if (cx.state.fatArrowAt == cx.stream.start) { - var body = noComma ? arrowBodyNoComma : arrowBody; - if (type == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, expect("=>"), body, popcontext); - else if (type == "variable") return pass(pushcontext, pattern, expect("=>"), body, popcontext); - } - - var maybeop = noComma ? maybeoperatorNoComma : maybeoperatorComma; - if (atomicTypes.hasOwnProperty(type)) return cont(maybeop); - if (type == "function") return cont(functiondef, maybeop); - if (type == "class" || (isTS && value == "interface")) { cx.marked = "keyword"; return cont(pushlex("form"), classExpression, poplex); } - if (type == "keyword c" || type == "async") return cont(noComma ? expressionNoComma : expression); - if (type == "(") return cont(pushlex(")"), maybeexpression, expect(")"), poplex, maybeop); - if (type == "operator" || type == "spread") return cont(noComma ? expressionNoComma : expression); - if (type == "[") return cont(pushlex("]"), arrayLiteral, poplex, maybeop); - if (type == "{") return contCommasep(objprop, "}", null, maybeop); - if (type == "quasi") return pass(quasi, maybeop); - if (type == "new") return cont(maybeTarget(noComma)); - return cont(); - } - function maybeexpression(type) { - if (type.match(/[;\}\)\],]/)) return pass(); - return pass(expression); - } - - function maybeoperatorComma(type, value) { - if (type == ",") return cont(maybeexpression); - return maybeoperatorNoComma(type, value, false); - } - function maybeoperatorNoComma(type, value, noComma) { - var me = noComma == false ? maybeoperatorComma : maybeoperatorNoComma; - var expr = noComma == false ? expression : expressionNoComma; - if (type == "=>") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext); - if (type == "operator") { - if (/\+\+|--/.test(value) || isTS && value == "!") return cont(me); - if (isTS && value == "<" && cx.stream.match(/^([^<>]|<[^<>]*>)*>\s*\(/, false)) - return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, me); - if (value == "?") return cont(expression, expect(":"), expr); - return cont(expr); - } - if (type == "quasi") { return pass(quasi, me); } - if (type == ";") return; - if (type == "(") return contCommasep(expressionNoComma, ")", "call", me); - if (type == ".") return cont(property, me); - if (type == "[") return cont(pushlex("]"), maybeexpression, expect("]"), poplex, me); - if (isTS && value == "as") { cx.marked = "keyword"; return cont(typeexpr, me) } - if (type == "regexp") { - cx.state.lastType = cx.marked = "operator"; - cx.stream.backUp(cx.stream.pos - cx.stream.start - 1); - return cont(expr) - } - } - function quasi(type, value) { - if (type != "quasi") return pass(); - if (value.slice(value.length - 2) != "${") return cont(quasi); - return cont(maybeexpression, continueQuasi); - } - function continueQuasi(type) { - if (type == "}") { - cx.marked = "string-2"; - cx.state.tokenize = tokenQuasi; - return cont(quasi); - } - } - function arrowBody(type) { - findFatArrow(cx.stream, cx.state); - return pass(type == "{" ? statement : expression); - } - function arrowBodyNoComma(type) { - findFatArrow(cx.stream, cx.state); - return pass(type == "{" ? statement : expressionNoComma); - } - function maybeTarget(noComma) { - return function(type) { - if (type == ".") return cont(noComma ? targetNoComma : target); - else if (type == "variable" && isTS) return cont(maybeTypeArgs, noComma ? maybeoperatorNoComma : maybeoperatorComma) - else return pass(noComma ? expressionNoComma : expression); - }; - } - function target(_, value) { - if (value == "target") { cx.marked = "keyword"; return cont(maybeoperatorComma); } - } - function targetNoComma(_, value) { - if (value == "target") { cx.marked = "keyword"; return cont(maybeoperatorNoComma); } - } - function maybelabel(type) { - if (type == ":") return cont(poplex, statement); - return pass(maybeoperatorComma, expect(";"), poplex); - } - function property(type) { - if (type == "variable") {cx.marked = "property"; return cont();} - } - function objprop(type, value) { - if (type == "async") { - cx.marked = "property"; - return cont(objprop); - } else if (type == "variable" || cx.style == "keyword") { - cx.marked = "property"; - if (value == "get" || value == "set") return cont(getterSetter); - var m; // Work around fat-arrow-detection complication for detecting typescript typed arrow params - if (isTS && cx.state.fatArrowAt == cx.stream.start && (m = cx.stream.match(/^\s*:\s*/, false))) - cx.state.fatArrowAt = cx.stream.pos + m[0].length; - return cont(afterprop); - } else if (type == "number" || type == "string") { - cx.marked = jsonldMode ? "property" : (cx.style + " property"); - return cont(afterprop); - } else if (type == "jsonld-keyword") { - return cont(afterprop); - } else if (isTS && isModifier(value)) { - cx.marked = "keyword"; - return cont(objprop) - } else if (type == "[") { - return cont(expression, maybetype, expect("]"), afterprop); - } else if (type == "spread") { - return cont(expressionNoComma, afterprop); - } else if (value == "*") { - cx.marked = "keyword"; - return cont(objprop); - } else if (type == ":") { - return pass(afterprop) - } - } - function getterSetter(type) { - if (type != "variable") return pass(afterprop); - cx.marked = "property"; - return cont(functiondef); - } - function afterprop(type) { - if (type == ":") return cont(expressionNoComma); - if (type == "(") return pass(functiondef); - } - function commasep(what, end, sep) { - function proceed(type, value) { - if (sep ? sep.indexOf(type) > -1 : type == ",") { - var lex = cx.state.lexical; - if (lex.info == "call") lex.pos = (lex.pos || 0) + 1; - return cont(function(type, value) { - if (type == end || value == end) return pass() - return pass(what) - }, proceed); - } - if (type == end || value == end) return cont(); - if (sep && sep.indexOf(";") > -1) return pass(what) - return cont(expect(end)); - } - return function(type, value) { - if (type == end || value == end) return cont(); - return pass(what, proceed); - }; - } - function contCommasep(what, end, info) { - for (var i = 3; i < arguments.length; i++) - cx.cc.push(arguments[i]); - return cont(pushlex(end, info), commasep(what, end), poplex); - } - function block(type) { - if (type == "}") return cont(); - return pass(statement, block); - } - function maybetype(type, value) { - if (isTS) { - if (type == ":") return cont(typeexpr); - if (value == "?") return cont(maybetype); - } - } - function maybetypeOrIn(type, value) { - if (isTS && (type == ":" || value == "in")) return cont(typeexpr) - } - function mayberettype(type) { - if (isTS && type == ":") { - if (cx.stream.match(/^\s*\w+\s+is\b/, false)) return cont(expression, isKW, typeexpr) - else return cont(typeexpr) - } - } - function isKW(_, value) { - if (value == "is") { - cx.marked = "keyword"; - return cont() - } - } - function typeexpr(type, value) { - if (value == "keyof" || value == "typeof" || value == "infer" || value == "readonly") { - cx.marked = "keyword"; - return cont(value == "typeof" ? expressionNoComma : typeexpr) - } - if (type == "variable" || value == "void") { - cx.marked = "type"; - return cont(afterType) - } - if (value == "|" || value == "&") return cont(typeexpr) - if (type == "string" || type == "number" || type == "atom") return cont(afterType); - if (type == "[") return cont(pushlex("]"), commasep(typeexpr, "]", ","), poplex, afterType) - if (type == "{") return cont(pushlex("}"), typeprops, poplex, afterType) - if (type == "(") return cont(commasep(typearg, ")"), maybeReturnType, afterType) - if (type == "<") return cont(commasep(typeexpr, ">"), typeexpr) - if (type == "quasi") { return pass(quasiType, afterType); } - } - function maybeReturnType(type) { - if (type == "=>") return cont(typeexpr) - } - function typeprops(type) { - if (type.match(/[\}\)\]]/)) return cont() - if (type == "," || type == ";") return cont(typeprops) - return pass(typeprop, typeprops) - } - function typeprop(type, value) { - if (type == "variable" || cx.style == "keyword") { - cx.marked = "property"; - return cont(typeprop) - } else if (value == "?" || type == "number" || type == "string") { - return cont(typeprop) - } else if (type == ":") { - return cont(typeexpr) - } else if (type == "[") { - return cont(expect("variable"), maybetypeOrIn, expect("]"), typeprop) - } else if (type == "(") { - return pass(functiondecl, typeprop) - } else if (!type.match(/[;\}\)\],]/)) { - return cont() - } - } - function quasiType(type, value) { - if (type != "quasi") return pass(); - if (value.slice(value.length - 2) != "${") return cont(quasiType); - return cont(typeexpr, continueQuasiType); - } - function continueQuasiType(type) { - if (type == "}") { - cx.marked = "string-2"; - cx.state.tokenize = tokenQuasi; - return cont(quasiType); - } - } - function typearg(type, value) { - if (type == "variable" && cx.stream.match(/^\s*[?:]/, false) || value == "?") return cont(typearg) - if (type == ":") return cont(typeexpr) - if (type == "spread") return cont(typearg) - return pass(typeexpr) - } - function afterType(type, value) { - if (value == "<") return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, afterType) - if (value == "|" || type == "." || value == "&") return cont(typeexpr) - if (type == "[") return cont(typeexpr, expect("]"), afterType) - if (value == "extends" || value == "implements") { cx.marked = "keyword"; return cont(typeexpr) } - if (value == "?") return cont(typeexpr, expect(":"), typeexpr) - } - function maybeTypeArgs(_, value) { - if (value == "<") return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, afterType) - } - function typeparam() { - return pass(typeexpr, maybeTypeDefault) - } - function maybeTypeDefault(_, value) { - if (value == "=") return cont(typeexpr) - } - function vardef(_, value) { - if (value == "enum") {cx.marked = "keyword"; return cont(enumdef)} - return pass(pattern, maybetype, maybeAssign, vardefCont); - } - function pattern(type, value) { - if (isTS && isModifier(value)) { cx.marked = "keyword"; return cont(pattern) } - if (type == "variable") { register(value); return cont(); } - if (type == "spread") return cont(pattern); - if (type == "[") return contCommasep(eltpattern, "]"); - if (type == "{") return contCommasep(proppattern, "}"); - } - function proppattern(type, value) { - if (type == "variable" && !cx.stream.match(/^\s*:/, false)) { - register(value); - return cont(maybeAssign); - } - if (type == "variable") cx.marked = "property"; - if (type == "spread") return cont(pattern); - if (type == "}") return pass(); - if (type == "[") return cont(expression, expect(']'), expect(':'), proppattern); - return cont(expect(":"), pattern, maybeAssign); - } - function eltpattern() { - return pass(pattern, maybeAssign) - } - function maybeAssign(_type, value) { - if (value == "=") return cont(expressionNoComma); - } - function vardefCont(type) { - if (type == ",") return cont(vardef); - } - function maybeelse(type, value) { - if (type == "keyword b" && value == "else") return cont(pushlex("form", "else"), statement, poplex); - } - function forspec(type, value) { - if (value == "await") return cont(forspec); - if (type == "(") return cont(pushlex(")"), forspec1, poplex); - } - function forspec1(type) { - if (type == "var") return cont(vardef, forspec2); - if (type == "variable") return cont(forspec2); - return pass(forspec2) - } - function forspec2(type, value) { - if (type == ")") return cont() - if (type == ";") return cont(forspec2) - if (value == "in" || value == "of") { cx.marked = "keyword"; return cont(expression, forspec2) } - return pass(expression, forspec2) - } - function functiondef(type, value) { - if (value == "*") {cx.marked = "keyword"; return cont(functiondef);} - if (type == "variable") {register(value); return cont(functiondef);} - if (type == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, mayberettype, statement, popcontext); - if (isTS && value == "<") return cont(pushlex(">"), commasep(typeparam, ">"), poplex, functiondef) - } - function functiondecl(type, value) { - if (value == "*") {cx.marked = "keyword"; return cont(functiondecl);} - if (type == "variable") {register(value); return cont(functiondecl);} - if (type == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, mayberettype, popcontext); - if (isTS && value == "<") return cont(pushlex(">"), commasep(typeparam, ">"), poplex, functiondecl) - } - function typename(type, value) { - if (type == "keyword" || type == "variable") { - cx.marked = "type"; - return cont(typename) - } else if (value == "<") { - return cont(pushlex(">"), commasep(typeparam, ">"), poplex) - } - } - function funarg(type, value) { - if (value == "@") cont(expression, funarg); - if (type == "spread") return cont(funarg); - if (isTS && isModifier(value)) { cx.marked = "keyword"; return cont(funarg); } - if (isTS && type == "this") return cont(maybetype, maybeAssign) - return pass(pattern, maybetype, maybeAssign); - } - function classExpression(type, value) { - // Class expressions may have an optional name. - if (type == "variable") return className(type, value); - return classNameAfter(type, value); - } - function className(type, value) { - if (type == "variable") {register(value); return cont(classNameAfter);} - } - function classNameAfter(type, value) { - if (value == "<") return cont(pushlex(">"), commasep(typeparam, ">"), poplex, classNameAfter) - if (value == "extends" || value == "implements" || (isTS && type == ",")) { - if (value == "implements") cx.marked = "keyword"; - return cont(isTS ? typeexpr : expression, classNameAfter); - } - if (type == "{") return cont(pushlex("}"), classBody, poplex); - } - function classBody(type, value) { - if (type == "async" || - (type == "variable" && - (value == "static" || value == "get" || value == "set" || (isTS && isModifier(value))) && - cx.stream.match(/^\s+[\w$\xa1-\uffff]/, false))) { - cx.marked = "keyword"; - return cont(classBody); - } - if (type == "variable" || cx.style == "keyword") { - cx.marked = "property"; - return cont(classfield, classBody); - } - if (type == "number" || type == "string") return cont(classfield, classBody); - if (type == "[") - return cont(expression, maybetype, expect("]"), classfield, classBody) - if (value == "*") { - cx.marked = "keyword"; - return cont(classBody); - } - if (isTS && type == "(") return pass(functiondecl, classBody) - if (type == ";" || type == ",") return cont(classBody); - if (type == "}") return cont(); - if (value == "@") return cont(expression, classBody) - } - function classfield(type, value) { - if (value == "!") return cont(classfield) - if (value == "?") return cont(classfield) - if (type == ":") return cont(typeexpr, maybeAssign) - if (value == "=") return cont(expressionNoComma) - var context = cx.state.lexical.prev, isInterface = context && context.info == "interface"; - return pass(isInterface ? functiondecl : functiondef) - } - function afterExport(type, value) { - if (value == "*") { cx.marked = "keyword"; return cont(maybeFrom, expect(";")); } - if (value == "default") { cx.marked = "keyword"; return cont(expression, expect(";")); } - if (type == "{") return cont(commasep(exportField, "}"), maybeFrom, expect(";")); - return pass(statement); - } - function exportField(type, value) { - if (value == "as") { cx.marked = "keyword"; return cont(expect("variable")); } - if (type == "variable") return pass(expressionNoComma, exportField); - } - function afterImport(type) { - if (type == "string") return cont(); - if (type == "(") return pass(expression); - if (type == ".") return pass(maybeoperatorComma); - return pass(importSpec, maybeMoreImports, maybeFrom); - } - function importSpec(type, value) { - if (type == "{") return contCommasep(importSpec, "}"); - if (type == "variable") register(value); - if (value == "*") cx.marked = "keyword"; - return cont(maybeAs); - } - function maybeMoreImports(type) { - if (type == ",") return cont(importSpec, maybeMoreImports) - } - function maybeAs(_type, value) { - if (value == "as") { cx.marked = "keyword"; return cont(importSpec); } - } - function maybeFrom(_type, value) { - if (value == "from") { cx.marked = "keyword"; return cont(expression); } - } - function arrayLiteral(type) { - if (type == "]") return cont(); - return pass(commasep(expressionNoComma, "]")); - } - function enumdef() { - return pass(pushlex("form"), pattern, expect("{"), pushlex("}"), commasep(enummember, "}"), poplex, poplex) - } - function enummember() { - return pass(pattern, maybeAssign); - } - - function isContinuedStatement(state, textAfter) { - return state.lastType == "operator" || state.lastType == "," || - isOperatorChar.test(textAfter.charAt(0)) || - /[,.]/.test(textAfter.charAt(0)); - } - - function expressionAllowed(stream, state, backUp) { - return state.tokenize == tokenBase && - /^(?:operator|sof|keyword [bcd]|case|new|export|default|spread|[\[{}\(,;:]|=>)$/.test(state.lastType) || - (state.lastType == "quasi" && /\{\s*$/.test(stream.string.slice(0, stream.pos - (backUp || 0)))) - } - - // Interface - - return { - startState: function(basecolumn) { - var state = { - tokenize: tokenBase, - lastType: "sof", - cc: [], - lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false), - localVars: parserConfig.localVars, - context: parserConfig.localVars && new Context(null, null, false), - indented: basecolumn || 0 - }; - if (parserConfig.globalVars && typeof parserConfig.globalVars == "object") - state.globalVars = parserConfig.globalVars; - return state; - }, - - token: function(stream, state) { - if (stream.sol()) { - if (!state.lexical.hasOwnProperty("align")) - state.lexical.align = false; - state.indented = stream.indentation(); - findFatArrow(stream, state); - } - if (state.tokenize != tokenComment && stream.eatSpace()) return null; - var style = state.tokenize(stream, state); - if (type == "comment") return style; - state.lastType = type == "operator" && (content == "++" || content == "--") ? "incdec" : type; - return parseJS(state, style, type, content, stream); - }, - - indent: function(state, textAfter) { - if (state.tokenize == tokenComment || state.tokenize == tokenQuasi) return CodeMirror.Pass; - if (state.tokenize != tokenBase) return 0; - var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical, top; - // Kludge to prevent 'maybelse' from blocking lexical scope pops - if (!/^\s*else\b/.test(textAfter)) for (var i = state.cc.length - 1; i >= 0; --i) { - var c = state.cc[i]; - if (c == poplex) lexical = lexical.prev; - else if (c != maybeelse && c != popcontext) break; - } - while ((lexical.type == "stat" || lexical.type == "form") && - (firstChar == "}" || ((top = state.cc[state.cc.length - 1]) && - (top == maybeoperatorComma || top == maybeoperatorNoComma) && - !/^[,\.=+\-*:?[\(]/.test(textAfter)))) - lexical = lexical.prev; - if (statementIndent && lexical.type == ")" && lexical.prev.type == "stat") - lexical = lexical.prev; - var type = lexical.type, closing = firstChar == type; - - if (type == "vardef") return lexical.indented + (state.lastType == "operator" || state.lastType == "," ? lexical.info.length + 1 : 0); - else if (type == "form" && firstChar == "{") return lexical.indented; - else if (type == "form") return lexical.indented + indentUnit; - else if (type == "stat") - return lexical.indented + (isContinuedStatement(state, textAfter) ? statementIndent || indentUnit : 0); - else if (lexical.info == "switch" && !closing && parserConfig.doubleIndentSwitch != false) - return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit); - else if (lexical.align) return lexical.column + (closing ? 0 : 1); - else return lexical.indented + (closing ? 0 : indentUnit); - }, - - electricInput: /^\s*(?:case .*?:|default:|\{|\})$/, - blockCommentStart: jsonMode ? null : "/*", - blockCommentEnd: jsonMode ? null : "*/", - blockCommentContinue: jsonMode ? null : " * ", - lineComment: jsonMode ? null : "//", - fold: "brace", - closeBrackets: "()[]{}''\"\"``", - - helperType: jsonMode ? "json" : "javascript", - jsonldMode: jsonldMode, - jsonMode: jsonMode, - - expressionAllowed: expressionAllowed, - - skipExpression: function(state) { - parseJS(state, "atom", "atom", "true", new CodeMirror.StringStream("", 2, null)); - } - }; -}); - -CodeMirror.registerHelper("wordChars", "javascript", /[\w$]/); - -CodeMirror.defineMIME("text/javascript", "javascript"); -CodeMirror.defineMIME("text/ecmascript", "javascript"); -CodeMirror.defineMIME("application/javascript", "javascript"); -CodeMirror.defineMIME("application/x-javascript", "javascript"); -CodeMirror.defineMIME("application/ecmascript", "javascript"); -CodeMirror.defineMIME("application/json", { name: "javascript", json: true }); -CodeMirror.defineMIME("application/x-json", { name: "javascript", json: true }); -CodeMirror.defineMIME("application/manifest+json", { name: "javascript", json: true }); -CodeMirror.defineMIME("application/ld+json", { name: "javascript", jsonld: true }); -CodeMirror.defineMIME("text/typescript", { name: "javascript", typescript: true }); -CodeMirror.defineMIME("application/typescript", { name: "javascript", typescript: true }); - -}); - -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: https://codemirror.net/LICENSE - -// Utility function that allows modes to be combined. The mode given -// as the base argument takes care of most of the normal mode -// functionality, but a second (typically simple) mode is used, which -// can override the style of text. Both modes get to parse all of the -// text, but when both assign a non-null style to a piece of code, the -// overlay wins, unless the combine argument was true and not overridden, -// or state.overlay.combineTokens was true, in which case the styles are -// combined. - -(function(mod) { - mod(window.CodeMirror); -})(function(CodeMirror) { - -CodeMirror.customOverlayMode = function(base, overlay, combine) { - return { - startState: function() { - return { - base: CodeMirror.startState(base), - overlay: CodeMirror.startState(overlay), - basePos: 0, baseCur: null, - overlayPos: 0, overlayCur: null, - streamSeen: null - }; - }, - copyState: function(state) { - return { - base: CodeMirror.copyState(base, state.base), - overlay: CodeMirror.copyState(overlay, state.overlay), - basePos: state.basePos, baseCur: null, - overlayPos: state.overlayPos, overlayCur: null - }; - }, - - token: function(stream, state) { - if (stream != state.streamSeen || - Math.min(state.basePos, state.overlayPos) < stream.start) { - state.streamSeen = stream; - state.basePos = state.overlayPos = stream.start; - } - - if (stream.start == state.basePos) { - state.baseCur = base.token(stream, state.base); - state.basePos = stream.pos; - } - if (stream.start == state.overlayPos) { - stream.pos = stream.start; - state.overlayCur = overlay.token(stream, state.overlay); - state.overlayPos = stream.pos; - } - stream.pos = Math.min(state.basePos, state.overlayPos); - - // Edge case for codeblocks in templater mode - if (state.baseCur && state.overlayCur && state.baseCur.contains("line-HyperMD-codeblock")) { - state.overlayCur = state.overlayCur.replace("line-templater-inline", ""); - state.overlayCur += ` line-background-HyperMD-codeblock-bg`; - } - - // state.overlay.combineTokens always takes precedence over combine, - // unless set to null - if (state.overlayCur == null) return state.baseCur; - else if (state.baseCur != null && - state.overlay.combineTokens || - combine && state.overlay.combineTokens == null) - return state.baseCur + " " + state.overlayCur; - else return state.overlayCur; - }, - - indent: base.indent && function(state, textAfter, line) { - return base.indent(state.base, textAfter, line); - }, - electricChars: base.electricChars, - - innerMode: function(state) { return {state: state.base, mode: base}; }, - - blankLine: function(state) { - var baseToken, overlayToken; - if (base.blankLine) baseToken = base.blankLine(state.base); - if (overlay.blankLine) overlayToken = overlay.blankLine(state.overlay); - - return overlayToken == null ? - baseToken : - (combine && baseToken != null ? baseToken + " " + overlayToken : overlayToken); - } - }; -}; - -}); - -const TP_CMD_TOKEN_CLASS = "templater-command"; -const TP_INLINE_CLASS = "templater-inline"; -const TP_OPENING_TAG_TOKEN_CLASS = "templater-opening-tag"; -const TP_CLOSING_TAG_TOKEN_CLASS = "templater-closing-tag"; -const TP_INTERPOLATION_TAG_TOKEN_CLASS = "templater-interpolation-tag"; -const TP_RAW_TAG_TOKEN_CLASS = "templater-raw-tag"; -const TP_EXEC_TAG_TOKEN_CLASS = "templater-execution-tag"; -class TemplaterEditor { - constructor(app, plugin) { - this.app = app; - this.plugin = plugin; - } - setup() { - return __awaiter(this, void 0, void 0, function* () { - yield this.registerCodeMirrorMode(); - }); - } - registerCodeMirrorMode() { - return __awaiter(this, void 0, void 0, function* () { - // cm-editor-syntax-highlight-obsidian plugin - // https://codemirror.net/doc/manual.html#modeapi - // https://codemirror.net/mode/diff/diff.js - // https://codemirror.net/demo/mustache.html - // https://marijnhaverbeke.nl/blog/codemirror-mode-system.html - if (!this.plugin.settings.syntax_highlighting) { - return; - } - // TODO: Add mobile support - if (obsidian.Platform.isMobileApp) { - return; - } - const js_mode = window.CodeMirror.getMode({}, "javascript"); - if (js_mode.name === "null") { - this.plugin.log_error(new TemplaterError("Javascript syntax mode couldn't be found, can't enable syntax highlighting.")); - return; - } - // Custom overlay mode used to handle edge cases - // @ts-ignore - const overlay_mode = window.CodeMirror.customOverlayMode; - if (overlay_mode == null) { - this.plugin.log_error(new TemplaterError("Couldn't find customOverlayMode, can't enable syntax highlighting.")); - return; - } - window.CodeMirror.defineMode("templater", function (config, parserConfig) { - const templaterOverlay = { - startState: function () { - const js_state = window.CodeMirror.startState(js_mode); - return Object.assign(Object.assign({}, js_state), { inCommand: false, tag_class: "", freeLine: false }); - }, - copyState: function (state) { - const js_state = window.CodeMirror.startState(js_mode); - const new_state = Object.assign(Object.assign({}, js_state), { inCommand: state.inCommand, tag_class: state.tag_class, freeLine: state.freeLine }); - return new_state; - }, - blankLine: function (state) { - if (state.inCommand) { - return `line-background-templater-command-bg`; - } - return null; - }, - token: function (stream, state) { - if (stream.sol() && state.inCommand) { - state.freeLine = true; - } - if (state.inCommand) { - let keywords = ""; - if (stream.match(/[\-_]{0,1}%>/, true)) { - state.inCommand = false; - state.freeLine = false; - const tag_class = state.tag_class; - state.tag_class = ""; - return `line-${TP_INLINE_CLASS} ${TP_CMD_TOKEN_CLASS} ${TP_CLOSING_TAG_TOKEN_CLASS} ${tag_class}`; - } - const js_result = js_mode.token(stream, state); - if (stream.peek() == null && state.freeLine) { - keywords += ` line-background-templater-command-bg`; - } - if (!state.freeLine) { - keywords += ` line-${TP_INLINE_CLASS}`; - } - return `${keywords} ${TP_CMD_TOKEN_CLASS} ${js_result}`; - } - const match = stream.match(/<%[\-_]{0,1}\s*([*~+]{0,1})/, true); - if (match != null) { - switch (match[1]) { - case '*': - state.tag_class = TP_EXEC_TAG_TOKEN_CLASS; - break; - case '~': - state.tag_class = TP_RAW_TAG_TOKEN_CLASS; - break; - default: - state.tag_class = TP_INTERPOLATION_TAG_TOKEN_CLASS; - break; - } - state.inCommand = true; - return `line-${TP_INLINE_CLASS} ${TP_CMD_TOKEN_CLASS} ${TP_OPENING_TAG_TOKEN_CLASS} ${state.tag_class}`; - } - while (stream.next() != null && !stream.match(/<%/, false)) - ; - return null; - } - }; - return overlay_mode(window.CodeMirror.getMode(config, "hypermd"), templaterOverlay); - }); - }); - } -} - -class TemplaterPlugin extends obsidian.Plugin { - onload() { - return __awaiter(this, void 0, void 0, function* () { - yield this.loadSettings(); - this.templater = new Templater(this.app, this); - yield this.templater.setup(); - this.editor = new TemplaterEditor(this.app, this); - yield this.editor.setup(); - this.update_syntax_highlighting(); - this.fuzzySuggest = new TemplaterFuzzySuggestModal(this.app, this); - this.registerMarkdownPostProcessor((el, ctx) => this.templater.process_dynamic_templates(el, ctx)); - obsidian.addIcon("templater-icon", ICON_DATA); - this.addRibbonIcon('templater-icon', 'Templater', () => __awaiter(this, void 0, void 0, function* () { - this.fuzzySuggest.insert_template(); - })); - this.addCommand({ - id: "insert-templater", - name: "Insert Template", - hotkeys: [ - { - modifiers: ["Alt"], - key: 'e', - }, - ], - callback: () => { - this.fuzzySuggest.insert_template(); - }, - }); - this.addCommand({ - id: "replace-in-file-templater", - name: "Replace templates in the active file", - hotkeys: [ - { - modifiers: ["Alt"], - key: 'r', - }, - ], - callback: () => { - this.templater.overwrite_active_file_templates(); - }, - }); - this.addCommand({ - id: "jump-to-next-cursor-location", - name: "Jump to next cursor location", - hotkeys: [ - { - modifiers: ["Alt"], - key: "Tab", - }, - ], - callback: () => { - this.templater.cursor_jumper.jump_to_next_cursor_location(); - } - }); - this.addCommand({ - id: "create-new-note-from-template", - name: "Create new note from template", - hotkeys: [ - { - modifiers: ["Alt"], - key: "n", - }, - ], - callback: () => { - this.fuzzySuggest.create_new_note_from_template(); - } - }); - this.app.workspace.onLayoutReady(() => { - this.update_trigger_file_on_creation(); - }); - this.registerEvent(this.app.workspace.on("file-menu", (menu, file) => { - if (file instanceof obsidian.TFolder) { - menu.addItem((item) => { - item.setTitle("Create new note from template") - .setIcon("templater-icon") - .onClick(evt => { - this.fuzzySuggest.create_new_note_from_template(file); - }); - }); - } - })); - this.addSettingTab(new TemplaterSettingTab(this.app, this)); - }); - } - saveSettings() { - return __awaiter(this, void 0, void 0, function* () { - yield this.saveData(this.settings); - }); - } - loadSettings() { - return __awaiter(this, void 0, void 0, function* () { - this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData()); - }); - } - update_trigger_file_on_creation() { - if (this.settings.trigger_on_file_creation) { - this.trigger_on_file_creation_event = this.app.vault.on("create", (file) => __awaiter(this, void 0, void 0, function* () { - if (!(file instanceof obsidian.TFile) || file.extension !== "md") { - return; - } - /* Avoids template replacement when syncing files */ - const template_folder = obsidian.normalizePath(this.settings.template_folder); - if (template_folder !== "/") { - let parent = file.parent; - while (parent != null) { - if (parent.path === template_folder) { - return; - } - parent = parent.parent; - } - } - // TODO: find a better way to do this - // Currently, I have to wait for the daily note plugin to add the file content before replacing - // Not a problem with Calendar however since it creates the file with the existing content - yield delay(300); - if (file.stat.size == 0 && this.settings.empty_file_template) { - const template_file = yield this.errorWrapper(() => __awaiter(this, void 0, void 0, function* () { - return resolveTFile(this.app, this.settings.empty_file_template + ".md"); - })); - if (!template_file) { - return; - } - const content = yield this.app.vault.read(template_file); - yield this.app.vault.modify(file, content); - } - this.templater.overwrite_file_templates(file); - })); - this.registerEvent(this.trigger_on_file_creation_event); - } - else { - if (this.trigger_on_file_creation_event) { - this.app.vault.offref(this.trigger_on_file_creation_event); - this.trigger_on_file_creation_event = undefined; - } - } - } - update_syntax_highlighting() { - if (this.settings.syntax_highlighting) { - this.syntax_highlighting_event = this.app.workspace.on("codemirror", cm => { - cm.setOption("mode", "templater"); - }); - this.app.workspace.iterateCodeMirrors(cm => { - cm.setOption("mode", "templater"); - }); - this.registerEvent(this.syntax_highlighting_event); - } - else { - if (this.syntax_highlighting_event) { - this.app.vault.offref(this.syntax_highlighting_event); - } - this.app.workspace.iterateCodeMirrors(cm => { - cm.setOption("mode", "hypermd"); - }); - } - } - errorWrapper(fn) { - return __awaiter(this, void 0, void 0, function* () { - try { - return yield fn(); - } - catch (e) { - if (!(e instanceof TemplaterError)) { - this.log_error(new TemplaterError(`Template parsing error, aborting.`, e.message)); - } - else { - this.log_error(e); - } - return null; - } - }); - } - log_update(msg) { - const notice = new obsidian.Notice("", 15000); - // TODO: Find better way for this - // @ts-ignore - notice.noticeEl.innerHTML = `Templater update:
    ${msg}`; - } - log_error(e) { - const notice = new obsidian.Notice("", 8000); - if (e instanceof TemplaterError && e.console_msg) { - // TODO: Find a better way for this - // @ts-ignore - notice.noticeEl.innerHTML = `Templater Error:
    ${e.message}
    Check console for more informations`; - console.error(e.message, e.console_msg); - } - else { - // @ts-ignore - notice.noticeEl.innerHTML = `Templater Error:
    ${e.message}`; - } - } -} - -module.exports = TemplaterPlugin; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsInNyYy9FcnJvci50cyIsInNyYy9TZXR0aW5ncy50cyIsInNyYy9VdGlscy50cyIsInNyYy9UZW1wbGF0ZXJGdXp6eVN1Z2dlc3QudHMiLCJzcmMvQ29uc3RhbnRzLnRzIiwic3JjL0N1cnNvckp1bXBlci50cyIsIm5vZGVfbW9kdWxlcy9ldGEvZGlzdC9ldGEuZXMuanMiLCJzcmMvSW50ZXJuYWxUZW1wbGF0ZXMvSW50ZXJuYWxNb2R1bGUudHMiLCJzcmMvSW50ZXJuYWxUZW1wbGF0ZXMvZGF0ZS9JbnRlcm5hbE1vZHVsZURhdGUudHMiLCJzcmMvSW50ZXJuYWxUZW1wbGF0ZXMvZmlsZS9JbnRlcm5hbE1vZHVsZUZpbGUudHMiLCJzcmMvSW50ZXJuYWxUZW1wbGF0ZXMvd2ViL0ludGVybmFsTW9kdWxlV2ViLnRzIiwic3JjL0ludGVybmFsVGVtcGxhdGVzL2Zyb250bWF0dGVyL0ludGVybmFsTW9kdWxlRnJvbnRtYXR0ZXIudHMiLCJzcmMvSW50ZXJuYWxUZW1wbGF0ZXMvc3lzdGVtL1Byb21wdE1vZGFsLnRzIiwic3JjL0ludGVybmFsVGVtcGxhdGVzL3N5c3RlbS9TdWdnZXN0ZXJNb2RhbC50cyIsInNyYy9JbnRlcm5hbFRlbXBsYXRlcy9zeXN0ZW0vSW50ZXJuYWxNb2R1bGVTeXN0ZW0udHMiLCJzcmMvSW50ZXJuYWxUZW1wbGF0ZXMvY29uZmlnL0ludGVybmFsTW9kdWxlQ29uZmlnLnRzIiwic3JjL0ludGVybmFsVGVtcGxhdGVzL0ludGVybmFsVGVtcGxhdGVQYXJzZXIudHMiLCJzcmMvVXNlclRlbXBsYXRlcy9Vc2VyVGVtcGxhdGVQYXJzZXIudHMiLCJzcmMvVGVtcGxhdGVQYXJzZXIudHMiLCJzcmMvVGVtcGxhdGVyLnRzIiwic3JjL21vZGUvamF2YXNjcmlwdC5qcyIsInNyYy9tb2RlL2N1c3RvbV9vdmVybGF5LmpzIiwic3JjL1RlbXBsYXRlckVkaXRvci50cyIsInNyYy9tYWluLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XHJcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgb1trMl0gPSBtW2tdO1xyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xyXG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xyXG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XHJcbiAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXHJcbiAgICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXHJcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xyXG4gICAgcmV0dXJuIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XHJcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcclxuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcclxuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgZnJvbSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcclxufSkgOiBmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcclxuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiBraW5kID09PSBcIm1cIiA/IGYgOiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlcikgOiBmID8gZi52YWx1ZSA6IHN0YXRlLmdldChyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcclxufVxyXG4iLCJleHBvcnQgY2xhc3MgVGVtcGxhdGVyRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcsIHB1YmxpYyBjb25zb2xlX21zZz86IHN0cmluZykge1xuICAgICAgICBzdXBlcihtc2cpO1xuICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xuICAgIH1cbn0iLCJpbXBvcnQgeyBUZW1wbGF0ZXJFcnJvciB9IGZyb20gXCJFcnJvclwiO1xuaW1wb3J0IHsgQXBwLCBQbHVnaW5TZXR0aW5nVGFiLCBTZXR0aW5nIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5cbmltcG9ydCBUZW1wbGF0ZXJQbHVnaW4gZnJvbSAnLi9tYWluJztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfU0VUVElOR1M6IFRlbXBsYXRlclNldHRpbmdzID0ge1xuXHRjb21tYW5kX3RpbWVvdXQ6IDUsXG5cdHRlbXBsYXRlX2ZvbGRlcjogXCJcIixcblx0dGVtcGxhdGVzX3BhaXJzOiBbW1wiXCIsIFwiXCJdXSxcblx0dHJpZ2dlcl9vbl9maWxlX2NyZWF0aW9uOiBmYWxzZSxcblx0ZW5hYmxlX3N5c3RlbV9jb21tYW5kczogZmFsc2UsXG5cdHNoZWxsX3BhdGg6IFwiXCIsXG5cdHNjcmlwdF9mb2xkZXI6IHVuZGVmaW5lZCxcblx0ZW1wdHlfZmlsZV90ZW1wbGF0ZTogdW5kZWZpbmVkLFxuXHRzeW50YXhfaGlnaGxpZ2h0aW5nOiB0cnVlLFxufTtcblxuZXhwb3J0IGludGVyZmFjZSBUZW1wbGF0ZXJTZXR0aW5ncyB7XG5cdGNvbW1hbmRfdGltZW91dDogbnVtYmVyO1xuXHR0ZW1wbGF0ZV9mb2xkZXI6IHN0cmluZztcblx0dGVtcGxhdGVzX3BhaXJzOiBBcnJheTxbc3RyaW5nLCBzdHJpbmddPjtcblx0dHJpZ2dlcl9vbl9maWxlX2NyZWF0aW9uOiBib29sZWFuO1xuXHRlbmFibGVfc3lzdGVtX2NvbW1hbmRzOiBib29sZWFuO1xuXHRzaGVsbF9wYXRoOiBzdHJpbmcsXG5cdHNjcmlwdF9mb2xkZXI6IHN0cmluZyxcblx0ZW1wdHlfZmlsZV90ZW1wbGF0ZTogc3RyaW5nLFxuXHRzeW50YXhfaGlnaGxpZ2h0aW5nOiBib29sZWFuLFxufTtcblxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlclNldHRpbmdUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcblx0Y29uc3RydWN0b3IocHVibGljIGFwcDogQXBwLCBwcml2YXRlIHBsdWdpbjogVGVtcGxhdGVyUGx1Z2luKSB7XG5cdFx0c3VwZXIoYXBwLCBwbHVnaW4pO1xuXHR9XG5cblx0ZGlzcGxheSgpOiB2b2lkIHtcblx0XHRjb25zdCB7Y29udGFpbmVyRWx9ID0gdGhpcztcblx0XHRsZXQgZGVzYzogRG9jdW1lbnRGcmFnbWVudDtcblx0XHRjb250YWluZXJFbC5lbXB0eSgpO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZShcIlRlbXBsYXRlIGZvbGRlciBsb2NhdGlvblwiKVxuXHRcdFx0LnNldERlc2MoXCJGaWxlcyBpbiB0aGlzIGZvbGRlciB3aWxsIGJlIGF2YWlsYWJsZSBhcyB0ZW1wbGF0ZXMuXCIpXG5cdFx0XHQuYWRkVGV4dCh0ZXh0ID0+IHtcblx0XHRcdFx0dGV4dC5zZXRQbGFjZWhvbGRlcihcIkV4YW1wbGU6IGZvbGRlciAxL2ZvbGRlciAyXCIpXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnRlbXBsYXRlX2ZvbGRlcilcblx0XHRcdFx0XHQub25DaGFuZ2UoKG5ld19mb2xkZXIpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnRlbXBsYXRlX2ZvbGRlciA9IG5ld19mb2xkZXI7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0fSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKFwiVGltZW91dFwiKVxuXHRcdFx0LnNldERlc2MoXCJNYXhpbXVtIHRpbWVvdXQgaW4gc2Vjb25kcyBmb3IgYSBzeXN0ZW0gY29tbWFuZC5cIilcblx0XHRcdC5hZGRUZXh0KHRleHQgPT4ge1xuXHRcdFx0XHR0ZXh0LnNldFBsYWNlaG9sZGVyKFwiVGltZW91dFwiKVxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5jb21tYW5kX3RpbWVvdXQudG9TdHJpbmcoKSlcblx0XHRcdFx0XHQub25DaGFuZ2UoKG5ld192YWx1ZSkgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3QgbmV3X3RpbWVvdXQgPSBOdW1iZXIobmV3X3ZhbHVlKTtcblx0XHRcdFx0XHRcdGlmIChpc05hTihuZXdfdGltZW91dCkpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4ubG9nX2Vycm9yKG5ldyBUZW1wbGF0ZXJFcnJvcihcIlRpbWVvdXQgbXVzdCBiZSBhIG51bWJlclwiKSk7XG5cdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmNvbW1hbmRfdGltZW91dCA9IG5ld190aW1lb3V0O1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdH0pO1xuXG5cdFx0ZGVzYyA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcblx0XHRkZXNjLmFwcGVuZChcblx0XHRcdFwiVGVtcGxhdGVyIHByb3ZpZGVzIG11bHRpcGxlcyBwcmVkZWZpbmVkIHZhcmlhYmxlcyAvIGZ1bmN0aW9ucyB0aGF0IHlvdSBjYW4gdXNlLlwiLFxuXHRcdFx0ZGVzYy5jcmVhdGVFbChcImJyXCIpLFxuXHRcdFx0XCJDaGVjayB0aGUgXCIsXG5cdFx0XHRkZXNjLmNyZWF0ZUVsKFwiYVwiLCB7XG5cdFx0XHRcdGhyZWY6IFwiaHR0cHM6Ly9zaWxlbnR2b2lkMTMuZ2l0aHViLmlvL1RlbXBsYXRlci9cIixcblx0XHRcdFx0dGV4dDogXCJkb2N1bWVudGF0aW9uXCJcblx0XHRcdH0pLFxuXHRcdFx0XCIgdG8gZ2V0IGEgbGlzdCBvZiBhbGwgdGhlIGF2YWlsYWJsZSBpbnRlcm5hbCB2YXJpYWJsZXMgLyBmdW5jdGlvbnMuXCIsXG5cdFx0KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoXCJJbnRlcm5hbCBWYXJpYWJsZXMgYW5kIEZ1bmN0aW9uc1wiKVxuXHRcdFx0LnNldERlc2MoZGVzYyk7XG5cblx0XHRkZXNjID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuXHRcdGRlc2MuYXBwZW5kKFxuXHRcdFx0XCJBZGRzIHN5bnRheCBoaWdobGlnaHRpbmcgZm9yIFRlbXBsYXRlciBjb21tYW5kcyBpbiBlZGl0IG1vZGUuXCIsXG5cdFx0KTtcdFxuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZShcIlN5bnRheCBIaWdobGlnaHRpbmdcIilcblx0XHRcdC5zZXREZXNjKGRlc2MpXG5cdFx0XHQuYWRkVG9nZ2xlKHRvZ2dsZSA9PiB7XG5cdFx0XHRcdHRvZ2dsZVxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5zeW50YXhfaGlnaGxpZ2h0aW5nKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShzeW50YXhfaGlnaGxpZ2h0aW5nID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnN5bnRheF9oaWdobGlnaHRpbmcgPSBzeW50YXhfaGlnaGxpZ2h0aW5nO1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi51cGRhdGVfc3ludGF4X2hpZ2hsaWdodGluZygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHR9KTtcblxuXHRcdGRlc2MgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG5cdFx0ZGVzYy5hcHBlbmQoXG5cdFx0XHRcIlRlbXBsYXRlciB3aWxsIGxpc3RlbiBmb3IgdGhlIG5ldyBmaWxlIGNyZWF0aW9uIGV2ZW50LCBhbmQgcmVwbGFjZSBldmVyeSBjb21tYW5kIGl0IGZpbmRzIGluIHRoZSBuZXcgZmlsZSdzIGNvbnRlbnQuXCIsXG5cdFx0XHRkZXNjLmNyZWF0ZUVsKFwiYnJcIiksXG5cdFx0XHRcIlRoaXMgbWFrZXMgVGVtcGxhdGVyIGNvbXBhdGlibGUgd2l0aCBvdGhlciBwbHVnaW5zIGxpa2UgdGhlIERhaWx5IG5vdGUgY29yZSBwbHVnaW4sIENhbGVuZGFyIHBsdWdpbiwgUmV2aWV3IHBsdWdpbiwgTm90ZSByZWZhY3RvciBwbHVnaW4sIC4uLlwiLFxuXHRcdFx0ZGVzYy5jcmVhdGVFbChcImJyXCIpLFxuXHRcdFx0ZGVzYy5jcmVhdGVFbChcImJcIiwge1xuXHRcdFx0XHR0ZXh0OiBcIldhcm5pbmc6IFwiLFxuXHRcdFx0fSksXG5cdFx0XHRcIlRoaXMgY2FuIGJlIGRhbmdlcm91cyBpZiB5b3UgY3JlYXRlIG5ldyBmaWxlcyB3aXRoIHVua25vd24gLyB1bnNhZmUgY29udGVudCBvbiBjcmVhdGlvbi4gTWFrZSBzdXJlIHRoYXQgZXZlcnkgbmV3IGZpbGUncyBjb250ZW50IGlzIHNhZmUgb24gY3JlYXRpb24uXCJcblx0XHQpO1x0XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKFwiVHJpZ2dlciBUZW1wbGF0ZXIgb24gbmV3IGZpbGUgY3JlYXRpb25cIilcblx0XHRcdC5zZXREZXNjKGRlc2MpXG5cdFx0XHQuYWRkVG9nZ2xlKHRvZ2dsZSA9PiB7XG5cdFx0XHRcdHRvZ2dsZVxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy50cmlnZ2VyX29uX2ZpbGVfY3JlYXRpb24pXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKHRyaWdnZXJfb25fZmlsZV9jcmVhdGlvbiA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy50cmlnZ2VyX29uX2ZpbGVfY3JlYXRpb24gPSB0cmlnZ2VyX29uX2ZpbGVfY3JlYXRpb247XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnVwZGF0ZV90cmlnZ2VyX2ZpbGVfb25fY3JlYXRpb24oKTtcblx0XHRcdFx0XHRcdC8vIEZvcmNlIHJlZnJlc2hcblx0XHRcdFx0XHRcdHRoaXMuZGlzcGxheSgpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cblx0XHRpZiAodGhpcy5wbHVnaW4uc2V0dGluZ3MudHJpZ2dlcl9vbl9maWxlX2NyZWF0aW9uKSB7XG5cdFx0XHRkZXNjID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuXHRcdFx0ZGVzYy5hcHBlbmQoXG5cdFx0XHRcdFwiVGVtcGxhdGVyIHdpbGwgYXV0b21hdGljYWxseSBhcHBseSB0aGlzIHRlbXBsYXRlIHRvIG5ldyBlbXB0eSBmaWxlcyB3aGVuIHRoZXkgYXJlIGNyZWF0ZWQuXCIsXG5cdFx0XHRcdGRlc2MuY3JlYXRlRWwoXCJiclwiKSxcblx0XHRcdFx0XCJUaGUgLm1kIGV4dGVuc2lvbiBmb3IgdGhlIGZpbGUgc2hvdWxkbid0IGJlIHNwZWNpZmllZC5cIlxuXHRcdFx0KTtcblx0XHRcdFxuXHRcdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHRcdC5zZXROYW1lKFwiRW1wdHkgZmlsZSB0ZW1wbGF0ZVwiKVxuXHRcdFx0XHQuc2V0RGVzYyhkZXNjKVxuXHRcdFx0XHQuYWRkVGV4dCh0ZXh0ID0+IHtcblx0XHRcdFx0XHR0ZXh0LnNldFBsYWNlaG9sZGVyKFwiZm9sZGVyIDEvdGVtcGxhdGVfZmlsZVwiKVxuXHRcdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmVtcHR5X2ZpbGVfdGVtcGxhdGUpXG5cdFx0XHRcdFx0XHQub25DaGFuZ2UoKGVtcHR5X2ZpbGVfdGVtcGxhdGUpID0+IHtcblx0XHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZW1wdHlfZmlsZV90ZW1wbGF0ZSA9IGVtcHR5X2ZpbGVfdGVtcGxhdGU7XG5cdFx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGRlc2MgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG5cdFx0ZGVzYy5hcHBlbmQoXG5cdFx0XHRcIkFsbCBKYXZhU2NyaXB0IGZpbGVzIGluIHRoaXMgZm9sZGVyIHdpbGwgYmUgbG9hZGVkIGFzIENvbW1vbkpTIG1vZHVsZXMsIHRvIGltcG9ydCBjdXN0b20gdXNlciBmdW5jdGlvbnMuXCIsIFxuXHRcdFx0ZGVzYy5jcmVhdGVFbChcImJyXCIpLFxuXHRcdFx0XCJUaGUgZm9sZGVyIG5lZWRzIHRvIGJlIGFjY2Vzc2libGUgZnJvbSB0aGUgdmF1bHQuXCIsXG5cdFx0XHRkZXNjLmNyZWF0ZUVsKFwiYnJcIiksXG5cdFx0XHRcIkNoZWNrIHRoZSBcIixcblx0XHRcdGRlc2MuY3JlYXRlRWwoXCJhXCIsIHtcblx0XHRcdFx0aHJlZjogXCJodHRwczovL3NpbGVudHZvaWQxMy5naXRodWIuaW8vVGVtcGxhdGVyL1wiLFxuXHRcdFx0XHR0ZXh0OiBcImRvY3VtZW50YXRpb25cIixcblx0XHRcdH0pLFxuXHRcdFx0XCIgZm9yIG1vcmUgaW5mb3JtYXRpb25zLlwiLFxuXHRcdCk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKFwiU2NyaXB0IGZpbGVzIGZvbGRlciBsb2NhdGlvblwiKVxuXHRcdFx0LnNldERlc2MoZGVzYylcblx0XHRcdC5hZGRUZXh0KHRleHQgPT4ge1xuXHRcdFx0XHR0ZXh0LnNldFBsYWNlaG9sZGVyKFwiRXhhbXBsZTogZm9sZGVyIDEvZm9sZGVyIDJcIilcblx0XHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3Muc2NyaXB0X2ZvbGRlcilcblx0XHRcdFx0XHQub25DaGFuZ2UoKG5ld19mb2xkZXIpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnNjcmlwdF9mb2xkZXIgPSBuZXdfZm9sZGVyO1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdH0pO1xuXG5cdFx0ZGVzYyA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcblx0XHRkZXNjLmFwcGVuZChcblx0XHRcdFwiQWxsb3dzIHlvdSB0byBjcmVhdGUgdXNlciBmdW5jdGlvbnMgbGlua2VkIHRvIHN5c3RlbSBjb21tYW5kcy5cIixcblx0XHRcdGRlc2MuY3JlYXRlRWwoXCJiclwiKSxcblx0XHRcdGRlc2MuY3JlYXRlRWwoXCJiXCIsIHtcblx0XHRcdFx0dGV4dDogXCJXYXJuaW5nOiBcIlxuXHRcdFx0fSksXG5cdFx0XHRcIkl0IGNhbiBiZSBkYW5nZXJvdXMgdG8gZXhlY3V0ZSBhcmJpdHJhcnkgc3lzdGVtIGNvbW1hbmRzIGZyb20gdW50cnVzdGVkIHNvdXJjZXMuIE9ubHkgcnVuIHN5c3RlbSBjb21tYW5kcyB0aGF0IHlvdSB1bmRlcnN0YW5kLCBmcm9tIHRydXN0ZWQgc291cmNlcy5cIixcblx0XHQpO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZShcIkVuYWJsZSBTeXN0ZW0gQ29tbWFuZHNcIilcblx0XHRcdC5zZXREZXNjKGRlc2MpXG5cdFx0XHQuYWRkVG9nZ2xlKHRvZ2dsZSA9PiB7XG5cdFx0XHRcdHRvZ2dsZVxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5lbmFibGVfc3lzdGVtX2NvbW1hbmRzKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShlbmFibGVfc3lzdGVtX2NvbW1hbmRzID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmVuYWJsZV9zeXN0ZW1fY29tbWFuZHMgPSBlbmFibGVfc3lzdGVtX2NvbW1hbmRzO1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0XHQvLyBGb3JjZSByZWZyZXNoXG5cdFx0XHRcdFx0XHR0aGlzLmRpc3BsYXkoKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXG5cdFx0aWYgKHRoaXMucGx1Z2luLnNldHRpbmdzLmVuYWJsZV9zeXN0ZW1fY29tbWFuZHMpIHtcblx0XHRcdGRlc2MgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG5cdFx0XHRkZXNjLmFwcGVuZChcblx0XHRcdFx0XCJGdWxsIHBhdGggdG8gdGhlIHNoZWxsIGJpbmFyeSB0byBleGVjdXRlIHRoZSBjb21tYW5kIHdpdGguXCIsXG5cdFx0XHRcdGRlc2MuY3JlYXRlRWwoXCJiclwiKSxcblx0XHRcdFx0XCJUaGlzIHNldHRpbmcgaXMgb3B0aW9uYWwgYW5kIHdpbGwgZGVmYXVsdCB0byB0aGUgc3lzdGVtJ3MgZGVmYXVsdCBzaGVsbCBpZiBub3Qgc3BlY2lmaWVkLlwiLFxuXHRcdFx0XHRkZXNjLmNyZWF0ZUVsKFwiYnJcIiksXG5cdFx0XHRcdFwiWW91IGNhbiB1c2UgZm9yd2FyZCBzbGFzaGVzICgnLycpIGFzIHBhdGggc2VwYXJhdG9ycyBvbiBhbGwgcGxhdGZvcm1zIGlmIGluIGRvdWJ0LlwiXG5cdFx0XHQpO1xuXHRcdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHRcdC5zZXROYW1lKFwiU2hlbGwgYmluYXJ5IGxvY2F0aW9uXCIpXG5cdFx0XHRcdC5zZXREZXNjKGRlc2MpXG5cdFx0XHRcdC5hZGRUZXh0KHRleHQgPT4ge1xuXHRcdFx0XHRcdHRleHQuc2V0UGxhY2Vob2xkZXIoXCJFeGFtcGxlOiAvYmluL2Jhc2gsIC4uLlwiKVxuXHRcdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnNoZWxsX3BhdGgpXG5cdFx0XHRcdFx0XHQub25DaGFuZ2UoKHNoZWxsX3BhdGgpID0+IHtcblx0XHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3Muc2hlbGxfcGF0aCA9IHNoZWxsX3BhdGg7XG5cdFx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0fSk7XG5cblx0XHRcdGxldCBpID0gMTtcblx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnRlbXBsYXRlc19wYWlycy5mb3JFYWNoKCh0ZW1wbGF0ZV9wYWlyKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGRpdiA9IGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdkaXYnKTtcblx0XHRcdFx0ZGl2LmFkZENsYXNzKFwidGVtcGxhdGVyX2RpdlwiKTtcblxuXHRcdFx0XHRjb25zdCB0aXRsZSA9IGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoNCcsIHtcblx0XHRcdFx0XHR0ZXh0OiAnVXNlciBGdW5jdGlvbiBuwrAnICsgaSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHRpdGxlLmFkZENsYXNzKFwidGVtcGxhdGVyX3RpdGxlXCIpO1xuXG5cdFx0XHRcdGNvbnN0IHNldHRpbmcgPSBuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdFx0XHQuYWRkRXh0cmFCdXR0b24oZXh0cmEgPT4ge1xuXHRcdFx0XHRcdFx0ZXh0cmEuc2V0SWNvbihcImNyb3NzXCIpXG5cdFx0XHRcdFx0XHRcdC5zZXRUb29sdGlwKFwiRGVsZXRlXCIpXG5cdFx0XHRcdFx0XHRcdC5vbkNsaWNrKCgpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBpbmRleCA9IHRoaXMucGx1Z2luLnNldHRpbmdzLnRlbXBsYXRlc19wYWlycy5pbmRleE9mKHRlbXBsYXRlX3BhaXIpO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChpbmRleCA+IC0xKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy50ZW1wbGF0ZXNfcGFpcnMuc3BsaWNlKGluZGV4LCAxKTtcblx0XHRcdFx0XHRcdFx0XHRcdC8vIEZvcmNlIHJlZnJlc2hcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5kaXNwbGF5KCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmFkZFRleHQodGV4dCA9PiB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHQgPSB0ZXh0LnNldFBsYWNlaG9sZGVyKCdGdW5jdGlvbiBuYW1lJylcblx0XHRcdFx0XHRcdFx0LnNldFZhbHVlKHRlbXBsYXRlX3BhaXJbMF0pXG5cdFx0XHRcdFx0XHRcdC5vbkNoYW5nZSgobmV3X3ZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgaW5kZXggPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy50ZW1wbGF0ZXNfcGFpcnMuaW5kZXhPZih0ZW1wbGF0ZV9wYWlyKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoaW5kZXggPiAtMSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudGVtcGxhdGVzX3BhaXJzW2luZGV4XVswXSA9IG5ld192YWx1ZTtcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdHQuaW5wdXRFbC5hZGRDbGFzcyhcInRlbXBsYXRlcl90ZW1wbGF0ZVwiKTtcblxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0LmFkZFRleHRBcmVhKHRleHQgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3QgdCA9IHRleHQuc2V0UGxhY2Vob2xkZXIoJ1N5c3RlbSBDb21tYW5kJylcblx0XHRcdFx0XHRcdC5zZXRWYWx1ZSh0ZW1wbGF0ZV9wYWlyWzFdKVxuXHRcdFx0XHRcdFx0Lm9uQ2hhbmdlKChuZXdfY21kKSA9PiB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGluZGV4ID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MudGVtcGxhdGVzX3BhaXJzLmluZGV4T2YodGVtcGxhdGVfcGFpcik7XG5cdFx0XHRcdFx0XHRcdGlmIChpbmRleCA+IC0xKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudGVtcGxhdGVzX3BhaXJzW2luZGV4XVsxXSA9IG5ld19jbWQ7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0XHR0LmlucHV0RWwuc2V0QXR0cihcInJvd3NcIiwgNCk7XG5cdFx0XHRcdFx0XHR0LmlucHV0RWwuYWRkQ2xhc3MoXCJ0ZW1wbGF0ZXJfY21kXCIpO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gdDtcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRzZXR0aW5nLmluZm9FbC5yZW1vdmUoKTtcblxuXHRcdFx0XHRkaXYuYXBwZW5kQ2hpbGQodGl0bGUpO1xuXHRcdFx0XHRkaXYuYXBwZW5kQ2hpbGQoY29udGFpbmVyRWwubGFzdENoaWxkKTtcblxuXHRcdFx0XHRpKz0xO1xuXHRcdFx0fSk7XG5cblx0XHRcdGNvbnN0IGRpdiA9IGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdkaXYnKTtcblx0XHRcdGRpdi5hZGRDbGFzcyhcInRlbXBsYXRlcl9kaXYyXCIpO1xuXG5cdFx0XHRjb25zdCBzZXR0aW5nID0gbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHRcdC5hZGRCdXR0b24oYnV0dG9uID0+IHtcblx0XHRcdFx0XHRjb25zdCBiID0gYnV0dG9uLnNldEJ1dHRvblRleHQoXCJBZGQgTmV3IFVzZXIgRnVuY3Rpb25cIikub25DbGljaygoKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy50ZW1wbGF0ZXNfcGFpcnMucHVzaChbXCJcIiwgXCJcIl0pO1xuXHRcdFx0XHRcdFx0Ly8gRm9yY2UgcmVmcmVzaFxuXHRcdFx0XHRcdFx0dGhpcy5kaXNwbGF5KCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0Yi5idXR0b25FbC5hZGRDbGFzcyhcInRlbXBsYXRlcl9idXR0b25cIik7XG5cblx0XHRcdFx0XHRyZXR1cm4gYjtcblx0XHRcdFx0fSk7XG5cdFx0XHRzZXR0aW5nLmluZm9FbC5yZW1vdmUoKTtcblxuXHRcdFx0ZGl2LmFwcGVuZENoaWxkKGNvbnRhaW5lckVsLmxhc3RDaGlsZCk7XG5cdFx0fVx0XG5cdH1cbn0iLCJpbXBvcnQgeyBUZW1wbGF0ZXJFcnJvciB9IGZyb20gXCJFcnJvclwiO1xuaW1wb3J0IHsgQXBwLCBub3JtYWxpemVQYXRoLCBUQWJzdHJhY3RGaWxlLCBURmlsZSwgVEZvbGRlciwgVmF1bHQgfSBmcm9tIFwib2JzaWRpYW5cIjtcblxuZXhwb3J0IGNvbnN0IG9ic2lkaWFuX21vZHVsZSA9IHJlcXVpcmUoXCJvYnNpZGlhblwiKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRlbGF5KG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoIHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykgKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVSZWdFeHAoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csICdcXFxcJCYnKTsgLy8gJCYgbWVhbnMgdGhlIHdob2xlIG1hdGNoZWQgc3RyaW5nXG59IFxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVRGaWxlKGFwcDogQXBwLCBmaWxlX3N0cjogc3RyaW5nKTogVEZpbGUge1xuICAgIGZpbGVfc3RyID0gbm9ybWFsaXplUGF0aChmaWxlX3N0cik7XG5cbiAgICBjb25zdCBmaWxlID0gYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChmaWxlX3N0cik7XG4gICAgaWYgKCFmaWxlKSB7XG4gICAgICAgIHRocm93IG5ldyBUZW1wbGF0ZXJFcnJvcihgRmlsZSBcIiR7ZmlsZV9zdHJ9XCIgZG9lc24ndCBleGlzdGApO1xuICAgIH1cbiAgICBpZiAoIShmaWxlIGluc3RhbmNlb2YgVEZpbGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUZW1wbGF0ZXJFcnJvcihgJHtmaWxlX3N0cn0gaXMgYSBmb2xkZXIsIG5vdCBhIGZpbGVgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmlsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRGaWxlc0Zyb21Gb2xkZXIoYXBwOiBBcHAsIGZvbGRlcl9zdHI6IHN0cmluZyk6IEFycmF5PFRGaWxlPiB7XG4gICAgZm9sZGVyX3N0ciA9IG5vcm1hbGl6ZVBhdGgoZm9sZGVyX3N0cik7XG5cbiAgICBjb25zdCBmb2xkZXIgPSBhcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKGZvbGRlcl9zdHIpO1xuICAgIGlmICghZm9sZGVyKSB7XG4gICAgICAgIHRocm93IG5ldyBUZW1wbGF0ZXJFcnJvcihgRm9sZGVyIFwiJHtmb2xkZXJfc3RyfVwiIGRvZXNuJ3QgZXhpc3RgKTtcbiAgICB9XG4gICAgaWYgKCEoZm9sZGVyIGluc3RhbmNlb2YgVEZvbGRlcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IFRlbXBsYXRlckVycm9yKGAke2ZvbGRlcl9zdHJ9IGlzIGEgZmlsZSwgbm90IGEgZm9sZGVyYCk7XG4gICAgfVxuXG4gICAgbGV0IGZpbGVzOiBBcnJheTxURmlsZT4gPSBbXTtcbiAgICBWYXVsdC5yZWN1cnNlQ2hpbGRyZW4oZm9sZGVyLCAoZmlsZTogVEFic3RyYWN0RmlsZSkgPT4ge1xuICAgICAgICBpZiAoZmlsZSBpbnN0YW5jZW9mIFRGaWxlKSB7XG4gICAgICAgICAgICBmaWxlcy5wdXNoKGZpbGUpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBmaWxlcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIHJldHVybiBhLmJhc2VuYW1lLmxvY2FsZUNvbXBhcmUoYi5iYXNlbmFtZSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZmlsZXM7XG59IiwiaW1wb3J0IHsgQXBwLCBGdXp6eVN1Z2dlc3RNb2RhbCwgVEZpbGUsIFRGb2xkZXIsIG5vcm1hbGl6ZVBhdGgsIFZhdWx0LCBUQWJzdHJhY3RGaWxlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQgeyBnZXRURmlsZXNGcm9tRm9sZGVyIH0gZnJvbSBcIlV0aWxzXCI7XG5pbXBvcnQgVGVtcGxhdGVyUGx1Z2luIGZyb20gJy4vbWFpbic7XG5cbmV4cG9ydCBlbnVtIE9wZW5Nb2RlIHtcbiAgICBJbnNlcnRUZW1wbGF0ZSxcbiAgICBDcmVhdGVOb3RlVGVtcGxhdGUsXG59O1xuXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVyRnV6enlTdWdnZXN0TW9kYWwgZXh0ZW5kcyBGdXp6eVN1Z2dlc3RNb2RhbDxURmlsZT4ge1xuICAgIHB1YmxpYyBhcHA6IEFwcDtcbiAgICBwcml2YXRlIHBsdWdpbjogVGVtcGxhdGVyUGx1Z2luO1xuICAgIHByaXZhdGUgb3Blbl9tb2RlOiBPcGVuTW9kZTtcbiAgICBwcml2YXRlIGNyZWF0aW9uX2ZvbGRlcjogVEZvbGRlcjtcblxuICAgIGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW46IFRlbXBsYXRlclBsdWdpbikge1xuICAgICAgICBzdXBlcihhcHApO1xuICAgICAgICB0aGlzLmFwcCA9IGFwcDtcbiAgICAgICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XG4gICAgfVxuXG4gICAgZ2V0SXRlbXMoKTogVEZpbGVbXSB7XG4gICAgICAgIGlmICh0aGlzLnBsdWdpbi5zZXR0aW5ncy50ZW1wbGF0ZV9mb2xkZXIgPT09IFwiXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFwcC52YXVsdC5nZXRNYXJrZG93bkZpbGVzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdldFRGaWxlc0Zyb21Gb2xkZXIodGhpcy5hcHAsIHRoaXMucGx1Z2luLnNldHRpbmdzLnRlbXBsYXRlX2ZvbGRlcik7XG4gICAgfVxuXG4gICAgZ2V0SXRlbVRleHQoaXRlbTogVEZpbGUpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gaXRlbS5iYXNlbmFtZTtcbiAgICB9XG5cbiAgICBvbkNob29zZUl0ZW0oaXRlbTogVEZpbGUsIF9ldnQ6IE1vdXNlRXZlbnQgfCBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIHN3aXRjaCh0aGlzLm9wZW5fbW9kZSkge1xuICAgICAgICAgICAgY2FzZSBPcGVuTW9kZS5JbnNlcnRUZW1wbGF0ZTpcbiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi50ZW1wbGF0ZXIuYXBwZW5kX3RlbXBsYXRlKGl0ZW0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBPcGVuTW9kZS5DcmVhdGVOb3RlVGVtcGxhdGU6XG4gICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4udGVtcGxhdGVyLmNyZWF0ZV9uZXdfbm90ZV9mcm9tX3RlbXBsYXRlKGl0ZW0sIHRoaXMuY3JlYXRpb25fZm9sZGVyKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXJ0KCk6IHZvaWQge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4ubG9nX2Vycm9yKGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW5zZXJ0X3RlbXBsYXRlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9wZW5fbW9kZSA9IE9wZW5Nb2RlLkluc2VydFRlbXBsYXRlO1xuICAgICAgICB0aGlzLnN0YXJ0KCk7XG4gICAgfVxuXG4gICAgY3JlYXRlX25ld19ub3RlX2Zyb21fdGVtcGxhdGUoZm9sZGVyPzogVEZvbGRlcik6IHZvaWQge1xuICAgICAgICB0aGlzLmNyZWF0aW9uX2ZvbGRlciA9IGZvbGRlcjtcbiAgICAgICAgdGhpcy5vcGVuX21vZGUgPSBPcGVuTW9kZS5DcmVhdGVOb3RlVGVtcGxhdGU7XG4gICAgICAgIHRoaXMuc3RhcnQoKTtcbiAgICB9XG59XG4iLCJleHBvcnQgY29uc3QgVU5TVVBQT1JURURfTU9CSUxFX1RFTVBMQVRFOiBzdHJpbmcgPSBcIkVycm9yX01vYmlsZVVuc3VwcG9ydGVkVGVtcGxhdGVcIjtcbmV4cG9ydCBjb25zdCBJQ09OX0RBVEE6IHN0cmluZyA9IGA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDUxLjEzMjggMjguN1wiPjxwYXRoIGQ9XCJNMCAxNS4xNCAwIDEwLjE1IDE4LjY3IDEuNTEgMTguNjcgNi4wMyA0LjcyIDEyLjMzIDQuNzIgMTIuNzYgMTguNjcgMTkuMjIgMTguNjcgMjMuNzQgMCAxNS4xNFpNMzMuNjkyOCAxLjg0QzMzLjY5MjggMS44NCAzMy45NzYxIDIuMTQ2NyAzNC41NDI4IDIuNzZDMzUuMTA5NCAzLjM4IDM1LjM5MjggNC41NiAzNS4zOTI4IDYuM0MzNS4zOTI4IDguMDQ2NiAzNC44MTk1IDkuNTQgMzMuNjcyOCAxMC43OEMzMi41MjYxIDEyLjAyIDMxLjA5OTUgMTIuNjQgMjkuMzkyOCAxMi42NEMyNy42ODYyIDEyLjY0IDI2LjI2NjEgMTIuMDI2NyAyNS4xMzI4IDEwLjhDMjMuOTkyOCA5LjU3MzMgMjMuNDIyOCA4LjA4NjcgMjMuNDIyOCA2LjM0QzIzLjQyMjggNC42IDIzLjk5OTUgMy4xMDY2IDI1LjE1MjggMS44NkMyNi4yOTk0LjYyIDI3LjcyNjEgMCAyOS40MzI4IDBDMzEuMTM5NSAwIDMyLjU1OTQuNjEzMyAzMy42OTI4IDEuODRNNDkuODIyOC42NyAyOS41MzI4IDI4LjM4IDI0LjQxMjggMjguMzggNDQuNzEyOC42NyA0OS44MjI4LjY3TTMxLjAzMjggOC4zOEMzMS4wMzI4IDguMzggMzEuMTM5NSA4LjI0NjcgMzEuMzUyOCA3Ljk4QzMxLjU2NjIgNy43MDY3IDMxLjY3MjggNy4xNzMzIDMxLjY3MjggNi4zOEMzMS42NzI4IDUuNTg2NyAzMS40NDYxIDQuOTIgMzAuOTkyOCA0LjM4QzMwLjU0NjEgMy44NCAyOS45OTk1IDMuNTcgMjkuMzUyOCAzLjU3QzI4LjcwNjEgMy41NyAyOC4xNjk1IDMuODQgMjcuNzQyOCA0LjM4QzI3LjMyMjggNC45MiAyNy4xMTI4IDUuNTg2NyAyNy4xMTI4IDYuMzhDMjcuMTEyOCA3LjE3MzMgMjcuMzM2MSA3Ljg0IDI3Ljc4MjggOC4zOEMyOC4yMzYxIDguOTI2NyAyOC43ODYxIDkuMiAyOS40MzI4IDkuMkMzMC4wNzk1IDkuMiAzMC42MTI4IDguOTI2NyAzMS4wMzI4IDguMzhNNDkuNDMyOCAxNy45QzQ5LjQzMjggMTcuOSA0OS43MTYxIDE4LjIwNjcgNTAuMjgyOCAxOC44MkM1MC44NDk1IDE5LjQzMzMgNTEuMTMyOCAyMC42MTMzIDUxLjEzMjggMjIuMzZDNTEuMTMyOCAyNC4xIDUwLjU1OTQgMjUuNTkgNDkuNDEyOCAyNi44M0M0OC4yNTk1IDI4LjA3NjYgNDYuODI5NSAyOC43IDQ1LjEyMjggMjguN0M0My40MjI4IDI4LjcgNDIuMDAyOCAyOC4wODMzIDQwLjg2MjggMjYuODVDMzkuNzI5NSAyNS42MjMzIDM5LjE2MjggMjQuMTM2NiAzOS4xNjI4IDIyLjM5QzM5LjE2MjggMjAuNjUgMzkuNzM2MSAxOS4xNiA0MC44ODI4IDE3LjkyQzQyLjAzNjEgMTYuNjczMyA0My40NjI4IDE2LjA1IDQ1LjE2MjggMTYuMDVDNDYuODY5NCAxNi4wNSA0OC4yOTI4IDE2LjY2NjcgNDkuNDMyOCAxNy45TTQ2Ljg1MjggMjQuNTJDNDYuODUyOCAyNC41MiA0Ni45NTk1IDI0LjM4MzMgNDcuMTcyOCAyNC4xMUM0Ny4zNzk1IDIzLjgzNjcgNDcuNDgyOCAyMy4zMDMzIDQ3LjQ4MjggMjIuNTFDNDcuNDgyOCAyMS43MTY3IDQ3LjI1OTUgMjEuMDUgNDYuODEyOCAyMC41MUM0Ni4zNjYxIDE5Ljk3IDQ1LjgxNjIgMTkuNyA0NS4xNjI4IDE5LjdDNDQuNTE2MSAxOS43IDQzLjk4MjggMTkuOTcgNDMuNTYyOCAyMC41MUM0My4xNDI4IDIxLjA1IDQyLjkzMjggMjEuNzE2NyA0Mi45MzI4IDIyLjUxQzQyLjkzMjggMjMuMzAzMyA0My4xNTYxIDIzLjk3MzMgNDMuNjAyOCAyNC41MkM0NC4wNDk0IDI1LjA2IDQ0LjU5NjEgMjUuMzMgNDUuMjQyOCAyNS4zM0M0NS44ODk1IDI1LjMzIDQ2LjQyNjEgMjUuMDYgNDYuODUyOCAyNC41MlpcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPjwvc3ZnPmA7IiwiaW1wb3J0IHsgQXBwLCBFZGl0b3JQb3NpdGlvbiwgRWRpdG9yUmFuZ2VPckNhcmV0LCBFZGl0b3JUcmFuc2FjdGlvbiwgTWFya2Rvd25WaWV3IH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQgeyBlc2NhcGVSZWdFeHAgfSBmcm9tIFwiVXRpbHNcIjtcblxuZXhwb3J0IGNsYXNzIEN1cnNvckp1bXBlciB7XG4gICAgcHJpdmF0ZSBjdXJzb3JfcmVnZXg6IFJlZ0V4cCA9IG5ldyBSZWdFeHAoXCI8JVxcXFxzKnRwLmZpbGUuY3Vyc29yXFxcXCgoPzxvcmRlcj5bMC05XXswLDJ9KVxcXFwpXFxcXHMqJT5cIiwgXCJnXCIpO1x0XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGFwcDogQXBwKSB7fVxuXG4gICAgYXN5bmMganVtcF90b19uZXh0X2N1cnNvcl9sb2NhdGlvbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgYWN0aXZlX3ZpZXcgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpO1xuICAgICAgICBpZiAoIWFjdGl2ZV92aWV3KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWN0aXZlX2ZpbGUgPSBhY3RpdmVfdmlldy5maWxlO1xuICAgICAgICBhd2FpdCBhY3RpdmVfdmlldy5zYXZlKCk7XG5cbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMuYXBwLnZhdWx0LnJlYWQoYWN0aXZlX2ZpbGUpO1xuXG4gICAgICAgIGNvbnN0IHtuZXdfY29udGVudCwgcG9zaXRpb25zfSA9IHRoaXMucmVwbGFjZV9hbmRfZ2V0X2N1cnNvcl9wb3NpdGlvbnMoY29udGVudCk7XG4gICAgICAgIGlmIChwb3NpdGlvbnMpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYXBwLnZhdWx0Lm1vZGlmeShhY3RpdmVfZmlsZSwgbmV3X2NvbnRlbnQpO1xuICAgICAgICAgICAgdGhpcy5zZXRfY3Vyc29yX2xvY2F0aW9uKHBvc2l0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRfZWRpdG9yX3Bvc2l0aW9uX2Zyb21faW5kZXgoY29udGVudDogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogRWRpdG9yUG9zaXRpb24ge1xuICAgICAgICBjb25zdCBzdWJzdHIgPSBjb250ZW50LnN1YnN0cigwLCBpbmRleCk7XG5cbiAgICAgICAgbGV0IGwgPSAwO1xuICAgICAgICBsZXQgb2Zmc2V0ID0gLTE7XG4gICAgICAgIGxldCByID0gLTE7XG4gICAgICAgIGZvciAoOyAociA9IHN1YnN0ci5pbmRleE9mKFwiXFxuXCIsIHIrMSkpICE9PSAtMSA7IGwrKywgb2Zmc2V0PXIpO1xuICAgICAgICBvZmZzZXQgKz0gMTtcblxuICAgICAgICBjb25zdCBjaCA9IGNvbnRlbnQuc3Vic3RyKG9mZnNldCwgaW5kZXgtb2Zmc2V0KS5sZW5ndGg7XG5cbiAgICAgICAgcmV0dXJuIHtsaW5lOiBsLCBjaDogY2h9O1xuICAgIH1cblxuICAgIHJlcGxhY2VfYW5kX2dldF9jdXJzb3JfcG9zaXRpb25zKGNvbnRlbnQ6IHN0cmluZyk6IHtuZXdfY29udGVudD86IHN0cmluZywgcG9zaXRpb25zPzogRWRpdG9yUG9zaXRpb25bXX0ge1xuICAgICAgICBsZXQgY3Vyc29yX21hdGNoZXMgPSBbXTtcbiAgICAgICAgbGV0IG1hdGNoO1xuICAgICAgICB3aGlsZSgobWF0Y2ggPSB0aGlzLmN1cnNvcl9yZWdleC5leGVjKGNvbnRlbnQpKSAhPSBudWxsKSB7XG4gICAgICAgICAgICBjdXJzb3JfbWF0Y2hlcy5wdXNoKG1hdGNoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3Vyc29yX21hdGNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cblxuICAgICAgICBjdXJzb3JfbWF0Y2hlcy5zb3J0KChtMSwgbTIpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBOdW1iZXIobTEuZ3JvdXBzW1wib3JkZXJcIl0pIC0gTnVtYmVyKG0yLmdyb3Vwc1tcIm9yZGVyXCJdKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG1hdGNoX3N0ciA9IGN1cnNvcl9tYXRjaGVzWzBdWzBdO1xuXG4gICAgICAgIGN1cnNvcl9tYXRjaGVzID0gY3Vyc29yX21hdGNoZXMuZmlsdGVyKG0gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG1bMF0gPT09IG1hdGNoX3N0cjtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcG9zaXRpb25zID0gW107XG4gICAgICAgIGxldCBpbmRleF9vZmZzZXQgPSAwO1xuICAgICAgICBmb3IgKGxldCBtYXRjaCBvZiBjdXJzb3JfbWF0Y2hlcykge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBtYXRjaC5pbmRleCAtIGluZGV4X29mZnNldDtcbiAgICAgICAgICAgIHBvc2l0aW9ucy5wdXNoKHRoaXMuZ2V0X2VkaXRvcl9wb3NpdGlvbl9mcm9tX2luZGV4KGNvbnRlbnQsIGluZGV4KSk7XG5cbiAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UobmV3IFJlZ0V4cChlc2NhcGVSZWdFeHAobWF0Y2hbMF0pKSwgXCJcIik7XG4gICAgICAgICAgICBpbmRleF9vZmZzZXQgKz0gbWF0Y2hbMF0ubGVuZ3RoO1xuXG4gICAgICAgICAgICAvLyBGb3IgdHAuZmlsZS5jdXJzb3IoKSwgd2Uga2VlcCB0aGUgZGVmYXVsdCB0b3AgdG8gYm90dG9tXG4gICAgICAgICAgICBpZiAobWF0Y2hbMV0gPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7bmV3X2NvbnRlbnQ6IGNvbnRlbnQsIHBvc2l0aW9uczogcG9zaXRpb25zfTtcbiAgICB9XG5cbiAgICBzZXRfY3Vyc29yX2xvY2F0aW9uKHBvc2l0aW9uczogRWRpdG9yUG9zaXRpb25bXSk6IHZvaWQge1xuICAgICAgICBjb25zdCBhY3RpdmVfdmlldyA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldyk7XG4gICAgICAgIGlmICghYWN0aXZlX3ZpZXcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVkaXRvciA9IGFjdGl2ZV92aWV3LmVkaXRvcjtcbiAgICAgICAgZWRpdG9yLmZvY3VzKCk7XG5cbiAgICAgICAgbGV0IHNlbGVjdGlvbnM6IEFycmF5PEVkaXRvclJhbmdlT3JDYXJldD4gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgcG9zIG9mIHBvc2l0aW9ucykge1xuICAgICAgICAgICAgc2VsZWN0aW9ucy5wdXNoKHtmcm9tOiBwb3N9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0cmFuc2FjdGlvbjogRWRpdG9yVHJhbnNhY3Rpb24gPSB7XG4gICAgICAgICAgICBzZWxlY3Rpb25zOiBzZWxlY3Rpb25zXG4gICAgICAgIH07XG4gICAgICAgIGVkaXRvci50cmFuc2FjdGlvbih0cmFuc2FjdGlvbik7XG4gICAgfVxufSIsImltcG9ydCB7IGV4aXN0c1N5bmMsIHJlYWRGaWxlU3luYyB9IGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcblxyXG52YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcclxuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfTtcclxuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59O1xuXG5mdW5jdGlvbiBzZXRQcm90b3R5cGVPZihvYmosIHByb3RvKSB7XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgIGlmIChPYmplY3Quc2V0UHJvdG90eXBlT2YpIHtcclxuICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2Yob2JqLCBwcm90byk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBvYmouX19wcm90b19fID0gcHJvdG87XHJcbiAgICB9XHJcbn1cclxuLy8gVGhpcyBpcyBwcmV0dHkgbXVjaCB0aGUgb25seSB3YXkgdG8gZ2V0IG5pY2UsIGV4dGVuZGVkIEVycm9yc1xyXG4vLyB3aXRob3V0IHVzaW5nIEVTNlxyXG4vKipcclxuICogVGhpcyByZXR1cm5zIGEgbmV3IEVycm9yIHdpdGggYSBjdXN0b20gcHJvdG90eXBlLiBOb3RlIHRoYXQgaXQncyBfbm90XyBhIGNvbnN0cnVjdG9yXHJcbiAqXHJcbiAqIEBwYXJhbSBtZXNzYWdlIEVycm9yIG1lc3NhZ2VcclxuICpcclxuICogKipFeGFtcGxlKipcclxuICpcclxuICogYGBganNcclxuICogdGhyb3cgRXRhRXJyKFwidGVtcGxhdGUgbm90IGZvdW5kXCIpXHJcbiAqIGBgYFxyXG4gKi9cclxuZnVuY3Rpb24gRXRhRXJyKG1lc3NhZ2UpIHtcclxuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IobWVzc2FnZSk7XHJcbiAgICBzZXRQcm90b3R5cGVPZihlcnIsIEV0YUVyci5wcm90b3R5cGUpO1xyXG4gICAgcmV0dXJuIGVycjtcclxufVxyXG5FdGFFcnIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUsIHtcclxuICAgIG5hbWU6IHsgdmFsdWU6ICdFdGEgRXJyb3InLCBlbnVtZXJhYmxlOiBmYWxzZSB9XHJcbn0pO1xyXG4vKipcclxuICogVGhyb3dzIGFuIEV0YUVyciB3aXRoIGEgbmljZWx5IGZvcm1hdHRlZCBlcnJvciBhbmQgbWVzc2FnZSBzaG93aW5nIHdoZXJlIGluIHRoZSB0ZW1wbGF0ZSB0aGUgZXJyb3Igb2NjdXJyZWQuXHJcbiAqL1xyXG5mdW5jdGlvbiBQYXJzZUVycihtZXNzYWdlLCBzdHIsIGluZHgpIHtcclxuICAgIHZhciB3aGl0ZXNwYWNlID0gc3RyLnNsaWNlKDAsIGluZHgpLnNwbGl0KC9cXG4vKTtcclxuICAgIHZhciBsaW5lTm8gPSB3aGl0ZXNwYWNlLmxlbmd0aDtcclxuICAgIHZhciBjb2xObyA9IHdoaXRlc3BhY2VbbGluZU5vIC0gMV0ubGVuZ3RoICsgMTtcclxuICAgIG1lc3NhZ2UgKz1cclxuICAgICAgICAnIGF0IGxpbmUgJyArXHJcbiAgICAgICAgICAgIGxpbmVObyArXHJcbiAgICAgICAgICAgICcgY29sICcgK1xyXG4gICAgICAgICAgICBjb2xObyArXHJcbiAgICAgICAgICAgICc6XFxuXFxuJyArXHJcbiAgICAgICAgICAgICcgICcgK1xyXG4gICAgICAgICAgICBzdHIuc3BsaXQoL1xcbi8pW2xpbmVObyAtIDFdICtcclxuICAgICAgICAgICAgJ1xcbicgK1xyXG4gICAgICAgICAgICAnICAnICtcclxuICAgICAgICAgICAgQXJyYXkoY29sTm8pLmpvaW4oJyAnKSArXHJcbiAgICAgICAgICAgICdeJztcclxuICAgIHRocm93IEV0YUVycihtZXNzYWdlKTtcclxufVxuXG4vKipcclxuICogQHJldHVybnMgVGhlIGdsb2JhbCBQcm9taXNlIGZ1bmN0aW9uXHJcbiAqL1xyXG52YXIgcHJvbWlzZUltcGwgPSBuZXcgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKS5Qcm9taXNlO1xyXG4vKipcclxuICogQHJldHVybnMgQSBuZXcgQXN5bmNGdW5jdGlvbiBjb25zdHVjdG9yXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRBc3luY0Z1bmN0aW9uQ29uc3RydWN0b3IoKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb24oJ3JldHVybiAoYXN5bmMgZnVuY3Rpb24oKXt9KS5jb25zdHJ1Y3RvcicpKCk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3ludGF4RXJyb3IpIHtcclxuICAgICAgICAgICAgdGhyb3cgRXRhRXJyKFwiVGhpcyBlbnZpcm9ubWVudCBkb2Vzbid0IHN1cHBvcnQgYXN5bmMvYXdhaXRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4vKipcclxuICogc3RyLnRyaW1MZWZ0IHBvbHlmaWxsXHJcbiAqXHJcbiAqIEBwYXJhbSBzdHIgLSBJbnB1dCBzdHJpbmdcclxuICogQHJldHVybnMgVGhlIHN0cmluZyB3aXRoIGxlZnQgd2hpdGVzcGFjZSByZW1vdmVkXHJcbiAqXHJcbiAqL1xyXG5mdW5jdGlvbiB0cmltTGVmdChzdHIpIHtcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1leHRyYS1ib29sZWFuLWNhc3RcclxuICAgIGlmICghIVN0cmluZy5wcm90b3R5cGUudHJpbUxlZnQpIHtcclxuICAgICAgICByZXR1cm4gc3RyLnRyaW1MZWZ0KCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICByZXR1cm4gc3RyLnJlcGxhY2UoL15cXHMrLywgJycpO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBzdHIudHJpbVJpZ2h0IHBvbHlmaWxsXHJcbiAqXHJcbiAqIEBwYXJhbSBzdHIgLSBJbnB1dCBzdHJpbmdcclxuICogQHJldHVybnMgVGhlIHN0cmluZyB3aXRoIHJpZ2h0IHdoaXRlc3BhY2UgcmVtb3ZlZFxyXG4gKlxyXG4gKi9cclxuZnVuY3Rpb24gdHJpbVJpZ2h0KHN0cikge1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWV4dHJhLWJvb2xlYW4tY2FzdFxyXG4gICAgaWYgKCEhU3RyaW5nLnByb3RvdHlwZS50cmltUmlnaHQpIHtcclxuICAgICAgICByZXR1cm4gc3RyLnRyaW1SaWdodCgpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9cXHMrJC8sICcnKTsgLy8gVE9ETzogZG8gd2UgcmVhbGx5IG5lZWQgdG8gcmVwbGFjZSBCT00ncz9cclxuICAgIH1cclxufVxuXG4vLyBUT0RPOiBhbGxvdyAnLScgdG8gdHJpbSB1cCB1bnRpbCBuZXdsaW5lLiBVc2UgW15cXFNcXG5cXHJdIGluc3RlYWQgb2YgXFxzXHJcbi8qIEVORCBUWVBFUyAqL1xyXG5mdW5jdGlvbiBoYXNPd25Qcm9wKG9iaiwgcHJvcCkge1xyXG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApO1xyXG59XHJcbmZ1bmN0aW9uIGNvcHlQcm9wcyh0b09iaiwgZnJvbU9iaikge1xyXG4gICAgZm9yICh2YXIga2V5IGluIGZyb21PYmopIHtcclxuICAgICAgICBpZiAoaGFzT3duUHJvcChmcm9tT2JqLCBrZXkpKSB7XHJcbiAgICAgICAgICAgIHRvT2JqW2tleV0gPSBmcm9tT2JqW2tleV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRvT2JqO1xyXG59XHJcbi8qKlxyXG4gKiBUYWtlcyBhIHN0cmluZyB3aXRoaW4gYSB0ZW1wbGF0ZSBhbmQgdHJpbXMgaXQsIGJhc2VkIG9uIHRoZSBwcmVjZWRpbmcgdGFnJ3Mgd2hpdGVzcGFjZSBjb250cm9sIGFuZCBgY29uZmlnLmF1dG9UcmltYFxyXG4gKi9cclxuZnVuY3Rpb24gdHJpbVdTKHN0ciwgY29uZmlnLCB3c0xlZnQsIHdzUmlnaHQpIHtcclxuICAgIHZhciBsZWZ0VHJpbTtcclxuICAgIHZhciByaWdodFRyaW07XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjb25maWcuYXV0b1RyaW0pKSB7XHJcbiAgICAgICAgLy8ga2luZGEgY29uZnVzaW5nXHJcbiAgICAgICAgLy8gYnV0IF99fSB3aWxsIHRyaW0gdGhlIGxlZnQgc2lkZSBvZiB0aGUgZm9sbG93aW5nIHN0cmluZ1xyXG4gICAgICAgIGxlZnRUcmltID0gY29uZmlnLmF1dG9UcmltWzFdO1xyXG4gICAgICAgIHJpZ2h0VHJpbSA9IGNvbmZpZy5hdXRvVHJpbVswXTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGxlZnRUcmltID0gcmlnaHRUcmltID0gY29uZmlnLmF1dG9UcmltO1xyXG4gICAgfVxyXG4gICAgaWYgKHdzTGVmdCB8fCB3c0xlZnQgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgbGVmdFRyaW0gPSB3c0xlZnQ7XHJcbiAgICB9XHJcbiAgICBpZiAod3NSaWdodCB8fCB3c1JpZ2h0ID09PSBmYWxzZSkge1xyXG4gICAgICAgIHJpZ2h0VHJpbSA9IHdzUmlnaHQ7XHJcbiAgICB9XHJcbiAgICBpZiAoIXJpZ2h0VHJpbSAmJiAhbGVmdFRyaW0pIHtcclxuICAgICAgICByZXR1cm4gc3RyO1xyXG4gICAgfVxyXG4gICAgaWYgKGxlZnRUcmltID09PSAnc2x1cnAnICYmIHJpZ2h0VHJpbSA9PT0gJ3NsdXJwJykge1xyXG4gICAgICAgIHJldHVybiBzdHIudHJpbSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKGxlZnRUcmltID09PSAnXycgfHwgbGVmdFRyaW0gPT09ICdzbHVycCcpIHtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZygndHJpbW1pbmcgbGVmdCcgKyBsZWZ0VHJpbSlcclxuICAgICAgICAvLyBmdWxsIHNsdXJwXHJcbiAgICAgICAgc3RyID0gdHJpbUxlZnQoc3RyKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGxlZnRUcmltID09PSAnLScgfHwgbGVmdFRyaW0gPT09ICdubCcpIHtcclxuICAgICAgICAvLyBubCB0cmltXHJcbiAgICAgICAgc3RyID0gc3RyLnJlcGxhY2UoL14oPzpcXHJcXG58XFxufFxccikvLCAnJyk7XHJcbiAgICB9XHJcbiAgICBpZiAocmlnaHRUcmltID09PSAnXycgfHwgcmlnaHRUcmltID09PSAnc2x1cnAnKSB7XHJcbiAgICAgICAgLy8gZnVsbCBzbHVycFxyXG4gICAgICAgIHN0ciA9IHRyaW1SaWdodChzdHIpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAocmlnaHRUcmltID09PSAnLScgfHwgcmlnaHRUcmltID09PSAnbmwnKSB7XHJcbiAgICAgICAgLy8gbmwgdHJpbVxyXG4gICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKC8oPzpcXHJcXG58XFxufFxccikkLywgJycpOyAvLyBUT0RPOiBtYWtlIHN1cmUgdGhpcyBnZXRzIFxcclxcblxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN0cjtcclxufVxyXG4vKipcclxuICogQSBtYXAgb2Ygc3BlY2lhbCBIVE1MIGNoYXJhY3RlcnMgdG8gdGhlaXIgWE1MLWVzY2FwZWQgZXF1aXZhbGVudHNcclxuICovXHJcbnZhciBlc2NNYXAgPSB7XHJcbiAgICAnJic6ICcmYW1wOycsXHJcbiAgICAnPCc6ICcmbHQ7JyxcclxuICAgICc+JzogJyZndDsnLFxyXG4gICAgJ1wiJzogJyZxdW90OycsXHJcbiAgICBcIidcIjogJyYjMzk7J1xyXG59O1xyXG5mdW5jdGlvbiByZXBsYWNlQ2hhcihzKSB7XHJcbiAgICByZXR1cm4gZXNjTWFwW3NdO1xyXG59XHJcbi8qKlxyXG4gKiBYTUwtZXNjYXBlcyBhbiBpbnB1dCB2YWx1ZSBhZnRlciBjb252ZXJ0aW5nIGl0IHRvIGEgc3RyaW5nXHJcbiAqXHJcbiAqIEBwYXJhbSBzdHIgLSBJbnB1dCB2YWx1ZSAodXN1YWxseSBhIHN0cmluZylcclxuICogQHJldHVybnMgWE1MLWVzY2FwZWQgc3RyaW5nXHJcbiAqL1xyXG5mdW5jdGlvbiBYTUxFc2NhcGUoc3RyKSB7XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgIC8vIFRvIGRlYWwgd2l0aCBYU1MuIEJhc2VkIG9uIEVzY2FwZSBpbXBsZW1lbnRhdGlvbnMgb2YgTXVzdGFjaGUuSlMgYW5kIE1hcmtvLCB0aGVuIGN1c3RvbWl6ZWQuXHJcbiAgICB2YXIgbmV3U3RyID0gU3RyaW5nKHN0cik7XHJcbiAgICBpZiAoL1smPD5cIiddLy50ZXN0KG5ld1N0cikpIHtcclxuICAgICAgICByZXR1cm4gbmV3U3RyLnJlcGxhY2UoL1smPD5cIiddL2csIHJlcGxhY2VDaGFyKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBuZXdTdHI7XHJcbiAgICB9XHJcbn1cblxuLyogRU5EIFRZUEVTICovXHJcbnZhciB0ZW1wbGF0ZUxpdFJlZyA9IC9gKD86XFxcXFtcXHNcXFNdfFxcJHsoPzpbXnt9XXx7KD86W157fV18e1tefV0qfSkqfSkqfXwoPyFcXCR7KVteXFxcXGBdKSpgL2c7XHJcbnZhciBzaW5nbGVRdW90ZVJlZyA9IC8nKD86XFxcXFtcXHNcXHdcIidcXFxcYF18W15cXG5cXHInXFxcXF0pKj8nL2c7XHJcbnZhciBkb3VibGVRdW90ZVJlZyA9IC9cIig/OlxcXFxbXFxzXFx3XCInXFxcXGBdfFteXFxuXFxyXCJcXFxcXSkqP1wiL2c7XHJcbi8qKiBFc2NhcGUgc3BlY2lhbCByZWd1bGFyIGV4cHJlc3Npb24gY2hhcmFjdGVycyBpbnNpZGUgYSBzdHJpbmcgKi9cclxuZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHN0cmluZykge1xyXG4gICAgLy8gRnJvbSBNRE5cclxuICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvWy4qK1xcLT9eJHt9KCl8W1xcXVxcXFxdL2csICdcXFxcJCYnKTsgLy8gJCYgbWVhbnMgdGhlIHdob2xlIG1hdGNoZWQgc3RyaW5nXHJcbn1cclxuZnVuY3Rpb24gcGFyc2Uoc3RyLCBjb25maWcpIHtcclxuICAgIHZhciBidWZmZXIgPSBbXTtcclxuICAgIHZhciB0cmltTGVmdE9mTmV4dFN0ciA9IGZhbHNlO1xyXG4gICAgdmFyIGxhc3RJbmRleCA9IDA7XHJcbiAgICB2YXIgcGFyc2VPcHRpb25zID0gY29uZmlnLnBhcnNlO1xyXG4gICAgaWYgKGNvbmZpZy5wbHVnaW5zKSB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25maWcucGx1Z2lucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgcGx1Z2luID0gY29uZmlnLnBsdWdpbnNbaV07XHJcbiAgICAgICAgICAgIGlmIChwbHVnaW4ucHJvY2Vzc1RlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgICAgICBzdHIgPSBwbHVnaW4ucHJvY2Vzc1RlbXBsYXRlKHN0ciwgY29uZmlnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qIEFkZGluZyBmb3IgRUpTIGNvbXBhdGliaWxpdHkgKi9cclxuICAgIGlmIChjb25maWcucm1XaGl0ZXNwYWNlKSB7XHJcbiAgICAgICAgLy8gQ29kZSB0YWtlbiBkaXJlY3RseSBmcm9tIEVKU1xyXG4gICAgICAgIC8vIEhhdmUgdG8gdXNlIHR3byBzZXBhcmF0ZSByZXBsYWNlcyBoZXJlIGFzIGBeYCBhbmQgYCRgIG9wZXJhdG9ycyBkb24ndFxyXG4gICAgICAgIC8vIHdvcmsgd2VsbCB3aXRoIGBcXHJgIGFuZCBlbXB0eSBsaW5lcyBkb24ndCB3b3JrIHdlbGwgd2l0aCB0aGUgYG1gIGZsYWcuXHJcbiAgICAgICAgLy8gRXNzZW50aWFsbHksIHRoaXMgcmVwbGFjZXMgdGhlIHdoaXRlc3BhY2UgYXQgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mXHJcbiAgICAgICAgLy8gZWFjaCBsaW5lIGFuZCByZW1vdmVzIG11bHRpcGxlIG5ld2xpbmVzLlxyXG4gICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9bXFxyXFxuXSsvZywgJ1xcbicpLnJlcGxhY2UoL15cXHMrfFxccyskL2dtLCAnJyk7XHJcbiAgICB9XHJcbiAgICAvKiBFbmQgcm1XaGl0ZXNwYWNlIG9wdGlvbiAqL1xyXG4gICAgdGVtcGxhdGVMaXRSZWcubGFzdEluZGV4ID0gMDtcclxuICAgIHNpbmdsZVF1b3RlUmVnLmxhc3RJbmRleCA9IDA7XHJcbiAgICBkb3VibGVRdW90ZVJlZy5sYXN0SW5kZXggPSAwO1xyXG4gICAgZnVuY3Rpb24gcHVzaFN0cmluZyhzdHJuZywgc2hvdWxkVHJpbVJpZ2h0T2ZTdHJpbmcpIHtcclxuICAgICAgICBpZiAoc3RybmcpIHtcclxuICAgICAgICAgICAgLy8gaWYgc3RyaW5nIGlzIHRydXRoeSBpdCBtdXN0IGJlIG9mIHR5cGUgJ3N0cmluZydcclxuICAgICAgICAgICAgc3RybmcgPSB0cmltV1Moc3RybmcsIGNvbmZpZywgdHJpbUxlZnRPZk5leHRTdHIsIC8vIHRoaXMgd2lsbCBvbmx5IGJlIGZhbHNlIG9uIHRoZSBmaXJzdCBzdHIsIHRoZSBuZXh0IG9uZXMgd2lsbCBiZSBudWxsIG9yIHVuZGVmaW5lZFxyXG4gICAgICAgICAgICBzaG91bGRUcmltUmlnaHRPZlN0cmluZyk7XHJcbiAgICAgICAgICAgIGlmIChzdHJuZykge1xyXG4gICAgICAgICAgICAgICAgLy8gcmVwbGFjZSBcXCB3aXRoIFxcXFwsICcgd2l0aCBcXCdcclxuICAgICAgICAgICAgICAgIC8vIHdlJ3JlIGdvaW5nIHRvIGNvbnZlcnQgYWxsIENSTEYgdG8gTEYgc28gaXQgZG9lc24ndCB0YWtlIG1vcmUgdGhhbiBvbmUgcmVwbGFjZVxyXG4gICAgICAgICAgICAgICAgc3RybmcgPSBzdHJuZy5yZXBsYWNlKC9cXFxcfCcvZywgJ1xcXFwkJicpLnJlcGxhY2UoL1xcclxcbnxcXG58XFxyL2csICdcXFxcbicpO1xyXG4gICAgICAgICAgICAgICAgYnVmZmVyLnB1c2goc3RybmcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgdmFyIHByZWZpeGVzID0gW3BhcnNlT3B0aW9ucy5leGVjLCBwYXJzZU9wdGlvbnMuaW50ZXJwb2xhdGUsIHBhcnNlT3B0aW9ucy5yYXddLnJlZHVjZShmdW5jdGlvbiAoYWNjdW11bGF0b3IsIHByZWZpeCkge1xyXG4gICAgICAgIGlmIChhY2N1bXVsYXRvciAmJiBwcmVmaXgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yICsgJ3wnICsgZXNjYXBlUmVnRXhwKHByZWZpeCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHByZWZpeCkge1xyXG4gICAgICAgICAgICAvLyBhY2N1bXVsYXRvciBpcyBmYWxzeVxyXG4gICAgICAgICAgICByZXR1cm4gZXNjYXBlUmVnRXhwKHByZWZpeCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBwcmVmaXggYW5kIGFjY3VtdWxhdG9yIGFyZSBib3RoIGZhbHN5XHJcbiAgICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcclxuICAgICAgICB9XHJcbiAgICB9LCAnJyk7XHJcbiAgICB2YXIgcGFyc2VPcGVuUmVnID0gbmV3IFJlZ0V4cCgnKFteXSo/KScgKyBlc2NhcGVSZWdFeHAoY29uZmlnLnRhZ3NbMF0pICsgJygtfF8pP1xcXFxzKignICsgcHJlZml4ZXMgKyAnKT9cXFxccyooPyFbXFxcXHMrXFxcXC1fJyArIHByZWZpeGVzICsgJ10pJywgJ2cnKTtcclxuICAgIHZhciBwYXJzZUNsb3NlUmVnID0gbmV3IFJlZ0V4cCgnXFwnfFwifGB8XFxcXC9cXFxcKnwoXFxcXHMqKC18Xyk/JyArIGVzY2FwZVJlZ0V4cChjb25maWcudGFnc1sxXSkgKyAnKScsICdnJyk7XHJcbiAgICAvLyBUT0RPOiBiZW5jaG1hcmsgaGF2aW5nIHRoZSBcXHMqIG9uIGVpdGhlciBzaWRlIHZzIHVzaW5nIHN0ci50cmltKClcclxuICAgIHZhciBtO1xyXG4gICAgd2hpbGUgKChtID0gcGFyc2VPcGVuUmVnLmV4ZWMoc3RyKSkpIHtcclxuICAgICAgICBsYXN0SW5kZXggPSBtWzBdLmxlbmd0aCArIG0uaW5kZXg7XHJcbiAgICAgICAgdmFyIHByZWNlZGluZ1N0cmluZyA9IG1bMV07XHJcbiAgICAgICAgdmFyIHdzTGVmdCA9IG1bMl07XHJcbiAgICAgICAgdmFyIHByZWZpeCA9IG1bM10gfHwgJyc7IC8vIGJ5IGRlZmF1bHQgZWl0aGVyIH4sID0sIG9yIGVtcHR5XHJcbiAgICAgICAgcHVzaFN0cmluZyhwcmVjZWRpbmdTdHJpbmcsIHdzTGVmdCk7XHJcbiAgICAgICAgcGFyc2VDbG9zZVJlZy5sYXN0SW5kZXggPSBsYXN0SW5kZXg7XHJcbiAgICAgICAgdmFyIGNsb3NlVGFnID0gdm9pZCAwO1xyXG4gICAgICAgIHZhciBjdXJyZW50T2JqID0gZmFsc2U7XHJcbiAgICAgICAgd2hpbGUgKChjbG9zZVRhZyA9IHBhcnNlQ2xvc2VSZWcuZXhlYyhzdHIpKSkge1xyXG4gICAgICAgICAgICBpZiAoY2xvc2VUYWdbMV0pIHtcclxuICAgICAgICAgICAgICAgIHZhciBjb250ZW50ID0gc3RyLnNsaWNlKGxhc3RJbmRleCwgY2xvc2VUYWcuaW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgcGFyc2VPcGVuUmVnLmxhc3RJbmRleCA9IGxhc3RJbmRleCA9IHBhcnNlQ2xvc2VSZWcubGFzdEluZGV4O1xyXG4gICAgICAgICAgICAgICAgdHJpbUxlZnRPZk5leHRTdHIgPSBjbG9zZVRhZ1syXTtcclxuICAgICAgICAgICAgICAgIHZhciBjdXJyZW50VHlwZSA9IHByZWZpeCA9PT0gcGFyc2VPcHRpb25zLmV4ZWNcclxuICAgICAgICAgICAgICAgICAgICA/ICdlJ1xyXG4gICAgICAgICAgICAgICAgICAgIDogcHJlZml4ID09PSBwYXJzZU9wdGlvbnMucmF3XHJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ3InXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogcHJlZml4ID09PSBwYXJzZU9wdGlvbnMuaW50ZXJwb2xhdGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ2knXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICcnO1xyXG4gICAgICAgICAgICAgICAgY3VycmVudE9iaiA9IHsgdDogY3VycmVudFR5cGUsIHZhbDogY29udGVudCB9O1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgY2hhciA9IGNsb3NlVGFnWzBdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNoYXIgPT09ICcvKicpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgY29tbWVudENsb3NlSW5kID0gc3RyLmluZGV4T2YoJyovJywgcGFyc2VDbG9zZVJlZy5sYXN0SW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21tZW50Q2xvc2VJbmQgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlRXJyKCd1bmNsb3NlZCBjb21tZW50Jywgc3RyLCBjbG9zZVRhZy5pbmRleCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlQ2xvc2VSZWcubGFzdEluZGV4ID0gY29tbWVudENsb3NlSW5kO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY2hhciA9PT0gXCInXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBzaW5nbGVRdW90ZVJlZy5sYXN0SW5kZXggPSBjbG9zZVRhZy5pbmRleDtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgc2luZ2xlUXVvdGVNYXRjaCA9IHNpbmdsZVF1b3RlUmVnLmV4ZWMoc3RyKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2luZ2xlUXVvdGVNYXRjaCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUNsb3NlUmVnLmxhc3RJbmRleCA9IHNpbmdsZVF1b3RlUmVnLmxhc3RJbmRleDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlRXJyKCd1bmNsb3NlZCBzdHJpbmcnLCBzdHIsIGNsb3NlVGFnLmluZGV4KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjaGFyID09PSAnXCInKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZG91YmxlUXVvdGVSZWcubGFzdEluZGV4ID0gY2xvc2VUYWcuaW5kZXg7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRvdWJsZVF1b3RlTWF0Y2ggPSBkb3VibGVRdW90ZVJlZy5leGVjKHN0cik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRvdWJsZVF1b3RlTWF0Y2gpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VDbG9zZVJlZy5sYXN0SW5kZXggPSBkb3VibGVRdW90ZVJlZy5sYXN0SW5kZXg7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBQYXJzZUVycigndW5jbG9zZWQgc3RyaW5nJywgc3RyLCBjbG9zZVRhZy5pbmRleCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY2hhciA9PT0gJ2AnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVMaXRSZWcubGFzdEluZGV4ID0gY2xvc2VUYWcuaW5kZXg7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRlbXBsYXRlTGl0TWF0Y2ggPSB0ZW1wbGF0ZUxpdFJlZy5leGVjKHN0cik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlTGl0TWF0Y2gpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VDbG9zZVJlZy5sYXN0SW5kZXggPSB0ZW1wbGF0ZUxpdFJlZy5sYXN0SW5kZXg7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBQYXJzZUVycigndW5jbG9zZWQgc3RyaW5nJywgc3RyLCBjbG9zZVRhZy5pbmRleCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjdXJyZW50T2JqKSB7XHJcbiAgICAgICAgICAgIGJ1ZmZlci5wdXNoKGN1cnJlbnRPYmopO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgUGFyc2VFcnIoJ3VuY2xvc2VkIHRhZycsIHN0ciwgbS5pbmRleCArIHByZWNlZGluZ1N0cmluZy5sZW5ndGgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHB1c2hTdHJpbmcoc3RyLnNsaWNlKGxhc3RJbmRleCwgc3RyLmxlbmd0aCksIGZhbHNlKTtcclxuICAgIGlmIChjb25maWcucGx1Z2lucykge1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29uZmlnLnBsdWdpbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIHBsdWdpbiA9IGNvbmZpZy5wbHVnaW5zW2ldO1xyXG4gICAgICAgICAgICBpZiAocGx1Z2luLnByb2Nlc3NBU1QpIHtcclxuICAgICAgICAgICAgICAgIGJ1ZmZlciA9IHBsdWdpbi5wcm9jZXNzQVNUKGJ1ZmZlciwgY29uZmlnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBidWZmZXI7XHJcbn1cblxuLyogRU5EIFRZUEVTICovXHJcbi8qKlxyXG4gKiBDb21waWxlcyBhIHRlbXBsYXRlIHN0cmluZyB0byBhIGZ1bmN0aW9uIHN0cmluZy4gTW9zdCBvZnRlbiB1c2VycyBqdXN0IHVzZSBgY29tcGlsZSgpYCwgd2hpY2ggY2FsbHMgYGNvbXBpbGVUb1N0cmluZ2AgYW5kIGNyZWF0ZXMgYSBuZXcgZnVuY3Rpb24gdXNpbmcgdGhlIHJlc3VsdFxyXG4gKlxyXG4gKiAqKkV4YW1wbGUqKlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb21waWxlVG9TdHJpbmcoXCJIaSA8JT0gaXQudXNlciAlPlwiLCBldGEuY29uZmlnKVxyXG4gKiAvLyBcInZhciB0Uj0nJyxpbmNsdWRlPUUuaW5jbHVkZS5iaW5kKEUpLGluY2x1ZGVGaWxlPUUuaW5jbHVkZUZpbGUuYmluZChFKTt0Uis9J0hpICc7dFIrPUUuZShpdC51c2VyKTtpZihjYil7Y2IobnVsbCx0Uil9IHJldHVybiB0UlwiXHJcbiAqIGBgYFxyXG4gKi9cclxuZnVuY3Rpb24gY29tcGlsZVRvU3RyaW5nKHN0ciwgY29uZmlnKSB7XHJcbiAgICB2YXIgYnVmZmVyID0gcGFyc2Uoc3RyLCBjb25maWcpO1xyXG4gICAgdmFyIHJlcyA9IFwidmFyIHRSPScnLF9fbCxfX2xQXCIgK1xyXG4gICAgICAgIChjb25maWcuaW5jbHVkZSA/ICcsaW5jbHVkZT1FLmluY2x1ZGUuYmluZChFKScgOiAnJykgK1xyXG4gICAgICAgIChjb25maWcuaW5jbHVkZUZpbGUgPyAnLGluY2x1ZGVGaWxlPUUuaW5jbHVkZUZpbGUuYmluZChFKScgOiAnJykgK1xyXG4gICAgICAgICdcXG5mdW5jdGlvbiBsYXlvdXQocCxkKXtfX2w9cDtfX2xQPWR9XFxuJyArXHJcbiAgICAgICAgKGNvbmZpZy5nbG9iYWxBd2FpdCA/ICdjb25zdCBfcHJzID0gW107XFxuJyA6ICcnKSArXHJcbiAgICAgICAgKGNvbmZpZy51c2VXaXRoID8gJ3dpdGgoJyArIGNvbmZpZy52YXJOYW1lICsgJ3x8e30peycgOiAnJykgK1xyXG4gICAgICAgIGNvbXBpbGVTY29wZShidWZmZXIsIGNvbmZpZykgK1xyXG4gICAgICAgIChjb25maWcuaW5jbHVkZUZpbGVcclxuICAgICAgICAgICAgPyAnaWYoX19sKXRSPScgK1xyXG4gICAgICAgICAgICAgICAgKGNvbmZpZy5hc3luYyA/ICdhd2FpdCAnIDogJycpICtcclxuICAgICAgICAgICAgICAgIChcImluY2x1ZGVGaWxlKF9fbCxPYmplY3QuYXNzaWduKFwiICsgY29uZmlnLnZhck5hbWUgKyBcIix7Ym9keTp0Un0sX19sUCkpXFxuXCIpXHJcbiAgICAgICAgICAgIDogY29uZmlnLmluY2x1ZGVcclxuICAgICAgICAgICAgICAgID8gJ2lmKF9fbCl0Uj0nICtcclxuICAgICAgICAgICAgICAgICAgICAoY29uZmlnLmFzeW5jID8gJ2F3YWl0ICcgOiAnJykgK1xyXG4gICAgICAgICAgICAgICAgICAgIChcImluY2x1ZGUoX19sLE9iamVjdC5hc3NpZ24oXCIgKyBjb25maWcudmFyTmFtZSArIFwiLHtib2R5OnRSfSxfX2xQKSlcXG5cIilcclxuICAgICAgICAgICAgICAgIDogJycpICtcclxuICAgICAgICAnaWYoY2Ipe2NiKG51bGwsdFIpfSByZXR1cm4gdFInICtcclxuICAgICAgICAoY29uZmlnLnVzZVdpdGggPyAnfScgOiAnJyk7XHJcbiAgICBpZiAoY29uZmlnLnBsdWdpbnMpIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbmZpZy5wbHVnaW5zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBwbHVnaW4gPSBjb25maWcucGx1Z2luc1tpXTtcclxuICAgICAgICAgICAgaWYgKHBsdWdpbi5wcm9jZXNzRm5TdHJpbmcpIHtcclxuICAgICAgICAgICAgICAgIHJlcyA9IHBsdWdpbi5wcm9jZXNzRm5TdHJpbmcocmVzLCBjb25maWcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlcztcclxufVxyXG4vKipcclxuICogTG9vcHMgdGhyb3VnaCB0aGUgQVNUIGdlbmVyYXRlZCBieSBgcGFyc2VgIGFuZCB0cmFuc2Zvcm0gZWFjaCBpdGVtIGludG8gSlMgY2FsbHNcclxuICpcclxuICogKipFeGFtcGxlKipcclxuICpcclxuICogYGBganNcclxuICogLy8gQVNUIHZlcnNpb24gb2YgJ0hpIDwlPSBpdC51c2VyICU+J1xyXG4gKiBsZXQgdGVtcGxhdGVBU1QgPSBbJ0hpICcsIHsgdmFsOiAnaXQudXNlcicsIHQ6ICdpJyB9XVxyXG4gKiBjb21waWxlU2NvcGUodGVtcGxhdGVBU1QsIGV0YS5jb25maWcpXHJcbiAqIC8vIFwidFIrPSdIaSAnO3RSKz1FLmUoaXQudXNlcik7XCJcclxuICogYGBgXHJcbiAqL1xyXG5mdW5jdGlvbiBjb21waWxlU2NvcGUoYnVmZiwgY29uZmlnKSB7XHJcbiAgICB2YXIgaTtcclxuICAgIHZhciBidWZmTGVuZ3RoID0gYnVmZi5sZW5ndGg7XHJcbiAgICB2YXIgcmV0dXJuU3RyID0gJyc7XHJcbiAgICB2YXIgUkVQTEFDRU1FTlRfU1RSID0gXCJySjJLcVh6eFFnXCI7XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgYnVmZkxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgdmFyIGN1cnJlbnRCbG9jayA9IGJ1ZmZbaV07XHJcbiAgICAgICAgaWYgKHR5cGVvZiBjdXJyZW50QmxvY2sgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHZhciBzdHIgPSBjdXJyZW50QmxvY2s7XHJcbiAgICAgICAgICAgIC8vIHdlIGtub3cgc3RyaW5nIGV4aXN0c1xyXG4gICAgICAgICAgICByZXR1cm5TdHIgKz0gXCJ0Uis9J1wiICsgc3RyICsgXCInXFxuXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB2YXIgdHlwZSA9IGN1cnJlbnRCbG9jay50OyAvLyB+LCBzLCAhLCA/LCByXHJcbiAgICAgICAgICAgIHZhciBjb250ZW50ID0gY3VycmVudEJsb2NrLnZhbCB8fCAnJztcclxuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdyJykge1xyXG4gICAgICAgICAgICAgICAgLy8gcmF3XHJcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmdsb2JhbEF3YWl0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuU3RyICs9IFwiX3Bycy5wdXNoKFwiICsgY29udGVudCArIFwiKTtcXG5cIjtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5TdHIgKz0gXCJ0Uis9J1wiICsgUkVQTEFDRU1FTlRfU1RSICsgXCInXFxuXCI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmZpbHRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gJ0UuZmlsdGVyKCcgKyBjb250ZW50ICsgJyknO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5TdHIgKz0gJ3RSKz0nICsgY29udGVudCArICdcXG4nO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICdpJykge1xyXG4gICAgICAgICAgICAgICAgLy8gaW50ZXJwb2xhdGVcclxuICAgICAgICAgICAgICAgIGlmIChjb25maWcuZ2xvYmFsQXdhaXQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5TdHIgKz0gXCJfcHJzLnB1c2goXCIgKyBjb250ZW50ICsgXCIpO1xcblwiO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVyblN0ciArPSBcInRSKz0nXCIgKyBSRVBMQUNFTUVOVF9TVFIgKyBcIidcXG5cIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcuZmlsdGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSAnRS5maWx0ZXIoJyArIGNvbnRlbnQgKyAnKSc7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVyblN0ciArPSAndFIrPScgKyBjb250ZW50ICsgJ1xcbic7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5hdXRvRXNjYXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSAnRS5lKCcgKyBjb250ZW50ICsgJyknO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5TdHIgKz0gJ3RSKz0nICsgY29udGVudCArICdcXG4nO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICdlJykge1xyXG4gICAgICAgICAgICAgICAgLy8gZXhlY3V0ZVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuU3RyICs9IGNvbnRlbnQgKyAnXFxuJzsgLy8geW91IG5lZWQgYSBcXG4gaW4gY2FzZSB5b3UgaGF2ZSA8JSB9ICU+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoY29uZmlnLmdsb2JhbEF3YWl0KSB7XHJcbiAgICAgICAgcmV0dXJuU3RyICs9IFwiY29uc3QgX3JzdCA9IGF3YWl0IFByb21pc2UuYWxsKF9wcnMpO1xcbnRSID0gdFIucmVwbGFjZSgvXCIgKyBSRVBMQUNFTUVOVF9TVFIgKyBcIi9nLCAoKSA9PiBfcnN0LnNoaWZ0KCkpO1xcblwiO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJldHVyblN0cjtcclxufVxuXG4vKipcclxuICogSGFuZGxlcyBzdG9yYWdlIGFuZCBhY2Nlc3Npbmcgb2YgdmFsdWVzXHJcbiAqXHJcbiAqIEluIHRoaXMgY2FzZSwgd2UgdXNlIGl0IHRvIHN0b3JlIGNvbXBpbGVkIHRlbXBsYXRlIGZ1bmN0aW9uc1xyXG4gKiBJbmRleGVkIGJ5IHRoZWlyIGBuYW1lYCBvciBgZmlsZW5hbWVgXHJcbiAqL1xyXG52YXIgQ2FjaGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gQ2FjaGVyKGNhY2hlKSB7XHJcbiAgICAgICAgdGhpcy5jYWNoZSA9IGNhY2hlO1xyXG4gICAgfVxyXG4gICAgQ2FjaGVyLnByb3RvdHlwZS5kZWZpbmUgPSBmdW5jdGlvbiAoa2V5LCB2YWwpIHtcclxuICAgICAgICB0aGlzLmNhY2hlW2tleV0gPSB2YWw7XHJcbiAgICB9O1xyXG4gICAgQ2FjaGVyLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoa2V5KSB7XHJcbiAgICAgICAgLy8gc3RyaW5nIHwgYXJyYXkuXHJcbiAgICAgICAgLy8gVE9ETzogYWxsb3cgYXJyYXkgb2Yga2V5cyB0byBsb29rIGRvd25cclxuICAgICAgICAvLyBUT0RPOiBjcmVhdGUgcGx1Z2luIHRvIGFsbG93IHJlZmVyZW5jaW5nIGhlbHBlcnMsIGZpbHRlcnMgd2l0aCBkb3Qgbm90YXRpb25cclxuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZVtrZXldO1xyXG4gICAgfTtcclxuICAgIENhY2hlci5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKGtleSkge1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLmNhY2hlW2tleV07XHJcbiAgICB9O1xyXG4gICAgQ2FjaGVyLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLmNhY2hlID0ge307XHJcbiAgICB9O1xyXG4gICAgQ2FjaGVyLnByb3RvdHlwZS5sb2FkID0gZnVuY3Rpb24gKGNhY2hlT2JqKSB7XHJcbiAgICAgICAgY29weVByb3BzKHRoaXMuY2FjaGUsIGNhY2hlT2JqKTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gQ2FjaGVyO1xyXG59KCkpO1xuXG4vKiBFTkQgVFlQRVMgKi9cclxuLyoqXHJcbiAqIEV0YSdzIHRlbXBsYXRlIHN0b3JhZ2VcclxuICpcclxuICogU3RvcmVzIHBhcnRpYWxzIGFuZCBjYWNoZWQgdGVtcGxhdGVzXHJcbiAqL1xyXG52YXIgdGVtcGxhdGVzID0gbmV3IENhY2hlcih7fSk7XG5cbi8qIEVORCBUWVBFUyAqL1xyXG4vKipcclxuICogSW5jbHVkZSBhIHRlbXBsYXRlIGJhc2VkIG9uIGl0cyBuYW1lIChvciBmaWxlcGF0aCwgaWYgaXQncyBhbHJlYWR5IGJlZW4gY2FjaGVkKS5cclxuICpcclxuICogQ2FsbGVkIGxpa2UgYGluY2x1ZGUodGVtcGxhdGVOYW1lT3JQYXRoLCBkYXRhKWBcclxuICovXHJcbmZ1bmN0aW9uIGluY2x1ZGVIZWxwZXIodGVtcGxhdGVOYW1lT3JQYXRoLCBkYXRhKSB7XHJcbiAgICB2YXIgdGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlcy5nZXQodGVtcGxhdGVOYW1lT3JQYXRoKTtcclxuICAgIGlmICghdGVtcGxhdGUpIHtcclxuICAgICAgICB0aHJvdyBFdGFFcnIoJ0NvdWxkIG5vdCBmZXRjaCB0ZW1wbGF0ZSBcIicgKyB0ZW1wbGF0ZU5hbWVPclBhdGggKyAnXCInKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0ZW1wbGF0ZShkYXRhLCB0aGlzKTtcclxufVxyXG4vKiogRXRhJ3MgYmFzZSAoZ2xvYmFsKSBjb25maWd1cmF0aW9uICovXHJcbnZhciBjb25maWcgPSB7XHJcbiAgICBhc3luYzogZmFsc2UsXHJcbiAgICBhdXRvRXNjYXBlOiB0cnVlLFxyXG4gICAgYXV0b1RyaW06IFtmYWxzZSwgJ25sJ10sXHJcbiAgICBjYWNoZTogZmFsc2UsXHJcbiAgICBlOiBYTUxFc2NhcGUsXHJcbiAgICBpbmNsdWRlOiBpbmNsdWRlSGVscGVyLFxyXG4gICAgcGFyc2U6IHtcclxuICAgICAgICBleGVjOiAnJyxcclxuICAgICAgICBpbnRlcnBvbGF0ZTogJz0nLFxyXG4gICAgICAgIHJhdzogJ34nXHJcbiAgICB9LFxyXG4gICAgcGx1Z2luczogW10sXHJcbiAgICBybVdoaXRlc3BhY2U6IGZhbHNlLFxyXG4gICAgdGFnczogWyc8JScsICclPiddLFxyXG4gICAgdGVtcGxhdGVzOiB0ZW1wbGF0ZXMsXHJcbiAgICB1c2VXaXRoOiBmYWxzZSxcclxuICAgIHZhck5hbWU6ICdpdCdcclxufTtcclxuLyoqXHJcbiAqIFRha2VzIG9uZSBvciB0d28gcGFydGlhbCAobm90IG5lY2Vzc2FyaWx5IGNvbXBsZXRlKSBjb25maWd1cmF0aW9uIG9iamVjdHMsIG1lcmdlcyB0aGVtIDEgbGF5ZXIgZGVlcCBpbnRvIGV0YS5jb25maWcsIGFuZCByZXR1cm5zIHRoZSByZXN1bHRcclxuICpcclxuICogQHBhcmFtIG92ZXJyaWRlIFBhcnRpYWwgY29uZmlndXJhdGlvbiBvYmplY3RcclxuICogQHBhcmFtIGJhc2VDb25maWcgUGFydGlhbCBjb25maWd1cmF0aW9uIG9iamVjdCB0byBtZXJnZSBiZWZvcmUgYG92ZXJyaWRlYFxyXG4gKlxyXG4gKiAqKkV4YW1wbGUqKlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBsZXQgY3VzdG9tQ29uZmlnID0gZ2V0Q29uZmlnKHt0YWdzOiBbJyEjJywgJyMhJ119KVxyXG4gKiBgYGBcclxuICovXHJcbmZ1bmN0aW9uIGdldENvbmZpZyhvdmVycmlkZSwgYmFzZUNvbmZpZykge1xyXG4gICAgLy8gVE9ETzogcnVuIG1vcmUgdGVzdHMgb24gdGhpc1xyXG4gICAgdmFyIHJlcyA9IHt9OyAvLyBMaW5rZWRcclxuICAgIGNvcHlQcm9wcyhyZXMsIGNvbmZpZyk7IC8vIENyZWF0ZXMgZGVlcCBjbG9uZSBvZiBldGEuY29uZmlnLCAxIGxheWVyIGRlZXBcclxuICAgIGlmIChiYXNlQ29uZmlnKSB7XHJcbiAgICAgICAgY29weVByb3BzKHJlcywgYmFzZUNvbmZpZyk7XHJcbiAgICB9XHJcbiAgICBpZiAob3ZlcnJpZGUpIHtcclxuICAgICAgICBjb3B5UHJvcHMocmVzLCBvdmVycmlkZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG59XHJcbi8qKiBVcGRhdGUgRXRhJ3MgYmFzZSBjb25maWcgKi9cclxuZnVuY3Rpb24gY29uZmlndXJlKG9wdGlvbnMpIHtcclxuICAgIHJldHVybiBjb3B5UHJvcHMoY29uZmlnLCBvcHRpb25zKTtcclxufVxuXG4vKiBFTkQgVFlQRVMgKi9cclxuLyoqXHJcbiAqIFRha2VzIGEgdGVtcGxhdGUgc3RyaW5nIGFuZCByZXR1cm5zIGEgdGVtcGxhdGUgZnVuY3Rpb24gdGhhdCBjYW4gYmUgY2FsbGVkIHdpdGggKGRhdGEsIGNvbmZpZywgW2NiXSlcclxuICpcclxuICogQHBhcmFtIHN0ciAtIFRoZSB0ZW1wbGF0ZSBzdHJpbmdcclxuICogQHBhcmFtIGNvbmZpZyAtIEEgY3VzdG9tIGNvbmZpZ3VyYXRpb24gb2JqZWN0IChvcHRpb25hbClcclxuICpcclxuICogKipFeGFtcGxlKipcclxuICpcclxuICogYGBganNcclxuICogbGV0IGNvbXBpbGVkRm4gPSBldGEuY29tcGlsZShcIkhpIDwlPSBpdC51c2VyICU+XCIpXHJcbiAqIC8vIGZ1bmN0aW9uIGFub255bW91cygpXHJcbiAqIGxldCBjb21waWxlZEZuU3RyID0gY29tcGlsZWRGbi50b1N0cmluZygpXHJcbiAqIC8vIFwiZnVuY3Rpb24gYW5vbnltb3VzKGl0LEUsY2JcXG4pIHtcXG52YXIgdFI9JycsaW5jbHVkZT1FLmluY2x1ZGUuYmluZChFKSxpbmNsdWRlRmlsZT1FLmluY2x1ZGVGaWxlLmJpbmQoRSk7dFIrPSdIaSAnO3RSKz1FLmUoaXQudXNlcik7aWYoY2Ipe2NiKG51bGwsdFIpfSByZXR1cm4gdFJcXG59XCJcclxuICogYGBgXHJcbiAqL1xyXG5mdW5jdGlvbiBjb21waWxlKHN0ciwgY29uZmlnKSB7XHJcbiAgICB2YXIgb3B0aW9ucyA9IGdldENvbmZpZyhjb25maWcgfHwge30pO1xyXG4gICAgLyogQVNZTkMgSEFORExJTkcgKi9cclxuICAgIC8vIFRoZSBiZWxvdyBjb2RlIGlzIG1vZGlmaWVkIGZyb20gbWRlL2Vqcy4gQWxsIGNyZWRpdCBzaG91bGQgZ28gdG8gdGhlbS5cclxuICAgIHZhciBjdG9yID0gb3B0aW9ucy5hc3luYyA/IGdldEFzeW5jRnVuY3Rpb25Db25zdHJ1Y3RvcigpIDogRnVuY3Rpb247XHJcbiAgICAvKiBFTkQgQVNZTkMgSEFORExJTkcgKi9cclxuICAgIHRyeSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBjdG9yKG9wdGlvbnMudmFyTmFtZSwgJ0UnLCAvLyBFdGFDb25maWdcclxuICAgICAgICAnY2InLCAvLyBvcHRpb25hbCBjYWxsYmFja1xyXG4gICAgICAgIGNvbXBpbGVUb1N0cmluZyhzdHIsIG9wdGlvbnMpKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXctZnVuY1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN5bnRheEVycm9yKSB7XHJcbiAgICAgICAgICAgIHRocm93IEV0YUVycignQmFkIHRlbXBsYXRlIHN5bnRheFxcblxcbicgK1xyXG4gICAgICAgICAgICAgICAgZS5tZXNzYWdlICtcclxuICAgICAgICAgICAgICAgICdcXG4nICtcclxuICAgICAgICAgICAgICAgIEFycmF5KGUubWVzc2FnZS5sZW5ndGggKyAxKS5qb2luKCc9JykgK1xyXG4gICAgICAgICAgICAgICAgJ1xcbicgK1xyXG4gICAgICAgICAgICAgICAgY29tcGlsZVRvU3RyaW5nKHN0ciwgb3B0aW9ucykgK1xyXG4gICAgICAgICAgICAgICAgJ1xcbicgLy8gVGhpcyB3aWxsIHB1dCBhbiBleHRyYSBuZXdsaW5lIGJlZm9yZSB0aGUgY2FsbHN0YWNrIGZvciBleHRyYSByZWFkYWJpbGl0eVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhyb3cgZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cblxudmFyIF9CT00gPSAvXlxcdUZFRkYvO1xyXG4vKiBFTkQgVFlQRVMgKi9cclxuLyoqXHJcbiAqIEdldCB0aGUgcGF0aCB0byB0aGUgaW5jbHVkZWQgZmlsZSBmcm9tIHRoZSBwYXJlbnQgZmlsZSBwYXRoIGFuZCB0aGVcclxuICogc3BlY2lmaWVkIHBhdGguXHJcbiAqXHJcbiAqIElmIGBuYW1lYCBkb2VzIG5vdCBoYXZlIGFuIGV4dGVuc2lvbiwgaXQgd2lsbCBkZWZhdWx0IHRvIGAuZXRhYFxyXG4gKlxyXG4gKiBAcGFyYW0gbmFtZSBzcGVjaWZpZWQgcGF0aFxyXG4gKiBAcGFyYW0gcGFyZW50ZmlsZSBwYXJlbnQgZmlsZSBwYXRoXHJcbiAqIEBwYXJhbSBpc0RpcmVjdG9yeSB3aGV0aGVyIHBhcmVudGZpbGUgaXMgYSBkaXJlY3RvcnlcclxuICogQHJldHVybiBhYnNvbHV0ZSBwYXRoIHRvIHRlbXBsYXRlXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRXaG9sZUZpbGVQYXRoKG5hbWUsIHBhcmVudGZpbGUsIGlzRGlyZWN0b3J5KSB7XHJcbiAgICB2YXIgaW5jbHVkZVBhdGggPSBwYXRoLnJlc29sdmUoaXNEaXJlY3RvcnkgPyBwYXJlbnRmaWxlIDogcGF0aC5kaXJuYW1lKHBhcmVudGZpbGUpLCAvLyByZXR1cm5zIGRpcmVjdG9yeSB0aGUgcGFyZW50IGZpbGUgaXMgaW5cclxuICAgIG5hbWUgLy8gZmlsZVxyXG4gICAgKSArIChwYXRoLmV4dG5hbWUobmFtZSkgPyAnJyA6ICcuZXRhJyk7XHJcbiAgICByZXR1cm4gaW5jbHVkZVBhdGg7XHJcbn1cclxuLyoqXHJcbiAqIEdldCB0aGUgYWJzb2x1dGUgcGF0aCB0byBhbiBpbmNsdWRlZCB0ZW1wbGF0ZVxyXG4gKlxyXG4gKiBJZiB0aGlzIGlzIGNhbGxlZCB3aXRoIGFuIGFic29sdXRlIHBhdGggKGZvciBleGFtcGxlLCBzdGFydGluZyB3aXRoICcvJyBvciAnQzpcXCcpXHJcbiAqIHRoZW4gRXRhIHdpbGwgYXR0ZW1wdCB0byByZXNvbHZlIHRoZSBhYnNvbHV0ZSBwYXRoIHdpdGhpbiBvcHRpb25zLnZpZXdzLiBJZiBpdCBjYW5ub3QsXHJcbiAqIEV0YSB3aWxsIGZhbGxiYWNrIHRvIG9wdGlvbnMucm9vdCBvciAnLydcclxuICpcclxuICogSWYgdGhpcyBpcyBjYWxsZWQgd2l0aCBhIHJlbGF0aXZlIHBhdGgsIEV0YSB3aWxsOlxyXG4gKiAtIExvb2sgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgdGVtcGxhdGUgKGlmIHRoZSBjdXJyZW50IHRlbXBsYXRlIGhhcyB0aGUgYGZpbGVuYW1lYCBwcm9wZXJ0eSlcclxuICogLSBMb29rIGluc2lkZSBlYWNoIGRpcmVjdG9yeSBpbiBvcHRpb25zLnZpZXdzXHJcbiAqXHJcbiAqIE5vdGU6IGlmIEV0YSBpcyB1bmFibGUgdG8gZmluZCBhIHRlbXBsYXRlIHVzaW5nIHBhdGggYW5kIG9wdGlvbnMsIGl0IHdpbGwgdGhyb3cgYW4gZXJyb3IuXHJcbiAqXHJcbiAqIEBwYXJhbSBwYXRoICAgIHNwZWNpZmllZCBwYXRoXHJcbiAqIEBwYXJhbSBvcHRpb25zIGNvbXBpbGF0aW9uIG9wdGlvbnNcclxuICogQHJldHVybiBhYnNvbHV0ZSBwYXRoIHRvIHRlbXBsYXRlXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRQYXRoKHBhdGgsIG9wdGlvbnMpIHtcclxuICAgIHZhciBpbmNsdWRlUGF0aCA9IGZhbHNlO1xyXG4gICAgdmFyIHZpZXdzID0gb3B0aW9ucy52aWV3cztcclxuICAgIHZhciBzZWFyY2hlZFBhdGhzID0gW107XHJcbiAgICAvLyBJZiB0aGVzZSBmb3VyIHZhbHVlcyBhcmUgdGhlIHNhbWUsXHJcbiAgICAvLyBnZXRQYXRoKCkgd2lsbCByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGV2ZXJ5IHRpbWUuXHJcbiAgICAvLyBXZSBjYW4gY2FjaGUgdGhlIHJlc3VsdCB0byBhdm9pZCBleHBlbnNpdmVcclxuICAgIC8vIGZpbGUgb3BlcmF0aW9ucy5cclxuICAgIHZhciBwYXRoT3B0aW9ucyA9IEpTT04uc3RyaW5naWZ5KHtcclxuICAgICAgICBmaWxlbmFtZTogb3B0aW9ucy5maWxlbmFtZSxcclxuICAgICAgICBwYXRoOiBwYXRoLFxyXG4gICAgICAgIHJvb3Q6IG9wdGlvbnMucm9vdCxcclxuICAgICAgICB2aWV3czogb3B0aW9ucy52aWV3c1xyXG4gICAgfSk7XHJcbiAgICBpZiAob3B0aW9ucy5jYWNoZSAmJiBvcHRpb25zLmZpbGVwYXRoQ2FjaGUgJiYgb3B0aW9ucy5maWxlcGF0aENhY2hlW3BhdGhPcHRpb25zXSkge1xyXG4gICAgICAgIC8vIFVzZSB0aGUgY2FjaGVkIGZpbGVwYXRoXHJcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuZmlsZXBhdGhDYWNoZVtwYXRoT3B0aW9uc107XHJcbiAgICB9XHJcbiAgICAvKiogQWRkIGEgZmlsZXBhdGggdG8gdGhlIGxpc3Qgb2YgcGF0aHMgd2UndmUgY2hlY2tlZCBmb3IgYSB0ZW1wbGF0ZSAqL1xyXG4gICAgZnVuY3Rpb24gYWRkUGF0aFRvU2VhcmNoZWQocGF0aFNlYXJjaGVkKSB7XHJcbiAgICAgICAgaWYgKCFzZWFyY2hlZFBhdGhzLmluY2x1ZGVzKHBhdGhTZWFyY2hlZCkpIHtcclxuICAgICAgICAgICAgc2VhcmNoZWRQYXRocy5wdXNoKHBhdGhTZWFyY2hlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBUYWtlIGEgZmlsZXBhdGggKGxpa2UgJ3BhcnRpYWxzL215cGFydGlhbC5ldGEnKS4gQXR0ZW1wdCB0byBmaW5kIHRoZSB0ZW1wbGF0ZSBmaWxlIGluc2lkZSBgdmlld3NgO1xyXG4gICAgICogcmV0dXJuIHRoZSByZXN1bHRpbmcgdGVtcGxhdGUgZmlsZSBwYXRoLCBvciBgZmFsc2VgIHRvIGluZGljYXRlIHRoYXQgdGhlIHRlbXBsYXRlIHdhcyBub3QgZm91bmQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHZpZXdzIHRoZSBmaWxlcGF0aCB0aGF0IGhvbGRzIHRlbXBsYXRlcywgb3IgYW4gYXJyYXkgb2YgZmlsZXBhdGhzIHRoYXQgaG9sZCB0ZW1wbGF0ZXNcclxuICAgICAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHRvIHRoZSB0ZW1wbGF0ZVxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBzZWFyY2hWaWV3cyh2aWV3cywgcGF0aCkge1xyXG4gICAgICAgIHZhciBmaWxlUGF0aDtcclxuICAgICAgICAvLyBJZiB2aWV3cyBpcyBhbiBhcnJheSwgdGhlbiBsb29wIHRocm91Z2ggZWFjaCBkaXJlY3RvcnlcclxuICAgICAgICAvLyBBbmQgYXR0ZW1wdCB0byBmaW5kIHRoZSB0ZW1wbGF0ZVxyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZpZXdzKSAmJlxyXG4gICAgICAgICAgICB2aWV3cy5zb21lKGZ1bmN0aW9uICh2KSB7XHJcbiAgICAgICAgICAgICAgICBmaWxlUGF0aCA9IGdldFdob2xlRmlsZVBhdGgocGF0aCwgdiwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBhZGRQYXRoVG9TZWFyY2hlZChmaWxlUGF0aCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZXhpc3RzU3luYyhmaWxlUGF0aCk7XHJcbiAgICAgICAgICAgIH0pKSB7XHJcbiAgICAgICAgICAgIC8vIElmIHRoZSBhYm92ZSByZXR1cm5lZCB0cnVlLCB3ZSBrbm93IHRoYXQgdGhlIGZpbGVQYXRoIHdhcyBqdXN0IHNldCB0byBhIHBhdGhcclxuICAgICAgICAgICAgLy8gVGhhdCBleGlzdHMgKEFycmF5LnNvbWUoKSByZXR1cm5zIGFzIHNvb24gYXMgaXQgZmluZHMgYSB2YWxpZCBlbGVtZW50KVxyXG4gICAgICAgICAgICByZXR1cm4gZmlsZVBhdGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2aWV3cyA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgLy8gU2VhcmNoIGZvciB0aGUgZmlsZSBpZiB2aWV3cyBpcyBhIHNpbmdsZSBkaXJlY3RvcnlcclxuICAgICAgICAgICAgZmlsZVBhdGggPSBnZXRXaG9sZUZpbGVQYXRoKHBhdGgsIHZpZXdzLCB0cnVlKTtcclxuICAgICAgICAgICAgYWRkUGF0aFRvU2VhcmNoZWQoZmlsZVBhdGgpO1xyXG4gICAgICAgICAgICBpZiAoZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmaWxlUGF0aDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBVbmFibGUgdG8gZmluZCBhIGZpbGVcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICAvLyBQYXRoIHN0YXJ0cyB3aXRoICcvJywgJ0M6XFwnLCBldGMuXHJcbiAgICB2YXIgbWF0Y2ggPSAvXltBLVphLXpdKzpcXFxcfF5cXC8vLmV4ZWMocGF0aCk7XHJcbiAgICAvLyBBYnNvbHV0ZSBwYXRoLCBsaWtlIC9wYXJ0aWFscy9wYXJ0aWFsLmV0YVxyXG4gICAgaWYgKG1hdGNoICYmIG1hdGNoLmxlbmd0aCkge1xyXG4gICAgICAgIC8vIFdlIGhhdmUgdG8gdHJpbSB0aGUgYmVnaW5uaW5nICcvJyBvZmYgdGhlIHBhdGgsIG9yIGVsc2VcclxuICAgICAgICAvLyBwYXRoLnJlc29sdmUoZGlyLCBwYXRoKSB3aWxsIGFsd2F5cyByZXNvbHZlIHRvIGp1c3QgcGF0aFxyXG4gICAgICAgIHZhciBmb3JtYXR0ZWRQYXRoID0gcGF0aC5yZXBsYWNlKC9eXFwvKi8sICcnKTtcclxuICAgICAgICAvLyBGaXJzdCwgdHJ5IHRvIHJlc29sdmUgdGhlIHBhdGggd2l0aGluIG9wdGlvbnMudmlld3NcclxuICAgICAgICBpbmNsdWRlUGF0aCA9IHNlYXJjaFZpZXdzKHZpZXdzLCBmb3JtYXR0ZWRQYXRoKTtcclxuICAgICAgICBpZiAoIWluY2x1ZGVQYXRoKSB7XHJcbiAgICAgICAgICAgIC8vIElmIHRoYXQgZmFpbHMsIHNlYXJjaFZpZXdzIHdpbGwgcmV0dXJuIGZhbHNlLiBUcnkgdG8gZmluZCB0aGUgcGF0aFxyXG4gICAgICAgICAgICAvLyBpbnNpZGUgb3B0aW9ucy5yb290IChieSBkZWZhdWx0ICcvJywgdGhlIGJhc2Ugb2YgdGhlIGZpbGVzeXN0ZW0pXHJcbiAgICAgICAgICAgIHZhciBwYXRoRnJvbVJvb3QgPSBnZXRXaG9sZUZpbGVQYXRoKGZvcm1hdHRlZFBhdGgsIG9wdGlvbnMucm9vdCB8fCAnLycsIHRydWUpO1xyXG4gICAgICAgICAgICBhZGRQYXRoVG9TZWFyY2hlZChwYXRoRnJvbVJvb3QpO1xyXG4gICAgICAgICAgICBpbmNsdWRlUGF0aCA9IHBhdGhGcm9tUm9vdDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICAvLyBSZWxhdGl2ZSBwYXRoc1xyXG4gICAgICAgIC8vIExvb2sgcmVsYXRpdmUgdG8gYSBwYXNzZWQgZmlsZW5hbWUgZmlyc3RcclxuICAgICAgICBpZiAob3B0aW9ucy5maWxlbmFtZSkge1xyXG4gICAgICAgICAgICB2YXIgZmlsZVBhdGggPSBnZXRXaG9sZUZpbGVQYXRoKHBhdGgsIG9wdGlvbnMuZmlsZW5hbWUpO1xyXG4gICAgICAgICAgICBhZGRQYXRoVG9TZWFyY2hlZChmaWxlUGF0aCk7XHJcbiAgICAgICAgICAgIGlmIChleGlzdHNTeW5jKGZpbGVQYXRoKSkge1xyXG4gICAgICAgICAgICAgICAgaW5jbHVkZVBhdGggPSBmaWxlUGF0aDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBUaGVuIGxvb2sgZm9yIHRoZSB0ZW1wbGF0ZSBpbiBvcHRpb25zLnZpZXdzXHJcbiAgICAgICAgaWYgKCFpbmNsdWRlUGF0aCkge1xyXG4gICAgICAgICAgICBpbmNsdWRlUGF0aCA9IHNlYXJjaFZpZXdzKHZpZXdzLCBwYXRoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFpbmNsdWRlUGF0aCkge1xyXG4gICAgICAgICAgICB0aHJvdyBFdGFFcnIoJ0NvdWxkIG5vdCBmaW5kIHRoZSB0ZW1wbGF0ZSBcIicgKyBwYXRoICsgJ1wiLiBQYXRocyB0cmllZDogJyArIHNlYXJjaGVkUGF0aHMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIElmIGNhY2hpbmcgYW5kIGZpbGVwYXRoQ2FjaGUgYXJlIGVuYWJsZWQsXHJcbiAgICAvLyBjYWNoZSB0aGUgaW5wdXQgJiBvdXRwdXQgb2YgdGhpcyBmdW5jdGlvbi5cclxuICAgIGlmIChvcHRpb25zLmNhY2hlICYmIG9wdGlvbnMuZmlsZXBhdGhDYWNoZSkge1xyXG4gICAgICAgIG9wdGlvbnMuZmlsZXBhdGhDYWNoZVtwYXRoT3B0aW9uc10gPSBpbmNsdWRlUGF0aDtcclxuICAgIH1cclxuICAgIHJldHVybiBpbmNsdWRlUGF0aDtcclxufVxyXG4vKipcclxuICogUmVhZHMgYSBmaWxlIHN5bmNocm9ub3VzbHlcclxuICovXHJcbmZ1bmN0aW9uIHJlYWRGaWxlKGZpbGVQYXRoKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHJldHVybiByZWFkRmlsZVN5bmMoZmlsZVBhdGgpLnRvU3RyaW5nKCkucmVwbGFjZShfQk9NLCAnJyk7IC8vIFRPRE86IGlzIHJlcGxhY2luZyBCT00ncyBuZWNlc3Nhcnk/XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoX2EpIHtcclxuICAgICAgICB0aHJvdyBFdGFFcnIoXCJGYWlsZWQgdG8gcmVhZCB0ZW1wbGF0ZSBhdCAnXCIgKyBmaWxlUGF0aCArIFwiJ1wiKTtcclxuICAgIH1cclxufVxuXG4vLyBleHByZXNzIGlzIHNldCBsaWtlOiBhcHAuZW5naW5lKCdodG1sJywgcmVxdWlyZSgnZXRhJykucmVuZGVyRmlsZSlcclxuLyogRU5EIFRZUEVTICovXHJcbi8qKlxyXG4gKiBSZWFkcyBhIHRlbXBsYXRlLCBjb21waWxlcyBpdCBpbnRvIGEgZnVuY3Rpb24sIGNhY2hlcyBpdCBpZiBjYWNoaW5nIGlzbid0IGRpc2FibGVkLCByZXR1cm5zIHRoZSBmdW5jdGlvblxyXG4gKlxyXG4gKiBAcGFyYW0gZmlsZVBhdGggQWJzb2x1dGUgcGF0aCB0byB0ZW1wbGF0ZSBmaWxlXHJcbiAqIEBwYXJhbSBvcHRpb25zIEV0YSBjb25maWd1cmF0aW9uIG92ZXJyaWRlc1xyXG4gKiBAcGFyYW0gbm9DYWNoZSBPcHRpb25hbGx5LCBtYWtlIEV0YSBub3QgY2FjaGUgdGhlIHRlbXBsYXRlXHJcbiAqL1xyXG5mdW5jdGlvbiBsb2FkRmlsZShmaWxlUGF0aCwgb3B0aW9ucywgbm9DYWNoZSkge1xyXG4gICAgdmFyIGNvbmZpZyA9IGdldENvbmZpZyhvcHRpb25zKTtcclxuICAgIHZhciB0ZW1wbGF0ZSA9IHJlYWRGaWxlKGZpbGVQYXRoKTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgdmFyIGNvbXBpbGVkVGVtcGxhdGUgPSBjb21waWxlKHRlbXBsYXRlLCBjb25maWcpO1xyXG4gICAgICAgIGlmICghbm9DYWNoZSkge1xyXG4gICAgICAgICAgICBjb25maWcudGVtcGxhdGVzLmRlZmluZShjb25maWcuZmlsZW5hbWUsIGNvbXBpbGVkVGVtcGxhdGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY29tcGlsZWRUZW1wbGF0ZTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgdGhyb3cgRXRhRXJyKCdMb2FkaW5nIGZpbGU6ICcgKyBmaWxlUGF0aCArICcgZmFpbGVkOlxcblxcbicgKyBlLm1lc3NhZ2UpO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBHZXQgdGhlIHRlbXBsYXRlIGZyb20gYSBzdHJpbmcgb3IgYSBmaWxlLCBlaXRoZXIgY29tcGlsZWQgb24tdGhlLWZseSBvclxyXG4gKiByZWFkIGZyb20gY2FjaGUgKGlmIGVuYWJsZWQpLCBhbmQgY2FjaGUgdGhlIHRlbXBsYXRlIGlmIG5lZWRlZC5cclxuICpcclxuICogSWYgYG9wdGlvbnMuY2FjaGVgIGlzIHRydWUsIHRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGZpbGUgZnJvbVxyXG4gKiBgb3B0aW9ucy5maWxlbmFtZWAgc28gaXQgbXVzdCBiZSBzZXQgcHJpb3IgdG8gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLlxyXG4gKlxyXG4gKiBAcGFyYW0gb3B0aW9ucyAgIGNvbXBpbGF0aW9uIG9wdGlvbnNcclxuICogQHJldHVybiBFdGEgdGVtcGxhdGUgZnVuY3Rpb25cclxuICovXHJcbmZ1bmN0aW9uIGhhbmRsZUNhY2hlJDEob3B0aW9ucykge1xyXG4gICAgdmFyIGZpbGVuYW1lID0gb3B0aW9ucy5maWxlbmFtZTtcclxuICAgIGlmIChvcHRpb25zLmNhY2hlKSB7XHJcbiAgICAgICAgdmFyIGZ1bmMgPSBvcHRpb25zLnRlbXBsYXRlcy5nZXQoZmlsZW5hbWUpO1xyXG4gICAgICAgIGlmIChmdW5jKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmdW5jO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbG9hZEZpbGUoZmlsZW5hbWUsIG9wdGlvbnMpO1xyXG4gICAgfVxyXG4gICAgLy8gQ2FjaGluZyBpcyBkaXNhYmxlZCwgc28gcGFzcyBub0NhY2hlID0gdHJ1ZVxyXG4gICAgcmV0dXJuIGxvYWRGaWxlKGZpbGVuYW1lLCBvcHRpb25zLCB0cnVlKTtcclxufVxyXG4vKipcclxuICogVHJ5IGNhbGxpbmcgaGFuZGxlQ2FjaGUgd2l0aCB0aGUgZ2l2ZW4gb3B0aW9ucyBhbmQgZGF0YSBhbmQgY2FsbCB0aGVcclxuICogY2FsbGJhY2sgd2l0aCB0aGUgcmVzdWx0LiBJZiBhbiBlcnJvciBvY2N1cnMsIGNhbGwgdGhlIGNhbGxiYWNrIHdpdGhcclxuICogdGhlIGVycm9yLiBVc2VkIGJ5IHJlbmRlckZpbGUoKS5cclxuICpcclxuICogQHBhcmFtIGRhdGEgdGVtcGxhdGUgZGF0YVxyXG4gKiBAcGFyYW0gb3B0aW9ucyBjb21waWxhdGlvbiBvcHRpb25zXHJcbiAqIEBwYXJhbSBjYiBjYWxsYmFja1xyXG4gKi9cclxuZnVuY3Rpb24gdHJ5SGFuZGxlQ2FjaGUoZGF0YSwgb3B0aW9ucywgY2IpIHtcclxuICAgIGlmIChjYikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8vIE5vdGU6IGlmIHRoZXJlIGlzIGFuIGVycm9yIHdoaWxlIHJlbmRlcmluZyB0aGUgdGVtcGxhdGUsXHJcbiAgICAgICAgICAgIC8vIEl0IHdpbGwgYnViYmxlIHVwIGFuZCBiZSBjYXVnaHQgaGVyZVxyXG4gICAgICAgICAgICB2YXIgdGVtcGxhdGVGbiA9IGhhbmRsZUNhY2hlJDEob3B0aW9ucyk7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlRm4oZGF0YSwgb3B0aW9ucywgY2IpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjYihlcnIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIC8vIE5vIGNhbGxiYWNrLCB0cnkgcmV0dXJuaW5nIGEgcHJvbWlzZVxyXG4gICAgICAgIGlmICh0eXBlb2YgcHJvbWlzZUltcGwgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBwcm9taXNlSW1wbChmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZUZuID0gaGFuZGxlQ2FjaGUkMShvcHRpb25zKTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGVtcGxhdGVGbihkYXRhLCBvcHRpb25zKTtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhyb3cgRXRhRXJyKFwiUGxlYXNlIHByb3ZpZGUgYSBjYWxsYmFjayBmdW5jdGlvbiwgdGhpcyBlbnYgZG9lc24ndCBzdXBwb3J0IFByb21pc2VzXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4vKipcclxuICogR2V0IHRoZSB0ZW1wbGF0ZSBmdW5jdGlvbi5cclxuICpcclxuICogSWYgYG9wdGlvbnMuY2FjaGVgIGlzIGB0cnVlYCwgdGhlbiB0aGUgdGVtcGxhdGUgaXMgY2FjaGVkLlxyXG4gKlxyXG4gKiBUaGlzIHJldHVybnMgYSB0ZW1wbGF0ZSBmdW5jdGlvbiBhbmQgdGhlIGNvbmZpZyBvYmplY3Qgd2l0aCB3aGljaCB0aGF0IHRlbXBsYXRlIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQuXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqXHJcbiAqIEl0J3MgaW1wb3J0YW50IHRoYXQgdGhpcyByZXR1cm5zIGEgY29uZmlnIG9iamVjdCB3aXRoIGBmaWxlbmFtZWAgc2V0LlxyXG4gKiBPdGhlcndpc2UsIHRoZSBpbmNsdWRlZCBmaWxlIHdvdWxkIG5vdCBiZSBhYmxlIHRvIHVzZSByZWxhdGl2ZSBwYXRoc1xyXG4gKlxyXG4gKiBAcGFyYW0gcGF0aCBwYXRoIGZvciB0aGUgc3BlY2lmaWVkIGZpbGUgKGlmIHJlbGF0aXZlLCBzcGVjaWZ5IGB2aWV3c2Agb24gYG9wdGlvbnNgKVxyXG4gKiBAcGFyYW0gb3B0aW9ucyBjb21waWxhdGlvbiBvcHRpb25zXHJcbiAqIEByZXR1cm4gW0V0YSB0ZW1wbGF0ZSBmdW5jdGlvbiwgbmV3IGNvbmZpZyBvYmplY3RdXHJcbiAqL1xyXG5mdW5jdGlvbiBpbmNsdWRlRmlsZShwYXRoLCBvcHRpb25zKSB7XHJcbiAgICAvLyB0aGUgYmVsb3cgY3JlYXRlcyBhIG5ldyBvcHRpb25zIG9iamVjdCwgdXNpbmcgdGhlIHBhcmVudCBmaWxlcGF0aCBvZiB0aGUgb2xkIG9wdGlvbnMgb2JqZWN0IGFuZCB0aGUgcGF0aFxyXG4gICAgdmFyIG5ld0ZpbGVPcHRpb25zID0gZ2V0Q29uZmlnKHsgZmlsZW5hbWU6IGdldFBhdGgocGF0aCwgb3B0aW9ucykgfSwgb3B0aW9ucyk7XHJcbiAgICAvLyBUT0RPOiBtYWtlIHN1cmUgcHJvcGVydGllcyBhcmUgY3VycmVjdGx5IGNvcGllZCBvdmVyXHJcbiAgICByZXR1cm4gW2hhbmRsZUNhY2hlJDEobmV3RmlsZU9wdGlvbnMpLCBuZXdGaWxlT3B0aW9uc107XHJcbn1cclxuZnVuY3Rpb24gcmVuZGVyRmlsZShmaWxlbmFtZSwgZGF0YSwgY29uZmlnLCBjYikge1xyXG4gICAgLypcclxuICAgIEhlcmUgd2UgaGF2ZSBzb21lIGZ1bmN0aW9uIG92ZXJsb2FkaW5nLlxyXG4gICAgRXNzZW50aWFsbHksIHRoZSBmaXJzdCAyIGFyZ3VtZW50cyB0byByZW5kZXJGaWxlIHNob3VsZCBhbHdheXMgYmUgdGhlIGZpbGVuYW1lIGFuZCBkYXRhXHJcbiAgICBIb3dldmVyLCB3aXRoIEV4cHJlc3MsIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB3aWxsIGJlIHBhc3NlZCBhbG9uZyB3aXRoIHRoZSBkYXRhLlxyXG4gICAgVGh1cywgRXhwcmVzcyB3aWxsIGNhbGwgcmVuZGVyRmlsZSB3aXRoIChmaWxlbmFtZSwgZGF0YUFuZE9wdGlvbnMsIGNiKVxyXG4gICAgQW5kIHdlIHdhbnQgdG8gYWxzbyBtYWtlIChmaWxlbmFtZSwgZGF0YSwgb3B0aW9ucywgY2IpIGF2YWlsYWJsZVxyXG4gICAgKi9cclxuICAgIHZhciByZW5kZXJDb25maWc7XHJcbiAgICB2YXIgY2FsbGJhY2s7XHJcbiAgICBkYXRhID0gZGF0YSB8fCB7fTsgLy8gSWYgZGF0YSBpcyB1bmRlZmluZWQsIHdlIGRvbid0IHdhbnQgYWNjZXNzaW5nIGRhdGEuc2V0dGluZ3MgdG8gZXJyb3JcclxuICAgIC8vIEZpcnN0LCBhc3NpZ24gb3VyIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGBjYWxsYmFja2BcclxuICAgIC8vIFdlIGNhbiBsZWF2ZSBpdCB1bmRlZmluZWQgaWYgbmVpdGhlciBwYXJhbWV0ZXIgaXMgYSBmdW5jdGlvbjtcclxuICAgIC8vIENhbGxiYWNrcyBhcmUgb3B0aW9uYWxcclxuICAgIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAvLyBUaGUgNHRoIGFyZ3VtZW50IGlzIHRoZSBjYWxsYmFja1xyXG4gICAgICAgIGNhbGxiYWNrID0gY2I7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0eXBlb2YgY29uZmlnID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgLy8gVGhlIDNyZCBhcmcgaXMgdGhlIGNhbGxiYWNrXHJcbiAgICAgICAgY2FsbGJhY2sgPSBjb25maWc7XHJcbiAgICB9XHJcbiAgICAvLyBJZiB0aGVyZSBpcyBhIGNvbmZpZyBvYmplY3QgcGFzc2VkIGluIGV4cGxpY2l0bHksIHVzZSBpdFxyXG4gICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgcmVuZGVyQ29uZmlnID0gZ2V0Q29uZmlnKGNvbmZpZyB8fCB7fSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICAvLyBPdGhlcndpc2UsIGdldCB0aGUgY29uZmlnIGZyb20gdGhlIGRhdGEgb2JqZWN0XHJcbiAgICAgICAgLy8gQW5kIHRoZW4gZ3JhYiBzb21lIGNvbmZpZyBvcHRpb25zIGZyb20gZGF0YS5zZXR0aW5nc1xyXG4gICAgICAgIC8vIFdoaWNoIGlzIHdoZXJlIEV4cHJlc3Mgc29tZXRpbWVzIHN0b3JlcyB0aGVtXHJcbiAgICAgICAgcmVuZGVyQ29uZmlnID0gZ2V0Q29uZmlnKGRhdGEpO1xyXG4gICAgICAgIGlmIChkYXRhLnNldHRpbmdzKSB7XHJcbiAgICAgICAgICAgIC8vIFB1bGwgYSBmZXcgdGhpbmdzIGZyb20ga25vd24gbG9jYXRpb25zXHJcbiAgICAgICAgICAgIGlmIChkYXRhLnNldHRpbmdzLnZpZXdzKSB7XHJcbiAgICAgICAgICAgICAgICByZW5kZXJDb25maWcudmlld3MgPSBkYXRhLnNldHRpbmdzLnZpZXdzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChkYXRhLnNldHRpbmdzWyd2aWV3IGNhY2hlJ10pIHtcclxuICAgICAgICAgICAgICAgIHJlbmRlckNvbmZpZy5jYWNoZSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gVW5kb2N1bWVudGVkIGFmdGVyIEV4cHJlc3MgMiwgYnV0IHN0aWxsIHVzYWJsZSwgZXNwLiBmb3JcclxuICAgICAgICAgICAgLy8gaXRlbXMgdGhhdCBhcmUgdW5zYWZlIHRvIGJlIHBhc3NlZCBhbG9uZyB3aXRoIGRhdGEsIGxpa2UgYHJvb3RgXHJcbiAgICAgICAgICAgIHZhciB2aWV3T3B0cyA9IGRhdGEuc2V0dGluZ3NbJ3ZpZXcgb3B0aW9ucyddO1xyXG4gICAgICAgICAgICBpZiAodmlld09wdHMpIHtcclxuICAgICAgICAgICAgICAgIGNvcHlQcm9wcyhyZW5kZXJDb25maWcsIHZpZXdPcHRzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIFNldCB0aGUgZmlsZW5hbWUgb3B0aW9uIG9uIHRoZSB0ZW1wbGF0ZVxyXG4gICAgLy8gVGhpcyB3aWxsIGZpcnN0IHRyeSB0byByZXNvbHZlIHRoZSBmaWxlIHBhdGggKHNlZSBnZXRQYXRoIGZvciBkZXRhaWxzKVxyXG4gICAgcmVuZGVyQ29uZmlnLmZpbGVuYW1lID0gZ2V0UGF0aChmaWxlbmFtZSwgcmVuZGVyQ29uZmlnKTtcclxuICAgIHJldHVybiB0cnlIYW5kbGVDYWNoZShkYXRhLCByZW5kZXJDb25maWcsIGNhbGxiYWNrKTtcclxufVxyXG5mdW5jdGlvbiByZW5kZXJGaWxlQXN5bmMoZmlsZW5hbWUsIGRhdGEsIGNvbmZpZywgY2IpIHtcclxuICAgIHJldHVybiByZW5kZXJGaWxlKGZpbGVuYW1lLCB0eXBlb2YgY29uZmlnID09PSAnZnVuY3Rpb24nID8gX19hc3NpZ24oX19hc3NpZ24oe30sIGRhdGEpLCB7IGFzeW5jOiB0cnVlIH0pIDogZGF0YSwgdHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcgPyBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgY29uZmlnKSwgeyBhc3luYzogdHJ1ZSB9KSA6IGNvbmZpZywgY2IpO1xyXG59XG5cbi8qIEVORCBUWVBFUyAqL1xyXG4vKipcclxuICogQ2FsbGVkIHdpdGggYGluY2x1ZGVGaWxlKHBhdGgsIGRhdGEpYFxyXG4gKi9cclxuZnVuY3Rpb24gaW5jbHVkZUZpbGVIZWxwZXIocGF0aCwgZGF0YSkge1xyXG4gICAgdmFyIHRlbXBsYXRlQW5kQ29uZmlnID0gaW5jbHVkZUZpbGUocGF0aCwgdGhpcyk7XHJcbiAgICByZXR1cm4gdGVtcGxhdGVBbmRDb25maWdbMF0oZGF0YSwgdGVtcGxhdGVBbmRDb25maWdbMV0pO1xyXG59XG5cbi8qIEVORCBUWVBFUyAqL1xyXG5mdW5jdGlvbiBoYW5kbGVDYWNoZSh0ZW1wbGF0ZSwgb3B0aW9ucykge1xyXG4gICAgaWYgKG9wdGlvbnMuY2FjaGUgJiYgb3B0aW9ucy5uYW1lICYmIG9wdGlvbnMudGVtcGxhdGVzLmdldChvcHRpb25zLm5hbWUpKSB7XHJcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMudGVtcGxhdGVzLmdldChvcHRpb25zLm5hbWUpO1xyXG4gICAgfVxyXG4gICAgdmFyIHRlbXBsYXRlRnVuYyA9IHR5cGVvZiB0ZW1wbGF0ZSA9PT0gJ2Z1bmN0aW9uJyA/IHRlbXBsYXRlIDogY29tcGlsZSh0ZW1wbGF0ZSwgb3B0aW9ucyk7XHJcbiAgICAvLyBOb3RlIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBjaGVjayBpZiBpdCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgY2FjaGU7XHJcbiAgICAvLyBpdCB3b3VsZCBoYXZlIHJldHVybmVkIGVhcmxpZXIgaWYgaXQgaGFkXHJcbiAgICBpZiAob3B0aW9ucy5jYWNoZSAmJiBvcHRpb25zLm5hbWUpIHtcclxuICAgICAgICBvcHRpb25zLnRlbXBsYXRlcy5kZWZpbmUob3B0aW9ucy5uYW1lLCB0ZW1wbGF0ZUZ1bmMpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRlbXBsYXRlRnVuYztcclxufVxyXG4vKipcclxuICogUmVuZGVyIGEgdGVtcGxhdGVcclxuICpcclxuICogSWYgYHRlbXBsYXRlYCBpcyBhIHN0cmluZywgRXRhIHdpbGwgY29tcGlsZSBpdCB0byBhIGZ1bmN0aW9uIGFuZCB0aGVuIGNhbGwgaXQgd2l0aCB0aGUgcHJvdmlkZWQgZGF0YS5cclxuICogSWYgYHRlbXBsYXRlYCBpcyBhIHRlbXBsYXRlIGZ1bmN0aW9uLCBFdGEgd2lsbCBjYWxsIGl0IHdpdGggdGhlIHByb3ZpZGVkIGRhdGEuXHJcbiAqXHJcbiAqIElmIGBjb25maWcuYXN5bmNgIGlzIGBmYWxzZWAsIEV0YSB3aWxsIHJldHVybiB0aGUgcmVuZGVyZWQgdGVtcGxhdGUuXHJcbiAqXHJcbiAqIElmIGBjb25maWcuYXN5bmNgIGlzIGB0cnVlYCBhbmQgdGhlcmUncyBhIGNhbGxiYWNrIGZ1bmN0aW9uLCBFdGEgd2lsbCBjYWxsIHRoZSBjYWxsYmFjayB3aXRoIGAoZXJyLCByZW5kZXJlZFRlbXBsYXRlKWAuXHJcbiAqIElmIGBjb25maWcuYXN5bmNgIGlzIGB0cnVlYCBhbmQgdGhlcmUncyBub3QgYSBjYWxsYmFjayBmdW5jdGlvbiwgRXRhIHdpbGwgcmV0dXJuIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZW5kZXJlZCB0ZW1wbGF0ZS5cclxuICpcclxuICogSWYgYGNvbmZpZy5jYWNoZWAgaXMgYHRydWVgIGFuZCBgY29uZmlnYCBoYXMgYSBgbmFtZWAgb3IgYGZpbGVuYW1lYCBwcm9wZXJ0eSwgRXRhIHdpbGwgY2FjaGUgdGhlIHRlbXBsYXRlIG9uIHRoZSBmaXJzdCByZW5kZXIgYW5kIHVzZSB0aGUgY2FjaGVkIHRlbXBsYXRlIGZvciBhbGwgc3Vic2VxdWVudCByZW5kZXJzLlxyXG4gKlxyXG4gKiBAcGFyYW0gdGVtcGxhdGUgVGVtcGxhdGUgc3RyaW5nIG9yIHRlbXBsYXRlIGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSBkYXRhIERhdGEgdG8gcmVuZGVyIHRoZSB0ZW1wbGF0ZSB3aXRoXHJcbiAqIEBwYXJhbSBjb25maWcgT3B0aW9uYWwgY29uZmlnIG9wdGlvbnNcclxuICogQHBhcmFtIGNiIENhbGxiYWNrIGZ1bmN0aW9uXHJcbiAqL1xyXG5mdW5jdGlvbiByZW5kZXIodGVtcGxhdGUsIGRhdGEsIGNvbmZpZywgY2IpIHtcclxuICAgIHZhciBvcHRpb25zID0gZ2V0Q29uZmlnKGNvbmZpZyB8fCB7fSk7XHJcbiAgICBpZiAob3B0aW9ucy5hc3luYykge1xyXG4gICAgICAgIGlmIChjYikge1xyXG4gICAgICAgICAgICAvLyBJZiB1c2VyIHBhc3NlcyBjYWxsYmFja1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgLy8gTm90ZTogaWYgdGhlcmUgaXMgYW4gZXJyb3Igd2hpbGUgcmVuZGVyaW5nIHRoZSB0ZW1wbGF0ZSxcclxuICAgICAgICAgICAgICAgIC8vIEl0IHdpbGwgYnViYmxlIHVwIGFuZCBiZSBjYXVnaHQgaGVyZVxyXG4gICAgICAgICAgICAgICAgdmFyIHRlbXBsYXRlRm4gPSBoYW5kbGVDYWNoZSh0ZW1wbGF0ZSwgb3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZUZuKGRhdGEsIG9wdGlvbnMsIGNiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY2IoZXJyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gTm8gY2FsbGJhY2ssIHRyeSByZXR1cm5pbmcgYSBwcm9taXNlXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvbWlzZUltcGwgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgcHJvbWlzZUltcGwoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoaGFuZGxlQ2FjaGUodGVtcGxhdGUsIG9wdGlvbnMpKGRhdGEsIG9wdGlvbnMpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRocm93IEV0YUVycihcIlBsZWFzZSBwcm92aWRlIGEgY2FsbGJhY2sgZnVuY3Rpb24sIHRoaXMgZW52IGRvZXNuJ3Qgc3VwcG9ydCBQcm9taXNlc1wiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBoYW5kbGVDYWNoZSh0ZW1wbGF0ZSwgb3B0aW9ucykoZGF0YSwgb3B0aW9ucyk7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIFJlbmRlciBhIHRlbXBsYXRlIGFzeW5jaHJvbm91c2x5XHJcbiAqXHJcbiAqIElmIGB0ZW1wbGF0ZWAgaXMgYSBzdHJpbmcsIEV0YSB3aWxsIGNvbXBpbGUgaXQgdG8gYSBmdW5jdGlvbiBhbmQgY2FsbCBpdCB3aXRoIHRoZSBwcm92aWRlZCBkYXRhLlxyXG4gKiBJZiBgdGVtcGxhdGVgIGlzIGEgZnVuY3Rpb24sIEV0YSB3aWxsIGNhbGwgaXQgd2l0aCB0aGUgcHJvdmlkZWQgZGF0YS5cclxuICpcclxuICogSWYgdGhlcmUgaXMgYSBjYWxsYmFjayBmdW5jdGlvbiwgRXRhIHdpbGwgY2FsbCBpdCB3aXRoIGAoZXJyLCByZW5kZXJlZFRlbXBsYXRlKWAuXHJcbiAqIElmIHRoZXJlIGlzIG5vdCBhIGNhbGxiYWNrIGZ1bmN0aW9uLCBFdGEgd2lsbCByZXR1cm4gYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJlbmRlcmVkIHRlbXBsYXRlXHJcbiAqXHJcbiAqIEBwYXJhbSB0ZW1wbGF0ZSBUZW1wbGF0ZSBzdHJpbmcgb3IgdGVtcGxhdGUgZnVuY3Rpb25cclxuICogQHBhcmFtIGRhdGEgRGF0YSB0byByZW5kZXIgdGhlIHRlbXBsYXRlIHdpdGhcclxuICogQHBhcmFtIGNvbmZpZyBPcHRpb25hbCBjb25maWcgb3B0aW9uc1xyXG4gKiBAcGFyYW0gY2IgQ2FsbGJhY2sgZnVuY3Rpb25cclxuICovXHJcbmZ1bmN0aW9uIHJlbmRlckFzeW5jKHRlbXBsYXRlLCBkYXRhLCBjb25maWcsIGNiKSB7XHJcbiAgICAvLyBVc2luZyBPYmplY3QuYXNzaWduIHRvIGxvd2VyIGJ1bmRsZSBzaXplLCB1c2luZyBzcHJlYWQgb3BlcmF0b3IgbWFrZXMgaXQgbGFyZ2VyIGJlY2F1c2Ugb2YgdHlwZXNjcmlwdCBpbmplY3RlZCBwb2x5ZmlsbHNcclxuICAgIHJldHVybiByZW5kZXIodGVtcGxhdGUsIGRhdGEsIE9iamVjdC5hc3NpZ24oe30sIGNvbmZpZywgeyBhc3luYzogdHJ1ZSB9KSwgY2IpO1xyXG59XG5cbi8vIEBkZW5vaWZ5LWlnbm9yZVxyXG5jb25maWcuaW5jbHVkZUZpbGUgPSBpbmNsdWRlRmlsZUhlbHBlcjtcclxuY29uZmlnLmZpbGVwYXRoQ2FjaGUgPSB7fTtcblxuZXhwb3J0IHsgcmVuZGVyRmlsZSBhcyBfX2V4cHJlc3MsIGNvbXBpbGUsIGNvbXBpbGVUb1N0cmluZywgY29uZmlnLCBjb25maWd1cmUsIGNvbmZpZyBhcyBkZWZhdWx0Q29uZmlnLCBnZXRDb25maWcsIGxvYWRGaWxlLCBwYXJzZSwgcmVuZGVyLCByZW5kZXJBc3luYywgcmVuZGVyRmlsZSwgcmVuZGVyRmlsZUFzeW5jLCB0ZW1wbGF0ZXMgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWV0YS5lcy5qcy5tYXBcbiIsImltcG9ydCBUZW1wbGF0ZXJQbHVnaW4gZnJvbSBcIm1haW5cIjtcbmltcG9ydCB7IEFwcCB9IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IHsgUnVubmluZ0NvbmZpZyB9IGZyb20gXCJUZW1wbGF0ZXJcIjtcbmltcG9ydCB7IFRQYXJzZXIgfSBmcm9tIFwiVFBhcnNlclwiO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSW50ZXJuYWxNb2R1bGUgaW1wbGVtZW50cyBUUGFyc2VyIHtcbiAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgbmFtZTogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBzdGF0aWNfdGVtcGxhdGVzOiBNYXA8c3RyaW5nLCBhbnk+ID0gbmV3IE1hcCgpO1xuICAgIHByb3RlY3RlZCBkeW5hbWljX3RlbXBsYXRlczogTWFwPHN0cmluZywgYW55PiA9IG5ldyBNYXAoKTtcbiAgICBwcm90ZWN0ZWQgY29uZmlnOiBSdW5uaW5nQ29uZmlnO1xuICAgIHByaXZhdGUgc3RhdGljX2NvbnRleHQ6IHtbeDogc3RyaW5nXTogYW55fTtcblxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBhcHA6IEFwcCwgcHJvdGVjdGVkIHBsdWdpbjogVGVtcGxhdGVyUGx1Z2luKSB7fVxuXG4gICAgZ2V0TmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lXG4gICAgfVxuXG4gICAgYWJzdHJhY3QgY3JlYXRlU3RhdGljVGVtcGxhdGVzKCk6IFByb21pc2U8dm9pZD47XG4gICAgYWJzdHJhY3QgdXBkYXRlVGVtcGxhdGVzKCk6IFByb21pc2U8dm9pZD47XG5cbiAgICBhc3luYyBpbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZVN0YXRpY1RlbXBsYXRlcygpO1xuICAgICAgICB0aGlzLnN0YXRpY19jb250ZXh0ID0gT2JqZWN0LmZyb21FbnRyaWVzKHRoaXMuc3RhdGljX3RlbXBsYXRlcyk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2VuZXJhdGVDb250ZXh0KGNvbmZpZzogUnVubmluZ0NvbmZpZyk6IFByb21pc2U8e1t4OiBzdHJpbmddOiBhbnl9PiB7XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVRlbXBsYXRlcygpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi50aGlzLnN0YXRpY19jb250ZXh0LFxuICAgICAgICAgICAgLi4uT2JqZWN0LmZyb21FbnRyaWVzKHRoaXMuZHluYW1pY190ZW1wbGF0ZXMpLFxuICAgICAgICB9O1xuICAgIH1cbn0iLCJpbXBvcnQgeyBUZW1wbGF0ZXJFcnJvciB9IGZyb20gXCJFcnJvclwiO1xuaW1wb3J0IHsgSW50ZXJuYWxNb2R1bGUgfSBmcm9tIFwiLi4vSW50ZXJuYWxNb2R1bGVcIjtcblxuZXhwb3J0IGNsYXNzIEludGVybmFsTW9kdWxlRGF0ZSBleHRlbmRzIEludGVybmFsTW9kdWxlIHtcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nID0gXCJkYXRlXCI7XG5cbiAgICBhc3luYyBjcmVhdGVTdGF0aWNUZW1wbGF0ZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuc3RhdGljX3RlbXBsYXRlcy5zZXQoXCJub3dcIiwgdGhpcy5nZW5lcmF0ZV9ub3coKSk7XG4gICAgICAgIHRoaXMuc3RhdGljX3RlbXBsYXRlcy5zZXQoXCJ0b21vcnJvd1wiLCB0aGlzLmdlbmVyYXRlX3RvbW9ycm93KCkpO1xuICAgICAgICB0aGlzLnN0YXRpY190ZW1wbGF0ZXMuc2V0KFwid2Vla2RheVwiLCB0aGlzLmdlbmVyYXRlX3dlZWtkYXkoKSk7XG4gICAgICAgIHRoaXMuc3RhdGljX3RlbXBsYXRlcy5zZXQoXCJ5ZXN0ZXJkYXlcIiwgdGhpcy5nZW5lcmF0ZV95ZXN0ZXJkYXkoKSk7XG4gICAgfVxuXG4gICAgYXN5bmMgdXBkYXRlVGVtcGxhdGVzKCk6IFByb21pc2U8dm9pZD4ge31cblxuICAgIGdlbmVyYXRlX25vdygpOiBGdW5jdGlvbiB7XG4gICAgICAgIHJldHVybiAoZm9ybWF0OiBzdHJpbmcgPSBcIllZWVktTU0tRERcIiwgb2Zmc2V0PzogbnVtYmVyfHN0cmluZywgcmVmZXJlbmNlPzogc3RyaW5nLCByZWZlcmVuY2VfZm9ybWF0Pzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBpZiAocmVmZXJlbmNlICYmICF3aW5kb3cubW9tZW50KHJlZmVyZW5jZSwgcmVmZXJlbmNlX2Zvcm1hdCkuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRlbXBsYXRlckVycm9yKFwiSW52YWxpZCByZWZlcmVuY2UgZGF0ZSBmb3JtYXQsIHRyeSBzcGVjaWZ5aW5nIG9uZSB3aXRoIHRoZSBhcmd1bWVudCAncmVmZXJlbmNlX2Zvcm1hdCdcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgZHVyYXRpb247XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9mZnNldCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gd2luZG93Lm1vbWVudC5kdXJhdGlvbihvZmZzZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIG9mZnNldCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gd2luZG93Lm1vbWVudC5kdXJhdGlvbihvZmZzZXQsIFwiZGF5c1wiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5tb21lbnQocmVmZXJlbmNlLCByZWZlcmVuY2VfZm9ybWF0KS5hZGQoZHVyYXRpb24pLmZvcm1hdChmb3JtYXQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2VuZXJhdGVfdG9tb3Jyb3coKTogRnVuY3Rpb24ge1xuICAgICAgICByZXR1cm4gKGZvcm1hdDogc3RyaW5nID0gXCJZWVlZLU1NLUREXCIpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB3aW5kb3cubW9tZW50KCkuYWRkKDEsICdkYXlzJykuZm9ybWF0KGZvcm1hdCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZW5lcmF0ZV93ZWVrZGF5KCk6IEZ1bmN0aW9uIHtcbiAgICAgICAgcmV0dXJuIChmb3JtYXQ6IHN0cmluZyA9IFwiWVlZWS1NTS1ERFwiLCB3ZWVrZGF5OiBudW1iZXIsIHJlZmVyZW5jZT86IHN0cmluZywgcmVmZXJlbmNlX2Zvcm1hdD86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgaWYgKHJlZmVyZW5jZSAmJiAhd2luZG93Lm1vbWVudChyZWZlcmVuY2UsIHJlZmVyZW5jZV9mb3JtYXQpLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUZW1wbGF0ZXJFcnJvcihcIkludmFsaWQgcmVmZXJlbmNlIGRhdGUgZm9ybWF0LCB0cnkgc3BlY2lmeWluZyBvbmUgd2l0aCB0aGUgYXJndW1lbnQgJ3JlZmVyZW5jZV9mb3JtYXQnXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5tb21lbnQocmVmZXJlbmNlLCByZWZlcmVuY2VfZm9ybWF0KS53ZWVrZGF5KHdlZWtkYXkpLmZvcm1hdChmb3JtYXQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2VuZXJhdGVfeWVzdGVyZGF5KCk6IEZ1bmN0aW9uIHtcbiAgICAgICAgcmV0dXJuIChmb3JtYXQ6IHN0cmluZyA9IFwiWVlZWS1NTS1ERFwiKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gd2luZG93Lm1vbWVudCgpLmFkZCgtMSwgJ2RheXMnKS5mb3JtYXQoZm9ybWF0KTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCJpbXBvcnQgeyBJbnRlcm5hbE1vZHVsZSB9IGZyb20gXCIuLi9JbnRlcm5hbE1vZHVsZVwiO1xuXG5pbXBvcnQgeyBGaWxlU3lzdGVtQWRhcHRlciwgZ2V0QWxsVGFncywgTWFya2Rvd25WaWV3LCBub3JtYWxpemVQYXRoLCBwYXJzZUxpbmt0ZXh0LCBQbGF0Zm9ybSwgcmVzb2x2ZVN1YnBhdGgsIFRGaWxlLCBURm9sZGVyIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQgeyBVTlNVUFBPUlRFRF9NT0JJTEVfVEVNUExBVEUgfSBmcm9tIFwiQ29uc3RhbnRzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZXJFcnJvciB9IGZyb20gXCJFcnJvclwiO1xuXG5leHBvcnQgY29uc3QgREVQVEhfTElNSVQgPSAxMDtcblxuZXhwb3J0IGNsYXNzIEludGVybmFsTW9kdWxlRmlsZSBleHRlbmRzIEludGVybmFsTW9kdWxlIHtcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nID0gXCJmaWxlXCI7XG4gICAgcHJpdmF0ZSBpbmNsdWRlX2RlcHRoOiBudW1iZXIgPSAwO1xuICAgIHByaXZhdGUgY3JlYXRlX25ld19kZXB0aDogbnVtYmVyID0gMDtcbiAgICBwcml2YXRlIGxpbmtwYXRoX3JlZ2V4OiBSZWdFeHAgPSBuZXcgUmVnRXhwKFwiXlxcXFxbXFxcXFsoLiopXFxcXF1cXFxcXSRcIik7XG5cbiAgICBhc3luYyBjcmVhdGVTdGF0aWNUZW1wbGF0ZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuc3RhdGljX3RlbXBsYXRlcy5zZXQoXCJjcmVhdGlvbl9kYXRlXCIsIHRoaXMuZ2VuZXJhdGVfY3JlYXRpb25fZGF0ZSgpKTtcbiAgICAgICAgdGhpcy5zdGF0aWNfdGVtcGxhdGVzLnNldChcImNyZWF0ZV9uZXdcIiwgdGhpcy5nZW5lcmF0ZV9jcmVhdGVfbmV3KCkpO1xuICAgICAgICB0aGlzLnN0YXRpY190ZW1wbGF0ZXMuc2V0KFwiY3Vyc29yXCIsIHRoaXMuZ2VuZXJhdGVfY3Vyc29yKCkpO1xuICAgICAgICB0aGlzLnN0YXRpY190ZW1wbGF0ZXMuc2V0KFwiY3Vyc29yX2FwcGVuZFwiLCB0aGlzLmdlbmVyYXRlX2N1cnNvcl9hcHBlbmQoKSk7XG4gICAgICAgIHRoaXMuc3RhdGljX3RlbXBsYXRlcy5zZXQoXCJleGlzdHNcIiwgdGhpcy5nZW5lcmF0ZV9leGlzdHMoKSk7XG4gICAgICAgIHRoaXMuc3RhdGljX3RlbXBsYXRlcy5zZXQoXCJmaW5kX3RmaWxlXCIsIHRoaXMuZ2VuZXJhdGVfZmluZF90ZmlsZSgpKTtcbiAgICAgICAgdGhpcy5zdGF0aWNfdGVtcGxhdGVzLnNldChcImZvbGRlclwiLCB0aGlzLmdlbmVyYXRlX2ZvbGRlcigpKTtcbiAgICAgICAgdGhpcy5zdGF0aWNfdGVtcGxhdGVzLnNldChcImluY2x1ZGVcIiwgdGhpcy5nZW5lcmF0ZV9pbmNsdWRlKCkpO1xuICAgICAgICB0aGlzLnN0YXRpY190ZW1wbGF0ZXMuc2V0KFwibGFzdF9tb2RpZmllZF9kYXRlXCIsIHRoaXMuZ2VuZXJhdGVfbGFzdF9tb2RpZmllZF9kYXRlKCkpO1xuICAgICAgICB0aGlzLnN0YXRpY190ZW1wbGF0ZXMuc2V0KFwibW92ZVwiLCB0aGlzLmdlbmVyYXRlX21vdmUoKSk7XG4gICAgICAgIHRoaXMuc3RhdGljX3RlbXBsYXRlcy5zZXQoXCJwYXRoXCIsIHRoaXMuZ2VuZXJhdGVfcGF0aCgpKTtcbiAgICAgICAgdGhpcy5zdGF0aWNfdGVtcGxhdGVzLnNldChcInJlbmFtZVwiLCB0aGlzLmdlbmVyYXRlX3JlbmFtZSgpKTtcbiAgICAgICAgdGhpcy5zdGF0aWNfdGVtcGxhdGVzLnNldChcInNlbGVjdGlvblwiLCB0aGlzLmdlbmVyYXRlX3NlbGVjdGlvbigpKTtcbiAgICB9XG5cbiAgICBhc3luYyB1cGRhdGVUZW1wbGF0ZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuZHluYW1pY190ZW1wbGF0ZXMuc2V0KFwiY29udGVudFwiLCBhd2FpdCB0aGlzLmdlbmVyYXRlX2NvbnRlbnQoKSk7XG4gICAgICAgIHRoaXMuZHluYW1pY190ZW1wbGF0ZXMuc2V0KFwidGFnc1wiLCB0aGlzLmdlbmVyYXRlX3RhZ3MoKSk7XG4gICAgICAgIHRoaXMuZHluYW1pY190ZW1wbGF0ZXMuc2V0KFwidGl0bGVcIiwgdGhpcy5nZW5lcmF0ZV90aXRsZSgpKTtcbiAgICB9IFxuXG4gICAgYXN5bmMgZ2VuZXJhdGVfY29udGVudCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5hcHAudmF1bHQucmVhZCh0aGlzLmNvbmZpZy50YXJnZXRfZmlsZSk7XG4gICAgfVxuXG4gICAgZ2VuZXJhdGVfY3JlYXRlX25ldygpOiBGdW5jdGlvbiB7XG4gICAgICAgIHJldHVybiBhc3luYyAodGVtcGxhdGU6IFRGaWxlIHwgc3RyaW5nLCBmaWxlbmFtZT86IHN0cmluZywgb3Blbl9uZXc6IGJvb2xlYW4gPSBmYWxzZSwgZm9sZGVyPzogVEZvbGRlcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVfbmV3X2RlcHRoICs9IDE7XG4gICAgICAgICAgICBpZiAodGhpcy5jcmVhdGVfbmV3X2RlcHRoID4gREVQVEhfTElNSVQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZV9uZXdfZGVwdGggPSAwO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUZW1wbGF0ZXJFcnJvcihcIlJlYWNoZWQgY3JlYXRlX25ldyBkZXB0aCBsaW1pdCAobWF4ID0gMTApXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBuZXdfZmlsZSA9IGF3YWl0IHRoaXMucGx1Z2luLnRlbXBsYXRlci5jcmVhdGVfbmV3X25vdGVfZnJvbV90ZW1wbGF0ZSh0ZW1wbGF0ZSwgZm9sZGVyLCBmaWxlbmFtZSwgb3Blbl9uZXcpXG5cbiAgICAgICAgICAgIHRoaXMuY3JlYXRlX25ld19kZXB0aCAtPSAxO1xuXG4gICAgICAgICAgICByZXR1cm4gbmV3X2ZpbGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZW5lcmF0ZV9jcmVhdGlvbl9kYXRlKCk6IEZ1bmN0aW9uIHtcbiAgICAgICAgcmV0dXJuIChmb3JtYXQ6IHN0cmluZyA9IFwiWVlZWS1NTS1ERCBISDptbVwiKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gd2luZG93Lm1vbWVudCh0aGlzLmNvbmZpZy50YXJnZXRfZmlsZS5zdGF0LmN0aW1lKS5mb3JtYXQoZm9ybWF0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdlbmVyYXRlX2N1cnNvcigpOiBGdW5jdGlvbiB7XG4gICAgICAgIHJldHVybiAob3JkZXI/OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIC8vIEhhY2sgdG8gcHJldmVudCBlbXB0eSBvdXRwdXRcbiAgICAgICAgICAgIHJldHVybiBgPCUgdHAuZmlsZS5jdXJzb3IoJHtvcmRlciA/PyAnJ30pICU+YDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdlbmVyYXRlX2N1cnNvcl9hcHBlbmQoKTogRnVuY3Rpb24ge1xuICAgICAgICByZXR1cm4gKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgICAgICAgICBjb25zdCBhY3RpdmVfdmlldyA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldyk7XG4gICAgICAgICAgICBpZiAoYWN0aXZlX3ZpZXcgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5sb2dfZXJyb3IobmV3IFRlbXBsYXRlckVycm9yKFwiTm8gYWN0aXZlIHZpZXcsIGNhbid0IGFwcGVuZCB0byBjdXJzb3IuXCIpKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGVkaXRvciA9IGFjdGl2ZV92aWV3LmVkaXRvcjtcbiAgICAgICAgICAgIGNvbnN0IGRvYyA9IGVkaXRvci5nZXREb2MoKTtcbiAgICAgICAgICAgIGRvYy5yZXBsYWNlU2VsZWN0aW9uKGNvbnRlbnQpO1xuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZW5lcmF0ZV9leGlzdHMoKTogRnVuY3Rpb24ge1xuICAgICAgICByZXR1cm4gKGZpbGVuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIC8vIFRPRE86IFJlbW92ZSB0aGlzLCBvbmx5IGhlcmUgdG8gc3VwcG9ydCB0aGUgb2xkIHdheVxuICAgICAgICAgICAgbGV0IG1hdGNoO1xuICAgICAgICAgICAgaWYgKChtYXRjaCA9IHRoaXMubGlua3BhdGhfcmVnZXguZXhlYyhmaWxlbmFtZSkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZmlsZSA9IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QoZmlsZW5hbWUsIFwiXCIpO1xuICAgICAgICAgICAgcmV0dXJuIGZpbGUgIT0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdlbmVyYXRlX2ZpbmRfdGZpbGUoKTogRnVuY3Rpb24ge1xuICAgICAgICByZXR1cm4gKGZpbGVuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBhdGggPSBub3JtYWxpemVQYXRoKGZpbGVuYW1lKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KHBhdGgsIFwiXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2VuZXJhdGVfZm9sZGVyKCk6IEZ1bmN0aW9uIHtcbiAgICAgICAgcmV0dXJuIChyZWxhdGl2ZTogYm9vbGVhbiA9IGZhbHNlKSA9PiB7XG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gdGhpcy5jb25maWcudGFyZ2V0X2ZpbGUucGFyZW50O1xuICAgICAgICAgICAgbGV0IGZvbGRlcjtcblxuICAgICAgICAgICAgaWYgKHJlbGF0aXZlKSB7XG4gICAgICAgICAgICAgICAgZm9sZGVyID0gcGFyZW50LnBhdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb2xkZXIgPSBwYXJlbnQubmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIGZvbGRlcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdlbmVyYXRlX2luY2x1ZGUoKTogRnVuY3Rpb24ge1xuICAgICAgICByZXR1cm4gYXN5bmMgKGluY2x1ZGVfbGluazogc3RyaW5nIHwgVEZpbGUpID0+IHtcbiAgICAgICAgICAgIC8vIFRPRE86IEFkZCBtdXRleCBmb3IgdGhpcywgdGhpcyBtYXkgY3VycmVudGx5IGxlYWQgdG8gYSByYWNlIGNvbmRpdGlvbi4gXG4gICAgICAgICAgICAvLyBXaGlsZSBub3QgdmVyeSBpbXBhY3RmdWwsIHRoYXQgY291bGQgc3RpbGwgYmUgYW5ub3lpbmcuXG4gICAgICAgICAgICB0aGlzLmluY2x1ZGVfZGVwdGggKz0gMTtcbiAgICAgICAgICAgIGlmICh0aGlzLmluY2x1ZGVfZGVwdGggPiBERVBUSF9MSU1JVCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5jbHVkZV9kZXB0aCA9IDA7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRlbXBsYXRlckVycm9yKFwiUmVhY2hlZCBpbmNsdXNpb24gZGVwdGggbGltaXQgKG1heCA9IDEwKVwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGluY19maWxlX2NvbnRlbnQ6IHN0cmluZztcblxuICAgICAgICAgICAgaWYgKGluY2x1ZGVfbGluayBpbnN0YW5jZW9mIFRGaWxlKSB7XG4gICAgICAgICAgICAgICAgaW5jX2ZpbGVfY29udGVudCA9IGF3YWl0IHRoaXMuYXBwLnZhdWx0LnJlYWQoaW5jbHVkZV9saW5rKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IG1hdGNoO1xuICAgICAgICAgICAgICAgIGlmICgobWF0Y2ggPSB0aGlzLmxpbmtwYXRoX3JlZ2V4LmV4ZWMoaW5jbHVkZV9saW5rKSkgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRlbXBsYXRlckVycm9yKFwiSW52YWxpZCBmaWxlIGZvcm1hdCwgcHJvdmlkZSBhbiBvYnNpZGlhbiBsaW5rIGJldHdlZW4gcXVvdGVzLlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3Qge3BhdGgsIHN1YnBhdGh9ID0gcGFyc2VMaW5rdGV4dChtYXRjaFsxXSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpbmNfZmlsZSA9IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QocGF0aCwgXCJcIik7XG4gICAgICAgICAgICAgICAgaWYgKCFpbmNfZmlsZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVGVtcGxhdGVyRXJyb3IoYEZpbGUgJHtpbmNsdWRlX2xpbmt9IGRvZXNuJ3QgZXhpc3RgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaW5jX2ZpbGVfY29udGVudCA9IGF3YWl0IHRoaXMuYXBwLnZhdWx0LnJlYWQoaW5jX2ZpbGUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHN1YnBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FjaGUgPSB0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShpbmNfZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVzb2x2ZVN1YnBhdGgoY2FjaGUsIHN1YnBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY19maWxlX2NvbnRlbnQgPSBpbmNfZmlsZV9jb250ZW50LnNsaWNlKHJlc3VsdC5zdGFydC5vZmZzZXQsIHJlc3VsdC5lbmQ/Lm9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IFxuXG4gICAgICAgICAgICBjb25zdCBwYXJzZWRfY29udGVudCA9IGF3YWl0IHRoaXMucGx1Z2luLnRlbXBsYXRlci5wYXJzZXIucGFyc2VUZW1wbGF0ZXMoaW5jX2ZpbGVfY29udGVudCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRoaXMuaW5jbHVkZV9kZXB0aCAtPSAxO1xuICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiBwYXJzZWRfY29udGVudDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdlbmVyYXRlX2xhc3RfbW9kaWZpZWRfZGF0ZSgpOiBGdW5jdGlvbiB7XG4gICAgICAgIHJldHVybiAoZm9ybWF0OiBzdHJpbmcgPSBcIllZWVktTU0tREQgSEg6bW1cIik6IHN0cmluZyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gd2luZG93Lm1vbWVudCh0aGlzLmNvbmZpZy50YXJnZXRfZmlsZS5zdGF0Lm10aW1lKS5mb3JtYXQoZm9ybWF0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdlbmVyYXRlX21vdmUoKTogRnVuY3Rpb24ge1xuICAgICAgICByZXR1cm4gYXN5bmMgKHBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgY29uc3QgbmV3X3BhdGggPSBub3JtYWxpemVQYXRoKGAke3BhdGh9LiR7dGhpcy5jb25maWcudGFyZ2V0X2ZpbGUuZXh0ZW5zaW9ufWApO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hcHAuZmlsZU1hbmFnZXIucmVuYW1lRmlsZSh0aGlzLmNvbmZpZy50YXJnZXRfZmlsZSwgbmV3X3BhdGgpO1xuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZW5lcmF0ZV9wYXRoKCk6IEZ1bmN0aW9uIHtcbiAgICAgICAgcmV0dXJuIChyZWxhdGl2ZTogYm9vbGVhbiA9IGZhbHNlKSA9PiB7XG4gICAgICAgICAgICAvLyBUT0RPOiBBZGQgbW9iaWxlIHN1cHBvcnRcbiAgICAgICAgICAgIGlmIChQbGF0Zm9ybS5pc01vYmlsZUFwcCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBVTlNVUFBPUlRFRF9NT0JJTEVfVEVNUExBVEU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoISh0aGlzLmFwcC52YXVsdC5hZGFwdGVyIGluc3RhbmNlb2YgRmlsZVN5c3RlbUFkYXB0ZXIpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRlbXBsYXRlckVycm9yKFwiYXBwLnZhdWx0IGlzIG5vdCBhIEZpbGVTeXN0ZW1BZGFwdGVyIGluc3RhbmNlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdmF1bHRfcGF0aCA9IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIuZ2V0QmFzZVBhdGgoKTtcblxuICAgICAgICAgICAgaWYgKHJlbGF0aXZlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLnRhcmdldF9maWxlLnBhdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7dmF1bHRfcGF0aH0vJHt0aGlzLmNvbmZpZy50YXJnZXRfZmlsZS5wYXRofWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZW5lcmF0ZV9yZW5hbWUoKTogRnVuY3Rpb24ge1xuICAgICAgICByZXR1cm4gYXN5bmMgKG5ld190aXRsZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBpZiAobmV3X3RpdGxlLm1hdGNoKC9bXFxcXFxcLzpdKy9nKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUZW1wbGF0ZXJFcnJvcihcIkZpbGUgbmFtZSBjYW5ub3QgY29udGFpbiBhbnkgb2YgdGhlc2UgY2hhcmFjdGVyczogXFxcXCAvIDpcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBuZXdfcGF0aCA9IG5vcm1hbGl6ZVBhdGgoYCR7dGhpcy5jb25maWcudGFyZ2V0X2ZpbGUucGFyZW50LnBhdGh9LyR7bmV3X3RpdGxlfS4ke3RoaXMuY29uZmlnLnRhcmdldF9maWxlLmV4dGVuc2lvbn1gKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYXBwLmZpbGVNYW5hZ2VyLnJlbmFtZUZpbGUodGhpcy5jb25maWcudGFyZ2V0X2ZpbGUsIG5ld19wYXRoKTtcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2VuZXJhdGVfc2VsZWN0aW9uKCk6IEZ1bmN0aW9uIHtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZV92aWV3ID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KTtcbiAgICAgICAgICAgIGlmIChhY3RpdmVfdmlldyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRlbXBsYXRlckVycm9yKFwiQWN0aXZlIHZpZXcgaXMgbnVsbCwgY2FuJ3QgcmVhZCBzZWxlY3Rpb24uXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBlZGl0b3IgPSBhY3RpdmVfdmlldy5lZGl0b3I7XG4gICAgICAgICAgICByZXR1cm4gZWRpdG9yLmdldFNlbGVjdGlvbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVE9ETzogVHVybiB0aGlzIGludG8gYSBmdW5jdGlvblxuICAgIGdlbmVyYXRlX3RhZ3MoKTogc3RyaW5nW10ge1xuICAgICAgICBjb25zdCBjYWNoZSA9IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKHRoaXMuY29uZmlnLnRhcmdldF9maWxlKTtcbiAgICAgICAgcmV0dXJuIGdldEFsbFRhZ3MoY2FjaGUpO1xuICAgIH1cblxuICAgIC8vIFRPRE86IFR1cm4gdGhpcyBpbnRvIGEgZnVuY3Rpb25cbiAgICBnZW5lcmF0ZV90aXRsZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25maWcudGFyZ2V0X2ZpbGUuYmFzZW5hbWU7XG4gICAgfVxufSIsImltcG9ydCB7IFRlbXBsYXRlckVycm9yIH0gZnJvbSBcIkVycm9yXCI7XG5pbXBvcnQgeyBJbnRlcm5hbE1vZHVsZSB9IGZyb20gXCIuLi9JbnRlcm5hbE1vZHVsZVwiO1xuXG5leHBvcnQgY2xhc3MgSW50ZXJuYWxNb2R1bGVXZWIgZXh0ZW5kcyBJbnRlcm5hbE1vZHVsZSB7XG4gICAgbmFtZSA9IFwid2ViXCI7XG5cbiAgICBhc3luYyBjcmVhdGVTdGF0aWNUZW1wbGF0ZXMoKSB7XG4gICAgICAgIHRoaXMuc3RhdGljX3RlbXBsYXRlcy5zZXQoXCJkYWlseV9xdW90ZVwiLCB0aGlzLmdlbmVyYXRlX2RhaWx5X3F1b3RlKCkpO1xuICAgICAgICB0aGlzLnN0YXRpY190ZW1wbGF0ZXMuc2V0KFwicmFuZG9tX3BpY3R1cmVcIiwgdGhpcy5nZW5lcmF0ZV9yYW5kb21fcGljdHVyZSgpKTtcbiAgICAgICAgLy90aGlzLnN0YXRpY190ZW1wbGF0ZXMuc2V0KFwiZ2V0X3JlcXVlc3RcIiwgdGhpcy5nZW5lcmF0ZV9nZXRfcmVxdWVzdCgpKTtcbiAgICB9XG4gICAgXG4gICAgYXN5bmMgdXBkYXRlVGVtcGxhdGVzKCkge31cblxuICAgIGFzeW5jIGdldFJlcXVlc3QodXJsOiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUZW1wbGF0ZXJFcnJvcihcIkVycm9yIHBlcmZvcm1pbmcgR0VUIHJlcXVlc3RcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cblxuICAgIGdlbmVyYXRlX2RhaWx5X3F1b3RlKCkge1xuICAgICAgICByZXR1cm4gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5nZXRSZXF1ZXN0KFwiaHR0cHM6Ly9xdW90ZXMucmVzdC9xb2RcIik7XG4gICAgICAgICAgICBsZXQganNvbiA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgICAgICAgICAgbGV0IGF1dGhvciA9IGpzb24uY29udGVudHMucXVvdGVzWzBdLmF1dGhvcjtcbiAgICAgICAgICAgIGxldCBxdW90ZSA9IGpzb24uY29udGVudHMucXVvdGVzWzBdLnF1b3RlO1xuICAgICAgICAgICAgbGV0IG5ld19jb250ZW50ID0gYD4gJHtxdW90ZX1cXG4+ICZtZGFzaDsgPGNpdGU+JHthdXRob3J9PC9jaXRlPmA7XG5cbiAgICAgICAgICAgIHJldHVybiBuZXdfY29udGVudDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdlbmVyYXRlX3JhbmRvbV9waWN0dXJlKCkge1xuICAgICAgICByZXR1cm4gYXN5bmMgKHNpemU6IHN0cmluZywgcXVlcnk/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZ2V0UmVxdWVzdChgaHR0cHM6Ly9zb3VyY2UudW5zcGxhc2guY29tL3JhbmRvbS8ke3NpemUgPz8gJyd9PyR7cXVlcnkgPz8gJyd9YCk7XG4gICAgICAgICAgICBsZXQgdXJsID0gcmVzcG9uc2UudXJsO1xuICAgICAgICAgICAgcmV0dXJuIGAhW3RwLndlYi5yYW5kb21fcGljdHVyZV0oJHt1cmx9KWA7ICAgXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZW5lcmF0ZV9nZXRfcmVxdWVzdCgpIHtcbiAgICAgICAgcmV0dXJuIGFzeW5jICh1cmw6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5nZXRSZXF1ZXN0KHVybCk7XG4gICAgICAgICAgICBsZXQganNvbiA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgIHJldHVybiBqc29uO1xuICAgICAgICB9XG4gICAgfVxufSIsImltcG9ydCB7IEludGVybmFsTW9kdWxlIH0gZnJvbSBcIi4uL0ludGVybmFsTW9kdWxlXCI7XG5cbmV4cG9ydCBjbGFzcyBJbnRlcm5hbE1vZHVsZUZyb250bWF0dGVyIGV4dGVuZHMgSW50ZXJuYWxNb2R1bGUge1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmcgPSBcImZyb250bWF0dGVyXCI7XG5cbiAgICBhc3luYyBjcmVhdGVTdGF0aWNUZW1wbGF0ZXMoKTogUHJvbWlzZTx2b2lkPiB7fVxuXG4gICAgYXN5bmMgdXBkYXRlVGVtcGxhdGVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBjYWNoZSA9IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKHRoaXMuY29uZmlnLnRhcmdldF9maWxlKVxuICAgICAgICB0aGlzLmR5bmFtaWNfdGVtcGxhdGVzID0gbmV3IE1hcChPYmplY3QuZW50cmllcyhjYWNoZT8uZnJvbnRtYXR0ZXIgfHwge30pKTtcbiAgICB9XG59IiwiaW1wb3J0IHsgVGVtcGxhdGVyRXJyb3IgfSBmcm9tIFwiRXJyb3JcIjtcbmltcG9ydCB7IEFwcCwgTW9kYWwgfSBmcm9tIFwib2JzaWRpYW5cIjtcblxuZXhwb3J0IGNsYXNzIFByb21wdE1vZGFsIGV4dGVuZHMgTW9kYWwge1xuICAgIHByaXZhdGUgcHJvbXB0RWw6IEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgcHJpdmF0ZSByZXNvbHZlOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZDtcbiAgICBwcml2YXRlIHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZDtcbiAgICBwcml2YXRlIHN1Ym1pdHRlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IoYXBwOiBBcHAsIHByaXZhdGUgcHJvbXB0X3RleHQ6IHN0cmluZywgcHJpdmF0ZSBkZWZhdWx0X3ZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoYXBwKTtcbiAgICB9XG5cbiAgICBvbk9wZW4oKTogdm9pZCB7XG4gICAgICAgIHRoaXMudGl0bGVFbC5zZXRUZXh0KHRoaXMucHJvbXB0X3RleHQpO1xuICAgICAgICB0aGlzLmNyZWF0ZUZvcm0oKTtcbiAgICB9XG5cbiAgICBvbkNsb3NlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbnRlbnRFbC5lbXB0eSgpO1xuICAgICAgICBpZiAoIXRoaXMuc3VibWl0dGVkKSB7XG4gICAgICAgICAgICB0aGlzLnJlamVjdChuZXcgVGVtcGxhdGVyRXJyb3IoXCJDYW5jZWxsZWQgcHJvbXB0XCIpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNyZWF0ZUZvcm0oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGRpdiA9IHRoaXMuY29udGVudEVsLmNyZWF0ZURpdigpO1xuICAgICAgICBkaXYuYWRkQ2xhc3MoXCJ0ZW1wbGF0ZXItcHJvbXB0LWRpdlwiKTtcblxuICAgICAgICBjb25zdCBmb3JtID0gZGl2LmNyZWF0ZUVsKFwiZm9ybVwiKTtcbiAgICAgICAgZm9ybS5hZGRDbGFzcyhcInRlbXBsYXRlci1wcm9tcHQtZm9ybVwiKTtcbiAgICAgICAgZm9ybS50eXBlID0gXCJzdWJtaXRcIjtcbiAgICAgICAgZm9ybS5vbnN1Ym1pdCA9IChlOiBFdmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdWJtaXR0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlKHRoaXMucHJvbXB0RWwudmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wcm9tcHRFbCA9IGZvcm0uY3JlYXRlRWwoXCJpbnB1dFwiKTtcbiAgICAgICAgdGhpcy5wcm9tcHRFbC50eXBlID0gXCJ0ZXh0XCI7XG4gICAgICAgIHRoaXMucHJvbXB0RWwucGxhY2Vob2xkZXIgPSBcIlR5cGUgdGV4dCBoZXJlLi4uXCI7XG4gICAgICAgIHRoaXMucHJvbXB0RWwudmFsdWUgPSB0aGlzLmRlZmF1bHRfdmFsdWUgPz8gXCJcIjtcbiAgICAgICAgdGhpcy5wcm9tcHRFbC5hZGRDbGFzcyhcInRlbXBsYXRlci1wcm9tcHQtaW5wdXRcIilcbiAgICAgICAgdGhpcy5wcm9tcHRFbC5zZWxlY3QoKTtcbiAgICB9XG5cbiAgICBhc3luYyBvcGVuQW5kR2V0VmFsdWUocmVzb2x2ZTogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWQsIHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLnJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICB0aGlzLnJlamVjdCA9IHJlamVjdDtcbiAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgfVxufSIsImltcG9ydCB7IFRlbXBsYXRlckVycm9yIH0gZnJvbSBcIkVycm9yXCI7XG5pbXBvcnQgeyBBcHAsIEZ1enp5TWF0Y2gsIEZ1enp5U3VnZ2VzdE1vZGFsIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5cblxuZXhwb3J0IGNsYXNzIFN1Z2dlc3Rlck1vZGFsPFQ+IGV4dGVuZHMgRnV6enlTdWdnZXN0TW9kYWw8VD4ge1xuICAgIHByaXZhdGUgcmVzb2x2ZTogKHZhbHVlOiBUKSA9PiB2b2lkO1xuICAgIHByaXZhdGUgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkO1xuICAgIHByaXZhdGUgc3VibWl0dGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcHJpdmF0ZSB0ZXh0X2l0ZW1zOiBzdHJpbmdbXSB8ICgoaXRlbTogVCkgPT4gc3RyaW5nKSwgcHJpdmF0ZSBpdGVtczogVFtdLCBwbGFjZWhvbGRlcjogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGFwcCk7XG4gICAgICAgIHRoaXMuc2V0UGxhY2Vob2xkZXIocGxhY2Vob2xkZXIpO1xuICAgIH1cblxuICAgIGdldEl0ZW1zKCk6IFRbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLml0ZW1zO1xuICAgIH1cbiAgICBcbiAgICBvbkNsb3NlKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuc3VibWl0dGVkKSB7XG4gICAgICAgICAgICB0aGlzLnJlamVjdChuZXcgVGVtcGxhdGVyRXJyb3IoXCJDYW5jZWxsZWQgcHJvbXB0XCIpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNlbGVjdFN1Z2dlc3Rpb24odmFsdWU6IEZ1enp5TWF0Y2g8VD4sIGV2dDogTW91c2VFdmVudCB8IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdWJtaXR0ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIHRoaXMub25DaG9vc2VTdWdnZXN0aW9uKHZhbHVlLCBldnQpO1xuICAgIH1cblxuICAgIGdldEl0ZW1UZXh0KGl0ZW06IFQpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy50ZXh0X2l0ZW1zIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRleHRfaXRlbXMoaXRlbSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dF9pdGVtc1t0aGlzLml0ZW1zLmluZGV4T2YoaXRlbSldIHx8IFwiVW5kZWZpbmVkIFRleHQgSXRlbVwiO1xuICAgIH1cblxuICAgIG9uQ2hvb3NlSXRlbShpdGVtOiBULCBfZXZ0OiBNb3VzZUV2ZW50IHwgS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlc29sdmUoaXRlbSk7XG4gICAgfVxuXG4gICAgYXN5bmMgb3BlbkFuZEdldFZhbHVlKHJlc29sdmU6ICh2YWx1ZTogVCkgPT4gdm9pZCwgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMucmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgIHRoaXMucmVqZWN0ID0gcmVqZWN0O1xuICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICB9XG59IiwiaW1wb3J0IHsgVU5TVVBQT1JURURfTU9CSUxFX1RFTVBMQVRFIH0gZnJvbSBcIkNvbnN0YW50c1wiO1xuaW1wb3J0IHsgSW50ZXJuYWxNb2R1bGUgfSBmcm9tIFwiSW50ZXJuYWxUZW1wbGF0ZXMvSW50ZXJuYWxNb2R1bGVcIjtcbmltcG9ydCB7IFBsYXRmb3JtIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQgeyBQcm9tcHRNb2RhbCB9IGZyb20gXCIuL1Byb21wdE1vZGFsXCI7XG5pbXBvcnQgeyBTdWdnZXN0ZXJNb2RhbCB9IGZyb20gXCIuL1N1Z2dlc3Rlck1vZGFsXCI7XG5cbmV4cG9ydCBjbGFzcyBJbnRlcm5hbE1vZHVsZVN5c3RlbSBleHRlbmRzIEludGVybmFsTW9kdWxlIHtcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nID0gXCJzeXN0ZW1cIjtcblxuICAgIGFzeW5jIGNyZWF0ZVN0YXRpY1RlbXBsYXRlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5zdGF0aWNfdGVtcGxhdGVzLnNldChcImNsaXBib2FyZFwiLCB0aGlzLmdlbmVyYXRlX2NsaXBib2FyZCgpKTtcbiAgICAgICAgdGhpcy5zdGF0aWNfdGVtcGxhdGVzLnNldChcInByb21wdFwiLCB0aGlzLmdlbmVyYXRlX3Byb21wdCgpKTtcbiAgICAgICAgdGhpcy5zdGF0aWNfdGVtcGxhdGVzLnNldChcInN1Z2dlc3RlclwiLCB0aGlzLmdlbmVyYXRlX3N1Z2dlc3RlcigpKTtcbiAgICB9XG5cbiAgICBhc3luYyB1cGRhdGVUZW1wbGF0ZXMoKTogUHJvbWlzZTx2b2lkPiB7fVxuXG4gICAgZ2VuZXJhdGVfY2xpcGJvYXJkKCk6IEZ1bmN0aW9uIHtcbiAgICAgICAgcmV0dXJuIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIC8vIFRPRE86IEFkZCBtb2JpbGUgc3VwcG9ydFxuICAgICAgICAgICAgaWYgKFBsYXRmb3JtLmlzTW9iaWxlQXBwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFVOU1VQUE9SVEVEX01PQklMRV9URU1QTEFURTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLnJlYWRUZXh0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZW5lcmF0ZV9wcm9tcHQoKTogRnVuY3Rpb24ge1xuICAgICAgICByZXR1cm4gYXN5bmMgKHByb21wdF90ZXh0Pzogc3RyaW5nLCBkZWZhdWx0X3ZhbHVlPzogc3RyaW5nLCB0aHJvd19vbl9jYW5jZWw6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gICAgICAgICAgICBjb25zdCBwcm9tcHQgPSBuZXcgUHJvbXB0TW9kYWwodGhpcy5hcHAsIHByb21wdF90ZXh0LCBkZWZhdWx0X3ZhbHVlKTtcbiAgICAgICAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZTogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWQsIHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZCkgPT4gcHJvbXB0Lm9wZW5BbmRHZXRWYWx1ZShyZXNvbHZlLCByZWplY3QpKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHByb21pc2U7XG4gICAgICAgICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRocm93X29uX2NhbmNlbCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZW5lcmF0ZV9zdWdnZXN0ZXIoKTogRnVuY3Rpb24ge1xuICAgICAgICByZXR1cm4gYXN5bmMgPFQ+KHRleHRfaXRlbXM6IHN0cmluZ1tdIHwgKChpdGVtOiBUKSA9PiBzdHJpbmcpLCBpdGVtczogVFtdLCB0aHJvd19vbl9jYW5jZWw6IGJvb2xlYW4gPSBmYWxzZSwgcGxhY2Vob2xkZXI6IHN0cmluZyA9IFwiXCIpOiBQcm9taXNlPFQ+ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN1Z2dlc3RlciA9IG5ldyBTdWdnZXN0ZXJNb2RhbCh0aGlzLmFwcCwgdGV4dF9pdGVtcywgaXRlbXMsIHBsYWNlaG9sZGVyKTtcbiAgICAgICAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZTogKHZhbHVlOiBUKSA9PiB2b2lkLCByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQpID0+IHN1Z2dlc3Rlci5vcGVuQW5kR2V0VmFsdWUocmVzb2x2ZSwgcmVqZWN0KSk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBwcm9taXNlXG4gICAgICAgICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRocm93X29uX2NhbmNlbCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59IiwiaW1wb3J0IHsgSW50ZXJuYWxNb2R1bGUgfSBmcm9tIFwiSW50ZXJuYWxUZW1wbGF0ZXMvSW50ZXJuYWxNb2R1bGVcIjtcbmltcG9ydCB7IFJ1bk1vZGUsIFJ1bm5pbmdDb25maWcgfSBmcm9tIFwiVGVtcGxhdGVyXCI7XG5cbmV4cG9ydCBjbGFzcyBJbnRlcm5hbE1vZHVsZUNvbmZpZyBleHRlbmRzIEludGVybmFsTW9kdWxlIHtcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nID0gXCJjb25maWdcIjtcblxuICAgIGFzeW5jIGNyZWF0ZVN0YXRpY1RlbXBsYXRlcygpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgICBhc3luYyB1cGRhdGVUZW1wbGF0ZXMoKTogUHJvbWlzZTx2b2lkPiB7fVxuXG4gICAgYXN5bmMgZ2VuZXJhdGVDb250ZXh0KGNvbmZpZzogUnVubmluZ0NvbmZpZyk6IFByb21pc2U8e1t4OiBzdHJpbmddOiBhbnl9PiB7XG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxufSIsImltcG9ydCB7IEFwcCwgVEZpbGUgfSBmcm9tIFwib2JzaWRpYW5cIjtcblxuaW1wb3J0IFRlbXBsYXRlclBsdWdpbiBmcm9tIFwibWFpblwiO1xuaW1wb3J0IHsgVFBhcnNlciB9IGZyb20gXCJUUGFyc2VyXCI7XG5pbXBvcnQgeyBJbnRlcm5hbE1vZHVsZSB9IGZyb20gXCIuL0ludGVybmFsTW9kdWxlXCI7XG5pbXBvcnQgeyBJbnRlcm5hbE1vZHVsZURhdGUgfSBmcm9tIFwiLi9kYXRlL0ludGVybmFsTW9kdWxlRGF0ZVwiO1xuaW1wb3J0IHsgSW50ZXJuYWxNb2R1bGVGaWxlIH0gZnJvbSBcIi4vZmlsZS9JbnRlcm5hbE1vZHVsZUZpbGVcIjtcbmltcG9ydCB7IEludGVybmFsTW9kdWxlV2ViIH0gZnJvbSBcIi4vd2ViL0ludGVybmFsTW9kdWxlV2ViXCI7XG5pbXBvcnQgeyBJbnRlcm5hbE1vZHVsZUZyb250bWF0dGVyIH0gZnJvbSBcIi4vZnJvbnRtYXR0ZXIvSW50ZXJuYWxNb2R1bGVGcm9udG1hdHRlclwiO1xuaW1wb3J0IHsgSW50ZXJuYWxNb2R1bGVTeXN0ZW0gfSBmcm9tIFwiLi9zeXN0ZW0vSW50ZXJuYWxNb2R1bGVTeXN0ZW1cIjtcbmltcG9ydCB7IFJ1bm5pbmdDb25maWcgfSBmcm9tIFwiVGVtcGxhdGVyXCI7XG5pbXBvcnQgeyBJbnRlcm5hbE1vZHVsZUNvbmZpZyB9IGZyb20gXCIuL2NvbmZpZy9JbnRlcm5hbE1vZHVsZUNvbmZpZ1wiO1xuXG5leHBvcnQgY2xhc3MgSW50ZXJuYWxUZW1wbGF0ZVBhcnNlciBpbXBsZW1lbnRzIFRQYXJzZXIge1xuICAgIHByaXZhdGUgbW9kdWxlc19hcnJheTogQXJyYXk8SW50ZXJuYWxNb2R1bGU+ID0gbmV3IEFycmF5KCk7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgYXBwOiBBcHAsIHByb3RlY3RlZCBwbHVnaW46IFRlbXBsYXRlclBsdWdpbikge1xuICAgICAgICB0aGlzLm1vZHVsZXNfYXJyYXkucHVzaChuZXcgSW50ZXJuYWxNb2R1bGVEYXRlKHRoaXMuYXBwLCB0aGlzLnBsdWdpbikpO1xuICAgICAgICB0aGlzLm1vZHVsZXNfYXJyYXkucHVzaChuZXcgSW50ZXJuYWxNb2R1bGVGaWxlKHRoaXMuYXBwLCB0aGlzLnBsdWdpbikpO1xuICAgICAgICB0aGlzLm1vZHVsZXNfYXJyYXkucHVzaChuZXcgSW50ZXJuYWxNb2R1bGVXZWIodGhpcy5hcHAsIHRoaXMucGx1Z2luKSk7XG4gICAgICAgIHRoaXMubW9kdWxlc19hcnJheS5wdXNoKG5ldyBJbnRlcm5hbE1vZHVsZUZyb250bWF0dGVyKHRoaXMuYXBwLCB0aGlzLnBsdWdpbikpO1xuICAgICAgICB0aGlzLm1vZHVsZXNfYXJyYXkucHVzaChuZXcgSW50ZXJuYWxNb2R1bGVTeXN0ZW0odGhpcy5hcHAsIHRoaXMucGx1Z2luKSk7XG4gICAgICAgIHRoaXMubW9kdWxlc19hcnJheS5wdXNoKG5ldyBJbnRlcm5hbE1vZHVsZUNvbmZpZyh0aGlzLmFwcCwgdGhpcy5wbHVnaW4pKTtcbiAgICB9XG5cbiAgICBhc3luYyBpbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBmb3IgKGNvbnN0IG1vZCBvZiB0aGlzLm1vZHVsZXNfYXJyYXkpIHtcbiAgICAgICAgICAgIGF3YWl0IG1vZC5pbml0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBnZW5lcmF0ZUNvbnRleHQoY29uZmlnOiBSdW5uaW5nQ29uZmlnKTogUHJvbWlzZTx7fT4ge1xuICAgICAgICBjb25zdCBtb2R1bGVzX2NvbnRleHQ6IHtba2V5OiBzdHJpbmddOiBhbnl9ID0ge307XG5cbiAgICAgICAgZm9yIChjb25zdCBtb2Qgb2YgdGhpcy5tb2R1bGVzX2FycmF5KSB7XG4gICAgICAgICAgICBtb2R1bGVzX2NvbnRleHRbbW9kLmdldE5hbWUoKV0gPSBhd2FpdCBtb2QuZ2VuZXJhdGVDb250ZXh0KGNvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbW9kdWxlc19jb250ZXh0O1xuICAgIH1cbn0iLCJpbXBvcnQgeyBBcHAsIEZpbGVTeXN0ZW1BZGFwdGVyLCBQbGF0Zm9ybSwgVEZpbGUgfSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCB7IGV4ZWMgfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgcHJvbWlzaWZ5IH0gZnJvbSBcInV0aWxcIjtcblxuaW1wb3J0IFRlbXBsYXRlclBsdWdpbiBmcm9tIFwibWFpblwiO1xuaW1wb3J0IHsgQ29udGV4dE1vZGUgfSBmcm9tIFwiVGVtcGxhdGVQYXJzZXJcIjtcbmltcG9ydCB7IFRQYXJzZXIgfSBmcm9tIFwiVFBhcnNlclwiO1xuaW1wb3J0IHsgVU5TVVBQT1JURURfTU9CSUxFX1RFTVBMQVRFIH0gZnJvbSBcIkNvbnN0YW50c1wiO1xuaW1wb3J0IHsgUnVubmluZ0NvbmZpZyB9IGZyb20gXCJUZW1wbGF0ZXJcIjtcbmltcG9ydCB7IGdldFRGaWxlc0Zyb21Gb2xkZXIgfSBmcm9tIFwiVXRpbHNcIjtcbmltcG9ydCB7IFRlbXBsYXRlckVycm9yIH0gZnJvbSBcIkVycm9yXCI7XG5cbmV4cG9ydCBjbGFzcyBVc2VyVGVtcGxhdGVQYXJzZXIgaW1wbGVtZW50cyBUUGFyc2VyIHtcbiAgICBwcml2YXRlIGN3ZDogc3RyaW5nO1xuICAgIHByaXZhdGUgZXhlY19wcm9taXNlOiBGdW5jdGlvbjtcbiAgICBwcml2YXRlIHVzZXJfc3lzdGVtX2NvbW1hbmRfZnVuY3Rpb25zOiBNYXA8c3RyaW5nLCBGdW5jdGlvbj4gPSBuZXcgTWFwKCk7XG4gICAgcHJpdmF0ZSB1c2VyX3NjcmlwdF9mdW5jdGlvbnM6IE1hcDxzdHJpbmcsIEZ1bmN0aW9uPiA9IG5ldyBNYXAoKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgYXBwOiBBcHAsIHByaXZhdGUgcGx1Z2luOiBUZW1wbGF0ZXJQbHVnaW4pIHtcbiAgICAgICAgdGhpcy5zZXR1cCgpOyAgICAgICAgXG4gICAgfVxuXG4gICAgc2V0dXAoKTogdm9pZCB7XG4gICAgICAgIGlmIChQbGF0Zm9ybS5pc01vYmlsZUFwcCB8fCAhKHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIgaW5zdGFuY2VvZiBGaWxlU3lzdGVtQWRhcHRlcikpIHtcbiAgICAgICAgICAgIHRoaXMuY3dkID0gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3dkID0gdGhpcy5hcHAudmF1bHQuYWRhcHRlci5nZXRCYXNlUGF0aCgpO1xuICAgICAgICAgICAgdGhpcy5leGVjX3Byb21pc2UgPSBwcm9taXNpZnkoZXhlYyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBpbml0KCk6IFByb21pc2U8dm9pZD4ge31cblxuICAgIGFzeW5jIGdlbmVyYXRlX3VzZXJfc2NyaXB0X2Z1bmN0aW9ucyhjb25maWc6IFJ1bm5pbmdDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGZpbGVzID0gZ2V0VEZpbGVzRnJvbUZvbGRlcih0aGlzLmFwcCwgdGhpcy5wbHVnaW4uc2V0dGluZ3Muc2NyaXB0X2ZvbGRlcik7XG5cbiAgICAgICAgZm9yIChsZXQgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICAgICAgaWYgKGZpbGUuZXh0ZW5zaW9uLnRvTG93ZXJDYXNlKCkgPT09IFwianNcIikge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubG9hZF91c2VyX3NjcmlwdF9mdW5jdGlvbihjb25maWcsIGZpbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgbG9hZF91c2VyX3NjcmlwdF9mdW5jdGlvbihjb25maWc6IFJ1bm5pbmdDb25maWcsIGZpbGU6IFRGaWxlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghKHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIgaW5zdGFuY2VvZiBGaWxlU3lzdGVtQWRhcHRlcikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUZW1wbGF0ZXJFcnJvcihcImFwcC52YXVsdCBpcyBub3QgYSBGaWxlU3lzdGVtQWRhcHRlciBpbnN0YW5jZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdmF1bHRfcGF0aCA9IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIuZ2V0QmFzZVBhdGgoKTtcbiAgICAgICAgbGV0IGZpbGVfcGF0aCA9IGAke3ZhdWx0X3BhdGh9LyR7ZmlsZS5wYXRofWA7XG5cbiAgICAgICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjY2MzM5MDEvcmVsb2FkLW1vZHVsZS1hdC1ydW50aW1lXG4gICAgICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE5NzIyNDIvaG93LXRvLWF1dG8tcmVsb2FkLWZpbGVzLWluLW5vZGUtanNcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHdpbmRvdy5yZXF1aXJlLmNhY2hlKS5jb250YWlucyhmaWxlX3BhdGgpKSB7XG4gICAgICAgICAgICBkZWxldGUgd2luZG93LnJlcXVpcmUuY2FjaGVbd2luZG93LnJlcXVpcmUucmVzb2x2ZShmaWxlX3BhdGgpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVzZXJfZnVuY3Rpb24gPSBhd2FpdCBpbXBvcnQoZmlsZV9wYXRoKTtcbiAgICAgICAgaWYgKCF1c2VyX2Z1bmN0aW9uLmRlZmF1bHQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUZW1wbGF0ZXJFcnJvcihgRmFpbGVkIHRvIGxvYWQgdXNlciBzY3JpcHQgJHtmaWxlX3BhdGh9LiBObyBleHBvcnRzIGRldGVjdGVkLmApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKHVzZXJfZnVuY3Rpb24uZGVmYXVsdCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFRlbXBsYXRlckVycm9yKGBGYWlsZWQgdG8gbG9hZCB1c2VyIHNjcmlwdCAke2ZpbGVfcGF0aH0uIERlZmF1bHQgZXhwb3J0IGlzIG5vdCBhIGZ1bmN0aW9uLmApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlcl9zY3JpcHRfZnVuY3Rpb25zLnNldChgJHtmaWxlLmJhc2VuYW1lfWAsIHVzZXJfZnVuY3Rpb24uZGVmYXVsdCk7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogQWRkIG1vYmlsZSBzdXBwb3J0XG4gICAgYXN5bmMgZ2VuZXJhdGVfc3lzdGVtX2NvbW1hbmRfdXNlcl9mdW5jdGlvbnMoY29uZmlnOiBSdW5uaW5nQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBhd2FpdCB0aGlzLnBsdWdpbi50ZW1wbGF0ZXIucGFyc2VyLmdlbmVyYXRlQ29udGV4dChjb25maWcsIENvbnRleHRNb2RlLklOVEVSTkFMKTtcblxuICAgICAgICBmb3IgKGxldCBbdGVtcGxhdGUsIGNtZF0gb2YgdGhpcy5wbHVnaW4uc2V0dGluZ3MudGVtcGxhdGVzX3BhaXJzKSB7XG4gICAgICAgICAgICBpZiAodGVtcGxhdGUgPT09IFwiXCIgfHwgY21kID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChQbGF0Zm9ybS5pc01vYmlsZUFwcCkge1xuICAgICAgICAgICAgICAgIHRoaXMudXNlcl9zeXN0ZW1fY29tbWFuZF9mdW5jdGlvbnMuc2V0KHRlbXBsYXRlLCAodXNlcl9hcmdzPzogYW55KTogc3RyaW5nID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVOU1VQUE9SVEVEX01PQklMRV9URU1QTEFURTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY21kID0gYXdhaXQgdGhpcy5wbHVnaW4udGVtcGxhdGVyLnBhcnNlci5wYXJzZVRlbXBsYXRlcyhjbWQsIGNvbnRleHQpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy51c2VyX3N5c3RlbV9jb21tYW5kX2Z1bmN0aW9ucy5zZXQodGVtcGxhdGUsIGFzeW5jICh1c2VyX2FyZ3M/OiBhbnkpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9jZXNzX2VudiA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnByb2Nlc3MuZW52LFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4udXNlcl9hcmdzLFxuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtZF9vcHRpb25zID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dDogdGhpcy5wbHVnaW4uc2V0dGluZ3MuY29tbWFuZF90aW1lb3V0ICogMTAwMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGN3ZDogdGhpcy5jd2QsXG4gICAgICAgICAgICAgICAgICAgICAgICBlbnY6IHByb2Nlc3NfZW52LFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uKHRoaXMucGx1Z2luLnNldHRpbmdzLnNoZWxsX3BhdGggIT09IFwiXCIgJiYge3NoZWxsOiB0aGlzLnBsdWdpbi5zZXR0aW5ncy5zaGVsbF9wYXRofSksXG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHtzdGRvdXR9ID0gYXdhaXQgdGhpcy5leGVjX3Byb21pc2UoY21kLCBjbWRfb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3Rkb3V0LnRyaW1SaWdodCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVGVtcGxhdGVyRXJyb3IoYEVycm9yIHdpdGggVXNlciBUZW1wbGF0ZSAke3RlbXBsYXRlfWAsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgZ2VuZXJhdGVDb250ZXh0KGNvbmZpZzogUnVubmluZ0NvbmZpZyk6IFByb21pc2U8e30+IHtcbiAgICAgICAgdGhpcy51c2VyX3N5c3RlbV9jb21tYW5kX2Z1bmN0aW9ucy5jbGVhcigpO1xuICAgICAgICB0aGlzLnVzZXJfc2NyaXB0X2Z1bmN0aW9ucy5jbGVhcigpO1xuXG4gICAgICAgIGlmICh0aGlzLnBsdWdpbi5zZXR0aW5ncy5lbmFibGVfc3lzdGVtX2NvbW1hbmRzKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmdlbmVyYXRlX3N5c3RlbV9jb21tYW5kX3VzZXJfZnVuY3Rpb25zKGNvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUT0RPOiBBZGQgbW9iaWxlIHN1cHBvcnRcbiAgICAgICAgaWYgKFBsYXRmb3JtLmlzRGVza3RvcEFwcCAmJiB0aGlzLnBsdWdpbi5zZXR0aW5ncy5zY3JpcHRfZm9sZGVyKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmdlbmVyYXRlX3VzZXJfc2NyaXB0X2Z1bmN0aW9ucyhjb25maWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLk9iamVjdC5mcm9tRW50cmllcyh0aGlzLnVzZXJfc3lzdGVtX2NvbW1hbmRfZnVuY3Rpb25zKSxcbiAgICAgICAgICAgIC4uLk9iamVjdC5mcm9tRW50cmllcyh0aGlzLnVzZXJfc2NyaXB0X2Z1bmN0aW9ucyksXG4gICAgICAgIH07XG4gICAgfVxufSIsImltcG9ydCB7IEFwcCB9IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0ICogYXMgRXRhIGZyb20gXCJldGFcIjtcblxuaW1wb3J0IHsgSW50ZXJuYWxUZW1wbGF0ZVBhcnNlciB9IGZyb20gXCIuL0ludGVybmFsVGVtcGxhdGVzL0ludGVybmFsVGVtcGxhdGVQYXJzZXJcIjtcbmltcG9ydCBUZW1wbGF0ZXJQbHVnaW4gZnJvbSBcIi4vbWFpblwiO1xuaW1wb3J0IHsgVXNlclRlbXBsYXRlUGFyc2VyIH0gZnJvbSBcIi4vVXNlclRlbXBsYXRlcy9Vc2VyVGVtcGxhdGVQYXJzZXJcIjtcbmltcG9ydCB7IFRQYXJzZXIgfSBmcm9tIFwiVFBhcnNlclwiO1xuaW1wb3J0IHsgb2JzaWRpYW5fbW9kdWxlIH0gZnJvbSBcIlV0aWxzXCI7XG5pbXBvcnQgeyBSdW5uaW5nQ29uZmlnIH0gZnJvbSBcIlRlbXBsYXRlclwiO1xuXG5leHBvcnQgZW51bSBDb250ZXh0TW9kZSB7XG4gICAgSU5URVJOQUwsXG4gICAgVVNFUl9JTlRFUk5BTCxcbn07XG5cbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZVBhcnNlciBpbXBsZW1lbnRzIFRQYXJzZXIge1xuICAgIHB1YmxpYyBpbnRlcm5hbFRlbXBsYXRlUGFyc2VyOiBJbnRlcm5hbFRlbXBsYXRlUGFyc2VyO1xuXHRwdWJsaWMgdXNlclRlbXBsYXRlUGFyc2VyOiBVc2VyVGVtcGxhdGVQYXJzZXI7XG4gICAgcHVibGljIGN1cnJlbnRfY29udGV4dDoge307XG4gICAgXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBhcHA6IEFwcCwgcHJpdmF0ZSBwbHVnaW46IFRlbXBsYXRlclBsdWdpbikge1xuICAgICAgICB0aGlzLmludGVybmFsVGVtcGxhdGVQYXJzZXIgPSBuZXcgSW50ZXJuYWxUZW1wbGF0ZVBhcnNlcih0aGlzLmFwcCwgdGhpcy5wbHVnaW4pO1xuICAgICAgICB0aGlzLnVzZXJUZW1wbGF0ZVBhcnNlciA9IG5ldyBVc2VyVGVtcGxhdGVQYXJzZXIodGhpcy5hcHAsIHRoaXMucGx1Z2luKTtcbiAgICB9XG5cbiAgICBhc3luYyBpbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmludGVybmFsVGVtcGxhdGVQYXJzZXIuaW5pdCgpO1xuICAgICAgICBhd2FpdCB0aGlzLnVzZXJUZW1wbGF0ZVBhcnNlci5pbml0KCk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2V0Q3VycmVudENvbnRleHQoY29uZmlnOiBSdW5uaW5nQ29uZmlnLCBjb250ZXh0X21vZGU6IENvbnRleHRNb2RlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuY3VycmVudF9jb250ZXh0ID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUNvbnRleHQoY29uZmlnLCBjb250ZXh0X21vZGUpO1xuICAgIH1cblxuICAgIGFkZGl0aW9uYWxDb250ZXh0KCk6IHt9IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG9ic2lkaWFuOiBvYnNpZGlhbl9tb2R1bGUsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgYXN5bmMgZ2VuZXJhdGVDb250ZXh0KGNvbmZpZzogUnVubmluZ0NvbmZpZywgY29udGV4dF9tb2RlOiBDb250ZXh0TW9kZSA9IENvbnRleHRNb2RlLlVTRVJfSU5URVJOQUwpOiBQcm9taXNlPHt9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB7fTtcbiAgICAgICAgY29uc3QgYWRkaXRpb25hbF9jb250ZXh0ID0gdGhpcy5hZGRpdGlvbmFsQ29udGV4dCgpO1xuICAgICAgICBjb25zdCBpbnRlcm5hbF9jb250ZXh0ID0gYXdhaXQgdGhpcy5pbnRlcm5hbFRlbXBsYXRlUGFyc2VyLmdlbmVyYXRlQ29udGV4dChjb25maWcpO1xuICAgICAgICBsZXQgdXNlcl9jb250ZXh0ID0ge307XG5cbiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRfY29udGV4dCkge1xuICAgICAgICAgICAgLy8gSWYgYSB1c2VyIHN5c3RlbSBjb21tYW5kIGlzIHVzaW5nIHRwLmZpbGUuaW5jbHVkZSwgd2UgbmVlZCB0aGUgY29udGV4dCB0byBiZSBzZXQuXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRfY29udGV4dCA9IGludGVybmFsX2NvbnRleHQ7XG4gICAgICAgIH1cblxuICAgICAgICBPYmplY3QuYXNzaWduKGNvbnRleHQsIGFkZGl0aW9uYWxfY29udGV4dCk7XG4gICAgICAgIHN3aXRjaCAoY29udGV4dF9tb2RlKSB7XG4gICAgICAgICAgICBjYXNlIENvbnRleHRNb2RlLklOVEVSTkFMOlxuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY29udGV4dCwgaW50ZXJuYWxfY29udGV4dCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIENvbnRleHRNb2RlLlVTRVJfSU5URVJOQUw6XG4gICAgICAgICAgICAgICAgdXNlcl9jb250ZXh0ID0gYXdhaXQgdGhpcy51c2VyVGVtcGxhdGVQYXJzZXIuZ2VuZXJhdGVDb250ZXh0KGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihjb250ZXh0LCB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmludGVybmFsX2NvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgIHVzZXI6IHVzZXJfY29udGV4dCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgIH1cblxuICAgIGFzeW5jIHBhcnNlVGVtcGxhdGVzKGNvbnRlbnQ6IHN0cmluZywgY29udGV4dD86IGFueSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGlmICghY29udGV4dCkge1xuICAgICAgICAgICAgY29udGV4dCA9IHRoaXMuY3VycmVudF9jb250ZXh0O1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGVudCA9IGF3YWl0IEV0YS5yZW5kZXJBc3luYyhjb250ZW50LCBjb250ZXh0LCB7XG4gICAgICAgICAgICB2YXJOYW1lOiBcInRwXCIsXG4gICAgICAgICAgICBwYXJzZToge1xuICAgICAgICAgICAgICAgIGV4ZWM6IFwiKlwiLFxuICAgICAgICAgICAgICAgIGludGVycG9sYXRlOiBcIn5cIixcbiAgICAgICAgICAgICAgICByYXc6IFwiXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXV0b1RyaW06IGZhbHNlLFxuICAgICAgICAgICAgZ2xvYmFsQXdhaXQ6IHRydWUsXG4gICAgICAgIH0pIGFzIHN0cmluZztcblxuICAgICAgICByZXR1cm4gY29udGVudDtcbiAgICB9XG59IiwiaW1wb3J0IHsgQXBwLCBNYXJrZG93blBvc3RQcm9jZXNzb3JDb250ZXh0LCBNYXJrZG93blZpZXcsIFRGaWxlLCBURm9sZGVyIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5cbmltcG9ydCB7IEN1cnNvckp1bXBlciB9IGZyb20gXCJDdXJzb3JKdW1wZXJcIjtcbmltcG9ydCBUZW1wbGF0ZXJQbHVnaW4gZnJvbSBcIm1haW5cIjtcbmltcG9ydCB7IENvbnRleHRNb2RlLCBUZW1wbGF0ZVBhcnNlciB9IGZyb20gXCJUZW1wbGF0ZVBhcnNlclwiO1xuaW1wb3J0IHsgVGVtcGxhdGVyRXJyb3IgfSBmcm9tIFwiRXJyb3JcIjtcblxuZXhwb3J0IGVudW0gUnVuTW9kZSB7XG4gICAgQ3JlYXRlTmV3RnJvbVRlbXBsYXRlLFxuICAgIEFwcGVuZEFjdGl2ZUZpbGUsXG4gICAgT3ZlcndyaXRlRmlsZSxcbiAgICBPdmVyd3JpdGVBY3RpdmVGaWxlLFxuICAgIER5bmFtaWNQcm9jZXNzb3IsXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bm5pbmdDb25maWcge1xuICAgIHRlbXBsYXRlX2ZpbGU6IFRGaWxlLFxuICAgIHRhcmdldF9maWxlOiBURmlsZSxcbiAgICBydW5fbW9kZTogUnVuTW9kZSxcbn07XG5cbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZXIge1xuICAgIHB1YmxpYyBwYXJzZXI6IFRlbXBsYXRlUGFyc2VyO1xuICAgIHB1YmxpYyBjdXJzb3JfanVtcGVyOiBDdXJzb3JKdW1wZXI7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGFwcDogQXBwLCBwcml2YXRlIHBsdWdpbjogVGVtcGxhdGVyUGx1Z2luKSB7XG4gICAgICAgIHRoaXMuY3Vyc29yX2p1bXBlciA9IG5ldyBDdXJzb3JKdW1wZXIodGhpcy5hcHApO1xuXHRcdHRoaXMucGFyc2VyID0gbmV3IFRlbXBsYXRlUGFyc2VyKHRoaXMuYXBwLCB0aGlzLnBsdWdpbik7XG4gICAgfVxuXG4gICAgYXN5bmMgc2V0dXAoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucGFyc2VyLmluaXQoKTtcbiAgICB9XG5cbiAgICBjcmVhdGVfcnVubmluZ19jb25maWcodGVtcGxhdGVfZmlsZTogVEZpbGUsIHRhcmdldF9maWxlOiBURmlsZSwgcnVuX21vZGU6IFJ1bk1vZGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRlbXBsYXRlX2ZpbGU6IHRlbXBsYXRlX2ZpbGUsXG4gICAgICAgICAgICB0YXJnZXRfZmlsZTogdGFyZ2V0X2ZpbGUsXG4gICAgICAgICAgICBydW5fbW9kZTogcnVuX21vZGUsXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyByZWFkX2FuZF9wYXJzZV90ZW1wbGF0ZShjb25maWc6IFJ1bm5pbmdDb25maWcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCB0ZW1wbGF0ZV9jb250ZW50ID0gYXdhaXQgdGhpcy5hcHAudmF1bHQucmVhZChjb25maWcudGVtcGxhdGVfZmlsZSk7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlX3RlbXBsYXRlKGNvbmZpZywgdGVtcGxhdGVfY29udGVudCk7XG4gICAgfVxuXG4gICAgYXN5bmMgcGFyc2VfdGVtcGxhdGUoY29uZmlnOiBSdW5uaW5nQ29uZmlnLCB0ZW1wbGF0ZV9jb250ZW50OiBzdHJpbmcpOiBQcm9taXNlIDxzdHJpbmc+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5wYXJzZXIuc2V0Q3VycmVudENvbnRleHQoY29uZmlnLCBDb250ZXh0TW9kZS5VU0VSX0lOVEVSTkFMKTtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMucGFyc2VyLnBhcnNlVGVtcGxhdGVzKHRlbXBsYXRlX2NvbnRlbnQpO1xuICAgICAgICByZXR1cm4gY29udGVudDtcbiAgICB9XG5cbiAgICBhc3luYyBjcmVhdGVfbmV3X25vdGVfZnJvbV90ZW1wbGF0ZSh0ZW1wbGF0ZTogVEZpbGUgfCBzdHJpbmcsIGZvbGRlcj86IFRGb2xkZXIsIGZpbGVuYW1lPzogc3RyaW5nLCBvcGVuX25ld19ub3RlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8VEZpbGU+IHtcbiAgICAgICAgaWYgKCFmb2xkZXIpIHtcbiAgICAgICAgICAgIGZvbGRlciA9IHRoaXMuYXBwLmZpbGVNYW5hZ2VyLmdldE5ld0ZpbGVQYXJlbnQoXCJcIik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETzogQ2hhbmdlIHRoYXQsIG5vdCBzdGFibGUgYXRtXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgY29uc3QgY3JlYXRlZF9ub3RlID0gYXdhaXQgdGhpcy5hcHAuZmlsZU1hbmFnZXIuY3JlYXRlTmV3TWFya2Rvd25GaWxlKGZvbGRlciwgZmlsZW5hbWUgPz8gXCJVbnRpdGxlZFwiKTtcblxuICAgICAgICBsZXQgcnVubmluZ19jb25maWc6IFJ1bm5pbmdDb25maWc7XG4gICAgICAgIGxldCBvdXRwdXRfY29udGVudDogc3RyaW5nO1xuICAgICAgICBpZiAodGVtcGxhdGUgaW5zdGFuY2VvZiBURmlsZSkge1xuICAgICAgICAgICAgcnVubmluZ19jb25maWcgPSB0aGlzLmNyZWF0ZV9ydW5uaW5nX2NvbmZpZyh0ZW1wbGF0ZSwgY3JlYXRlZF9ub3RlLCBSdW5Nb2RlLkNyZWF0ZU5ld0Zyb21UZW1wbGF0ZSk7XG4gICAgICAgICAgICBvdXRwdXRfY29udGVudCA9IGF3YWl0IHRoaXMucGx1Z2luLmVycm9yV3JhcHBlcihhc3luYyAoKSA9PiB0aGlzLnJlYWRfYW5kX3BhcnNlX3RlbXBsYXRlKHJ1bm5pbmdfY29uZmlnKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBydW5uaW5nX2NvbmZpZyA9IHRoaXMuY3JlYXRlX3J1bm5pbmdfY29uZmlnKHVuZGVmaW5lZCwgY3JlYXRlZF9ub3RlLCBSdW5Nb2RlLkNyZWF0ZU5ld0Zyb21UZW1wbGF0ZSk7XG4gICAgICAgICAgICBvdXRwdXRfY29udGVudCA9IGF3YWl0IHRoaXMucGx1Z2luLmVycm9yV3JhcHBlcihhc3luYyAoKSA9PiB0aGlzLnBhcnNlX3RlbXBsYXRlKHJ1bm5pbmdfY29uZmlnLCB0ZW1wbGF0ZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG91dHB1dF9jb250ZW50ID09IG51bGwpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYXBwLnZhdWx0LmRlbGV0ZShjcmVhdGVkX25vdGUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5hcHAudmF1bHQubW9kaWZ5KGNyZWF0ZWRfbm90ZSwgb3V0cHV0X2NvbnRlbnQpO1xuXG4gICAgICAgIGlmIChvcGVuX25ld19ub3RlKSB7XG4gICAgICAgICAgICBjb25zdCBhY3RpdmVfbGVhZiA9IHRoaXMuYXBwLndvcmtzcGFjZS5hY3RpdmVMZWFmO1xuICAgICAgICAgICAgaWYgKCFhY3RpdmVfbGVhZikge1xuICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmxvZ19lcnJvcihuZXcgVGVtcGxhdGVyRXJyb3IoXCJObyBhY3RpdmUgbGVhZlwiKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgYWN0aXZlX2xlYWYub3BlbkZpbGUoY3JlYXRlZF9ub3RlLCB7c3RhdGU6IHttb2RlOiAnc291cmNlJ30sIGVTdGF0ZToge3JlbmFtZTogJ2FsbCd9fSk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmN1cnNvcl9qdW1wZXIuanVtcF90b19uZXh0X2N1cnNvcl9sb2NhdGlvbigpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNyZWF0ZWRfbm90ZTtcbiAgICB9XG5cbiAgICBhc3luYyBhcHBlbmRfdGVtcGxhdGUodGVtcGxhdGVfZmlsZTogVEZpbGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgYWN0aXZlX3ZpZXcgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpO1xuICAgICAgICBpZiAoYWN0aXZlX3ZpZXcgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLmxvZ19lcnJvcihuZXcgVGVtcGxhdGVyRXJyb3IoXCJObyBhY3RpdmUgdmlldywgY2FuJ3QgYXBwZW5kIHRlbXBsYXRlcy5cIikpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bm5pbmdfY29uZmlnID0gdGhpcy5jcmVhdGVfcnVubmluZ19jb25maWcodGVtcGxhdGVfZmlsZSwgYWN0aXZlX3ZpZXcuZmlsZSwgUnVuTW9kZS5BcHBlbmRBY3RpdmVGaWxlKTtcbiAgICAgICAgY29uc3Qgb3V0cHV0X2NvbnRlbnQgPSBhd2FpdCB0aGlzLnBsdWdpbi5lcnJvcldyYXBwZXIoYXN5bmMgKCkgPT4gdGhpcy5yZWFkX2FuZF9wYXJzZV90ZW1wbGF0ZShydW5uaW5nX2NvbmZpZykpO1xuICAgICAgICBpZiAob3V0cHV0X2NvbnRlbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZWRpdG9yID0gYWN0aXZlX3ZpZXcuZWRpdG9yO1xuICAgICAgICBjb25zdCBkb2MgPSBlZGl0b3IuZ2V0RG9jKCk7XG4gICAgICAgIGRvYy5yZXBsYWNlU2VsZWN0aW9uKG91dHB1dF9jb250ZW50KTtcblxuICAgICAgICBhd2FpdCB0aGlzLmN1cnNvcl9qdW1wZXIuanVtcF90b19uZXh0X2N1cnNvcl9sb2NhdGlvbigpO1xuICAgIH1cblxuICAgIG92ZXJ3cml0ZV9hY3RpdmVfZmlsZV90ZW1wbGF0ZXMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGFjdGl2ZV92aWV3ID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KTtcbiAgICAgICAgaWYgKGFjdGl2ZV92aWV3ID09PSBudWxsKSB7XG5cdFx0XHR0aGlzLnBsdWdpbi5sb2dfZXJyb3IobmV3IFRlbXBsYXRlckVycm9yKFwiQWN0aXZlIHZpZXcgaXMgbnVsbCwgY2FuJ3Qgb3ZlcndyaXRlIGNvbnRlbnRcIikpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3ZlcndyaXRlX2ZpbGVfdGVtcGxhdGVzKGFjdGl2ZV92aWV3LmZpbGUsIHRydWUpO1xuXHR9XG5cbiAgICBhc3luYyBvdmVyd3JpdGVfZmlsZV90ZW1wbGF0ZXMoZmlsZTogVEZpbGUsIGFjdGl2ZV9maWxlOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcnVubmluZ19jb25maWcgPSB0aGlzLmNyZWF0ZV9ydW5uaW5nX2NvbmZpZyhmaWxlLCBmaWxlLCBhY3RpdmVfZmlsZSA/IFJ1bk1vZGUuT3ZlcndyaXRlQWN0aXZlRmlsZSA6IFJ1bk1vZGUuT3ZlcndyaXRlRmlsZSk7XG4gICAgICAgIGNvbnN0IG91dHB1dF9jb250ZW50ID0gYXdhaXQgdGhpcy5wbHVnaW4uZXJyb3JXcmFwcGVyKGFzeW5jICgpID0+IHRoaXMucmVhZF9hbmRfcGFyc2VfdGVtcGxhdGUocnVubmluZ19jb25maWcpKTtcbiAgICAgICAgaWYgKG91dHB1dF9jb250ZW50ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmFwcC52YXVsdC5tb2RpZnkoZmlsZSwgb3V0cHV0X2NvbnRlbnQpO1xuICAgICAgICBpZiAodGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZUZpbGUoKSA9PT0gZmlsZSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jdXJzb3JfanVtcGVyLmp1bXBfdG9fbmV4dF9jdXJzb3JfbG9jYXRpb24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHByb2Nlc3NfZHluYW1pY190ZW1wbGF0ZXMoZWw6IEhUTUxFbGVtZW50LCBjdHg6IE1hcmtkb3duUG9zdFByb2Nlc3NvckNvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgZHluYW1pY19jb21tYW5kX3JlZ2V4OiBSZWdFeHAgPSAvKDwlKD86LXxfKT9cXHMqWyp+XXswLDF9KVxcKygoPzoufFxccykqPyU+KS9nO1xuXG4gICAgICAgIGNvbnN0IHdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZU5vZGVJdGVyYXRvcihlbCwgTm9kZUZpbHRlci5TSE9XX1RFWFQpO1xuICAgICAgICBsZXQgbm9kZTtcbiAgICAgICAgbGV0IHBhc3MgPSBmYWxzZTtcbiAgICAgICAgd2hpbGUgKChub2RlID0gd2Fsa2VyLm5leHROb2RlKCkpKSB7XG4gICAgICAgICAgICBsZXQgY29udGVudCA9IG5vZGUubm9kZVZhbHVlO1xuICAgICAgICAgICAgbGV0IG1hdGNoO1xuICAgICAgICAgICAgaWYgKChtYXRjaCA9IGR5bmFtaWNfY29tbWFuZF9yZWdleC5leGVjKGNvbnRlbnQpKSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QoXCJcIiwgY3R4LnNvdXJjZVBhdGgpO1xuICAgICAgICAgICAgICAgIGlmICghZmlsZSB8fCAhKGZpbGUgaW5zdGFuY2VvZiBURmlsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXBhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1bm5pbmdfY29uZmlnID0gdGhpcy5jcmVhdGVfcnVubmluZ19jb25maWcoZmlsZSwgZmlsZSwgUnVuTW9kZS5EeW5hbWljUHJvY2Vzc29yKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wYXJzZXIuc2V0Q3VycmVudENvbnRleHQocnVubmluZ19jb25maWcsIENvbnRleHRNb2RlLlVTRVJfSU5URVJOQUwpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHdoaWxlIChtYXRjaCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE5vdCB0aGUgbW9zdCBlZmZpY2llbnQgd2F5IHRvIGV4Y2x1ZGUgdGhlICcrJyBmcm9tIHRoZSBjb21tYW5kIGJ1dCBJIGNvdWxkbid0IGZpbmQgc29tZXRoaW5nIGJldHRlclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wbGV0ZV9jb21tYW5kID0gbWF0Y2hbMV0gKyBtYXRjaFsyXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tbWFuZF9vdXRwdXQ6IHN0cmluZyA9IGF3YWl0IHRoaXMucGx1Z2luLmVycm9yV3JhcHBlcihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5wYXJzZXIucGFyc2VUZW1wbGF0ZXMoY29tcGxldGVfY29tbWFuZCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29tbWFuZF9vdXRwdXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBzdGFydCA9IGR5bmFtaWNfY29tbWFuZF9yZWdleC5sYXN0SW5kZXggLSBtYXRjaFswXS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGxldCBlbmQgPSBkeW5hbWljX2NvbW1hbmRfcmVnZXgubGFzdEluZGV4O1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5zdWJzdHJpbmcoMCwgc3RhcnQpICsgY29tbWFuZF9vdXRwdXQgKyBjb250ZW50LnN1YnN0cmluZyhlbmQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGR5bmFtaWNfY29tbWFuZF9yZWdleC5sYXN0SW5kZXggKz0gKGNvbW1hbmRfb3V0cHV0Lmxlbmd0aCAtIG1hdGNoWzBdLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoID0gZHluYW1pY19jb21tYW5kX3JlZ2V4LmV4ZWMoY29udGVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUubm9kZVZhbHVlID0gY29udGVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXHR9XG59IiwiLy8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnNcbi8vIERpc3RyaWJ1dGVkIHVuZGVyIGFuIE1JVCBsaWNlbnNlOiBodHRwczovL2NvZGVtaXJyb3IubmV0L0xJQ0VOU0VcblxuKGZ1bmN0aW9uKG1vZCkge1xuICBtb2Qod2luZG93LkNvZGVNaXJyb3IpO1xufSkoZnVuY3Rpb24oQ29kZU1pcnJvcikge1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbkNvZGVNaXJyb3IuZGVmaW5lTW9kZShcImphdmFzY3JpcHRcIiwgZnVuY3Rpb24oY29uZmlnLCBwYXJzZXJDb25maWcpIHtcbiAgdmFyIGluZGVudFVuaXQgPSBjb25maWcuaW5kZW50VW5pdDtcbiAgdmFyIHN0YXRlbWVudEluZGVudCA9IHBhcnNlckNvbmZpZy5zdGF0ZW1lbnRJbmRlbnQ7XG4gIHZhciBqc29ubGRNb2RlID0gcGFyc2VyQ29uZmlnLmpzb25sZDtcbiAgdmFyIGpzb25Nb2RlID0gcGFyc2VyQ29uZmlnLmpzb24gfHwganNvbmxkTW9kZTtcbiAgdmFyIHRyYWNrU2NvcGUgPSBwYXJzZXJDb25maWcudHJhY2tTY29wZSAhPT0gZmFsc2VcbiAgdmFyIGlzVFMgPSBwYXJzZXJDb25maWcudHlwZXNjcmlwdDtcbiAgdmFyIHdvcmRSRSA9IHBhcnNlckNvbmZpZy53b3JkQ2hhcmFjdGVycyB8fCAvW1xcdyRcXHhhMS1cXHVmZmZmXS87XG5cbiAgLy8gVG9rZW5pemVyXG5cbiAgdmFyIGtleXdvcmRzID0gZnVuY3Rpb24oKXtcbiAgICBmdW5jdGlvbiBrdyh0eXBlKSB7cmV0dXJuIHt0eXBlOiB0eXBlLCBzdHlsZTogXCJrZXl3b3JkXCJ9O31cbiAgICB2YXIgQSA9IGt3KFwia2V5d29yZCBhXCIpLCBCID0ga3coXCJrZXl3b3JkIGJcIiksIEMgPSBrdyhcImtleXdvcmQgY1wiKSwgRCA9IGt3KFwia2V5d29yZCBkXCIpO1xuICAgIHZhciBvcGVyYXRvciA9IGt3KFwib3BlcmF0b3JcIiksIGF0b20gPSB7dHlwZTogXCJhdG9tXCIsIHN0eWxlOiBcImF0b21cIn07XG5cbiAgICByZXR1cm4ge1xuICAgICAgXCJpZlwiOiBrdyhcImlmXCIpLCBcIndoaWxlXCI6IEEsIFwid2l0aFwiOiBBLCBcImVsc2VcIjogQiwgXCJkb1wiOiBCLCBcInRyeVwiOiBCLCBcImZpbmFsbHlcIjogQixcbiAgICAgIFwicmV0dXJuXCI6IEQsIFwiYnJlYWtcIjogRCwgXCJjb250aW51ZVwiOiBELCBcIm5ld1wiOiBrdyhcIm5ld1wiKSwgXCJkZWxldGVcIjogQywgXCJ2b2lkXCI6IEMsIFwidGhyb3dcIjogQyxcbiAgICAgIFwiZGVidWdnZXJcIjoga3coXCJkZWJ1Z2dlclwiKSwgXCJ2YXJcIjoga3coXCJ2YXJcIiksIFwiY29uc3RcIjoga3coXCJ2YXJcIiksIFwibGV0XCI6IGt3KFwidmFyXCIpLFxuICAgICAgXCJmdW5jdGlvblwiOiBrdyhcImZ1bmN0aW9uXCIpLCBcImNhdGNoXCI6IGt3KFwiY2F0Y2hcIiksXG4gICAgICBcImZvclwiOiBrdyhcImZvclwiKSwgXCJzd2l0Y2hcIjoga3coXCJzd2l0Y2hcIiksIFwiY2FzZVwiOiBrdyhcImNhc2VcIiksIFwiZGVmYXVsdFwiOiBrdyhcImRlZmF1bHRcIiksXG4gICAgICBcImluXCI6IG9wZXJhdG9yLCBcInR5cGVvZlwiOiBvcGVyYXRvciwgXCJpbnN0YW5jZW9mXCI6IG9wZXJhdG9yLFxuICAgICAgXCJ0cnVlXCI6IGF0b20sIFwiZmFsc2VcIjogYXRvbSwgXCJudWxsXCI6IGF0b20sIFwidW5kZWZpbmVkXCI6IGF0b20sIFwiTmFOXCI6IGF0b20sIFwiSW5maW5pdHlcIjogYXRvbSxcbiAgICAgIFwidGhpc1wiOiBrdyhcInRoaXNcIiksIFwiY2xhc3NcIjoga3coXCJjbGFzc1wiKSwgXCJzdXBlclwiOiBrdyhcImF0b21cIiksXG4gICAgICBcInlpZWxkXCI6IEMsIFwiZXhwb3J0XCI6IGt3KFwiZXhwb3J0XCIpLCBcImltcG9ydFwiOiBrdyhcImltcG9ydFwiKSwgXCJleHRlbmRzXCI6IEMsXG4gICAgICBcImF3YWl0XCI6IENcbiAgICB9O1xuICB9KCk7XG5cbiAgdmFyIGlzT3BlcmF0b3JDaGFyID0gL1srXFwtKiYlPTw+IT98fl5AXS87XG4gIHZhciBpc0pzb25sZEtleXdvcmQgPSAvXkAoY29udGV4dHxpZHx2YWx1ZXxsYW5ndWFnZXx0eXBlfGNvbnRhaW5lcnxsaXN0fHNldHxyZXZlcnNlfGluZGV4fGJhc2V8dm9jYWJ8Z3JhcGgpXCIvO1xuXG4gIGZ1bmN0aW9uIHJlYWRSZWdleHAoc3RyZWFtKSB7XG4gICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgbmV4dCwgaW5TZXQgPSBmYWxzZTtcbiAgICB3aGlsZSAoKG5leHQgPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7XG4gICAgICBpZiAoIWVzY2FwZWQpIHtcbiAgICAgICAgaWYgKG5leHQgPT0gXCIvXCIgJiYgIWluU2V0KSByZXR1cm47XG4gICAgICAgIGlmIChuZXh0ID09IFwiW1wiKSBpblNldCA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKGluU2V0ICYmIG5leHQgPT0gXCJdXCIpIGluU2V0ID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgbmV4dCA9PSBcIlxcXFxcIjtcbiAgICB9XG4gIH1cblxuICAvLyBVc2VkIGFzIHNjcmF0Y2ggdmFyaWFibGVzIHRvIGNvbW11bmljYXRlIG11bHRpcGxlIHZhbHVlcyB3aXRob3V0XG4gIC8vIGNvbnNpbmcgdXAgdG9ucyBvZiBvYmplY3RzLlxuICB2YXIgdHlwZSwgY29udGVudDtcbiAgZnVuY3Rpb24gcmV0KHRwLCBzdHlsZSwgY29udCkge1xuICAgIHR5cGUgPSB0cDsgY29udGVudCA9IGNvbnQ7XG4gICAgcmV0dXJuIHN0eWxlO1xuICB9XG4gIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7XG4gICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTtcbiAgICBpZiAoY2ggPT0gJ1wiJyB8fCBjaCA9PSBcIidcIikge1xuICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblN0cmluZyhjaCk7XG4gICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfSBlbHNlIGlmIChjaCA9PSBcIi5cIiAmJiBzdHJlYW0ubWF0Y2goL15cXGRbXFxkX10qKD86W2VFXVsrXFwtXT9bXFxkX10rKT8vKSkge1xuICAgICAgcmV0dXJuIHJldChcIm51bWJlclwiLCBcIm51bWJlclwiKTtcbiAgICB9IGVsc2UgaWYgKGNoID09IFwiLlwiICYmIHN0cmVhbS5tYXRjaChcIi4uXCIpKSB7XG4gICAgICByZXR1cm4gcmV0KFwic3ByZWFkXCIsIFwibWV0YVwiKTtcbiAgICB9IGVsc2UgaWYgKC9bXFxbXFxde31cXChcXCksO1xcOlxcLl0vLnRlc3QoY2gpKSB7XG4gICAgICByZXR1cm4gcmV0KGNoKTtcbiAgICB9IGVsc2UgaWYgKGNoID09IFwiPVwiICYmIHN0cmVhbS5lYXQoXCI+XCIpKSB7XG4gICAgICByZXR1cm4gcmV0KFwiPT5cIiwgXCJvcGVyYXRvclwiKTtcbiAgICB9IGVsc2UgaWYgKGNoID09IFwiMFwiICYmIHN0cmVhbS5tYXRjaCgvXig/OnhbXFxkQS1GYS1mX10rfG9bMC03X10rfGJbMDFfXSspbj8vKSkge1xuICAgICAgcmV0dXJuIHJldChcIm51bWJlclwiLCBcIm51bWJlclwiKTtcbiAgICB9IGVsc2UgaWYgKC9cXGQvLnRlc3QoY2gpKSB7XG4gICAgICBzdHJlYW0ubWF0Y2goL15bXFxkX10qKD86bnwoPzpcXC5bXFxkX10qKT8oPzpbZUVdWytcXC1dP1tcXGRfXSspPyk/Lyk7XG4gICAgICByZXR1cm4gcmV0KFwibnVtYmVyXCIsIFwibnVtYmVyXCIpO1xuICAgIH0gZWxzZSBpZiAoY2ggPT0gXCIvXCIpIHtcbiAgICAgIGlmIChzdHJlYW0uZWF0KFwiKlwiKSkge1xuICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQ29tbWVudDtcbiAgICAgICAgcmV0dXJuIHRva2VuQ29tbWVudChzdHJlYW0sIHN0YXRlKTtcbiAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLmVhdChcIi9cIikpIHtcbiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpO1xuICAgICAgICByZXR1cm4gcmV0KFwiY29tbWVudFwiLCBcImNvbW1lbnRcIik7XG4gICAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb25BbGxvd2VkKHN0cmVhbSwgc3RhdGUsIDEpKSB7XG4gICAgICAgIHJlYWRSZWdleHAoc3RyZWFtKTtcbiAgICAgICAgc3RyZWFtLm1hdGNoKC9eXFxiKChbZ2lteXVzXSkoPyFbZ2lteXVzXSpcXDIpKStcXGIvKTtcbiAgICAgICAgcmV0dXJuIHJldChcInJlZ2V4cFwiLCBcInN0cmluZy0yXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyZWFtLmVhdChcIj1cIik7XG4gICAgICAgIHJldHVybiByZXQoXCJvcGVyYXRvclwiLCBcIm9wZXJhdG9yXCIsIHN0cmVhbS5jdXJyZW50KCkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2ggPT0gXCJgXCIpIHtcbiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5RdWFzaTtcbiAgICAgIHJldHVybiB0b2tlblF1YXNpKHN0cmVhbSwgc3RhdGUpO1xuICAgIH0gZWxzZSBpZiAoY2ggPT0gXCIjXCIgJiYgc3RyZWFtLnBlZWsoKSA9PSBcIiFcIikge1xuICAgICAgc3RyZWFtLnNraXBUb0VuZCgpO1xuICAgICAgcmV0dXJuIHJldChcIm1ldGFcIiwgXCJtZXRhXCIpO1xuICAgIH0gZWxzZSBpZiAoY2ggPT0gXCIjXCIgJiYgc3RyZWFtLmVhdFdoaWxlKHdvcmRSRSkpIHtcbiAgICAgIHJldHVybiByZXQoXCJ2YXJpYWJsZVwiLCBcInByb3BlcnR5XCIpXG4gICAgfSBlbHNlIGlmIChjaCA9PSBcIjxcIiAmJiBzdHJlYW0ubWF0Y2goXCIhLS1cIikgfHxcbiAgICAgICAgICAgICAgIChjaCA9PSBcIi1cIiAmJiBzdHJlYW0ubWF0Y2goXCItPlwiKSAmJiAhL1xcUy8udGVzdChzdHJlYW0uc3RyaW5nLnNsaWNlKDAsIHN0cmVhbS5zdGFydCkpKSkge1xuICAgICAgc3RyZWFtLnNraXBUb0VuZCgpXG4gICAgICByZXR1cm4gcmV0KFwiY29tbWVudFwiLCBcImNvbW1lbnRcIilcbiAgICB9IGVsc2UgaWYgKGlzT3BlcmF0b3JDaGFyLnRlc3QoY2gpKSB7XG4gICAgICBpZiAoY2ggIT0gXCI+XCIgfHwgIXN0YXRlLmxleGljYWwgfHwgc3RhdGUubGV4aWNhbC50eXBlICE9IFwiPlwiKSB7XG4gICAgICAgIGlmIChzdHJlYW0uZWF0KFwiPVwiKSkge1xuICAgICAgICAgIGlmIChjaCA9PSBcIiFcIiB8fCBjaCA9PSBcIj1cIikgc3RyZWFtLmVhdChcIj1cIilcbiAgICAgICAgfSBlbHNlIGlmICgvWzw+KitcXC18Jj9dLy50ZXN0KGNoKSkge1xuICAgICAgICAgIHN0cmVhbS5lYXQoY2gpXG4gICAgICAgICAgaWYgKGNoID09IFwiPlwiKSBzdHJlYW0uZWF0KGNoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY2ggPT0gXCI/XCIgJiYgc3RyZWFtLmVhdChcIi5cIikpIHJldHVybiByZXQoXCIuXCIpXG4gICAgICByZXR1cm4gcmV0KFwib3BlcmF0b3JcIiwgXCJvcGVyYXRvclwiLCBzdHJlYW0uY3VycmVudCgpKTtcbiAgICB9IGVsc2UgaWYgKHdvcmRSRS50ZXN0KGNoKSkge1xuICAgICAgc3RyZWFtLmVhdFdoaWxlKHdvcmRSRSk7XG4gICAgICB2YXIgd29yZCA9IHN0cmVhbS5jdXJyZW50KClcbiAgICAgIGlmIChzdGF0ZS5sYXN0VHlwZSAhPSBcIi5cIikge1xuICAgICAgICBpZiAoa2V5d29yZHMucHJvcGVydHlJc0VudW1lcmFibGUod29yZCkpIHtcbiAgICAgICAgICB2YXIga3cgPSBrZXl3b3Jkc1t3b3JkXVxuICAgICAgICAgIHJldHVybiByZXQoa3cudHlwZSwga3cuc3R5bGUsIHdvcmQpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdvcmQgPT0gXCJhc3luY1wiICYmIHN0cmVhbS5tYXRjaCgvXihcXHN8XFwvXFwqKFteKl18XFwqKD8hXFwvKSkqP1xcKlxcLykqW1xcW1xcKFxcd10vLCBmYWxzZSkpXG4gICAgICAgICAgcmV0dXJuIHJldChcImFzeW5jXCIsIFwia2V5d29yZFwiLCB3b3JkKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJldChcInZhcmlhYmxlXCIsIFwidmFyaWFibGVcIiwgd29yZClcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB0b2tlblN0cmluZyhxdW90ZSkge1xuICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7XG4gICAgICB2YXIgZXNjYXBlZCA9IGZhbHNlLCBuZXh0O1xuICAgICAgaWYgKGpzb25sZE1vZGUgJiYgc3RyZWFtLnBlZWsoKSA9PSBcIkBcIiAmJiBzdHJlYW0ubWF0Y2goaXNKc29ubGRLZXl3b3JkKSl7XG4gICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlO1xuICAgICAgICByZXR1cm4gcmV0KFwianNvbmxkLWtleXdvcmRcIiwgXCJtZXRhXCIpO1xuICAgICAgfVxuICAgICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkge1xuICAgICAgICBpZiAobmV4dCA9PSBxdW90ZSAmJiAhZXNjYXBlZCkgYnJlYWs7XG4gICAgICAgIGVzY2FwZWQgPSAhZXNjYXBlZCAmJiBuZXh0ID09IFwiXFxcXFwiO1xuICAgICAgfVxuICAgICAgaWYgKCFlc2NhcGVkKSBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTtcbiAgICAgIHJldHVybiByZXQoXCJzdHJpbmdcIiwgXCJzdHJpbmdcIik7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRva2VuQ29tbWVudChzdHJlYW0sIHN0YXRlKSB7XG4gICAgdmFyIG1heWJlRW5kID0gZmFsc2UsIGNoO1xuICAgIHdoaWxlIChjaCA9IHN0cmVhbS5uZXh0KCkpIHtcbiAgICAgIGlmIChjaCA9PSBcIi9cIiAmJiBtYXliZUVuZCkge1xuICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBtYXliZUVuZCA9IChjaCA9PSBcIipcIik7XG4gICAgfVxuICAgIHJldHVybiByZXQoXCJjb21tZW50XCIsIFwiY29tbWVudFwiKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRva2VuUXVhc2koc3RyZWFtLCBzdGF0ZSkge1xuICAgIHZhciBlc2NhcGVkID0gZmFsc2UsIG5leHQ7XG4gICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkge1xuICAgICAgaWYgKCFlc2NhcGVkICYmIChuZXh0ID09IFwiYFwiIHx8IG5leHQgPT0gXCIkXCIgJiYgc3RyZWFtLmVhdChcIntcIikpKSB7XG4gICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGVzY2FwZWQgPSAhZXNjYXBlZCAmJiBuZXh0ID09IFwiXFxcXFwiO1xuICAgIH1cbiAgICByZXR1cm4gcmV0KFwicXVhc2lcIiwgXCJzdHJpbmctMlwiLCBzdHJlYW0uY3VycmVudCgpKTtcbiAgfVxuXG4gIHZhciBicmFja2V0cyA9IFwiKFt7fV0pXCI7XG4gIC8vIFRoaXMgaXMgYSBjcnVkZSBsb29rYWhlYWQgdHJpY2sgdG8gdHJ5IGFuZCBub3RpY2UgdGhhdCB3ZSdyZVxuICAvLyBwYXJzaW5nIHRoZSBhcmd1bWVudCBwYXR0ZXJucyBmb3IgYSBmYXQtYXJyb3cgZnVuY3Rpb24gYmVmb3JlIHdlXG4gIC8vIGFjdHVhbGx5IGhpdCB0aGUgYXJyb3cgdG9rZW4uIEl0IG9ubHkgd29ya3MgaWYgdGhlIGFycm93IGlzIG9uXG4gIC8vIHRoZSBzYW1lIGxpbmUgYXMgdGhlIGFyZ3VtZW50cyBhbmQgdGhlcmUncyBubyBzdHJhbmdlIG5vaXNlXG4gIC8vIChjb21tZW50cykgaW4gYmV0d2Vlbi4gRmFsbGJhY2sgaXMgdG8gb25seSBub3RpY2Ugd2hlbiB3ZSBoaXQgdGhlXG4gIC8vIGFycm93LCBhbmQgbm90IGRlY2xhcmUgdGhlIGFyZ3VtZW50cyBhcyBsb2NhbHMgZm9yIHRoZSBhcnJvd1xuICAvLyBib2R5LlxuICBmdW5jdGlvbiBmaW5kRmF0QXJyb3coc3RyZWFtLCBzdGF0ZSkge1xuICAgIGlmIChzdGF0ZS5mYXRBcnJvd0F0KSBzdGF0ZS5mYXRBcnJvd0F0ID0gbnVsbDtcbiAgICB2YXIgYXJyb3cgPSBzdHJlYW0uc3RyaW5nLmluZGV4T2YoXCI9PlwiLCBzdHJlYW0uc3RhcnQpO1xuICAgIGlmIChhcnJvdyA8IDApIHJldHVybjtcblxuICAgIGlmIChpc1RTKSB7IC8vIFRyeSB0byBza2lwIFR5cGVTY3JpcHQgcmV0dXJuIHR5cGUgZGVjbGFyYXRpb25zIGFmdGVyIHRoZSBhcmd1bWVudHNcbiAgICAgIHZhciBtID0gLzpcXHMqKD86XFx3Kyg/OjxbXj5dKj58XFxbXFxdKT98XFx7W159XSpcXH0pXFxzKiQvLmV4ZWMoc3RyZWFtLnN0cmluZy5zbGljZShzdHJlYW0uc3RhcnQsIGFycm93KSlcbiAgICAgIGlmIChtKSBhcnJvdyA9IG0uaW5kZXhcbiAgICB9XG5cbiAgICB2YXIgZGVwdGggPSAwLCBzYXdTb21ldGhpbmcgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBwb3MgPSBhcnJvdyAtIDE7IHBvcyA+PSAwOyAtLXBvcykge1xuICAgICAgdmFyIGNoID0gc3RyZWFtLnN0cmluZy5jaGFyQXQocG9zKTtcbiAgICAgIHZhciBicmFja2V0ID0gYnJhY2tldHMuaW5kZXhPZihjaCk7XG4gICAgICBpZiAoYnJhY2tldCA+PSAwICYmIGJyYWNrZXQgPCAzKSB7XG4gICAgICAgIGlmICghZGVwdGgpIHsgKytwb3M7IGJyZWFrOyB9XG4gICAgICAgIGlmICgtLWRlcHRoID09IDApIHsgaWYgKGNoID09IFwiKFwiKSBzYXdTb21ldGhpbmcgPSB0cnVlOyBicmVhazsgfVxuICAgICAgfSBlbHNlIGlmIChicmFja2V0ID49IDMgJiYgYnJhY2tldCA8IDYpIHtcbiAgICAgICAgKytkZXB0aDtcbiAgICAgIH0gZWxzZSBpZiAod29yZFJFLnRlc3QoY2gpKSB7XG4gICAgICAgIHNhd1NvbWV0aGluZyA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKC9bXCInXFwvYF0vLnRlc3QoY2gpKSB7XG4gICAgICAgIGZvciAoOzsgLS1wb3MpIHtcbiAgICAgICAgICBpZiAocG9zID09IDApIHJldHVyblxuICAgICAgICAgIHZhciBuZXh0ID0gc3RyZWFtLnN0cmluZy5jaGFyQXQocG9zIC0gMSlcbiAgICAgICAgICBpZiAobmV4dCA9PSBjaCAmJiBzdHJlYW0uc3RyaW5nLmNoYXJBdChwb3MgLSAyKSAhPSBcIlxcXFxcIikgeyBwb3MtLTsgYnJlYWsgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHNhd1NvbWV0aGluZyAmJiAhZGVwdGgpIHtcbiAgICAgICAgKytwb3M7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc2F3U29tZXRoaW5nICYmICFkZXB0aCkgc3RhdGUuZmF0QXJyb3dBdCA9IHBvcztcbiAgfVxuXG4gIC8vIFBhcnNlclxuXG4gIHZhciBhdG9taWNUeXBlcyA9IHtcImF0b21cIjogdHJ1ZSwgXCJudW1iZXJcIjogdHJ1ZSwgXCJ2YXJpYWJsZVwiOiB0cnVlLCBcInN0cmluZ1wiOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgXCJyZWdleHBcIjogdHJ1ZSwgXCJ0aGlzXCI6IHRydWUsIFwiaW1wb3J0XCI6IHRydWUsIFwianNvbmxkLWtleXdvcmRcIjogdHJ1ZX07XG5cbiAgZnVuY3Rpb24gSlNMZXhpY2FsKGluZGVudGVkLCBjb2x1bW4sIHR5cGUsIGFsaWduLCBwcmV2LCBpbmZvKSB7XG4gICAgdGhpcy5pbmRlbnRlZCA9IGluZGVudGVkO1xuICAgIHRoaXMuY29sdW1uID0gY29sdW1uO1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgdGhpcy5wcmV2ID0gcHJldjtcbiAgICB0aGlzLmluZm8gPSBpbmZvO1xuICAgIGlmIChhbGlnbiAhPSBudWxsKSB0aGlzLmFsaWduID0gYWxpZ247XG4gIH1cblxuICBmdW5jdGlvbiBpblNjb3BlKHN0YXRlLCB2YXJuYW1lKSB7XG4gICAgaWYgKCF0cmFja1Njb3BlKSByZXR1cm4gZmFsc2VcbiAgICBmb3IgKHZhciB2ID0gc3RhdGUubG9jYWxWYXJzOyB2OyB2ID0gdi5uZXh0KVxuICAgICAgaWYgKHYubmFtZSA9PSB2YXJuYW1lKSByZXR1cm4gdHJ1ZTtcbiAgICBmb3IgKHZhciBjeCA9IHN0YXRlLmNvbnRleHQ7IGN4OyBjeCA9IGN4LnByZXYpIHtcbiAgICAgIGZvciAodmFyIHYgPSBjeC52YXJzOyB2OyB2ID0gdi5uZXh0KVxuICAgICAgICBpZiAodi5uYW1lID09IHZhcm5hbWUpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlSlMoc3RhdGUsIHN0eWxlLCB0eXBlLCBjb250ZW50LCBzdHJlYW0pIHtcbiAgICB2YXIgY2MgPSBzdGF0ZS5jYztcbiAgICAvLyBDb21tdW5pY2F0ZSBvdXIgY29udGV4dCB0byB0aGUgY29tYmluYXRvcnMuXG4gICAgLy8gKExlc3Mgd2FzdGVmdWwgdGhhbiBjb25zaW5nIHVwIGEgaHVuZHJlZCBjbG9zdXJlcyBvbiBldmVyeSBjYWxsLilcbiAgICBjeC5zdGF0ZSA9IHN0YXRlOyBjeC5zdHJlYW0gPSBzdHJlYW07IGN4Lm1hcmtlZCA9IG51bGwsIGN4LmNjID0gY2M7IGN4LnN0eWxlID0gc3R5bGU7XG5cbiAgICBpZiAoIXN0YXRlLmxleGljYWwuaGFzT3duUHJvcGVydHkoXCJhbGlnblwiKSlcbiAgICAgIHN0YXRlLmxleGljYWwuYWxpZ24gPSB0cnVlO1xuXG4gICAgd2hpbGUodHJ1ZSkge1xuICAgICAgdmFyIGNvbWJpbmF0b3IgPSBjYy5sZW5ndGggPyBjYy5wb3AoKSA6IGpzb25Nb2RlID8gZXhwcmVzc2lvbiA6IHN0YXRlbWVudDtcbiAgICAgIGlmIChjb21iaW5hdG9yKHR5cGUsIGNvbnRlbnQpKSB7XG4gICAgICAgIHdoaWxlKGNjLmxlbmd0aCAmJiBjY1tjYy5sZW5ndGggLSAxXS5sZXgpXG4gICAgICAgICAgY2MucG9wKCkoKTtcbiAgICAgICAgaWYgKGN4Lm1hcmtlZCkgcmV0dXJuIGN4Lm1hcmtlZDtcbiAgICAgICAgaWYgKHR5cGUgPT0gXCJ2YXJpYWJsZVwiICYmIGluU2NvcGUoc3RhdGUsIGNvbnRlbnQpKSByZXR1cm4gXCJ2YXJpYWJsZS0yXCI7XG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBDb21iaW5hdG9yIHV0aWxzXG5cbiAgdmFyIGN4ID0ge3N0YXRlOiBudWxsLCBjb2x1bW46IG51bGwsIG1hcmtlZDogbnVsbCwgY2M6IG51bGx9O1xuICBmdW5jdGlvbiBwYXNzKCkge1xuICAgIGZvciAodmFyIGkgPSBhcmd1bWVudHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGN4LmNjLnB1c2goYXJndW1lbnRzW2ldKTtcbiAgfVxuICBmdW5jdGlvbiBjb250KCkge1xuICAgIHBhc3MuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBmdW5jdGlvbiBpbkxpc3QobmFtZSwgbGlzdCkge1xuICAgIGZvciAodmFyIHYgPSBsaXN0OyB2OyB2ID0gdi5uZXh0KSBpZiAodi5uYW1lID09IG5hbWUpIHJldHVybiB0cnVlXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGZ1bmN0aW9uIHJlZ2lzdGVyKHZhcm5hbWUpIHtcbiAgICB2YXIgc3RhdGUgPSBjeC5zdGF0ZTtcbiAgICBjeC5tYXJrZWQgPSBcImRlZlwiO1xuICAgIGlmICghdHJhY2tTY29wZSkgcmV0dXJuXG4gICAgaWYgKHN0YXRlLmNvbnRleHQpIHtcbiAgICAgIGlmIChzdGF0ZS5sZXhpY2FsLmluZm8gPT0gXCJ2YXJcIiAmJiBzdGF0ZS5jb250ZXh0ICYmIHN0YXRlLmNvbnRleHQuYmxvY2spIHtcbiAgICAgICAgLy8gRklYTUUgZnVuY3Rpb24gZGVjbHMgYXJlIGFsc28gbm90IGJsb2NrIHNjb3BlZFxuICAgICAgICB2YXIgbmV3Q29udGV4dCA9IHJlZ2lzdGVyVmFyU2NvcGVkKHZhcm5hbWUsIHN0YXRlLmNvbnRleHQpXG4gICAgICAgIGlmIChuZXdDb250ZXh0ICE9IG51bGwpIHtcbiAgICAgICAgICBzdGF0ZS5jb250ZXh0ID0gbmV3Q29udGV4dFxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFpbkxpc3QodmFybmFtZSwgc3RhdGUubG9jYWxWYXJzKSkge1xuICAgICAgICBzdGF0ZS5sb2NhbFZhcnMgPSBuZXcgVmFyKHZhcm5hbWUsIHN0YXRlLmxvY2FsVmFycylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuICAgIC8vIEZhbGwgdGhyb3VnaCBtZWFucyB0aGlzIGlzIGdsb2JhbFxuICAgIGlmIChwYXJzZXJDb25maWcuZ2xvYmFsVmFycyAmJiAhaW5MaXN0KHZhcm5hbWUsIHN0YXRlLmdsb2JhbFZhcnMpKVxuICAgICAgc3RhdGUuZ2xvYmFsVmFycyA9IG5ldyBWYXIodmFybmFtZSwgc3RhdGUuZ2xvYmFsVmFycylcbiAgfVxuICBmdW5jdGlvbiByZWdpc3RlclZhclNjb3BlZCh2YXJuYW1lLCBjb250ZXh0KSB7XG4gICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH0gZWxzZSBpZiAoY29udGV4dC5ibG9jaykge1xuICAgICAgdmFyIGlubmVyID0gcmVnaXN0ZXJWYXJTY29wZWQodmFybmFtZSwgY29udGV4dC5wcmV2KVxuICAgICAgaWYgKCFpbm5lcikgcmV0dXJuIG51bGxcbiAgICAgIGlmIChpbm5lciA9PSBjb250ZXh0LnByZXYpIHJldHVybiBjb250ZXh0XG4gICAgICByZXR1cm4gbmV3IENvbnRleHQoaW5uZXIsIGNvbnRleHQudmFycywgdHJ1ZSlcbiAgICB9IGVsc2UgaWYgKGluTGlzdCh2YXJuYW1lLCBjb250ZXh0LnZhcnMpKSB7XG4gICAgICByZXR1cm4gY29udGV4dFxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IENvbnRleHQoY29udGV4dC5wcmV2LCBuZXcgVmFyKHZhcm5hbWUsIGNvbnRleHQudmFycyksIGZhbHNlKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGlzTW9kaWZpZXIobmFtZSkge1xuICAgIHJldHVybiBuYW1lID09IFwicHVibGljXCIgfHwgbmFtZSA9PSBcInByaXZhdGVcIiB8fCBuYW1lID09IFwicHJvdGVjdGVkXCIgfHwgbmFtZSA9PSBcImFic3RyYWN0XCIgfHwgbmFtZSA9PSBcInJlYWRvbmx5XCJcbiAgfVxuXG4gIC8vIENvbWJpbmF0b3JzXG5cbiAgZnVuY3Rpb24gQ29udGV4dChwcmV2LCB2YXJzLCBibG9jaykgeyB0aGlzLnByZXYgPSBwcmV2OyB0aGlzLnZhcnMgPSB2YXJzOyB0aGlzLmJsb2NrID0gYmxvY2sgfVxuICBmdW5jdGlvbiBWYXIobmFtZSwgbmV4dCkgeyB0aGlzLm5hbWUgPSBuYW1lOyB0aGlzLm5leHQgPSBuZXh0IH1cblxuICB2YXIgZGVmYXVsdFZhcnMgPSBuZXcgVmFyKFwidGhpc1wiLCBuZXcgVmFyKFwiYXJndW1lbnRzXCIsIG51bGwpKVxuICBmdW5jdGlvbiBwdXNoY29udGV4dCgpIHtcbiAgICBjeC5zdGF0ZS5jb250ZXh0ID0gbmV3IENvbnRleHQoY3guc3RhdGUuY29udGV4dCwgY3guc3RhdGUubG9jYWxWYXJzLCBmYWxzZSlcbiAgICBjeC5zdGF0ZS5sb2NhbFZhcnMgPSBkZWZhdWx0VmFyc1xuICB9XG4gIGZ1bmN0aW9uIHB1c2hibG9ja2NvbnRleHQoKSB7XG4gICAgY3guc3RhdGUuY29udGV4dCA9IG5ldyBDb250ZXh0KGN4LnN0YXRlLmNvbnRleHQsIGN4LnN0YXRlLmxvY2FsVmFycywgdHJ1ZSlcbiAgICBjeC5zdGF0ZS5sb2NhbFZhcnMgPSBudWxsXG4gIH1cbiAgZnVuY3Rpb24gcG9wY29udGV4dCgpIHtcbiAgICBjeC5zdGF0ZS5sb2NhbFZhcnMgPSBjeC5zdGF0ZS5jb250ZXh0LnZhcnNcbiAgICBjeC5zdGF0ZS5jb250ZXh0ID0gY3guc3RhdGUuY29udGV4dC5wcmV2XG4gIH1cbiAgcG9wY29udGV4dC5sZXggPSB0cnVlXG4gIGZ1bmN0aW9uIHB1c2hsZXgodHlwZSwgaW5mbykge1xuICAgIHZhciByZXN1bHQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzdGF0ZSA9IGN4LnN0YXRlLCBpbmRlbnQgPSBzdGF0ZS5pbmRlbnRlZDtcbiAgICAgIGlmIChzdGF0ZS5sZXhpY2FsLnR5cGUgPT0gXCJzdGF0XCIpIGluZGVudCA9IHN0YXRlLmxleGljYWwuaW5kZW50ZWQ7XG4gICAgICBlbHNlIGZvciAodmFyIG91dGVyID0gc3RhdGUubGV4aWNhbDsgb3V0ZXIgJiYgb3V0ZXIudHlwZSA9PSBcIilcIiAmJiBvdXRlci5hbGlnbjsgb3V0ZXIgPSBvdXRlci5wcmV2KVxuICAgICAgICBpbmRlbnQgPSBvdXRlci5pbmRlbnRlZDtcbiAgICAgIHN0YXRlLmxleGljYWwgPSBuZXcgSlNMZXhpY2FsKGluZGVudCwgY3guc3RyZWFtLmNvbHVtbigpLCB0eXBlLCBudWxsLCBzdGF0ZS5sZXhpY2FsLCBpbmZvKTtcbiAgICB9O1xuICAgIHJlc3VsdC5sZXggPSB0cnVlO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgZnVuY3Rpb24gcG9wbGV4KCkge1xuICAgIHZhciBzdGF0ZSA9IGN4LnN0YXRlO1xuICAgIGlmIChzdGF0ZS5sZXhpY2FsLnByZXYpIHtcbiAgICAgIGlmIChzdGF0ZS5sZXhpY2FsLnR5cGUgPT0gXCIpXCIpXG4gICAgICAgIHN0YXRlLmluZGVudGVkID0gc3RhdGUubGV4aWNhbC5pbmRlbnRlZDtcbiAgICAgIHN0YXRlLmxleGljYWwgPSBzdGF0ZS5sZXhpY2FsLnByZXY7XG4gICAgfVxuICB9XG4gIHBvcGxleC5sZXggPSB0cnVlO1xuXG4gIGZ1bmN0aW9uIGV4cGVjdCh3YW50ZWQpIHtcbiAgICBmdW5jdGlvbiBleHAodHlwZSkge1xuICAgICAgaWYgKHR5cGUgPT0gd2FudGVkKSByZXR1cm4gY29udCgpO1xuICAgICAgZWxzZSBpZiAod2FudGVkID09IFwiO1wiIHx8IHR5cGUgPT0gXCJ9XCIgfHwgdHlwZSA9PSBcIilcIiB8fCB0eXBlID09IFwiXVwiKSByZXR1cm4gcGFzcygpO1xuICAgICAgZWxzZSByZXR1cm4gY29udChleHApO1xuICAgIH07XG4gICAgcmV0dXJuIGV4cDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0YXRlbWVudCh0eXBlLCB2YWx1ZSkge1xuICAgIGlmICh0eXBlID09IFwidmFyXCIpIHJldHVybiBjb250KHB1c2hsZXgoXCJ2YXJkZWZcIiwgdmFsdWUpLCB2YXJkZWYsIGV4cGVjdChcIjtcIiksIHBvcGxleCk7XG4gICAgaWYgKHR5cGUgPT0gXCJrZXl3b3JkIGFcIikgcmV0dXJuIGNvbnQocHVzaGxleChcImZvcm1cIiksIHBhcmVuRXhwciwgc3RhdGVtZW50LCBwb3BsZXgpO1xuICAgIGlmICh0eXBlID09IFwia2V5d29yZCBiXCIpIHJldHVybiBjb250KHB1c2hsZXgoXCJmb3JtXCIpLCBzdGF0ZW1lbnQsIHBvcGxleCk7XG4gICAgaWYgKHR5cGUgPT0gXCJrZXl3b3JkIGRcIikgcmV0dXJuIGN4LnN0cmVhbS5tYXRjaCgvXlxccyokLywgZmFsc2UpID8gY29udCgpIDogY29udChwdXNobGV4KFwic3RhdFwiKSwgbWF5YmVleHByZXNzaW9uLCBleHBlY3QoXCI7XCIpLCBwb3BsZXgpO1xuICAgIGlmICh0eXBlID09IFwiZGVidWdnZXJcIikgcmV0dXJuIGNvbnQoZXhwZWN0KFwiO1wiKSk7XG4gICAgaWYgKHR5cGUgPT0gXCJ7XCIpIHJldHVybiBjb250KHB1c2hsZXgoXCJ9XCIpLCBwdXNoYmxvY2tjb250ZXh0LCBibG9jaywgcG9wbGV4LCBwb3Bjb250ZXh0KTtcbiAgICBpZiAodHlwZSA9PSBcIjtcIikgcmV0dXJuIGNvbnQoKTtcbiAgICBpZiAodHlwZSA9PSBcImlmXCIpIHtcbiAgICAgIGlmIChjeC5zdGF0ZS5sZXhpY2FsLmluZm8gPT0gXCJlbHNlXCIgJiYgY3guc3RhdGUuY2NbY3guc3RhdGUuY2MubGVuZ3RoIC0gMV0gPT0gcG9wbGV4KVxuICAgICAgICBjeC5zdGF0ZS5jYy5wb3AoKSgpO1xuICAgICAgcmV0dXJuIGNvbnQocHVzaGxleChcImZvcm1cIiksIHBhcmVuRXhwciwgc3RhdGVtZW50LCBwb3BsZXgsIG1heWJlZWxzZSk7XG4gICAgfVxuICAgIGlmICh0eXBlID09IFwiZnVuY3Rpb25cIikgcmV0dXJuIGNvbnQoZnVuY3Rpb25kZWYpO1xuICAgIGlmICh0eXBlID09IFwiZm9yXCIpIHJldHVybiBjb250KHB1c2hsZXgoXCJmb3JtXCIpLCBwdXNoYmxvY2tjb250ZXh0LCBmb3JzcGVjLCBzdGF0ZW1lbnQsIHBvcGNvbnRleHQsIHBvcGxleCk7XG4gICAgaWYgKHR5cGUgPT0gXCJjbGFzc1wiIHx8IChpc1RTICYmIHZhbHVlID09IFwiaW50ZXJmYWNlXCIpKSB7XG4gICAgICBjeC5tYXJrZWQgPSBcImtleXdvcmRcIlxuICAgICAgcmV0dXJuIGNvbnQocHVzaGxleChcImZvcm1cIiwgdHlwZSA9PSBcImNsYXNzXCIgPyB0eXBlIDogdmFsdWUpLCBjbGFzc05hbWUsIHBvcGxleClcbiAgICB9XG4gICAgaWYgKHR5cGUgPT0gXCJ2YXJpYWJsZVwiKSB7XG4gICAgICBpZiAoaXNUUyAmJiB2YWx1ZSA9PSBcImRlY2xhcmVcIikge1xuICAgICAgICBjeC5tYXJrZWQgPSBcImtleXdvcmRcIlxuICAgICAgICByZXR1cm4gY29udChzdGF0ZW1lbnQpXG4gICAgICB9IGVsc2UgaWYgKGlzVFMgJiYgKHZhbHVlID09IFwibW9kdWxlXCIgfHwgdmFsdWUgPT0gXCJlbnVtXCIgfHwgdmFsdWUgPT0gXCJ0eXBlXCIpICYmIGN4LnN0cmVhbS5tYXRjaCgvXlxccypcXHcvLCBmYWxzZSkpIHtcbiAgICAgICAgY3gubWFya2VkID0gXCJrZXl3b3JkXCJcbiAgICAgICAgaWYgKHZhbHVlID09IFwiZW51bVwiKSByZXR1cm4gY29udChlbnVtZGVmKTtcbiAgICAgICAgZWxzZSBpZiAodmFsdWUgPT0gXCJ0eXBlXCIpIHJldHVybiBjb250KHR5cGVuYW1lLCBleHBlY3QoXCJvcGVyYXRvclwiKSwgdHlwZWV4cHIsIGV4cGVjdChcIjtcIikpO1xuICAgICAgICBlbHNlIHJldHVybiBjb250KHB1c2hsZXgoXCJmb3JtXCIpLCBwYXR0ZXJuLCBleHBlY3QoXCJ7XCIpLCBwdXNobGV4KFwifVwiKSwgYmxvY2ssIHBvcGxleCwgcG9wbGV4KVxuICAgICAgfSBlbHNlIGlmIChpc1RTICYmIHZhbHVlID09IFwibmFtZXNwYWNlXCIpIHtcbiAgICAgICAgY3gubWFya2VkID0gXCJrZXl3b3JkXCJcbiAgICAgICAgcmV0dXJuIGNvbnQocHVzaGxleChcImZvcm1cIiksIGV4cHJlc3Npb24sIHN0YXRlbWVudCwgcG9wbGV4KVxuICAgICAgfSBlbHNlIGlmIChpc1RTICYmIHZhbHVlID09IFwiYWJzdHJhY3RcIikge1xuICAgICAgICBjeC5tYXJrZWQgPSBcImtleXdvcmRcIlxuICAgICAgICByZXR1cm4gY29udChzdGF0ZW1lbnQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gY29udChwdXNobGV4KFwic3RhdFwiKSwgbWF5YmVsYWJlbCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0eXBlID09IFwic3dpdGNoXCIpIHJldHVybiBjb250KHB1c2hsZXgoXCJmb3JtXCIpLCBwYXJlbkV4cHIsIGV4cGVjdChcIntcIiksIHB1c2hsZXgoXCJ9XCIsIFwic3dpdGNoXCIpLCBwdXNoYmxvY2tjb250ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jaywgcG9wbGV4LCBwb3BsZXgsIHBvcGNvbnRleHQpO1xuICAgIGlmICh0eXBlID09IFwiY2FzZVwiKSByZXR1cm4gY29udChleHByZXNzaW9uLCBleHBlY3QoXCI6XCIpKTtcbiAgICBpZiAodHlwZSA9PSBcImRlZmF1bHRcIikgcmV0dXJuIGNvbnQoZXhwZWN0KFwiOlwiKSk7XG4gICAgaWYgKHR5cGUgPT0gXCJjYXRjaFwiKSByZXR1cm4gY29udChwdXNobGV4KFwiZm9ybVwiKSwgcHVzaGNvbnRleHQsIG1heWJlQ2F0Y2hCaW5kaW5nLCBzdGF0ZW1lbnQsIHBvcGxleCwgcG9wY29udGV4dCk7XG4gICAgaWYgKHR5cGUgPT0gXCJleHBvcnRcIikgcmV0dXJuIGNvbnQocHVzaGxleChcInN0YXRcIiksIGFmdGVyRXhwb3J0LCBwb3BsZXgpO1xuICAgIGlmICh0eXBlID09IFwiaW1wb3J0XCIpIHJldHVybiBjb250KHB1c2hsZXgoXCJzdGF0XCIpLCBhZnRlckltcG9ydCwgcG9wbGV4KTtcbiAgICBpZiAodHlwZSA9PSBcImFzeW5jXCIpIHJldHVybiBjb250KHN0YXRlbWVudClcbiAgICBpZiAodmFsdWUgPT0gXCJAXCIpIHJldHVybiBjb250KGV4cHJlc3Npb24sIHN0YXRlbWVudClcbiAgICByZXR1cm4gcGFzcyhwdXNobGV4KFwic3RhdFwiKSwgZXhwcmVzc2lvbiwgZXhwZWN0KFwiO1wiKSwgcG9wbGV4KTtcbiAgfVxuICBmdW5jdGlvbiBtYXliZUNhdGNoQmluZGluZyh0eXBlKSB7XG4gICAgaWYgKHR5cGUgPT0gXCIoXCIpIHJldHVybiBjb250KGZ1bmFyZywgZXhwZWN0KFwiKVwiKSlcbiAgfVxuICBmdW5jdGlvbiBleHByZXNzaW9uKHR5cGUsIHZhbHVlKSB7XG4gICAgcmV0dXJuIGV4cHJlc3Npb25Jbm5lcih0eXBlLCB2YWx1ZSwgZmFsc2UpO1xuICB9XG4gIGZ1bmN0aW9uIGV4cHJlc3Npb25Ob0NvbW1hKHR5cGUsIHZhbHVlKSB7XG4gICAgcmV0dXJuIGV4cHJlc3Npb25Jbm5lcih0eXBlLCB2YWx1ZSwgdHJ1ZSk7XG4gIH1cbiAgZnVuY3Rpb24gcGFyZW5FeHByKHR5cGUpIHtcbiAgICBpZiAodHlwZSAhPSBcIihcIikgcmV0dXJuIHBhc3MoKVxuICAgIHJldHVybiBjb250KHB1c2hsZXgoXCIpXCIpLCBtYXliZWV4cHJlc3Npb24sIGV4cGVjdChcIilcIiksIHBvcGxleClcbiAgfVxuICBmdW5jdGlvbiBleHByZXNzaW9uSW5uZXIodHlwZSwgdmFsdWUsIG5vQ29tbWEpIHtcbiAgICBpZiAoY3guc3RhdGUuZmF0QXJyb3dBdCA9PSBjeC5zdHJlYW0uc3RhcnQpIHtcbiAgICAgIHZhciBib2R5ID0gbm9Db21tYSA/IGFycm93Qm9keU5vQ29tbWEgOiBhcnJvd0JvZHk7XG4gICAgICBpZiAodHlwZSA9PSBcIihcIikgcmV0dXJuIGNvbnQocHVzaGNvbnRleHQsIHB1c2hsZXgoXCIpXCIpLCBjb21tYXNlcChmdW5hcmcsIFwiKVwiKSwgcG9wbGV4LCBleHBlY3QoXCI9PlwiKSwgYm9keSwgcG9wY29udGV4dCk7XG4gICAgICBlbHNlIGlmICh0eXBlID09IFwidmFyaWFibGVcIikgcmV0dXJuIHBhc3MocHVzaGNvbnRleHQsIHBhdHRlcm4sIGV4cGVjdChcIj0+XCIpLCBib2R5LCBwb3Bjb250ZXh0KTtcbiAgICB9XG5cbiAgICB2YXIgbWF5YmVvcCA9IG5vQ29tbWEgPyBtYXliZW9wZXJhdG9yTm9Db21tYSA6IG1heWJlb3BlcmF0b3JDb21tYTtcbiAgICBpZiAoYXRvbWljVHlwZXMuaGFzT3duUHJvcGVydHkodHlwZSkpIHJldHVybiBjb250KG1heWJlb3ApO1xuICAgIGlmICh0eXBlID09IFwiZnVuY3Rpb25cIikgcmV0dXJuIGNvbnQoZnVuY3Rpb25kZWYsIG1heWJlb3ApO1xuICAgIGlmICh0eXBlID09IFwiY2xhc3NcIiB8fCAoaXNUUyAmJiB2YWx1ZSA9PSBcImludGVyZmFjZVwiKSkgeyBjeC5tYXJrZWQgPSBcImtleXdvcmRcIjsgcmV0dXJuIGNvbnQocHVzaGxleChcImZvcm1cIiksIGNsYXNzRXhwcmVzc2lvbiwgcG9wbGV4KTsgfVxuICAgIGlmICh0eXBlID09IFwia2V5d29yZCBjXCIgfHwgdHlwZSA9PSBcImFzeW5jXCIpIHJldHVybiBjb250KG5vQ29tbWEgPyBleHByZXNzaW9uTm9Db21tYSA6IGV4cHJlc3Npb24pO1xuICAgIGlmICh0eXBlID09IFwiKFwiKSByZXR1cm4gY29udChwdXNobGV4KFwiKVwiKSwgbWF5YmVleHByZXNzaW9uLCBleHBlY3QoXCIpXCIpLCBwb3BsZXgsIG1heWJlb3ApO1xuICAgIGlmICh0eXBlID09IFwib3BlcmF0b3JcIiB8fCB0eXBlID09IFwic3ByZWFkXCIpIHJldHVybiBjb250KG5vQ29tbWEgPyBleHByZXNzaW9uTm9Db21tYSA6IGV4cHJlc3Npb24pO1xuICAgIGlmICh0eXBlID09IFwiW1wiKSByZXR1cm4gY29udChwdXNobGV4KFwiXVwiKSwgYXJyYXlMaXRlcmFsLCBwb3BsZXgsIG1heWJlb3ApO1xuICAgIGlmICh0eXBlID09IFwie1wiKSByZXR1cm4gY29udENvbW1hc2VwKG9ianByb3AsIFwifVwiLCBudWxsLCBtYXliZW9wKTtcbiAgICBpZiAodHlwZSA9PSBcInF1YXNpXCIpIHJldHVybiBwYXNzKHF1YXNpLCBtYXliZW9wKTtcbiAgICBpZiAodHlwZSA9PSBcIm5ld1wiKSByZXR1cm4gY29udChtYXliZVRhcmdldChub0NvbW1hKSk7XG4gICAgcmV0dXJuIGNvbnQoKTtcbiAgfVxuICBmdW5jdGlvbiBtYXliZWV4cHJlc3Npb24odHlwZSkge1xuICAgIGlmICh0eXBlLm1hdGNoKC9bO1xcfVxcKVxcXSxdLykpIHJldHVybiBwYXNzKCk7XG4gICAgcmV0dXJuIHBhc3MoZXhwcmVzc2lvbik7XG4gIH1cblxuICBmdW5jdGlvbiBtYXliZW9wZXJhdG9yQ29tbWEodHlwZSwgdmFsdWUpIHtcbiAgICBpZiAodHlwZSA9PSBcIixcIikgcmV0dXJuIGNvbnQobWF5YmVleHByZXNzaW9uKTtcbiAgICByZXR1cm4gbWF5YmVvcGVyYXRvck5vQ29tbWEodHlwZSwgdmFsdWUsIGZhbHNlKTtcbiAgfVxuICBmdW5jdGlvbiBtYXliZW9wZXJhdG9yTm9Db21tYSh0eXBlLCB2YWx1ZSwgbm9Db21tYSkge1xuICAgIHZhciBtZSA9IG5vQ29tbWEgPT0gZmFsc2UgPyBtYXliZW9wZXJhdG9yQ29tbWEgOiBtYXliZW9wZXJhdG9yTm9Db21tYTtcbiAgICB2YXIgZXhwciA9IG5vQ29tbWEgPT0gZmFsc2UgPyBleHByZXNzaW9uIDogZXhwcmVzc2lvbk5vQ29tbWE7XG4gICAgaWYgKHR5cGUgPT0gXCI9PlwiKSByZXR1cm4gY29udChwdXNoY29udGV4dCwgbm9Db21tYSA/IGFycm93Qm9keU5vQ29tbWEgOiBhcnJvd0JvZHksIHBvcGNvbnRleHQpO1xuICAgIGlmICh0eXBlID09IFwib3BlcmF0b3JcIikge1xuICAgICAgaWYgKC9cXCtcXCt8LS0vLnRlc3QodmFsdWUpIHx8IGlzVFMgJiYgdmFsdWUgPT0gXCIhXCIpIHJldHVybiBjb250KG1lKTtcbiAgICAgIGlmIChpc1RTICYmIHZhbHVlID09IFwiPFwiICYmIGN4LnN0cmVhbS5tYXRjaCgvXihbXjw+XXw8W148Pl0qPikqPlxccypcXCgvLCBmYWxzZSkpXG4gICAgICAgIHJldHVybiBjb250KHB1c2hsZXgoXCI+XCIpLCBjb21tYXNlcCh0eXBlZXhwciwgXCI+XCIpLCBwb3BsZXgsIG1lKTtcbiAgICAgIGlmICh2YWx1ZSA9PSBcIj9cIikgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbiwgZXhwZWN0KFwiOlwiKSwgZXhwcik7XG4gICAgICByZXR1cm4gY29udChleHByKTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT0gXCJxdWFzaVwiKSB7IHJldHVybiBwYXNzKHF1YXNpLCBtZSk7IH1cbiAgICBpZiAodHlwZSA9PSBcIjtcIikgcmV0dXJuO1xuICAgIGlmICh0eXBlID09IFwiKFwiKSByZXR1cm4gY29udENvbW1hc2VwKGV4cHJlc3Npb25Ob0NvbW1hLCBcIilcIiwgXCJjYWxsXCIsIG1lKTtcbiAgICBpZiAodHlwZSA9PSBcIi5cIikgcmV0dXJuIGNvbnQocHJvcGVydHksIG1lKTtcbiAgICBpZiAodHlwZSA9PSBcIltcIikgcmV0dXJuIGNvbnQocHVzaGxleChcIl1cIiksIG1heWJlZXhwcmVzc2lvbiwgZXhwZWN0KFwiXVwiKSwgcG9wbGV4LCBtZSk7XG4gICAgaWYgKGlzVFMgJiYgdmFsdWUgPT0gXCJhc1wiKSB7IGN4Lm1hcmtlZCA9IFwia2V5d29yZFwiOyByZXR1cm4gY29udCh0eXBlZXhwciwgbWUpIH1cbiAgICBpZiAodHlwZSA9PSBcInJlZ2V4cFwiKSB7XG4gICAgICBjeC5zdGF0ZS5sYXN0VHlwZSA9IGN4Lm1hcmtlZCA9IFwib3BlcmF0b3JcIlxuICAgICAgY3guc3RyZWFtLmJhY2tVcChjeC5zdHJlYW0ucG9zIC0gY3guc3RyZWFtLnN0YXJ0IC0gMSlcbiAgICAgIHJldHVybiBjb250KGV4cHIpXG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHF1YXNpKHR5cGUsIHZhbHVlKSB7XG4gICAgaWYgKHR5cGUgIT0gXCJxdWFzaVwiKSByZXR1cm4gcGFzcygpO1xuICAgIGlmICh2YWx1ZS5zbGljZSh2YWx1ZS5sZW5ndGggLSAyKSAhPSBcIiR7XCIpIHJldHVybiBjb250KHF1YXNpKTtcbiAgICByZXR1cm4gY29udChtYXliZWV4cHJlc3Npb24sIGNvbnRpbnVlUXVhc2kpO1xuICB9XG4gIGZ1bmN0aW9uIGNvbnRpbnVlUXVhc2kodHlwZSkge1xuICAgIGlmICh0eXBlID09IFwifVwiKSB7XG4gICAgICBjeC5tYXJrZWQgPSBcInN0cmluZy0yXCI7XG4gICAgICBjeC5zdGF0ZS50b2tlbml6ZSA9IHRva2VuUXVhc2k7XG4gICAgICByZXR1cm4gY29udChxdWFzaSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGFycm93Qm9keSh0eXBlKSB7XG4gICAgZmluZEZhdEFycm93KGN4LnN0cmVhbSwgY3guc3RhdGUpO1xuICAgIHJldHVybiBwYXNzKHR5cGUgPT0gXCJ7XCIgPyBzdGF0ZW1lbnQgOiBleHByZXNzaW9uKTtcbiAgfVxuICBmdW5jdGlvbiBhcnJvd0JvZHlOb0NvbW1hKHR5cGUpIHtcbiAgICBmaW5kRmF0QXJyb3coY3guc3RyZWFtLCBjeC5zdGF0ZSk7XG4gICAgcmV0dXJuIHBhc3ModHlwZSA9PSBcIntcIiA/IHN0YXRlbWVudCA6IGV4cHJlc3Npb25Ob0NvbW1hKTtcbiAgfVxuICBmdW5jdGlvbiBtYXliZVRhcmdldChub0NvbW1hKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgIGlmICh0eXBlID09IFwiLlwiKSByZXR1cm4gY29udChub0NvbW1hID8gdGFyZ2V0Tm9Db21tYSA6IHRhcmdldCk7XG4gICAgICBlbHNlIGlmICh0eXBlID09IFwidmFyaWFibGVcIiAmJiBpc1RTKSByZXR1cm4gY29udChtYXliZVR5cGVBcmdzLCBub0NvbW1hID8gbWF5YmVvcGVyYXRvck5vQ29tbWEgOiBtYXliZW9wZXJhdG9yQ29tbWEpXG4gICAgICBlbHNlIHJldHVybiBwYXNzKG5vQ29tbWEgPyBleHByZXNzaW9uTm9Db21tYSA6IGV4cHJlc3Npb24pO1xuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gdGFyZ2V0KF8sIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09IFwidGFyZ2V0XCIpIHsgY3gubWFya2VkID0gXCJrZXl3b3JkXCI7IHJldHVybiBjb250KG1heWJlb3BlcmF0b3JDb21tYSk7IH1cbiAgfVxuICBmdW5jdGlvbiB0YXJnZXROb0NvbW1hKF8sIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09IFwidGFyZ2V0XCIpIHsgY3gubWFya2VkID0gXCJrZXl3b3JkXCI7IHJldHVybiBjb250KG1heWJlb3BlcmF0b3JOb0NvbW1hKTsgfVxuICB9XG4gIGZ1bmN0aW9uIG1heWJlbGFiZWwodHlwZSkge1xuICAgIGlmICh0eXBlID09IFwiOlwiKSByZXR1cm4gY29udChwb3BsZXgsIHN0YXRlbWVudCk7XG4gICAgcmV0dXJuIHBhc3MobWF5YmVvcGVyYXRvckNvbW1hLCBleHBlY3QoXCI7XCIpLCBwb3BsZXgpO1xuICB9XG4gIGZ1bmN0aW9uIHByb3BlcnR5KHR5cGUpIHtcbiAgICBpZiAodHlwZSA9PSBcInZhcmlhYmxlXCIpIHtjeC5tYXJrZWQgPSBcInByb3BlcnR5XCI7IHJldHVybiBjb250KCk7fVxuICB9XG4gIGZ1bmN0aW9uIG9ianByb3AodHlwZSwgdmFsdWUpIHtcbiAgICBpZiAodHlwZSA9PSBcImFzeW5jXCIpIHtcbiAgICAgIGN4Lm1hcmtlZCA9IFwicHJvcGVydHlcIjtcbiAgICAgIHJldHVybiBjb250KG9ianByb3ApO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcInZhcmlhYmxlXCIgfHwgY3guc3R5bGUgPT0gXCJrZXl3b3JkXCIpIHtcbiAgICAgIGN4Lm1hcmtlZCA9IFwicHJvcGVydHlcIjtcbiAgICAgIGlmICh2YWx1ZSA9PSBcImdldFwiIHx8IHZhbHVlID09IFwic2V0XCIpIHJldHVybiBjb250KGdldHRlclNldHRlcik7XG4gICAgICB2YXIgbSAvLyBXb3JrIGFyb3VuZCBmYXQtYXJyb3ctZGV0ZWN0aW9uIGNvbXBsaWNhdGlvbiBmb3IgZGV0ZWN0aW5nIHR5cGVzY3JpcHQgdHlwZWQgYXJyb3cgcGFyYW1zXG4gICAgICBpZiAoaXNUUyAmJiBjeC5zdGF0ZS5mYXRBcnJvd0F0ID09IGN4LnN0cmVhbS5zdGFydCAmJiAobSA9IGN4LnN0cmVhbS5tYXRjaCgvXlxccyo6XFxzKi8sIGZhbHNlKSkpXG4gICAgICAgIGN4LnN0YXRlLmZhdEFycm93QXQgPSBjeC5zdHJlYW0ucG9zICsgbVswXS5sZW5ndGhcbiAgICAgIHJldHVybiBjb250KGFmdGVycHJvcCk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09IFwibnVtYmVyXCIgfHwgdHlwZSA9PSBcInN0cmluZ1wiKSB7XG4gICAgICBjeC5tYXJrZWQgPSBqc29ubGRNb2RlID8gXCJwcm9wZXJ0eVwiIDogKGN4LnN0eWxlICsgXCIgcHJvcGVydHlcIik7XG4gICAgICByZXR1cm4gY29udChhZnRlcnByb3ApO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcImpzb25sZC1rZXl3b3JkXCIpIHtcbiAgICAgIHJldHVybiBjb250KGFmdGVycHJvcCk7XG4gICAgfSBlbHNlIGlmIChpc1RTICYmIGlzTW9kaWZpZXIodmFsdWUpKSB7XG4gICAgICBjeC5tYXJrZWQgPSBcImtleXdvcmRcIlxuICAgICAgcmV0dXJuIGNvbnQob2JqcHJvcClcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCJbXCIpIHtcbiAgICAgIHJldHVybiBjb250KGV4cHJlc3Npb24sIG1heWJldHlwZSwgZXhwZWN0KFwiXVwiKSwgYWZ0ZXJwcm9wKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCJzcHJlYWRcIikge1xuICAgICAgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbk5vQ29tbWEsIGFmdGVycHJvcCk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA9PSBcIipcIikge1xuICAgICAgY3gubWFya2VkID0gXCJrZXl3b3JkXCI7XG4gICAgICByZXR1cm4gY29udChvYmpwcm9wKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCI6XCIpIHtcbiAgICAgIHJldHVybiBwYXNzKGFmdGVycHJvcClcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZ2V0dGVyU2V0dGVyKHR5cGUpIHtcbiAgICBpZiAodHlwZSAhPSBcInZhcmlhYmxlXCIpIHJldHVybiBwYXNzKGFmdGVycHJvcCk7XG4gICAgY3gubWFya2VkID0gXCJwcm9wZXJ0eVwiO1xuICAgIHJldHVybiBjb250KGZ1bmN0aW9uZGVmKTtcbiAgfVxuICBmdW5jdGlvbiBhZnRlcnByb3AodHlwZSkge1xuICAgIGlmICh0eXBlID09IFwiOlwiKSByZXR1cm4gY29udChleHByZXNzaW9uTm9Db21tYSk7XG4gICAgaWYgKHR5cGUgPT0gXCIoXCIpIHJldHVybiBwYXNzKGZ1bmN0aW9uZGVmKTtcbiAgfVxuICBmdW5jdGlvbiBjb21tYXNlcCh3aGF0LCBlbmQsIHNlcCkge1xuICAgIGZ1bmN0aW9uIHByb2NlZWQodHlwZSwgdmFsdWUpIHtcbiAgICAgIGlmIChzZXAgPyBzZXAuaW5kZXhPZih0eXBlKSA+IC0xIDogdHlwZSA9PSBcIixcIikge1xuICAgICAgICB2YXIgbGV4ID0gY3guc3RhdGUubGV4aWNhbDtcbiAgICAgICAgaWYgKGxleC5pbmZvID09IFwiY2FsbFwiKSBsZXgucG9zID0gKGxleC5wb3MgfHwgMCkgKyAxO1xuICAgICAgICByZXR1cm4gY29udChmdW5jdGlvbih0eXBlLCB2YWx1ZSkge1xuICAgICAgICAgIGlmICh0eXBlID09IGVuZCB8fCB2YWx1ZSA9PSBlbmQpIHJldHVybiBwYXNzKClcbiAgICAgICAgICByZXR1cm4gcGFzcyh3aGF0KVxuICAgICAgICB9LCBwcm9jZWVkKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlID09IGVuZCB8fCB2YWx1ZSA9PSBlbmQpIHJldHVybiBjb250KCk7XG4gICAgICBpZiAoc2VwICYmIHNlcC5pbmRleE9mKFwiO1wiKSA+IC0xKSByZXR1cm4gcGFzcyh3aGF0KVxuICAgICAgcmV0dXJuIGNvbnQoZXhwZWN0KGVuZCkpO1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24odHlwZSwgdmFsdWUpIHtcbiAgICAgIGlmICh0eXBlID09IGVuZCB8fCB2YWx1ZSA9PSBlbmQpIHJldHVybiBjb250KCk7XG4gICAgICByZXR1cm4gcGFzcyh3aGF0LCBwcm9jZWVkKTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGNvbnRDb21tYXNlcCh3aGF0LCBlbmQsIGluZm8pIHtcbiAgICBmb3IgKHZhciBpID0gMzsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcbiAgICAgIGN4LmNjLnB1c2goYXJndW1lbnRzW2ldKTtcbiAgICByZXR1cm4gY29udChwdXNobGV4KGVuZCwgaW5mbyksIGNvbW1hc2VwKHdoYXQsIGVuZCksIHBvcGxleCk7XG4gIH1cbiAgZnVuY3Rpb24gYmxvY2sodHlwZSkge1xuICAgIGlmICh0eXBlID09IFwifVwiKSByZXR1cm4gY29udCgpO1xuICAgIHJldHVybiBwYXNzKHN0YXRlbWVudCwgYmxvY2spO1xuICB9XG4gIGZ1bmN0aW9uIG1heWJldHlwZSh0eXBlLCB2YWx1ZSkge1xuICAgIGlmIChpc1RTKSB7XG4gICAgICBpZiAodHlwZSA9PSBcIjpcIikgcmV0dXJuIGNvbnQodHlwZWV4cHIpO1xuICAgICAgaWYgKHZhbHVlID09IFwiP1wiKSByZXR1cm4gY29udChtYXliZXR5cGUpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBtYXliZXR5cGVPckluKHR5cGUsIHZhbHVlKSB7XG4gICAgaWYgKGlzVFMgJiYgKHR5cGUgPT0gXCI6XCIgfHwgdmFsdWUgPT0gXCJpblwiKSkgcmV0dXJuIGNvbnQodHlwZWV4cHIpXG4gIH1cbiAgZnVuY3Rpb24gbWF5YmVyZXR0eXBlKHR5cGUpIHtcbiAgICBpZiAoaXNUUyAmJiB0eXBlID09IFwiOlwiKSB7XG4gICAgICBpZiAoY3guc3RyZWFtLm1hdGNoKC9eXFxzKlxcdytcXHMraXNcXGIvLCBmYWxzZSkpIHJldHVybiBjb250KGV4cHJlc3Npb24sIGlzS1csIHR5cGVleHByKVxuICAgICAgZWxzZSByZXR1cm4gY29udCh0eXBlZXhwcilcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gaXNLVyhfLCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PSBcImlzXCIpIHtcbiAgICAgIGN4Lm1hcmtlZCA9IFwia2V5d29yZFwiXG4gICAgICByZXR1cm4gY29udCgpXG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHR5cGVleHByKHR5cGUsIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09IFwia2V5b2ZcIiB8fCB2YWx1ZSA9PSBcInR5cGVvZlwiIHx8IHZhbHVlID09IFwiaW5mZXJcIiB8fCB2YWx1ZSA9PSBcInJlYWRvbmx5XCIpIHtcbiAgICAgIGN4Lm1hcmtlZCA9IFwia2V5d29yZFwiXG4gICAgICByZXR1cm4gY29udCh2YWx1ZSA9PSBcInR5cGVvZlwiID8gZXhwcmVzc2lvbk5vQ29tbWEgOiB0eXBlZXhwcilcbiAgICB9XG4gICAgaWYgKHR5cGUgPT0gXCJ2YXJpYWJsZVwiIHx8IHZhbHVlID09IFwidm9pZFwiKSB7XG4gICAgICBjeC5tYXJrZWQgPSBcInR5cGVcIlxuICAgICAgcmV0dXJuIGNvbnQoYWZ0ZXJUeXBlKVxuICAgIH1cbiAgICBpZiAodmFsdWUgPT0gXCJ8XCIgfHwgdmFsdWUgPT0gXCImXCIpIHJldHVybiBjb250KHR5cGVleHByKVxuICAgIGlmICh0eXBlID09IFwic3RyaW5nXCIgfHwgdHlwZSA9PSBcIm51bWJlclwiIHx8IHR5cGUgPT0gXCJhdG9tXCIpIHJldHVybiBjb250KGFmdGVyVHlwZSk7XG4gICAgaWYgKHR5cGUgPT0gXCJbXCIpIHJldHVybiBjb250KHB1c2hsZXgoXCJdXCIpLCBjb21tYXNlcCh0eXBlZXhwciwgXCJdXCIsIFwiLFwiKSwgcG9wbGV4LCBhZnRlclR5cGUpXG4gICAgaWYgKHR5cGUgPT0gXCJ7XCIpIHJldHVybiBjb250KHB1c2hsZXgoXCJ9XCIpLCB0eXBlcHJvcHMsIHBvcGxleCwgYWZ0ZXJUeXBlKVxuICAgIGlmICh0eXBlID09IFwiKFwiKSByZXR1cm4gY29udChjb21tYXNlcCh0eXBlYXJnLCBcIilcIiksIG1heWJlUmV0dXJuVHlwZSwgYWZ0ZXJUeXBlKVxuICAgIGlmICh0eXBlID09IFwiPFwiKSByZXR1cm4gY29udChjb21tYXNlcCh0eXBlZXhwciwgXCI+XCIpLCB0eXBlZXhwcilcbiAgICBpZiAodHlwZSA9PSBcInF1YXNpXCIpIHsgcmV0dXJuIHBhc3MocXVhc2lUeXBlLCBhZnRlclR5cGUpOyB9XG4gIH1cbiAgZnVuY3Rpb24gbWF5YmVSZXR1cm5UeXBlKHR5cGUpIHtcbiAgICBpZiAodHlwZSA9PSBcIj0+XCIpIHJldHVybiBjb250KHR5cGVleHByKVxuICB9XG4gIGZ1bmN0aW9uIHR5cGVwcm9wcyh0eXBlKSB7XG4gICAgaWYgKHR5cGUubWF0Y2goL1tcXH1cXClcXF1dLykpIHJldHVybiBjb250KClcbiAgICBpZiAodHlwZSA9PSBcIixcIiB8fCB0eXBlID09IFwiO1wiKSByZXR1cm4gY29udCh0eXBlcHJvcHMpXG4gICAgcmV0dXJuIHBhc3ModHlwZXByb3AsIHR5cGVwcm9wcylcbiAgfVxuICBmdW5jdGlvbiB0eXBlcHJvcCh0eXBlLCB2YWx1ZSkge1xuICAgIGlmICh0eXBlID09IFwidmFyaWFibGVcIiB8fCBjeC5zdHlsZSA9PSBcImtleXdvcmRcIikge1xuICAgICAgY3gubWFya2VkID0gXCJwcm9wZXJ0eVwiXG4gICAgICByZXR1cm4gY29udCh0eXBlcHJvcClcbiAgICB9IGVsc2UgaWYgKHZhbHVlID09IFwiP1wiIHx8IHR5cGUgPT0gXCJudW1iZXJcIiB8fCB0eXBlID09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBjb250KHR5cGVwcm9wKVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcIjpcIikge1xuICAgICAgcmV0dXJuIGNvbnQodHlwZWV4cHIpXG4gICAgfSBlbHNlIGlmICh0eXBlID09IFwiW1wiKSB7XG4gICAgICByZXR1cm4gY29udChleHBlY3QoXCJ2YXJpYWJsZVwiKSwgbWF5YmV0eXBlT3JJbiwgZXhwZWN0KFwiXVwiKSwgdHlwZXByb3ApXG4gICAgfSBlbHNlIGlmICh0eXBlID09IFwiKFwiKSB7XG4gICAgICByZXR1cm4gcGFzcyhmdW5jdGlvbmRlY2wsIHR5cGVwcm9wKVxuICAgIH0gZWxzZSBpZiAoIXR5cGUubWF0Y2goL1s7XFx9XFwpXFxdLF0vKSkge1xuICAgICAgcmV0dXJuIGNvbnQoKVxuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBxdWFzaVR5cGUodHlwZSwgdmFsdWUpIHtcbiAgICBpZiAodHlwZSAhPSBcInF1YXNpXCIpIHJldHVybiBwYXNzKCk7XG4gICAgaWYgKHZhbHVlLnNsaWNlKHZhbHVlLmxlbmd0aCAtIDIpICE9IFwiJHtcIikgcmV0dXJuIGNvbnQocXVhc2lUeXBlKTtcbiAgICByZXR1cm4gY29udCh0eXBlZXhwciwgY29udGludWVRdWFzaVR5cGUpO1xuICB9XG4gIGZ1bmN0aW9uIGNvbnRpbnVlUXVhc2lUeXBlKHR5cGUpIHtcbiAgICBpZiAodHlwZSA9PSBcIn1cIikge1xuICAgICAgY3gubWFya2VkID0gXCJzdHJpbmctMlwiO1xuICAgICAgY3guc3RhdGUudG9rZW5pemUgPSB0b2tlblF1YXNpO1xuICAgICAgcmV0dXJuIGNvbnQocXVhc2lUeXBlKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gdHlwZWFyZyh0eXBlLCB2YWx1ZSkge1xuICAgIGlmICh0eXBlID09IFwidmFyaWFibGVcIiAmJiBjeC5zdHJlYW0ubWF0Y2goL15cXHMqWz86XS8sIGZhbHNlKSB8fCB2YWx1ZSA9PSBcIj9cIikgcmV0dXJuIGNvbnQodHlwZWFyZylcbiAgICBpZiAodHlwZSA9PSBcIjpcIikgcmV0dXJuIGNvbnQodHlwZWV4cHIpXG4gICAgaWYgKHR5cGUgPT0gXCJzcHJlYWRcIikgcmV0dXJuIGNvbnQodHlwZWFyZylcbiAgICByZXR1cm4gcGFzcyh0eXBlZXhwcilcbiAgfVxuICBmdW5jdGlvbiBhZnRlclR5cGUodHlwZSwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gXCI8XCIpIHJldHVybiBjb250KHB1c2hsZXgoXCI+XCIpLCBjb21tYXNlcCh0eXBlZXhwciwgXCI+XCIpLCBwb3BsZXgsIGFmdGVyVHlwZSlcbiAgICBpZiAodmFsdWUgPT0gXCJ8XCIgfHwgdHlwZSA9PSBcIi5cIiB8fCB2YWx1ZSA9PSBcIiZcIikgcmV0dXJuIGNvbnQodHlwZWV4cHIpXG4gICAgaWYgKHR5cGUgPT0gXCJbXCIpIHJldHVybiBjb250KHR5cGVleHByLCBleHBlY3QoXCJdXCIpLCBhZnRlclR5cGUpXG4gICAgaWYgKHZhbHVlID09IFwiZXh0ZW5kc1wiIHx8IHZhbHVlID09IFwiaW1wbGVtZW50c1wiKSB7IGN4Lm1hcmtlZCA9IFwia2V5d29yZFwiOyByZXR1cm4gY29udCh0eXBlZXhwcikgfVxuICAgIGlmICh2YWx1ZSA9PSBcIj9cIikgcmV0dXJuIGNvbnQodHlwZWV4cHIsIGV4cGVjdChcIjpcIiksIHR5cGVleHByKVxuICB9XG4gIGZ1bmN0aW9uIG1heWJlVHlwZUFyZ3MoXywgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gXCI8XCIpIHJldHVybiBjb250KHB1c2hsZXgoXCI+XCIpLCBjb21tYXNlcCh0eXBlZXhwciwgXCI+XCIpLCBwb3BsZXgsIGFmdGVyVHlwZSlcbiAgfVxuICBmdW5jdGlvbiB0eXBlcGFyYW0oKSB7XG4gICAgcmV0dXJuIHBhc3ModHlwZWV4cHIsIG1heWJlVHlwZURlZmF1bHQpXG4gIH1cbiAgZnVuY3Rpb24gbWF5YmVUeXBlRGVmYXVsdChfLCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PSBcIj1cIikgcmV0dXJuIGNvbnQodHlwZWV4cHIpXG4gIH1cbiAgZnVuY3Rpb24gdmFyZGVmKF8sIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09IFwiZW51bVwiKSB7Y3gubWFya2VkID0gXCJrZXl3b3JkXCI7IHJldHVybiBjb250KGVudW1kZWYpfVxuICAgIHJldHVybiBwYXNzKHBhdHRlcm4sIG1heWJldHlwZSwgbWF5YmVBc3NpZ24sIHZhcmRlZkNvbnQpO1xuICB9XG4gIGZ1bmN0aW9uIHBhdHRlcm4odHlwZSwgdmFsdWUpIHtcbiAgICBpZiAoaXNUUyAmJiBpc01vZGlmaWVyKHZhbHVlKSkgeyBjeC5tYXJrZWQgPSBcImtleXdvcmRcIjsgcmV0dXJuIGNvbnQocGF0dGVybikgfVxuICAgIGlmICh0eXBlID09IFwidmFyaWFibGVcIikgeyByZWdpc3Rlcih2YWx1ZSk7IHJldHVybiBjb250KCk7IH1cbiAgICBpZiAodHlwZSA9PSBcInNwcmVhZFwiKSByZXR1cm4gY29udChwYXR0ZXJuKTtcbiAgICBpZiAodHlwZSA9PSBcIltcIikgcmV0dXJuIGNvbnRDb21tYXNlcChlbHRwYXR0ZXJuLCBcIl1cIik7XG4gICAgaWYgKHR5cGUgPT0gXCJ7XCIpIHJldHVybiBjb250Q29tbWFzZXAocHJvcHBhdHRlcm4sIFwifVwiKTtcbiAgfVxuICBmdW5jdGlvbiBwcm9wcGF0dGVybih0eXBlLCB2YWx1ZSkge1xuICAgIGlmICh0eXBlID09IFwidmFyaWFibGVcIiAmJiAhY3guc3RyZWFtLm1hdGNoKC9eXFxzKjovLCBmYWxzZSkpIHtcbiAgICAgIHJlZ2lzdGVyKHZhbHVlKTtcbiAgICAgIHJldHVybiBjb250KG1heWJlQXNzaWduKTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT0gXCJ2YXJpYWJsZVwiKSBjeC5tYXJrZWQgPSBcInByb3BlcnR5XCI7XG4gICAgaWYgKHR5cGUgPT0gXCJzcHJlYWRcIikgcmV0dXJuIGNvbnQocGF0dGVybik7XG4gICAgaWYgKHR5cGUgPT0gXCJ9XCIpIHJldHVybiBwYXNzKCk7XG4gICAgaWYgKHR5cGUgPT0gXCJbXCIpIHJldHVybiBjb250KGV4cHJlc3Npb24sIGV4cGVjdCgnXScpLCBleHBlY3QoJzonKSwgcHJvcHBhdHRlcm4pO1xuICAgIHJldHVybiBjb250KGV4cGVjdChcIjpcIiksIHBhdHRlcm4sIG1heWJlQXNzaWduKTtcbiAgfVxuICBmdW5jdGlvbiBlbHRwYXR0ZXJuKCkge1xuICAgIHJldHVybiBwYXNzKHBhdHRlcm4sIG1heWJlQXNzaWduKVxuICB9XG4gIGZ1bmN0aW9uIG1heWJlQXNzaWduKF90eXBlLCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PSBcIj1cIikgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbk5vQ29tbWEpO1xuICB9XG4gIGZ1bmN0aW9uIHZhcmRlZkNvbnQodHlwZSkge1xuICAgIGlmICh0eXBlID09IFwiLFwiKSByZXR1cm4gY29udCh2YXJkZWYpO1xuICB9XG4gIGZ1bmN0aW9uIG1heWJlZWxzZSh0eXBlLCB2YWx1ZSkge1xuICAgIGlmICh0eXBlID09IFwia2V5d29yZCBiXCIgJiYgdmFsdWUgPT0gXCJlbHNlXCIpIHJldHVybiBjb250KHB1c2hsZXgoXCJmb3JtXCIsIFwiZWxzZVwiKSwgc3RhdGVtZW50LCBwb3BsZXgpO1xuICB9XG4gIGZ1bmN0aW9uIGZvcnNwZWModHlwZSwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gXCJhd2FpdFwiKSByZXR1cm4gY29udChmb3JzcGVjKTtcbiAgICBpZiAodHlwZSA9PSBcIihcIikgcmV0dXJuIGNvbnQocHVzaGxleChcIilcIiksIGZvcnNwZWMxLCBwb3BsZXgpO1xuICB9XG4gIGZ1bmN0aW9uIGZvcnNwZWMxKHR5cGUpIHtcbiAgICBpZiAodHlwZSA9PSBcInZhclwiKSByZXR1cm4gY29udCh2YXJkZWYsIGZvcnNwZWMyKTtcbiAgICBpZiAodHlwZSA9PSBcInZhcmlhYmxlXCIpIHJldHVybiBjb250KGZvcnNwZWMyKTtcbiAgICByZXR1cm4gcGFzcyhmb3JzcGVjMilcbiAgfVxuICBmdW5jdGlvbiBmb3JzcGVjMih0eXBlLCB2YWx1ZSkge1xuICAgIGlmICh0eXBlID09IFwiKVwiKSByZXR1cm4gY29udCgpXG4gICAgaWYgKHR5cGUgPT0gXCI7XCIpIHJldHVybiBjb250KGZvcnNwZWMyKVxuICAgIGlmICh2YWx1ZSA9PSBcImluXCIgfHwgdmFsdWUgPT0gXCJvZlwiKSB7IGN4Lm1hcmtlZCA9IFwia2V5d29yZFwiOyByZXR1cm4gY29udChleHByZXNzaW9uLCBmb3JzcGVjMikgfVxuICAgIHJldHVybiBwYXNzKGV4cHJlc3Npb24sIGZvcnNwZWMyKVxuICB9XG4gIGZ1bmN0aW9uIGZ1bmN0aW9uZGVmKHR5cGUsIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09IFwiKlwiKSB7Y3gubWFya2VkID0gXCJrZXl3b3JkXCI7IHJldHVybiBjb250KGZ1bmN0aW9uZGVmKTt9XG4gICAgaWYgKHR5cGUgPT0gXCJ2YXJpYWJsZVwiKSB7cmVnaXN0ZXIodmFsdWUpOyByZXR1cm4gY29udChmdW5jdGlvbmRlZik7fVxuICAgIGlmICh0eXBlID09IFwiKFwiKSByZXR1cm4gY29udChwdXNoY29udGV4dCwgcHVzaGxleChcIilcIiksIGNvbW1hc2VwKGZ1bmFyZywgXCIpXCIpLCBwb3BsZXgsIG1heWJlcmV0dHlwZSwgc3RhdGVtZW50LCBwb3Bjb250ZXh0KTtcbiAgICBpZiAoaXNUUyAmJiB2YWx1ZSA9PSBcIjxcIikgcmV0dXJuIGNvbnQocHVzaGxleChcIj5cIiksIGNvbW1hc2VwKHR5cGVwYXJhbSwgXCI+XCIpLCBwb3BsZXgsIGZ1bmN0aW9uZGVmKVxuICB9XG4gIGZ1bmN0aW9uIGZ1bmN0aW9uZGVjbCh0eXBlLCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PSBcIipcIikge2N4Lm1hcmtlZCA9IFwia2V5d29yZFwiOyByZXR1cm4gY29udChmdW5jdGlvbmRlY2wpO31cbiAgICBpZiAodHlwZSA9PSBcInZhcmlhYmxlXCIpIHtyZWdpc3Rlcih2YWx1ZSk7IHJldHVybiBjb250KGZ1bmN0aW9uZGVjbCk7fVxuICAgIGlmICh0eXBlID09IFwiKFwiKSByZXR1cm4gY29udChwdXNoY29udGV4dCwgcHVzaGxleChcIilcIiksIGNvbW1hc2VwKGZ1bmFyZywgXCIpXCIpLCBwb3BsZXgsIG1heWJlcmV0dHlwZSwgcG9wY29udGV4dCk7XG4gICAgaWYgKGlzVFMgJiYgdmFsdWUgPT0gXCI8XCIpIHJldHVybiBjb250KHB1c2hsZXgoXCI+XCIpLCBjb21tYXNlcCh0eXBlcGFyYW0sIFwiPlwiKSwgcG9wbGV4LCBmdW5jdGlvbmRlY2wpXG4gIH1cbiAgZnVuY3Rpb24gdHlwZW5hbWUodHlwZSwgdmFsdWUpIHtcbiAgICBpZiAodHlwZSA9PSBcImtleXdvcmRcIiB8fCB0eXBlID09IFwidmFyaWFibGVcIikge1xuICAgICAgY3gubWFya2VkID0gXCJ0eXBlXCJcbiAgICAgIHJldHVybiBjb250KHR5cGVuYW1lKVxuICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gXCI8XCIpIHtcbiAgICAgIHJldHVybiBjb250KHB1c2hsZXgoXCI+XCIpLCBjb21tYXNlcCh0eXBlcGFyYW0sIFwiPlwiKSwgcG9wbGV4KVxuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBmdW5hcmcodHlwZSwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gXCJAXCIpIGNvbnQoZXhwcmVzc2lvbiwgZnVuYXJnKVxuICAgIGlmICh0eXBlID09IFwic3ByZWFkXCIpIHJldHVybiBjb250KGZ1bmFyZyk7XG4gICAgaWYgKGlzVFMgJiYgaXNNb2RpZmllcih2YWx1ZSkpIHsgY3gubWFya2VkID0gXCJrZXl3b3JkXCI7IHJldHVybiBjb250KGZ1bmFyZyk7IH1cbiAgICBpZiAoaXNUUyAmJiB0eXBlID09IFwidGhpc1wiKSByZXR1cm4gY29udChtYXliZXR5cGUsIG1heWJlQXNzaWduKVxuICAgIHJldHVybiBwYXNzKHBhdHRlcm4sIG1heWJldHlwZSwgbWF5YmVBc3NpZ24pO1xuICB9XG4gIGZ1bmN0aW9uIGNsYXNzRXhwcmVzc2lvbih0eXBlLCB2YWx1ZSkge1xuICAgIC8vIENsYXNzIGV4cHJlc3Npb25zIG1heSBoYXZlIGFuIG9wdGlvbmFsIG5hbWUuXG4gICAgaWYgKHR5cGUgPT0gXCJ2YXJpYWJsZVwiKSByZXR1cm4gY2xhc3NOYW1lKHR5cGUsIHZhbHVlKTtcbiAgICByZXR1cm4gY2xhc3NOYW1lQWZ0ZXIodHlwZSwgdmFsdWUpO1xuICB9XG4gIGZ1bmN0aW9uIGNsYXNzTmFtZSh0eXBlLCB2YWx1ZSkge1xuICAgIGlmICh0eXBlID09IFwidmFyaWFibGVcIikge3JlZ2lzdGVyKHZhbHVlKTsgcmV0dXJuIGNvbnQoY2xhc3NOYW1lQWZ0ZXIpO31cbiAgfVxuICBmdW5jdGlvbiBjbGFzc05hbWVBZnRlcih0eXBlLCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PSBcIjxcIikgcmV0dXJuIGNvbnQocHVzaGxleChcIj5cIiksIGNvbW1hc2VwKHR5cGVwYXJhbSwgXCI+XCIpLCBwb3BsZXgsIGNsYXNzTmFtZUFmdGVyKVxuICAgIGlmICh2YWx1ZSA9PSBcImV4dGVuZHNcIiB8fCB2YWx1ZSA9PSBcImltcGxlbWVudHNcIiB8fCAoaXNUUyAmJiB0eXBlID09IFwiLFwiKSkge1xuICAgICAgaWYgKHZhbHVlID09IFwiaW1wbGVtZW50c1wiKSBjeC5tYXJrZWQgPSBcImtleXdvcmRcIjtcbiAgICAgIHJldHVybiBjb250KGlzVFMgPyB0eXBlZXhwciA6IGV4cHJlc3Npb24sIGNsYXNzTmFtZUFmdGVyKTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT0gXCJ7XCIpIHJldHVybiBjb250KHB1c2hsZXgoXCJ9XCIpLCBjbGFzc0JvZHksIHBvcGxleCk7XG4gIH1cbiAgZnVuY3Rpb24gY2xhc3NCb2R5KHR5cGUsIHZhbHVlKSB7XG4gICAgaWYgKHR5cGUgPT0gXCJhc3luY1wiIHx8XG4gICAgICAgICh0eXBlID09IFwidmFyaWFibGVcIiAmJlxuICAgICAgICAgKHZhbHVlID09IFwic3RhdGljXCIgfHwgdmFsdWUgPT0gXCJnZXRcIiB8fCB2YWx1ZSA9PSBcInNldFwiIHx8IChpc1RTICYmIGlzTW9kaWZpZXIodmFsdWUpKSkgJiZcbiAgICAgICAgIGN4LnN0cmVhbS5tYXRjaCgvXlxccytbXFx3JFxceGExLVxcdWZmZmZdLywgZmFsc2UpKSkge1xuICAgICAgY3gubWFya2VkID0gXCJrZXl3b3JkXCI7XG4gICAgICByZXR1cm4gY29udChjbGFzc0JvZHkpO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PSBcInZhcmlhYmxlXCIgfHwgY3guc3R5bGUgPT0gXCJrZXl3b3JkXCIpIHtcbiAgICAgIGN4Lm1hcmtlZCA9IFwicHJvcGVydHlcIjtcbiAgICAgIHJldHVybiBjb250KGNsYXNzZmllbGQsIGNsYXNzQm9keSk7XG4gICAgfVxuICAgIGlmICh0eXBlID09IFwibnVtYmVyXCIgfHwgdHlwZSA9PSBcInN0cmluZ1wiKSByZXR1cm4gY29udChjbGFzc2ZpZWxkLCBjbGFzc0JvZHkpO1xuICAgIGlmICh0eXBlID09IFwiW1wiKVxuICAgICAgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbiwgbWF5YmV0eXBlLCBleHBlY3QoXCJdXCIpLCBjbGFzc2ZpZWxkLCBjbGFzc0JvZHkpXG4gICAgaWYgKHZhbHVlID09IFwiKlwiKSB7XG4gICAgICBjeC5tYXJrZWQgPSBcImtleXdvcmRcIjtcbiAgICAgIHJldHVybiBjb250KGNsYXNzQm9keSk7XG4gICAgfVxuICAgIGlmIChpc1RTICYmIHR5cGUgPT0gXCIoXCIpIHJldHVybiBwYXNzKGZ1bmN0aW9uZGVjbCwgY2xhc3NCb2R5KVxuICAgIGlmICh0eXBlID09IFwiO1wiIHx8IHR5cGUgPT0gXCIsXCIpIHJldHVybiBjb250KGNsYXNzQm9keSk7XG4gICAgaWYgKHR5cGUgPT0gXCJ9XCIpIHJldHVybiBjb250KCk7XG4gICAgaWYgKHZhbHVlID09IFwiQFwiKSByZXR1cm4gY29udChleHByZXNzaW9uLCBjbGFzc0JvZHkpXG4gIH1cbiAgZnVuY3Rpb24gY2xhc3NmaWVsZCh0eXBlLCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PSBcIiFcIikgcmV0dXJuIGNvbnQoY2xhc3NmaWVsZClcbiAgICBpZiAodmFsdWUgPT0gXCI/XCIpIHJldHVybiBjb250KGNsYXNzZmllbGQpXG4gICAgaWYgKHR5cGUgPT0gXCI6XCIpIHJldHVybiBjb250KHR5cGVleHByLCBtYXliZUFzc2lnbilcbiAgICBpZiAodmFsdWUgPT0gXCI9XCIpIHJldHVybiBjb250KGV4cHJlc3Npb25Ob0NvbW1hKVxuICAgIHZhciBjb250ZXh0ID0gY3guc3RhdGUubGV4aWNhbC5wcmV2LCBpc0ludGVyZmFjZSA9IGNvbnRleHQgJiYgY29udGV4dC5pbmZvID09IFwiaW50ZXJmYWNlXCJcbiAgICByZXR1cm4gcGFzcyhpc0ludGVyZmFjZSA/IGZ1bmN0aW9uZGVjbCA6IGZ1bmN0aW9uZGVmKVxuICB9XG4gIGZ1bmN0aW9uIGFmdGVyRXhwb3J0KHR5cGUsIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09IFwiKlwiKSB7IGN4Lm1hcmtlZCA9IFwia2V5d29yZFwiOyByZXR1cm4gY29udChtYXliZUZyb20sIGV4cGVjdChcIjtcIikpOyB9XG4gICAgaWYgKHZhbHVlID09IFwiZGVmYXVsdFwiKSB7IGN4Lm1hcmtlZCA9IFwia2V5d29yZFwiOyByZXR1cm4gY29udChleHByZXNzaW9uLCBleHBlY3QoXCI7XCIpKTsgfVxuICAgIGlmICh0eXBlID09IFwie1wiKSByZXR1cm4gY29udChjb21tYXNlcChleHBvcnRGaWVsZCwgXCJ9XCIpLCBtYXliZUZyb20sIGV4cGVjdChcIjtcIikpO1xuICAgIHJldHVybiBwYXNzKHN0YXRlbWVudCk7XG4gIH1cbiAgZnVuY3Rpb24gZXhwb3J0RmllbGQodHlwZSwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gXCJhc1wiKSB7IGN4Lm1hcmtlZCA9IFwia2V5d29yZFwiOyByZXR1cm4gY29udChleHBlY3QoXCJ2YXJpYWJsZVwiKSk7IH1cbiAgICBpZiAodHlwZSA9PSBcInZhcmlhYmxlXCIpIHJldHVybiBwYXNzKGV4cHJlc3Npb25Ob0NvbW1hLCBleHBvcnRGaWVsZCk7XG4gIH1cbiAgZnVuY3Rpb24gYWZ0ZXJJbXBvcnQodHlwZSkge1xuICAgIGlmICh0eXBlID09IFwic3RyaW5nXCIpIHJldHVybiBjb250KCk7XG4gICAgaWYgKHR5cGUgPT0gXCIoXCIpIHJldHVybiBwYXNzKGV4cHJlc3Npb24pO1xuICAgIGlmICh0eXBlID09IFwiLlwiKSByZXR1cm4gcGFzcyhtYXliZW9wZXJhdG9yQ29tbWEpO1xuICAgIHJldHVybiBwYXNzKGltcG9ydFNwZWMsIG1heWJlTW9yZUltcG9ydHMsIG1heWJlRnJvbSk7XG4gIH1cbiAgZnVuY3Rpb24gaW1wb3J0U3BlYyh0eXBlLCB2YWx1ZSkge1xuICAgIGlmICh0eXBlID09IFwie1wiKSByZXR1cm4gY29udENvbW1hc2VwKGltcG9ydFNwZWMsIFwifVwiKTtcbiAgICBpZiAodHlwZSA9PSBcInZhcmlhYmxlXCIpIHJlZ2lzdGVyKHZhbHVlKTtcbiAgICBpZiAodmFsdWUgPT0gXCIqXCIpIGN4Lm1hcmtlZCA9IFwia2V5d29yZFwiO1xuICAgIHJldHVybiBjb250KG1heWJlQXMpO1xuICB9XG4gIGZ1bmN0aW9uIG1heWJlTW9yZUltcG9ydHModHlwZSkge1xuICAgIGlmICh0eXBlID09IFwiLFwiKSByZXR1cm4gY29udChpbXBvcnRTcGVjLCBtYXliZU1vcmVJbXBvcnRzKVxuICB9XG4gIGZ1bmN0aW9uIG1heWJlQXMoX3R5cGUsIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09IFwiYXNcIikgeyBjeC5tYXJrZWQgPSBcImtleXdvcmRcIjsgcmV0dXJuIGNvbnQoaW1wb3J0U3BlYyk7IH1cbiAgfVxuICBmdW5jdGlvbiBtYXliZUZyb20oX3R5cGUsIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09IFwiZnJvbVwiKSB7IGN4Lm1hcmtlZCA9IFwia2V5d29yZFwiOyByZXR1cm4gY29udChleHByZXNzaW9uKTsgfVxuICB9XG4gIGZ1bmN0aW9uIGFycmF5TGl0ZXJhbCh0eXBlKSB7XG4gICAgaWYgKHR5cGUgPT0gXCJdXCIpIHJldHVybiBjb250KCk7XG4gICAgcmV0dXJuIHBhc3MoY29tbWFzZXAoZXhwcmVzc2lvbk5vQ29tbWEsIFwiXVwiKSk7XG4gIH1cbiAgZnVuY3Rpb24gZW51bWRlZigpIHtcbiAgICByZXR1cm4gcGFzcyhwdXNobGV4KFwiZm9ybVwiKSwgcGF0dGVybiwgZXhwZWN0KFwie1wiKSwgcHVzaGxleChcIn1cIiksIGNvbW1hc2VwKGVudW1tZW1iZXIsIFwifVwiKSwgcG9wbGV4LCBwb3BsZXgpXG4gIH1cbiAgZnVuY3Rpb24gZW51bW1lbWJlcigpIHtcbiAgICByZXR1cm4gcGFzcyhwYXR0ZXJuLCBtYXliZUFzc2lnbik7XG4gIH1cblxuICBmdW5jdGlvbiBpc0NvbnRpbnVlZFN0YXRlbWVudChzdGF0ZSwgdGV4dEFmdGVyKSB7XG4gICAgcmV0dXJuIHN0YXRlLmxhc3RUeXBlID09IFwib3BlcmF0b3JcIiB8fCBzdGF0ZS5sYXN0VHlwZSA9PSBcIixcIiB8fFxuICAgICAgaXNPcGVyYXRvckNoYXIudGVzdCh0ZXh0QWZ0ZXIuY2hhckF0KDApKSB8fFxuICAgICAgL1ssLl0vLnRlc3QodGV4dEFmdGVyLmNoYXJBdCgwKSk7XG4gIH1cblxuICBmdW5jdGlvbiBleHByZXNzaW9uQWxsb3dlZChzdHJlYW0sIHN0YXRlLCBiYWNrVXApIHtcbiAgICByZXR1cm4gc3RhdGUudG9rZW5pemUgPT0gdG9rZW5CYXNlICYmXG4gICAgICAvXig/Om9wZXJhdG9yfHNvZnxrZXl3b3JkIFtiY2RdfGNhc2V8bmV3fGV4cG9ydHxkZWZhdWx0fHNwcmVhZHxbXFxbe31cXCgsOzpdfD0+KSQvLnRlc3Qoc3RhdGUubGFzdFR5cGUpIHx8XG4gICAgICAoc3RhdGUubGFzdFR5cGUgPT0gXCJxdWFzaVwiICYmIC9cXHtcXHMqJC8udGVzdChzdHJlYW0uc3RyaW5nLnNsaWNlKDAsIHN0cmVhbS5wb3MgLSAoYmFja1VwIHx8IDApKSkpXG4gIH1cblxuICAvLyBJbnRlcmZhY2VcblxuICByZXR1cm4ge1xuICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKGJhc2Vjb2x1bW4pIHtcbiAgICAgIHZhciBzdGF0ZSA9IHtcbiAgICAgICAgdG9rZW5pemU6IHRva2VuQmFzZSxcbiAgICAgICAgbGFzdFR5cGU6IFwic29mXCIsXG4gICAgICAgIGNjOiBbXSxcbiAgICAgICAgbGV4aWNhbDogbmV3IEpTTGV4aWNhbCgoYmFzZWNvbHVtbiB8fCAwKSAtIGluZGVudFVuaXQsIDAsIFwiYmxvY2tcIiwgZmFsc2UpLFxuICAgICAgICBsb2NhbFZhcnM6IHBhcnNlckNvbmZpZy5sb2NhbFZhcnMsXG4gICAgICAgIGNvbnRleHQ6IHBhcnNlckNvbmZpZy5sb2NhbFZhcnMgJiYgbmV3IENvbnRleHQobnVsbCwgbnVsbCwgZmFsc2UpLFxuICAgICAgICBpbmRlbnRlZDogYmFzZWNvbHVtbiB8fCAwXG4gICAgICB9O1xuICAgICAgaWYgKHBhcnNlckNvbmZpZy5nbG9iYWxWYXJzICYmIHR5cGVvZiBwYXJzZXJDb25maWcuZ2xvYmFsVmFycyA9PSBcIm9iamVjdFwiKVxuICAgICAgICBzdGF0ZS5nbG9iYWxWYXJzID0gcGFyc2VyQ29uZmlnLmdsb2JhbFZhcnM7XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfSxcblxuICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7XG4gICAgICBpZiAoc3RyZWFtLnNvbCgpKSB7XG4gICAgICAgIGlmICghc3RhdGUubGV4aWNhbC5oYXNPd25Qcm9wZXJ0eShcImFsaWduXCIpKVxuICAgICAgICAgIHN0YXRlLmxleGljYWwuYWxpZ24gPSBmYWxzZTtcbiAgICAgICAgc3RhdGUuaW5kZW50ZWQgPSBzdHJlYW0uaW5kZW50YXRpb24oKTtcbiAgICAgICAgZmluZEZhdEFycm93KHN0cmVhbSwgc3RhdGUpO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLnRva2VuaXplICE9IHRva2VuQ29tbWVudCAmJiBzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgc3R5bGUgPSBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTtcbiAgICAgIGlmICh0eXBlID09IFwiY29tbWVudFwiKSByZXR1cm4gc3R5bGU7XG4gICAgICBzdGF0ZS5sYXN0VHlwZSA9IHR5cGUgPT0gXCJvcGVyYXRvclwiICYmIChjb250ZW50ID09IFwiKytcIiB8fCBjb250ZW50ID09IFwiLS1cIikgPyBcImluY2RlY1wiIDogdHlwZTtcbiAgICAgIHJldHVybiBwYXJzZUpTKHN0YXRlLCBzdHlsZSwgdHlwZSwgY29udGVudCwgc3RyZWFtKTtcbiAgICB9LFxuXG4gICAgaW5kZW50OiBmdW5jdGlvbihzdGF0ZSwgdGV4dEFmdGVyKSB7XG4gICAgICBpZiAoc3RhdGUudG9rZW5pemUgPT0gdG9rZW5Db21tZW50IHx8IHN0YXRlLnRva2VuaXplID09IHRva2VuUXVhc2kpIHJldHVybiBDb2RlTWlycm9yLlBhc3M7XG4gICAgICBpZiAoc3RhdGUudG9rZW5pemUgIT0gdG9rZW5CYXNlKSByZXR1cm4gMDtcbiAgICAgIHZhciBmaXJzdENoYXIgPSB0ZXh0QWZ0ZXIgJiYgdGV4dEFmdGVyLmNoYXJBdCgwKSwgbGV4aWNhbCA9IHN0YXRlLmxleGljYWwsIHRvcFxuICAgICAgLy8gS2x1ZGdlIHRvIHByZXZlbnQgJ21heWJlbHNlJyBmcm9tIGJsb2NraW5nIGxleGljYWwgc2NvcGUgcG9wc1xuICAgICAgaWYgKCEvXlxccyplbHNlXFxiLy50ZXN0KHRleHRBZnRlcikpIGZvciAodmFyIGkgPSBzdGF0ZS5jYy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgYyA9IHN0YXRlLmNjW2ldO1xuICAgICAgICBpZiAoYyA9PSBwb3BsZXgpIGxleGljYWwgPSBsZXhpY2FsLnByZXY7XG4gICAgICAgIGVsc2UgaWYgKGMgIT0gbWF5YmVlbHNlICYmIGMgIT0gcG9wY29udGV4dCkgYnJlYWs7XG4gICAgICB9XG4gICAgICB3aGlsZSAoKGxleGljYWwudHlwZSA9PSBcInN0YXRcIiB8fCBsZXhpY2FsLnR5cGUgPT0gXCJmb3JtXCIpICYmXG4gICAgICAgICAgICAgKGZpcnN0Q2hhciA9PSBcIn1cIiB8fCAoKHRvcCA9IHN0YXRlLmNjW3N0YXRlLmNjLmxlbmd0aCAtIDFdKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG9wID09IG1heWJlb3BlcmF0b3JDb21tYSB8fCB0b3AgPT0gbWF5YmVvcGVyYXRvck5vQ29tbWEpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEvXlssXFwuPStcXC0qOj9bXFwoXS8udGVzdCh0ZXh0QWZ0ZXIpKSkpXG4gICAgICAgIGxleGljYWwgPSBsZXhpY2FsLnByZXY7XG4gICAgICBpZiAoc3RhdGVtZW50SW5kZW50ICYmIGxleGljYWwudHlwZSA9PSBcIilcIiAmJiBsZXhpY2FsLnByZXYudHlwZSA9PSBcInN0YXRcIilcbiAgICAgICAgbGV4aWNhbCA9IGxleGljYWwucHJldjtcbiAgICAgIHZhciB0eXBlID0gbGV4aWNhbC50eXBlLCBjbG9zaW5nID0gZmlyc3RDaGFyID09IHR5cGU7XG5cbiAgICAgIGlmICh0eXBlID09IFwidmFyZGVmXCIpIHJldHVybiBsZXhpY2FsLmluZGVudGVkICsgKHN0YXRlLmxhc3RUeXBlID09IFwib3BlcmF0b3JcIiB8fCBzdGF0ZS5sYXN0VHlwZSA9PSBcIixcIiA/IGxleGljYWwuaW5mby5sZW5ndGggKyAxIDogMCk7XG4gICAgICBlbHNlIGlmICh0eXBlID09IFwiZm9ybVwiICYmIGZpcnN0Q2hhciA9PSBcIntcIikgcmV0dXJuIGxleGljYWwuaW5kZW50ZWQ7XG4gICAgICBlbHNlIGlmICh0eXBlID09IFwiZm9ybVwiKSByZXR1cm4gbGV4aWNhbC5pbmRlbnRlZCArIGluZGVudFVuaXQ7XG4gICAgICBlbHNlIGlmICh0eXBlID09IFwic3RhdFwiKVxuICAgICAgICByZXR1cm4gbGV4aWNhbC5pbmRlbnRlZCArIChpc0NvbnRpbnVlZFN0YXRlbWVudChzdGF0ZSwgdGV4dEFmdGVyKSA/IHN0YXRlbWVudEluZGVudCB8fCBpbmRlbnRVbml0IDogMCk7XG4gICAgICBlbHNlIGlmIChsZXhpY2FsLmluZm8gPT0gXCJzd2l0Y2hcIiAmJiAhY2xvc2luZyAmJiBwYXJzZXJDb25maWcuZG91YmxlSW5kZW50U3dpdGNoICE9IGZhbHNlKVxuICAgICAgICByZXR1cm4gbGV4aWNhbC5pbmRlbnRlZCArICgvXig/OmNhc2V8ZGVmYXVsdClcXGIvLnRlc3QodGV4dEFmdGVyKSA/IGluZGVudFVuaXQgOiAyICogaW5kZW50VW5pdCk7XG4gICAgICBlbHNlIGlmIChsZXhpY2FsLmFsaWduKSByZXR1cm4gbGV4aWNhbC5jb2x1bW4gKyAoY2xvc2luZyA/IDAgOiAxKTtcbiAgICAgIGVsc2UgcmV0dXJuIGxleGljYWwuaW5kZW50ZWQgKyAoY2xvc2luZyA/IDAgOiBpbmRlbnRVbml0KTtcbiAgICB9LFxuXG4gICAgZWxlY3RyaWNJbnB1dDogL15cXHMqKD86Y2FzZSAuKj86fGRlZmF1bHQ6fFxce3xcXH0pJC8sXG4gICAgYmxvY2tDb21tZW50U3RhcnQ6IGpzb25Nb2RlID8gbnVsbCA6IFwiLypcIixcbiAgICBibG9ja0NvbW1lbnRFbmQ6IGpzb25Nb2RlID8gbnVsbCA6IFwiKi9cIixcbiAgICBibG9ja0NvbW1lbnRDb250aW51ZToganNvbk1vZGUgPyBudWxsIDogXCIgKiBcIixcbiAgICBsaW5lQ29tbWVudDoganNvbk1vZGUgPyBudWxsIDogXCIvL1wiLFxuICAgIGZvbGQ6IFwiYnJhY2VcIixcbiAgICBjbG9zZUJyYWNrZXRzOiBcIigpW117fScnXFxcIlxcXCJgYFwiLFxuXG4gICAgaGVscGVyVHlwZToganNvbk1vZGUgPyBcImpzb25cIiA6IFwiamF2YXNjcmlwdFwiLFxuICAgIGpzb25sZE1vZGU6IGpzb25sZE1vZGUsXG4gICAganNvbk1vZGU6IGpzb25Nb2RlLFxuXG4gICAgZXhwcmVzc2lvbkFsbG93ZWQ6IGV4cHJlc3Npb25BbGxvd2VkLFxuXG4gICAgc2tpcEV4cHJlc3Npb246IGZ1bmN0aW9uKHN0YXRlKSB7XG4gICAgICBwYXJzZUpTKHN0YXRlLCBcImF0b21cIiwgXCJhdG9tXCIsIFwidHJ1ZVwiLCBuZXcgQ29kZU1pcnJvci5TdHJpbmdTdHJlYW0oXCJcIiwgMiwgbnVsbCkpXG4gICAgfVxuICB9O1xufSk7XG5cbkNvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIoXCJ3b3JkQ2hhcnNcIiwgXCJqYXZhc2NyaXB0XCIsIC9bXFx3JF0vKTtcblxuQ29kZU1pcnJvci5kZWZpbmVNSU1FKFwidGV4dC9qYXZhc2NyaXB0XCIsIFwiamF2YXNjcmlwdFwiKTtcbkNvZGVNaXJyb3IuZGVmaW5lTUlNRShcInRleHQvZWNtYXNjcmlwdFwiLCBcImphdmFzY3JpcHRcIik7XG5Db2RlTWlycm9yLmRlZmluZU1JTUUoXCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0XCIsIFwiamF2YXNjcmlwdFwiKTtcbkNvZGVNaXJyb3IuZGVmaW5lTUlNRShcImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdFwiLCBcImphdmFzY3JpcHRcIik7XG5Db2RlTWlycm9yLmRlZmluZU1JTUUoXCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0XCIsIFwiamF2YXNjcmlwdFwiKTtcbkNvZGVNaXJyb3IuZGVmaW5lTUlNRShcImFwcGxpY2F0aW9uL2pzb25cIiwgeyBuYW1lOiBcImphdmFzY3JpcHRcIiwganNvbjogdHJ1ZSB9KTtcbkNvZGVNaXJyb3IuZGVmaW5lTUlNRShcImFwcGxpY2F0aW9uL3gtanNvblwiLCB7IG5hbWU6IFwiamF2YXNjcmlwdFwiLCBqc29uOiB0cnVlIH0pO1xuQ29kZU1pcnJvci5kZWZpbmVNSU1FKFwiYXBwbGljYXRpb24vbWFuaWZlc3QranNvblwiLCB7IG5hbWU6IFwiamF2YXNjcmlwdFwiLCBqc29uOiB0cnVlIH0pXG5Db2RlTWlycm9yLmRlZmluZU1JTUUoXCJhcHBsaWNhdGlvbi9sZCtqc29uXCIsIHsgbmFtZTogXCJqYXZhc2NyaXB0XCIsIGpzb25sZDogdHJ1ZSB9KTtcbkNvZGVNaXJyb3IuZGVmaW5lTUlNRShcInRleHQvdHlwZXNjcmlwdFwiLCB7IG5hbWU6IFwiamF2YXNjcmlwdFwiLCB0eXBlc2NyaXB0OiB0cnVlIH0pO1xuQ29kZU1pcnJvci5kZWZpbmVNSU1FKFwiYXBwbGljYXRpb24vdHlwZXNjcmlwdFwiLCB7IG5hbWU6IFwiamF2YXNjcmlwdFwiLCB0eXBlc2NyaXB0OiB0cnVlIH0pO1xuXG59KTtcbiIsIi8vIENvZGVNaXJyb3IsIGNvcHlyaWdodCAoYykgYnkgTWFyaWpuIEhhdmVyYmVrZSBhbmQgb3RoZXJzXG4vLyBEaXN0cmlidXRlZCB1bmRlciBhbiBNSVQgbGljZW5zZTogaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFXG5cbi8vIFV0aWxpdHkgZnVuY3Rpb24gdGhhdCBhbGxvd3MgbW9kZXMgdG8gYmUgY29tYmluZWQuIFRoZSBtb2RlIGdpdmVuXG4vLyBhcyB0aGUgYmFzZSBhcmd1bWVudCB0YWtlcyBjYXJlIG9mIG1vc3Qgb2YgdGhlIG5vcm1hbCBtb2RlXG4vLyBmdW5jdGlvbmFsaXR5LCBidXQgYSBzZWNvbmQgKHR5cGljYWxseSBzaW1wbGUpIG1vZGUgaXMgdXNlZCwgd2hpY2hcbi8vIGNhbiBvdmVycmlkZSB0aGUgc3R5bGUgb2YgdGV4dC4gQm90aCBtb2RlcyBnZXQgdG8gcGFyc2UgYWxsIG9mIHRoZVxuLy8gdGV4dCwgYnV0IHdoZW4gYm90aCBhc3NpZ24gYSBub24tbnVsbCBzdHlsZSB0byBhIHBpZWNlIG9mIGNvZGUsIHRoZVxuLy8gb3ZlcmxheSB3aW5zLCB1bmxlc3MgdGhlIGNvbWJpbmUgYXJndW1lbnQgd2FzIHRydWUgYW5kIG5vdCBvdmVycmlkZGVuLFxuLy8gb3Igc3RhdGUub3ZlcmxheS5jb21iaW5lVG9rZW5zIHdhcyB0cnVlLCBpbiB3aGljaCBjYXNlIHRoZSBzdHlsZXMgYXJlXG4vLyBjb21iaW5lZC5cblxuKGZ1bmN0aW9uKG1vZCkge1xuICBtb2Qod2luZG93LkNvZGVNaXJyb3IpO1xufSkoZnVuY3Rpb24oQ29kZU1pcnJvcikge1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbkNvZGVNaXJyb3IuY3VzdG9tT3ZlcmxheU1vZGUgPSBmdW5jdGlvbihiYXNlLCBvdmVybGF5LCBjb21iaW5lKSB7XG4gIHJldHVybiB7XG4gICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBiYXNlOiBDb2RlTWlycm9yLnN0YXJ0U3RhdGUoYmFzZSksXG4gICAgICAgIG92ZXJsYXk6IENvZGVNaXJyb3Iuc3RhcnRTdGF0ZShvdmVybGF5KSxcbiAgICAgICAgYmFzZVBvczogMCwgYmFzZUN1cjogbnVsbCxcbiAgICAgICAgb3ZlcmxheVBvczogMCwgb3ZlcmxheUN1cjogbnVsbCxcbiAgICAgICAgc3RyZWFtU2VlbjogbnVsbFxuICAgICAgfTtcbiAgICB9LFxuICAgIGNvcHlTdGF0ZTogZnVuY3Rpb24oc3RhdGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJhc2U6IENvZGVNaXJyb3IuY29weVN0YXRlKGJhc2UsIHN0YXRlLmJhc2UpLFxuICAgICAgICBvdmVybGF5OiBDb2RlTWlycm9yLmNvcHlTdGF0ZShvdmVybGF5LCBzdGF0ZS5vdmVybGF5KSxcbiAgICAgICAgYmFzZVBvczogc3RhdGUuYmFzZVBvcywgYmFzZUN1cjogbnVsbCxcbiAgICAgICAgb3ZlcmxheVBvczogc3RhdGUub3ZlcmxheVBvcywgb3ZlcmxheUN1cjogbnVsbFxuICAgICAgfTtcbiAgICB9LFxuXG4gICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHtcbiAgICAgIGlmIChzdHJlYW0gIT0gc3RhdGUuc3RyZWFtU2VlbiB8fFxuICAgICAgICAgIE1hdGgubWluKHN0YXRlLmJhc2VQb3MsIHN0YXRlLm92ZXJsYXlQb3MpIDwgc3RyZWFtLnN0YXJ0KSB7XG4gICAgICAgIHN0YXRlLnN0cmVhbVNlZW4gPSBzdHJlYW07XG4gICAgICAgIHN0YXRlLmJhc2VQb3MgPSBzdGF0ZS5vdmVybGF5UG9zID0gc3RyZWFtLnN0YXJ0O1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RyZWFtLnN0YXJ0ID09IHN0YXRlLmJhc2VQb3MpIHtcbiAgICAgICAgc3RhdGUuYmFzZUN1ciA9IGJhc2UudG9rZW4oc3RyZWFtLCBzdGF0ZS5iYXNlKTtcbiAgICAgICAgc3RhdGUuYmFzZVBvcyA9IHN0cmVhbS5wb3M7XG4gICAgICB9XG4gICAgICBpZiAoc3RyZWFtLnN0YXJ0ID09IHN0YXRlLm92ZXJsYXlQb3MpIHtcbiAgICAgICAgc3RyZWFtLnBvcyA9IHN0cmVhbS5zdGFydDtcbiAgICAgICAgc3RhdGUub3ZlcmxheUN1ciA9IG92ZXJsYXkudG9rZW4oc3RyZWFtLCBzdGF0ZS5vdmVybGF5KTtcbiAgICAgICAgc3RhdGUub3ZlcmxheVBvcyA9IHN0cmVhbS5wb3M7XG4gICAgICB9XG4gICAgICBzdHJlYW0ucG9zID0gTWF0aC5taW4oc3RhdGUuYmFzZVBvcywgc3RhdGUub3ZlcmxheVBvcyk7XG5cbiAgICAgIC8vIEVkZ2UgY2FzZSBmb3IgY29kZWJsb2NrcyBpbiB0ZW1wbGF0ZXIgbW9kZVxuICAgICAgaWYgKHN0YXRlLmJhc2VDdXIgJiYgc3RhdGUub3ZlcmxheUN1ciAmJiBzdGF0ZS5iYXNlQ3VyLmNvbnRhaW5zKFwibGluZS1IeXBlck1ELWNvZGVibG9ja1wiKSkge1xuICAgICAgICBzdGF0ZS5vdmVybGF5Q3VyID0gc3RhdGUub3ZlcmxheUN1ci5yZXBsYWNlKFwibGluZS10ZW1wbGF0ZXItaW5saW5lXCIsIFwiXCIpO1xuICAgICAgICBzdGF0ZS5vdmVybGF5Q3VyICs9IGAgbGluZS1iYWNrZ3JvdW5kLUh5cGVyTUQtY29kZWJsb2NrLWJnYDtcbiAgICAgIH1cblxuICAgICAgLy8gc3RhdGUub3ZlcmxheS5jb21iaW5lVG9rZW5zIGFsd2F5cyB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgY29tYmluZSxcbiAgICAgIC8vIHVubGVzcyBzZXQgdG8gbnVsbFxuICAgICAgaWYgKHN0YXRlLm92ZXJsYXlDdXIgPT0gbnVsbCkgcmV0dXJuIHN0YXRlLmJhc2VDdXI7XG4gICAgICBlbHNlIGlmIChzdGF0ZS5iYXNlQ3VyICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgIHN0YXRlLm92ZXJsYXkuY29tYmluZVRva2VucyB8fFxuICAgICAgICAgICAgICAgY29tYmluZSAmJiBzdGF0ZS5vdmVybGF5LmNvbWJpbmVUb2tlbnMgPT0gbnVsbClcbiAgICAgICAgcmV0dXJuIHN0YXRlLmJhc2VDdXIgKyBcIiBcIiArIHN0YXRlLm92ZXJsYXlDdXI7XG4gICAgICBlbHNlIHJldHVybiBzdGF0ZS5vdmVybGF5Q3VyO1xuICAgIH0sXG5cbiAgICBpbmRlbnQ6IGJhc2UuaW5kZW50ICYmIGZ1bmN0aW9uKHN0YXRlLCB0ZXh0QWZ0ZXIsIGxpbmUpIHtcbiAgICAgIHJldHVybiBiYXNlLmluZGVudChzdGF0ZS5iYXNlLCB0ZXh0QWZ0ZXIsIGxpbmUpO1xuICAgIH0sXG4gICAgZWxlY3RyaWNDaGFyczogYmFzZS5lbGVjdHJpY0NoYXJzLFxuXG4gICAgaW5uZXJNb2RlOiBmdW5jdGlvbihzdGF0ZSkgeyByZXR1cm4ge3N0YXRlOiBzdGF0ZS5iYXNlLCBtb2RlOiBiYXNlfTsgfSxcblxuICAgIGJsYW5rTGluZTogZnVuY3Rpb24oc3RhdGUpIHtcbiAgICAgIHZhciBiYXNlVG9rZW4sIG92ZXJsYXlUb2tlbjtcbiAgICAgIGlmIChiYXNlLmJsYW5rTGluZSkgYmFzZVRva2VuID0gYmFzZS5ibGFua0xpbmUoc3RhdGUuYmFzZSk7XG4gICAgICBpZiAob3ZlcmxheS5ibGFua0xpbmUpIG92ZXJsYXlUb2tlbiA9IG92ZXJsYXkuYmxhbmtMaW5lKHN0YXRlLm92ZXJsYXkpO1xuXG4gICAgICByZXR1cm4gb3ZlcmxheVRva2VuID09IG51bGwgP1xuICAgICAgICBiYXNlVG9rZW4gOlxuICAgICAgICAoY29tYmluZSAmJiBiYXNlVG9rZW4gIT0gbnVsbCA/IGJhc2VUb2tlbiArIFwiIFwiICsgb3ZlcmxheVRva2VuIDogb3ZlcmxheVRva2VuKTtcbiAgICB9XG4gIH07XG59O1xuXG59KTtcbiIsImltcG9ydCB7IEFwcCwgUGxhdGZvcm0gfSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCBUZW1wbGF0ZXJQbHVnaW4gZnJvbSBcIm1haW5cIjtcbmltcG9ydCB7IFRlbXBsYXRlckVycm9yIH0gZnJvbSBcIkVycm9yXCI7XG5cbmltcG9ydCBcIm1vZGUvamF2YXNjcmlwdFwiO1xuaW1wb3J0IFwibW9kZS9jdXN0b21fb3ZlcmxheVwiO1xuXG5jb25zdCBUUF9DTURfVE9LRU5fQ0xBU1M6IHN0cmluZyA9IFwidGVtcGxhdGVyLWNvbW1hbmRcIjtcbmNvbnN0IFRQX0lOTElORV9DTEFTUzogc3RyaW5nID0gXCJ0ZW1wbGF0ZXItaW5saW5lXCI7XG5cbmNvbnN0IFRQX09QRU5JTkdfVEFHX1RPS0VOX0NMQVNTOiBzdHJpbmcgPSBcInRlbXBsYXRlci1vcGVuaW5nLXRhZ1wiO1xuY29uc3QgVFBfQ0xPU0lOR19UQUdfVE9LRU5fQ0xBU1M6IHN0cmluZyA9IFwidGVtcGxhdGVyLWNsb3NpbmctdGFnXCI7XG5cbmNvbnN0IFRQX0lOVEVSUE9MQVRJT05fVEFHX1RPS0VOX0NMQVNTOiBzdHJpbmcgPSBcInRlbXBsYXRlci1pbnRlcnBvbGF0aW9uLXRhZ1wiO1xuY29uc3QgVFBfUkFXX1RBR19UT0tFTl9DTEFTUzogc3RyaW5nID0gXCJ0ZW1wbGF0ZXItcmF3LXRhZ1wiO1xuY29uc3QgVFBfRVhFQ19UQUdfVE9LRU5fQ0xBU1M6IHN0cmluZyA9IFwidGVtcGxhdGVyLWV4ZWN1dGlvbi10YWdcIjtcblxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlckVkaXRvciB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgYXBwOiBBcHAsIHByaXZhdGUgcGx1Z2luOiBUZW1wbGF0ZXJQbHVnaW4pIHt9XG5cbiAgICBhc3luYyBzZXR1cCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZWdpc3RlckNvZGVNaXJyb3JNb2RlKCk7XG4gICAgfVxuXG5cdGFzeW5jIHJlZ2lzdGVyQ29kZU1pcnJvck1vZGUoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gY20tZWRpdG9yLXN5bnRheC1oaWdobGlnaHQtb2JzaWRpYW4gcGx1Z2luXG5cdFx0Ly8gaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjbW9kZWFwaVxuXHRcdC8vIGh0dHBzOi8vY29kZW1pcnJvci5uZXQvbW9kZS9kaWZmL2RpZmYuanNcbiAgICAgICAgLy8gaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC9kZW1vL211c3RhY2hlLmh0bWxcblx0XHQvLyBodHRwczovL21hcmlqbmhhdmVyYmVrZS5ubC9ibG9nL2NvZGVtaXJyb3ItbW9kZS1zeXN0ZW0uaHRtbFxuXG4gICAgICAgIGlmICghdGhpcy5wbHVnaW4uc2V0dGluZ3Muc3ludGF4X2hpZ2hsaWdodGluZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVE9ETzogQWRkIG1vYmlsZSBzdXBwb3J0XG5cdFx0aWYgKFBsYXRmb3JtLmlzTW9iaWxlQXBwKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG4gICAgICAgIGNvbnN0IGpzX21vZGUgPSB3aW5kb3cuQ29kZU1pcnJvci5nZXRNb2RlKHt9LCBcImphdmFzY3JpcHRcIik7XG5cdFx0aWYgKGpzX21vZGUubmFtZSA9PT0gXCJudWxsXCIpIHtcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLmxvZ19lcnJvcihuZXcgVGVtcGxhdGVyRXJyb3IoXCJKYXZhc2NyaXB0IHN5bnRheCBtb2RlIGNvdWxkbid0IGJlIGZvdW5kLCBjYW4ndCBlbmFibGUgc3ludGF4IGhpZ2hsaWdodGluZy5cIikpO1xuICAgICAgICAgICAgcmV0dXJuO1xuXHRcdH1cblxuICAgICAgICAvLyBDdXN0b20gb3ZlcmxheSBtb2RlIHVzZWQgdG8gaGFuZGxlIGVkZ2UgY2FzZXNcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBjb25zdCBvdmVybGF5X21vZGUgPSB3aW5kb3cuQ29kZU1pcnJvci5jdXN0b21PdmVybGF5TW9kZTtcbiAgICAgICAgaWYgKG92ZXJsYXlfbW9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5sb2dfZXJyb3IobmV3IFRlbXBsYXRlckVycm9yKFwiQ291bGRuJ3QgZmluZCBjdXN0b21PdmVybGF5TW9kZSwgY2FuJ3QgZW5hYmxlIHN5bnRheCBoaWdobGlnaHRpbmcuXCIpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHdpbmRvdy5Db2RlTWlycm9yLmRlZmluZU1vZGUoXCJ0ZW1wbGF0ZXJcIiwgZnVuY3Rpb24oY29uZmlnLCBwYXJzZXJDb25maWcpIHtcblx0XHRcdGNvbnN0IHRlbXBsYXRlck92ZXJsYXkgPSB7XG4gICAgICAgICAgICAgICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGpzX3N0YXRlID0gd2luZG93LkNvZGVNaXJyb3Iuc3RhcnRTdGF0ZShqc19tb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmpzX3N0YXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhZ19jbGFzczogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVMaW5lOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNvcHlTdGF0ZTogZnVuY3Rpb24oc3RhdGU6IGFueSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBqc19zdGF0ZSA9IHdpbmRvdy5Db2RlTWlycm9yLnN0YXJ0U3RhdGUoanNfbW9kZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld19zdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmpzX3N0YXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kOiBzdGF0ZS5pbkNvbW1hbmQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWdfY2xhc3M6IHN0YXRlLnRhZ19jbGFzcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVMaW5lOiBzdGF0ZS5mcmVlTGluZSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld19zdGF0ZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGJsYW5rTGluZTogZnVuY3Rpb24oc3RhdGU6IGFueSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuaW5Db21tYW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYGxpbmUtYmFja2dyb3VuZC10ZW1wbGF0ZXItY29tbWFuZC1iZ2A7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtOiBhbnksIHN0YXRlOiBhbnkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbS5zb2woKSAmJiBzdGF0ZS5pbkNvbW1hbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmZyZWVMaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5pbkNvbW1hbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBrZXl3b3JkcyA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9bXFwtX117MCwxfSU+LywgdHJ1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5pbkNvbW1hbmQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5mcmVlTGluZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhZ19jbGFzcyA9IHN0YXRlLnRhZ19jbGFzcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS50YWdfY2xhc3MgPSBcIlwiO1xuIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgbGluZS0ke1RQX0lOTElORV9DTEFTU30gJHtUUF9DTURfVE9LRU5fQ0xBU1N9ICR7VFBfQ0xPU0lOR19UQUdfVE9LRU5fQ0xBU1N9ICR7dGFnX2NsYXNzfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IFxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqc19yZXN1bHQgPSBqc19tb2RlLnRva2VuKHN0cmVhbSwgc3RhdGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbS5wZWVrKCkgPT0gbnVsbCAmJiBzdGF0ZS5mcmVlTGluZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmRzICs9IGAgbGluZS1iYWNrZ3JvdW5kLXRlbXBsYXRlci1jb21tYW5kLWJnYDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RhdGUuZnJlZUxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkcyArPSBgIGxpbmUtJHtUUF9JTkxJTkVfQ0xBU1N9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke2tleXdvcmRzfSAke1RQX0NNRF9UT0tFTl9DTEFTU30gJHtqc19yZXN1bHR9YDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gc3RyZWFtLm1hdGNoKC88JVtcXC1fXXswLDF9XFxzKihbKn4rXXswLDF9KS8sIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2ggIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtYXRjaFsxXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJyonOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS50YWdfY2xhc3MgPSBUUF9FWEVDX1RBR19UT0tFTl9DTEFTUztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnfic6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnRhZ19jbGFzcyA9IFRQX1JBV19UQUdfVE9LRU5fQ0xBU1M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnRhZ19jbGFzcyA9IFRQX0lOVEVSUE9MQVRJT05fVEFHX1RPS0VOX0NMQVNTO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmluQ29tbWFuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYGxpbmUtJHtUUF9JTkxJTkVfQ0xBU1N9ICR7VFBfQ01EX1RPS0VOX0NMQVNTfSAke1RQX09QRU5JTkdfVEFHX1RPS0VOX0NMQVNTfSAke3N0YXRlLnRhZ19jbGFzc31gO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHN0cmVhbS5uZXh0KCkgIT0gbnVsbCAmJiAhc3RyZWFtLm1hdGNoKC88JS8sIGZhbHNlKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cblx0XHRcdH07XG4gICAgICAgICAgICByZXR1cm4gb3ZlcmxheV9tb2RlKHdpbmRvdy5Db2RlTWlycm9yLmdldE1vZGUoY29uZmlnLCBcImh5cGVybWRcIiksIHRlbXBsYXRlck92ZXJsYXkpO1xuXHRcdH0pOyBcblx0fVxufSIsImltcG9ydCB7IGFkZEljb24sIEV2ZW50UmVmLCBNZW51LCBNZW51SXRlbSwgbm9ybWFsaXplUGF0aCwgTm90aWNlLCBQbGF0Zm9ybSwgUGx1Z2luLCBUQWJzdHJhY3RGaWxlLCBURmlsZSwgVEZvbGRlciB9IGZyb20gJ29ic2lkaWFuJztcclxuXHJcbmltcG9ydCB7IERFRkFVTFRfU0VUVElOR1MsIFRlbXBsYXRlclNldHRpbmdzLCBUZW1wbGF0ZXJTZXR0aW5nVGFiIH0gZnJvbSAnU2V0dGluZ3MnO1xyXG5pbXBvcnQgeyBUZW1wbGF0ZXJGdXp6eVN1Z2dlc3RNb2RhbCB9IGZyb20gJ1RlbXBsYXRlckZ1enp5U3VnZ2VzdCc7XHJcbmltcG9ydCB7IElDT05fREFUQSB9IGZyb20gJ0NvbnN0YW50cyc7XHJcbmltcG9ydCB7IGRlbGF5LCByZXNvbHZlVEZpbGUgfSBmcm9tICdVdGlscyc7XHJcbmltcG9ydCB7IFRlbXBsYXRlciB9IGZyb20gJ1RlbXBsYXRlcic7XHJcbmltcG9ydCB7IFRlbXBsYXRlckVycm9yIH0gZnJvbSAnRXJyb3InO1xyXG5pbXBvcnQgeyBUZW1wbGF0ZXJFZGl0b3IgfSBmcm9tICdUZW1wbGF0ZXJFZGl0b3InO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGVtcGxhdGVyUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcclxuXHRwdWJsaWMgc2V0dGluZ3M6IFRlbXBsYXRlclNldHRpbmdzOyBcclxuXHRwdWJsaWMgZWRpdG9yOiBUZW1wbGF0ZXJFZGl0b3I7XHJcblx0cHVibGljIHRlbXBsYXRlcjogVGVtcGxhdGVyO1xyXG5cdHByaXZhdGUgZnV6enlTdWdnZXN0OiBUZW1wbGF0ZXJGdXp6eVN1Z2dlc3RNb2RhbDtcclxuXHRwcml2YXRlIHRyaWdnZXJfb25fZmlsZV9jcmVhdGlvbl9ldmVudDogRXZlbnRSZWY7XHJcblx0cHJpdmF0ZSBzeW50YXhfaGlnaGxpZ2h0aW5nX2V2ZW50OiBFdmVudFJlZjtcclxuXHJcblx0YXN5bmMgb25sb2FkKCk6IFByb21pc2U8dm9pZD4ge1xyXG5cdFx0YXdhaXQgdGhpcy5sb2FkU2V0dGluZ3MoKTtcclxuXHJcblx0XHR0aGlzLnRlbXBsYXRlciA9IG5ldyBUZW1wbGF0ZXIodGhpcy5hcHAsIHRoaXMpO1xyXG5cdFx0YXdhaXQgdGhpcy50ZW1wbGF0ZXIuc2V0dXAoKTtcclxuXHJcblx0XHR0aGlzLmVkaXRvciA9IG5ldyBUZW1wbGF0ZXJFZGl0b3IodGhpcy5hcHAsIHRoaXMpO1xyXG5cdFx0YXdhaXQgdGhpcy5lZGl0b3Iuc2V0dXAoKTtcclxuXHRcdHRoaXMudXBkYXRlX3N5bnRheF9oaWdobGlnaHRpbmcoKTtcclxuXHJcblx0XHR0aGlzLmZ1enp5U3VnZ2VzdCA9IG5ldyBUZW1wbGF0ZXJGdXp6eVN1Z2dlc3RNb2RhbCh0aGlzLmFwcCwgdGhpcyk7XHJcblxyXG5cdFx0dGhpcy5yZWdpc3Rlck1hcmtkb3duUG9zdFByb2Nlc3NvcigoZWwsIGN0eCkgPT4gdGhpcy50ZW1wbGF0ZXIucHJvY2Vzc19keW5hbWljX3RlbXBsYXRlcyhlbCwgY3R4KSk7XHJcblxyXG5cdFx0YWRkSWNvbihcInRlbXBsYXRlci1pY29uXCIsIElDT05fREFUQSk7XHJcblx0XHR0aGlzLmFkZFJpYmJvbkljb24oJ3RlbXBsYXRlci1pY29uJywgJ1RlbXBsYXRlcicsIGFzeW5jICgpID0+IHtcclxuXHRcdFx0dGhpcy5mdXp6eVN1Z2dlc3QuaW5zZXJ0X3RlbXBsYXRlKCk7XHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLmFkZENvbW1hbmQoe1xyXG5cdFx0XHRpZDogXCJpbnNlcnQtdGVtcGxhdGVyXCIsXHJcblx0XHRcdG5hbWU6IFwiSW5zZXJ0IFRlbXBsYXRlXCIsXHJcblx0XHRcdGhvdGtleXM6IFtcclxuXHRcdFx0XHR7XHJcblx0XHRcdFx0XHRtb2RpZmllcnM6IFtcIkFsdFwiXSxcclxuXHRcdFx0XHRcdGtleTogJ2UnLFxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdF0sXHJcblx0XHRcdGNhbGxiYWNrOiAoKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5mdXp6eVN1Z2dlc3QuaW5zZXJ0X3RlbXBsYXRlKCk7XHJcblx0XHRcdH0sXHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLmFkZENvbW1hbmQoe1xyXG4gICAgICAgICAgICBpZDogXCJyZXBsYWNlLWluLWZpbGUtdGVtcGxhdGVyXCIsXHJcbiAgICAgICAgICAgIG5hbWU6IFwiUmVwbGFjZSB0ZW1wbGF0ZXMgaW4gdGhlIGFjdGl2ZSBmaWxlXCIsXHJcbiAgICAgICAgICAgIGhvdGtleXM6IFtcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBtb2RpZmllcnM6IFtcIkFsdFwiXSxcclxuICAgICAgICAgICAgICAgICAgICBrZXk6ICdyJyxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgIGNhbGxiYWNrOiAoKSA9PiB7XHJcblx0XHRcdFx0dGhpcy50ZW1wbGF0ZXIub3ZlcndyaXRlX2FjdGl2ZV9maWxlX3RlbXBsYXRlcygpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH0pO1xyXG5cclxuXHRcdHRoaXMuYWRkQ29tbWFuZCh7XHJcblx0XHRcdGlkOiBcImp1bXAtdG8tbmV4dC1jdXJzb3ItbG9jYXRpb25cIixcclxuXHRcdFx0bmFtZTogXCJKdW1wIHRvIG5leHQgY3Vyc29yIGxvY2F0aW9uXCIsXHJcblx0XHRcdGhvdGtleXM6IFtcclxuXHRcdFx0XHR7XHJcblx0XHRcdFx0XHRtb2RpZmllcnM6IFtcIkFsdFwiXSxcclxuXHRcdFx0XHRcdGtleTogXCJUYWJcIixcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRdLFxyXG5cdFx0XHRjYWxsYmFjazogKCkgPT4ge1xyXG5cdFx0XHRcdHRoaXMudGVtcGxhdGVyLmN1cnNvcl9qdW1wZXIuanVtcF90b19uZXh0X2N1cnNvcl9sb2NhdGlvbigpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLmFkZENvbW1hbmQoe1xyXG5cdFx0XHRpZDogXCJjcmVhdGUtbmV3LW5vdGUtZnJvbS10ZW1wbGF0ZVwiLFxyXG5cdFx0XHRuYW1lOiBcIkNyZWF0ZSBuZXcgbm90ZSBmcm9tIHRlbXBsYXRlXCIsXHJcblx0XHRcdGhvdGtleXM6IFtcclxuXHRcdFx0XHR7XHJcblx0XHRcdFx0XHRtb2RpZmllcnM6IFtcIkFsdFwiXSxcclxuXHRcdFx0XHRcdGtleTogXCJuXCIsXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XSxcclxuXHRcdFx0Y2FsbGJhY2s6ICgpID0+IHtcclxuXHRcdFx0XHR0aGlzLmZ1enp5U3VnZ2VzdC5jcmVhdGVfbmV3X25vdGVfZnJvbV90ZW1wbGF0ZSgpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLmFwcC53b3Jrc3BhY2Uub25MYXlvdXRSZWFkeSgoKSA9PiB7XHJcblx0XHRcdHRoaXMudXBkYXRlX3RyaWdnZXJfZmlsZV9vbl9jcmVhdGlvbigpO1x0XHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLnJlZ2lzdGVyRXZlbnQoXHJcblx0XHRcdHRoaXMuYXBwLndvcmtzcGFjZS5vbihcImZpbGUtbWVudVwiLCAobWVudTogTWVudSwgZmlsZTogVEZpbGUpID0+IHtcclxuXHRcdFx0XHRpZiAoZmlsZSBpbnN0YW5jZW9mIFRGb2xkZXIpIHtcclxuXHRcdFx0XHRcdG1lbnUuYWRkSXRlbSgoaXRlbTogTWVudUl0ZW0pID0+IHtcclxuXHRcdFx0XHRcdFx0aXRlbS5zZXRUaXRsZShcIkNyZWF0ZSBuZXcgbm90ZSBmcm9tIHRlbXBsYXRlXCIpXHJcblx0XHRcdFx0XHRcdFx0LnNldEljb24oXCJ0ZW1wbGF0ZXItaWNvblwiKVxyXG5cdFx0XHRcdFx0XHRcdC5vbkNsaWNrKGV2dCA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmZ1enp5U3VnZ2VzdC5jcmVhdGVfbmV3X25vdGVfZnJvbV90ZW1wbGF0ZShmaWxlKTtcclxuXHRcdFx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KVxyXG5cdFx0KTtcclxuXHJcblx0XHR0aGlzLmFkZFNldHRpbmdUYWIobmV3IFRlbXBsYXRlclNldHRpbmdUYWIodGhpcy5hcHAsIHRoaXMpKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIHNhdmVTZXR0aW5ncygpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHRcdGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncyk7XHJcblx0fVxyXG5cclxuXHRhc3luYyBsb2FkU2V0dGluZ3MoKTogUHJvbWlzZTx2b2lkPiB7XHJcblx0XHR0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9TRVRUSU5HUywgYXdhaXQgdGhpcy5sb2FkRGF0YSgpKTtcclxuXHR9XHRcclxuXHJcblx0dXBkYXRlX3RyaWdnZXJfZmlsZV9vbl9jcmVhdGlvbigpOiB2b2lkIHtcclxuXHRcdGlmICh0aGlzLnNldHRpbmdzLnRyaWdnZXJfb25fZmlsZV9jcmVhdGlvbikge1xyXG5cdFx0XHR0aGlzLnRyaWdnZXJfb25fZmlsZV9jcmVhdGlvbl9ldmVudCA9IHRoaXMuYXBwLnZhdWx0Lm9uKFwiY3JlYXRlXCIsIGFzeW5jIChmaWxlOiBUQWJzdHJhY3RGaWxlKSA9PiB7XHJcblx0XHRcdFx0aWYgKCEoZmlsZSBpbnN0YW5jZW9mIFRGaWxlKSB8fCBmaWxlLmV4dGVuc2lvbiAhPT0gXCJtZFwiKSB7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvKiBBdm9pZHMgdGVtcGxhdGUgcmVwbGFjZW1lbnQgd2hlbiBzeW5jaW5nIGZpbGVzICovXHJcblx0XHRcdFx0Y29uc3QgdGVtcGxhdGVfZm9sZGVyID0gbm9ybWFsaXplUGF0aCh0aGlzLnNldHRpbmdzLnRlbXBsYXRlX2ZvbGRlcik7XHJcblx0XHRcdFx0aWYgKHRlbXBsYXRlX2ZvbGRlciAhPT0gXCIvXCIpIHtcclxuXHRcdFx0XHRcdGxldCBwYXJlbnQgPSBmaWxlLnBhcmVudDtcclxuXHRcdFx0XHRcdHdoaWxlIChwYXJlbnQgIT0gbnVsbCkge1xyXG5cdFx0XHRcdFx0XHRpZiAocGFyZW50LnBhdGggPT09IHRlbXBsYXRlX2ZvbGRlcikge1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRwYXJlbnQgPSBwYXJlbnQucGFyZW50O1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ly8gVE9ETzogZmluZCBhIGJldHRlciB3YXkgdG8gZG8gdGhpc1xyXG5cdFx0XHRcdC8vIEN1cnJlbnRseSwgSSBoYXZlIHRvIHdhaXQgZm9yIHRoZSBkYWlseSBub3RlIHBsdWdpbiB0byBhZGQgdGhlIGZpbGUgY29udGVudCBiZWZvcmUgcmVwbGFjaW5nXHJcblx0XHRcdFx0Ly8gTm90IGEgcHJvYmxlbSB3aXRoIENhbGVuZGFyIGhvd2V2ZXIgc2luY2UgaXQgY3JlYXRlcyB0aGUgZmlsZSB3aXRoIHRoZSBleGlzdGluZyBjb250ZW50XHJcblx0XHRcdFx0YXdhaXQgZGVsYXkoMzAwKTtcclxuXHJcblx0XHRcdFx0aWYgKGZpbGUuc3RhdC5zaXplID09IDAgJiYgdGhpcy5zZXR0aW5ncy5lbXB0eV9maWxlX3RlbXBsYXRlKSB7XHJcblx0XHRcdFx0XHRjb25zdCB0ZW1wbGF0ZV9maWxlID0gYXdhaXQgdGhpcy5lcnJvcldyYXBwZXIoYXN5bmMgKCk6IFByb21pc2U8VEZpbGU+ID0+IHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc29sdmVURmlsZSh0aGlzLmFwcCwgdGhpcy5zZXR0aW5ncy5lbXB0eV9maWxlX3RlbXBsYXRlICsgXCIubWRcIik7XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdGlmICghdGVtcGxhdGVfZmlsZSkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRjb25zdCBjb250ZW50ID0gYXdhaXQgdGhpcy5hcHAudmF1bHQucmVhZCh0ZW1wbGF0ZV9maWxlKTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMuYXBwLnZhdWx0Lm1vZGlmeShmaWxlLCBjb250ZW50KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0dGhpcy50ZW1wbGF0ZXIub3ZlcndyaXRlX2ZpbGVfdGVtcGxhdGVzKGZpbGUpO1xyXG5cdFx0XHR9KTtcclxuXHRcdFx0dGhpcy5yZWdpc3RlckV2ZW50KHRoaXMudHJpZ2dlcl9vbl9maWxlX2NyZWF0aW9uX2V2ZW50KTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGlmICh0aGlzLnRyaWdnZXJfb25fZmlsZV9jcmVhdGlvbl9ldmVudCkge1xyXG5cdFx0XHRcdHRoaXMuYXBwLnZhdWx0Lm9mZnJlZih0aGlzLnRyaWdnZXJfb25fZmlsZV9jcmVhdGlvbl9ldmVudCk7XHJcblx0XHRcdFx0dGhpcy50cmlnZ2VyX29uX2ZpbGVfY3JlYXRpb25fZXZlbnQgPSB1bmRlZmluZWQ7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHVwZGF0ZV9zeW50YXhfaGlnaGxpZ2h0aW5nKCkge1xyXG5cdFx0aWYgKHRoaXMuc2V0dGluZ3Muc3ludGF4X2hpZ2hsaWdodGluZykge1xyXG5cdFx0XHR0aGlzLnN5bnRheF9oaWdobGlnaHRpbmdfZXZlbnQgPSB0aGlzLmFwcC53b3Jrc3BhY2Uub24oXCJjb2RlbWlycm9yXCIsIGNtID0+IHtcclxuXHRcdFx0XHRjbS5zZXRPcHRpb24oXCJtb2RlXCIsIFwidGVtcGxhdGVyXCIpO1xyXG5cdFx0XHR9KTtcclxuXHRcdFx0dGhpcy5hcHAud29ya3NwYWNlLml0ZXJhdGVDb2RlTWlycm9ycyhjbSA9PiB7XHJcblx0XHRcdFx0Y20uc2V0T3B0aW9uKFwibW9kZVwiLCBcInRlbXBsYXRlclwiKTtcclxuXHRcdFx0fSk7XHJcblx0XHRcdHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLnN5bnRheF9oaWdobGlnaHRpbmdfZXZlbnQpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0aWYgKHRoaXMuc3ludGF4X2hpZ2hsaWdodGluZ19ldmVudCkge1xyXG5cdFx0XHRcdHRoaXMuYXBwLnZhdWx0Lm9mZnJlZih0aGlzLnN5bnRheF9oaWdobGlnaHRpbmdfZXZlbnQpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHRoaXMuYXBwLndvcmtzcGFjZS5pdGVyYXRlQ29kZU1pcnJvcnMoY20gPT4ge1xyXG5cdFx0XHRcdGNtLnNldE9wdGlvbihcIm1vZGVcIiwgXCJoeXBlcm1kXCIpO1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGFzeW5jIGVycm9yV3JhcHBlcihmbjogRnVuY3Rpb24pOiBQcm9taXNlPGFueT4ge1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0cmV0dXJuIGF3YWl0IGZuKCk7XHJcblx0XHR9IGNhdGNoKGUpIHtcclxuXHRcdFx0aWYgKCEoZSBpbnN0YW5jZW9mIFRlbXBsYXRlckVycm9yKSkge1xyXG5cdFx0XHRcdHRoaXMubG9nX2Vycm9yKG5ldyBUZW1wbGF0ZXJFcnJvcihgVGVtcGxhdGUgcGFyc2luZyBlcnJvciwgYWJvcnRpbmcuYCwgZS5tZXNzYWdlKSk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0dGhpcy5sb2dfZXJyb3IoZSk7XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRsb2dfdXBkYXRlKG1zZzogc3RyaW5nKTogdm9pZCB7XHJcblx0XHRjb25zdCBub3RpY2UgPSBuZXcgTm90aWNlKFwiXCIsIDE1MDAwKTtcclxuXHRcdC8vIFRPRE86IEZpbmQgYmV0dGVyIHdheSBmb3IgdGhpc1xyXG5cdFx0Ly8gQHRzLWlnbm9yZVxyXG5cdFx0bm90aWNlLm5vdGljZUVsLmlubmVySFRNTCA9IGA8Yj5UZW1wbGF0ZXIgdXBkYXRlPC9iPjo8YnIvPiR7bXNnfWA7XHJcblx0fVxyXG5cclxuXHRsb2dfZXJyb3IoZTogRXJyb3IgfCBUZW1wbGF0ZXJFcnJvcik6IHZvaWQge1xyXG5cdFx0Y29uc3Qgbm90aWNlID0gbmV3IE5vdGljZShcIlwiLCA4MDAwKTtcclxuXHRcdGlmIChlIGluc3RhbmNlb2YgVGVtcGxhdGVyRXJyb3IgJiYgZS5jb25zb2xlX21zZykge1xyXG5cdFx0XHQvLyBUT0RPOiBGaW5kIGEgYmV0dGVyIHdheSBmb3IgdGhpc1xyXG5cdFx0XHQvLyBAdHMtaWdub3JlXHJcblx0XHRcdG5vdGljZS5ub3RpY2VFbC5pbm5lckhUTUwgPSBgPGI+VGVtcGxhdGVyIEVycm9yPC9iPjo8YnIvPiR7ZS5tZXNzYWdlfTxici8+Q2hlY2sgY29uc29sZSBmb3IgbW9yZSBpbmZvcm1hdGlvbnNgO1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKGUubWVzc2FnZSwgZS5jb25zb2xlX21zZyk7XHJcblx0XHR9XHJcblx0XHRlbHNlIHtcclxuXHRcdFx0Ly8gQHRzLWlnbm9yZVxyXG5cdFx0XHRub3RpY2Uubm90aWNlRWwuaW5uZXJIVE1MID0gYDxiPlRlbXBsYXRlciBFcnJvcjwvYj46PGJyLz4ke2UubWVzc2FnZX1gO1xyXG5cdFx0fVxyXG5cdH1cdFxyXG59OyJdLCJuYW1lcyI6WyJQbHVnaW5TZXR0aW5nVGFiIiwiU2V0dGluZyIsImVzY2FwZVJlZ0V4cCIsIm5vcm1hbGl6ZVBhdGgiLCJURmlsZSIsIlRGb2xkZXIiLCJWYXVsdCIsIkZ1enp5U3VnZ2VzdE1vZGFsIiwiTWFya2Rvd25WaWV3IiwicGF0aCIsImV4aXN0c1N5bmMiLCJyZWFkRmlsZVN5bmMiLCJwYXJzZUxpbmt0ZXh0IiwicmVzb2x2ZVN1YnBhdGgiLCJQbGF0Zm9ybSIsIkZpbGVTeXN0ZW1BZGFwdGVyIiwiZ2V0QWxsVGFncyIsIk1vZGFsIiwicHJvbWlzaWZ5IiwiZXhlYyIsIkV0YS5yZW5kZXJBc3luYyIsIlBsdWdpbiIsImFkZEljb24iLCJOb3RpY2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF1REE7QUFDTyxTQUFTLFNBQVMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUU7QUFDN0QsSUFBSSxTQUFTLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxPQUFPLEtBQUssWUFBWSxDQUFDLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLFVBQVUsT0FBTyxFQUFFLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7QUFDaEgsSUFBSSxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxPQUFPLENBQUMsRUFBRSxVQUFVLE9BQU8sRUFBRSxNQUFNLEVBQUU7QUFDL0QsUUFBUSxTQUFTLFNBQVMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO0FBQ25HLFFBQVEsU0FBUyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO0FBQ3RHLFFBQVEsU0FBUyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFO0FBQ3RILFFBQVEsSUFBSSxDQUFDLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLFVBQVUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzlFLEtBQUssQ0FBQyxDQUFDO0FBQ1A7O01DN0VhLGNBQWUsU0FBUSxLQUFLO0lBQ3JDLFlBQVksR0FBVyxFQUFTLFdBQW9CO1FBQ2hELEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQURpQixnQkFBVyxHQUFYLFdBQVcsQ0FBUztRQUVoRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO1FBQ2xDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0tBQ25EOzs7QUNBRSxNQUFNLGdCQUFnQixHQUFzQjtJQUNsRCxlQUFlLEVBQUUsQ0FBQztJQUNsQixlQUFlLEVBQUUsRUFBRTtJQUNuQixlQUFlLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMzQix3QkFBd0IsRUFBRSxLQUFLO0lBQy9CLHNCQUFzQixFQUFFLEtBQUs7SUFDN0IsVUFBVSxFQUFFLEVBQUU7SUFDZCxhQUFhLEVBQUUsU0FBUztJQUN4QixtQkFBbUIsRUFBRSxTQUFTO0lBQzlCLG1CQUFtQixFQUFFLElBQUk7Q0FDekIsQ0FBQztNQWNXLG1CQUFvQixTQUFRQSx5QkFBZ0I7SUFDeEQsWUFBbUIsR0FBUSxFQUFVLE1BQXVCO1FBQzNELEtBQUssQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFERCxRQUFHLEdBQUgsR0FBRyxDQUFLO1FBQVUsV0FBTSxHQUFOLE1BQU0sQ0FBaUI7S0FFM0Q7SUFFRCxPQUFPO1FBQ04sTUFBTSxFQUFDLFdBQVcsRUFBQyxHQUFHLElBQUksQ0FBQztRQUMzQixJQUFJLElBQXNCLENBQUM7UUFDM0IsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRXBCLElBQUlDLGdCQUFPLENBQUMsV0FBVyxDQUFDO2FBQ3RCLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQzthQUNuQyxPQUFPLENBQUMsc0RBQXNELENBQUM7YUFDL0QsT0FBTyxDQUFDLElBQUk7WUFDWixJQUFJLENBQUMsY0FBYyxDQUFDLDRCQUE0QixDQUFDO2lCQUMvQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDO2lCQUM5QyxRQUFRLENBQUMsQ0FBQyxVQUFVO2dCQUNwQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEdBQUcsVUFBVSxDQUFDO2dCQUNsRCxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO2FBQzNCLENBQUMsQ0FBQTtTQUNILENBQUMsQ0FBQztRQUVKLElBQUlBLGdCQUFPLENBQUMsV0FBVyxDQUFDO2FBQ3RCLE9BQU8sQ0FBQyxTQUFTLENBQUM7YUFDbEIsT0FBTyxDQUFDLGtEQUFrRCxDQUFDO2FBQzNELE9BQU8sQ0FBQyxJQUFJO1lBQ1osSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUM7aUJBQzVCLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUM7aUJBQ3pELFFBQVEsQ0FBQyxDQUFDLFNBQVM7Z0JBQ25CLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDdEMsSUFBSSxLQUFLLENBQUMsV0FBVyxDQUFDLEVBQUU7b0JBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksY0FBYyxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQztvQkFDdEUsT0FBTztpQkFDUDtnQkFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEdBQUcsV0FBVyxDQUFDO2dCQUNuRCxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO2FBQzNCLENBQUMsQ0FBQTtTQUNILENBQUMsQ0FBQztRQUVKLElBQUksR0FBRyxRQUFRLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUN6QyxJQUFJLENBQUMsTUFBTSxDQUNWLGlGQUFpRixFQUNqRixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUNuQixZQUFZLEVBQ1osSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDbEIsSUFBSSxFQUFFLDJDQUEyQztZQUNqRCxJQUFJLEVBQUUsZUFBZTtTQUNyQixDQUFDLEVBQ0YscUVBQXFFLENBQ3JFLENBQUM7UUFFRixJQUFJQSxnQkFBTyxDQUFDLFdBQVcsQ0FBQzthQUN0QixPQUFPLENBQUMsa0NBQWtDLENBQUM7YUFDM0MsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWhCLElBQUksR0FBRyxRQUFRLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUN6QyxJQUFJLENBQUMsTUFBTSxDQUNWLCtEQUErRCxDQUMvRCxDQUFDO1FBRUYsSUFBSUEsZ0JBQU8sQ0FBQyxXQUFXLENBQUM7YUFDdEIsT0FBTyxDQUFDLHFCQUFxQixDQUFDO2FBQzlCLE9BQU8sQ0FBQyxJQUFJLENBQUM7YUFDYixTQUFTLENBQUMsTUFBTTtZQUNoQixNQUFNO2lCQUNKLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQztpQkFDbEQsUUFBUSxDQUFDLG1CQUFtQjtnQkFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsbUJBQW1CLEdBQUcsbUJBQW1CLENBQUM7Z0JBQy9ELElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsMEJBQTBCLEVBQUUsQ0FBQzthQUN6QyxDQUFDLENBQUE7U0FDSCxDQUFDLENBQUM7UUFFSixJQUFJLEdBQUcsUUFBUSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLE1BQU0sQ0FDVixzSEFBc0gsRUFDdEgsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFDbkIsK0lBQStJLEVBQy9JLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQ25CLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFO1lBQ2xCLElBQUksRUFBRSxXQUFXO1NBQ2pCLENBQUMsRUFDRix1SkFBdUosQ0FDdkosQ0FBQztRQUVGLElBQUlBLGdCQUFPLENBQUMsV0FBVyxDQUFDO2FBQ3RCLE9BQU8sQ0FBQyx3Q0FBd0MsQ0FBQzthQUNqRCxPQUFPLENBQUMsSUFBSSxDQUFDO2FBQ2IsU0FBUyxDQUFDLE1BQU07WUFDaEIsTUFBTTtpQkFDSixRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsd0JBQXdCLENBQUM7aUJBQ3ZELFFBQVEsQ0FBQyx3QkFBd0I7Z0JBQ2pDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLHdCQUF3QixHQUFHLHdCQUF3QixDQUFDO2dCQUN6RSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLCtCQUErQixFQUFFLENBQUM7O2dCQUU5QyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7YUFDZixDQUFDLENBQUM7U0FDSixDQUFDLENBQUM7UUFFSixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLHdCQUF3QixFQUFFO1lBQ2xELElBQUksR0FBRyxRQUFRLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUN6QyxJQUFJLENBQUMsTUFBTSxDQUNWLDRGQUE0RixFQUM1RixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUNuQix3REFBd0QsQ0FDeEQsQ0FBQztZQUVGLElBQUlBLGdCQUFPLENBQUMsV0FBVyxDQUFDO2lCQUN0QixPQUFPLENBQUMscUJBQXFCLENBQUM7aUJBQzlCLE9BQU8sQ0FBQyxJQUFJLENBQUM7aUJBQ2IsT0FBTyxDQUFDLElBQUk7Z0JBQ1osSUFBSSxDQUFDLGNBQWMsQ0FBQyx3QkFBd0IsQ0FBQztxQkFDM0MsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDO3FCQUNsRCxRQUFRLENBQUMsQ0FBQyxtQkFBbUI7b0JBQzdCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLG1CQUFtQixHQUFHLG1CQUFtQixDQUFDO29CQUMvRCxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO2lCQUMzQixDQUFDLENBQUM7YUFDSixDQUFDLENBQUM7U0FDSjtRQUVELElBQUksR0FBRyxRQUFRLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUN6QyxJQUFJLENBQUMsTUFBTSxDQUNWLDBHQUEwRyxFQUMxRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUNuQixtREFBbUQsRUFDbkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFDbkIsWUFBWSxFQUNaLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFO1lBQ2xCLElBQUksRUFBRSwyQ0FBMkM7WUFDakQsSUFBSSxFQUFFLGVBQWU7U0FDckIsQ0FBQyxFQUNGLHlCQUF5QixDQUN6QixDQUFDO1FBRUYsSUFBSUEsZ0JBQU8sQ0FBQyxXQUFXLENBQUM7YUFDdEIsT0FBTyxDQUFDLDhCQUE4QixDQUFDO2FBQ3ZDLE9BQU8sQ0FBQyxJQUFJLENBQUM7YUFDYixPQUFPLENBQUMsSUFBSTtZQUNaLElBQUksQ0FBQyxjQUFjLENBQUMsNEJBQTRCLENBQUM7aUJBQy9DLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUM7aUJBQzVDLFFBQVEsQ0FBQyxDQUFDLFVBQVU7Z0JBQ3BCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGFBQWEsR0FBRyxVQUFVLENBQUM7Z0JBQ2hELElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7YUFDM0IsQ0FBQyxDQUFBO1NBQ0gsQ0FBQyxDQUFDO1FBRUosSUFBSSxHQUFHLFFBQVEsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxNQUFNLENBQ1YsZ0VBQWdFLEVBQ2hFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQ25CLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFO1lBQ2xCLElBQUksRUFBRSxXQUFXO1NBQ2pCLENBQUMsRUFDRixzSkFBc0osQ0FDdEosQ0FBQztRQUVGLElBQUlBLGdCQUFPLENBQUMsV0FBVyxDQUFDO2FBQ3RCLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQzthQUNqQyxPQUFPLENBQUMsSUFBSSxDQUFDO2FBQ2IsU0FBUyxDQUFDLE1BQU07WUFDaEIsTUFBTTtpQkFDSixRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsc0JBQXNCLENBQUM7aUJBQ3JELFFBQVEsQ0FBQyxzQkFBc0I7Z0JBQy9CLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLHNCQUFzQixHQUFHLHNCQUFzQixDQUFDO2dCQUNyRSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDOztnQkFFM0IsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2FBQ2YsQ0FBQyxDQUFDO1NBQ0osQ0FBQyxDQUFDO1FBRUosSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsRUFBRTtZQUNoRCxJQUFJLEdBQUcsUUFBUSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDekMsSUFBSSxDQUFDLE1BQU0sQ0FDViw0REFBNEQsRUFDNUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFDbkIsMkZBQTJGLEVBQzNGLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQ25CLG9GQUFvRixDQUNwRixDQUFDO1lBQ0YsSUFBSUEsZ0JBQU8sQ0FBQyxXQUFXLENBQUM7aUJBQ3RCLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQztpQkFDaEMsT0FBTyxDQUFDLElBQUksQ0FBQztpQkFDYixPQUFPLENBQUMsSUFBSTtnQkFDWixJQUFJLENBQUMsY0FBYyxDQUFDLHlCQUF5QixDQUFDO3FCQUM1QyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO3FCQUN6QyxRQUFRLENBQUMsQ0FBQyxVQUFVO29CQUNwQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO29CQUM3QyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO2lCQUMzQixDQUFDLENBQUE7YUFDSCxDQUFDLENBQUM7WUFFSixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDVixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsYUFBYTtnQkFDMUQsTUFBTSxHQUFHLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDeEMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFFOUIsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUU7b0JBQ3hDLElBQUksRUFBRSxrQkFBa0IsR0FBRyxDQUFDO2lCQUM1QixDQUFDLENBQUM7Z0JBQ0gsS0FBSyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dCQUVsQyxNQUFNLE9BQU8sR0FBRyxJQUFJQSxnQkFBTyxDQUFDLFdBQVcsQ0FBQztxQkFDdEMsY0FBYyxDQUFDLEtBQUs7b0JBQ3BCLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO3lCQUNwQixVQUFVLENBQUMsUUFBUSxDQUFDO3lCQUNwQixPQUFPLENBQUM7d0JBQ1IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQzt3QkFDMUUsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUU7NEJBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7OzRCQUV0RCxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDOzRCQUMzQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7eUJBQ2Y7cUJBQ0QsQ0FBQyxDQUFBO2lCQUNILENBQUM7cUJBQ0QsT0FBTyxDQUFDLElBQUk7b0JBQ1gsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUM7eUJBQzdDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7eUJBQzFCLFFBQVEsQ0FBQyxDQUFDLFNBQVM7d0JBQ25CLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7d0JBQzFFLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFOzRCQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUM7NEJBQzNELElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7eUJBQzNCO3FCQUNELENBQUMsQ0FBQztvQkFDSCxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO29CQUV6QyxPQUFPLENBQUMsQ0FBQztpQkFDVCxDQUNEO3FCQUNBLFdBQVcsQ0FBQyxJQUFJO29CQUNoQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDO3lCQUM5QyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO3lCQUMxQixRQUFRLENBQUMsQ0FBQyxPQUFPO3dCQUNqQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO3dCQUMxRSxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRTs0QkFDZixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDOzRCQUN6RCxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO3lCQUMzQjtxQkFDRCxDQUFDLENBQUM7b0JBRUgsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUM3QixDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQztvQkFFcEMsT0FBTyxDQUFDLENBQUM7aUJBQ1QsQ0FBQyxDQUFDO2dCQUVKLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBRXhCLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3ZCLEdBQUcsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUV2QyxDQUFDLElBQUUsQ0FBQyxDQUFDO2FBQ0wsQ0FBQyxDQUFDO1lBRUgsTUFBTSxHQUFHLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4QyxHQUFHLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFFL0IsTUFBTSxPQUFPLEdBQUcsSUFBSUEsZ0JBQU8sQ0FBQyxXQUFXLENBQUM7aUJBQ3RDLFNBQVMsQ0FBQyxNQUFNO2dCQUNoQixNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLHVCQUF1QixDQUFDLENBQUMsT0FBTyxDQUFDO29CQUMvRCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7O29CQUVwRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7aUJBQ2YsQ0FBQyxDQUFDO2dCQUNILENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLENBQUM7Z0JBRXhDLE9BQU8sQ0FBQyxDQUFDO2FBQ1QsQ0FBQyxDQUFDO1lBQ0osT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUV4QixHQUFHLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUN2QztLQUNEOzs7QUM1U0ssTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBRW5DLEtBQUssQ0FBQyxFQUFVO0lBQzVCLE9BQU8sSUFBSSxPQUFPLENBQUUsT0FBTyxJQUFJLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUUsQ0FBQztBQUM3RCxDQUFDO1NBRWVDLGNBQVksQ0FBQyxHQUFXO0lBQ3BDLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN0RCxDQUFDO1NBRWUsWUFBWSxDQUFDLEdBQVEsRUFBRSxRQUFnQjtJQUNuRCxRQUFRLEdBQUdDLHNCQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFbkMsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN2RCxJQUFJLENBQUMsSUFBSSxFQUFFO1FBQ1AsTUFBTSxJQUFJLGNBQWMsQ0FBQyxTQUFTLFFBQVEsaUJBQWlCLENBQUMsQ0FBQztLQUNoRTtJQUNELElBQUksRUFBRSxJQUFJLFlBQVlDLGNBQUssQ0FBQyxFQUFFO1FBQzFCLE1BQU0sSUFBSSxjQUFjLENBQUMsR0FBRyxRQUFRLDBCQUEwQixDQUFDLENBQUM7S0FDbkU7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFDO1NBRWUsbUJBQW1CLENBQUMsR0FBUSxFQUFFLFVBQWtCO0lBQzVELFVBQVUsR0FBR0Qsc0JBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUV2QyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzNELElBQUksQ0FBQyxNQUFNLEVBQUU7UUFDVCxNQUFNLElBQUksY0FBYyxDQUFDLFdBQVcsVUFBVSxpQkFBaUIsQ0FBQyxDQUFDO0tBQ3BFO0lBQ0QsSUFBSSxFQUFFLE1BQU0sWUFBWUUsZ0JBQU8sQ0FBQyxFQUFFO1FBQzlCLE1BQU0sSUFBSSxjQUFjLENBQUMsR0FBRyxVQUFVLDBCQUEwQixDQUFDLENBQUM7S0FDckU7SUFFRCxJQUFJLEtBQUssR0FBaUIsRUFBRSxDQUFDO0lBQzdCQyxjQUFLLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQW1CO1FBQzlDLElBQUksSUFBSSxZQUFZRixjQUFLLEVBQUU7WUFDdkIsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNwQjtLQUNKLENBQUMsQ0FBQztJQUVILEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNaLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBQy9DLENBQUMsQ0FBQztJQUVILE9BQU8sS0FBSyxDQUFDO0FBQ2pCOztBQzlDQSxJQUFZLFFBR1g7QUFIRCxXQUFZLFFBQVE7SUFDaEIsMkRBQWMsQ0FBQTtJQUNkLG1FQUFrQixDQUFBO0FBQ3RCLENBQUMsRUFIVyxRQUFRLEtBQVIsUUFBUSxRQUduQjtNQUVZLDBCQUEyQixTQUFRRywwQkFBd0I7SUFNcEUsWUFBWSxHQUFRLEVBQUUsTUFBdUI7UUFDekMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDZixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztLQUN4QjtJQUVELFFBQVE7UUFDSixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGVBQWUsS0FBSyxFQUFFLEVBQUU7WUFDN0MsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1NBQzVDO1FBQ0QsT0FBTyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0tBQzlFO0lBRUQsV0FBVyxDQUFDLElBQVc7UUFDbkIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0tBQ3hCO0lBRUQsWUFBWSxDQUFDLElBQVcsRUFBRSxJQUFnQztRQUN0RCxRQUFPLElBQUksQ0FBQyxTQUFTO1lBQ2pCLEtBQUssUUFBUSxDQUFDLGNBQWM7Z0JBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDNUMsTUFBTTtZQUNWLEtBQUssUUFBUSxDQUFDLGtCQUFrQjtnQkFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsNkJBQTZCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFDaEYsTUFBTTtTQUNiO0tBQ0o7SUFFRCxLQUFLO1FBQ0QsSUFBSTtZQUNBLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNmO1FBQUMsT0FBTSxDQUFDLEVBQUU7WUFDUCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUM1QjtLQUNKO0lBRUQsZUFBZTtRQUNYLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQztRQUN6QyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7S0FDaEI7SUFFRCw2QkFBNkIsQ0FBQyxNQUFnQjtRQUMxQyxJQUFJLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQztRQUM5QixJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQztRQUM3QyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7S0FDaEI7OztBQzVERSxNQUFNLDJCQUEyQixHQUFXLGlDQUFpQyxDQUFDO0FBQzlFLE1BQU0sU0FBUyxHQUFXLHN4REFBc3hEOztNQ0UxeUQsWUFBWTtJQUdyQixZQUFvQixHQUFRO1FBQVIsUUFBRyxHQUFILEdBQUcsQ0FBSztRQUZwQixpQkFBWSxHQUFXLElBQUksTUFBTSxDQUFDLHNEQUFzRCxFQUFFLEdBQUcsQ0FBQyxDQUFDO0tBRXZFO0lBRTFCLDRCQUE0Qjs7WUFDOUIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUNDLHFCQUFZLENBQUMsQ0FBQztZQUN6RSxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUNkLE9BQU87YUFDVjtZQUNELE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUM7WUFDckMsTUFBTSxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFekIsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFdkQsTUFBTSxFQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUMsR0FBRyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDaEYsSUFBSSxTQUFTLEVBQUU7Z0JBQ1gsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO2dCQUN0RCxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDdkM7U0FDSjtLQUFBO0lBRUQsOEJBQThCLENBQUMsT0FBZSxFQUFFLEtBQWE7UUFDekQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFeEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDaEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDWCxPQUFPLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRyxDQUFDLEVBQUUsRUFBRSxNQUFNLEdBQUMsQ0FBQztZQUFDLENBQUM7UUFDL0QsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUVaLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssR0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFFdkQsT0FBTyxFQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBQyxDQUFDO0tBQzVCO0lBRUQsZ0NBQWdDLENBQUMsT0FBZTtRQUM1QyxJQUFJLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxLQUFLLENBQUM7UUFDVixPQUFNLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksRUFBRTtZQUNyRCxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzlCO1FBQ0QsSUFBSSxjQUFjLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUM3QixPQUFPLEVBQUUsQ0FBQztTQUNiO1FBRUQsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO1lBQ3ZCLE9BQU8sTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1NBQ2xFLENBQUMsQ0FBQztRQUNILE1BQU0sU0FBUyxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV2QyxjQUFjLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3BDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQztTQUM3QixDQUFDLENBQUM7UUFFSCxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDckIsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLEtBQUssSUFBSSxLQUFLLElBQUksY0FBYyxFQUFFO1lBQzlCLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDO1lBQ3pDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLDhCQUE4QixDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBRXBFLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDTixjQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNsRSxZQUFZLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQzs7WUFHaEMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUNqQixNQUFNO2FBQ1Q7U0FDSjtRQUVELE9BQU8sRUFBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUMsQ0FBQztLQUN2RDtJQUVELG1CQUFtQixDQUFDLFNBQTJCO1FBQzNDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDTSxxQkFBWSxDQUFDLENBQUM7UUFDekUsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNkLE9BQU87U0FDVjtRQUVELE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUM7UUFDbEMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRWYsSUFBSSxVQUFVLEdBQThCLEVBQUUsQ0FBQztRQUMvQyxLQUFLLElBQUksR0FBRyxJQUFJLFNBQVMsRUFBRTtZQUN2QixVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUMsSUFBSSxFQUFFLEdBQUcsRUFBQyxDQUFDLENBQUM7U0FDaEM7UUFFRCxJQUFJLFdBQVcsR0FBc0I7WUFDakMsVUFBVSxFQUFFLFVBQVU7U0FDekIsQ0FBQztRQUNGLE1BQU0sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7S0FDbkM7OztBQ2pFTCxTQUFTLGNBQWMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFO0FBQ3BDO0FBQ0EsSUFBSSxJQUFJLE1BQU0sQ0FBQyxjQUFjLEVBQUU7QUFDL0IsUUFBUSxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUMxQyxLQUFLO0FBQ0wsU0FBUztBQUNULFFBQVEsR0FBRyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7QUFDOUIsS0FBSztBQUNMLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsTUFBTSxDQUFDLE9BQU8sRUFBRTtBQUN6QixJQUFJLElBQUksR0FBRyxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ2pDLElBQUksY0FBYyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDMUMsSUFBSSxPQUFPLEdBQUcsQ0FBQztBQUNmLENBQUM7QUFDRCxNQUFNLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRTtBQUNsRCxJQUFJLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRTtBQUNuRCxDQUFDLENBQUMsQ0FBQztBQUNIO0FBQ0E7QUFDQTtBQUNBLFNBQVMsUUFBUSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFO0FBQ3RDLElBQUksSUFBSSxVQUFVLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BELElBQUksSUFBSSxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztBQUNuQyxJQUFJLElBQUksS0FBSyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztBQUNsRCxJQUFJLE9BQU87QUFDWCxRQUFRLFdBQVc7QUFDbkIsWUFBWSxNQUFNO0FBQ2xCLFlBQVksT0FBTztBQUNuQixZQUFZLEtBQUs7QUFDakIsWUFBWSxPQUFPO0FBQ25CLFlBQVksSUFBSTtBQUNoQixZQUFZLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztBQUN2QyxZQUFZLElBQUk7QUFDaEIsWUFBWSxJQUFJO0FBQ2hCLFlBQVksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDbEMsWUFBWSxHQUFHLENBQUM7QUFDaEIsSUFBSSxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFdBQVcsR0FBRyxJQUFJLFFBQVEsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQztBQUN4RDtBQUNBO0FBQ0E7QUFDQSxTQUFTLDJCQUEyQixHQUFHO0FBQ3ZDLElBQUksSUFBSTtBQUNSLFFBQVEsT0FBTyxJQUFJLFFBQVEsQ0FBQyx5Q0FBeUMsQ0FBQyxFQUFFLENBQUM7QUFDekUsS0FBSztBQUNMLElBQUksT0FBTyxDQUFDLEVBQUU7QUFDZCxRQUFRLElBQUksQ0FBQyxZQUFZLFdBQVcsRUFBRTtBQUN0QyxZQUFZLE1BQU0sTUFBTSxDQUFDLDhDQUE4QyxDQUFDLENBQUM7QUFDekUsU0FBUztBQUNULGFBQWE7QUFDYixZQUFZLE1BQU0sQ0FBQyxDQUFDO0FBQ3BCLFNBQVM7QUFDVCxLQUFLO0FBQ0wsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxRQUFRLENBQUMsR0FBRyxFQUFFO0FBQ3ZCO0FBQ0EsSUFBSSxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRTtBQUNyQyxRQUFRLE9BQU8sR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQzlCLEtBQUs7QUFDTCxTQUFTO0FBQ1QsUUFBUSxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZDLEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLFNBQVMsQ0FBQyxHQUFHLEVBQUU7QUFDeEI7QUFDQSxJQUFJLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFO0FBQ3RDLFFBQVEsT0FBTyxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDL0IsS0FBSztBQUNMLFNBQVM7QUFDVCxRQUFRLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDdkMsS0FBSztBQUNMLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxTQUFTLFVBQVUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFO0FBQy9CLElBQUksT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzNELENBQUM7QUFDRCxTQUFTLFNBQVMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFO0FBQ25DLElBQUksS0FBSyxJQUFJLEdBQUcsSUFBSSxPQUFPLEVBQUU7QUFDN0IsUUFBUSxJQUFJLFVBQVUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLEVBQUU7QUFDdEMsWUFBWSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RDLFNBQVM7QUFDVCxLQUFLO0FBQ0wsSUFBSSxPQUFPLEtBQUssQ0FBQztBQUNqQixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsU0FBUyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFO0FBQzlDLElBQUksSUFBSSxRQUFRLENBQUM7QUFDakIsSUFBSSxJQUFJLFNBQVMsQ0FBQztBQUNsQixJQUFJLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUU7QUFDeEM7QUFDQTtBQUNBLFFBQVEsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEMsUUFBUSxTQUFTLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QyxLQUFLO0FBQ0wsU0FBUztBQUNULFFBQVEsUUFBUSxHQUFHLFNBQVMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO0FBQy9DLEtBQUs7QUFDTCxJQUFJLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxLQUFLLEVBQUU7QUFDcEMsUUFBUSxRQUFRLEdBQUcsTUFBTSxDQUFDO0FBQzFCLEtBQUs7QUFDTCxJQUFJLElBQUksT0FBTyxJQUFJLE9BQU8sS0FBSyxLQUFLLEVBQUU7QUFDdEMsUUFBUSxTQUFTLEdBQUcsT0FBTyxDQUFDO0FBQzVCLEtBQUs7QUFDTCxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxRQUFRLEVBQUU7QUFDakMsUUFBUSxPQUFPLEdBQUcsQ0FBQztBQUNuQixLQUFLO0FBQ0wsSUFBSSxJQUFJLFFBQVEsS0FBSyxPQUFPLElBQUksU0FBUyxLQUFLLE9BQU8sRUFBRTtBQUN2RCxRQUFRLE9BQU8sR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQzFCLEtBQUs7QUFDTCxJQUFJLElBQUksUUFBUSxLQUFLLEdBQUcsSUFBSSxRQUFRLEtBQUssT0FBTyxFQUFFO0FBQ2xEO0FBQ0E7QUFDQSxRQUFRLEdBQUcsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDNUIsS0FBSztBQUNMLFNBQVMsSUFBSSxRQUFRLEtBQUssR0FBRyxJQUFJLFFBQVEsS0FBSyxJQUFJLEVBQUU7QUFDcEQ7QUFDQSxRQUFRLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ2pELEtBQUs7QUFDTCxJQUFJLElBQUksU0FBUyxLQUFLLEdBQUcsSUFBSSxTQUFTLEtBQUssT0FBTyxFQUFFO0FBQ3BEO0FBQ0EsUUFBUSxHQUFHLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEtBQUs7QUFDTCxTQUFTLElBQUksU0FBUyxLQUFLLEdBQUcsSUFBSSxTQUFTLEtBQUssSUFBSSxFQUFFO0FBQ3REO0FBQ0EsUUFBUSxHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNqRCxLQUFLO0FBQ0wsSUFBSSxPQUFPLEdBQUcsQ0FBQztBQUNmLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxJQUFJLE1BQU0sR0FBRztBQUNiLElBQUksR0FBRyxFQUFFLE9BQU87QUFDaEIsSUFBSSxHQUFHLEVBQUUsTUFBTTtBQUNmLElBQUksR0FBRyxFQUFFLE1BQU07QUFDZixJQUFJLEdBQUcsRUFBRSxRQUFRO0FBQ2pCLElBQUksR0FBRyxFQUFFLE9BQU87QUFDaEIsQ0FBQyxDQUFDO0FBQ0YsU0FBUyxXQUFXLENBQUMsQ0FBQyxFQUFFO0FBQ3hCLElBQUksT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckIsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsU0FBUyxDQUFDLEdBQUcsRUFBRTtBQUN4QjtBQUNBO0FBQ0EsSUFBSSxJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDN0IsSUFBSSxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7QUFDaEMsUUFBUSxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQ3ZELEtBQUs7QUFDTCxTQUFTO0FBQ1QsUUFBUSxPQUFPLE1BQU0sQ0FBQztBQUN0QixLQUFLO0FBQ0wsQ0FBQztBQUNEO0FBQ0E7QUFDQSxJQUFJLGNBQWMsR0FBRyxvRUFBb0UsQ0FBQztBQUMxRixJQUFJLGNBQWMsR0FBRyxtQ0FBbUMsQ0FBQztBQUN6RCxJQUFJLGNBQWMsR0FBRyxtQ0FBbUMsQ0FBQztBQUN6RDtBQUNBLFNBQVMsWUFBWSxDQUFDLE1BQU0sRUFBRTtBQUM5QjtBQUNBLElBQUksT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzNELENBQUM7QUFDRCxTQUFTLEtBQUssQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFO0FBQzVCLElBQUksSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ3BCLElBQUksSUFBSSxpQkFBaUIsR0FBRyxLQUFLLENBQUM7QUFDbEMsSUFBSSxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7QUFDdEIsSUFBSSxJQUFJLFlBQVksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO0FBQ3BDLElBQUksSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFO0FBQ3hCLFFBQVEsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3hELFlBQVksSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQyxZQUFZLElBQUksTUFBTSxDQUFDLGVBQWUsRUFBRTtBQUN4QyxnQkFBZ0IsR0FBRyxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzFELGFBQWE7QUFDYixTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLE1BQU0sQ0FBQyxZQUFZLEVBQUU7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsR0FBRyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDdkUsS0FBSztBQUNMO0FBQ0EsSUFBSSxjQUFjLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztBQUNqQyxJQUFJLGNBQWMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0FBQ2pDLElBQUksY0FBYyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7QUFDakMsSUFBSSxTQUFTLFVBQVUsQ0FBQyxLQUFLLEVBQUUsdUJBQXVCLEVBQUU7QUFDeEQsUUFBUSxJQUFJLEtBQUssRUFBRTtBQUNuQjtBQUNBLFlBQVksS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLGlCQUFpQjtBQUMzRCxZQUFZLHVCQUF1QixDQUFDLENBQUM7QUFDckMsWUFBWSxJQUFJLEtBQUssRUFBRTtBQUN2QjtBQUNBO0FBQ0EsZ0JBQWdCLEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3JGLGdCQUFnQixNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ25DLGFBQWE7QUFDYixTQUFTO0FBQ1QsS0FBSztBQUNMLElBQUksSUFBSSxRQUFRLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLFdBQVcsRUFBRSxNQUFNLEVBQUU7QUFDekgsUUFBUSxJQUFJLFdBQVcsSUFBSSxNQUFNLEVBQUU7QUFDbkMsWUFBWSxPQUFPLFdBQVcsR0FBRyxHQUFHLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzVELFNBQVM7QUFDVCxhQUFhLElBQUksTUFBTSxFQUFFO0FBQ3pCO0FBQ0EsWUFBWSxPQUFPLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN4QyxTQUFTO0FBQ1QsYUFBYTtBQUNiO0FBQ0EsWUFBWSxPQUFPLFdBQVcsQ0FBQztBQUMvQixTQUFTO0FBQ1QsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ1gsSUFBSSxJQUFJLFlBQVksR0FBRyxJQUFJLE1BQU0sQ0FBQyxTQUFTLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxhQUFhLEdBQUcsUUFBUSxHQUFHLG9CQUFvQixHQUFHLFFBQVEsR0FBRyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDckosSUFBSSxJQUFJLGFBQWEsR0FBRyxJQUFJLE1BQU0sQ0FBQywyQkFBMkIsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUMxRztBQUNBLElBQUksSUFBSSxDQUFDLENBQUM7QUFDVixJQUFJLFFBQVEsQ0FBQyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUc7QUFDekMsUUFBUSxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQzFDLFFBQVEsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25DLFFBQVEsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFCLFFBQVEsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNoQyxRQUFRLFVBQVUsQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDNUMsUUFBUSxhQUFhLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztBQUM1QyxRQUFRLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDO0FBQzlCLFFBQVEsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDO0FBQy9CLFFBQVEsUUFBUSxRQUFRLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRztBQUNyRCxZQUFZLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQzdCLGdCQUFnQixJQUFJLE9BQU8sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDbkUsZ0JBQWdCLFlBQVksQ0FBQyxTQUFTLEdBQUcsU0FBUyxHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUM7QUFDN0UsZ0JBQWdCLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoRCxnQkFBZ0IsSUFBSSxXQUFXLEdBQUcsTUFBTSxLQUFLLFlBQVksQ0FBQyxJQUFJO0FBQzlELHNCQUFzQixHQUFHO0FBQ3pCLHNCQUFzQixNQUFNLEtBQUssWUFBWSxDQUFDLEdBQUc7QUFDakQsMEJBQTBCLEdBQUc7QUFDN0IsMEJBQTBCLE1BQU0sS0FBSyxZQUFZLENBQUMsV0FBVztBQUM3RCw4QkFBOEIsR0FBRztBQUNqQyw4QkFBOEIsRUFBRSxDQUFDO0FBQ2pDLGdCQUFnQixVQUFVLEdBQUcsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUM5RCxnQkFBZ0IsTUFBTTtBQUN0QixhQUFhO0FBQ2IsaUJBQWlCO0FBQ2pCLGdCQUFnQixJQUFJLElBQUksR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkMsZ0JBQWdCLElBQUksSUFBSSxLQUFLLElBQUksRUFBRTtBQUNuQyxvQkFBb0IsSUFBSSxlQUFlLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ3JGLG9CQUFvQixJQUFJLGVBQWUsS0FBSyxDQUFDLENBQUMsRUFBRTtBQUNoRCx3QkFBd0IsUUFBUSxDQUFDLGtCQUFrQixFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDMUUscUJBQXFCO0FBQ3JCLG9CQUFvQixhQUFhLENBQUMsU0FBUyxHQUFHLGVBQWUsQ0FBQztBQUM5RCxpQkFBaUI7QUFDakIscUJBQXFCLElBQUksSUFBSSxLQUFLLEdBQUcsRUFBRTtBQUN2QyxvQkFBb0IsY0FBYyxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDO0FBQzlELG9CQUFvQixJQUFJLGdCQUFnQixHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEUsb0JBQW9CLElBQUksZ0JBQWdCLEVBQUU7QUFDMUMsd0JBQXdCLGFBQWEsQ0FBQyxTQUFTLEdBQUcsY0FBYyxDQUFDLFNBQVMsQ0FBQztBQUMzRSxxQkFBcUI7QUFDckIseUJBQXlCO0FBQ3pCLHdCQUF3QixRQUFRLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN6RSxxQkFBcUI7QUFDckIsaUJBQWlCO0FBQ2pCLHFCQUFxQixJQUFJLElBQUksS0FBSyxHQUFHLEVBQUU7QUFDdkMsb0JBQW9CLGNBQWMsQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztBQUM5RCxvQkFBb0IsSUFBSSxnQkFBZ0IsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BFLG9CQUFvQixJQUFJLGdCQUFnQixFQUFFO0FBQzFDLHdCQUF3QixhQUFhLENBQUMsU0FBUyxHQUFHLGNBQWMsQ0FBQyxTQUFTLENBQUM7QUFDM0UscUJBQXFCO0FBQ3JCLHlCQUF5QjtBQUN6Qix3QkFBd0IsUUFBUSxDQUFDLGlCQUFpQixFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDekUscUJBQXFCO0FBQ3JCLGlCQUFpQjtBQUNqQixxQkFBcUIsSUFBSSxJQUFJLEtBQUssR0FBRyxFQUFFO0FBQ3ZDLG9CQUFvQixjQUFjLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7QUFDOUQsb0JBQW9CLElBQUksZ0JBQWdCLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwRSxvQkFBb0IsSUFBSSxnQkFBZ0IsRUFBRTtBQUMxQyx3QkFBd0IsYUFBYSxDQUFDLFNBQVMsR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDO0FBQzNFLHFCQUFxQjtBQUNyQix5QkFBeUI7QUFDekIsd0JBQXdCLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3pFLHFCQUFxQjtBQUNyQixpQkFBaUI7QUFDakIsYUFBYTtBQUNiLFNBQVM7QUFDVCxRQUFRLElBQUksVUFBVSxFQUFFO0FBQ3hCLFlBQVksTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNwQyxTQUFTO0FBQ1QsYUFBYTtBQUNiLFlBQVksUUFBUSxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDNUUsU0FBUztBQUNULEtBQUs7QUFDTCxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDeEQsSUFBSSxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUU7QUFDeEIsUUFBUSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDeEQsWUFBWSxJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNDLFlBQVksSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFO0FBQ25DLGdCQUFnQixNQUFNLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDM0QsYUFBYTtBQUNiLFNBQVM7QUFDVCxLQUFLO0FBQ0wsSUFBSSxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxlQUFlLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRTtBQUN0QyxJQUFJLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDcEMsSUFBSSxJQUFJLEdBQUcsR0FBRyxvQkFBb0I7QUFDbEMsU0FBUyxNQUFNLENBQUMsT0FBTyxHQUFHLDRCQUE0QixHQUFHLEVBQUUsQ0FBQztBQUM1RCxTQUFTLE1BQU0sQ0FBQyxXQUFXLEdBQUcsb0NBQW9DLEdBQUcsRUFBRSxDQUFDO0FBQ3hFLFFBQVEsd0NBQXdDO0FBQ2hELFNBQVMsTUFBTSxDQUFDLFdBQVcsR0FBRyxvQkFBb0IsR0FBRyxFQUFFLENBQUM7QUFDeEQsU0FBUyxNQUFNLENBQUMsT0FBTyxHQUFHLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxHQUFHLFFBQVEsR0FBRyxFQUFFLENBQUM7QUFDbkUsUUFBUSxZQUFZLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQztBQUNwQyxTQUFTLE1BQU0sQ0FBQyxXQUFXO0FBQzNCLGNBQWMsWUFBWTtBQUMxQixpQkFBaUIsTUFBTSxDQUFDLEtBQUssR0FBRyxRQUFRLEdBQUcsRUFBRSxDQUFDO0FBQzlDLGlCQUFpQixnQ0FBZ0MsR0FBRyxNQUFNLENBQUMsT0FBTyxHQUFHLHFCQUFxQixDQUFDO0FBQzNGLGNBQWMsTUFBTSxDQUFDLE9BQU87QUFDNUIsa0JBQWtCLFlBQVk7QUFDOUIscUJBQXFCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsUUFBUSxHQUFHLEVBQUUsQ0FBQztBQUNsRCxxQkFBcUIsNEJBQTRCLEdBQUcsTUFBTSxDQUFDLE9BQU8sR0FBRyxxQkFBcUIsQ0FBQztBQUMzRixrQkFBa0IsRUFBRSxDQUFDO0FBQ3JCLFFBQVEsK0JBQStCO0FBQ3ZDLFNBQVMsTUFBTSxDQUFDLE9BQU8sR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDcEMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUU7QUFDeEIsUUFBUSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDeEQsWUFBWSxJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNDLFlBQVksSUFBSSxNQUFNLENBQUMsZUFBZSxFQUFFO0FBQ3hDLGdCQUFnQixHQUFHLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDMUQsYUFBYTtBQUNiLFNBQVM7QUFDVCxLQUFLO0FBQ0wsSUFBSSxPQUFPLEdBQUcsQ0FBQztBQUNmLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLFlBQVksQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFO0FBQ3BDLElBQUksSUFBSSxDQUFDLENBQUM7QUFDVixJQUFJLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7QUFDakMsSUFBSSxJQUFJLFNBQVMsR0FBRyxFQUFFLENBQUM7QUFDdkIsSUFBSSxJQUFJLGVBQWUsR0FBRyxZQUFZLENBQUM7QUFDdkMsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNyQyxRQUFRLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQyxRQUFRLElBQUksT0FBTyxZQUFZLEtBQUssUUFBUSxFQUFFO0FBQzlDLFlBQVksSUFBSSxHQUFHLEdBQUcsWUFBWSxDQUFDO0FBQ25DO0FBQ0EsWUFBWSxTQUFTLElBQUksT0FBTyxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUM7QUFDL0MsU0FBUztBQUNULGFBQWE7QUFDYixZQUFZLElBQUksSUFBSSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUM7QUFDdEMsWUFBWSxJQUFJLE9BQU8sR0FBRyxZQUFZLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQztBQUNqRCxZQUFZLElBQUksSUFBSSxLQUFLLEdBQUcsRUFBRTtBQUM5QjtBQUNBLGdCQUFnQixJQUFJLE1BQU0sQ0FBQyxXQUFXLEVBQUU7QUFDeEMsb0JBQW9CLFNBQVMsSUFBSSxZQUFZLEdBQUcsT0FBTyxHQUFHLE1BQU0sQ0FBQztBQUNqRSxvQkFBb0IsU0FBUyxJQUFJLE9BQU8sR0FBRyxlQUFlLEdBQUcsS0FBSyxDQUFDO0FBQ25FLGlCQUFpQjtBQUNqQixxQkFBcUI7QUFDckIsb0JBQW9CLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRTtBQUN2Qyx3QkFBd0IsT0FBTyxHQUFHLFdBQVcsR0FBRyxPQUFPLEdBQUcsR0FBRyxDQUFDO0FBQzlELHFCQUFxQjtBQUNyQixvQkFBb0IsU0FBUyxJQUFJLE1BQU0sR0FBRyxPQUFPLEdBQUcsSUFBSSxDQUFDO0FBQ3pELGlCQUFpQjtBQUNqQixhQUFhO0FBQ2IsaUJBQWlCLElBQUksSUFBSSxLQUFLLEdBQUcsRUFBRTtBQUNuQztBQUNBLGdCQUFnQixJQUFJLE1BQU0sQ0FBQyxXQUFXLEVBQUU7QUFDeEMsb0JBQW9CLFNBQVMsSUFBSSxZQUFZLEdBQUcsT0FBTyxHQUFHLE1BQU0sQ0FBQztBQUNqRSxvQkFBb0IsU0FBUyxJQUFJLE9BQU8sR0FBRyxlQUFlLEdBQUcsS0FBSyxDQUFDO0FBQ25FLGlCQUFpQjtBQUNqQixxQkFBcUI7QUFDckIsb0JBQW9CLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRTtBQUN2Qyx3QkFBd0IsT0FBTyxHQUFHLFdBQVcsR0FBRyxPQUFPLEdBQUcsR0FBRyxDQUFDO0FBQzlELHFCQUFxQjtBQUNyQixvQkFBb0IsU0FBUyxJQUFJLE1BQU0sR0FBRyxPQUFPLEdBQUcsSUFBSSxDQUFDO0FBQ3pELG9CQUFvQixJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUU7QUFDM0Msd0JBQXdCLE9BQU8sR0FBRyxNQUFNLEdBQUcsT0FBTyxHQUFHLEdBQUcsQ0FBQztBQUN6RCxxQkFBcUI7QUFDckIsb0JBQW9CLFNBQVMsSUFBSSxNQUFNLEdBQUcsT0FBTyxHQUFHLElBQUksQ0FBQztBQUN6RCxpQkFBaUI7QUFDakIsYUFBYTtBQUNiLGlCQUFpQixJQUFJLElBQUksS0FBSyxHQUFHLEVBQUU7QUFDbkM7QUFDQSxnQkFBZ0IsU0FBUyxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUM7QUFDNUMsYUFBYTtBQUNiLFNBQVM7QUFDVCxLQUFLO0FBQ0wsSUFBSSxJQUFJLE1BQU0sQ0FBQyxXQUFXLEVBQUU7QUFDNUIsUUFBUSxTQUFTLElBQUksMERBQTBELEdBQUcsZUFBZSxHQUFHLDRCQUE0QixDQUFDO0FBQ2pJLEtBQUs7QUFDTCxJQUFJLE9BQU8sU0FBUyxDQUFDO0FBQ3JCLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksTUFBTSxrQkFBa0IsWUFBWTtBQUN4QyxJQUFJLFNBQVMsTUFBTSxDQUFDLEtBQUssRUFBRTtBQUMzQixRQUFRLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQzNCLEtBQUs7QUFDTCxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFVBQVUsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUNsRCxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzlCLEtBQUssQ0FBQztBQUNOLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsVUFBVSxHQUFHLEVBQUU7QUFDMUM7QUFDQTtBQUNBO0FBQ0EsUUFBUSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDL0IsS0FBSyxDQUFDO0FBQ04sSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxVQUFVLEdBQUcsRUFBRTtBQUM3QyxRQUFRLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMvQixLQUFLLENBQUM7QUFDTixJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLFlBQVk7QUFDekMsUUFBUSxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztBQUN4QixLQUFLLENBQUM7QUFDTixJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLFVBQVUsUUFBUSxFQUFFO0FBQ2hELFFBQVEsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDeEMsS0FBSyxDQUFDO0FBQ04sSUFBSSxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFNBQVMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsYUFBYSxDQUFDLGtCQUFrQixFQUFFLElBQUksRUFBRTtBQUNqRCxJQUFJLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFDMUQsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO0FBQ25CLFFBQVEsTUFBTSxNQUFNLENBQUMsNEJBQTRCLEdBQUcsa0JBQWtCLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDOUUsS0FBSztBQUNMLElBQUksT0FBTyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ2hDLENBQUM7QUFDRDtBQUNBLElBQUksTUFBTSxHQUFHO0FBQ2IsSUFBSSxLQUFLLEVBQUUsS0FBSztBQUNoQixJQUFJLFVBQVUsRUFBRSxJQUFJO0FBQ3BCLElBQUksUUFBUSxFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQztBQUMzQixJQUFJLEtBQUssRUFBRSxLQUFLO0FBQ2hCLElBQUksQ0FBQyxFQUFFLFNBQVM7QUFDaEIsSUFBSSxPQUFPLEVBQUUsYUFBYTtBQUMxQixJQUFJLEtBQUssRUFBRTtBQUNYLFFBQVEsSUFBSSxFQUFFLEVBQUU7QUFDaEIsUUFBUSxXQUFXLEVBQUUsR0FBRztBQUN4QixRQUFRLEdBQUcsRUFBRSxHQUFHO0FBQ2hCLEtBQUs7QUFDTCxJQUFJLE9BQU8sRUFBRSxFQUFFO0FBQ2YsSUFBSSxZQUFZLEVBQUUsS0FBSztBQUN2QixJQUFJLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUM7QUFDdEIsSUFBSSxTQUFTLEVBQUUsU0FBUztBQUN4QixJQUFJLE9BQU8sRUFBRSxLQUFLO0FBQ2xCLElBQUksT0FBTyxFQUFFLElBQUk7QUFDakIsQ0FBQyxDQUFDO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxTQUFTLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRTtBQUN6QztBQUNBLElBQUksSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ2pCLElBQUksU0FBUyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUMzQixJQUFJLElBQUksVUFBVSxFQUFFO0FBQ3BCLFFBQVEsU0FBUyxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUNuQyxLQUFLO0FBQ0wsSUFBSSxJQUFJLFFBQVEsRUFBRTtBQUNsQixRQUFRLFNBQVMsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDakMsS0FBSztBQUNMLElBQUksT0FBTyxHQUFHLENBQUM7QUFDZixDQUFDO0FBS0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsT0FBTyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUU7QUFDOUIsSUFBSSxJQUFJLE9BQU8sR0FBRyxTQUFTLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzFDO0FBQ0E7QUFDQSxJQUFJLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxLQUFLLEdBQUcsMkJBQTJCLEVBQUUsR0FBRyxRQUFRLENBQUM7QUFDeEU7QUFDQSxJQUFJLElBQUk7QUFDUixRQUFRLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxHQUFHO0FBQzVDLFFBQVEsSUFBSTtBQUNaLFFBQVEsZUFBZSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLEtBQUs7QUFDTCxJQUFJLE9BQU8sQ0FBQyxFQUFFO0FBQ2QsUUFBUSxJQUFJLENBQUMsWUFBWSxXQUFXLEVBQUU7QUFDdEMsWUFBWSxNQUFNLE1BQU0sQ0FBQyx5QkFBeUI7QUFDbEQsZ0JBQWdCLENBQUMsQ0FBQyxPQUFPO0FBQ3pCLGdCQUFnQixJQUFJO0FBQ3BCLGdCQUFnQixLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztBQUNyRCxnQkFBZ0IsSUFBSTtBQUNwQixnQkFBZ0IsZUFBZSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUM7QUFDN0MsZ0JBQWdCLElBQUk7QUFDcEIsYUFBYSxDQUFDO0FBQ2QsU0FBUztBQUNULGFBQWE7QUFDYixZQUFZLE1BQU0sQ0FBQyxDQUFDO0FBQ3BCLFNBQVM7QUFDVCxLQUFLO0FBQ0wsQ0FBQztBQUNEO0FBQ0EsSUFBSSxJQUFJLEdBQUcsU0FBUyxDQUFDO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUU7QUFDekQsSUFBSSxJQUFJLFdBQVcsR0FBR0MsZUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsVUFBVSxHQUFHQSxlQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztBQUN0RixJQUFJLElBQUk7QUFDUixLQUFLLElBQUlBLGVBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDO0FBQzNDLElBQUksT0FBTyxXQUFXLENBQUM7QUFDdkIsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFO0FBQ2hDLElBQUksSUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFDO0FBQzVCLElBQUksSUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztBQUM5QixJQUFJLElBQUksYUFBYSxHQUFHLEVBQUUsQ0FBQztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztBQUNyQyxRQUFRLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtBQUNsQyxRQUFRLElBQUksRUFBRSxJQUFJO0FBQ2xCLFFBQVEsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO0FBQzFCLFFBQVEsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO0FBQzVCLEtBQUssQ0FBQyxDQUFDO0FBQ1AsSUFBSSxJQUFJLE9BQU8sQ0FBQyxLQUFLLElBQUksT0FBTyxDQUFDLGFBQWEsSUFBSSxPQUFPLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxFQUFFO0FBQ3RGO0FBQ0EsUUFBUSxPQUFPLE9BQU8sQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDbEQsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLGlCQUFpQixDQUFDLFlBQVksRUFBRTtBQUM3QyxRQUFRLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxFQUFFO0FBQ25ELFlBQVksYUFBYSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUM3QyxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxTQUFTLFdBQVcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFO0FBQ3RDLFFBQVEsSUFBSSxRQUFRLENBQUM7QUFDckI7QUFDQTtBQUNBLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztBQUNoQyxZQUFZLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUU7QUFDcEMsZ0JBQWdCLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzNELGdCQUFnQixpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUM1QyxnQkFBZ0IsT0FBT0MsYUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzVDLGFBQWEsQ0FBQyxFQUFFO0FBQ2hCO0FBQ0E7QUFDQSxZQUFZLE9BQU8sUUFBUSxDQUFDO0FBQzVCLFNBQVM7QUFDVCxhQUFhLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO0FBQzVDO0FBQ0EsWUFBWSxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMzRCxZQUFZLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3hDLFlBQVksSUFBSUEsYUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFO0FBQ3RDLGdCQUFnQixPQUFPLFFBQVEsQ0FBQztBQUNoQyxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0EsUUFBUSxPQUFPLEtBQUssQ0FBQztBQUNyQixLQUFLO0FBQ0w7QUFDQSxJQUFJLElBQUksS0FBSyxHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMvQztBQUNBLElBQUksSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRTtBQUMvQjtBQUNBO0FBQ0EsUUFBUSxJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNyRDtBQUNBLFFBQVEsV0FBVyxHQUFHLFdBQVcsQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUM7QUFDeEQsUUFBUSxJQUFJLENBQUMsV0FBVyxFQUFFO0FBQzFCO0FBQ0E7QUFDQSxZQUFZLElBQUksWUFBWSxHQUFHLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsSUFBSSxJQUFJLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMxRixZQUFZLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQzVDLFlBQVksV0FBVyxHQUFHLFlBQVksQ0FBQztBQUN2QyxTQUFTO0FBQ1QsS0FBSztBQUNMLFNBQVM7QUFDVDtBQUNBO0FBQ0EsUUFBUSxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUU7QUFDOUIsWUFBWSxJQUFJLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3BFLFlBQVksaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDeEMsWUFBWSxJQUFJQSxhQUFVLENBQUMsUUFBUSxDQUFDLEVBQUU7QUFDdEMsZ0JBQWdCLFdBQVcsR0FBRyxRQUFRLENBQUM7QUFDdkMsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBLFFBQVEsSUFBSSxDQUFDLFdBQVcsRUFBRTtBQUMxQixZQUFZLFdBQVcsR0FBRyxXQUFXLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ25ELFNBQVM7QUFDVCxRQUFRLElBQUksQ0FBQyxXQUFXLEVBQUU7QUFDMUIsWUFBWSxNQUFNLE1BQU0sQ0FBQywrQkFBK0IsR0FBRyxJQUFJLEdBQUcsa0JBQWtCLEdBQUcsYUFBYSxDQUFDLENBQUM7QUFDdEcsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EsSUFBSSxJQUFJLE9BQU8sQ0FBQyxLQUFLLElBQUksT0FBTyxDQUFDLGFBQWEsRUFBRTtBQUNoRCxRQUFRLE9BQU8sQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLEdBQUcsV0FBVyxDQUFDO0FBQ3pELEtBQUs7QUFDTCxJQUFJLE9BQU8sV0FBVyxDQUFDO0FBQ3ZCLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxTQUFTLFFBQVEsQ0FBQyxRQUFRLEVBQUU7QUFDNUIsSUFBSSxJQUFJO0FBQ1IsUUFBUSxPQUFPQyxlQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNuRSxLQUFLO0FBQ0wsSUFBSSxPQUFPLEVBQUUsRUFBRTtBQUNmLFFBQVEsTUFBTSxNQUFNLENBQUMsOEJBQThCLEdBQUcsUUFBUSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQ3RFLEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLFFBQVEsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRTtBQUM5QyxJQUFJLElBQUksTUFBTSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNwQyxJQUFJLElBQUksUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN0QyxJQUFJLElBQUk7QUFDUixRQUFRLElBQUksZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN6RCxRQUFRLElBQUksQ0FBQyxPQUFPLEVBQUU7QUFDdEIsWUFBWSxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLGdCQUFnQixDQUFDLENBQUM7QUFDdkUsU0FBUztBQUNULFFBQVEsT0FBTyxnQkFBZ0IsQ0FBQztBQUNoQyxLQUFLO0FBQ0wsSUFBSSxPQUFPLENBQUMsRUFBRTtBQUNkLFFBQVEsTUFBTSxNQUFNLENBQUMsZ0JBQWdCLEdBQUcsUUFBUSxHQUFHLGNBQWMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDL0UsS0FBSztBQUNMLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsYUFBYSxDQUFDLE9BQU8sRUFBRTtBQUNoQyxJQUFJLElBQUksUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7QUFDcEMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUU7QUFDdkIsUUFBUSxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNuRCxRQUFRLElBQUksSUFBSSxFQUFFO0FBQ2xCLFlBQVksT0FBTyxJQUFJLENBQUM7QUFDeEIsU0FBUztBQUNULFFBQVEsT0FBTyxRQUFRLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzNDLEtBQUs7QUFDTDtBQUNBLElBQUksT0FBTyxRQUFRLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUM3QyxDQUFDO0FBeUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxXQUFXLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRTtBQUNwQztBQUNBLElBQUksSUFBSSxjQUFjLEdBQUcsU0FBUyxDQUFDLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNsRjtBQUNBLElBQUksT0FBTyxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQztBQUMzRCxDQUFDO0FBd0REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLGlCQUFpQixDQUFDLElBQUksRUFBRSxJQUFJLEVBQUU7QUFDdkMsSUFBSSxJQUFJLGlCQUFpQixHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDcEQsSUFBSSxPQUFPLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVELENBQUM7QUFDRDtBQUNBO0FBQ0EsU0FBUyxXQUFXLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRTtBQUN4QyxJQUFJLElBQUksT0FBTyxDQUFDLEtBQUssSUFBSSxPQUFPLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUM5RSxRQUFRLE9BQU8sT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25ELEtBQUs7QUFDTCxJQUFJLElBQUksWUFBWSxHQUFHLE9BQU8sUUFBUSxLQUFLLFVBQVUsR0FBRyxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUM5RjtBQUNBO0FBQ0EsSUFBSSxJQUFJLE9BQU8sQ0FBQyxLQUFLLElBQUksT0FBTyxDQUFDLElBQUksRUFBRTtBQUN2QyxRQUFRLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFDN0QsS0FBSztBQUNMLElBQUksT0FBTyxZQUFZLENBQUM7QUFDeEIsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRTtBQUM1QyxJQUFJLElBQUksT0FBTyxHQUFHLFNBQVMsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUM7QUFDMUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUU7QUFDdkIsUUFBUSxJQUFJLEVBQUUsRUFBRTtBQUNoQjtBQUNBLFlBQVksSUFBSTtBQUNoQjtBQUNBO0FBQ0EsZ0JBQWdCLElBQUksVUFBVSxHQUFHLFdBQVcsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDaEUsZ0JBQWdCLFVBQVUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzlDLGFBQWE7QUFDYixZQUFZLE9BQU8sR0FBRyxFQUFFO0FBQ3hCLGdCQUFnQixPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMvQixhQUFhO0FBQ2IsU0FBUztBQUNULGFBQWE7QUFDYjtBQUNBLFlBQVksSUFBSSxPQUFPLFdBQVcsS0FBSyxVQUFVLEVBQUU7QUFDbkQsZ0JBQWdCLE9BQU8sSUFBSSxXQUFXLENBQUMsVUFBVSxPQUFPLEVBQUUsTUFBTSxFQUFFO0FBQ2xFLG9CQUFvQixJQUFJO0FBQ3hCLHdCQUF3QixPQUFPLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUMvRSxxQkFBcUI7QUFDckIsb0JBQW9CLE9BQU8sR0FBRyxFQUFFO0FBQ2hDLHdCQUF3QixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEMscUJBQXFCO0FBQ3JCLGlCQUFpQixDQUFDLENBQUM7QUFDbkIsYUFBYTtBQUNiLGlCQUFpQjtBQUNqQixnQkFBZ0IsTUFBTSxNQUFNLENBQUMsdUVBQXVFLENBQUMsQ0FBQztBQUN0RyxhQUFhO0FBQ2IsU0FBUztBQUNULEtBQUs7QUFDTCxTQUFTO0FBQ1QsUUFBUSxPQUFPLFdBQVcsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzdELEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsV0FBVyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRTtBQUNqRDtBQUNBLElBQUksT0FBTyxNQUFNLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNsRixDQUFDO0FBQ0Q7QUFDQTtBQUNBLE1BQU0sQ0FBQyxXQUFXLEdBQUcsaUJBQWlCLENBQUM7QUFDdkMsTUFBTSxDQUFDLGFBQWEsR0FBRyxFQUFFOztNQ3JnQ0gsY0FBYztJQU9oQyxZQUFzQixHQUFRLEVBQVksTUFBdUI7UUFBM0MsUUFBRyxHQUFILEdBQUcsQ0FBSztRQUFZLFdBQU0sR0FBTixNQUFNLENBQWlCO1FBTHZELHFCQUFnQixHQUFxQixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQy9DLHNCQUFpQixHQUFxQixJQUFJLEdBQUcsRUFBRSxDQUFDO0tBSVc7SUFFckUsT0FBTztRQUNILE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQTtLQUNuQjtJQUtLLElBQUk7O1lBQ04sTUFBTSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7U0FDbkU7S0FBQTtJQUVLLGVBQWUsQ0FBQyxNQUFxQjs7WUFDdkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7WUFDckIsTUFBTSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFFN0IsdUNBQ08sSUFBSSxDQUFDLGNBQWMsR0FDbkIsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsRUFDL0M7U0FDTDtLQUFBOzs7TUMvQlEsa0JBQW1CLFNBQVEsY0FBYztJQUF0RDs7UUFDVyxTQUFJLEdBQVcsTUFBTSxDQUFDO0tBZ0RoQztJQTlDUyxxQkFBcUI7O1lBQ3ZCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1lBQ3RELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7WUFDaEUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQztZQUM5RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO1NBQ3JFO0tBQUE7SUFFSyxlQUFlOytEQUFvQjtLQUFBO0lBRXpDLFlBQVk7UUFDUixPQUFPLENBQUMsU0FBaUIsWUFBWSxFQUFFLE1BQXNCLEVBQUUsU0FBa0IsRUFBRSxnQkFBeUI7WUFDeEcsSUFBSSxTQUFTLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUNwRSxNQUFNLElBQUksY0FBYyxDQUFDLHdGQUF3RixDQUFDLENBQUM7YUFDdEg7WUFDRCxJQUFJLFFBQVEsQ0FBQztZQUNiLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFO2dCQUM1QixRQUFRLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDN0M7aUJBQ0ksSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUU7Z0JBQ2pDLFFBQVEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7YUFDckQ7WUFFRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLGdCQUFnQixDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNsRixDQUFBO0tBQ0o7SUFFRCxpQkFBaUI7UUFDYixPQUFPLENBQUMsU0FBaUIsWUFBWTtZQUNqQyxPQUFPLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN4RCxDQUFBO0tBQ0o7SUFFRCxnQkFBZ0I7UUFDWixPQUFPLENBQUMsU0FBaUIsWUFBWSxFQUFFLE9BQWUsRUFBRSxTQUFrQixFQUFFLGdCQUF5QjtZQUNqRyxJQUFJLFNBQVMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLGdCQUFnQixDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQ3BFLE1BQU0sSUFBSSxjQUFjLENBQUMsd0ZBQXdGLENBQUMsQ0FBQzthQUN0SDtZQUNELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3JGLENBQUE7S0FDSjtJQUVELGtCQUFrQjtRQUNkLE9BQU8sQ0FBQyxTQUFpQixZQUFZO1lBQ2pDLE9BQU8sTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDekQsQ0FBQTtLQUNKOzs7QUM3Q0UsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDO01BRWpCLGtCQUFtQixTQUFRLGNBQWM7SUFBdEQ7O1FBQ1csU0FBSSxHQUFXLE1BQU0sQ0FBQztRQUNyQixrQkFBYSxHQUFXLENBQUMsQ0FBQztRQUMxQixxQkFBZ0IsR0FBVyxDQUFDLENBQUM7UUFDN0IsbUJBQWMsR0FBVyxJQUFJLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0tBNk5yRTtJQTNOUyxxQkFBcUI7O1lBQ3ZCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLENBQUM7WUFDMUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQztZQUNwRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztZQUM1RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxDQUFDO1lBQzFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO1lBQzVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUM7WUFDcEUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7WUFDNUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQztZQUM5RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDLENBQUM7WUFDcEYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7WUFDeEQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7WUFDeEQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7WUFDNUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQztTQUNyRTtLQUFBO0lBRUssZUFBZTs7WUFDakIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1lBQ3JFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1lBQ3pELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1NBQzlEO0tBQUE7SUFFSyxnQkFBZ0I7O1lBQ2xCLE9BQU8sTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUM3RDtLQUFBO0lBRUQsbUJBQW1CO1FBQ2YsT0FBTyxDQUFPLFFBQXdCLEVBQUUsUUFBaUIsRUFBRSxXQUFvQixLQUFLLEVBQUUsTUFBZ0I7WUFDbEcsSUFBSSxDQUFDLGdCQUFnQixJQUFJLENBQUMsQ0FBQztZQUMzQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxXQUFXLEVBQUU7Z0JBQ3JDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7Z0JBQzFCLE1BQU0sSUFBSSxjQUFjLENBQUMsMkNBQTJDLENBQUMsQ0FBQzthQUN6RTtZQUVELE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsNkJBQTZCLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUE7WUFFaEgsSUFBSSxDQUFDLGdCQUFnQixJQUFJLENBQUMsQ0FBQztZQUUzQixPQUFPLFFBQVEsQ0FBQztTQUNuQixDQUFBLENBQUE7S0FDSjtJQUVELHNCQUFzQjtRQUNsQixPQUFPLENBQUMsU0FBaUIsa0JBQWtCO1lBQ3ZDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzNFLENBQUE7S0FDSjtJQUVELGVBQWU7UUFDWCxPQUFPLENBQUMsS0FBYzs7WUFFbEIsT0FBTyxxQkFBcUIsS0FBSyxhQUFMLEtBQUssY0FBTCxLQUFLLEdBQUksRUFBRSxNQUFNLENBQUM7U0FDakQsQ0FBQTtLQUNKO0lBRUQsc0JBQXNCO1FBQ2xCLE9BQU8sQ0FBQyxPQUFlO1lBQ25CLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDSCxxQkFBWSxDQUFDLENBQUM7WUFDekUsSUFBSSxXQUFXLEtBQUssSUFBSSxFQUFFO2dCQUN0QixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLGNBQWMsQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JGLE9BQU87YUFDVjtZQUVELE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUM7WUFDbEMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzVCLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM5QixPQUFPLEVBQUUsQ0FBQztTQUNiLENBQUE7S0FDSjtJQUVELGVBQWU7UUFDWCxPQUFPLENBQUMsUUFBZ0I7O1lBRXBCLElBQUksS0FBSyxDQUFDO1lBQ1YsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxJQUFJLEVBQUU7Z0JBQ3ZELFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDdkI7WUFFRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdkUsT0FBTyxJQUFJLElBQUksSUFBSSxDQUFDO1NBQ3ZCLENBQUE7S0FDSjtJQUVELG1CQUFtQjtRQUNmLE9BQU8sQ0FBQyxRQUFnQjtZQUNwQixNQUFNLElBQUksR0FBR0wsc0JBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNyQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztTQUNoRSxDQUFBO0tBQ0o7SUFFRCxlQUFlO1FBQ1gsT0FBTyxDQUFDLFdBQW9CLEtBQUs7WUFDN0IsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDO1lBQzVDLElBQUksTUFBTSxDQUFDO1lBRVgsSUFBSSxRQUFRLEVBQUU7Z0JBQ1YsTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7YUFDeEI7aUJBQ0k7Z0JBQ0QsTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7YUFDeEI7WUFFRCxPQUFPLE1BQU0sQ0FBQztTQUNqQixDQUFBO0tBQ0o7SUFFRCxnQkFBZ0I7UUFDWixPQUFPLENBQU8sWUFBNEI7Ozs7WUFHdEMsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLENBQUM7WUFDeEIsSUFBSSxJQUFJLENBQUMsYUFBYSxHQUFHLFdBQVcsRUFBRTtnQkFDbEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUM7Z0JBQ3ZCLE1BQU0sSUFBSSxjQUFjLENBQUMsMENBQTBDLENBQUMsQ0FBQzthQUN4RTtZQUVELElBQUksZ0JBQXdCLENBQUM7WUFFN0IsSUFBSSxZQUFZLFlBQVlDLGNBQUssRUFBRTtnQkFDL0IsZ0JBQWdCLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7YUFDOUQ7aUJBQU07Z0JBQ0gsSUFBSSxLQUFLLENBQUM7Z0JBQ1YsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxJQUFJLEVBQUU7b0JBQzNELE1BQU0sSUFBSSxjQUFjLENBQUMsK0RBQStELENBQUMsQ0FBQztpQkFDN0Y7Z0JBQ0QsTUFBTSxFQUFDLElBQUksRUFBRSxPQUFPLEVBQUMsR0FBR1Esc0JBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFaEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUN2RSxJQUFJLENBQUMsUUFBUSxFQUFFO29CQUNYLE1BQU0sSUFBSSxjQUFjLENBQUMsUUFBUSxZQUFZLGdCQUFnQixDQUFDLENBQUM7aUJBQ2xFO2dCQUNELGdCQUFnQixHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUV2RCxJQUFJLE9BQU8sRUFBRTtvQkFDVCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQzVELElBQUksS0FBSyxFQUFFO3dCQUNQLE1BQU0sTUFBTSxHQUFHQyx1QkFBYyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQzt3QkFDOUMsSUFBSSxNQUFNLEVBQUU7NEJBQ1IsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLE1BQUEsTUFBTSxDQUFDLEdBQUcsMENBQUUsTUFBTSxDQUFDLENBQUM7eUJBQ3RGO3FCQUNKO2lCQUNKO2FBQ0o7WUFFRCxNQUFNLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUUzRixJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsQ0FBQztZQUV4QixPQUFPLGNBQWMsQ0FBQztTQUN6QixDQUFBLENBQUE7S0FDSjtJQUVELDJCQUEyQjtRQUN2QixPQUFPLENBQUMsU0FBaUIsa0JBQWtCO1lBQ3ZDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzNFLENBQUE7S0FDSjtJQUVELGFBQWE7UUFDVCxPQUFPLENBQU8sSUFBWTtZQUN0QixNQUFNLFFBQVEsR0FBR1Ysc0JBQWEsQ0FBQyxHQUFHLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1lBQy9FLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3pFLE9BQU8sRUFBRSxDQUFDO1NBQ2IsQ0FBQSxDQUFBO0tBQ0o7SUFFRCxhQUFhO1FBQ1QsT0FBTyxDQUFDLFdBQW9CLEtBQUs7O1lBRTdCLElBQUlXLGlCQUFRLENBQUMsV0FBVyxFQUFFO2dCQUN0QixPQUFPLDJCQUEyQixDQUFDO2FBQ3RDO1lBQ0QsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sWUFBWUMsMEJBQWlCLENBQUMsRUFBRTtnQkFDeEQsTUFBTSxJQUFJLGNBQWMsQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO2FBQzdFO1lBQ0QsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBRXhELElBQUksUUFBUSxFQUFFO2dCQUNWLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO2FBQ3ZDO2lCQUNJO2dCQUNELE9BQU8sR0FBRyxVQUFVLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDMUQ7U0FDSixDQUFBO0tBQ0o7SUFFRCxlQUFlO1FBQ1gsT0FBTyxDQUFPLFNBQWlCO1lBQzNCLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsRUFBRTtnQkFDOUIsTUFBTSxJQUFJLGNBQWMsQ0FBQywwREFBMEQsQ0FBQyxDQUFDO2FBQ3hGO1lBQ0QsTUFBTSxRQUFRLEdBQUdaLHNCQUFhLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLFNBQVMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1lBQzNILE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3pFLE9BQU8sRUFBRSxDQUFDO1NBQ2IsQ0FBQSxDQUFBO0tBQ0o7SUFFRCxrQkFBa0I7UUFDZCxPQUFPO1lBQ0gsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUNLLHFCQUFZLENBQUMsQ0FBQztZQUN6RSxJQUFJLFdBQVcsSUFBSSxJQUFJLEVBQUU7Z0JBQ3JCLE1BQU0sSUFBSSxjQUFjLENBQUMsNENBQTRDLENBQUMsQ0FBQzthQUMxRTtZQUVELE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUM7WUFDbEMsT0FBTyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDaEMsQ0FBQTtLQUNKOztJQUdELGFBQWE7UUFDVCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMzRSxPQUFPUSxtQkFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQzVCOztJQUdELGNBQWM7UUFDVixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQztLQUMzQzs7O01Dck9RLGlCQUFrQixTQUFRLGNBQWM7SUFBckQ7O1FBQ0ksU0FBSSxHQUFHLEtBQUssQ0FBQztLQThDaEI7SUE1Q1MscUJBQXFCOztZQUN2QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO1lBQ3RFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUMsQ0FBQzs7U0FFL0U7S0FBQTtJQUVLLGVBQWU7K0RBQUs7S0FBQTtJQUVwQixVQUFVLENBQUMsR0FBVzs7WUFDeEIsSUFBSSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2QsTUFBTSxJQUFJLGNBQWMsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO2FBQzVEO1lBQ0QsT0FBTyxRQUFRLENBQUM7U0FDbkI7S0FBQTtJQUVELG9CQUFvQjtRQUNoQixPQUFPO1lBQ0gsSUFBSSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLHlCQUF5QixDQUFDLENBQUM7WUFDaEUsSUFBSSxJQUFJLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFakMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQzVDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUMxQyxJQUFJLFdBQVcsR0FBRyxLQUFLLEtBQUsscUJBQXFCLE1BQU0sU0FBUyxDQUFDO1lBRWpFLE9BQU8sV0FBVyxDQUFDO1NBQ3RCLENBQUEsQ0FBQTtLQUNKO0lBRUQsdUJBQXVCO1FBQ25CLE9BQU8sQ0FBTyxJQUFZLEVBQUUsS0FBYztZQUN0QyxJQUFJLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsc0NBQXNDLElBQUksYUFBSixJQUFJLGNBQUosSUFBSSxHQUFJLEVBQUUsSUFBSSxLQUFLLGFBQUwsS0FBSyxjQUFMLEtBQUssR0FBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3hHLElBQUksR0FBRyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUM7WUFDdkIsT0FBTyw0QkFBNEIsR0FBRyxHQUFHLENBQUM7U0FDN0MsQ0FBQSxDQUFBO0tBQ0o7SUFFRCxvQkFBb0I7UUFDaEIsT0FBTyxDQUFPLEdBQVc7WUFDckIsSUFBSSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzFDLElBQUksSUFBSSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2pDLE9BQU8sSUFBSSxDQUFDO1NBQ2YsQ0FBQSxDQUFBO0tBQ0o7OztNQy9DUSx5QkFBMEIsU0FBUSxjQUFjO0lBQTdEOztRQUNXLFNBQUksR0FBVyxhQUFhLENBQUM7S0FRdkM7SUFOUyxxQkFBcUI7K0RBQW9CO0tBQUE7SUFFekMsZUFBZTs7WUFDakIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUE7WUFDMUUsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQSxLQUFLLGFBQUwsS0FBSyx1QkFBTCxLQUFLLENBQUUsV0FBVyxLQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDOUU7S0FBQTs7O01DUFEsV0FBWSxTQUFRQyxjQUFLO0lBTWxDLFlBQVksR0FBUSxFQUFVLFdBQW1CLEVBQVUsYUFBcUI7UUFDNUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRGUsZ0JBQVcsR0FBWCxXQUFXLENBQVE7UUFBVSxrQkFBYSxHQUFiLGFBQWEsQ0FBUTtRQUZ4RSxjQUFTLEdBQVksS0FBSyxDQUFDO0tBSWxDO0lBRUQsTUFBTTtRQUNGLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7S0FDckI7SUFFRCxPQUFPO1FBQ0gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksY0FBYyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQztTQUN2RDtLQUNKO0lBRUQsVUFBVTs7UUFDTixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3ZDLEdBQUcsQ0FBQyxRQUFRLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUVyQyxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxRQUFRLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBUTtZQUNyQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztZQUN0QixDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUNoQixDQUFBO1FBRUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQztRQUM1QixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsR0FBRyxtQkFBbUIsQ0FBQztRQUNoRCxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxNQUFBLElBQUksQ0FBQyxhQUFhLG1DQUFJLEVBQUUsQ0FBQztRQUMvQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFBO1FBQ2hELElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7S0FDMUI7SUFFSyxlQUFlLENBQUMsT0FBZ0MsRUFBRSxNQUE4Qjs7WUFDbEYsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7WUFDdkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7WUFDckIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ2Y7S0FBQTs7O01DL0NRLGNBQWtCLFNBQVFWLDBCQUFvQjtJQUt2RCxZQUFZLEdBQVEsRUFBVSxVQUE0QyxFQUFVLEtBQVUsRUFBRSxXQUFtQjtRQUMvRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFEZSxlQUFVLEdBQVYsVUFBVSxDQUFrQztRQUFVLFVBQUssR0FBTCxLQUFLLENBQUs7UUFGdEYsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUkvQixJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0tBQ3BDO0lBRUQsUUFBUTtRQUNKLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztLQUNyQjtJQUVELE9BQU87UUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksY0FBYyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQztTQUN2RDtLQUNKO0lBRUQsZ0JBQWdCLENBQUMsS0FBb0IsRUFBRSxHQUErQjtRQUNsRSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDYixJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0tBQ3ZDO0lBRUQsV0FBVyxDQUFDLElBQU87UUFDZixJQUFJLElBQUksQ0FBQyxVQUFVLFlBQVksUUFBUSxFQUFFO1lBQ3JDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNoQztRQUNELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLHFCQUFxQixDQUFDO0tBQzdFO0lBRUQsWUFBWSxDQUFDLElBQU8sRUFBRSxJQUFnQztRQUNsRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ3RCO0lBRUssZUFBZSxDQUFDLE9BQTJCLEVBQUUsTUFBOEI7O1lBQzdFLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNmO0tBQUE7OztNQ3ZDUSxvQkFBcUIsU0FBUSxjQUFjO0lBQXhEOztRQUNXLFNBQUksR0FBVyxRQUFRLENBQUM7S0FpRGxDO0lBL0NTLHFCQUFxQjs7WUFDdkIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQztZQUNsRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztZQUM1RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO1NBQ3JFO0tBQUE7SUFFSyxlQUFlOytEQUFvQjtLQUFBO0lBRXpDLGtCQUFrQjtRQUNkLE9BQU87O1lBRUgsSUFBSU8saUJBQVEsQ0FBQyxXQUFXLEVBQUU7Z0JBQ3RCLE9BQU8sMkJBQTJCLENBQUM7YUFDdEM7WUFDRCxPQUFPLE1BQU0sU0FBUyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUMvQyxDQUFBLENBQUE7S0FDSjtJQUVELGVBQWU7UUFDWCxPQUFPLENBQU8sV0FBb0IsRUFBRSxhQUFzQixFQUFFLGtCQUEyQixLQUFLO1lBQ3hGLE1BQU0sTUFBTSxHQUFHLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsV0FBVyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBQ3JFLE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsT0FBZ0MsRUFBRSxNQUE4QixLQUFLLE1BQU0sQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDM0ksSUFBSTtnQkFDQSxPQUFPLE1BQU0sT0FBTyxDQUFDO2FBQ3hCO1lBQUMsT0FBTSxLQUFLLEVBQUU7Z0JBQ1gsSUFBSSxlQUFlLEVBQUU7b0JBQ2pCLE1BQU0sS0FBSyxDQUFDO2lCQUNmO2dCQUNELE9BQU8sSUFBSSxDQUFDO2FBQ2Y7U0FDSixDQUFBLENBQUE7S0FDSjtJQUVELGtCQUFrQjtRQUNkLE9BQU8sQ0FBVSxVQUE0QyxFQUFFLEtBQVUsRUFBRSxrQkFBMkIsS0FBSyxFQUFFLGNBQXNCLEVBQUU7WUFDakksTUFBTSxTQUFTLEdBQUcsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQy9FLE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsT0FBMkIsRUFBRSxNQUE4QixLQUFLLFNBQVMsQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDekksSUFBSTtnQkFDQSxPQUFPLE1BQU0sT0FBTyxDQUFBO2FBQ3ZCO1lBQUMsT0FBTSxLQUFLLEVBQUU7Z0JBQ1gsSUFBSSxlQUFlLEVBQUU7b0JBQ2pCLE1BQU0sS0FBSyxDQUFDO2lCQUNmO2dCQUNELE9BQU8sSUFBSSxDQUFDO2FBQ2Y7U0FDSixDQUFBLENBQUE7S0FDSjs7O01DcERRLG9CQUFxQixTQUFRLGNBQWM7SUFBeEQ7O1FBQ1csU0FBSSxHQUFXLFFBQVEsQ0FBQztLQVNsQztJQVBTLHFCQUFxQjsrREFBb0I7S0FBQTtJQUV6QyxlQUFlOytEQUFvQjtLQUFBO0lBRW5DLGVBQWUsQ0FBQyxNQUFxQjs7WUFDdkMsT0FBTyxNQUFNLENBQUM7U0FDakI7S0FBQTs7O01DQ1Esc0JBQXNCO0lBRy9CLFlBQXNCLEdBQVEsRUFBWSxNQUF1QjtRQUEzQyxRQUFHLEdBQUgsR0FBRyxDQUFLO1FBQVksV0FBTSxHQUFOLE1BQU0sQ0FBaUI7UUFGekQsa0JBQWEsR0FBMEIsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUd2RCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDdkUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUN0RSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLHlCQUF5QixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDOUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksb0JBQW9CLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztLQUM1RTtJQUVLLElBQUk7O1lBQ04sS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUNsQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQzthQUNwQjtTQUNKO0tBQUE7SUFFSyxlQUFlLENBQUMsTUFBcUI7O1lBQ3ZDLE1BQU0sZUFBZSxHQUF5QixFQUFFLENBQUM7WUFFakQsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUNsQyxlQUFlLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsTUFBTSxHQUFHLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ3RFO1lBRUQsT0FBTyxlQUFlLENBQUM7U0FDMUI7S0FBQTs7O01DM0JRLGtCQUFrQjtJQU0zQixZQUFvQixHQUFRLEVBQVUsTUFBdUI7UUFBekMsUUFBRyxHQUFILEdBQUcsQ0FBSztRQUFVLFdBQU0sR0FBTixNQUFNLENBQWlCO1FBSHJELGtDQUE2QixHQUEwQixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2pFLDBCQUFxQixHQUEwQixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRzdELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztLQUNoQjtJQUVELEtBQUs7UUFDRCxJQUFJQSxpQkFBUSxDQUFDLFdBQVcsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sWUFBWUMsMEJBQWlCLENBQUMsRUFBRTtZQUNoRixJQUFJLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztTQUNqQjthQUNJO1lBQ0QsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDaEQsSUFBSSxDQUFDLFlBQVksR0FBR0csY0FBUyxDQUFDQyxrQkFBSSxDQUFDLENBQUM7U0FDdkM7S0FDSjtJQUVLLElBQUk7K0RBQW9CO0tBQUE7SUFFeEIsOEJBQThCLENBQUMsTUFBcUI7O1lBQ3RELElBQUksS0FBSyxHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUM7WUFFOUUsS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLEVBQUU7Z0JBQ3BCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxJQUFJLEVBQUU7b0JBQ3ZDLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztpQkFDdEQ7YUFDSjtTQUNKO0tBQUE7SUFFSyx5QkFBeUIsQ0FBQyxNQUFxQixFQUFFLElBQVc7O1lBQzlELElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLFlBQVlKLDBCQUFpQixDQUFDLEVBQUU7Z0JBQ3hELE1BQU0sSUFBSSxjQUFjLENBQUMsK0NBQStDLENBQUMsQ0FBQzthQUM3RTtZQUNELElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN0RCxJQUFJLFNBQVMsR0FBRyxHQUFHLFVBQVUsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7OztZQUk3QyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQ3ZELE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQzthQUNsRTtZQUVELE1BQU0sYUFBYSxHQUFHLE1BQU0sbUZBQU8sU0FBUyxNQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUU7Z0JBQ3hCLE1BQU0sSUFBSSxjQUFjLENBQUMsOEJBQThCLFNBQVMsd0JBQXdCLENBQUMsQ0FBQzthQUM3RjtZQUNELElBQUksRUFBRSxhQUFhLENBQUMsT0FBTyxZQUFZLFFBQVEsQ0FBQyxFQUFFO2dCQUM5QyxNQUFNLElBQUksY0FBYyxDQUFDLDhCQUE4QixTQUFTLHFDQUFxQyxDQUFDLENBQUM7YUFDMUc7WUFDRCxJQUFJLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM3RTtLQUFBOztJQUdLLHNDQUFzQyxDQUFDLE1BQXFCOztZQUM5RCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUVqRyxLQUFLLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFO2dCQUM5RCxJQUFJLFFBQVEsS0FBSyxFQUFFLElBQUksR0FBRyxLQUFLLEVBQUUsRUFBRTtvQkFDL0IsU0FBUztpQkFDWjtnQkFFRCxJQUFJRCxpQkFBUSxDQUFDLFdBQVcsRUFBRTtvQkFDdEIsSUFBSSxDQUFDLDZCQUE2QixDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxTQUFlO3dCQUM3RCxPQUFPLDJCQUEyQixDQUFDO3FCQUN0QyxDQUFDLENBQUE7aUJBQ0w7cUJBQ0k7b0JBQ0QsR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7b0JBRXRFLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQU8sU0FBZTt3QkFDbkUsTUFBTSxXQUFXLG1DQUNWLE9BQU8sQ0FBQyxHQUFHLEdBQ1gsU0FBUyxDQUNmLENBQUM7d0JBRUYsTUFBTSxXQUFXLG1CQUNiLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEdBQUcsSUFBSSxFQUNwRCxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFDYixHQUFHLEVBQUUsV0FBVyxLQUNaLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsS0FBSyxFQUFFLElBQUksRUFBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFDLEVBQ3pGLENBQUM7d0JBRUYsSUFBSTs0QkFDQSxNQUFNLEVBQUMsTUFBTSxFQUFDLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsQ0FBQzs0QkFDM0QsT0FBTyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7eUJBQzdCO3dCQUNELE9BQU0sS0FBSyxFQUFFOzRCQUNULE1BQU0sSUFBSSxjQUFjLENBQUMsNEJBQTRCLFFBQVEsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO3lCQUMzRTtxQkFDSixDQUFBLENBQUMsQ0FBQztpQkFDTjthQUNKO1NBQ0o7S0FBQTtJQUVLLGVBQWUsQ0FBQyxNQUFxQjs7WUFDdkMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzNDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUVuQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLHNCQUFzQixFQUFFO2dCQUM3QyxNQUFNLElBQUksQ0FBQyxzQ0FBc0MsQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUM3RDs7WUFHRCxJQUFJQSxpQkFBUSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUU7Z0JBQzdELE1BQU0sSUFBSSxDQUFDLDhCQUE4QixDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ3JEO1lBRUQsdUNBQ08sTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQUMsR0FDdEQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsRUFDbkQ7U0FDTDtLQUFBOzs7QUNwSEwsSUFBWSxXQUdYO0FBSEQsV0FBWSxXQUFXO0lBQ25CLHFEQUFRLENBQUE7SUFDUiwrREFBYSxDQUFBO0FBQ2pCLENBQUMsRUFIVyxXQUFXLEtBQVgsV0FBVyxRQUd0QjtNQUVZLGNBQWM7SUFLdkIsWUFBb0IsR0FBUSxFQUFVLE1BQXVCO1FBQXpDLFFBQUcsR0FBSCxHQUFHLENBQUs7UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUFpQjtRQUN6RCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNoRixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUMzRTtJQUVLLElBQUk7O1lBQ04sTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDekMsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDeEM7S0FBQTtJQUVLLGlCQUFpQixDQUFDLE1BQXFCLEVBQUUsWUFBeUI7O1lBQ3BFLElBQUksQ0FBQyxlQUFlLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQztTQUMzRTtLQUFBO0lBRUQsaUJBQWlCO1FBQ2IsT0FBTztZQUNILFFBQVEsRUFBRSxlQUFlO1NBQzVCLENBQUM7S0FDTDtJQUVLLGVBQWUsQ0FBQyxNQUFxQixFQUFFLGVBQTRCLFdBQVcsQ0FBQyxhQUFhOztZQUM5RixNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDbkIsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUNwRCxNQUFNLGdCQUFnQixHQUFHLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNuRixJQUFJLFlBQVksR0FBRyxFQUFFLENBQUM7WUFFdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7O2dCQUV2QixJQUFJLENBQUMsZUFBZSxHQUFHLGdCQUFnQixDQUFDO2FBQzNDO1lBRUQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztZQUMzQyxRQUFRLFlBQVk7Z0JBQ2hCLEtBQUssV0FBVyxDQUFDLFFBQVE7b0JBQ3JCLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLGdCQUFnQixDQUFDLENBQUM7b0JBQ3pDLE1BQU07Z0JBQ1YsS0FBSyxXQUFXLENBQUMsYUFBYTtvQkFDMUIsWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDckUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLGtDQUNkLGdCQUFnQixLQUNuQixJQUFJLEVBQUUsWUFBWSxJQUNwQixDQUFDO29CQUNILE1BQU07YUFDYjtZQUVELE9BQU8sT0FBTyxDQUFDO1NBQ2xCO0tBQUE7SUFFSyxjQUFjLENBQUMsT0FBZSxFQUFFLE9BQWE7O1lBQy9DLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ1YsT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7YUFDbEM7WUFFRCxPQUFPLElBQUcsTUFBTU0sV0FBZSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUU7Z0JBQzlDLE9BQU8sRUFBRSxJQUFJO2dCQUNiLEtBQUssRUFBRTtvQkFDSCxJQUFJLEVBQUUsR0FBRztvQkFDVCxXQUFXLEVBQUUsR0FBRztvQkFDaEIsR0FBRyxFQUFFLEVBQUU7aUJBQ1Y7Z0JBQ0QsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsV0FBVyxFQUFFLElBQUk7YUFDcEIsQ0FBVyxDQUFBLENBQUM7WUFFYixPQUFPLE9BQU8sQ0FBQztTQUNsQjtLQUFBOzs7QUM5RUwsSUFBWSxPQU1YO0FBTkQsV0FBWSxPQUFPO0lBQ2YsdUVBQXFCLENBQUE7SUFDckIsNkRBQWdCLENBQUE7SUFDaEIsdURBQWEsQ0FBQTtJQUNiLG1FQUFtQixDQUFBO0lBQ25CLDZEQUFnQixDQUFBO0FBQ3BCLENBQUMsRUFOVyxPQUFPLEtBQVAsT0FBTyxRQU1sQjtNQVFZLFNBQVM7SUFJbEIsWUFBb0IsR0FBUSxFQUFVLE1BQXVCO1FBQXpDLFFBQUcsR0FBSCxHQUFHLENBQUs7UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUFpQjtRQUN6RCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQ3JEO0lBRUssS0FBSzs7WUFDUCxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDNUI7S0FBQTtJQUVELHFCQUFxQixDQUFDLGFBQW9CLEVBQUUsV0FBa0IsRUFBRSxRQUFpQjtRQUM3RSxPQUFPO1lBQ0gsYUFBYSxFQUFFLGFBQWE7WUFDNUIsV0FBVyxFQUFFLFdBQVc7WUFDeEIsUUFBUSxFQUFFLFFBQVE7U0FDckIsQ0FBQTtLQUNKO0lBRUssdUJBQXVCLENBQUMsTUFBcUI7O1lBQy9DLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3pFLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztTQUN4RDtLQUFBO0lBRUssY0FBYyxDQUFDLE1BQXFCLEVBQUUsZ0JBQXdCOztZQUNoRSxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN2RSxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDbkUsT0FBTyxPQUFPLENBQUM7U0FDbEI7S0FBQTtJQUVLLDZCQUE2QixDQUFDLFFBQXdCLEVBQUUsTUFBZ0IsRUFBRSxRQUFpQixFQUFFLGdCQUF5QixJQUFJOztZQUM1SCxJQUFJLENBQUMsTUFBTSxFQUFFO2dCQUNULE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUN0RDs7O1lBR0QsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLEVBQUUsUUFBUSxhQUFSLFFBQVEsY0FBUixRQUFRLEdBQUksVUFBVSxDQUFDLENBQUM7WUFFdEcsSUFBSSxjQUE2QixDQUFDO1lBQ2xDLElBQUksY0FBc0IsQ0FBQztZQUMzQixJQUFJLFFBQVEsWUFBWWhCLGNBQUssRUFBRTtnQkFDM0IsY0FBYyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLEVBQUUsWUFBWSxFQUFFLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO2dCQUNuRyxjQUFjLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxxREFBWSxPQUFBLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxjQUFjLENBQUMsQ0FBQSxHQUFBLENBQUMsQ0FBQzthQUM3RztpQkFBTTtnQkFDSCxjQUFjLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUM7Z0JBQ3BHLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLHFEQUFZLE9BQUEsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUEsR0FBQSxDQUFDLENBQUM7YUFDOUc7WUFFRCxJQUFJLGNBQWMsSUFBSSxJQUFJLEVBQUU7Z0JBQ3hCLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUMxQyxPQUFPO2FBQ1Y7WUFFRCxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFFMUQsSUFBSSxhQUFhLEVBQUU7Z0JBQ2YsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDO2dCQUNsRCxJQUFJLENBQUMsV0FBVyxFQUFFO29CQUNkLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksY0FBYyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztvQkFDNUQsT0FBTztpQkFDVjtnQkFDRCxNQUFNLFdBQVcsQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLEVBQUMsS0FBSyxFQUFFLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBQyxFQUFFLE1BQU0sRUFBRSxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUMsRUFBQyxDQUFDLENBQUM7Z0JBQzdGLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO2FBQzNEO1lBRUQsT0FBTyxZQUFZLENBQUM7U0FDdkI7S0FBQTtJQUVLLGVBQWUsQ0FBQyxhQUFvQjs7WUFDdEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUNJLHFCQUFZLENBQUMsQ0FBQztZQUN6RSxJQUFJLFdBQVcsS0FBSyxJQUFJLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksY0FBYyxDQUFDLHlDQUF5QyxDQUFDLENBQUMsQ0FBQztnQkFDckYsT0FBTzthQUNWO1lBQ0QsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQzdHLE1BQU0sY0FBYyxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMscURBQVksT0FBQSxJQUFJLENBQUMsdUJBQXVCLENBQUMsY0FBYyxDQUFDLENBQUEsR0FBQSxDQUFDLENBQUM7WUFDaEgsSUFBSSxjQUFjLElBQUksSUFBSSxFQUFFO2dCQUN4QixPQUFPO2FBQ1Y7WUFFRCxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDO1lBQ2xDLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM1QixHQUFHLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLENBQUM7WUFFckMsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLDRCQUE0QixFQUFFLENBQUM7U0FDM0Q7S0FBQTtJQUVELCtCQUErQjtRQUMzQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQ0EscUJBQVksQ0FBQyxDQUFDO1FBQ3pFLElBQUksV0FBVyxLQUFLLElBQUksRUFBRTtZQUMvQixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLGNBQWMsQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDLENBQUM7WUFDakYsT0FBTztTQUNWO1FBQ0QsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDNUQ7SUFFUSx3QkFBd0IsQ0FBQyxJQUFXLEVBQUUsY0FBdUIsS0FBSzs7WUFDcEUsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsV0FBVyxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDakksTUFBTSxjQUFjLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxxREFBWSxPQUFBLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxjQUFjLENBQUMsQ0FBQSxHQUFBLENBQUMsQ0FBQztZQUNoSCxJQUFJLGNBQWMsSUFBSSxJQUFJLEVBQUU7Z0JBQ3hCLE9BQU87YUFDVjtZQUNELE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsQ0FBQztZQUNsRCxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxLQUFLLElBQUksRUFBRTtnQkFDN0MsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLDRCQUE0QixFQUFFLENBQUM7YUFDM0Q7U0FDSjtLQUFBO0lBRUsseUJBQXlCLENBQUMsRUFBZSxFQUFFLEdBQWlDOztZQUM5RSxNQUFNLHFCQUFxQixHQUFXLDJDQUEyQyxDQUFDO1lBRWxGLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3JFLElBQUksSUFBSSxDQUFDO1lBQ1QsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDO1lBQ2pCLFFBQVEsSUFBSSxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsR0FBRztnQkFDL0IsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDN0IsSUFBSSxLQUFLLENBQUM7Z0JBQ1YsSUFBSSxDQUFDLEtBQUssR0FBRyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxFQUFFO29CQUN2RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO29CQUM3RSxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsSUFBSSxZQUFZSixjQUFLLENBQUMsRUFBRTt3QkFDbkMsT0FBTztxQkFDVjtvQkFDRCxJQUFJLENBQUMsSUFBSSxFQUFFO3dCQUNQLElBQUksR0FBRyxJQUFJLENBQUM7d0JBQ1osTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7d0JBQ3hGLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLEVBQUUsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDO3FCQUNsRjtvQkFFRCxPQUFPLEtBQUssSUFBSSxJQUFJLEVBQUU7O3dCQUVsQixNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQzdDLE1BQU0sY0FBYyxHQUFXLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUM7NEJBQzFELE9BQU8sTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO3lCQUM3RCxDQUFBLENBQUMsQ0FBQzt3QkFDSCxJQUFJLGNBQWMsSUFBSSxJQUFJLEVBQUU7NEJBQ3hCLE9BQU87eUJBQ1Y7d0JBQ0QsSUFBSSxLQUFLLEdBQUcscUJBQXFCLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7d0JBQzlELElBQUksR0FBRyxHQUFHLHFCQUFxQixDQUFDLFNBQVMsQ0FBQzt3QkFDMUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLGNBQWMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUVoRixxQkFBcUIsQ0FBQyxTQUFTLEtBQUssY0FBYyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7d0JBQzdFLEtBQUssR0FBRyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7cUJBQy9DO29CQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDO2lCQUM1QjthQUNKO1NBQ1A7S0FBQTs7O0FDMUtGO0FBQ0E7QUFDQTtBQUNBLENBQUMsU0FBUyxHQUFHLEVBQUU7QUFDZixFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDekIsQ0FBQyxFQUFFLFNBQVMsVUFBVSxFQUFFO0FBRXhCO0FBQ0EsVUFBVSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsU0FBUyxNQUFNLEVBQUUsWUFBWSxFQUFFO0FBQ25FLEVBQUUsSUFBSSxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQztBQUNyQyxFQUFFLElBQUksZUFBZSxHQUFHLFlBQVksQ0FBQyxlQUFlLENBQUM7QUFDckQsRUFBRSxJQUFJLFVBQVUsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDO0FBQ3ZDLEVBQUUsSUFBSSxRQUFRLEdBQUcsWUFBWSxDQUFDLElBQUksSUFBSSxVQUFVLENBQUM7QUFDakQsRUFBRSxJQUFJLFVBQVUsR0FBRyxZQUFZLENBQUMsVUFBVSxLQUFLLE1BQUs7QUFDcEQsRUFBRSxJQUFJLElBQUksR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFDO0FBQ3JDLEVBQUUsSUFBSSxNQUFNLEdBQUcsWUFBWSxDQUFDLGNBQWMsSUFBSSxrQkFBa0IsQ0FBQztBQUNqRTtBQUNBO0FBQ0E7QUFDQSxFQUFFLElBQUksUUFBUSxHQUFHLFVBQVU7QUFDM0IsSUFBSSxTQUFTLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUM5RCxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUMzRixJQUFJLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN4RTtBQUNBLElBQUksT0FBTztBQUNYLE1BQU0sSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUM7QUFDdkYsTUFBTSxRQUFRLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUNsRyxNQUFNLFVBQVUsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDO0FBQ3hGLE1BQU0sVUFBVSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQztBQUN0RCxNQUFNLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDO0FBQzVGLE1BQU0sSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxRQUFRO0FBQ2hFLE1BQU0sTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJO0FBQ2pHLE1BQU0sTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDO0FBQ25FLE1BQU0sT0FBTyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUM7QUFDOUUsTUFBTSxPQUFPLEVBQUUsQ0FBQztBQUNoQixLQUFLLENBQUM7QUFDTixHQUFHLEVBQUUsQ0FBQztBQUNOO0FBQ0EsRUFBRSxJQUFJLGNBQWMsR0FBRyxtQkFBbUIsQ0FBQztBQUMzQyxFQUFFLElBQUksZUFBZSxHQUFHLHVGQUF1RixDQUFDO0FBQ2hIO0FBQ0EsRUFBRSxTQUFTLFVBQVUsQ0FBQyxNQUFNLEVBQUU7QUFDOUIsSUFBSSxJQUFJLE9BQU8sR0FBRyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDN0MsSUFBSSxPQUFPLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxJQUFJLEVBQUU7QUFDM0MsTUFBTSxJQUFJLENBQUMsT0FBTyxFQUFFO0FBQ3BCLFFBQVEsSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU87QUFDMUMsUUFBUSxJQUFJLElBQUksSUFBSSxHQUFHLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQztBQUN0QyxhQUFhLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxHQUFHLEVBQUUsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUNyRCxPQUFPO0FBQ1AsTUFBTSxPQUFPLEdBQUcsQ0FBQyxPQUFPLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQztBQUN6QyxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEVBQUUsSUFBSSxJQUFJLEVBQUUsT0FBTyxDQUFDO0FBQ3BCLEVBQUUsU0FBUyxHQUFHLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7QUFDaEMsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztBQUM5QixJQUFJLE9BQU8sS0FBSyxDQUFDO0FBQ2pCLEdBQUc7QUFDSCxFQUFFLFNBQVMsU0FBUyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUU7QUFDcEMsSUFBSSxJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDM0IsSUFBSSxJQUFJLEVBQUUsSUFBSSxHQUFHLElBQUksRUFBRSxJQUFJLEdBQUcsRUFBRTtBQUNoQyxNQUFNLEtBQUssQ0FBQyxRQUFRLEdBQUcsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZDLE1BQU0sT0FBTyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUMzQyxLQUFLLE1BQU0sSUFBSSxFQUFFLElBQUksR0FBRyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLENBQUMsRUFBRTtBQUM1RSxNQUFNLE9BQU8sR0FBRyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNyQyxLQUFLLE1BQU0sSUFBSSxFQUFFLElBQUksR0FBRyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7QUFDaEQsTUFBTSxPQUFPLEdBQUcsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDbkMsS0FBSyxNQUFNLElBQUksb0JBQW9CLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQzlDLE1BQU0sT0FBTyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDckIsS0FBSyxNQUFNLElBQUksRUFBRSxJQUFJLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO0FBQzdDLE1BQU0sT0FBTyxHQUFHLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ25DLEtBQUssTUFBTSxJQUFJLEVBQUUsSUFBSSxHQUFHLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxFQUFFO0FBQ25GLE1BQU0sT0FBTyxHQUFHLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ3JDLEtBQUssTUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDOUIsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLGtEQUFrRCxDQUFDLENBQUM7QUFDdkUsTUFBTSxPQUFPLEdBQUcsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDckMsS0FBSyxNQUFNLElBQUksRUFBRSxJQUFJLEdBQUcsRUFBRTtBQUMxQixNQUFNLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUMzQixRQUFRLEtBQUssQ0FBQyxRQUFRLEdBQUcsWUFBWSxDQUFDO0FBQ3RDLFFBQVEsT0FBTyxZQUFZLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzNDLE9BQU8sTUFBTSxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFDbEMsUUFBUSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDM0IsUUFBUSxPQUFPLEdBQUcsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDekMsT0FBTyxNQUFNLElBQUksaUJBQWlCLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRTtBQUN0RCxRQUFRLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMzQixRQUFRLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztBQUMxRCxRQUFRLE9BQU8sR0FBRyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUN6QyxPQUFPLE1BQU07QUFDYixRQUFRLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEIsUUFBUSxPQUFPLEdBQUcsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0FBQzdELE9BQU87QUFDUCxLQUFLLE1BQU0sSUFBSSxFQUFFLElBQUksR0FBRyxFQUFFO0FBQzFCLE1BQU0sS0FBSyxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUM7QUFDbEMsTUFBTSxPQUFPLFVBQVUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDdkMsS0FBSyxNQUFNLElBQUksRUFBRSxJQUFJLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksR0FBRyxFQUFFO0FBQ2xELE1BQU0sTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQ3pCLE1BQU0sT0FBTyxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ2pDLEtBQUssTUFBTSxJQUFJLEVBQUUsSUFBSSxHQUFHLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUNyRCxNQUFNLE9BQU8sR0FBRyxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUM7QUFDeEMsS0FBSyxNQUFNLElBQUksRUFBRSxJQUFJLEdBQUcsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztBQUMvQyxnQkFBZ0IsRUFBRSxJQUFJLEdBQUcsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUN0RyxNQUFNLE1BQU0sQ0FBQyxTQUFTLEdBQUU7QUFDeEIsTUFBTSxPQUFPLEdBQUcsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDO0FBQ3RDLEtBQUssTUFBTSxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDeEMsTUFBTSxJQUFJLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLEdBQUcsRUFBRTtBQUNwRSxRQUFRLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUM3QixVQUFVLElBQUksRUFBRSxJQUFJLEdBQUcsSUFBSSxFQUFFLElBQUksR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFDO0FBQ3JELFNBQVMsTUFBTSxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDM0MsVUFBVSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBQztBQUN4QixVQUFVLElBQUksRUFBRSxJQUFJLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBQztBQUN2QyxTQUFTO0FBQ1QsT0FBTztBQUNQLE1BQU0sSUFBSSxFQUFFLElBQUksR0FBRyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDO0FBQ3ZELE1BQU0sT0FBTyxHQUFHLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztBQUMzRCxLQUFLLE1BQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ2hDLE1BQU0sTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUM5QixNQUFNLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxPQUFPLEdBQUU7QUFDakMsTUFBTSxJQUFJLEtBQUssQ0FBQyxRQUFRLElBQUksR0FBRyxFQUFFO0FBQ2pDLFFBQVEsSUFBSSxRQUFRLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEVBQUU7QUFDakQsVUFBVSxJQUFJLEVBQUUsR0FBRyxRQUFRLENBQUMsSUFBSSxFQUFDO0FBQ2pDLFVBQVUsT0FBTyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQztBQUM3QyxTQUFTO0FBQ1QsUUFBUSxJQUFJLElBQUksSUFBSSxPQUFPLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQywwQ0FBMEMsRUFBRSxLQUFLLENBQUM7QUFDOUYsVUFBVSxPQUFPLEdBQUcsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQztBQUM5QyxPQUFPO0FBQ1AsTUFBTSxPQUFPLEdBQUcsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQztBQUM5QyxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0EsRUFBRSxTQUFTLFdBQVcsQ0FBQyxLQUFLLEVBQUU7QUFDOUIsSUFBSSxPQUFPLFNBQVMsTUFBTSxFQUFFLEtBQUssRUFBRTtBQUNuQyxNQUFNLElBQUksT0FBTyxHQUFHLEtBQUssRUFBRSxJQUFJLENBQUM7QUFDaEMsTUFBTSxJQUFJLFVBQVUsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksR0FBRyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7QUFDOUUsUUFBUSxLQUFLLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQztBQUNuQyxRQUFRLE9BQU8sR0FBRyxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzdDLE9BQU87QUFDUCxNQUFNLE9BQU8sQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLElBQUksRUFBRTtBQUM3QyxRQUFRLElBQUksSUFBSSxJQUFJLEtBQUssSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNO0FBQzdDLFFBQVEsT0FBTyxHQUFHLENBQUMsT0FBTyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUM7QUFDM0MsT0FBTztBQUNQLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQztBQUMvQyxNQUFNLE9BQU8sR0FBRyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNyQyxLQUFLLENBQUM7QUFDTixHQUFHO0FBQ0g7QUFDQSxFQUFFLFNBQVMsWUFBWSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUU7QUFDdkMsSUFBSSxJQUFJLFFBQVEsR0FBRyxLQUFLLEVBQUUsRUFBRSxDQUFDO0FBQzdCLElBQUksT0FBTyxFQUFFLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFO0FBQy9CLE1BQU0sSUFBSSxFQUFFLElBQUksR0FBRyxJQUFJLFFBQVEsRUFBRTtBQUNqQyxRQUFRLEtBQUssQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDO0FBQ25DLFFBQVEsTUFBTTtBQUNkLE9BQU87QUFDUCxNQUFNLFFBQVEsSUFBSSxFQUFFLElBQUksR0FBRyxDQUFDLENBQUM7QUFDN0IsS0FBSztBQUNMLElBQUksT0FBTyxHQUFHLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ3JDLEdBQUc7QUFDSDtBQUNBLEVBQUUsU0FBUyxVQUFVLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRTtBQUNyQyxJQUFJLElBQUksT0FBTyxHQUFHLEtBQUssRUFBRSxJQUFJLENBQUM7QUFDOUIsSUFBSSxPQUFPLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxJQUFJLEVBQUU7QUFDM0MsTUFBTSxJQUFJLENBQUMsT0FBTyxLQUFLLElBQUksSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7QUFDdkUsUUFBUSxLQUFLLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQztBQUNuQyxRQUFRLE1BQU07QUFDZCxPQUFPO0FBQ1AsTUFBTSxPQUFPLEdBQUcsQ0FBQyxPQUFPLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQztBQUN6QyxLQUFLO0FBQ0wsSUFBSSxPQUFPLEdBQUcsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0FBQ3RELEdBQUc7QUFDSDtBQUNBLEVBQUUsSUFBSSxRQUFRLEdBQUcsUUFBUSxDQUFDO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxTQUFTLFlBQVksQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFO0FBQ3ZDLElBQUksSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO0FBQ2xELElBQUksSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMxRCxJQUFJLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxPQUFPO0FBQzFCO0FBQ0EsSUFBSSxJQUFJLElBQUksRUFBRTtBQUNkLE1BQU0sSUFBSSxDQUFDLEdBQUcsNENBQTRDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUM7QUFDekcsTUFBTSxJQUFJLENBQUMsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLE1BQUs7QUFDNUIsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsWUFBWSxHQUFHLEtBQUssQ0FBQztBQUN4QyxJQUFJLEtBQUssSUFBSSxHQUFHLEdBQUcsS0FBSyxHQUFHLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFO0FBQy9DLE1BQU0sSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDekMsTUFBTSxJQUFJLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3pDLE1BQU0sSUFBSSxPQUFPLElBQUksQ0FBQyxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUU7QUFDdkMsUUFBUSxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUU7QUFDckMsUUFBUSxJQUFJLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEdBQUcsRUFBRSxZQUFZLEdBQUcsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFO0FBQ3hFLE9BQU8sTUFBTSxJQUFJLE9BQU8sSUFBSSxDQUFDLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRTtBQUM5QyxRQUFRLEVBQUUsS0FBSyxDQUFDO0FBQ2hCLE9BQU8sTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDbEMsUUFBUSxZQUFZLEdBQUcsSUFBSSxDQUFDO0FBQzVCLE9BQU8sTUFBTSxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDckMsUUFBUSxRQUFRLEVBQUUsR0FBRyxFQUFFO0FBQ3ZCLFVBQVUsSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFLE1BQU07QUFDOUIsVUFBVSxJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFDO0FBQ2xELFVBQVUsSUFBSSxJQUFJLElBQUksRUFBRSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRTtBQUNuRixTQUFTO0FBQ1QsT0FBTyxNQUFNLElBQUksWUFBWSxJQUFJLENBQUMsS0FBSyxFQUFFO0FBQ3pDLFFBQVEsRUFBRSxHQUFHLENBQUM7QUFDZCxRQUFRLE1BQU07QUFDZCxPQUFPO0FBQ1AsS0FBSztBQUNMLElBQUksSUFBSSxZQUFZLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUM7QUFDdkQsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEVBQUUsSUFBSSxXQUFXLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSTtBQUNuRixxQkFBcUIsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDM0Y7QUFDQSxFQUFFLFNBQVMsU0FBUyxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFO0FBQ2hFLElBQUksSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7QUFDN0IsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUN6QixJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ3JCLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7QUFDckIsSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztBQUNyQixJQUFJLElBQUksS0FBSyxJQUFJLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUMxQyxHQUFHO0FBQ0g7QUFDQSxFQUFFLFNBQVMsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUU7QUFDbkMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLE9BQU8sS0FBSztBQUNqQyxJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJO0FBQy9DLE1BQU0sSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLE9BQU8sRUFBRSxPQUFPLElBQUksQ0FBQztBQUN6QyxJQUFJLEtBQUssSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUU7QUFDbkQsTUFBTSxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSTtBQUN6QyxRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxPQUFPLEVBQUUsT0FBTyxJQUFJLENBQUM7QUFDM0MsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBLEVBQUUsU0FBUyxPQUFPLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRTtBQUN4RCxJQUFJLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUM7QUFDdEI7QUFDQTtBQUNBLElBQUksRUFBRSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDekY7QUFDQSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUM7QUFDOUMsTUFBTSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7QUFDakM7QUFDQSxJQUFJLE1BQU0sSUFBSSxFQUFFO0FBQ2hCLE1BQU0sSUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsUUFBUSxHQUFHLFVBQVUsR0FBRyxTQUFTLENBQUM7QUFDaEYsTUFBTSxJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLEVBQUU7QUFDckMsUUFBUSxNQUFNLEVBQUUsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRztBQUNoRCxVQUFVLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDO0FBQ3JCLFFBQVEsSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQztBQUN4QyxRQUFRLElBQUksSUFBSSxJQUFJLFVBQVUsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxFQUFFLE9BQU8sWUFBWSxDQUFDO0FBQy9FLFFBQVEsT0FBTyxLQUFLLENBQUM7QUFDckIsT0FBTztBQUNQLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMvRCxFQUFFLFNBQVMsSUFBSSxHQUFHO0FBQ2xCLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdFLEdBQUc7QUFDSCxFQUFFLFNBQVMsSUFBSSxHQUFHO0FBQ2xCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDaEMsSUFBSSxPQUFPLElBQUksQ0FBQztBQUNoQixHQUFHO0FBQ0gsRUFBRSxTQUFTLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFO0FBQzlCLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLEVBQUUsT0FBTyxJQUFJO0FBQ3JFLElBQUksT0FBTyxLQUFLLENBQUM7QUFDakIsR0FBRztBQUNILEVBQUUsU0FBUyxRQUFRLENBQUMsT0FBTyxFQUFFO0FBQzdCLElBQUksSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQztBQUN6QixJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0FBQ3RCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNO0FBQzNCLElBQUksSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFO0FBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRTtBQUMvRTtBQUNBLFFBQVEsSUFBSSxVQUFVLEdBQUcsaUJBQWlCLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUM7QUFDbEUsUUFBUSxJQUFJLFVBQVUsSUFBSSxJQUFJLEVBQUU7QUFDaEMsVUFBVSxLQUFLLENBQUMsT0FBTyxHQUFHLFdBQVU7QUFDcEMsVUFBVSxNQUFNO0FBQ2hCLFNBQVM7QUFDVCxPQUFPLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFO0FBQ3BELFFBQVEsS0FBSyxDQUFDLFNBQVMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLFNBQVMsRUFBQztBQUMzRCxRQUFRLE1BQU07QUFDZCxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLFlBQVksQ0FBQyxVQUFVLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUM7QUFDckUsTUFBTSxLQUFLLENBQUMsVUFBVSxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsVUFBVSxFQUFDO0FBQzNELEdBQUc7QUFDSCxFQUFFLFNBQVMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRTtBQUMvQyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7QUFDbEIsTUFBTSxPQUFPLElBQUk7QUFDakIsS0FBSyxNQUFNLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRTtBQUM5QixNQUFNLElBQUksS0FBSyxHQUFHLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFDO0FBQzFELE1BQU0sSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLElBQUk7QUFDN0IsTUFBTSxJQUFJLEtBQUssSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sT0FBTztBQUMvQyxNQUFNLE9BQU8sSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDO0FBQ25ELEtBQUssTUFBTSxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQzlDLE1BQU0sT0FBTyxPQUFPO0FBQ3BCLEtBQUssTUFBTTtBQUNYLE1BQU0sT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDO0FBQzdFLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQSxFQUFFLFNBQVMsVUFBVSxDQUFDLElBQUksRUFBRTtBQUM1QixJQUFJLE9BQU8sSUFBSSxJQUFJLFFBQVEsSUFBSSxJQUFJLElBQUksU0FBUyxJQUFJLElBQUksSUFBSSxXQUFXLElBQUksSUFBSSxJQUFJLFVBQVUsSUFBSSxJQUFJLElBQUksVUFBVTtBQUNuSCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsRUFBRSxTQUFTLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQUssRUFBRTtBQUNoRyxFQUFFLFNBQVMsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSSxFQUFFO0FBQ2pFO0FBQ0EsRUFBRSxJQUFJLFdBQVcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxHQUFHLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxFQUFDO0FBQy9ELEVBQUUsU0FBUyxXQUFXLEdBQUc7QUFDekIsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUM7QUFDL0UsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxZQUFXO0FBQ3BDLEdBQUc7QUFDSCxFQUFFLFNBQVMsZ0JBQWdCLEdBQUc7QUFDOUIsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUM7QUFDOUUsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxLQUFJO0FBQzdCLEdBQUc7QUFDSCxFQUFFLFNBQVMsVUFBVSxHQUFHO0FBQ3hCLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSTtBQUM5QyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUk7QUFDNUMsR0FBRztBQUNILEVBQUUsVUFBVSxDQUFDLEdBQUcsR0FBRyxLQUFJO0FBQ3ZCLEVBQUUsU0FBUyxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRTtBQUMvQixJQUFJLElBQUksTUFBTSxHQUFHLFdBQVc7QUFDNUIsTUFBTSxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUMsS0FBSyxFQUFFLE1BQU0sR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO0FBQ3BELE1BQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxNQUFNLEVBQUUsTUFBTSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO0FBQ3hFLFdBQVcsS0FBSyxJQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssSUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLEdBQUcsSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSTtBQUN4RyxRQUFRLE1BQU0sR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO0FBQ2hDLE1BQU0sS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDakcsS0FBSyxDQUFDO0FBQ04sSUFBSSxNQUFNLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQztBQUN0QixJQUFJLE9BQU8sTUFBTSxDQUFDO0FBQ2xCLEdBQUc7QUFDSCxFQUFFLFNBQVMsTUFBTSxHQUFHO0FBQ3BCLElBQUksSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQztBQUN6QixJQUFJLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUU7QUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLEdBQUc7QUFDbkMsUUFBUSxLQUFLLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO0FBQ2hELE1BQU0sS0FBSyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztBQUN6QyxLQUFLO0FBQ0wsR0FBRztBQUNILEVBQUUsTUFBTSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUM7QUFDcEI7QUFDQSxFQUFFLFNBQVMsTUFBTSxDQUFDLE1BQU0sRUFBRTtBQUMxQixJQUFJLFNBQVMsR0FBRyxDQUFDLElBQUksRUFBRTtBQUN2QixNQUFNLElBQUksSUFBSSxJQUFJLE1BQU0sRUFBRSxPQUFPLElBQUksRUFBRSxDQUFDO0FBQ3hDLFdBQVcsSUFBSSxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksR0FBRyxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUM7QUFDekYsV0FBVyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM1QixLQUNBLElBQUksT0FBTyxHQUFHLENBQUM7QUFDZixHQUFHO0FBQ0g7QUFDQSxFQUFFLFNBQVMsU0FBUyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUU7QUFDbEMsSUFBSSxJQUFJLElBQUksSUFBSSxLQUFLLEVBQUUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzFGLElBQUksSUFBSSxJQUFJLElBQUksV0FBVyxFQUFFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3hGLElBQUksSUFBSSxJQUFJLElBQUksV0FBVyxFQUFFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDN0UsSUFBSSxJQUFJLElBQUksSUFBSSxXQUFXLEVBQUUsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxlQUFlLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzNJLElBQUksSUFBSSxJQUFJLElBQUksVUFBVSxFQUFFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3JELElBQUksSUFBSSxJQUFJLElBQUksR0FBRyxFQUFFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQzVGLElBQUksSUFBSSxJQUFJLElBQUksR0FBRyxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUM7QUFDbkMsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7QUFDdEIsTUFBTSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxNQUFNLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLE1BQU07QUFDMUYsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDO0FBQzVCLE1BQU0sT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQzVFLEtBQUs7QUFDTCxJQUFJLElBQUksSUFBSSxJQUFJLFVBQVUsRUFBRSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUNyRCxJQUFJLElBQUksSUFBSSxJQUFJLEtBQUssRUFBRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDOUcsSUFBSSxJQUFJLElBQUksSUFBSSxPQUFPLEtBQUssSUFBSSxJQUFJLEtBQUssSUFBSSxXQUFXLENBQUMsRUFBRTtBQUMzRCxNQUFNLEVBQUUsQ0FBQyxNQUFNLEdBQUcsVUFBUztBQUMzQixNQUFNLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxJQUFJLE9BQU8sR0FBRyxJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQztBQUNyRixLQUFLO0FBQ0wsSUFBSSxJQUFJLElBQUksSUFBSSxVQUFVLEVBQUU7QUFDNUIsTUFBTSxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksU0FBUyxFQUFFO0FBQ3RDLFFBQVEsRUFBRSxDQUFDLE1BQU0sR0FBRyxVQUFTO0FBQzdCLFFBQVEsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0FBQzlCLE9BQU8sTUFBTSxJQUFJLElBQUksS0FBSyxLQUFLLElBQUksUUFBUSxJQUFJLEtBQUssSUFBSSxNQUFNLElBQUksS0FBSyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsRUFBRTtBQUN4SCxRQUFRLEVBQUUsQ0FBQyxNQUFNLEdBQUcsVUFBUztBQUM3QixRQUFRLElBQUksS0FBSyxJQUFJLE1BQU0sRUFBRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNsRCxhQUFhLElBQUksS0FBSyxJQUFJLE1BQU0sRUFBRSxPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNuRyxhQUFhLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQztBQUNwRyxPQUFPLE1BQU0sSUFBSSxJQUFJLElBQUksS0FBSyxJQUFJLFdBQVcsRUFBRTtBQUMvQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLEdBQUcsVUFBUztBQUM3QixRQUFRLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQztBQUNuRSxPQUFPLE1BQU0sSUFBSSxJQUFJLElBQUksS0FBSyxJQUFJLFVBQVUsRUFBRTtBQUM5QyxRQUFRLEVBQUUsQ0FBQyxNQUFNLEdBQUcsVUFBUztBQUM3QixRQUFRLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztBQUM5QixPQUFPLE1BQU07QUFDYixRQUFRLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUNqRCxPQUFPO0FBQ1AsS0FBSztBQUNMLElBQUksSUFBSSxJQUFJLElBQUksUUFBUSxFQUFFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsZ0JBQWdCO0FBQ3ZILHNDQUFzQyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztBQUN6RSxJQUFJLElBQUksSUFBSSxJQUFJLE1BQU0sRUFBRSxPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDN0QsSUFBSSxJQUFJLElBQUksSUFBSSxTQUFTLEVBQUUsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDcEQsSUFBSSxJQUFJLElBQUksSUFBSSxPQUFPLEVBQUUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ3JILElBQUksSUFBSSxJQUFJLElBQUksUUFBUSxFQUFFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDNUUsSUFBSSxJQUFJLElBQUksSUFBSSxRQUFRLEVBQUUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUM1RSxJQUFJLElBQUksSUFBSSxJQUFJLE9BQU8sRUFBRSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7QUFDL0MsSUFBSSxJQUFJLEtBQUssSUFBSSxHQUFHLEVBQUUsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQztBQUN4RCxJQUFJLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ2xFLEdBQUc7QUFDSCxFQUFFLFNBQVMsaUJBQWlCLENBQUMsSUFBSSxFQUFFO0FBQ25DLElBQUksSUFBSSxJQUFJLElBQUksR0FBRyxFQUFFLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDckQsR0FBRztBQUNILEVBQUUsU0FBUyxVQUFVLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRTtBQUNuQyxJQUFJLE9BQU8sZUFBZSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDL0MsR0FBRztBQUNILEVBQUUsU0FBUyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO0FBQzFDLElBQUksT0FBTyxlQUFlLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztBQUM5QyxHQUFHO0FBQ0gsRUFBRSxTQUFTLFNBQVMsQ0FBQyxJQUFJLEVBQUU7QUFDM0IsSUFBSSxJQUFJLElBQUksSUFBSSxHQUFHLEVBQUUsT0FBTyxJQUFJLEVBQUU7QUFDbEMsSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsZUFBZSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUM7QUFDbkUsR0FBRztBQUNILEVBQUUsU0FBUyxlQUFlLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUU7QUFDakQsSUFBSSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO0FBQ2hELE1BQU0sSUFBSSxJQUFJLEdBQUcsT0FBTyxHQUFHLGdCQUFnQixHQUFHLFNBQVMsQ0FBQztBQUN4RCxNQUFNLElBQUksSUFBSSxJQUFJLEdBQUcsRUFBRSxPQUFPLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDN0gsV0FBVyxJQUFJLElBQUksSUFBSSxVQUFVLEVBQUUsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ3JHLEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxPQUFPLEdBQUcsT0FBTyxHQUFHLG9CQUFvQixHQUFHLGtCQUFrQixDQUFDO0FBQ3RFLElBQUksSUFBSSxXQUFXLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQy9ELElBQUksSUFBSSxJQUFJLElBQUksVUFBVSxFQUFFLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUM5RCxJQUFJLElBQUksSUFBSSxJQUFJLE9BQU8sS0FBSyxJQUFJLElBQUksS0FBSyxJQUFJLFdBQVcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsZUFBZSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUU7QUFDNUksSUFBSSxJQUFJLElBQUksSUFBSSxXQUFXLElBQUksSUFBSSxJQUFJLE9BQU8sRUFBRSxPQUFPLElBQUksQ0FBQyxPQUFPLEdBQUcsaUJBQWlCLEdBQUcsVUFBVSxDQUFDLENBQUM7QUFDdEcsSUFBSSxJQUFJLElBQUksSUFBSSxHQUFHLEVBQUUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLGVBQWUsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzlGLElBQUksSUFBSSxJQUFJLElBQUksVUFBVSxJQUFJLElBQUksSUFBSSxRQUFRLEVBQUUsT0FBTyxJQUFJLENBQUMsT0FBTyxHQUFHLGlCQUFpQixHQUFHLFVBQVUsQ0FBQyxDQUFDO0FBQ3RHLElBQUksSUFBSSxJQUFJLElBQUksR0FBRyxFQUFFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzlFLElBQUksSUFBSSxJQUFJLElBQUksR0FBRyxFQUFFLE9BQU8sWUFBWSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3RFLElBQUksSUFBSSxJQUFJLElBQUksT0FBTyxFQUFFLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNyRCxJQUFJLElBQUksSUFBSSxJQUFJLEtBQUssRUFBRSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUN6RCxJQUFJLE9BQU8sSUFBSSxFQUFFLENBQUM7QUFDbEIsR0FBRztBQUNILEVBQUUsU0FBUyxlQUFlLENBQUMsSUFBSSxFQUFFO0FBQ2pDLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUM7QUFDaEQsSUFBSSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUM1QixHQUFHO0FBQ0g7QUFDQSxFQUFFLFNBQVMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRTtBQUMzQyxJQUFJLElBQUksSUFBSSxJQUFJLEdBQUcsRUFBRSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUNsRCxJQUFJLE9BQU8sb0JBQW9CLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNwRCxHQUFHO0FBQ0gsRUFBRSxTQUFTLG9CQUFvQixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFO0FBQ3RELElBQUksSUFBSSxFQUFFLEdBQUcsT0FBTyxJQUFJLEtBQUssR0FBRyxrQkFBa0IsR0FBRyxvQkFBb0IsQ0FBQztBQUMxRSxJQUFJLElBQUksSUFBSSxHQUFHLE9BQU8sSUFBSSxLQUFLLEdBQUcsVUFBVSxHQUFHLGlCQUFpQixDQUFDO0FBQ2pFLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxPQUFPLEdBQUcsZ0JBQWdCLEdBQUcsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ25HLElBQUksSUFBSSxJQUFJLElBQUksVUFBVSxFQUFFO0FBQzVCLE1BQU0sSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksR0FBRyxFQUFFLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3pFLE1BQU0sSUFBSSxJQUFJLElBQUksS0FBSyxJQUFJLEdBQUcsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQywwQkFBMEIsRUFBRSxLQUFLLENBQUM7QUFDcEYsUUFBUSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsUUFBUSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDdkUsTUFBTSxJQUFJLEtBQUssSUFBSSxHQUFHLEVBQUUsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNuRSxNQUFNLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3hCLEtBQUs7QUFDTCxJQUFJLElBQUksSUFBSSxJQUFJLE9BQU8sRUFBRSxFQUFFLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFO0FBQ3BELElBQUksSUFBSSxJQUFJLElBQUksR0FBRyxFQUFFLE9BQU87QUFDNUIsSUFBSSxJQUFJLElBQUksSUFBSSxHQUFHLEVBQUUsT0FBTyxZQUFZLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztBQUM3RSxJQUFJLElBQUksSUFBSSxJQUFJLEdBQUcsRUFBRSxPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDL0MsSUFBSSxJQUFJLElBQUksSUFBSSxHQUFHLEVBQUUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLGVBQWUsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3pGLElBQUksSUFBSSxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxFQUFFO0FBQ25GLElBQUksSUFBSSxJQUFJLElBQUksUUFBUSxFQUFFO0FBQzFCLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDLE1BQU0sR0FBRyxXQUFVO0FBQ2hELE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFDO0FBQzNELE1BQU0sT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQ3ZCLEtBQUs7QUFDTCxHQUFHO0FBQ0gsRUFBRSxTQUFTLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO0FBQzlCLElBQUksSUFBSSxJQUFJLElBQUksT0FBTyxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUM7QUFDdkMsSUFBSSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDbEUsSUFBSSxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsYUFBYSxDQUFDLENBQUM7QUFDaEQsR0FBRztBQUNILEVBQUUsU0FBUyxhQUFhLENBQUMsSUFBSSxFQUFFO0FBQy9CLElBQUksSUFBSSxJQUFJLElBQUksR0FBRyxFQUFFO0FBQ3JCLE1BQU0sRUFBRSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUM7QUFDN0IsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUM7QUFDckMsTUFBTSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN6QixLQUFLO0FBQ0wsR0FBRztBQUNILEVBQUUsU0FBUyxTQUFTLENBQUMsSUFBSSxFQUFFO0FBQzNCLElBQUksWUFBWSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3RDLElBQUksT0FBTyxJQUFJLENBQUMsSUFBSSxJQUFJLEdBQUcsR0FBRyxTQUFTLEdBQUcsVUFBVSxDQUFDLENBQUM7QUFDdEQsR0FBRztBQUNILEVBQUUsU0FBUyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUU7QUFDbEMsSUFBSSxZQUFZLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDdEMsSUFBSSxPQUFPLElBQUksQ0FBQyxJQUFJLElBQUksR0FBRyxHQUFHLFNBQVMsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDO0FBQzdELEdBQUc7QUFDSCxFQUFFLFNBQVMsV0FBVyxDQUFDLE9BQU8sRUFBRTtBQUNoQyxJQUFJLE9BQU8sU0FBUyxJQUFJLEVBQUU7QUFDMUIsTUFBTSxJQUFJLElBQUksSUFBSSxHQUFHLEVBQUUsT0FBTyxJQUFJLENBQUMsT0FBTyxHQUFHLGFBQWEsR0FBRyxNQUFNLENBQUMsQ0FBQztBQUNyRSxXQUFXLElBQUksSUFBSSxJQUFJLFVBQVUsSUFBSSxJQUFJLEVBQUUsT0FBTyxJQUFJLENBQUMsYUFBYSxFQUFFLE9BQU8sR0FBRyxvQkFBb0IsR0FBRyxrQkFBa0IsQ0FBQztBQUMxSCxXQUFXLE9BQU8sSUFBSSxDQUFDLE9BQU8sR0FBRyxpQkFBaUIsR0FBRyxVQUFVLENBQUMsQ0FBQztBQUNqRSxLQUFLLENBQUM7QUFDTixHQUFHO0FBQ0gsRUFBRSxTQUFTLE1BQU0sQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFO0FBQzVCLElBQUksSUFBSSxLQUFLLElBQUksUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEVBQUU7QUFDdEYsR0FBRztBQUNILEVBQUUsU0FBUyxhQUFhLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRTtBQUNuQyxJQUFJLElBQUksS0FBSyxJQUFJLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxFQUFFO0FBQ3hGLEdBQUc7QUFDSCxFQUFFLFNBQVMsVUFBVSxDQUFDLElBQUksRUFBRTtBQUM1QixJQUFJLElBQUksSUFBSSxJQUFJLEdBQUcsRUFBRSxPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDcEQsSUFBSSxPQUFPLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDekQsR0FBRztBQUNILEVBQUUsU0FBUyxRQUFRLENBQUMsSUFBSSxFQUFFO0FBQzFCLElBQUksSUFBSSxJQUFJLElBQUksVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUM7QUFDcEUsR0FBRztBQUNILEVBQUUsU0FBUyxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRTtBQUNoQyxJQUFJLElBQUksSUFBSSxJQUFJLE9BQU8sRUFBRTtBQUN6QixNQUFNLEVBQUUsQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDO0FBQzdCLE1BQU0sT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDM0IsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLFVBQVUsSUFBSSxFQUFFLENBQUMsS0FBSyxJQUFJLFNBQVMsRUFBRTtBQUM1RCxNQUFNLEVBQUUsQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDO0FBQzdCLE1BQU0sSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLEVBQUUsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDdEUsTUFBTSxJQUFJLEVBQUM7QUFDWCxNQUFNLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDcEcsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTTtBQUN6RCxNQUFNLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQzdCLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxRQUFRLElBQUksSUFBSSxJQUFJLFFBQVEsRUFBRTtBQUNyRCxNQUFNLEVBQUUsQ0FBQyxNQUFNLEdBQUcsVUFBVSxHQUFHLFVBQVUsSUFBSSxFQUFFLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxDQUFDO0FBQ3JFLE1BQU0sT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDN0IsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLGdCQUFnQixFQUFFO0FBQ3pDLE1BQU0sT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDN0IsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUMxQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLEdBQUcsVUFBUztBQUMzQixNQUFNLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUMxQixLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksR0FBRyxFQUFFO0FBQzVCLE1BQU0sT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDakUsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLFFBQVEsRUFBRTtBQUNqQyxNQUFNLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ2hELEtBQUssTUFBTSxJQUFJLEtBQUssSUFBSSxHQUFHLEVBQUU7QUFDN0IsTUFBTSxFQUFFLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztBQUM1QixNQUFNLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzNCLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxHQUFHLEVBQUU7QUFDNUIsTUFBTSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7QUFDNUIsS0FBSztBQUNMLEdBQUc7QUFDSCxFQUFFLFNBQVMsWUFBWSxDQUFDLElBQUksRUFBRTtBQUM5QixJQUFJLElBQUksSUFBSSxJQUFJLFVBQVUsRUFBRSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUNuRCxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDO0FBQzNCLElBQUksT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDN0IsR0FBRztBQUNILEVBQUUsU0FBUyxTQUFTLENBQUMsSUFBSSxFQUFFO0FBQzNCLElBQUksSUFBSSxJQUFJLElBQUksR0FBRyxFQUFFLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFDcEQsSUFBSSxJQUFJLElBQUksSUFBSSxHQUFHLEVBQUUsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDOUMsR0FBRztBQUNILEVBQUUsU0FBUyxRQUFRLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDcEMsSUFBSSxTQUFTLE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO0FBQ2xDLE1BQU0sSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLElBQUksR0FBRyxFQUFFO0FBQ3RELFFBQVEsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7QUFDbkMsUUFBUSxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDN0QsUUFBUSxPQUFPLElBQUksQ0FBQyxTQUFTLElBQUksRUFBRSxLQUFLLEVBQUU7QUFDMUMsVUFBVSxJQUFJLElBQUksSUFBSSxHQUFHLElBQUksS0FBSyxJQUFJLEdBQUcsRUFBRSxPQUFPLElBQUksRUFBRTtBQUN4RCxVQUFVLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztBQUMzQixTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDcEIsT0FBTztBQUNQLE1BQU0sSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJLEtBQUssSUFBSSxHQUFHLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQztBQUNyRCxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQ3pELE1BQU0sT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDL0IsS0FBSztBQUNMLElBQUksT0FBTyxTQUFTLElBQUksRUFBRSxLQUFLLEVBQUU7QUFDakMsTUFBTSxJQUFJLElBQUksSUFBSSxHQUFHLElBQUksS0FBSyxJQUFJLEdBQUcsRUFBRSxPQUFPLElBQUksRUFBRSxDQUFDO0FBQ3JELE1BQU0sT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ2pDLEtBQUssQ0FBQztBQUNOLEdBQUc7QUFDSCxFQUFFLFNBQVMsWUFBWSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFO0FBQ3pDLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFO0FBQzdDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0IsSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDakUsR0FBRztBQUNILEVBQUUsU0FBUyxLQUFLLENBQUMsSUFBSSxFQUFFO0FBQ3ZCLElBQUksSUFBSSxJQUFJLElBQUksR0FBRyxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUM7QUFDbkMsSUFBSSxPQUFPLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDbEMsR0FBRztBQUNILEVBQUUsU0FBUyxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRTtBQUNsQyxJQUFJLElBQUksSUFBSSxFQUFFO0FBQ2QsTUFBTSxJQUFJLElBQUksSUFBSSxHQUFHLEVBQUUsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDN0MsTUFBTSxJQUFJLEtBQUssSUFBSSxHQUFHLEVBQUUsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDL0MsS0FBSztBQUNMLEdBQUc7QUFDSCxFQUFFLFNBQVMsYUFBYSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUU7QUFDdEMsSUFBSSxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksR0FBRyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsRUFBRSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7QUFDckUsR0FBRztBQUNILEVBQUUsU0FBUyxZQUFZLENBQUMsSUFBSSxFQUFFO0FBQzlCLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLEdBQUcsRUFBRTtBQUM3QixNQUFNLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUM7QUFDM0YsV0FBVyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7QUFDaEMsS0FBSztBQUNMLEdBQUc7QUFDSCxFQUFFLFNBQVMsSUFBSSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUU7QUFDMUIsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUU7QUFDdkIsTUFBTSxFQUFFLENBQUMsTUFBTSxHQUFHLFVBQVM7QUFDM0IsTUFBTSxPQUFPLElBQUksRUFBRTtBQUNuQixLQUFLO0FBQ0wsR0FBRztBQUNILEVBQUUsU0FBUyxRQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRTtBQUNqQyxJQUFJLElBQUksS0FBSyxJQUFJLE9BQU8sSUFBSSxLQUFLLElBQUksUUFBUSxJQUFJLEtBQUssSUFBSSxPQUFPLElBQUksS0FBSyxJQUFJLFVBQVUsRUFBRTtBQUMxRixNQUFNLEVBQUUsQ0FBQyxNQUFNLEdBQUcsVUFBUztBQUMzQixNQUFNLE9BQU8sSUFBSSxDQUFDLEtBQUssSUFBSSxRQUFRLEdBQUcsaUJBQWlCLEdBQUcsUUFBUSxDQUFDO0FBQ25FLEtBQUs7QUFDTCxJQUFJLElBQUksSUFBSSxJQUFJLFVBQVUsSUFBSSxLQUFLLElBQUksTUFBTSxFQUFFO0FBQy9DLE1BQU0sRUFBRSxDQUFDLE1BQU0sR0FBRyxPQUFNO0FBQ3hCLE1BQU0sT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0FBQzVCLEtBQUs7QUFDTCxJQUFJLElBQUksS0FBSyxJQUFJLEdBQUcsSUFBSSxLQUFLLElBQUksR0FBRyxFQUFFLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztBQUMzRCxJQUFJLElBQUksSUFBSSxJQUFJLFFBQVEsSUFBSSxJQUFJLElBQUksUUFBUSxJQUFJLElBQUksSUFBSSxNQUFNLEVBQUUsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDdkYsSUFBSSxJQUFJLElBQUksSUFBSSxHQUFHLEVBQUUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUM7QUFDL0YsSUFBSSxJQUFJLElBQUksSUFBSSxHQUFHLEVBQUUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDO0FBQzVFLElBQUksSUFBSSxJQUFJLElBQUksR0FBRyxFQUFFLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLEVBQUUsZUFBZSxFQUFFLFNBQVMsQ0FBQztBQUNwRixJQUFJLElBQUksSUFBSSxJQUFJLEdBQUcsRUFBRSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxFQUFFLFFBQVEsQ0FBQztBQUNuRSxJQUFJLElBQUksSUFBSSxJQUFJLE9BQU8sRUFBRSxFQUFFLE9BQU8sSUFBSSxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUFFO0FBQy9ELEdBQUc7QUFDSCxFQUFFLFNBQVMsZUFBZSxDQUFDLElBQUksRUFBRTtBQUNqQyxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksRUFBRSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7QUFDM0MsR0FBRztBQUNILEVBQUUsU0FBUyxTQUFTLENBQUMsSUFBSSxFQUFFO0FBQzNCLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFLE9BQU8sSUFBSSxFQUFFO0FBQzdDLElBQUksSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJLElBQUksSUFBSSxHQUFHLEVBQUUsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0FBQzFELElBQUksT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQztBQUNwQyxHQUFHO0FBQ0gsRUFBRSxTQUFTLFFBQVEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO0FBQ2pDLElBQUksSUFBSSxJQUFJLElBQUksVUFBVSxJQUFJLEVBQUUsQ0FBQyxLQUFLLElBQUksU0FBUyxFQUFFO0FBQ3JELE1BQU0sRUFBRSxDQUFDLE1BQU0sR0FBRyxXQUFVO0FBQzVCLE1BQU0sT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0FBQzNCLEtBQUssTUFBTSxJQUFJLEtBQUssSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLFFBQVEsSUFBSSxJQUFJLElBQUksUUFBUSxFQUFFO0FBQ3JFLE1BQU0sT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0FBQzNCLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxHQUFHLEVBQUU7QUFDNUIsTUFBTSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7QUFDM0IsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLEdBQUcsRUFBRTtBQUM1QixNQUFNLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRSxhQUFhLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsQ0FBQztBQUMzRSxLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksR0FBRyxFQUFFO0FBQzVCLE1BQU0sT0FBTyxJQUFJLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQztBQUN6QyxLQUFLLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEVBQUU7QUFDMUMsTUFBTSxPQUFPLElBQUksRUFBRTtBQUNuQixLQUFLO0FBQ0wsR0FBRztBQUNILEVBQUUsU0FBUyxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRTtBQUNsQyxJQUFJLElBQUksSUFBSSxJQUFJLE9BQU8sRUFBRSxPQUFPLElBQUksRUFBRSxDQUFDO0FBQ3ZDLElBQUksSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ3RFLElBQUksT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLGlCQUFpQixDQUFDLENBQUM7QUFDN0MsR0FBRztBQUNILEVBQUUsU0FBUyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUU7QUFDbkMsSUFBSSxJQUFJLElBQUksSUFBSSxHQUFHLEVBQUU7QUFDckIsTUFBTSxFQUFFLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQztBQUM3QixNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztBQUNyQyxNQUFNLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQzdCLEtBQUs7QUFDTCxHQUFHO0FBQ0gsRUFBRSxTQUFTLE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO0FBQ2hDLElBQUksSUFBSSxJQUFJLElBQUksVUFBVSxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsSUFBSSxLQUFLLElBQUksR0FBRyxFQUFFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUN0RyxJQUFJLElBQUksSUFBSSxJQUFJLEdBQUcsRUFBRSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7QUFDMUMsSUFBSSxJQUFJLElBQUksSUFBSSxRQUFRLEVBQUUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0FBQzlDLElBQUksT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0FBQ3pCLEdBQUc7QUFDSCxFQUFFLFNBQVMsU0FBUyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUU7QUFDbEMsSUFBSSxJQUFJLEtBQUssSUFBSSxHQUFHLEVBQUUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQztBQUMzRixJQUFJLElBQUksS0FBSyxJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJLEtBQUssSUFBSSxHQUFHLEVBQUUsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0FBQzFFLElBQUksSUFBSSxJQUFJLElBQUksR0FBRyxFQUFFLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsU0FBUyxDQUFDO0FBQ2xFLElBQUksSUFBSSxLQUFLLElBQUksU0FBUyxJQUFJ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QyxTQUFTLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUM7QUFDN0QsUUFBUSxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSTtBQUM3QyxRQUFRLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxJQUFJO0FBQ3RELE9BQU8sQ0FBQztBQUNSLEtBQUs7QUFDTDtBQUNBLElBQUksS0FBSyxFQUFFLFNBQVMsTUFBTSxFQUFFLEtBQUssRUFBRTtBQUNuQyxNQUFNLElBQUksTUFBTSxJQUFJLEtBQUssQ0FBQyxVQUFVO0FBQ3BDLFVBQVUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFFO0FBQ3BFLFFBQVEsS0FBSyxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUM7QUFDbEMsUUFBUSxLQUFLLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztBQUN4RCxPQUFPO0FBQ1A7QUFDQSxNQUFNLElBQUksTUFBTSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFO0FBQ3pDLFFBQVEsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdkQsUUFBUSxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUM7QUFDbkMsT0FBTztBQUNQLE1BQU0sSUFBSSxNQUFNLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUU7QUFDNUMsUUFBUSxNQUFNLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7QUFDbEMsUUFBUSxLQUFLLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNoRSxRQUFR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 diff --git a/.obsidian/plugins/templater-obsidian/manifest.json b/.obsidian/plugins/templater-obsidian/manifest.json deleted file mode 100644 index 516e042bd..000000000 --- a/.obsidian/plugins/templater-obsidian/manifest.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "id": "templater-obsidian", - "name": "Templater", - "version": "1.8.1", - "description": "Create and use templates", - "minAppVersion": "0.11.13", - "author": "SilentVoid", - "authorUrl": "https://github.com/SilentVoid13", - "isDesktopOnly": false -} diff --git a/.obsidian/plugins/templater-obsidian/styles.css b/.obsidian/plugins/templater-obsidian/styles.css deleted file mode 100644 index 968074995..000000000 --- a/.obsidian/plugins/templater-obsidian/styles.css +++ /dev/null @@ -1,256 +0,0 @@ -.templater_div { - border-top: 1px solid var(--background-modifier-border); -} - -.templater_div > .setting-item { - border-top: none !important; - align-self: center; -} - -.templater_div > .setting-item > .setting-item-control { - justify-content: space-around; - padding: 0; - width: 100%; -} - -.templater_div > .setting-item > .setting-item-control > .setting-editor-extra-setting-button { - align-self: center; -} - -.templater_title { - margin: 0; - padding: 0; - margin-top: 5px; - text-align: center; -} - -.templater_template { - align-self: center; - margin-left: 5px; - margin-right: 5px; - width: 70%; -} - -.templater_cmd { - margin-left: 5px; - margin-right: 5px; - font-size: 14px; - width: 100%; -} - -.templater_div2 > .setting-item { - align-content: center; - justify-content: center; -} - -.templater_button:hover { - background-color: #00496A !important; -} - -.templater-prompt-div { - display: flex; -} - -.templater-prompt-form { - display: flex; - flex-grow: 1; -} - -.templater-prompt-input { - flex-grow: 1; -} - - - - -.cm-s-obsidian .templater-command-bg { - left: 0px; - right: 0px; - background-color: var(--background-primary-alt); -} - -.cm-s-obsidian .cm-templater-command{ - color: #d4d4d4; - font-size: 0.85em; - font-family: var(--font-monospace); - line-height: 1.3; -} - -.cm-s-obsidian .templater-inline .cm-templater-command { - background-color: var(--background-primary-alt); -} - -.cm-s-obsidian .cm-templater-command.cm-templater-opening-tag { - font-weight: bold; -} - -.cm-s-obsidian .cm-templater-command.cm-templater-closing-tag { - font-weight: bold; -} - -.cm-s-obsidian .cm-templater-command.cm-templater-interpolation-tag { - color: #008BFF; -} - -.cm-s-obsidian .cm-templater-command.cm-templater-execution-tag { - color: #C0D700; -} - -.cm-s-obsidian .cm-templater-command.cm-templater-raw-tag { - color: green; -} - -.cm-s-obsidian .cm-templater-command.cm-keyword { - color: #00A7AA; - font-weight: normal; -} - - -.cm-s-obsidian .cm-templater-command.cm-atom { - color: #F39B35; -} - - -.cm-s-obsidian .cm-templater-command.cm-number { - color: #A06FCA; -} - - -.cm-s-obsidian .cm-templater-command.cm-type { - color: #A06FCA; -} - - -.cm-s-obsidian .cm-templater-command.cm-def { - color: #98E342; -} - - -.cm-s-obsidian .cm-templater-command.cm-property { - color: #D4D4D4; -} - - -.cm-s-obsidian .cm-templater-command.cm-variable { - color: #D4D4D4; -} - - -.cm-s-obsidian .cm-templater-command.cm-variable-2 { - color: #da7dae; -} - - -.cm-s-obsidian .cm-templater-command.cm-variable-3 { - color: #A06FCA; -} - - -.cm-s-obsidian .cm-templater-command.cm-type.cm-def { - color: #FC4384; -} - - -.cm-s-obsidian .cm-templater-command.cm-property.cm-def { - color: #FC4384; -} - - -.cm-s-obsidian .cm-templater-command.cm-callee { - color: #FC4384; -} - - -.cm-s-obsidian .cm-templater-command.cm-operator { - color: #FC4384; -} - - -.cm-s-obsidian .cm-templater-command.cm-qualifier { - color: #FC4384; -} - - -.cm-s-obsidian .cm-templater-command.cm-tag { - color: #FC4384; -} - - -.cm-s-obsidian .cm-templater-command.cm-tag.cm-bracket { - color: #D4D4D4; -} - - -.cm-s-obsidian .cm-templater-command.cm-attribute { - color: #A06FCA; -} - - -.cm-s-obsidian .cm-templater-command.cm-comment { - color: #696d70; -} - - -.cm-s-obsidian .cm-templater-command.cm-comment.cm-tag { - color: #FC4384; -} - - -.cm-s-obsidian .cm-templater-command.cm-comment.cm-attribute { - color: #D4D4D4; -} - - -.cm-s-obsidian .cm-templater-command.cm-string { - color: #E6DB74; -} - - -.cm-s-obsidian .cm-templater-command.cm-string-2 { - color: #F39B35; -} - - -.cm-s-obsidian .cm-templater-command.cm-meta { - color: #D4D4D4; - background: inherit; -} - - -.cm-s-obsidian .cm-templater-command.cm-builtin { - color: #FC4384; -} - - -.cm-s-obsidian .cm-templater-command.cm-header { - color: #da7dae; -} - - -.cm-s-obsidian .cm-templater-command.cm-hr { - color: #98E342; -} - - -.cm-s-obsidian .cm-templater-command.cm-link { - color: #696d70; -} - - -.cm-s-obsidian .cm-templater-command.cm-error { - border-bottom: 1px solid #C42412; -} - - -.cm-s-obsidian pre.HyperMD-codeblock .cm-keyword { - font-weight: normal; -} - -.cm-s-obsidian .cm-templater-command.CodeMirror-activeline-background { - background: #272727; -} - -.cm-s-obsidian .cm-templater-command.CodeMirror-matchingbracket { - outline: 1px solid grey; - color: #D4D4D4 !important; -} diff --git a/.obsidian/starred.json b/.obsidian/starred.json deleted file mode 100644 index 5d1e6f103..000000000 --- a/.obsidian/starred.json +++ /dev/null @@ -1 +0,0 @@ -{"items":[{"type":"file","title":"flancia collective","path":"flancia collective.md"}]} \ No newline at end of file diff --git a/.obsidian/workspace b/.obsidian/workspace deleted file mode 100644 index e3398093f..000000000 --- a/.obsidian/workspace +++ /dev/null @@ -1,434 +0,0 @@ -{ - "main": { - "id": "dfd308004f3fc7b5", - "type": "split", - "children": [ - { -<<<<<<< HEAD - "id": "dfca63b6438bb043", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "book.md", - "mode": "source" - } - } - }, - { - "id": "daf2cbd4f904097f", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "2021-07-04.md", - "mode": "source" - } - } - }, - { - "id": "8f8a26d73243fcd4", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "agora social media integration.md", - "mode": "source" - } - } - }, - { - "id": "a9652862b141b584", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "2021-07-04.md", - "mode": "source" - } - } - }, - { - "id": "e35c7985c4116762", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "deta.md", - "mode": "source" - } - } - }, - { - "id": "bd5278bb18646798", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "web native.md", - "mode": "source" - } - } - }, - { - "id": "54b3b17b599c494f", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "cloud computer.md", - "mode": "source" - } - } - }, - { - "id": "253742e9df381de2", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "2021-07-04.md", - "mode": "source" - } - } - }, - { - "id": "e37fe7256c0fa8db", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "wikipedia.md", - "mode": "source" - } - } - }, - { - "id": "ffee18e4b059aea4", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "2021-07-07.md", - "mode": "source" - } - } - }, - { - "id": "dc48b62f3dfe1e38", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "2021-07-06.md", - "mode": "source" - } - } - }, - { - "id": "339f9c924bf4e2fb", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "2021-07-08.md", - "mode": "source" - } - } - }, - { - "id": "c74f05c0266decce", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "2021-07-10.md", - "mode": "source" - } - } - }, - { - "id": "9b68ae9b83a078cc", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "flancian.md", - "mode": "source" - } - } - }, - { - "id": "e91d03c32f5dc547", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "agora bot.md", - "mode": "source" -======= - "id": "11cbe105accfc77d", - "type": "split", - "children": [ - { - "id": "63f809452cff7c43", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "2021-07-05.md", - "mode": "source" - } - } - }, - { - "id": "7050f5d245741dcd", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "chelsea hotel.md", - "mode": "source" - } - } - }, - { - "id": "6bf5733da4a61bdc", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "conflict-files-obsidian-git.md", - "mode": "source" - } - } ->>>>>>> 2502de31c7b1b954aedee99b8de4a6511c3f0220 - } - ], - "direction": "horizontal" - }, - { - "id": "102fe6accb268a77", - "type": "split", - "children": [ - { - "id": "ac5f7b266c2a5153", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "2021-07-09.md", - "mode": "source" - } - } - }, - { - "id": "490263fbb1804ee5", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "sundar pichai.md", - "mode": "source" - } - } - }, - { - "id": "26c9647cf3a2b0e4", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "pyinstrument.md", - "mode": "source" - } - } - } - ], - "direction": "horizontal" - }, - { - "id": "55e7708b4a1b5ace", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "2021-07-09.md", - "mode": "source" - } - } - }, - { - "id": "d797072e4f60237e", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "enough about human rights.md", - "mode": "source" - } - } - }, - { - "id": "4c6ff7bb411b67a6", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "what about human rights.md", - "mode": "source" - } - } - }, - { - "id": "80fe0d9f20ae4908", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "mondegreens.md", - "mode": "source" - } - } - }, - { - "id": "c9cab91c10439f0b", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "human rights.md", - "mode": "source" - } - } - } - ], - "direction": "vertical" - }, - "left": { - "id": "2faba265b9292c7f", - "type": "split", - "children": [ - { - "id": "f510565592a031af", - "type": "tabs", - "children": [ - { - "id": "961d680309b2af56", - "type": "leaf", - "state": { - "type": "file-explorer", - "state": {} - } - }, - { - "id": "4c9c5d93a7ed714f", - "type": "leaf", - "state": { - "type": "search", - "state": { - "query": "hyperbee", - "matchingCase": false, - "explainSearch": false, - "collapseAll": false, - "extraContext": false, - "sortOrder": "byModifiedTime" - } - } - }, - { - "id": "8af6596dc98ffa6b", - "type": "leaf", - "state": { - "type": "starred", - "state": {} - } - }, - { - "id": "aa0f3e910050164c", - "type": "leaf", - "state": { - "type": "empty", - "state": {} - } - } - ], - "currentTab": 1 - } - ], - "direction": "horizontal", - "width": 300, - "collapsed": true - }, - "right": { - "id": "afe2921ea1b550bb", - "type": "split", - "children": [ - { - "id": "769f8c6855cce1d4", - "type": "tabs", - "children": [ - { - "id": "30e969c9166f9896", - "type": "leaf", - "state": { - "type": "backlink", - "state": { - "file": "sundar pichai.md", - "collapseAll": false, - "extraContext": false, - "sortOrder": "alphabetical", - "showSearch": false, - "searchQuery": "", - "backlinkCollapsed": false, - "unlinkedCollapsed": false - } - } - }, - { - "id": "a62fc60423ac06f4", - "type": "leaf", - "state": { - "type": "outline", - "state": { - "file": "sundar pichai.md" - } - } - } - ], - "currentTab": 1 - } - ], - "direction": "horizontal", - "width": 300, - "collapsed": true - }, -<<<<<<< HEAD - "active": "9b68ae9b83a078cc", - "lastOpenFiles": [ - "flancian.md", - "2021-07-10.md", - "brian mock.md", - "opening design.md", - "bmock.md", - "2021-07-08.md", - "2021-07-06.md", - "2021-07-07.md", - "agora bot.md", - "would you agree.md" -======= - "active": "490263fbb1804ee5", - "lastOpenFiles": [ - "sundar pichai.md", - "mondegreens.md", - "what about human rights.md", - "enough about human rights.md", - "2021-07-09.md", - "moondog.md", - "conflict-files-obsidian-git.md", - "pyinstrument.md", - "luciana.md", - "human rights.md" ->>>>>>> 2502de31c7b1b954aedee99b8de4a6511c3f0220 - ] -} \ No newline at end of file diff --git a/.obsidian/workspaces.json b/.obsidian/workspaces.json deleted file mode 100644 index faa7e4484..000000000 --- a/.obsidian/workspaces.json +++ /dev/null @@ -1 +0,0 @@ -{"agora":{"main":{"id":"dfd308004f3fc7b5","type":"split","children":[{"id":"b0a62e0bd6f30307","type":"split","children":[{"id":"90ec1eb033ec1a7c","type":"split","dimension":18.96272285251215,"children":[{"id":"ae59c49b3be42d7f","type":"leaf","state":{"type":"markdown","state":{"file":"governing the commons.md","mode":"source"}}},{"id":"0444216a0f31d5d1","type":"leaf","state":{"type":"markdown","state":{"file":"understanding knowledge as a commons.md","mode":"source"}}}],"direction":"vertical"},{"id":"68655dfd854fce90","type":"leaf","dimension":8.103727714748784,"state":{"type":"markdown","state":{"file":"2021-05-24.md","mode":"source"}}},{"id":"c4752dfca35c9509","type":"leaf","dimension":8.103727714748784,"state":{"type":"markdown","state":{"file":"gardens yaml.md","mode":"source"}}},{"id":"71bcc08f992c1744","type":"leaf","dimension":4.051863857374392,"state":{"type":"markdown","state":{"file":"2021-05-23.md","mode":"source"}}},{"id":"337a1c686e22dffb","type":"leaf","dimension":4.051863857374392,"state":{"type":"markdown","state":{"file":"frenemy.md","mode":"source"}}},{"id":"da45d66f5e0ac103","type":"leaf","dimension":8.103727714748784,"state":{"type":"markdown","state":{"file":"⚒.md","mode":"source"}}},{"id":"ecc917675c91e32d","type":"split","dimension":16.207455429497568,"children":[{"id":"efc285d04f618479","type":"leaf","state":{"type":"markdown","state":{"file":"2021-05-23.md","mode":"source"}}},{"id":"6ba9caa682be390e","type":"leaf","state":{"type":"markdown","state":{"file":"frenemy.md","mode":"source"}}},{"id":"670129a9354029db","type":"leaf","state":{"type":"markdown","state":{"file":"entropy.md","mode":"source"}}},{"id":"9631110cf24fec61","type":"leaf","state":{"type":"markdown","state":{"file":"state of higher order.md","mode":"source"}}},{"id":"ec6cb93f833f0a75","type":"leaf","state":{"type":"markdown","state":{"file":"obsidian plugins.md","mode":"source"}}}],"direction":"vertical"},{"id":"089feb5db4c29e31","type":"split","dimension":16.207455429497568,"children":[{"id":"d751188de77a3616","type":"leaf","state":{"type":"markdown","state":{"file":"trailmarks.md","mode":"source"}}},{"id":"05b8e43845695140","type":"leaf","state":{"type":"markdown","state":{"file":"atjson.md","mode":"source"}}}],"direction":"vertical"},{"id":"17cf41804b8b958d","type":"split","dimension":16.207455429497568,"children":[{"id":"0d5997891e905142","type":"leaf","state":{"type":"markdown","state":{"file":"kenzo tange.md","mode":"source"}}},{"id":"5dc5619fc0398c10","type":"leaf","state":{"type":"markdown","state":{"file":"kraftwerk 1.md","mode":"source"}}}],"direction":"vertical"}],"direction":"horizontal"}],"direction":"vertical"},"left":{"id":"2faba265b9292c7f","type":"split","children":[{"id":"f510565592a031af","type":"tabs","children":[{"id":"961d680309b2af56","type":"leaf","state":{"type":"file-explorer","state":{}}},{"id":"4c9c5d93a7ed714f","type":"leaf","state":{"type":"search","state":{"query":"arcosanti","matchingCase":false,"explainSearch":false,"collapseAll":false,"extraContext":false,"sortOrder":"byModifiedTime"}}},{"id":"8af6596dc98ffa6b","type":"leaf","state":{"type":"starred","state":{}}},{"id":"aa0f3e910050164c","type":"leaf","state":{"type":"recent-files","state":{}}}]}],"direction":"horizontal","width":300},"right":{"id":"afe2921ea1b550bb","type":"split","children":[{"id":"769f8c6855cce1d4","type":"tabs","children":[{"id":"30e969c9166f9896","type":"leaf","state":{"type":"backlink","state":{"file":"gardens yaml.md","collapseAll":false,"extraContext":false,"sortOrder":"alphabetical","showSearch":false,"searchQuery":"","backlinkCollapsed":false,"unlinkedCollapsed":true}}},{"id":"a62fc60423ac06f4","type":"leaf","state":{"type":"outline","state":{"file":"gardens yaml.md"}}},{"id":"eaa7f99b4cf5444a","type":"leaf","state":{"type":"online.larslockefeer.obsidian-plugin-todo","state":{}}}]},{"id":"9852b3b70c9ace3c","type":"tabs","children":[{"id":"ba82168a0acbacba","type":"leaf","state":{"type":"todo","state":{}}}]}],"direction":"horizontal","width":300,"collapsed":true},"active":"c4752dfca35c9509"},"flancia collective":{"main":{"id":"dfd308004f3fc7b5","type":"split","children":[{"id":"b0a62e0bd6f30307","type":"split","children":[{"id":"90ec1eb033ec1a7c","type":"split","dimension":25.053533190578154,"children":[{"id":"ae59c49b3be42d7f","type":"leaf","state":{"type":"markdown","state":{"file":"2021-05-27.md","mode":"source"}}},{"id":"d75f39b25bc4b4a1","type":"leaf","state":{"type":"markdown","state":{"file":"2021-05-28.md","mode":"source"}}},{"id":"5413f6c812fb75da","type":"leaf","state":{"type":"markdown","state":{"file":"2021-05-28.md","mode":"source"}}},{"id":"0444216a0f31d5d1","type":"leaf","state":{"type":"markdown","state":{"file":"understanding knowledge as a commons.md","mode":"source"}}}],"direction":"vertical"},{"id":"9fbfa674c16badc8","type":"split","dimension":21.413276231263385,"children":[{"id":"c3c23903473fb852","type":"leaf","state":{"type":"markdown","state":{"file":"2021-05-27.md","mode":"source"}}},{"id":"428e0a2228a7d29c","type":"leaf","state":{"type":"markdown","state":{"file":"tools for thought interchange.md","mode":"source"}}},{"id":"68655dfd854fce90","type":"leaf","state":{"type":"markdown","state":{"file":"distributed press.md","mode":"source"}}}],"direction":"vertical"},{"id":"337a1c686e22dffb","type":"leaf","dimension":5.353319057815846,"state":{"type":"markdown","state":{"file":"2021-05-28.md","mode":"source"}}},{"id":"81312818f4299cce","type":"leaf","dimension":5.353319057815846,"state":{"type":"markdown","state":{"file":"subtext.md","mode":"source"}}},{"id":"ecc917675c91e32d","type":"split","dimension":21.413276231263385,"children":[{"id":"6ba9caa682be390e","type":"leaf","state":{"type":"markdown","state":{"file":"frenemy.md","mode":"source"}}},{"id":"670129a9354029db","type":"leaf","state":{"type":"markdown","state":{"file":"entropy.md","mode":"source"}}},{"id":"9631110cf24fec61","type":"leaf","state":{"type":"markdown","state":{"file":"state of higher order.md","mode":"source"}}},{"id":"ec6cb93f833f0a75","type":"leaf","state":{"type":"markdown","state":{"file":"obsidian plugins.md","mode":"source"}}}],"direction":"vertical"},{"id":"17cf41804b8b958d","type":"split","dimension":21.413276231263385,"children":[{"id":"0d5997891e905142","type":"leaf","state":{"type":"markdown","state":{"file":"kenzo tange.md","mode":"source"}}},{"id":"5dc5619fc0398c10","type":"leaf","state":{"type":"markdown","state":{"file":"kraftwerk 1.md","mode":"source"}}}],"direction":"vertical"}],"direction":"horizontal"}],"direction":"vertical"},"left":{"id":"2faba265b9292c7f","type":"split","children":[{"id":"f510565592a031af","type":"tabs","children":[{"id":"961d680309b2af56","type":"leaf","state":{"type":"file-explorer","state":{}}},{"id":"4c9c5d93a7ed714f","type":"leaf","state":{"type":"search","state":{"query":"arcosanti","matchingCase":false,"explainSearch":false,"collapseAll":false,"extraContext":false,"sortOrder":"byModifiedTime"}}},{"id":"8af6596dc98ffa6b","type":"leaf","state":{"type":"starred","state":{}}},{"id":"aa0f3e910050164c","type":"leaf","state":{"type":"recent-files","state":{}}}]}],"direction":"horizontal","width":300},"right":{"id":"afe2921ea1b550bb","type":"split","children":[{"id":"769f8c6855cce1d4","type":"tabs","children":[{"id":"30e969c9166f9896","type":"leaf","state":{"type":"backlink","state":{"file":"2021-05-28.md","collapseAll":false,"extraContext":false,"sortOrder":"alphabetical","showSearch":false,"searchQuery":"","backlinkCollapsed":false,"unlinkedCollapsed":true}}},{"id":"a62fc60423ac06f4","type":"leaf","state":{"type":"outline","state":{"file":"2021-05-28.md"}}},{"id":"eaa7f99b4cf5444a","type":"leaf","state":{"type":"online.larslockefeer.obsidian-plugin-todo","state":{}}}]},{"id":"9852b3b70c9ace3c","type":"tabs","children":[{"id":"ba82168a0acbacba","type":"leaf","state":{"type":"todo","state":{}}}]}],"direction":"horizontal","width":300,"collapsed":true},"active":"5413f6c812fb75da"},"agora development":{"main":{"id":"dfd308004f3fc7b5","type":"split","children":[{"id":"b0a62e0bd6f30307","type":"split","children":[{"id":"71bcc08f992c1744","type":"leaf","dimension":19.166267369429804,"state":{"type":"markdown","state":{"file":"2021-05-24.md","mode":"source"}}},{"id":"f326c43552391e82","type":"leaf","dimension":23.334930522280775,"state":{"type":"markdown","state":{"file":"agora prs.md","mode":"source"}}},{"id":"cb4a7ecfe458321a","type":"leaf","dimension":19.166267369429804,"state":{"type":"markdown","state":{"file":"neos.md","mode":"source"}}},{"id":"05b8e43845695140","type":"leaf","dimension":38.33253473885961,"state":{"type":"markdown","state":{"file":"atjson.md","mode":"source"}}}],"direction":"horizontal"}],"direction":"vertical"},"left":{"id":"2faba265b9292c7f","type":"split","children":[{"id":"f510565592a031af","type":"tabs","children":[{"id":"961d680309b2af56","type":"leaf","state":{"type":"file-explorer","state":{}}},{"id":"4c9c5d93a7ed714f","type":"leaf","state":{"type":"search","state":{"query":"arcosanti","matchingCase":false,"explainSearch":false,"collapseAll":false,"extraContext":false,"sortOrder":"byModifiedTime"}}},{"id":"8af6596dc98ffa6b","type":"leaf","state":{"type":"starred","state":{}}},{"id":"aa0f3e910050164c","type":"leaf","state":{"type":"recent-files","state":{}}}]}],"direction":"horizontal","width":300},"right":{"id":"afe2921ea1b550bb","type":"split","children":[{"id":"769f8c6855cce1d4","type":"tabs","children":[{"id":"30e969c9166f9896","type":"leaf","state":{"type":"backlink","state":{"file":"agora prs.md","collapseAll":false,"extraContext":false,"sortOrder":"alphabetical","showSearch":false,"searchQuery":"","backlinkCollapsed":false,"unlinkedCollapsed":true}}},{"id":"a62fc60423ac06f4","type":"leaf","state":{"type":"outline","state":{"file":"agora prs.md"}}},{"id":"eaa7f99b4cf5444a","type":"leaf","state":{"type":"online.larslockefeer.obsidian-plugin-todo","state":{}}}]},{"id":"9852b3b70c9ace3c","type":"tabs","children":[{"id":"ba82168a0acbacba","type":"leaf","state":{"type":"todo","state":{}}}]}],"direction":"horizontal","width":300,"collapsed":true},"active":"f326c43552391e82"},"agora 2":{"main":{"id":"dfd308004f3fc7b5","type":"split","children":[{"id":"b0a62e0bd6f30307","type":"split","children":[{"id":"90ec1eb033ec1a7c","type":"split","dimension":36.90851735015773,"children":[{"id":"ae59c49b3be42d7f","type":"leaf","state":{"type":"markdown","state":{"file":"governing the commons.md","mode":"source"}}},{"id":"0444216a0f31d5d1","type":"leaf","state":{"type":"markdown","state":{"file":"understanding knowledge as a commons.md","mode":"source"}}}],"direction":"vertical"},{"id":"ecc917675c91e32d","type":"split","dimension":31.54574132492114,"children":[{"id":"efc285d04f618479","type":"leaf","state":{"type":"markdown","state":{"file":"2021-05-28.md","mode":"source"}}},{"id":"ec6cb93f833f0a75","type":"leaf","state":{"type":"markdown","state":{"file":"obsidian plugins.md","mode":"source"}}}],"direction":"vertical"},{"id":"089feb5db4c29e31","type":"split","dimension":31.54574132492114,"children":[{"id":"d751188de77a3616","type":"leaf","state":{"type":"markdown","state":{"file":"trailmarks.md","mode":"source"}}},{"id":"172d4c60007a6d72","type":"leaf","state":{"type":"markdown","state":{"file":"blaine.md","mode":"source"}}}],"direction":"vertical"}],"direction":"horizontal"}],"direction":"vertical"},"left":{"id":"2faba265b9292c7f","type":"split","children":[{"id":"f510565592a031af","type":"tabs","children":[{"id":"961d680309b2af56","type":"leaf","state":{"type":"file-explorer","state":{}}},{"id":"4c9c5d93a7ed714f","type":"leaf","state":{"type":"search","state":{"query":"arcosanti","matchingCase":false,"explainSearch":false,"collapseAll":false,"extraContext":false,"sortOrder":"byModifiedTime"}}},{"id":"8af6596dc98ffa6b","type":"leaf","state":{"type":"starred","state":{}}},{"id":"aa0f3e910050164c","type":"leaf","state":{"type":"recent-files","state":{}}}]}],"direction":"horizontal","width":300},"right":{"id":"afe2921ea1b550bb","type":"split","children":[{"id":"769f8c6855cce1d4","type":"tabs","children":[{"id":"30e969c9166f9896","type":"leaf","state":{"type":"backlink","state":{"file":"blaine.md","collapseAll":false,"extraContext":false,"sortOrder":"alphabetical","showSearch":false,"searchQuery":"","backlinkCollapsed":false,"unlinkedCollapsed":true}}},{"id":"a62fc60423ac06f4","type":"leaf","state":{"type":"outline","state":{"file":"blaine.md"}}},{"id":"eaa7f99b4cf5444a","type":"leaf","state":{"type":"online.larslockefeer.obsidian-plugin-todo","state":{}}}]},{"id":"9852b3b70c9ace3c","type":"tabs","children":[{"id":"ba82168a0acbacba","type":"leaf","state":{"type":"todo","state":{}}}]}],"direction":"horizontal","width":300,"collapsed":true},"active":"172d4c60007a6d72"},"do":{"main":{"id":"dfd308004f3fc7b5","type":"split","children":[{"id":"b0a62e0bd6f30307","type":"split","children":[{"id":"90ec1eb033ec1a7c","type":"split","dimension":34.172118772018116,"children":[{"id":"ae59c49b3be42d7f","type":"leaf","state":{"type":"markdown","state":{"file":"governing the commons.md","mode":"source"}}},{"id":"0444216a0f31d5d1","type":"leaf","state":{"type":"markdown","state":{"file":"understanding knowledge as a commons.md","mode":"source"}}}],"direction":"vertical"},{"id":"2df69b5c8478290b","type":"leaf","dimension":10.065425264217414,"state":{"type":"markdown","state":{"file":"2021-05-30.md","mode":"source"}}},{"id":"53245870fcf147df","type":"leaf","dimension":22.34524408656266,"state":{"type":"markdown","state":{"file":"kneaver.md","mode":"source"}}},{"id":"30cd4e245d7e1c6d","type":"leaf","dimension":10.065425264217414,"state":{"type":"markdown","state":{"file":"category theory basics.md","mode":"source"}}},{"id":"089feb5db4c29e31","type":"split","dimension":23.351786612984398,"children":[{"id":"d751188de77a3616","type":"leaf","state":{"type":"markdown","state":{"file":"trailmarks.md","mode":"source"}}},{"id":"172d4c60007a6d72","type":"leaf","state":{"type":"markdown","state":{"file":"blaine.md","mode":"source"}}},{"id":"ec6cb93f833f0a75","type":"leaf","state":{"type":"markdown","state":{"file":"obsidian plugins.md","mode":"source"}}}],"direction":"vertical"}],"direction":"horizontal"}],"direction":"vertical"},"left":{"id":"2faba265b9292c7f","type":"split","children":[{"id":"f510565592a031af","type":"tabs","children":[{"id":"961d680309b2af56","type":"leaf","state":{"type":"file-explorer","state":{}}},{"id":"4c9c5d93a7ed714f","type":"leaf","state":{"type":"search","state":{"query":"arcosanti","matchingCase":false,"explainSearch":false,"collapseAll":false,"extraContext":false,"sortOrder":"byModifiedTime"}}},{"id":"8af6596dc98ffa6b","type":"leaf","state":{"type":"starred","state":{}}},{"id":"aa0f3e910050164c","type":"leaf","state":{"type":"recent-files","state":{}}}]}],"direction":"horizontal","width":300},"right":{"id":"afe2921ea1b550bb","type":"split","children":[{"id":"769f8c6855cce1d4","type":"tabs","children":[{"id":"30e969c9166f9896","type":"leaf","state":{"type":"backlink","state":{"file":"kneaver.md","collapseAll":false,"extraContext":false,"sortOrder":"alphabetical","showSearch":false,"searchQuery":"","backlinkCollapsed":false,"unlinkedCollapsed":true}}},{"id":"a62fc60423ac06f4","type":"leaf","state":{"type":"outline","state":{"file":"kneaver.md"}}},{"id":"eaa7f99b4cf5444a","type":"leaf","state":{"type":"online.larslockefeer.obsidian-plugin-todo","state":{}}}]},{"id":"9852b3b70c9ace3c","type":"tabs","children":[{"id":"ba82168a0acbacba","type":"leaf","state":{"type":"todo","state":{}}}]}],"direction":"horizontal","width":300,"collapsed":true},"active":"53245870fcf147df"},"category theory":{"main":{"id":"dfd308004f3fc7b5","type":"split","children":[{"id":"b0a62e0bd6f30307","type":"split","children":[{"id":"c13b08cfbe25cf0e","type":"leaf","dimension":10.683760683760683,"state":{"type":"markdown","state":{"file":"2021-05-30.md","mode":"source"}}},{"id":"9d1767dbb6c4ba74","type":"leaf","dimension":18.856837606837605,"state":{"type":"markdown","state":{"file":"break glass.md","mode":"source"}}},{"id":"7abcb8972baaed4d","type":"leaf","dimension":17.04059829059829,"state":{"type":"markdown","state":{"file":"obsidian embeds.md","mode":"source"}}},{"id":"2af582f84f5b5597","type":"leaf","dimension":8.520299145299145,"state":{"type":"markdown","state":{"file":"Day Planners/Day Planner-20210530.md","mode":"source"}}},{"id":"d07a3172fe4185d0","type":"leaf","dimension":8.520299145299145,"state":{"type":"markdown","state":{"file":"obsidian embeds.md","mode":"source"}}},{"id":"30cd4e245d7e1c6d","type":"leaf","dimension":36.378205128205124,"state":{"type":"markdown","state":{"file":"category theory basics.md","mode":"source"}}}],"direction":"horizontal"}],"direction":"vertical"},"left":{"id":"2faba265b9292c7f","type":"split","children":[{"id":"f510565592a031af","type":"tabs","children":[{"id":"961d680309b2af56","type":"leaf","state":{"type":"file-explorer","state":{}}},{"id":"4c9c5d93a7ed714f","type":"leaf","state":{"type":"search","state":{"query":"arcosanti","matchingCase":false,"explainSearch":false,"collapseAll":false,"extraContext":false,"sortOrder":"byModifiedTime"}}},{"id":"8af6596dc98ffa6b","type":"leaf","state":{"type":"starred","state":{}}},{"id":"aa0f3e910050164c","type":"leaf","state":{"type":"recent-files","state":{}}}]}],"direction":"horizontal","width":300},"right":{"id":"afe2921ea1b550bb","type":"split","children":[{"id":"769f8c6855cce1d4","type":"tabs","children":[{"id":"30e969c9166f9896","type":"leaf","state":{"type":"backlink","state":{"file":"category theory basics.md","collapseAll":false,"extraContext":false,"sortOrder":"alphabetical","showSearch":false,"searchQuery":"","backlinkCollapsed":false,"unlinkedCollapsed":true}}},{"id":"a62fc60423ac06f4","type":"leaf","state":{"type":"outline","state":{"file":"category theory basics.md"}}},{"id":"eaa7f99b4cf5444a","type":"leaf","state":{"type":"online.larslockefeer.obsidian-plugin-todo","state":{}}},{"id":"49a0eb72df05c98e","type":"leaf","state":{"type":"online.tokuhirom.obsidian-pomodoro-plugin","state":{}}}]},{"id":"9852b3b70c9ace3c","type":"tabs","children":[{"id":"ba82168a0acbacba","type":"leaf","state":{"type":"todo","state":{}}}]}],"direction":"horizontal","width":300,"collapsed":true},"active":"30cd4e245d7e1c6d"},"2021-06-27":{"main":{"id":"dfd308004f3fc7b5","type":"split","children":[{"id":"3bfe038a60be769c","type":"split","children":[{"id":"4d2c9bb987354b46","type":"leaf","state":{"type":"markdown","state":{"file":"annotation and the social prize of educational dignity.md","mode":"source"}}},{"id":"590578daf8557796","type":"leaf","state":{"type":"markdown","state":{"file":"agora protocol.md","mode":"source"}}},{"id":"e2fd479dac4cc7f8","type":"leaf","state":{"type":"markdown","state":{"file":"longer stoa ids.md","mode":"source"}}},{"id":"d98c2e9bc17c8db2","type":"leaf","state":{"type":"markdown","state":{"file":"agora bot.md","mode":"source"}}},{"id":"dfc2f541eefdae1b","type":"leaf","state":{"type":"markdown","state":{"file":"2021-06-26.md","mode":"source"}}},{"id":"cc6bd96d8868adeb","type":"leaf","state":{"type":"markdown","state":{"file":"music.md","mode":"source"}}},{"id":"a55acac86a1abe3b","type":"leaf","state":{"type":"markdown","state":{"file":"2021-06-26.md","mode":"source"}}},{"id":"0f1f62cb23a13a53","type":"leaf","state":{"type":"markdown","state":{"file":"nathanael gould.md","mode":"source"}}},{"id":"f2e6147dbff32040","type":"leaf","state":{"type":"markdown","state":{"file":"true names.md","mode":"source"}}},{"id":"99faa5bee7cb9f37","type":"leaf","state":{"type":"markdown","state":{"file":"2021-06-25.md","mode":"source"}}},{"id":"0bbe8bf907adf9e2","type":"leaf","state":{"type":"markdown","state":{"file":"robert haisfield.md","mode":"source"}}},{"id":"980c89f10d36ef35","type":"leaf","state":{"type":"markdown","state":{"file":"wayback machine.md","mode":"source"}}},{"id":"d346849c59daf3d4","type":"leaf","state":{"type":"markdown","state":{"file":"wittgenstein protocol.md","mode":"source"}}},{"id":"898872c0199461f5","type":"leaf","state":{"type":"markdown","state":{"file":"entities.md","mode":"source"}}},{"id":"168e2760bc0ce560","type":"leaf","state":{"type":"markdown","state":{"file":"agora protocol.md","mode":"source"}}},{"id":"77364a0d4ddc7532","type":"leaf","state":{"type":"markdown","state":{"file":"speculative annotation.md","mode":"source"}}}],"direction":"horizontal"},{"id":"d3f385bce0528452","type":"split","children":[{"id":"cf8d8524ad11eb6d","type":"leaf","dimension":8.00640512409928,"state":{"type":"markdown","state":{"file":"2021-06-25.md","mode":"source"}}},{"id":"f7ea52c649b950ec","type":"leaf","dimension":13.350680544435548,"state":{"type":"markdown","state":{"file":"i annotate 2021.md","mode":"source"}}},{"id":"3616f77ac4f832e3","type":"leaf","dimension":6.675340272217774,"state":{"type":"markdown","state":{"file":"social learning across content.md","mode":"source"}}},{"id":"2be0d01305125f7c","type":"leaf","dimension":6.675340272217774,"state":{"type":"markdown","state":{"file":"libretexts.md","mode":"source"}}},{"id":"bb82155223123138","type":"leaf","dimension":13.230584467574058,"state":{"type":"markdown","state":{"file":"2021-06-25.md","mode":"source"}}},{"id":"423b078478e42fb7","type":"leaf","dimension":13.230584467574058,"state":{"type":"markdown","state":{"file":"vera.md","mode":"source"}}},{"id":"24eff1ed32e0f862","type":"leaf","dimension":9.407526020816654,"state":{"type":"markdown","state":{"file":"building annotation into browsers.md","mode":"source"}}},{"id":"5257defb68122b92","type":"leaf","dimension":8.00640512409928,"state":{"type":"markdown","state":{"file":"the future of note taking.md","mode":"source"}}},{"id":"9d824460cfbb9b1e","type":"leaf","dimension":8.00640512409928,"state":{"type":"markdown","state":{"file":"hathitrust.md","mode":"source"}}},{"id":"ad9f8a4c030a8a46","type":"leaf","dimension":13.410728582866293,"state":{"type":"markdown","state":{"file":"frankenbook.md","mode":"source"}}}],"direction":"horizontal"}],"direction":"vertical"},"left":{"id":"2faba265b9292c7f","type":"split","children":[{"id":"f510565592a031af","type":"tabs","children":[{"id":"961d680309b2af56","type":"leaf","state":{"type":"file-explorer","state":{}}},{"id":"4c9c5d93a7ed714f","type":"leaf","state":{"type":"search","state":{"query":"hyperbee","matchingCase":false,"explainSearch":false,"collapseAll":false,"extraContext":false,"sortOrder":"byModifiedTime"}}},{"id":"8af6596dc98ffa6b","type":"leaf","state":{"type":"starred","state":{}}},{"id":"aa0f3e910050164c","type":"leaf","state":{"type":"empty","state":{}}}],"currentTab":1}],"direction":"horizontal","width":300,"collapsed":true},"right":{"id":"afe2921ea1b550bb","type":"split","children":[{"id":"769f8c6855cce1d4","type":"tabs","children":[{"id":"30e969c9166f9896","type":"leaf","state":{"type":"backlink","state":{"file":"i annotate 2021.md","collapseAll":false,"extraContext":false,"sortOrder":"alphabetical","showSearch":false,"searchQuery":"","backlinkCollapsed":false,"unlinkedCollapsed":true}}},{"id":"a62fc60423ac06f4","type":"leaf","state":{"type":"outline","state":{"file":"i annotate 2021.md"}}},{"id":"eaa7f99b4cf5444a","type":"leaf","state":{"type":"empty","state":{}}},{"id":"49a0eb72df05c98e","type":"leaf","state":{"type":"empty","state":{}}}],"currentTab":3},{"id":"9852b3b70c9ace3c","type":"tabs","children":[{"id":"ba82168a0acbacba","type":"leaf","state":{"type":"empty","state":{}}}]},{"id":"297c54846b597552","type":"tabs","children":[{"id":"35550c211233c6a5","type":"leaf","state":{"type":"empty","state":{}}}]}],"direction":"horizontal","width":300,"collapsed":true},"active":"f7ea52c649b950ec"},"2021-07-02":{"main":{"id":"dfd308004f3fc7b5","type":"split","children":[{"id":"3b4e13489b8a9fde","type":"split","dimension":16.73913043478261,"children":[{"id":"e2fd479dac4cc7f8","type":"leaf","state":{"type":"markdown","state":{"file":"2021-06-30.md","mode":"source"}}},{"id":"3db8d7cab419fd76","type":"leaf","state":{"type":"markdown","state":{"file":"tools for thought interchange.md","mode":"source"}}}],"direction":"horizontal"},{"id":"31bfeb5315ccbd7a","type":"split","dimension":16.666666666666664,"children":[{"id":"61fbb8b43dfe1438","type":"leaf","state":{"type":"markdown","state":{"file":"2021-06-30.md","mode":"source"}}},{"id":"31b366a3fa59045b","type":"leaf","state":{"type":"markdown","state":{"file":"2021-06-29.md","mode":"source"}}},{"id":"4b7f01df55991a81","type":"leaf","state":{"type":"markdown","state":{"file":"agora protocol.md","mode":"source"}}},{"id":"25094b341fb4e38b","type":"leaf","state":{"type":"markdown","state":{"file":"agora exchange format.md","mode":"source"}}},{"id":"0b53f37533e1646b","type":"leaf","state":{"type":"markdown","state":{"file":"future of note taking.md","mode":"source"}}},{"id":"267bd84cc0b7b9a1","type":"leaf","state":{"type":"markdown","state":{"file":"2021-06-29.md","mode":"source"}}},{"id":"d7cbec0a993be7f0","type":"leaf","state":{"type":"markdown","state":{"file":"2021-06-29.md","mode":"source"}}},{"id":"e3ea0909483f0f4f","type":"leaf","state":{"type":"markdown","state":{"file":"cybersin.md","mode":"source"}}},{"id":"cd5092099e07046b","type":"leaf","state":{"type":"markdown","state":{"file":"cybersyn.md","mode":"source"}}},{"id":"c8e0f3ce8b7dd77b","type":"leaf","state":{"type":"markdown","state":{"file":"synco.md","mode":"source"}}},{"id":"32ac6e1822cb86d7","type":"leaf","state":{"type":"markdown","state":{"file":"the future of note taking.md","mode":"source"}}}],"direction":"horizontal"},{"id":"f3562790a5cec103","type":"leaf","dimension":16.73913043478261,"state":{"type":"markdown","state":{"file":"2021-06-30.md","mode":"source"}}},{"id":"fe6d51c421a6dec7","type":"leaf","dimension":16.73913043478261,"state":{"type":"markdown","state":{"file":"2021-07-02.md","mode":"source"}}},{"id":"7e02e76cecb23b03","type":"leaf","dimension":16.666666666666664,"state":{"type":"markdown","state":{"file":"ontology.md","mode":"source"}}},{"id":"c0c0bea3aa9b57e6","type":"leaf","dimension":16.44927536231884,"state":{"type":"markdown","state":{"file":"sutty.md","mode":"source"}}}],"direction":"vertical"},"left":{"id":"2faba265b9292c7f","type":"split","children":[{"id":"f510565592a031af","type":"tabs","children":[{"id":"961d680309b2af56","type":"leaf","state":{"type":"file-explorer","state":{}}},{"id":"4c9c5d93a7ed714f","type":"leaf","state":{"type":"search","state":{"query":"hyperbee","matchingCase":false,"explainSearch":false,"collapseAll":false,"extraContext":false,"sortOrder":"byModifiedTime"}}},{"id":"8af6596dc98ffa6b","type":"leaf","state":{"type":"starred","state":{}}},{"id":"aa0f3e910050164c","type":"leaf","state":{"type":"empty","state":{}}}],"currentTab":1}],"direction":"horizontal","width":300,"collapsed":true},"right":{"id":"afe2921ea1b550bb","type":"split","children":[{"id":"769f8c6855cce1d4","type":"tabs","children":[{"id":"30e969c9166f9896","type":"leaf","state":{"type":"backlink","state":{"file":"2021-06-30.md","collapseAll":false,"extraContext":false,"sortOrder":"alphabetical","showSearch":false,"searchQuery":"","backlinkCollapsed":false,"unlinkedCollapsed":true}}},{"id":"a62fc60423ac06f4","type":"leaf","state":{"type":"outline","state":{"file":"2021-06-30.md"}}},{"id":"eaa7f99b4cf5444a","type":"leaf","state":{"type":"empty","state":{}}},{"id":"49a0eb72df05c98e","type":"leaf","state":{"type":"empty","state":{}}}],"currentTab":3},{"id":"9852b3b70c9ace3c","type":"tabs","children":[{"id":"ba82168a0acbacba","type":"leaf","state":{"type":"empty","state":{}}}]},{"id":"297c54846b597552","type":"tabs","children":[{"id":"35550c211233c6a5","type":"leaf","state":{"type":"empty","state":{}}}]}],"direction":"horizontal","width":300,"collapsed":true},"active":"f3562790a5cec103"}} \ No newline at end of file diff --git a/2021-07-10.md b/2021-07-10.md index 18c75b7f8..1900fb632 100644 --- a/2021-07-10.md +++ b/2021-07-10.md @@ -1,2 +1,4 @@ - [[flancia]] - - [[flancian]] \ No newline at end of file + - [[flancian]] +- [[moondog]] + - [[enough about human rights]] \ No newline at end of file diff --git a/enough about human rights.md b/enough about human rights.md index 61c1fd46d..db17e063f 100644 --- a/enough about human rights.md +++ b/enough about human rights.md @@ -1 +1,38 @@ -- [[pull]] [[what about human rights]] \ No newline at end of file +- a [[song]] + - by [[moondog]] + - [[go]] https://www.youtube.com/watch?v=-dLPsw3i_P8 + - [[mondegreen]] [[what about human rights]] + - [[lyrics]] https://genius.com/Moondog-enough-about-human-rights-annotated + +``` +Enough about Human Rights! +What about Whale Rights? What about Snail Rights? +What about Seal Rights? What about Eel Rights? +What about Coon Rights? What about Loon Rights? +What about Wolf Rights? What about, what about, what about, +What about Moose Rights? What about Goose Rights? +What about Lark Rights? What about Shark Rights? +What about Fox Rights? What about Ox Rights? +What about Mole Rights? What about, what about, what about, +What about Goat Rights? What about Stoat Rights? +What about Pike Rights? What about Shrike Rights? +What about Hare Rights? What about Bear Rights? +What about Plant Rights? + +Enough about Human Rights! +What about Hog Rights? What about Frog Rights? +What about Kite Rights? What about Mite Rights? +What about Bee Rights? What about Flea Rights? +What about Stork Rights? What about, what about, what about, +What about Bat Rights? What about Gnat Rights? +What about Mouse Rights? What about Louse Rights? +What about Cat Rights? What about Rat Rights? +What about Hawk Rights? What about, what about, what about, +What about Bug Rights? What about Slug Rights? +What about Bass Rights? What about Ass Rights? +What about Worm Rights? What about Germ Rights? +What about Pork Rights? +``` + +- [[push]] [[rights]] + - [[human]] whale snail seal eel coon loon wolf moose goose lark shark fox ox mole goat stoat pike shrike hare bear plant hog frog kite mite bee flea stork bat gnat mouse louse cat rat hawk bug slug bass ass worm germ pork \ No newline at end of file