@ethicdevs/react-global-state-hooks-debugger
Version:
A small websocket based debugger for use with the react-global-state-hooks library
953 lines (860 loc) • 85.3 kB
JavaScript
/******/ (() => { // webpackBootstrap
/******/ "use strict";
/******/ var __webpack_modules__ = ({
/***/ "./node_modules/@ethicdevs/json-tree-view/dist/index.js":
/*!**************************************************************!*\
!*** ./node_modules/@ethicdevs/json-tree-view/dist/index.js ***!
\**************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "renderJSONTreeView": () => (/* binding */ renderJSONTreeView)
/* harmony export */ });
/**
* @name @ethicdevs/json-tree-view
* @license MIT
* @maintainer <William Nemencha, EthicDevs, https://github.com/EthicDevs/json-tree-view>
* @forked-from <前端通過元素展示Json樹狀資料,因, https://github.com/yuda-lyu/w-jsonview-tree>
* @itself-forked-from <沒有加入預先展開數據功能,自己下載來修改, https://github.com/pgrabovets/json-view>
*/
/**
* @export
* @param {Object} jsonObj 輸入Json物件
* @param {Element} rootElem 輸入初始化元素
* @param {Object} [option={}] 輸入設定物件,預設為空物件
* @param {Boolean} [option.expanded=false] 輸入是否預先展開,預設為false
*/
function renderJSONTreeView(jsonObj, rootElem, options) {
if (options === void 0) { options = {}; }
//default expanded
var _expanded = false;
function init() {
//get expanded
if (options) {
_expanded = options["expanded"] === true;
}
//clear
rootElem.innerHTML = "";
//add class
rootElem.classList.add("CompCssDJsonViewTree");
//render
var tree = createTree(jsonObj);
render(tree, rootElem);
return tree;
}
/**
* Create html element
* @param {String} type html element
* @param {Object} config
*/
function createElement(type, config) {
var htmlElement = document.createElement(type);
if (config === undefined) {
return htmlElement;
}
if (config.className) {
htmlElement.className = config.className;
}
if (config.content) {
htmlElement.textContent = config.content;
}
if (config.children) {
config.children.forEach(function (el) {
if (el !== null) {
htmlElement.appendChild(el);
}
});
}
return htmlElement;
}
function createExpandedElement(node) {
var _a, _b, _c;
var iElem = createElement("i");
if (node.expanded) {
iElem.className = "wicon w-caret-down";
}
else {
iElem.className = "wicon w-caret-right";
}
var caretElem = createElement("div", {
className: "wjv-caret-icon",
children: [iElem],
});
var handleClick = node.toggle.bind(node);
caretElem.addEventListener("click", handleClick);
var indexElem = createElement("div", {
className: "wjv-json-index",
content: node.key,
});
var typeElem = createElement("div", {
className: "wjv-json-type",
content: node.type,
});
var keyElem = createElement("div", {
className: "wjv-json-key",
content: node.key,
});
var sizeElem = createElement("div", {
className: "wjv-json-size",
});
if (node.type === "array") {
sizeElem.innerText = "[" + ((_a = node.children) === null || _a === void 0 ? void 0 : _a.length) + "]";
}
else if (node.type === "object") {
sizeElem.innerText = "{" + ((_b = node.children) === null || _b === void 0 ? void 0 : _b.length) + "}";
}
var lineChildren;
if (node.key === null) {
lineChildren = [caretElem, typeElem, sizeElem];
}
else if (((_c = node === null || node === void 0 ? void 0 : node.parent) === null || _c === void 0 ? void 0 : _c.type) === "array") {
lineChildren = [caretElem, indexElem, sizeElem];
}
else {
lineChildren = [caretElem, keyElem, sizeElem];
}
var lineElem = createElement("div", {
className: "wjv-line",
children: lineChildren,
});
if (node.depth > 0) {
//lineElem.style = 'margin-left: ' + node.depth * 24 + 'px;' //IE11 strict模式下無法指派, style為唯讀屬性
lineElem.setAttribute("style", "margin-left: " + node.depth * 24 + "px;");
}
return lineElem;
}
/**
* Create not expanded element
* @param {Object} node
* @return {HTMLElement}
*/
function createNotExpandedElement(node) {
var caretElem = createElement("div", {
className: "wjv-empty-icon",
});
var keyElem = createElement("div", {
className: "wjv-json-key",
content: node.key,
});
var separatorElement = createElement("div", {
className: "wjv-json-separator",
content: ":",
});
var valueType = " wjv-json-" + typeof node.value;
var valueContent = String(node.value);
var valueElement = createElement("div", {
className: "wjv-json-value" + valueType,
content: valueContent,
});
var lineElem = createElement("div", {
className: "wjv-line",
children: [caretElem, keyElem, separatorElement, valueElement],
});
if (node.depth > 0) {
//lineElem.style = 'margin-left: ' + node.depth * 24 + 'px;' //IE11 strict模式下無法指派, style為唯讀屬性
lineElem.setAttribute("style", "margin-left: " + node.depth * 24 + "px;");
}
return lineElem;
}
/**
* Create tree node
* @return {Object}
*/
function createNode() {
return {
key: null,
parent: null,
value: null,
expanded: _expanded,
type: null,
children: null,
elem: null,
depth: 0,
setCaretIconRight: function () {
var _a;
var icon = (_a = this.elem) === null || _a === void 0 ? void 0 : _a.querySelector(".wicon");
icon === null || icon === void 0 ? void 0 : icon.classList.replace("w-caret-down", "w-caret-right");
},
setCaretIconDown: function () {
var _a;
var icon = (_a = this.elem) === null || _a === void 0 ? void 0 : _a.querySelector(".wicon");
icon === null || icon === void 0 ? void 0 : icon.classList.replace("w-caret-right", "w-caret-down");
},
hideChildren: function () {
if (this.children !== null) {
this.children.forEach(function (item) {
var _a;
(_a = item.elem) === null || _a === void 0 ? void 0 : _a.classList.add("wjv-json-hide");
if (item.expanded) {
item.hideChildren();
}
});
}
},
showChildren: function () {
if (this.children !== null) {
this.children.forEach(function (item) {
var _a;
(_a = item.elem) === null || _a === void 0 ? void 0 : _a.classList.remove("wjv-json-hide");
if (item.expanded) {
item.showChildren();
}
});
}
},
toggle: function () {
if (this.expanded) {
this.expanded = false;
this.hideChildren();
this.setCaretIconRight();
}
else {
this.expanded = true;
this.showChildren();
this.setCaretIconDown();
}
},
};
}
/**
* Return variable type
* @param {*} val
*/
function getType(val) {
var type = typeof val;
if (Array.isArray(val)) {
type = "array";
}
else if (val === null) {
type = "null";
}
return type;
}
/**
* Recursively traverse json object
* @param {Object} obj parsed json object
* @param {Object} parent of object tree
*/
function traverseObject(obj, parent) {
for (var key in obj) {
var child = createNode();
child.parent = parent;
child.key = key;
child.type = getType(obj[key]);
child.depth = parent.depth + 1;
child.expanded = _expanded;
if (typeof obj[key] === "object") {
child.children = [];
if (parent.children == null) {
parent.children = [];
}
parent.children.push(child);
traverseObject(obj[key], child);
child.elem = createExpandedElement(child);
}
else {
child.value = obj[key];
child.elem = createNotExpandedElement(child);
if (parent.children == null) {
parent.children = [];
}
parent.children.push(child);
}
}
}
/**
* Create root of a tree
* @param {Object} obj Json object
* @return {Object}
*/
function createTree(obj) {
var tree = createNode();
tree.type = getType(obj);
tree.children = [];
tree.expanded = _expanded;
traverseObject(obj, tree);
tree.elem = createExpandedElement(tree);
return tree;
}
/**
* Recursively traverse Tree object
* @param {Object} node
* @param {Callback} callback
*/
function traverseTree(node, callback) {
callback(node);
if (node.children !== null) {
node.children.forEach(function (item) {
traverseTree(item, callback);
});
}
}
/**
* Render Tree object
* @param {Object} tree
* @param {String} rootElem
*/
function render(tree, rootElem) {
traverseTree(tree, function (node) {
if (!node.expanded) {
node.hideChildren();
}
if (node.elem) {
rootElem.appendChild(node.elem);
}
});
}
return init();
}
/***/ }),
/***/ "./node_modules/deep-object-diff/mjs/added.js":
/*!****************************************************!*\
!*** ./node_modules/deep-object-diff/mjs/added.js ***!
\****************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils.js */ "./node_modules/deep-object-diff/mjs/utils.js");
const addedDiff = (lhs, rhs) => {
if (lhs === rhs || !(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isObject)(lhs) || !(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isObject)(rhs)) return {};
const l = lhs;
const r = rhs;
return Object.keys(r).reduce((acc, key) => {
if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.hasOwnProperty)(l, key)) {
const difference = addedDiff(l[key], r[key]);
if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isObject)(difference) && (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(difference)) return acc;
acc[key] = difference;
return acc;
}
acc[key] = r[key];
return acc;
}, {});
};
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (addedDiff);
/***/ }),
/***/ "./node_modules/deep-object-diff/mjs/deleted.js":
/*!******************************************************!*\
!*** ./node_modules/deep-object-diff/mjs/deleted.js ***!
\******************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils.js */ "./node_modules/deep-object-diff/mjs/utils.js");
const deletedDiff = (lhs, rhs) => {
if (lhs === rhs || !(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isObject)(lhs) || !(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isObject)(rhs)) return {};
const l = lhs;
const r = rhs;
return Object.keys(l).reduce((acc, key) => {
if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.hasOwnProperty)(r, key)) {
const difference = deletedDiff(l[key], r[key]);
if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isObject)(difference) && (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(difference)) return acc;
acc[key] = difference;
return acc;
}
acc[key] = undefined;
return acc;
}, {});
};
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (deletedDiff);
/***/ }),
/***/ "./node_modules/deep-object-diff/mjs/detailed.js":
/*!*******************************************************!*\
!*** ./node_modules/deep-object-diff/mjs/detailed.js ***!
\*******************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var _added_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./added.js */ "./node_modules/deep-object-diff/mjs/added.js");
/* harmony import */ var _deleted_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./deleted.js */ "./node_modules/deep-object-diff/mjs/deleted.js");
/* harmony import */ var _updated_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./updated.js */ "./node_modules/deep-object-diff/mjs/updated.js");
const detailedDiff = (lhs, rhs) => ({
added: (0,_added_js__WEBPACK_IMPORTED_MODULE_0__["default"])(lhs, rhs),
deleted: (0,_deleted_js__WEBPACK_IMPORTED_MODULE_1__["default"])(lhs, rhs),
updated: (0,_updated_js__WEBPACK_IMPORTED_MODULE_2__["default"])(lhs, rhs),
});
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (detailedDiff);
/***/ }),
/***/ "./node_modules/deep-object-diff/mjs/diff.js":
/*!***************************************************!*\
!*** ./node_modules/deep-object-diff/mjs/diff.js ***!
\***************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils.js */ "./node_modules/deep-object-diff/mjs/utils.js");
const diff = (lhs, rhs) => {
if (lhs === rhs) return {}; // equal return no diff
if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isObject)(lhs) || !(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isObject)(rhs)) return rhs; // return updated rhs
const l = lhs;
const r = rhs;
const deletedValues = Object.keys(l).reduce((acc, key) => {
if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.hasOwnProperty)(r, key)) {
acc[key] = undefined;
}
return acc;
}, {});
if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isDate)(l) || (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isDate)(r)) {
if (l.valueOf() == r.valueOf()) return {};
return r;
}
return Object.keys(r).reduce((acc, key) => {
if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.hasOwnProperty)(l, key)){
acc[key] = r[key]; // return added r key
return acc;
}
const difference = diff(l[key], r[key]);
// If the difference is empty, and the lhs is an empty object or the rhs is not an empty object
if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmptyObject)(difference) && !(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isDate)(difference) && ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmptyObject)(l[key]) || !(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmptyObject)(r[key])))
return acc; // return no diff
acc[key] = difference // return updated key
return acc; // return updated key
}, deletedValues);
};
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (diff);
/***/ }),
/***/ "./node_modules/deep-object-diff/mjs/index.js":
/*!****************************************************!*\
!*** ./node_modules/deep-object-diff/mjs/index.js ***!
\****************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "addedDiff": () => (/* reexport safe */ _added_js__WEBPACK_IMPORTED_MODULE_1__["default"]),
/* harmony export */ "deletedDiff": () => (/* reexport safe */ _deleted_js__WEBPACK_IMPORTED_MODULE_2__["default"]),
/* harmony export */ "detailedDiff": () => (/* reexport safe */ _detailed_js__WEBPACK_IMPORTED_MODULE_4__["default"]),
/* harmony export */ "diff": () => (/* reexport safe */ _diff_js__WEBPACK_IMPORTED_MODULE_0__["default"]),
/* harmony export */ "updatedDiff": () => (/* reexport safe */ _updated_js__WEBPACK_IMPORTED_MODULE_3__["default"])
/* harmony export */ });
/* harmony import */ var _diff_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./diff.js */ "./node_modules/deep-object-diff/mjs/diff.js");
/* harmony import */ var _added_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./added.js */ "./node_modules/deep-object-diff/mjs/added.js");
/* harmony import */ var _deleted_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./deleted.js */ "./node_modules/deep-object-diff/mjs/deleted.js");
/* harmony import */ var _updated_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./updated.js */ "./node_modules/deep-object-diff/mjs/updated.js");
/* harmony import */ var _detailed_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./detailed.js */ "./node_modules/deep-object-diff/mjs/detailed.js");
/***/ }),
/***/ "./node_modules/deep-object-diff/mjs/updated.js":
/*!******************************************************!*\
!*** ./node_modules/deep-object-diff/mjs/updated.js ***!
\******************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils.js */ "./node_modules/deep-object-diff/mjs/utils.js");
const updatedDiff = (lhs, rhs) => {
if (lhs === rhs) return {};
if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isObject)(lhs) || !(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isObject)(rhs)) return rhs;
const l = lhs;
const r = rhs;
if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isDate)(l) || (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isDate)(r)) {
if (l.valueOf() == r.valueOf()) return {};
return r;
}
return Object.keys(r).reduce((acc, key) => {
if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.hasOwnProperty)(l, key)) {
const difference = updatedDiff(l[key], r[key]);
// If the difference is empty, and the lhs is an empty object or the rhs is not an empty object
if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmptyObject)(difference) && !(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isDate)(difference) && ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmptyObject)(l[key]) || !(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmptyObject)(r[key])))
return acc; // return no diff
acc[key] = difference;
return acc;
}
return acc;
}, {});
};
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (updatedDiff);
/***/ }),
/***/ "./node_modules/deep-object-diff/mjs/utils.js":
/*!****************************************************!*\
!*** ./node_modules/deep-object-diff/mjs/utils.js ***!
\****************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "hasOwnProperty": () => (/* binding */ hasOwnProperty),
/* harmony export */ "isDate": () => (/* binding */ isDate),
/* harmony export */ "isEmpty": () => (/* binding */ isEmpty),
/* harmony export */ "isEmptyObject": () => (/* binding */ isEmptyObject),
/* harmony export */ "isObject": () => (/* binding */ isObject)
/* harmony export */ });
const isDate = d => d instanceof Date;
const isEmpty = o => Object.keys(o).length === 0;
const isObject = o => o != null && typeof o === 'object';
const hasOwnProperty = (o, ...args) => Object.prototype.hasOwnProperty.call(o, ...args)
const isEmptyObject = (o) => isObject(o) && isEmpty(o);
/***/ })
/******/ });
/************************************************************************/
/******/ // The module cache
/******/ var __webpack_module_cache__ = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ var cachedModule = __webpack_module_cache__[moduleId];
/******/ if (cachedModule !== undefined) {
/******/ return cachedModule.exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = __webpack_module_cache__[moduleId] = {
/******/ // no module.id needed
/******/ // no module.loaded needed
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/************************************************************************/
/******/ /* webpack/runtime/define property getters */
/******/ (() => {
/******/ // define getter functions for harmony exports
/******/ __webpack_require__.d = (exports, definition) => {
/******/ for(var key in definition) {
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ }
/******/ }
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ (() => {
/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
/******/ })();
/******/
/******/ /* webpack/runtime/make namespace object */
/******/ (() => {
/******/ // define __esModule on exports
/******/ __webpack_require__.r = (exports) => {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/ })();
/******/
/************************************************************************/
var __webpack_exports__ = {};
// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
(() => {
/*!************************************!*\
!*** ./debugger-ui/debugger-ui.ts ***!
\************************************/
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "WS_READY_STATE": () => (/* binding */ WS_READY_STATE)
/* harmony export */ });
/* harmony import */ var _ethicdevs_json_tree_view__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethicdevs/json-tree-view */ "./node_modules/@ethicdevs/json-tree-view/dist/index.js");
/* harmony import */ var deep_object_diff__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! deep-object-diff */ "./node_modules/deep-object-diff/mjs/index.js");
var __assign = (undefined && undefined.__assign) || function () {
__assign = Object.assign || function(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);
};
var __spreadArray = (undefined && undefined.__spreadArray) || function (to, from, pack) {
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
ar[i] = from[i];
}
}
return to.concat(ar || Array.prototype.slice.call(from));
};
var WS_READY_STATE;
(function (WS_READY_STATE) {
WS_READY_STATE[WS_READY_STATE["Connecting"] = 0] = "Connecting";
WS_READY_STATE[WS_READY_STATE["Open"] = 1] = "Open";
WS_READY_STATE[WS_READY_STATE["Closing"] = 2] = "Closing";
WS_READY_STATE[WS_READY_STATE["Closed"] = 3] = "Closed";
})(WS_READY_STATE || (WS_READY_STATE = {}));
function nestedIncludes(obj, toMatch) {
var entries = Object.entries(obj);
var mappedEntries = entries.map(function (_a) {
var k = _a[0], v = _a[1];
if (typeof v === "object") {
return [k, nestedIncludes(v, toMatch)];
}
else if (typeof v === "function" ||
typeof v === "undefined" ||
typeof v === "symbol" ||
typeof v === "bigint" ||
typeof v === "number") {
return [k, false];
}
else if (typeof v === "string") {
return [k, v.includes(toMatch)];
}
else {
return [k, false];
}
});
return mappedEntries.some(function (_a) {
var _ = _a[0], v = _a[1];
return v === true;
});
}
function strToBytesLen(str) {
try {
return new TextEncoder().encode(str).length;
}
catch (_) {
return -1;
}
}
function humanFileSize(bytes, si, dp) {
if (si === void 0) { si = false; }
if (dp === void 0) { dp = 1; }
var thresh = si ? 1000 : 1024;
if (Math.abs(bytes) < thresh) {
return bytes + " B";
}
var units = si
? ["kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"]
: ["KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"];
var u = -1;
var r = Math.pow(10, dp);
do {
bytes /= thresh;
++u;
} while (Math.round(Math.abs(bytes) * r) / r >= thresh &&
u < units.length - 1);
return bytes.toFixed(dp) + " " + units[u];
}
function getLogLines(packet, packetBytes) {
var _a;
var date = new Date(packet._t).toLocaleString();
var packetType = (_a = packet._d) === null || _a === void 0 ? void 0 : _a.type;
var packetSize = humanFileSize(packetBytes);
var maybeActionType = packetType == null ? "" : "".concat(packetType, " => ");
var content = JSON.stringify(packet._d, null, 2);
var str = "[".concat(date, "] (").concat(packetSize, ") => ").concat(maybeActionType, "\n").concat(content);
var _b = str.split("\n"), firstLine = _b[0], otherLines = _b.slice(1);
return __spreadArray([firstLine], otherLines, true);
}
/* function makeLogEntry(packet: DebuggerPacket) {
const date = new Date(packet._t).toLocaleString();
const packetType = packet._d?.type;
const maybeActionType = packetType == null ? "" : `${packetType} => `;
const content = JSON.stringify(packet._d, null, 2);
const str = `[${date}]: ${maybeActionType}${content}`;
const [firstLine, ...otherLines] = str.split("\n");
const node = document.createElement("li");
const detailsNode = document.createElement("details");
const summaryNode = document.createElement("summary");
const preNode = document.createElement("pre");
const summaryTextNode = document.createTextNode(firstLine);
const textNode = document.createTextNode(otherLines.join("\n"));
detailsNode.setAttribute("open", "true");
detailsNode.classList.add("log");
detailsNode.classList.add(`log-${packet._k}`);
summaryNode.appendChild(summaryTextNode);
preNode.appendChild(textNode);
detailsNode.appendChild(summaryNode);
detailsNode.appendChild(preNode);
node.appendChild(detailsNode);
return node;
} */
var makeNodeToggleFolding = function (allFolded) { return function (node) {
if (allFolded) {
node.setAttribute("open", true);
}
else {
node.removeAttribute("open");
}
}; };
(function iife(wsUri) {
if (wsUri === void 0) { wsUri = "ws://localhost:8080"; }
console.log("[rgsh-debugger/ui] Hey, will connect to ws on: ".concat(wsUri));
var ws = new WebSocket(wsUri);
var stats = {
dispatchedActions: 0,
stateUpdates: 0,
};
var state = {
actionsAllFolded: false,
stateAllFolded: false,
stateDiffMode: false,
lastStateData: null,
actionsFilterByValue: "",
stateFilterByValue: "",
};
var wsReadyStateEl = document.querySelector("#ws-ready-state");
var actionsLog = document.querySelector("#actions-dispatch-wrapper");
var actionsInputFilter = document.querySelector("#input-filter-actions");
var actionsDispatchCounter = document.querySelector("#dispatched-actions-counter");
var actionsToggleFoldingButton = document.querySelector("#btn-action-toggle-folding");
var stateLog = document.querySelector("#state-updates-wrapper");
var stateInputFilter = document.querySelector("#input-filter-state");
var stateUpdatesCounter = document.querySelector("#state-updates-counter");
var stateDiffModeStatus = document.querySelector("#state-diff-mode");
var stateToggleFoldingButton = document.querySelector("#btn-state-toggle-folding");
var stateToggleDiffModeButton = document.querySelector("#btn-state-toggle-diff-mode");
function log(message) {
if (wsReadyStateEl != null) {
wsReadyStateEl.textContent = message;
}
}
function wsOpen(_) {
ws.send("tail");
log("Connected!");
}
function wsError(ev, reconnectWebSocket) {
log("Socket error: " + ev.message);
reconnectWebSocket();
}
function wsClose(_a, reconnectWebSocket) {
var code = _a.code, reason = _a.reason;
var tags = ["code=".concat(code || "none"), "reason=".concat(reason || "none")];
log("Connection closed. ".concat(tags.join(" ")));
reconnectWebSocket();
}
function wsMessage(ev) {
var data = ev.data.toString();
var packet = JSON.parse(data);
var packetBytes = strToBytesLen(data);
if (packet._k === "action") {
stats.dispatchedActions += 1;
}
else if (packet._k === "state") {
stats.stateUpdates += 1;
}
if (packet._k === "state" &&
state.stateFilterByValue != null &&
state.stateFilterByValue.trim() !== "" &&
nestedIncludes(packet._d, state.stateFilterByValue) === false) {
console.log("includesStateFilter:", nestedIncludes(packet._d, state.stateFilterByValue));
return; // skip
}
if (packet._k === "action" &&
state.actionsFilterByValue != null &&
state.actionsFilterByValue.trim() !== "" &&
nestedIncludes(packet._d, state.actionsFilterByValue) === false) {
console.log("includesActionsFilter:", nestedIncludes(packet._d, state.actionsFilterByValue));
return; // skip
}
//let logEntry;
var logLines = [];
var nodeToUpdate;
if (packet._k === "state" &&
state.stateDiffMode === true &&
state.lastStateData != null) {
var diffResult = (0,deep_object_diff__WEBPACK_IMPORTED_MODULE_1__.updatedDiff)(state.lastStateData, packet._d);
var diffPacket = __assign(__assign({}, packet), { _d: diffResult });
//logEntry = makeLogEntry(diffPacket);
logLines = getLogLines(diffPacket, strToBytesLen(JSON.stringify(diffPacket)));
nodeToUpdate = stateLog;
}
else {
//logEntry = makeLogEntry(packet);
logLines = getLogLines(packet, packetBytes);
nodeToUpdate = packet._k === "action" ? actionsLog : stateLog;
}
if (nodeToUpdate != null) {
var jsonTreeViewNode = document.createElement("div");
(0,_ethicdevs_json_tree_view__WEBPACK_IMPORTED_MODULE_0__.renderJSONTreeView)(packet._d, jsonTreeViewNode, {
expanded: false,
});
var firstLine = logLines[0];
var firstLineNode = document.createTextNode(firstLine);
var wrapperNode = document.createElement("div");
wrapperNode.appendChild(firstLineNode);
wrapperNode.appendChild(jsonTreeViewNode);
nodeToUpdate.appendChild(wrapperNode);
if (nodeToUpdate.parentElement != null) {
nodeToUpdate.parentElement.scrollTop =
nodeToUpdate.parentElement.scrollHeight;
}
}
if (actionsDispatchCounter != null) {
actionsDispatchCounter.textContent = "(".concat(stats.dispatchedActions, " dispatches)");
}
if (stateUpdatesCounter != null) {
stateUpdatesCounter.textContent = "(".concat(stats.stateUpdates, " updates)");
}
state.lastStateData = packet._d;
}
function recreateWebSocket(bindEvents, firstTime) {
if (ws.readyState === WS_READY_STATE.Closed) {
log("Lost connection to debugger. Sleeping 3s before reconnecting...");
}
// Try reconnecting every 3s
var reconnectIntervalId = setInterval(function () {
if (ws.readyState === WS_READY_STATE.Closed) {
log("Trying to ".concat(firstTime ? "re" : "", "connect..."));
ws = new WebSocket(wsUri);
}
else if (ws.readyState === WS_READY_STATE.Open) {
if (reconnectIntervalId) {
clearInterval(reconnectIntervalId);
reconnectIntervalId = null;
log(firstTime ? "Connected!" : "Re-connected!");
bindEvents(ws);
ws.send("tail");
}
}
return undefined;
}, 1000 * 3);
return undefined;
}
function bindWsEvents(socket) {
socket.onopen = wsOpen;
socket.onmessage = wsMessage;
socket.onerror = function (ev) {
wsError(ev, recreateWebSocket.bind(null, bindWsEvents));
};
socket.onclose = function (ev) {
wsClose(ev, recreateWebSocket.bind(null, bindWsEvents));
};
}
bindWsEvents(ws);
ws.send("tail");
actionsInputFilter === null || actionsInputFilter === void 0 ? void 0 : actionsInputFilter.addEventListener("change", function (ev) {
if (ev.target.value != null) {
state.actionsFilterByValue = ev.target.value;
}
});
stateInputFilter === null || stateInputFilter === void 0 ? void 0 : stateInputFilter.addEventListener("change", function (ev) {
if (ev.target.value != null) {
state.stateFilterByValue = ev.target.value;
}
});
actionsToggleFoldingButton === null || actionsToggleFoldingButton === void 0 ? void 0 : actionsToggleFoldingButton.addEventListener("click", function () {
var allActionNodes = document.querySelectorAll(".log-action");
allActionNodes.forEach(makeNodeToggleFolding(state.actionsAllFolded));
state.actionsAllFolded = !state.actionsAllFolded;
});
stateToggleFoldingButton === null || stateToggleFoldingButton === void 0 ? void 0 : stateToggleFoldingButton.addEventListener("click", function () {
var allStateNodes = document.querySelectorAll(".log-state");
allStateNodes.forEach(makeNodeToggleFolding(state.stateAllFolded));
state.stateAllFolded = !state.stateAllFolded;
});
stateToggleDiffModeButton === null || stateToggleDiffModeButton === void 0 ? void 0 : stateToggleDiffModeButton.addEventListener("click", function () {
state.stateDiffMode = !state.stateDiffMode;
if (stateDiffModeStatus != null) {
stateDiffModeStatus.textContent = state.stateDiffMode ? "On" : "Off";
}
});
})();
})();
/******/ })()
;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2Qiw2REFBSTtBQUNqQyxpREFBaUQsYUFBYSxnQkFBZ0I7QUFDOUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksNkVBQWtCO0FBQzlCO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGV0aGljZGV2cy9yZWFjdC1nbG9iYWwtc3RhdGUtaG9va3MtZGVidWdnZXIvLi9ub2RlX21vZHVsZXMvQGV0aGljZGV2cy9qc29uLXRyZWUtdmlldy9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL0BldGhpY2RldnMvcmVhY3QtZ2xvYmFsLXN0YXRlLWhvb2tzLWRlYnVnZ2VyLy4vbm9kZV9tb2R1bGVzL2RlZXAtb2JqZWN0LWRpZmYvbWpzL2FkZGVkLmpzIiwid2VicGFjazovL0BldGhpY2RldnMvcmVhY3QtZ2xvYmFsLXN0YXRlLWhvb2tzLWRlYnVnZ2VyLy4vbm9kZV9tb2R1bGVzL2RlZXAtb2JqZWN0LWRpZmYvbWpzL2RlbGV0ZWQuanMiLCJ3ZWJwYWNrOi8vQGV0aGljZGV2cy9yZWFjdC1nbG9iYWwtc3RhdGUtaG9va3MtZGVidWdnZXIvLi9ub2RlX21vZHVsZXMvZGVlcC1vYmplY3QtZGlmZi9tanMvZGV0YWlsZWQuanMiLCJ3ZWJwYWNrOi8vQGV0aGljZGV2cy9yZWFjdC1nbG9iYWwtc3RhdGUtaG9va3MtZGVidWdnZXIvLi9ub2RlX21vZHVsZXMvZGVlcC1vYmplY3QtZGlmZi9tanMvZGlmZi5qcyIsIndlYnBhY2s6Ly9AZXRoaWNkZXZzL3JlYWN0LWdsb2JhbC1zdGF0ZS1ob29rcy1kZWJ1Z2dlci8uL25vZGVfbW9kdWxlcy9kZWVwLW9iamVjdC1kaWZmL21qcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9AZXRoaWNkZXZzL3JlYWN0LWdsb2JhbC1zdGF0ZS1ob29rcy1kZWJ1Z2dlci8uL25vZGVfbW9kdWxlcy9kZWVwLW9iamVjdC1kaWZmL21qcy91cGRhdGVkLmpzIiwid2VicGFjazovL0BldGhpY2RldnMvcmVhY3QtZ2xvYmFsLXN0YXRlLWhvb2tzLWRlYnVnZ2VyLy4vbm9kZV9tb2R1bGVzL2RlZXAtb2JqZWN0LWRpZmYvbWpzL3V0aWxzLmpzIiwid2VicGFjazovL0BldGhpY2RldnMvcmVhY3QtZ2xvYmFsLXN0YXRlLWhvb2tzLWRlYnVnZ2VyL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0BldGhpY2RldnMvcmVhY3QtZ2xvYmFsLXN0YXRlLWhvb2tzLWRlYnVnZ2VyL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9AZXRoaWNkZXZzL3JlYWN0LWdsb2JhbC1zdGF0ZS1ob29rcy1kZWJ1Z2dlci93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL0BldGhpY2RldnMvcmVhY3QtZ2xvYmFsLXN0YXRlLWhvb2tzLWRlYnVnZ2VyL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vQGV0aGljZGV2cy9yZWFjdC1nbG9iYWwtc3RhdGUtaG9va3MtZGVidWdnZXIvLi9kZWJ1Z2dlci11aS9kZWJ1Z2dlci11aS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBuYW1lIEBldGhpY2RldnMvanNvbi10cmVlLXZpZXdcbiAqIEBsaWNlbnNlIE1JVFxuICogQG1haW50YWluZXIgPFdpbGxpYW0gTmVtZW5jaGEsIEV0aGljRGV2cywgaHR0cHM6Ly9naXRodWIuY29tL0V0aGljRGV2cy9qc29uLXRyZWUtdmlldz5cbiAqIEBmb3JrZWQtZnJvbSA85YmN56uv6YCa6YGO5YWD57Sg5bGV56S6SnNvbuaoueeLgOizh+aWme+8jOWboCwgaHR0cHM6Ly9naXRodWIuY29tL3l1ZGEtbHl1L3ctanNvbnZpZXctdHJlZT5cbiAqIEBpdHNlbGYtZm9ya2VkLWZyb20gPOaykuacieWKoOWFpemgkOWFiOWxlemWi+aVuOaTmuWKn+iDve+8jOiHquW3seS4i+i8ieS+huS/ruaUuSwgaHR0cHM6Ly9naXRodWIuY29tL3BncmFib3ZldHMvanNvbi12aWV3PlxuICovXG4vKipcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7T2JqZWN0fSBqc29uT2JqIOi8uOWFpUpzb27nianku7ZcbiAqIEBwYXJhbSB7RWxlbWVudH0gcm9vdEVsZW0g6Ly45YWl5Yid5aeL5YyW5YWD57SgXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbj17fV0g6Ly45YWl6Kit5a6a54mp5Lu277yM6aCQ6Kit54K656m654mp5Lu2XG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb24uZXhwYW5kZWQ9ZmFsc2VdIOi8uOWFpeaYr+WQpumgkOWFiOWxlemWi++8jOmgkOioreeCumZhbHNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJKU09OVHJlZVZpZXcoanNvbk9iaiwgcm9vdEVsZW0sIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgIC8vZGVmYXVsdCBleHBhbmRlZFxuICAgIHZhciBfZXhwYW5kZWQgPSBmYWxzZTtcbiAgICBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgICAvL2dldCBleHBhbmRlZFxuICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgX2V4cGFuZGVkID0gb3B0aW9uc1tcImV4cGFuZGVkXCJdID09PSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vY2xlYXJcbiAgICAgICAgcm9vdEVsZW0uaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgLy9hZGQgY2xhc3NcbiAgICAgICAgcm9vdEVsZW0uY2xhc3NMaXN0LmFkZChcIkNvbXBDc3NESnNvblZpZXdUcmVlXCIpO1xuICAgICAgICAvL3JlbmRlclxuICAgICAgICB2YXIgdHJlZSA9IGNyZWF0ZVRyZWUoanNvbk9iaik7XG4gICAgICAgIHJlbmRlcih0cmVlLCByb290RWxlbSk7XG4gICAgICAgIHJldHVybiB0cmVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgaHRtbCBlbGVtZW50XG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgaHRtbCBlbGVtZW50XG4gICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQodHlwZSwgY29uZmlnKSB7XG4gICAgICAgIHZhciBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodHlwZSk7XG4gICAgICAgIGlmIChjb25maWcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcuY2xhc3NOYW1lKSB7XG4gICAgICAgICAgICBodG1sRWxlbWVudC5jbGFzc05hbWUgPSBjb25maWcuY2xhc3NOYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcuY29udGVudCkge1xuICAgICAgICAgICAgaHRtbEVsZW1lbnQudGV4dENvbnRlbnQgPSBjb25maWcuY29udGVudDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBjb25maWcuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWwgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoZWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY3JlYXRlRXhwYW5kZWRFbGVtZW50KG5vZGUpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIHZhciBpRWxlbSA9IGNyZWF0ZUVsZW1lbnQoXCJpXCIpO1xuICAgICAgICBpZiAobm9kZS5leHBhbmRlZCkge1xuICAgICAgICAgICAgaUVsZW0uY2xhc3NOYW1lID0gXCJ3aWNvbiB3LWNhcmV0LWRvd25cIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlFbGVtLmNsYXNzTmFtZSA9IFwid2ljb24gdy1jYXJldC1yaWdodFwiO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjYXJldEVsZW0gPSBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZTogXCJ3anYtY2FyZXQtaWNvblwiLFxuICAgICAgICAgICAgY2hpbGRyZW46IFtpRWxlbV0sXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgaGFuZGxlQ2xpY2sgPSBub2RlLnRvZ2dsZS5iaW5kKG5vZGUpO1xuICAgICAgICBjYXJldEVsZW0uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZUNsaWNrKTtcbiAgICAgICAgdmFyIGluZGV4RWxlbSA9IGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBcIndqdi1qc29uLWluZGV4XCIsXG4gICAgICAgICAgICBjb250ZW50OiBub2RlLmtleSxcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciB0eXBlRWxlbSA9IGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBcInd