您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
esa.io PC版のドロップダウンメニューに、タイトル・URLを個別にコピーする機能を追加
// ==UserScript== // @name esa.io copy menu // @namespace https://github.com/fushihara/esa-io-copy-menu // @match https://*.esa.io/posts/* // @description esa.io PC版のドロップダウンメニューに、タイトル・URLを個別にコピーする機能を追加 // @version 1.0.2 // @grant none // @license MIT // @source https://github.com/fushihara/esa-io-copy-menu // @homepage https://greasyfork.org/ja/scripts/410893-esa-io-copy-menu // @noframes // ==/UserScript== /******/ (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 = "./src/index.ts"); /******/ }) /************************************************************************/ /******/ ({ /***/ "./src/index.ts": /*!**********************!*\ !*** ./src/index.ts ***! \**********************/ /*! no static exports found */ /***/ (function(module, exports) { (async () => { const title = getTitleText(); const postId = getPostId(); const teamId = getTeamId(); if (title === null || postId === null || teamId === null) { return; } insertMenuItem(createCopyMenuItem("タイトルをコピー", title), createCopyMenuItem("URL(フル)をコピー", `https://${teamId}.esa.io/posts/${postId}`), createCopyMenuItem("URL(相対)をコピー", `/posts/${postId}`), createCopyMenuItem("mdリンクをコピー", `[${title}](/posts/${postId})`)); })(); function getTitleText() { const titleElement = document.querySelector(".post-title__name"); if (!titleElement || !(titleElement instanceof HTMLElement)) { return null; } const title = titleElement.innerText; return title; } /** POST IDを返す。ない場合はnull */ function getPostId() { const e = document.querySelector(".binding[data-post-number]"); if (!e) { return null; } const r = e.getAttribute("data-post-number"); const n = Number(r); if (Number.isNaN(n)) { return null; } return n; } /** URLに使う、チームIDを返す */ function getTeamId() { const e = document.querySelector(".binding[data-team-name]"); if (!e) { return null; } const r = e.getAttribute("data-team-name"); return r; } /** メニューの下からn番目にコンテンツを入れる */ function insertMenuItem(...elements) { const menuParent = document.querySelector(".post-menu__nav"); const upElement = menuParent.childNodes[menuParent.childNodes.length - 3]; for (let element of elements) { menuParent.insertBefore(element, upElement); } } function createCopyMenuItem(title, copyText) { const elemParent = document.createElement("div"); elemParent.innerHTML = `<li class="js-post-menu__item post-menu__item"> <a class="post-menu__link copy-to-clipboard" data-clipboard-text="xxxxxxxxxx"> <i class="js-copy-icon post-menu__icon icon-clipboard"></i> <span class="js-copy-label post-menu__label" data-text-after-copied="クリップボードにコピーしました">タイトルをコピー</span> </a> </li>`; const elem = elemParent.childNodes[0]; elem.querySelector(".copy-to-clipboard").setAttribute("data-clipboard-text", copyText); elem.querySelector(".js-copy-label").innerText = title; elem.addEventListener("click", async () => { elem.querySelector("i").classList.add("is-copied"); const originalText = elem.querySelector("span").innerText; const copiedText = elem.querySelector("span").getAttribute("data-text-after-copied"); elem.querySelector("span").innerText = copiedText; await new Promise(resolve => setTimeout(resolve, 1000)); document.querySelector("#js-post-menu").style.display = ""; elem.querySelector("span").innerText = originalText; elem.querySelector("i").classList.remove("is-copied"); }); return elem; } /***/ }) /******/ }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vc3JjL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7UUFBQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTs7O1FBR0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDBDQUEwQyxnQ0FBZ0M7UUFDMUU7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSx3REFBd0Qsa0JBQWtCO1FBQzFFO1FBQ0EsaURBQWlELGNBQWM7UUFDL0Q7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLHlDQUF5QyxpQ0FBaUM7UUFDMUUsZ0hBQWdILG1CQUFtQixFQUFFO1FBQ3JJO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMkJBQTJCLDBCQUEwQixFQUFFO1FBQ3ZELGlDQUFpQyxlQUFlO1FBQ2hEO1FBQ0E7UUFDQTs7UUFFQTtRQUNBLHNEQUFzRCwrREFBK0Q7O1FBRXJIO1FBQ0E7OztRQUdBO1FBQ0E7Ozs7Ozs7Ozs7OztBQ2xGQSxDQUFDLEtBQUssSUFBSSxFQUFFO0lBQ1YsTUFBTSxLQUFLLEdBQUcsWUFBWSxFQUFFLENBQUM7SUFDN0IsTUFBTSxNQUFNLEdBQUcsU0FBUyxFQUFFLENBQUM7SUFDM0IsTUFBTSxNQUFNLEdBQUcsU0FBUyxFQUFFLENBQUM7SUFDM0IsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE1BQU0sS0FBSyxJQUFJLElBQUksTUFBTSxLQUFLLElBQUksRUFBRTtRQUFFLE9BQU87S0FBRTtJQUNyRSxjQUFjLENBQ1osa0JBQWtCLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxFQUNyQyxrQkFBa0IsQ0FBQyxhQUFhLEVB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QU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQWMsTUFBTSxDQUFDLENBQUMsWUFBWSxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDbEcsSUFBSSxDQUFDLGFBQWEsQ0FBYyxNQUFNLENBQUMsQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDO1FBQy9ELE1BQU0sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDeEQsUUFBUSxDQUFDLGFBQWEsQ0FBYyxlQUFlLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUN4RSxJQUFJLENBQUMsYUFBYSxDQUFjLE1BQU0sQ0FBQyxDQUFDLFNBQVMsR0FBRyxZQUFZLENBQUM7UUFDakUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3hELENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIiwiZmlsZSI6InNjcmlwdC51c2VyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9zcmMvaW5kZXgudHNcIik7XG4iLCIoYXN5bmMgKCkgPT4ge1xyXG4gIGNvbnN0IHRpdGxlID0gZ2V0VGl0bGVUZXh0KCk7XHJcbiAgY29uc3QgcG9zdElkID0gZ2V0UG9zdElkKCk7XHJcbiAgY29uc3QgdGVhbUlkID0gZ2V0VGVhbUlkKCk7XHJcbiAgaWYgKHRpdGxlID09PSBudWxsIHx8IHBvc3RJZCA9PT0gbnVsbCB8fCB0ZWFtSWQgPT09IG51bGwpIHsgcmV0dXJuOyB9XHJcbiAgaW5zZXJ0TWVudUl0ZW0oXHJcbiAgICBjcmVhdGVDb3B5TWVudUl0ZW0oXCLjgr/jgqTjg4jjg6vjgpLjgrPjg5Tjg7xcIiwgdGl0bGUpLFxyXG4gICAgY3JlYXRlQ29weU1lbnVJdGVtKFwiVVJMKOODleODqynjgpLjgrPjg5Tjg7xcIiwgYGh0dHBzOi8vJHt0ZWFtSWR9LmVzYS5pby9wb3N0cy8ke3Bvc3RJZH1gKSxcclxuICAgIGNyZWF0ZUNvcHlNZW51SXRlbShcIlVSTCjnm7jlr74p44KS44Kz44OU44O8XCIsIGAvcG9zdHMvJHtwb3N0SWR9YCksXHJcbiAgICBjcmVhdGVDb3B5TWVudUl0ZW0oXCJtZOODquODs+OCr+OCkuOCs+ODlOODvFwiLCBgWyR7dGl0bGV9XSgvcG9zdHMvJHtwb3N0SWR9KWApLFxyXG4gIClcclxufSkoKTtcclxuZnVuY3Rpb24gZ2V0VGl0bGVUZXh0KCk6IHN0cmluZyB8IG51bGwge1xyXG4gIGNvbnN0IHRpdGxlRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIucG9zdC10aXRsZV9fbmFtZVwiKTtcclxuICBpZiAoIXRpdGxlRWxlbWVudCB8fCAhKHRpdGxlRWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkgeyByZXR1cm4gbnVsbDsgfVxyXG4gIGNvbnN0IHRpdGxlID0gdGl0bGVFbGVtZW50LmlubmVyVGV4dDtcclxuICByZXR1cm4gdGl0bGU7XHJcbn1cclxuLyoqIFBPU1QgSUTjgpLov5TjgZnjgILjgarjgYTloLTlkIjjga9udWxsICovXHJcbmZ1bmN0aW9uIGdldFBvc3RJZCgpOiBudW1iZXIgfCBudWxsIHtcclxuICBjb25zdCBlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5iaW5kaW5nW2RhdGEtcG9zdC1udW1iZXJdXCIpO1xyXG4gIGlmICghZSkgeyByZXR1cm4gbnVsbDsgfVxyXG4gIGNvbnN0IHIgPSBlLmdldEF0dHJpYnV0ZShcImRhdGEtcG9zdC1udW1iZXJcIik7XHJcbiAgY29uc3QgbiA9IE51bWJlcihyKTtcclxuICBpZiAoTnVtYmVyLmlzTmFOKG4pKSB7IHJldHVybiBudWxsOyB9XHJcbiAgcmV0dXJuIG47XHJcbn1cclxuLyoqIFVSTOOBq+S9v+OBhuOAgeODgeODvOODoElE44KS6L+U44GZICovXHJcbmZ1bmN0aW9uIGdldFRlYW1JZCgpOiBzdHJpbmcgfCBudWxsIHtcclxuICBjb25zdCBlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5iaW5kaW5nW2RhdGEtdGVhbS1uYW1lXVwiKTtcclxuICBpZiAoIWUpIHsgcmV0dXJuIG51bGw7IH1cclxuICBjb25zdCByID0gZS5nZXRBdHRyaWJ1dGUoXCJkYXRhLXRlYW0tbmFtZVwiKTtcclxuICByZXR1cm4gcjtcclxufVxyXG4vKiog44Oh44OL44Ol44O844Gu5LiL44GL44KJbueVquebruOBq+OCs+ODs+ODhuODs+ODhOOCkuWFpeOCjOOCiyAqL1xyXG5mdW5jdGlvbiBpbnNlcnRNZW51SXRlbSguLi5lbGVtZW50czogSFRNTEVsZW1lbnRbXSkge1xyXG4gIGNvbnN0IG1lbnVQYXJlbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLnBvc3QtbWVudV9fbmF2XCIpO1xyXG4gIGNvbnN0IHVwRWxlbWVudCA9IG1lbnVQYXJlbnQuY2hpbGROb2Rlc1ttZW51UGFyZW50LmNoaWxkTm9kZXMubGVuZ3RoIC0gM107XHJcbiAgZm9yIChsZXQgZWxlbWVudCBvZiBlbGVtZW50cykge1xyXG4gICAgbWVudVBhcmVudC5pbnNlcnRCZWZvcmUoZWxlbWVudCwgdXBFbGVtZW50KTtcclxuICB9XHJcbn1cclxuZnVuY3Rpb24gY3JlYXRlQ29weU1lbnVJdGVtKHRpdGxlOiBzdHJpbmcsIGNvcHlUZXh0OiBzdHJpbmcpOiBIVE1MRWxlbWVudCB7XHJcbiAgY29uc3QgZWxlbVBhcmVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgZWxlbVBhcmVudC5pbm5lckhUTUwgPSBgPGxpIGNsYXNzPVwianMtcG9zdC1tZW51X19pdGVtIHBvc3QtbWVudV9faXRlbVwiPlxyXG4gIDxhIGNsYXNzPVwicG9zdC1tZW51X19saW5rIGNvcHktdG8tY2xpcGJvYXJkXCIgZGF0YS1jbGlwYm9hcmQtdGV4dD1cInh4eHh4eHh4eHhcIj5cclxuICA8aSBjbGFzcz1cImpzLWNvcHktaWNvbiBwb3N0LW1lbnVfX2ljb24gaWNvbi1jbGlwYm9hcmRcIj48L2k+XHJcbiAgPHNwYW4gY2xhc3M9XCJqcy1jb3B5LWxhYmVsIHBvc3QtbWVudV9fbGFiZWxcIiBkYXRhLXRleHQtYWZ0ZXItY29waWVkPVwi44Kv44Oq44OD44OX44Oc44O844OJ44Gr44Kz44OU44O844GX44G+44GX44GfXCI+44K/44Kk44OI44Or44KS44Kz44OU44O8PC9zcGFuPlxyXG4gIDwvYT5cclxuICA8L2xpPmA7XHJcbiAgY29uc3QgZWxlbSA9IGVsZW1QYXJlbnQuY2hpbGROb2Rlc1swXSBhcyBIVE1MRWxlbWVudDtcclxuICBlbGVtLnF1ZXJ5U2VsZWN0b3IoXCIuY29weS10by1jbGlwYm9hcmRcIikuc2V0QXR0cmlidXRlKFwiZGF0YS1jbGlwYm9hcmQtdGV4dFwiLCBjb3B5VGV4dCk7XHJcbiAgZWxlbS5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihcIi5qcy1jb3B5LWxhYmVsXCIpLmlubmVyVGV4dCA9IHRpdGxlO1xyXG4gIGVsZW0uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGFzeW5jICgpID0+IHtcclxuICAgIGVsZW0ucXVlcnlTZWxlY3RvcihcImlcIikuY2xhc3NMaXN0LmFkZChcImlzLWNvcGllZFwiKTtcclxuICAgIGNvbnN0IG9yaWdpbmFsVGV4dCA9IGVsZW0ucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oXCJzcGFuXCIpLmlubmVyVGV4dDtcclxuICAgIGNvbnN0IGNvcGllZFRleHQgPSBlbGVtLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KFwic3BhblwiKS5nZXRBdHRyaWJ1dGUoXCJkYXRhLXRleHQtYWZ0ZXItY29waWVkXCIpO1xyXG4gICAgZWxlbS5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihcInNwYW5cIikuaW5uZXJUZXh0ID0gY29waWVkVGV4dDtcclxuICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMDAwKSk7XHJcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihcIiNqcy1wb3N0LW1lbnVcIikuc3R5bGUuZGlzcGxheSA9IFwiXCI7XHJcbiAgICBlbGVtLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KFwic3BhblwiKS5pbm5lclRleHQgPSBvcmlnaW5hbFRleHQ7XHJcbiAgICBlbGVtLnF1ZXJ5U2VsZWN0b3IoXCJpXCIpLmNsYXNzTGlzdC5yZW1vdmUoXCJpcy1jb3BpZWRcIik7XHJcbiAgfSk7XHJcbiAgcmV0dXJuIGVsZW07XHJcbn1cclxuIl0sInNvdXJjZVJvb3QiOiIifQ==