UNPKG

@thebigcrunch/sdk

Version:
294 lines (261 loc) 42.7 kB
/******/ (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 = "./odo/index.js"); /******/ }) /************************************************************************/ /******/ ({ /***/ "./odo/index.js": /*!**********************!*\ !*** ./odo/index.js ***! \**********************/ /*! no static exports found */ /***/ (function(module, exports) { // This file needs good browser support because it's included on everyone's websites. // It's also not babeled meaning const, let, async await and other modern features don't work that well // check caniuse before using anything too crazy. var isMobile = false; // Mobile detection for resizing. if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|ipad|iris|kindle|Android|Silk|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(navigator.userAgent) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(navigator.userAgent.substr(0, 4))) { isMobile = true; } var wafflebarHeight = 38; var container = document.getElementById("container"); container.style.width = window.innerWidth + "px"; container.style.height = window.innerHeight - wafflebarHeight + "px"; var url = new URLSearchParams(window.location.search); var spaceId = url.get("id"); var fullpage = url.get("fullpage"); var aspect = url.get("aspect") || "cellaspect"; var hideWaffleBar = url.get("disableBar") || false; var lastValue; var lastSpace; var sockets; function draw(value, space, options) { if (lastSpace && lastSpace.type === TBC.types.visualisation && space.type === TBC.types.visualisation && lastValue === value && lastSpace.layers.length === space.layers.length) { // Don't redraw vizzies that are the same return; } container.innerHTML = ""; if (sockets) { sockets.close(); } if (space.layers && space.layers.length > 0) { sockets = TBC.renderLayersToElement(space, container, options); } else if (space.type === TBC.types.visualisation) { TBC.renderVisualisationToElement(space, container, options); } else if (space.value === null) { // Don't render empty spaces. Visualizations don't have a value doh. return; } else { TBC.renderCellToElement(space, container, options); } var innerContainer = container.firstChild; var containerBox = innerContainer.getBoundingClientRect(); // Fudge 10% stretch mode. // If the container is within 10% of the container stretch it so that there aren't any borders around it. if (containerBox.width + containerBox.width * 0.1 >= window.innerWidth && containerBox.height + containerBox.height * 0.1 >= window.innerHeight && !options && fullpage === "true") { draw(value, space, { fit: "stretch" }); } } function updateWaffleBar(space, user) { if (!space) { // This happens when the user callback comes back first. return; } document.getElementById("SpaceLink").href = TBC.getWebViewLink(space); if (user && user.profilePicture) { document.getElementById("ProfilePicture").src = TBC.getProfilePictureUrl(user); } document.getElementById("ProfilePictureLink").href = TBC.getUserProfileUrl(user); document.getElementById("LinkText").value = TBC.getWebViewLink(space); document.getElementById("Embed").href = TBC.getWebViewLink(space); document.getElementById("Weblink").href = TBC.getWebViewLink(space); if (!space.name || space.name === "") { document.getElementById("SpaceName").innerText = "Untitled"; } else { document.getElementById("SpaceName").innerText = space.name; } } var user = undefined; function crunch() { var options = { fit: aspect, odo: true }; TBC.crunch(spaceId, function (value, space) { updateWaffleBar(space, user); document.getElementById("error").style.display = "none"; draw(value, space, options); lastValue = value; lastSpace = space; }, function () { document.getElementById("error").style.display = "block"; }, function (user) { user = user; updateWaffleBar(lastSpace, user); }); } // Only resize on mobile. // SIMON HACKED THIS! XXX //if (!isMobile) { window.addEventListener("resize", function () { var options = { fit: aspect }; container.style.width = window.innerWidth + "px"; container.style.height = window.innerHeight - wafflebarHeight + "px"; // Need to maintain aspect ratio here. if (container.querySelector("iframe") === null) { draw(lastValue, lastSpace, options); } }); //} WebFont.load({ google: { families: ["Slabo", "Indie Flower", "Inconsolata", "Macondo", "Monoton", "Roboto Slab", "Roboto"] }, active: function active() { var options = { fit: aspect }; // Vizzies don't need to redraw when fonts are loaded because they're in an iframe. if (lastSpace && lastSpace.type !== TBC.types.visualisation) draw(lastValue, lastSpace, options); } }); function analytics() { var dnt = navigator.doNotTrack || window.doNotTrack || navigator.msDoNotTrack; if (dnt != "1" && dnt != "yes") { (function (i, s, o, g, r, a, m) { i["GoogleAnalyticsObject"] = r; i[r] = i[r] || function () { (i[r].q = i[r].q || []).push(arguments); }, i[r].l = 1 * new Date(); a = s.createElement(o), m = s.getElementsByTagName(o)[0]; a.async = 1; a.src = g; m.parentNode.insertBefore(a, m); })(window, document, "script", "//www.google-analytics.com/analytics.js", "ga"); ga("create", {"gaCode":"UA-106748582-1","webViewUrl":"https://bigcrunch.io"}.gaCode, "auto"); ga("send", "pageview"); } else { console.debug("Respecting Do-Not-Track, not loading analytics. See https://bigcrunch.io/google-analytics-dnt/"); } } // Display something while fonts are loading. crunch(); analytics(); function copyText(id, buttonId) { var previousText = document.getElementById(buttonId).textContent; var textToCopy = document.getElementById(id); textToCopy.select(); document.getElementById(buttonId).textContent = "Copied"; document.execCommand("copy"); setTimeout(function () { document.getElementById(buttonId).textContent = previousText; }, 1000); } (function onLoad() { if (!hideWaffleBar) { document.getElementById("WaffleBar").style.display = "flex"; document.body.classList.add("body-border"); } document.getElementById("ShareButton").addEventListener("click", function () { document.getElementById("ShareModal").style.display = "flex"; document.getElementById("container").classList.add("blur-container"); }); document.getElementById("ModalClose").addEventListener("click", function () { document.getElementById("ShareModal").style.display = "none"; document.getElementById("container").classList.remove("blur-container"); }); document.getElementById("CopyLinkText").addEventListener("click", function () { copyText("LinkText", "CopyLinkText"); }); // Social buttons document.getElementById("Facebook").addEventListener("click", function () { window.open("https://www.facebook.com/sharer/sharer.php?u=".concat(TBC.getWebViewLink(lastSpace)), "", "height=400,width=550,centerscreen=yes"); }); document.getElementById("LinkedIn").addEventListener("click", function () { window.open("https://linkedin.com/shareArticle?url=".concat(TBC.getWebViewLink(lastSpace)), "", "height=500,width=500,centerscreen=yes"); }); document.getElementById("Twitter").addEventListener("click", function () { window.open("https://twitter.com/share?url=".concat(TBC.getWebViewLink(lastSpace)), "", "height=500,width=500,centerscreen=yes"); }); })(); /***/ }) /******/ }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vb2RvL2luZGV4LmpzIl0sIm5hbWVzIjpbImlzTW9iaWxlIiwidGVzdCIsIm5hdmlnYXRvciIsInVzZXJBZ2VudCIsInN1YnN0ciIsIndhZmZsZWJhckhlaWdodCIsImNvbnRhaW5lciIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJzdHlsZSIsIndpZHRoIiwid2luZG93IiwiaW5uZXJXaWR0aCIsImhlaWdodCIsImlubmVySGVpZ2h0IiwidXJsIiwiVVJMU2VhcmNoUGFyYW1zIiwibG9jYXRpb24iLCJzZWFyY2giLCJzcGFjZUlkIiwiZ2V0IiwiZnVsbHBhZ2UiLCJhc3BlY3QiLCJoaWRlV2FmZmxlQmFyIiwibGFzdFZhbHVlIiwibGFzdFNwYWNlIiwic29ja2V0cyIsImRyYXciLCJ2YWx1ZSIsInNwYWNlIiwib3B0aW9ucyIsInR5cGUiLCJUQkMiLCJ0eXBlcyIsInZpc3VhbGlzYXRpb24iLCJsYXllcnMiLCJsZW5ndGgiLCJpbm5lckhUTUwiLCJjbG9zZSIsInJlbmRlckxheWVyc1RvRWxlbWVudCIsInJlbmRlclZpc3VhbGlzYXRpb25Ub0VsZW1lbnQiLCJyZW5kZXJDZWxsVG9FbGVtZW50IiwiaW5uZXJDb250YWluZXIiLCJmaXJzdENoaWxkIiwiY29udGFpbmVyQm94IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwiZml0IiwidXBkYXRlV2FmZmxlQmFyIiwidXNlciIsImhyZWYiLCJnZXRXZWJWaWV3TGluayIsInByb2ZpbGVQaWN0dXJlIiwic3JjIiwiZ2V0UHJvZmlsZVBpY3R1cmVVcmwiLCJnZXRVc2VyUHJvZmlsZVVybCIsIm5hbWUiLCJpbm5lclRleHQiLCJ1bmRlZmluZWQiLCJjcnVuY2giLCJvZG8iLCJkaXNwbGF5IiwiYWRkRXZlbnRMaXN0ZW5lciIsInF1ZXJ5U2VsZWN0b3IiLCJXZWJGb250IiwibG9hZCIsImdvb2dsZSIsImZhbWlsaWVzIiwiYWN0aXZlIiwiYW5hbHl0aWNzIiwiZG50IiwiZG9Ob3RUcmFjayIsIm1zRG9Ob3RUcmFjayIsImkiLCJzIiwibyIsImciLCJyIiwiYSIsIm0iLCJxIiwicHVzaCIsImFyZ3VtZW50cyIsImwiLCJEYXRlIiwiY3JlYXRlRWxlbWVudCIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiYXN5bmMiLCJwYXJlbnROb2RlIiwiaW5zZXJ0QmVmb3JlIiwiZ2EiLCJDT05GSUciLCJnYUNvZGUiLCJjb25zb2xlIiwiZGVidWciLCJjb3B5VGV4dCIsImlkIiwiYnV0dG9uSWQiLCJwcmV2aW91c1RleHQiLCJ0ZXh0Q29udGVudCIsInRleHRUb0NvcHkiLCJzZWxlY3QiLCJleGVjQ29tbWFuZCIsInNldFRpbWVvdXQiLCJvbkxvYWQiLCJib2R5IiwiY2xhc3NMaXN0IiwiYWRkIiwicmVtb3ZlIiwib3BlbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0RBQTBDLGdDQUFnQztBQUMxRTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdFQUF3RCxrQkFBa0I7QUFDMUU7QUFDQSx5REFBaUQsY0FBYztBQUMvRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQXlDLGlDQUFpQztBQUMxRSx3SEFBZ0gsbUJBQW1CLEVBQUU7QUFDckk7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBMkIsMEJBQTBCLEVBQUU7QUFDdkQseUNBQWlDLGVBQWU7QUFDaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOERBQXNELCtEQUErRDs7QUFFckg7QUFDQTs7O0FBR0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDbEZBO0FBQ0E7QUFD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X29kby5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiL1wiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gXCIuL29kby9pbmRleC5qc1wiKTtcbiIsIi8vIFRoaXMgZmlsZSBuZWVkcyBnb29kIGJyb3dzZXIgc3VwcG9ydCBiZWNhdXNlIGl0J3MgaW5jbHVkZWQgb24gZXZlcnlvbmUncyB3ZWJzaXRlcy5cbi8vIEl0J3MgYWxzbyBub3QgYmFiZWxlZCBtZWFuaW5nIGNvbnN0LCBsZXQsIGFzeW5jIGF3YWl0IGFuZCBvdGhlciBtb2Rlcm4gZmVhdHVyZXMgZG9uJ3Qgd29yayB0aGF0IHdlbGxcbi8vIGNoZWNrIGNhbml1c2UgYmVmb3JlIHVzaW5nIGFueXRoaW5nIHRvbyBjcmF6eS5cblxudmFyIGlzTW9iaWxlID0gZmFsc2U7XG4vLyBNb2JpbGUgZGV0ZWN0aW9uIGZvciByZXNpemluZy5cbmlmIChcbiAgICAvKGFuZHJvaWR8YmJcXGQrfG1lZWdvKS4rbW9iaWxlfGF2YW50Z298YmFkYVxcL3xibGFja2JlcnJ5fGJsYXplcnxjb21wYWx8ZWxhaW5lfGZlbm5lY3xoaXB0b3B8aWVtb2JpbGV8aXAoaG9uZXxvZCl8aXBhZHxpcmlzfGtpbmRsZXxBbmRyb2lkfFNpbGt8bGdlIHxtYWVtb3xtaWRwfG1tcHxuZXRmcm9udHxvcGVyYSBtKG9ifGluKWl8cGFsbSggb3MpP3xwaG9uZXxwKGl4aXxyZSlcXC98cGx1Y2tlcnxwb2NrZXR8cHNwfHNlcmllcyg0fDYpMHxzeW1iaWFufHRyZW98dXBcXC4oYnJvd3NlcnxsaW5rKXx2b2RhZm9uZXx3YXB8d2luZG93cyAoY2V8cGhvbmUpfHhkYXx4aWluby9pLnRlc3QoXG4gICAgICAgIG5hdmlnYXRvci51c2VyQWdlbnRcbiAgICApIHx8XG4gICAgLzEyMDd8NjMxMHw2NTkwfDNnc298NHRocHw1MFsxLTZdaXw3NzBzfDgwMnN8YSB3YXxhYmFjfGFjKGVyfG9vfHNcXC0pfGFpKGtvfHJuKXxhbChhdnxjYXxjbyl8YW1vaXxhbihleHxueXx5dyl8YXB0dXxhcihjaHxnbyl8YXModGV8dXMpfGF0dHd8YXUoZGl8XFwtbXxyIHxzICl8YXZhbnxiZShja3xsbHxucSl8YmkobGJ8cmQpfGJsKGFjfGF6KXxicihlfHYpd3xidW1ifGJ3XFwtKG58dSl8YzU1XFwvfGNhcGl8Y2N3YXxjZG1cXC18Y2VsbHxjaHRtfGNsZGN8Y21kXFwtfGNvKG1wfG5kKXxjcmF3fGRhKGl0fGxsfG5nKXxkYnRlfGRjXFwtc3xkZXZpfGRpY2F8ZG1vYnxkbyhjfHApb3xkcygxMnxcXC1kKXxlbCg0OXxhaSl8ZW0obDJ8dWwpfGVyKGljfGswKXxlc2w4fGV6KFs0LTddMHxvc3x3YXx6ZSl8ZmV0Y3xmbHkoXFwtfF8pfGcxIHV8ZzU2MHxnZW5lfGdmXFwtNXxnXFwtbW98Z28oXFwud3xvZCl8Z3IoYWR8dW4pfGhhaWV8aGNpdHxoZFxcLShtfHB8dCl8aGVpXFwtfGhpKHB0fHRhKXxocCggaXxpcCl8aHNcXC1jfGh0KGMoXFwtfCB8X3xhfGd8cHxzfHQpfHRwKXxodShhd3x0Yyl8aVxcLSgyMHxnb3xtYSl8aTIzMHxpYWMoIHxcXC18XFwvKXxpYnJvfGlkZWF8aWcwMXxpa29tfGltMWt8aW5ub3xpcGFxfGlyaXN8amEodHx2KWF8amJyb3xqZW11fGppZ3N8a2RkaXxrZWppfGtndCggfFxcLyl8a2xvbnxrcHQgfGt3Y1xcLXxreW8oY3xrKXxsZShub3x4aSl8bGcoIGd8XFwvKGt8bHx1KXw1MHw1NHxcXC1bYS13XSl8bGlid3xseW54fG0xXFwtd3xtM2dhfG01MFxcL3xtYSh0ZXx1aXx4byl8bWMoMDF8MjF8Y2EpfG1cXC1jcnxtZShyY3xyaSl8bWkobzh8b2F8dHMpfG1tZWZ8bW8oMDF8MDJ8Yml8ZGV8ZG98dChcXC18IHxvfHYpfHp6KXxtdCg1MHxwMXx2ICl8bXdicHxteXdhfG4xMFswLTJdfG4yMFsyLTNdfG4zMCgwfDIpfG41MCgwfDJ8NSl8bjcoMCgwfDEpfDEwKXxuZSgoY3xtKVxcLXxvbnx0Znx3Znx3Z3x3dCl8bm9rKDZ8aSl8bnpwaHxvMmltfG9wKHRpfHd2KXxvcmFufG93ZzF8cDgwMHxwYW4oYXxkfHQpfHBkeGd8cGcoMTN8XFwtKFsxLThdfGMpKXxwaGlsfHBpcmV8cGwoYXl8dWMpfHBuXFwtMnxwbyhja3xydHxzZSl8cHJveHxwc2lvfHB0XFwtZ3xxYVxcLWF8cWMoMDd8MTJ8MjF8MzJ8NjB8XFwtWzItN118aVxcLSl8cXRla3xyMzgwfHI2MDB8cmFrc3xyaW05fHJvKHZlfHpvKXxzNTVcXC98c2EoZ2V8bWF8bW18bXN8bnl8dmEpfHNjKDAxfGhcXC18b298cFxcLSl8c2RrXFwvfHNlKGMoXFwtfDB8MSl8NDd8bWN8bmR8cmkpfHNnaFxcLXxzaGFyfHNpZShcXC18bSl8c2tcXC0wfHNsKDQ1fGlkKXxzbShhbHxhcnxiM3xpdHx0NSl8c28oZnR8bnkpfHNwKDAxfGhcXC18dlxcLXx2ICl8c3koMDF8bWIpfHQyKDE4fDUwKXx0NigwMHwxMHwxOCl8dGEoZ3R8bGspfHRjbFxcLXx0ZGdcXC18dGVsKGl8bSl8dGltXFwtfHRcXC1tb3x0byhwbHxzaCl8dHMoNzB8bVxcLXxtM3xtNSl8dHhcXC05fHVwKFxcLmJ8ZzF8c2kpfHV0c3R8djQwMHx2NzUwfHZlcml8dmkocmd8dGUpfHZrKDQwfDVbMC0zXXxcXC12KXx2bTQwfHZvZGF8dnVsY3x2eCg1Mnw1M3w2MHw2MXw3MHw4MHw4MXw4M3w4NXw5OCl8dzNjKFxcLXwgKXx3ZWJjfHdoaXR8d2koZyB8bmN8bncpfHdtbGJ8d29udXx4NzAwfHlhc1xcLXx5b3VyfHpldG98enRlXFwtL2kudGVzdChcbiAgICAgICAgbmF2aWdhdG9yLnVzZXJBZ2VudC5zdWJzdHIoMCwgNClcbiAgICApXG4pIHtcbiAgICBpc01vYmlsZSA9IHRydWU7XG59XG52YXIgd2FmZmxlYmFySGVpZ2h0ID0gMzg7XG52YXIgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjb250YWluZXJcIik7XG5jb250YWluZXIuc3R5bGUud2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aCArIFwicHhcIjtcbmNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSB3YWZmbGViYXJIZWlnaHQgKyBcInB4XCI7XG5cbnZhciB1cmwgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xudmFyIHNwYWNlSWQgPSB1cmwuZ2V0KFwiaWRcIik7XG52YXIgZnVsbHBhZ2UgPSB1cmwuZ2V0KFwiZnVsbHBhZ2VcIik7XG52YXIgYXNwZWN0ID0gdXJsLmdldChcImFzcGVjdFwiKSB8fCBcImNlbGxhc3BlY3RcIjtcbnZhciBoaWRlV2FmZmxlQmFyID0gdXJsLmdldChcImRpc2FibGVCYXJcIikgfHwgZmFsc2U7XG52YXIgbGFzdFZhbHVlO1xudmFyIGxhc3RTcGFjZTtcbnZhciBzb2NrZXRzO1xuXG5mdW5jdGlvbiBkcmF3KHZhbHVlLCBzcGFjZSwgb3B0aW9ucykge1xuICAgIGlmIChcbiAgICAgICAgbGFzdFNwYWNlICYmXG4gICAgICAgIGxhc3RTcGFjZS50eXBlID09PSBUQkMudHlwZXMudmlzdWFsaXNhdGlvbiAmJlxuICAgICAgICBzcGFjZS50eXBlID09PSBUQkMudHlwZXMudmlzdWFsaXNhdGlvbiAmJlxuICAgICAgICBsYXN0VmFsdWUgPT09IHZhbHVlICYmXG4gICAgICAgIGxhc3RTcGFjZS5sYXllcnMubGVuZ3RoID09PSBzcGFjZS5sYXllcnMubGVuZ3RoXG4gICAgKSB7XG4gICAgICAgIC8vIERvbid0IHJlZHJhdyB2aXp6aWVzIHRoYXQgYXJlIHRoZSBzYW1lXG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gXCJcIjtcblxuICAgIGlmIChzb2NrZXRzKSB7XG4gICAgICAgIHNvY2tldHMuY2xvc2UoKTtcbiAgICB9XG5cbiAgICBpZiAoc3BhY2UubGF5ZXJzICYmIHNwYWNlLmxheWVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHNvY2tldHMgPSBUQkMucmVuZGVyTGF5ZXJzVG9FbGVtZW50KHNwYWNlLCBjb250YWluZXIsIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoc3BhY2UudHlwZSA9PT0gVEJDLnR5cGVzLnZpc3VhbGlzYXRpb24pIHtcbiAgICAgICAgVEJDLnJlbmRlclZpc3VhbGlzYXRpb25Ub0VsZW1lbnQoc3BhY2UsIGNvbnRhaW5lciwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmIChzcGFjZS52YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAvLyBEb24ndCByZW5kZXIgZW1wdHkgc3BhY2VzLiBWaXN1YWxpemF0aW9ucyBkb24ndCBoYXZlIGEgdmFsdWUgZG9oLlxuICAgICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgICAgVEJDLnJlbmRlckNlbGxUb0VsZW1lbnQoc3BhY2UsIGNvbnRhaW5lciwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgY29uc3QgaW5uZXJDb250YWluZXIgPSBjb250YWluZXIuZmlyc3RDaGlsZDtcbiAgICBjb25zdCBjb250YWluZXJCb3ggPSBpbm5lckNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIC8vIEZ1ZGdlIDEwJSBzdHJldGNoIG1vZGUuXG4gICAgLy8gSWYgdGhlIGNvbnRhaW5lciBpcyB3aXRoaW4gMTAlIG9mIHRoZSBjb250YWluZXIgc3RyZXRjaCBpdCBzbyB0aGF0IHRoZXJlIGFyZW4ndCBhbnkgYm9yZGVycyBhcm91bmQgaXQuXG4gICAgaWYgKFxuICAgICAgICBjb250YWluZXJCb3gud2lkdGggKyBjb250YWluZXJCb3gud2lkdGggKiAwLjEgPj0gd2luZG93LmlubmVyV2lkdGggJiZcbiAgICAgICAgY29udGFpbmVyQm94LmhlaWdodCArIGNvbnRhaW5lckJveC5oZWlnaHQgKiAwLjEgPj0gd2luZG93LmlubmVySGVpZ2h0ICYmXG4gICAgICAgICFvcHRpb25zICYmXG4gICAgICAgIGZ1bGxwYWdlID09PSBcInRydWVcIlxuICAgICkge1xuICAgICAgICBkcmF3KHZhbHVlLCBzcGFjZSwgeyBmaXQ6IFwic3RyZXRjaFwiIH0pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlV2FmZmxlQmFyKHNwYWNlLCB1c2VyKSB7XG4gICAgaWYgKCFzcGFjZSkge1xuICAgICAgICAvLyBUaGlzIGhhcHBlbnMgd2hlbiB0aGUgdXNlciBjYWxsYmFjayBjb21lcyBiYWNrIGZpcnN0LlxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJTcGFjZUxpbmtcIikuaHJlZiA9IFRCQy5nZXRXZWJWaWV3TGluayhzcGFjZSk7XG5cbiAgICBpZiAodXNlciAmJiB1c2VyLnByb2ZpbGVQaWN0dXJlKSB7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFxuICAgICAgICAgICAgXCJQcm9maWxlUGljdHVyZVwiXG4gICAgICAgICkuc3JjID0gVEJDLmdldFByb2ZpbGVQaWN0dXJlVXJsKHVzZXIpO1xuICAgIH1cblxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiUHJvZmlsZVBpY3R1cmVMaW5rXCIpLmhyZWYgPSBUQkMuZ2V0VXNlclByb2ZpbGVVcmwoXG4gICAgICAgIHVzZXJcbiAgICApO1xuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJMaW5rVGV4dFwiKS52YWx1ZSA9IFRCQy5nZXRXZWJWaWV3TGluayhzcGFjZSk7XG5cbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIkVtYmVkXCIpLmhyZWYgPSBUQkMuZ2V0V2ViVmlld0xpbmsoc3BhY2UpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiV2VibGlua1wiKS5ocmVmID0gVEJDLmdldFdlYlZpZXdMaW5rKHNwYWNlKTtcblxuICAgIGlmICghc3BhY2UubmFtZSB8fCBzcGFjZS5uYW1lID09PSBcIlwiKSB7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiU3BhY2VOYW1lXCIpLmlubmVyVGV4dCA9IFwiVW50aXRsZWRcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIlNwYWNlTmFtZVwiKS5pbm5lclRleHQgPSBzcGFjZS5uYW1lO1xuICAgIH1cbn1cblxubGV0IHVzZXIgPSB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGNydW5jaCgpIHtcbiAgICB2YXIgb3B0aW9ucyA9IHsgZml0OiBhc3BlY3QsIG9kbzogdHJ1ZSB9O1xuICAgIFRCQy5jcnVuY2goXG4gICAgICAgIHNwYWNlSWQsXG4gICAgICAgICh2YWx1ZSwgc3BhY2UpID0+IHtcbiAgICAgICAgICAgIHVwZGF0ZVdhZmZsZUJhcihzcGFjZSwgdXNlcik7XG5cbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZXJyb3JcIikuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICAgICAgZHJhdyh2YWx1ZSwgc3BhY2UsIG9wdGlvbnMpO1xuICAgICAgICAgICAgbGFzdFZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICBsYXN0U3BhY2UgPSBzcGFjZTtcbiAgICAgICAgfSxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJlcnJvclwiKS5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuICAgICAgICB9LFxuICAgICAgICB1c2VyID0+IHtcbiAgICAgICAgICAgIHVzZXIgPSB1c2VyO1xuICAgICAgICAgICAgdXBkYXRlV2FmZmxlQmFyKGxhc3RTcGFjZSwgdXNlcik7XG4gICAgICAgIH1cbiAgICApO1xufVxuXG4vLyBPbmx5IHJlc2l6ZSBvbiBtb2JpbGUuXG4vLyBTSU1PTiBIQUNLRUQgVEhJUyEgWFhYXG4vL2lmICghaXNNb2JpbGUpIHtcbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIGZ1bmN0aW9uKCkge1xuICAgIHZhciBvcHRpb25zID0geyBmaXQ6IGFzcGVjdCB9O1xuICAgIGNvbnRhaW5lci5zdHlsZS53aWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoICsgXCJweFwiO1xuICAgIGNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSB3YWZmbGViYXJIZWlnaHQgKyBcInB4XCI7XG5cbiAgICAvLyBOZWVkIHRvIG1haW50YWluIGFzcGVjdCByYXRpbyBoZXJlLlxuXG4gICAgaWYgKGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKFwiaWZyYW1lXCIpID09PSBudWxsKSB7XG4gICAgICAgIGRyYXcobGFzdFZhbHVlLCBsYXN0U3BhY2UsIG9wdGlvbnMpO1xuICAgIH1cbn0pO1xuLy99XG5cbldlYkZvbnQubG9hZCh7XG4gICAgZ29vZ2xlOiB7XG4gICAgICAgIGZhbWlsaWVzOiBbXG4gICAgICAgICAgICBcIlNsYWJvXCIsXG4gICAgICAgICAgICBcIkluZGllIEZsb3dlclwiLFxuICAgICAgICAgICAgXCJJbmNvbnNvbGF0YVwiLFxuICAgICAgICAgICAgXCJNYWNvbmRvXCIsXG4gICAgICAgICAgICBcIk1vbm90b25cIixcbiAgICAgICAgICAgIFwiUm9ib3RvIFNsYWJcIixcbiAgICAgICAgICAgIFwiUm9ib3RvXCJcbiAgICAgICAgXVxuICAgIH0sXG4gICAgYWN0aXZlOiAoKSA9PiB7XG4gICAgICAgIHZhciBvcHRpb25zID0geyBmaXQ6IGFzcGVjdCB9O1xuICAgICAgICAvLyBWaXp6aWVzIGRvbid0IG5lZWQgdG8gcmVkcmF3IHdoZW4gZm9udHMgYXJlIGxvYWRlZCBiZWNhdXNlIHRoZXkncmUgaW4gYW4gaWZyYW1lLlxuICAgICAgICBpZiAobGFzdFNwYWNlICYmIGxhc3RTcGFjZS50eXBlICE9PSBUQkMudHlwZXMudmlzdWFsaXNhdGlvbilcbiAgICAgICAgICAgIGRyYXcobGFzdFZhbHVlLCBsYXN0U3BhY2UsIG9wdGlvbnMpO1xuICAgIH1cbn0pO1xuXG5mdW5jdGlvbiBhbmFseXRpY3MoKSB7XG4gICAgY29uc3QgZG50ID1cbiAgICAgICAgbmF2aWdhdG9yLmRvTm90VHJhY2sgfHwgd2luZG93LmRvTm90VHJhY2sgfHwgbmF2aWdhdG9yLm1zRG9Ob3RUcmFjaztcbiAgICBpZiAoZG50ICE9IFwiMVwiICYmIGRudCAhPSBcInllc1wiKSB7XG4gICAgICAgIChmdW5jdGlvbihpLCBzLCBvLCBnLCByLCBhLCBtKSB7XG4gICAgICAgICAgICBpW1wiR29vZ2xlQW5hbHl0aWNzT2JqZWN0XCJdID0gcjtcbiAgICAgICAgICAgIChpW3JdID1cbiAgICAgICAgICAgICAgICBpW3JdIHx8XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIChpW3JdLnEgPSBpW3JdLnEgfHwgW10pLnB1c2goYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAoaVtyXS5sID0gMSAqIG5ldyBEYXRlKCkpO1xuICAgICAgICAgICAgKGEgPSBzLmNyZWF0ZUVsZW1lbnQobykpLCAobSA9IHMuZ2V0RWxlbWVudHNCeVRhZ05hbWUobylbMF0pO1xuICAgICAgICAgICAgYS5hc3luYyA9IDE7XG4gICAgICAgICAgICBhLnNyYyA9IGc7XG4gICAgICAgICAgICBtLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsIG0pO1xuICAgICAgICB9KShcbiAgICAgICAgICAgIHdpbmRvdyxcbiAgICAgICAgICAgIGRvY3VtZW50LFxuICAgICAgICAgICAgXCJzY3JpcHRcIixcbiAgICAgICAgICAgIFwiLy93d3cuZ29vZ2xlLWFuYWx5dGljcy5jb20vYW5hbHl0aWNzLmpzXCIsXG4gICAgICAgICAgICBcImdhXCJcbiAgICAgICAgKTtcblxuICAgICAgICBnYShcImNyZWF0ZVwiLCBDT05GSUcuZ2FDb2RlLCBcImF1dG9cIik7XG4gICAgICAgIGdhKFwic2VuZFwiLCBcInBhZ2V2aWV3XCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoXG4gICAgICAgICAgICBcIlJlc3BlY3RpbmcgRG8tTm90LVRyYWNrLCBub3QgbG9hZGluZyBhbmFseXRpY3MuIFNlZSBodHRwczovL2JpZ2NydW5jaC5pby9nb29nbGUtYW5hbHl0aWNzLWRudC9cIlxuICAgICAgICApO1xuICAgIH1cbn1cblxuLy8gRGlzcGxheSBzb21ldGhpbmcgd2hpbGUgZm9udHMgYXJlIGxvYWRpbmcuXG5jcnVuY2goKTtcblxuYW5hbHl0aWNzKCk7XG5cbmZ1bmN0aW9uIGNvcHlUZXh0KGlkLCBidXR0b25JZCkge1xuICAgIGNvbnN0IHByZXZpb3VzVGV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJ1dHRvbklkKS50ZXh0Q29udGVudDtcbiAgICBjb25zdCB0ZXh0VG9Db3B5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgIHRleHRUb0NvcHkuc2VsZWN0KCk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYnV0dG9uSWQpLnRleHRDb250ZW50ID0gXCJDb3BpZWRcIjtcblxuICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKFwiY29weVwiKTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChidXR0b25JZCkudGV4dENvbnRlbnQgPSBwcmV2aW91c1RleHQ7XG4gICAgfSwgMTAwMCk7XG59XG5cbihmdW5jdGlvbiBvbkxvYWQoKSB7XG4gICAgaWYgKCFoaWRlV2FmZmxlQmFyKSB7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiV2FmZmxlQmFyXCIpLnN0eWxlLmRpc3BsYXkgPSBcImZsZXhcIjtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKFwiYm9keS1ib3JkZXJcIik7XG4gICAgfVxuXG4gICAgZG9jdW1lbnRcbiAgICAgICAgLmdldEVsZW1lbnRCeUlkKFwiU2hhcmVCdXR0b25cIilcbiAgICAgICAgLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiU2hhcmVNb2RhbFwiKS5zdHlsZS5kaXNwbGF5ID0gXCJmbGV4XCI7XG4gICAgICAgICAgICBkb2N1bWVudFxuICAgICAgICAgICAgICAgIC5nZXRFbGVtZW50QnlJZChcImNvbnRhaW5lclwiKVxuICAgICAgICAgICAgICAgIC5jbGFzc0xpc3QuYWRkKFwiYmx1ci1jb250YWluZXJcIik7XG4gICAgICAgIH0pO1xuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJNb2RhbENsb3NlXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJTaGFyZU1vZGFsXCIpLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjb250YWluZXJcIikuY2xhc3NMaXN0LnJlbW92ZShcImJsdXItY29udGFpbmVyXCIpO1xuICAgIH0pO1xuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJDb3B5TGlua1RleHRcIikuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgY29weVRleHQoXCJMaW5rVGV4dFwiLCBcIkNvcHlMaW5rVGV4dFwiKTtcbiAgICB9KTtcblxuICAgIC8vIFNvY2lhbCBidXR0b25zXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJGYWNlYm9va1wiKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oKSB7XG4gICAgICAgIHdpbmRvdy5vcGVuKFxuICAgICAgICAgICAgYGh0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS9zaGFyZXIvc2hhcmVyLnBocD91PSR7VEJDLmdldFdlYlZpZXdMaW5rKFxuICAgICAgICAgICAgICAgIGxhc3RTcGFjZVxuICAgICAgICAgICAgKX1gLFxuICAgICAgICAgICAgXCJcIixcbiAgICAgICAgICAgIFwiaGVpZ2h0PTQwMCx3aWR0aD01NTAsY2VudGVyc2NyZWVuPXllc1wiXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIkxpbmtlZEluXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgd2luZG93Lm9wZW4oXG4gICAgICAgICAgICBgaHR0cHM6Ly9saW5rZWRpbi5jb20vc2hhcmVBcnRpY2xlP3VybD0ke1RCQy5nZXRXZWJWaWV3TGluayhcbiAgICAgICAgICAgICAgICBsYXN0U3BhY2VcbiAgICAgICAgICAgICl9YCxcbiAgICAgICAgICAgIFwiXCIsXG4gICAgICAgICAgICBcImhlaWdodD01MDAsd2lkdGg9NTAwLGNlbnRlcnNjcmVlbj15ZXNcIlxuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJUd2l0dGVyXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgd2luZG93Lm9wZW4oXG4gICAgICAgICAgICBgaHR0cHM6Ly90d2l0dGVyLmNvbS9zaGFyZT91cmw9JHtUQkMuZ2V0V2ViVmlld0xpbmsobGFzdFNwYWNlKX1gLFxuICAgICAgICAgICAgXCJcIixcbiAgICAgICAgICAgIFwiaGVpZ2h0PTUwMCx3aWR0aD01MDAsY2VudGVyc2NyZWVuPXllc1wiXG4gICAgICAgICk7XG4gICAgfSk7XG59KSgpO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==