@vue/devtools 6.0.3 → 6.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/backend.js +2 -2
- package/package.json +1 -1
package/build/backend.js
CHANGED
|
@@ -107,7 +107,7 @@ Object.defineProperty(exports, "__esModule", ({
|
|
|
107
107
|
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
|
|
108
108
|
|
|
109
109
|
"use strict";
|
|
110
|
-
eval("\n\nvar __importDefault = this && this.__importDefault || function (mod) {\n return mod && mod.__esModule ? mod : {\n \"default\": mod\n };\n};\n\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nexports._legacy_getAndRegisterApps = exports.removeApp = exports.sendApps = exports.waitForAppsRegistration = exports.getAppRecord = exports.getAppRecordId = exports.mapAppRecord = exports.selectApp = exports.registerApp = void 0;\n\nconst shared_utils_1 = __webpack_require__(27146);\n\nconst speakingurl_1 = __importDefault(__webpack_require__(97500));\n\nconst queue_1 = __webpack_require__(49107);\n\nconst scan_1 = __webpack_require__(18426);\n\nconst timeline_1 = __webpack_require__(41515);\n\nconst backend_1 = __webpack_require__(36873);\n\nconst jobs = new queue_1.JobQueue();\nlet recordId = 0;\nconst appRecordPromises = new Map();\n\nasync function registerApp(options, ctx) {\n return jobs.queue(() => registerAppJob(options, ctx));\n}\n\nexports.registerApp = registerApp;\n\nasync function registerAppJob(options, ctx) {\n // Dedupe\n if (ctx.appRecords.find(a => a.options.app === options.app)) {\n return;\n } // Find correct backend\n\n\n const baseFrameworkVersion = parseInt(options.version.substring(0, options.version.indexOf('.')));\n\n for (let i = 0; i < backend_1.availableBackends.length; i++) {\n const backendOptions = backend_1.availableBackends[i];\n\n if (backendOptions.frameworkVersion === baseFrameworkVersion) {\n // Enable backend if it's not enabled\n const backend = (0, backend_1.getBackend)(backendOptions, ctx);\n await createAppRecord(options, backend, ctx);\n break;\n }\n }\n}\n\nasync function createAppRecord(options, backend, ctx) {\n var _a;\n\n const rootInstance = await backend.api.getAppRootInstance(options.app);\n\n if (rootInstance) {\n if ((await backend.api.getComponentDevtoolsOptions(rootInstance)).hide) {\n return;\n }\n\n recordId++;\n const name = await backend.api.getAppRecordName(options.app, recordId.toString());\n const id = getAppRecordId(options.app, (0, speakingurl_1.default)(name));\n const [el] = await backend.api.getComponentRootElements(rootInstance);\n const record = {\n id,\n name,\n options,\n backend,\n lastInspectedComponentId: null,\n instanceMap: new Map(),\n rootInstance,\n perfGroupIds: new Map(),\n iframe: document !== el.ownerDocument ? el.ownerDocument.location.pathname : null,\n meta: (_a = options.meta) !== null && _a !== void 0 ? _a : {}\n };\n options.app.__VUE_DEVTOOLS_APP_RECORD__ = record;\n const rootId = `${record.id}:root`;\n record.instanceMap.set(rootId, record.rootInstance);\n record.rootInstance.__VUE_DEVTOOLS_UID__ = rootId; // Timeline\n\n (0, timeline_1.addBuiltinLayers)(record, ctx);\n ctx.appRecords.push(record);\n\n if (backend.options.setupApp) {\n backend.options.setupApp(backend.api, record);\n }\n\n await backend.api.registerApplication(options.app);\n ctx.bridge.send(shared_utils_1.BridgeEvents.TO_FRONT_APP_ADD, {\n appRecord: mapAppRecord(record)\n });\n\n if (appRecordPromises.has(options.app)) {\n for (const r of appRecordPromises.get(options.app)) {\n await r(record);\n }\n } // Auto select first app\n\n\n if (ctx.currentAppRecord == null) {\n await selectApp(record, ctx);\n }\n } else {\n console.warn('[Vue devtools] No root instance found for app, it might have been unmounted', options.app);\n }\n}\n\nasync function selectApp(record, ctx) {\n ctx.currentAppRecord = record;\n ctx.currentInspectedComponentId = record.lastInspectedComponentId;\n ctx.bridge.send(shared_utils_1.BridgeEvents.TO_FRONT_APP_SELECTED, {\n id: record.id,\n lastInspectedComponentId: record.lastInspectedComponentId\n });\n}\n\nexports.selectApp = selectApp;\n\nfunction mapAppRecord(record) {\n return {\n id: record.id,\n name: record.name,\n version: record.options.version,\n iframe: record.iframe\n };\n}\n\nexports.mapAppRecord = mapAppRecord;\nconst appIds = new Set();\n\nfunction getAppRecordId(app, defaultId) {\n if (app.__VUE_DEVTOOLS_APP_RECORD_ID__ != null) {\n return app.__VUE_DEVTOOLS_APP_RECORD_ID__;\n }\n\n let id = defaultId !== null && defaultId !== void 0 ? defaultId : (recordId++).toString();\n\n if (defaultId && appIds.has(id)) {\n let count = 1;\n\n while (appIds.has(`${defaultId}:${count}`)) {\n count++;\n }\n\n id = `${defaultId}_${count}`;\n }\n\n appIds.add(id);\n app.__VUE_DEVTOOLS_APP_RECORD_ID__ = id;\n return id;\n}\n\nexports.getAppRecordId = getAppRecordId;\n\nasync function getAppRecord(app, ctx) {\n const record = ctx.appRecords.find(ar => ar.options.app === app);\n\n if (record) {\n return record;\n }\n\n return new Promise((resolve, reject) => {\n let resolvers = appRecordPromises.get(app);\n let timedOut = false;\n\n if (!resolvers) {\n resolvers = [];\n appRecordPromises.set(app, resolvers);\n }\n\n const fn = record => {\n if (!timedOut) {\n clearTimeout(timer);\n resolve(record);\n }\n };\n\n resolvers.push(fn);\n const timer = setTimeout(() => {\n timedOut = true;\n const index = resolvers.indexOf(fn);\n if (index !== -1) resolvers.splice(index, 1);\n\n if (shared_utils_1.SharedData.debugInfo) {\n // eslint-disable-next-line no-console\n console.log('Timed out waiting for app record', app);\n }\n\n reject(new Error(`Timed out getting app record for app`));\n }, 60000);\n });\n}\n\nexports.getAppRecord = getAppRecord;\n\nfunction waitForAppsRegistration() {\n return jobs.queue(async () => {});\n}\n\nexports.waitForAppsRegistration = waitForAppsRegistration;\n\nasync function sendApps(ctx) {\n const appRecords = [];\n\n for (const appRecord of ctx.appRecords) {\n appRecords.push(appRecord);\n }\n\n ctx.bridge.send(shared_utils_1.BridgeEvents.TO_FRONT_APP_LIST, {\n apps: appRecords.map(mapAppRecord)\n });\n}\n\nexports.sendApps = sendApps;\n\nfunction removeAppRecord(appRecord, ctx) {\n try {\n appIds.delete(appRecord.id);\n const index = ctx.appRecords.indexOf(appRecord);\n if (index !== -1) ctx.appRecords.splice(index, 1);\n (0, timeline_1.removeLayersForApp)(appRecord.options.app, ctx);\n ctx.bridge.send(shared_utils_1.BridgeEvents.TO_FRONT_APP_REMOVE, {\n id: appRecord.id\n });\n } catch (e) {\n if (shared_utils_1.SharedData.debugInfo) {\n console.error(e);\n }\n }\n}\n\nasync function removeApp(app, ctx) {\n try {\n const appRecord = await getAppRecord(app, ctx);\n\n if (appRecord) {\n removeAppRecord(appRecord, ctx);\n }\n } catch (e) {\n if (shared_utils_1.SharedData.debugInfo) {\n console.error(e);\n }\n }\n}\n\nexports.removeApp = removeApp; // eslint-disable-next-line camelcase\n\nfunction _legacy_getVueFromApp(app) {\n if (app.constructor.name === 'VueComponent') {\n // When Vue.extend is used the component is an instance of VueComponent instead of Vue.\n // VueComponent has a property super which points to the original Vue constructor\n return app.constructor.super;\n }\n\n return app.constructor;\n} // eslint-disable-next-line camelcase\n\n\nasync function _legacy_getAndRegisterApps(ctx) {\n // Remove apps that are legacy\n ctx.appRecords.forEach(appRecord => {\n if (appRecord.meta.Vue) {\n removeAppRecord(appRecord, ctx);\n }\n });\n const apps = (0, scan_1.scan)();\n apps.forEach(app => {\n const Vue = _legacy_getVueFromApp(app);\n\n registerApp({\n app,\n types: {},\n version: Vue.version,\n meta: {\n Vue\n }\n }, ctx);\n });\n}\n\nexports._legacy_getAndRegisterApps = _legacy_getAndRegisterApps;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QVcsQ0FBQztBQUNWLFNBRFU7QUFFVixXQUFLLEVBQUUsRUFGRztBQUdWLGFBQU8sRUFBRSxHQUFHLENBQUMsT0FISDtBQUlWLFVBQUksRUFBRTtBQUNKO0FBREk7QUFKSSxLQUFELEVBT1IsR0FQUSxDQUFYO0FBUUQsR0FWRDtBQVdEOztBQXBCRCIsInNvdXJjZXMiOlsid2VicGFjazovL0B2dWUvZGV2dG9vbHMvLi4vc3JjL2FwcC50cz9mNzE1Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5fbGVnYWN5X2dldEFuZFJlZ2lzdGVyQXBwcyA9IGV4cG9ydHMucmVtb3ZlQXBwID0gZXhwb3J0cy5zZW5kQXBwcyA9IGV4cG9ydHMud2FpdEZvckFwcHNSZWdpc3RyYXRpb24gPSBleHBvcnRzLmdldEFwcFJlY29yZCA9IGV4cG9ydHMuZ2V0QXBwUmVjb3JkSWQgPSBleHBvcnRzLm1hcEFwcFJlY29yZCA9IGV4cG9ydHMuc2VsZWN0QXBwID0gZXhwb3J0cy5yZWdpc3RlckFwcCA9IHZvaWQgMDtcbmNvbnN0IHNoYXJlZF91dGlsc18xID0gcmVxdWlyZShcIkB2dWUtZGV2dG9vbHMvc2hhcmVkLXV0aWxzXCIpO1xuY29uc3Qgc3BlYWtpbmd1cmxfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwic3BlYWtpbmd1cmxcIikpO1xuY29uc3QgcXVldWVfMSA9IHJlcXVpcmUoXCIuL3V0aWwvcXVldWVcIik7XG5jb25zdCBzY2FuXzEgPSByZXF1aXJlKFwiLi9sZWdhY3kvc2NhblwiKTtcbmNvbnN0IHRpbWVsaW5lXzEgPSByZXF1aXJlKFwiLi90aW1lbGluZVwiKTtcbmNvbnN0IGJhY2tlbmRfMSA9IHJlcXVpcmUoXCIuL2JhY2tlbmRcIik7XG5jb25zdCBqb2JzID0gbmV3IHF1ZXVlXzEuSm9iUXVldWUoKTtcbmxldCByZWNvcmRJZCA9IDA7XG5jb25zdCBhcHBSZWNvcmRQcm9taXNlcyA9IG5ldyBNYXAoKTtcbmFzeW5jIGZ1bmN0aW9uIHJlZ2lzdGVyQXBwKG9wdGlvbnMsIGN0eCkge1xuICAgIHJldHVybiBqb2JzLnF1ZXVlKCgpID0+IHJlZ2lzdGVyQXBwSm9iKG9wdGlvbnMsIGN0eCkpO1xufVxuZXhwb3J0cy5yZWdpc3RlckFwcCA9IHJlZ2lzdGVyQXBwO1xuYXN5bmMgZnVuY3Rpb24gcmVnaXN0ZXJBcHBKb2Iob3B0aW9ucywgY3R4KSB7XG4gICAgLy8gRGVkdXBlXG4gICAgaWYgKGN0eC5hcHBSZWNvcmRzLmZpbmQoYSA9PiBhLm9wdGlvbnMuYXBwID09PSBvcHRpb25zLmFwcCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBGaW5kIGNvcnJlY3QgYmFja2VuZFxuICAgIGNvbnN0IGJhc2VGcmFtZXdvcmtWZXJzaW9uID0gcGFyc2VJbnQob3B0aW9ucy52ZXJzaW9uLnN1YnN0cmluZygwLCBvcHRpb25zLnZlcnNpb24uaW5kZXhPZignLicpKSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiYWNrZW5kXzEuYXZhaWxhYmxlQmFja2VuZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgYmFja2VuZE9wdGlvbnMgPSBiYWNrZW5kXzEuYXZhaWxhYmxlQmFja2VuZHNbaV07XG4gICAgICAgIGlmIChiYWNrZW5kT3B0aW9ucy5mcmFtZXdvcmtWZXJzaW9uID09PSBiYXNlRnJhbWV3b3JrVmVyc2lvbikge1xuICAgICAgICAgICAgLy8gRW5hYmxlIGJhY2tlbmQgaWYgaXQncyBub3QgZW5hYmxlZFxuICAgICAgICAgICAgY29uc3QgYmFja2VuZCA9ICgwLCBiYWNrZW5kXzEuZ2V0QmFja2VuZCkoYmFja2VuZE9wdGlvbnMsIGN0eCk7XG4gICAgICAgICAgICBhd2FpdCBjcmVhdGVBcHBSZWNvcmQob3B0aW9ucywgYmFja2VuZCwgY3R4KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxufVxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQXBwUmVjb3JkKG9wdGlvbnMsIGJhY2tlbmQsIGN0eCkge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCByb290SW5zdGFuY2UgPSBhd2FpdCBiYWNrZW5kLmFwaS5nZXRBcHBSb290SW5zdGFuY2Uob3B0aW9ucy5hcHApO1xuICAgIGlmIChyb290SW5zdGFuY2UpIHtcbiAgICAgICAgaWYgKChhd2FpdCBiYWNrZW5kLmFwaS5nZXRDb21wb25lbnREZXZ0b29sc09wdGlvbnMocm9vdEluc3RhbmNlKSkuaGlkZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJlY29yZElkKys7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBhd2FpdCBiYWNrZW5kLmFwaS5nZXRBcHBSZWNvcmROYW1lKG9wdGlvbnMuYXBwLCByZWNvcmRJZC50b1N0cmluZygpKTtcbiAgICAgICAgY29uc3QgaWQgPSBnZXRBcHBSZWNvcmRJZChvcHRpb25zLmFwcCwgKDAsIHNwZWFraW5ndXJsXzEuZGVmYXVsdCkobmFtZSkpO1xuICAgICAgICBjb25zdCBbZWxdID0gYXdhaXQgYmFja2VuZC5hcGkuZ2V0Q29tcG9uZW50Um9vdEVsZW1lbnRzKHJvb3RJbnN0YW5jZSk7XG4gICAgICAgIGNvbnN0IHJlY29yZCA9IHtcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBiYWNrZW5kLFxuICAgICAgICAgICAgbGFzdEluc3BlY3RlZENvbXBvbmVudElkOiBudWxsLFxuICAgICAgICAgICAgaW5zdGFuY2VNYXA6IG5ldyBNYXAoKSxcbiAgICAgICAgICAgIHJvb3RJbnN0YW5jZSxcbiAgICAgICAgICAgIHBlcmZHcm91cElkczogbmV3IE1hcCgpLFxuICAgICAgICAgICAgaWZyYW1lOiBkb2N1bWVudCAhPT0gZWwub3duZXJEb2N1bWVudCA/IGVsLm93bmVyRG9jdW1lbnQubG9jYXRpb24ucGF0aG5hbWUgOiBudWxsLFxuICAgICAgICAgICAgbWV0YTogKF9hID0gb3B0aW9ucy5tZXRhKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB7fSxcbiAgICAgICAgfTtcbiAgICAgICAgb3B0aW9ucy5hcHAuX19WVUVfREVWVE9PTFNfQVBQX1JFQ09SRF9fID0gcmVjb3JkO1xuICAgICAgICBjb25zdCByb290SWQgPSBgJHtyZWNvcmQuaWR9OnJvb3RgO1xuICAgICAgICByZWNvcmQuaW5zdGFuY2VNYXAuc2V0KHJvb3RJZCwgcmVjb3JkLnJvb3RJbnN0YW5jZSk7XG4gICAgICAgIHJlY29yZC5yb290SW5zdGFuY2UuX19WVUVfREVWVE9PTFNfVUlEX18gPSByb290SWQ7XG4gICAgICAgIC8vIFRpbWVsaW5lXG4gICAgICAgICgwLCB0aW1lbGluZV8xLmFkZEJ1aWx0aW5MYXllcnMpKHJlY29yZCwgY3R4KTtcbiAgICAgICAgY3R4LmFwcFJlY29yZHMucHVzaChyZWNvcmQpO1xuICAgICAgICBpZiAoYmFja2VuZC5vcHRpb25zLnNldHVwQXBwKSB7XG4gICAgICAgICAgICBiYWNrZW5kLm9wdGlvbnMuc2V0dXBBcHAoYmFja2VuZC5hcGksIHJlY29yZCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgYmFja2VuZC5hcGkucmVnaXN0ZXJBcHBsaWNhdGlvbihvcHRpb25zLmFwcCk7XG4gICAgICAgIGN0eC5icmlkZ2Uuc2VuZChzaGFyZWRfdXRpbHNfMS5CcmlkZ2VFdmVudHMuVE9fRlJPTlRfQVBQX0FERCwge1xuICAgICAgICAgICAgYXBwUmVjb3JkOiBtYXBBcHBSZWNvcmQocmVjb3JkKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChhcHBSZWNvcmRQcm9taXNlcy5oYXMob3B0aW9ucy5hcHApKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHIgb2YgYXBwUmVjb3JkUHJvbWlzZXMuZ2V0KG9wdGlvbnMuYXBwKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHIocmVjb3JkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBBdXRvIHNlbGVjdCBmaXJzdCBhcHBcbiAgICAgICAgaWYgKGN0eC5jdXJyZW50QXBwUmVjb3JkID09IG51bGwpIHtcbiAgICAgICAgICAgIGF3YWl0IHNlbGVjdEFwcChyZWNvcmQsIGN0eCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW1Z1ZSBkZXZ0b29sc10gTm8gcm9vdCBpbnN0YW5jZSBmb3VuZCBmb3IgYXBwLCBpdCBtaWdodCBoYXZlIGJlZW4gdW5tb3VudGVkJywgb3B0aW9ucy5hcHApO1xuICAgIH1cbn1cbmFzeW5jIGZ1bmN0aW9uIHNlbGVjdEFwcChyZWNvcmQsIGN0eCkge1xuICAgIGN0eC5jdXJyZW50QXBwUmVjb3JkID0gcmVjb3JkO1xuICAgIGN0eC5jdXJyZW50SW5zcGVjdGVkQ29tcG9uZW50SWQgPSByZWNvcmQubGFzdEluc3BlY3RlZENvbXBvbmVudElkO1xuICAgIGN0eC5icmlkZ2Uuc2VuZChzaGFyZWRfdXRpbHNfMS5CcmlkZ2VFdmVudHMuVE9fRlJPTlRfQVBQX1NFTEVDVEVELCB7XG4gICAgICAgIGlkOiByZWNvcmQuaWQsXG4gICAgICAgIGxhc3RJbnNwZWN0ZWRDb21wb25lbnRJZDogcmVjb3JkLmxhc3RJbnNwZWN0ZWRDb21wb25lbnRJZCxcbiAgICB9KTtcbn1cbmV4cG9ydHMuc2VsZWN0QXBwID0gc2VsZWN0QXBwO1xuZnVuY3Rpb24gbWFwQXBwUmVjb3JkKHJlY29yZCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGlkOiByZWNvcmQuaWQsXG4gICAgICAgIG5hbWU6IHJlY29yZC5uYW1lLFxuICAgICAgICB2ZXJzaW9uOiByZWNvcmQub3B0aW9ucy52ZXJzaW9uLFxuICAgICAgICBpZnJhbWU6IHJlY29yZC5pZnJhbWUsXG4gICAgfTtcbn1cbmV4cG9ydHMubWFwQXBwUmVjb3JkID0gbWFwQXBwUmVjb3JkO1xuY29uc3QgYXBwSWRzID0gbmV3IFNldCgpO1xuZnVuY3Rpb24gZ2V0QXBwUmVjb3JkSWQoYXBwLCBkZWZhdWx0SWQpIHtcbiAgICBpZiAoYXBwLl9fVlVFX0RFVlRPT0xTX0FQUF9SRUNPUkRfSURfXyAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBhcHAuX19WVUVfREVWVE9PTFNfQVBQX1JFQ09SRF9JRF9fO1xuICAgIH1cbiAgICBsZXQgaWQgPSBkZWZhdWx0SWQgIT09IG51bGwgJiYgZGVmYXVsdElkICE9PSB2b2lkIDAgPyBkZWZhdWx0SWQgOiAocmVjb3JkSWQrKykudG9TdHJpbmcoKTtcbiAgICBpZiAoZGVmYXVsdElkICYmIGFwcElkcy5oYXMoaWQpKSB7XG4gICAgICAgIGxldCBjb3VudCA9IDE7XG4gICAgICAgIHdoaWxlIChhcHBJZHMuaGFzKGAke2RlZmF1bHRJZH06JHtjb3VudH1gKSkge1xuICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgfVxuICAgICAgICBpZCA9IGAke2RlZmF1bHRJZH1fJHtjb3VudH1gO1xuICAgIH1cbiAgICBhcHBJZHMuYWRkKGlkKTtcbiAgICBhcHAuX19WVUVfREVWVE9PTFNfQVBQX1JFQ09SRF9JRF9fID0gaWQ7XG4gICAgcmV0dXJuIGlkO1xufVxuZXhwb3J0cy5nZXRBcHBSZWNvcmRJZCA9IGdldEFwcFJlY29yZElkO1xuYXN5bmMgZnVuY3Rpb24gZ2V0QXBwUmVjb3JkKGFwcCwgY3R4KSB7XG4gICAgY29uc3QgcmVjb3JkID0gY3R4LmFwcFJlY29yZHMuZmluZChhciA9PiBhci5vcHRpb25zLmFwcCA9PT0gYXBwKTtcbiAgICBpZiAocmVjb3JkKSB7XG4gICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgfVxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGxldCByZXNvbHZlcnMgPSBhcHBSZWNvcmRQcm9taXNlcy5nZXQoYXBwKTtcbiAgICAgICAgbGV0IHRpbWVkT3V0ID0gZmFsc2U7XG4gICAgICAgIGlmICghcmVzb2x2ZXJzKSB7XG4gICAgICAgICAgICByZXNvbHZlcnMgPSBbXTtcbiAgICAgICAgICAgIGFwcFJlY29yZFByb21pc2VzLnNldChhcHAsIHJlc29sdmVycyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZm4gPSAocmVjb3JkKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRpbWVkT3V0KSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHJlY29yZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJlc29sdmVycy5wdXNoKGZuKTtcbiAgICAgICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRpbWVkT3V0ID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gcmVzb2x2ZXJzLmluZGV4T2YoZm4pO1xuICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSlcbiAgICAgICAgICAgICAgICByZXNvbHZlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIGlmIChzaGFyZWRfdXRpbHNfMS5TaGFyZWREYXRhLmRlYnVnSW5mbykge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1RpbWVkIG91dCB3YWl0aW5nIGZvciBhcHAgcmVjb3JkJywgYXBwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFRpbWVkIG91dCBnZXR0aW5nIGFwcCByZWNvcmQgZm9yIGFwcGApKTtcbiAgICAgICAgfSwgNjAwMDApO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRBcHBSZWNvcmQgPSBnZXRBcHBSZWNvcmQ7XG5mdW5jdGlvbiB3YWl0Rm9yQXBwc1JlZ2lzdHJhdGlvbigpIHtcbiAgICByZXR1cm4gam9icy5xdWV1ZShhc3luYyAoKSA9PiB7IH0pO1xufVxuZXhwb3J0cy53YWl0Rm9yQXBwc1JlZ2lzdHJhdGlvbiA9IHdhaXRGb3JBcHBzUmVnaXN0cmF0aW9uO1xuYXN5bmMgZnVuY3Rpb24gc2VuZEFwcHMoY3R4KSB7XG4gICAgY29uc3QgYXBwUmVjb3JkcyA9IFtdO1xuICAgIGZvciAoY29uc3QgYXBwUmVjb3JkIG9mIGN0eC5hcHBSZWNvcmRzKSB7XG4gICAgICAgIGFwcFJlY29yZHMucHVzaChhcHBSZWNvcmQpO1xuICAgIH1cbiAgICBjdHguYnJpZGdlLnNlbmQoc2hhcmVkX3V0aWxzXzEuQnJpZGdlRXZlbnRzLlRPX0ZST05UX0FQUF9MSVNULCB7XG4gICAgICAgIGFwcHM6IGFwcFJlY29yZHMubWFwKG1hcEFwcFJlY29yZCksXG4gICAgfSk7XG59XG5leHBvcnRzLnNlbmRBcHBzID0gc2VuZEFwcHM7XG5mdW5jdGlvbiByZW1vdmVBcHBSZWNvcmQoYXBwUmVjb3JkLCBjdHgpIHtcbiAgICB0cnkge1xuICAgICAgICBhcHBJZHMuZGVsZXRlKGFwcFJlY29yZC5pZCk7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gY3R4LmFwcFJlY29yZHMuaW5kZXhPZihhcHBSZWNvcmQpO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKVxuICAgICAgICAgICAgY3R4LmFwcFJlY29yZHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgKDAsIHRpbWVsaW5lXzEucmVtb3ZlTGF5ZXJzRm9yQXBwKShhcHBSZWNvcmQub3B0aW9ucy5hcHAsIGN0eCk7XG4gICAgICAgIGN0eC5icmlkZ2Uuc2VuZChzaGFyZWRfdXRpbHNfMS5CcmlkZ2VFdmVudHMuVE9fRlJPTlRfQVBQX1JFTU9WRSwgeyBpZDogYXBwUmVjb3JkLmlkIH0pO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoc2hhcmVkX3V0aWxzXzEuU2hhcmVkRGF0YS5kZWJ1Z0luZm8pIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5hc3luYyBmdW5jdGlvbiByZW1vdmVBcHAoYXBwLCBjdHgpIHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBhcHBSZWNvcmQgPSBhd2FpdCBnZXRBcHBSZWNvcmQoYXBwLCBjdHgpO1xuICAgICAgICBpZiAoYXBwUmVjb3JkKSB7XG4gICAgICAgICAgICByZW1vdmVBcHBSZWNvcmQoYXBwUmVjb3JkLCBjdHgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChzaGFyZWRfdXRpbHNfMS5TaGFyZWREYXRhLmRlYnVnSW5mbykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMucmVtb3ZlQXBwID0gcmVtb3ZlQXBwO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNhbWVsY2FzZVxuZnVuY3Rpb24gX2xlZ2FjeV9nZXRWdWVGcm9tQXBwKGFwcCkge1xuICAgIGlmIChhcHAuY29uc3RydWN0b3IubmFtZSA9PT0gJ1Z1ZUNvbXBvbmVudCcpIHtcbiAgICAgICAgLy8gV2hlbiBWdWUuZXh0ZW5kIGlzIHVzZWQgdGhlIGNvbXBvbmVudCBpcyBhbiBpbnN0YW5jZSBvZiBWdWVDb21wb25lbnQgaW5zdGVhZCBvZiBWdWUuXG4gICAgICAgIC8vIFZ1ZUNvbXBvbmVudCBoYXMgYSBwcm9wZXJ0eSBzdXBlciB3aGljaCBwb2ludHMgdG8gdGhlIG9yaWdpbmFsIFZ1ZSBjb25zdHJ1Y3RvclxuICAgICAgICByZXR1cm4gYXBwLmNvbnN0cnVjdG9yLnN1cGVyO1xuICAgIH1cbiAgICByZXR1cm4gYXBwLmNvbnN0cnVjdG9yO1xufVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNhbWVsY2FzZVxuYXN5bmMgZnVuY3Rpb24gX2xlZ2FjeV9nZXRBbmRSZWdpc3RlckFwcHMoY3R4KSB7XG4gICAgLy8gUmVtb3ZlIGFwcHMgdGhhdCBhcmUgbGVnYWN5XG4gICAgY3R4LmFwcFJlY29yZHMuZm9yRWFjaChhcHBSZWNvcmQgPT4ge1xuICAgICAgICBpZiAoYXBwUmVjb3JkLm1ldGEuVnVlKSB7XG4gICAgICAgICAgICByZW1vdmVBcHBSZWNvcmQoYXBwUmVjb3JkLCBjdHgpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgYXBwcyA9ICgwLCBzY2FuXzEuc2NhbikoKTtcbiAgICBhcHBzLmZvckVhY2goYXBwID0+IHtcbiAgICAgICAgY29uc3QgVnVlID0gX2xlZ2FjeV9nZXRWdWVGcm9tQXBwKGFwcCk7XG4gICAgICAgIHJlZ2lzdGVyQXBwKHtcbiAgICAgICAgICAgIGFwcCxcbiAgICAgICAgICAgIHR5cGVzOiB7fSxcbiAgICAgICAgICAgIHZlcnNpb246IFZ1ZS52ZXJzaW9uLFxuICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgIFZ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sIGN0eCk7XG4gICAgfSk7XG59XG5leHBvcnRzLl9sZWdhY3lfZ2V0QW5kUmVnaXN0ZXJBcHBzID0gX2xlZ2FjeV9nZXRBbmRSZWdpc3RlckFwcHM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hcHAuanMubWFwIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///79132\n");
|
|
110
|
+
eval("\n\nvar __importDefault = this && this.__importDefault || function (mod) {\n return mod && mod.__esModule ? mod : {\n \"default\": mod\n };\n};\n\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nexports._legacy_getAndRegisterApps = exports.removeApp = exports.sendApps = exports.waitForAppsRegistration = exports.getAppRecord = exports.getAppRecordId = exports.mapAppRecord = exports.selectApp = exports.registerApp = void 0;\n\nconst shared_utils_1 = __webpack_require__(27146);\n\nconst speakingurl_1 = __importDefault(__webpack_require__(97500));\n\nconst queue_1 = __webpack_require__(49107);\n\nconst scan_1 = __webpack_require__(18426);\n\nconst timeline_1 = __webpack_require__(41515);\n\nconst backend_1 = __webpack_require__(36873);\n\nconst global_hook_js_1 = __webpack_require__(13179);\n\nconst jobs = new queue_1.JobQueue();\nlet recordId = 0;\nconst appRecordPromises = new Map();\n\nasync function registerApp(options, ctx) {\n return jobs.queue(() => registerAppJob(options, ctx));\n}\n\nexports.registerApp = registerApp;\n\nasync function registerAppJob(options, ctx) {\n // Dedupe\n if (ctx.appRecords.find(a => a.options.app === options.app)) {\n return;\n }\n\n if (!options.version) {\n throw new Error('[Vue Devtools] Vue version not found');\n } // Find correct backend\n\n\n const baseFrameworkVersion = parseInt(options.version.substring(0, options.version.indexOf('.')));\n\n for (let i = 0; i < backend_1.availableBackends.length; i++) {\n const backendOptions = backend_1.availableBackends[i];\n\n if (backendOptions.frameworkVersion === baseFrameworkVersion) {\n // Enable backend if it's not enabled\n const backend = (0, backend_1.getBackend)(backendOptions, ctx);\n await createAppRecord(options, backend, ctx);\n break;\n }\n }\n}\n\nasync function createAppRecord(options, backend, ctx) {\n var _a;\n\n const rootInstance = await backend.api.getAppRootInstance(options.app);\n\n if (rootInstance) {\n if ((await backend.api.getComponentDevtoolsOptions(rootInstance)).hide) {\n return;\n }\n\n recordId++;\n const name = await backend.api.getAppRecordName(options.app, recordId.toString());\n const id = getAppRecordId(options.app, (0, speakingurl_1.default)(name));\n const [el] = await backend.api.getComponentRootElements(rootInstance);\n const record = {\n id,\n name,\n options,\n backend,\n lastInspectedComponentId: null,\n instanceMap: new Map(),\n rootInstance,\n perfGroupIds: new Map(),\n iframe: document !== el.ownerDocument ? el.ownerDocument.location.pathname : null,\n meta: (_a = options.meta) !== null && _a !== void 0 ? _a : {}\n };\n options.app.__VUE_DEVTOOLS_APP_RECORD__ = record;\n const rootId = `${record.id}:root`;\n record.instanceMap.set(rootId, record.rootInstance);\n record.rootInstance.__VUE_DEVTOOLS_UID__ = rootId; // Timeline\n\n (0, timeline_1.addBuiltinLayers)(record, ctx);\n ctx.appRecords.push(record);\n\n if (backend.options.setupApp) {\n backend.options.setupApp(backend.api, record);\n }\n\n await backend.api.registerApplication(options.app);\n ctx.bridge.send(shared_utils_1.BridgeEvents.TO_FRONT_APP_ADD, {\n appRecord: mapAppRecord(record)\n });\n\n if (appRecordPromises.has(options.app)) {\n for (const r of appRecordPromises.get(options.app)) {\n await r(record);\n }\n } // Auto select first app\n\n\n if (ctx.currentAppRecord == null) {\n await selectApp(record, ctx);\n }\n } else {\n console.warn('[Vue devtools] No root instance found for app, it might have been unmounted', options.app);\n }\n}\n\nasync function selectApp(record, ctx) {\n ctx.currentAppRecord = record;\n ctx.currentInspectedComponentId = record.lastInspectedComponentId;\n ctx.bridge.send(shared_utils_1.BridgeEvents.TO_FRONT_APP_SELECTED, {\n id: record.id,\n lastInspectedComponentId: record.lastInspectedComponentId\n });\n}\n\nexports.selectApp = selectApp;\n\nfunction mapAppRecord(record) {\n return {\n id: record.id,\n name: record.name,\n version: record.options.version,\n iframe: record.iframe\n };\n}\n\nexports.mapAppRecord = mapAppRecord;\nconst appIds = new Set();\n\nfunction getAppRecordId(app, defaultId) {\n if (app.__VUE_DEVTOOLS_APP_RECORD_ID__ != null) {\n return app.__VUE_DEVTOOLS_APP_RECORD_ID__;\n }\n\n let id = defaultId !== null && defaultId !== void 0 ? defaultId : (recordId++).toString();\n\n if (defaultId && appIds.has(id)) {\n let count = 1;\n\n while (appIds.has(`${defaultId}:${count}`)) {\n count++;\n }\n\n id = `${defaultId}_${count}`;\n }\n\n appIds.add(id);\n app.__VUE_DEVTOOLS_APP_RECORD_ID__ = id;\n return id;\n}\n\nexports.getAppRecordId = getAppRecordId;\n\nasync function getAppRecord(app, ctx) {\n const record = ctx.appRecords.find(ar => ar.options.app === app);\n\n if (record) {\n return record;\n }\n\n return new Promise((resolve, reject) => {\n let resolvers = appRecordPromises.get(app);\n let timedOut = false;\n\n if (!resolvers) {\n resolvers = [];\n appRecordPromises.set(app, resolvers);\n }\n\n const fn = record => {\n if (!timedOut) {\n clearTimeout(timer);\n resolve(record);\n }\n };\n\n resolvers.push(fn);\n const timer = setTimeout(() => {\n timedOut = true;\n const index = resolvers.indexOf(fn);\n if (index !== -1) resolvers.splice(index, 1);\n\n if (shared_utils_1.SharedData.debugInfo) {\n // eslint-disable-next-line no-console\n console.log('Timed out waiting for app record', app);\n }\n\n reject(new Error(`Timed out getting app record for app`));\n }, 60000);\n });\n}\n\nexports.getAppRecord = getAppRecord;\n\nfunction waitForAppsRegistration() {\n return jobs.queue(async () => {});\n}\n\nexports.waitForAppsRegistration = waitForAppsRegistration;\n\nasync function sendApps(ctx) {\n const appRecords = [];\n\n for (const appRecord of ctx.appRecords) {\n appRecords.push(appRecord);\n }\n\n ctx.bridge.send(shared_utils_1.BridgeEvents.TO_FRONT_APP_LIST, {\n apps: appRecords.map(mapAppRecord)\n });\n}\n\nexports.sendApps = sendApps;\n\nfunction removeAppRecord(appRecord, ctx) {\n try {\n appIds.delete(appRecord.id);\n const index = ctx.appRecords.indexOf(appRecord);\n if (index !== -1) ctx.appRecords.splice(index, 1);\n (0, timeline_1.removeLayersForApp)(appRecord.options.app, ctx);\n ctx.bridge.send(shared_utils_1.BridgeEvents.TO_FRONT_APP_REMOVE, {\n id: appRecord.id\n });\n } catch (e) {\n if (shared_utils_1.SharedData.debugInfo) {\n console.error(e);\n }\n }\n}\n\nasync function removeApp(app, ctx) {\n try {\n const appRecord = await getAppRecord(app, ctx);\n\n if (appRecord) {\n removeAppRecord(appRecord, ctx);\n }\n } catch (e) {\n if (shared_utils_1.SharedData.debugInfo) {\n console.error(e);\n }\n }\n}\n\nexports.removeApp = removeApp; // eslint-disable-next-line camelcase\n\nasync function _legacy_getAndRegisterApps(ctx) {\n // Remove apps that are legacy\n ctx.appRecords.forEach(appRecord => {\n if (appRecord.meta.Vue) {\n removeAppRecord(appRecord, ctx);\n }\n });\n const apps = (0, scan_1.scan)();\n apps.forEach(app => {\n const Vue = global_hook_js_1.hook.Vue;\n registerApp({\n app,\n types: {},\n version: Vue === null || Vue === void 0 ? void 0 : Vue.version,\n meta: {\n Vue\n }\n }, ctx);\n });\n}\n\nexports._legacy_getAndRegisterApps = _legacy_getAndRegisterApps;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUU7QUFDSjtBQURJO0FBSkksS0FBRCxFQU9SLEdBUFEsQ0FBWDtBQVFELEdBVkQ7QUFXRDs7QUFwQkQiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AdnVlL2RldnRvb2xzLy4uL3NyYy9hcHAudHM/ZjcxNSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuX2xlZ2FjeV9nZXRBbmRSZWdpc3RlckFwcHMgPSBleHBvcnRzLnJlbW92ZUFwcCA9IGV4cG9ydHMuc2VuZEFwcHMgPSBleHBvcnRzLndhaXRGb3JBcHBzUmVnaXN0cmF0aW9uID0gZXhwb3J0cy5nZXRBcHBSZWNvcmQgPSBleHBvcnRzLmdldEFwcFJlY29yZElkID0gZXhwb3J0cy5tYXBBcHBSZWNvcmQgPSBleHBvcnRzLnNlbGVjdEFwcCA9IGV4cG9ydHMucmVnaXN0ZXJBcHAgPSB2b2lkIDA7XG5jb25zdCBzaGFyZWRfdXRpbHNfMSA9IHJlcXVpcmUoXCJAdnVlLWRldnRvb2xzL3NoYXJlZC11dGlsc1wiKTtcbmNvbnN0IHNwZWFraW5ndXJsXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcInNwZWFraW5ndXJsXCIpKTtcbmNvbnN0IHF1ZXVlXzEgPSByZXF1aXJlKFwiLi91dGlsL3F1ZXVlXCIpO1xuY29uc3Qgc2Nhbl8xID0gcmVxdWlyZShcIi4vbGVnYWN5L3NjYW5cIik7XG5jb25zdCB0aW1lbGluZV8xID0gcmVxdWlyZShcIi4vdGltZWxpbmVcIik7XG5jb25zdCBiYWNrZW5kXzEgPSByZXF1aXJlKFwiLi9iYWNrZW5kXCIpO1xuY29uc3QgZ2xvYmFsX2hvb2tfanNfMSA9IHJlcXVpcmUoXCIuL2dsb2JhbC1ob29rLmpzXCIpO1xuY29uc3Qgam9icyA9IG5ldyBxdWV1ZV8xLkpvYlF1ZXVlKCk7XG5sZXQgcmVjb3JkSWQgPSAwO1xuY29uc3QgYXBwUmVjb3JkUHJvbWlzZXMgPSBuZXcgTWFwKCk7XG5hc3luYyBmdW5jdGlvbiByZWdpc3RlckFwcChvcHRpb25zLCBjdHgpIHtcbiAgICByZXR1cm4gam9icy5xdWV1ZSgoKSA9PiByZWdpc3RlckFwcEpvYihvcHRpb25zLCBjdHgpKTtcbn1cbmV4cG9ydHMucmVnaXN0ZXJBcHAgPSByZWdpc3RlckFwcDtcbmFzeW5jIGZ1bmN0aW9uIHJlZ2lzdGVyQXBwSm9iKG9wdGlvbnMsIGN0eCkge1xuICAgIC8vIERlZHVwZVxuICAgIGlmIChjdHguYXBwUmVjb3Jkcy5maW5kKGEgPT4gYS5vcHRpb25zLmFwcCA9PT0gb3B0aW9ucy5hcHApKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFvcHRpb25zLnZlcnNpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbVnVlIERldnRvb2xzXSBWdWUgdmVyc2lvbiBub3QgZm91bmQnKTtcbiAgICB9XG4gICAgLy8gRmluZCBjb3JyZWN0IGJhY2tlbmRcbiAgICBjb25zdCBiYXNlRnJhbWV3b3JrVmVyc2lvbiA9IHBhcnNlSW50KG9wdGlvbnMudmVyc2lvbi5zdWJzdHJpbmcoMCwgb3B0aW9ucy52ZXJzaW9uLmluZGV4T2YoJy4nKSkpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmFja2VuZF8xLmF2YWlsYWJsZUJhY2tlbmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGJhY2tlbmRPcHRpb25zID0gYmFja2VuZF8xLmF2YWlsYWJsZUJhY2tlbmRzW2ldO1xuICAgICAgICBpZiAoYmFja2VuZE9wdGlvbnMuZnJhbWV3b3JrVmVyc2lvbiA9PT0gYmFzZUZyYW1ld29ya1ZlcnNpb24pIHtcbiAgICAgICAgICAgIC8vIEVuYWJsZSBiYWNrZW5kIGlmIGl0J3Mgbm90IGVuYWJsZWRcbiAgICAgICAgICAgIGNvbnN0IGJhY2tlbmQgPSAoMCwgYmFja2VuZF8xLmdldEJhY2tlbmQpKGJhY2tlbmRPcHRpb25zLCBjdHgpO1xuICAgICAgICAgICAgYXdhaXQgY3JlYXRlQXBwUmVjb3JkKG9wdGlvbnMsIGJhY2tlbmQsIGN0eCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbn1cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUFwcFJlY29yZChvcHRpb25zLCBiYWNrZW5kLCBjdHgpIHtcbiAgICB2YXIgX2E7XG4gICAgY29uc3Qgcm9vdEluc3RhbmNlID0gYXdhaXQgYmFja2VuZC5hcGkuZ2V0QXBwUm9vdEluc3RhbmNlKG9wdGlvbnMuYXBwKTtcbiAgICBpZiAocm9vdEluc3RhbmNlKSB7XG4gICAgICAgIGlmICgoYXdhaXQgYmFja2VuZC5hcGkuZ2V0Q29tcG9uZW50RGV2dG9vbHNPcHRpb25zKHJvb3RJbnN0YW5jZSkpLmhpZGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZWNvcmRJZCsrO1xuICAgICAgICBjb25zdCBuYW1lID0gYXdhaXQgYmFja2VuZC5hcGkuZ2V0QXBwUmVjb3JkTmFtZShvcHRpb25zLmFwcCwgcmVjb3JkSWQudG9TdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGlkID0gZ2V0QXBwUmVjb3JkSWQob3B0aW9ucy5hcHAsICgwLCBzcGVha2luZ3VybF8xLmRlZmF1bHQpKG5hbWUpKTtcbiAgICAgICAgY29uc3QgW2VsXSA9IGF3YWl0IGJhY2tlbmQuYXBpLmdldENvbXBvbmVudFJvb3RFbGVtZW50cyhyb290SW5zdGFuY2UpO1xuICAgICAgICBjb25zdCByZWNvcmQgPSB7XG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgYmFja2VuZCxcbiAgICAgICAgICAgIGxhc3RJbnNwZWN0ZWRDb21wb25lbnRJZDogbnVsbCxcbiAgICAgICAgICAgIGluc3RhbmNlTWFwOiBuZXcgTWFwKCksXG4gICAgICAgICAgICByb290SW5zdGFuY2UsXG4gICAgICAgICAgICBwZXJmR3JvdXBJZHM6IG5ldyBNYXAoKSxcbiAgICAgICAgICAgIGlmcmFtZTogZG9jdW1lbnQgIT09IGVsLm93bmVyRG9jdW1lbnQgPyBlbC5vd25lckRvY3VtZW50LmxvY2F0aW9uLnBhdGhuYW1lIDogbnVsbCxcbiAgICAgICAgICAgIG1ldGE6IChfYSA9IG9wdGlvbnMubWV0YSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDoge30sXG4gICAgICAgIH07XG4gICAgICAgIG9wdGlvbnMuYXBwLl9fVlVFX0RFVlRPT0xTX0FQUF9SRUNPUkRfXyA9IHJlY29yZDtcbiAgICAgICAgY29uc3Qgcm9vdElkID0gYCR7cmVjb3JkLmlkfTpyb290YDtcbiAgICAgICAgcmVjb3JkLmluc3RhbmNlTWFwLnNldChyb290SWQsIHJlY29yZC5yb290SW5zdGFuY2UpO1xuICAgICAgICByZWNvcmQucm9vdEluc3RhbmNlLl9fVlVFX0RFVlRPT0xTX1VJRF9fID0gcm9vdElkO1xuICAgICAgICAvLyBUaW1lbGluZVxuICAgICAgICAoMCwgdGltZWxpbmVfMS5hZGRCdWlsdGluTGF5ZXJzKShyZWNvcmQsIGN0eCk7XG4gICAgICAgIGN0eC5hcHBSZWNvcmRzLnB1c2gocmVjb3JkKTtcbiAgICAgICAgaWYgKGJhY2tlbmQub3B0aW9ucy5zZXR1cEFwcCkge1xuICAgICAgICAgICAgYmFja2VuZC5vcHRpb25zLnNldHVwQXBwKGJhY2tlbmQuYXBpLCByZWNvcmQpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGJhY2tlbmQuYXBpLnJlZ2lzdGVyQXBwbGljYXRpb24ob3B0aW9ucy5hcHApO1xuICAgICAgICBjdHguYnJpZGdlLnNlbmQoc2hhcmVkX3V0aWxzXzEuQnJpZGdlRXZlbnRzLlRPX0ZST05UX0FQUF9BREQsIHtcbiAgICAgICAgICAgIGFwcFJlY29yZDogbWFwQXBwUmVjb3JkKHJlY29yZCksXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoYXBwUmVjb3JkUHJvbWlzZXMuaGFzKG9wdGlvbnMuYXBwKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCByIG9mIGFwcFJlY29yZFByb21pc2VzLmdldChvcHRpb25zLmFwcCkpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCByKHJlY29yZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXV0byBzZWxlY3QgZmlyc3QgYXBwXG4gICAgICAgIGlmIChjdHguY3VycmVudEFwcFJlY29yZCA9PSBudWxsKSB7XG4gICAgICAgICAgICBhd2FpdCBzZWxlY3RBcHAocmVjb3JkLCBjdHgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tWdWUgZGV2dG9vbHNdIE5vIHJvb3QgaW5zdGFuY2UgZm91bmQgZm9yIGFwcCwgaXQgbWlnaHQgaGF2ZSBiZWVuIHVubW91bnRlZCcsIG9wdGlvbnMuYXBwKTtcbiAgICB9XG59XG5hc3luYyBmdW5jdGlvbiBzZWxlY3RBcHAocmVjb3JkLCBjdHgpIHtcbiAgICBjdHguY3VycmVudEFwcFJlY29yZCA9IHJlY29yZDtcbiAgICBjdHguY3VycmVudEluc3BlY3RlZENvbXBvbmVudElkID0gcmVjb3JkLmxhc3RJbnNwZWN0ZWRDb21wb25lbnRJZDtcbiAgICBjdHguYnJpZGdlLnNlbmQoc2hhcmVkX3V0aWxzXzEuQnJpZGdlRXZlbnRzLlRPX0ZST05UX0FQUF9TRUxFQ1RFRCwge1xuICAgICAgICBpZDogcmVjb3JkLmlkLFxuICAgICAgICBsYXN0SW5zcGVjdGVkQ29tcG9uZW50SWQ6IHJlY29yZC5sYXN0SW5zcGVjdGVkQ29tcG9uZW50SWQsXG4gICAgfSk7XG59XG5leHBvcnRzLnNlbGVjdEFwcCA9IHNlbGVjdEFwcDtcbmZ1bmN0aW9uIG1hcEFwcFJlY29yZChyZWNvcmQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBpZDogcmVjb3JkLmlkLFxuICAgICAgICBuYW1lOiByZWNvcmQubmFtZSxcbiAgICAgICAgdmVyc2lvbjogcmVjb3JkLm9wdGlvbnMudmVyc2lvbixcbiAgICAgICAgaWZyYW1lOiByZWNvcmQuaWZyYW1lLFxuICAgIH07XG59XG5leHBvcnRzLm1hcEFwcFJlY29yZCA9IG1hcEFwcFJlY29yZDtcbmNvbnN0IGFwcElkcyA9IG5ldyBTZXQoKTtcbmZ1bmN0aW9uIGdldEFwcFJlY29yZElkKGFwcCwgZGVmYXVsdElkKSB7XG4gICAgaWYgKGFwcC5fX1ZVRV9ERVZUT09MU19BUFBfUkVDT1JEX0lEX18gIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gYXBwLl9fVlVFX0RFVlRPT0xTX0FQUF9SRUNPUkRfSURfXztcbiAgICB9XG4gICAgbGV0IGlkID0gZGVmYXVsdElkICE9PSBudWxsICYmIGRlZmF1bHRJZCAhPT0gdm9pZCAwID8gZGVmYXVsdElkIDogKHJlY29yZElkKyspLnRvU3RyaW5nKCk7XG4gICAgaWYgKGRlZmF1bHRJZCAmJiBhcHBJZHMuaGFzKGlkKSkge1xuICAgICAgICBsZXQgY291bnQgPSAxO1xuICAgICAgICB3aGlsZSAoYXBwSWRzLmhhcyhgJHtkZWZhdWx0SWR9OiR7Y291bnR9YCkpIHtcbiAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgIH1cbiAgICAgICAgaWQgPSBgJHtkZWZhdWx0SWR9XyR7Y291bnR9YDtcbiAgICB9XG4gICAgYXBwSWRzLmFkZChpZCk7XG4gICAgYXBwLl9fVlVFX0RFVlRPT0xTX0FQUF9SRUNPUkRfSURfXyA9IGlkO1xuICAgIHJldHVybiBpZDtcbn1cbmV4cG9ydHMuZ2V0QXBwUmVjb3JkSWQgPSBnZXRBcHBSZWNvcmRJZDtcbmFzeW5jIGZ1bmN0aW9uIGdldEFwcFJlY29yZChhcHAsIGN0eCkge1xuICAgIGNvbnN0IHJlY29yZCA9IGN0eC5hcHBSZWNvcmRzLmZpbmQoYXIgPT4gYXIub3B0aW9ucy5hcHAgPT09IGFwcCk7XG4gICAgaWYgKHJlY29yZCkge1xuICAgICAgICByZXR1cm4gcmVjb3JkO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBsZXQgcmVzb2x2ZXJzID0gYXBwUmVjb3JkUHJvbWlzZXMuZ2V0KGFwcCk7XG4gICAgICAgIGxldCB0aW1lZE91dCA9IGZhbHNlO1xuICAgICAgICBpZiAoIXJlc29sdmVycykge1xuICAgICAgICAgICAgcmVzb2x2ZXJzID0gW107XG4gICAgICAgICAgICBhcHBSZWNvcmRQcm9taXNlcy5zZXQoYXBwLCByZXNvbHZlcnMpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZuID0gKHJlY29yZCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aW1lZE91dCkge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZWNvcmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXNvbHZlcnMucHVzaChmbik7XG4gICAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aW1lZE91dCA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHJlc29sdmVycy5pbmRleE9mKGZuKTtcbiAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpXG4gICAgICAgICAgICAgICAgcmVzb2x2ZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICBpZiAoc2hhcmVkX3V0aWxzXzEuU2hhcmVkRGF0YS5kZWJ1Z0luZm8pIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdUaW1lZCBvdXQgd2FpdGluZyBmb3IgYXBwIHJlY29yZCcsIGFwcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBUaW1lZCBvdXQgZ2V0dGluZyBhcHAgcmVjb3JkIGZvciBhcHBgKSk7XG4gICAgICAgIH0sIDYwMDAwKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0QXBwUmVjb3JkID0gZ2V0QXBwUmVjb3JkO1xuZnVuY3Rpb24gd2FpdEZvckFwcHNSZWdpc3RyYXRpb24oKSB7XG4gICAgcmV0dXJuIGpvYnMucXVldWUoYXN5bmMgKCkgPT4geyB9KTtcbn1cbmV4cG9ydHMud2FpdEZvckFwcHNSZWdpc3RyYXRpb24gPSB3YWl0Rm9yQXBwc1JlZ2lzdHJhdGlvbjtcbmFzeW5jIGZ1bmN0aW9uIHNlbmRBcHBzKGN0eCkge1xuICAgIGNvbnN0IGFwcFJlY29yZHMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGFwcFJlY29yZCBvZiBjdHguYXBwUmVjb3Jkcykge1xuICAgICAgICBhcHBSZWNvcmRzLnB1c2goYXBwUmVjb3JkKTtcbiAgICB9XG4gICAgY3R4LmJyaWRnZS5zZW5kKHNoYXJlZF91dGlsc18xLkJyaWRnZUV2ZW50cy5UT19GUk9OVF9BUFBfTElTVCwge1xuICAgICAgICBhcHBzOiBhcHBSZWNvcmRzLm1hcChtYXBBcHBSZWNvcmQpLFxuICAgIH0pO1xufVxuZXhwb3J0cy5zZW5kQXBwcyA9IHNlbmRBcHBzO1xuZnVuY3Rpb24gcmVtb3ZlQXBwUmVjb3JkKGFwcFJlY29yZCwgY3R4KSB7XG4gICAgdHJ5IHtcbiAgICAgICAgYXBwSWRzLmRlbGV0ZShhcHBSZWNvcmQuaWQpO1xuICAgICAgICBjb25zdCBpbmRleCA9IGN0eC5hcHBSZWNvcmRzLmluZGV4T2YoYXBwUmVjb3JkKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSlcbiAgICAgICAgICAgIGN0eC5hcHBSZWNvcmRzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICgwLCB0aW1lbGluZV8xLnJlbW92ZUxheWVyc0ZvckFwcCkoYXBwUmVjb3JkLm9wdGlvbnMuYXBwLCBjdHgpO1xuICAgICAgICBjdHguYnJpZGdlLnNlbmQoc2hhcmVkX3V0aWxzXzEuQnJpZGdlRXZlbnRzLlRPX0ZST05UX0FQUF9SRU1PVkUsIHsgaWQ6IGFwcFJlY29yZC5pZCB9KTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKHNoYXJlZF91dGlsc18xLlNoYXJlZERhdGEuZGVidWdJbmZvKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICB9XG4gICAgfVxufVxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlQXBwKGFwcCwgY3R4KSB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYXBwUmVjb3JkID0gYXdhaXQgZ2V0QXBwUmVjb3JkKGFwcCwgY3R4KTtcbiAgICAgICAgaWYgKGFwcFJlY29yZCkge1xuICAgICAgICAgICAgcmVtb3ZlQXBwUmVjb3JkKGFwcFJlY29yZCwgY3R4KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoc2hhcmVkX3V0aWxzXzEuU2hhcmVkRGF0YS5kZWJ1Z0luZm8pIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLnJlbW92ZUFwcCA9IHJlbW92ZUFwcDtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjYW1lbGNhc2VcbmFzeW5jIGZ1bmN0aW9uIF9sZWdhY3lfZ2V0QW5kUmVnaXN0ZXJBcHBzKGN0eCkge1xuICAgIC8vIFJlbW92ZSBhcHBzIHRoYXQgYXJlIGxlZ2FjeVxuICAgIGN0eC5hcHBSZWNvcmRzLmZvckVhY2goYXBwUmVjb3JkID0+IHtcbiAgICAgICAgaWYgKGFwcFJlY29yZC5tZXRhLlZ1ZSkge1xuICAgICAgICAgICAgcmVtb3ZlQXBwUmVjb3JkKGFwcFJlY29yZCwgY3R4KTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGFwcHMgPSAoMCwgc2Nhbl8xLnNjYW4pKCk7XG4gICAgYXBwcy5mb3JFYWNoKGFwcCA9PiB7XG4gICAgICAgIGNvbnN0IFZ1ZSA9IGdsb2JhbF9ob29rX2pzXzEuaG9vay5WdWU7XG4gICAgICAgIHJlZ2lzdGVyQXBwKHtcbiAgICAgICAgICAgIGFwcCxcbiAgICAgICAgICAgIHR5cGVzOiB7fSxcbiAgICAgICAgICAgIHZlcnNpb246IFZ1ZSA9PT0gbnVsbCB8fCBWdWUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IFZ1ZS52ZXJzaW9uLFxuICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgIFZ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sIGN0eCk7XG4gICAgfSk7XG59XG5leHBvcnRzLl9sZWdhY3lfZ2V0QW5kUmVnaXN0ZXJBcHBzID0gX2xlZ2FjeV9nZXRBbmRSZWdpc3RlckFwcHM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hcHAuanMubWFwIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///79132\n");
|
|
111
111
|
|
|
112
112
|
/***/ }),
|
|
113
113
|
|
|
@@ -315,7 +315,7 @@ eval("\n\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));
|
|
|
315
315
|
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
|
|
316
316
|
|
|
317
317
|
"use strict";
|
|
318
|
-
eval("\n\nvar __importDefault = this && this.__importDefault || function (mod) {\n return mod && mod.__esModule ? mod : {\n \"default\": mod\n };\n};\n\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nexports.setupPlugin = void 0;\n\nconst devtools_api_1 = __webpack_require__(72039);\n\nconst shared_utils_1 = __webpack_require__(27146);\n\nconst clone_deep_1 = __importDefault(__webpack_require__(96206));\n\nlet actionId = 0;\n\nfunction setupPlugin(api, app, Vue) {\n const ROUTER_INSPECTOR_ID = 'vue2-router-inspector';\n const ROUTER_CHANGES_LAYER_ID = 'vue2-router-changes';\n const VUEX_INSPECTOR_ID = 'vue2-vuex-inspector';\n const VUEX_MUTATIONS_ID = 'vue2-vuex-mutations';\n const VUEX_ACTIONS_ID = 'vue2-vuex-actions';\n (0, devtools_api_1.setupDevtoolsPlugin)({\n app,\n id: 'org.vuejs.vue2-internal',\n label: 'Vue 2',\n homepage: 'https://vuejs.org/',\n logo: 'https://vuejs.org/images/icons/favicon-96x96.png'\n }, api => {\n const hook = shared_utils_1.target.__VUE_DEVTOOLS_GLOBAL_HOOK__; // Vue Router\n\n if (app.$router) {\n const router = app.$router; // Inspector\n\n api.addInspector({\n id: ROUTER_INSPECTOR_ID,\n label: 'Routes',\n icon: 'book',\n treeFilterPlaceholder: 'Search routes'\n });\n api.on.getInspectorTree(payload => {\n if (payload.inspectorId === ROUTER_INSPECTOR_ID) {\n payload.rootNodes = router.options.routes.map(route => formatRouteNode(router, route, '', payload.filter)).filter(Boolean);\n }\n });\n api.on.getInspectorState(payload => {\n if (payload.inspectorId === ROUTER_INSPECTOR_ID) {\n const route = router.matcher.getRoutes().find(r => getPathId(r) === payload.nodeId);\n\n if (route) {\n payload.state = {\n options: formatRouteData(route)\n };\n }\n }\n }); // Timeline\n\n api.addTimelineLayer({\n id: ROUTER_CHANGES_LAYER_ID,\n label: 'Router Navigations',\n color: 0x40a8c4\n });\n router.afterEach((to, from) => {\n api.addTimelineEvent({\n layerId: ROUTER_CHANGES_LAYER_ID,\n event: {\n time: Date.now(),\n title: to.path,\n data: {\n from,\n to\n }\n }\n });\n api.sendInspectorTree(ROUTER_INSPECTOR_ID);\n });\n } // Vuex\n\n\n if (app.$store) {\n const store = app.$store;\n api.addInspector({\n id: VUEX_INSPECTOR_ID,\n label: 'Vuex',\n icon: 'storage',\n treeFilterPlaceholder: 'Filter stores...'\n });\n api.on.getInspectorTree(payload => {\n if (payload.inspectorId === VUEX_INSPECTOR_ID) {\n if (payload.filter) {\n const nodes = [];\n flattenStoreForInspectorTree(nodes, store._modules.root, payload.filter, '');\n payload.rootNodes = nodes;\n } else {\n payload.rootNodes = [formatStoreForInspectorTree(store._modules.root, '')];\n }\n }\n });\n api.on.getInspectorState(payload => {\n if (payload.inspectorId === VUEX_INSPECTOR_ID) {\n const modulePath = payload.nodeId;\n const module = getStoreModule(store._modules, modulePath); // Access the getters prop to init getters cache (which is lazy)\n // eslint-disable-next-line no-unused-expressions\n\n module.context.getters;\n payload.state = formatStoreForInspectorState(module, store._makeLocalGettersCache, modulePath);\n }\n });\n api.on.editInspectorState(payload => {\n if (payload.inspectorId === VUEX_INSPECTOR_ID) {\n let path = payload.path;\n\n if (payload.nodeId !== 'root') {\n path = [...payload.nodeId.substring(0, payload.nodeId.length - 1).split('/'), ...path];\n }\n\n store._committing = true;\n payload.set(store._vm.$data.$$state, path);\n store._committing = false;\n }\n });\n api.addTimelineLayer({\n id: VUEX_MUTATIONS_ID,\n label: 'Vuex Mutations',\n color: LIME_500\n });\n api.addTimelineLayer({\n id: VUEX_ACTIONS_ID,\n label: 'Vuex Actions',\n color: LIME_500\n });\n hook.on('vuex:mutation', (mutation, state) => {\n api.sendInspectorState(VUEX_INSPECTOR_ID);\n const data = {};\n\n if (mutation.payload) {\n data.payload = mutation.payload;\n }\n\n data.state = (0, clone_deep_1.default)(state);\n api.addTimelineEvent({\n layerId: VUEX_MUTATIONS_ID,\n event: {\n time: Date.now(),\n title: mutation.type,\n data\n }\n });\n });\n store.subscribeAction({\n before: (action, state) => {\n const data = {};\n\n if (action.payload) {\n data.payload = action.payload;\n }\n\n action._id = actionId++;\n action._time = Date.now();\n data.state = state;\n api.addTimelineEvent({\n layerId: VUEX_ACTIONS_ID,\n event: {\n time: action._time,\n title: action.type,\n groupId: action._id,\n subtitle: 'start',\n data\n }\n });\n },\n after: (action, state) => {\n const data = {};\n\n const duration = Date.now() - action._time;\n\n data.duration = {\n _custom: {\n type: 'duration',\n display: `${duration}ms`,\n tooltip: 'Action duration',\n value: duration\n }\n };\n\n if (action.payload) {\n data.payload = action.payload;\n }\n\n data.state = state;\n api.addTimelineEvent({\n layerId: VUEX_ACTIONS_ID,\n event: {\n time: Date.now(),\n title: action.type,\n groupId: action._id,\n subtitle: 'end',\n data\n }\n });\n }\n }, {\n prepend: true\n }); // Inspect getters on mutations\n\n api.on.inspectTimelineEvent(payload => {\n if (payload.layerId === VUEX_MUTATIONS_ID) {\n const getterKeys = Object.keys(store.getters);\n\n if (getterKeys.length) {\n const vm = new Vue({\n data: {\n $$state: payload.data.state\n },\n computed: store._vm.$options.computed\n });\n const originalVm = store._vm;\n store._vm = vm;\n const tree = transformPathsToObjectTree(store.getters);\n payload.data.getters = (0, clone_deep_1.default)(tree);\n store._vm = originalVm;\n vm.$destroy();\n }\n }\n });\n }\n });\n}\n\nexports.setupPlugin = setupPlugin;\n/**\n * Extracted from tailwind palette\n */\n\nconst BLUE_600 = 0x2563eb;\nconst LIME_500 = 0x84cc16;\nconst CYAN_400 = 0x22d3ee;\nconst ORANGE_400 = 0xfb923c;\nconst WHITE = 0xffffff;\nconst DARK = 0x666666;\n\nfunction formatRouteNode(router, route, parentPath, filter) {\n var _a, _b;\n\n const node = {\n id: parentPath + route.path,\n label: route.path,\n children: (_a = route.children) === null || _a === void 0 ? void 0 : _a.map(child => formatRouteNode(router, child, route.path, filter)).filter(Boolean),\n tags: []\n };\n if (filter && !node.id.includes(filter) && !((_b = node.children) === null || _b === void 0 ? void 0 : _b.length)) return null;\n\n if (route.name != null) {\n node.tags.push({\n label: String(route.name),\n textColor: 0,\n backgroundColor: CYAN_400\n });\n }\n\n if (route.alias != null) {\n node.tags.push({\n label: 'alias',\n textColor: 0,\n backgroundColor: ORANGE_400\n });\n }\n\n const currentPath = router.currentRoute.matched.reduce((p, m) => p + m.path, '');\n\n if (node.id === currentPath) {\n node.tags.push({\n label: 'active',\n textColor: WHITE,\n backgroundColor: BLUE_600\n });\n }\n\n if (route.redirect) {\n node.tags.push({\n label: 'redirect: ' + (typeof route.redirect === 'string' ? route.redirect : 'Object'),\n textColor: WHITE,\n backgroundColor: DARK\n });\n }\n\n return node;\n}\n\nfunction formatRouteData(route) {\n const data = [];\n data.push({\n key: 'path',\n value: route.path\n });\n\n if (route.redirect) {\n data.push({\n key: 'redirect',\n value: route.redirect\n });\n }\n\n if (route.alias) {\n data.push({\n key: 'alias',\n value: route.alias\n });\n }\n\n if (route.props) {\n data.push({\n key: 'props',\n value: route.props\n });\n }\n\n if (route.name && route.name != null) {\n data.push({\n key: 'name',\n value: route.name\n });\n }\n\n if (route.component) {\n const component = {}; // if (route.component.__file) {\n // component.file = route.component.__file\n // }\n\n if (route.component.template) {\n component.template = route.component.template;\n }\n\n if (route.component.props) {\n component.props = route.component.props;\n }\n\n if (!(0, shared_utils_1.isEmptyObject)(component)) {\n data.push({\n key: 'component',\n value: component\n });\n }\n }\n\n return data;\n}\n\nfunction getPathId(routeMatcher) {\n let path = routeMatcher.path;\n\n if (routeMatcher.parent) {\n path = getPathId(routeMatcher.parent) + path;\n }\n\n return path;\n}\n\nconst TAG_NAMESPACED = {\n label: 'namespaced',\n textColor: WHITE,\n backgroundColor: DARK\n};\n\nfunction formatStoreForInspectorTree(module, path) {\n return {\n id: path || 'root',\n // all modules end with a `/`, we want the last segment only\n // cart/ -> cart\n // nested/cart/ -> cart\n label: extractNameFromPath(path),\n tags: module.namespaced ? [TAG_NAMESPACED] : [],\n children: Object.keys(module._children).map(moduleName => formatStoreForInspectorTree(module._children[moduleName], path + moduleName + '/'))\n };\n}\n\nfunction flattenStoreForInspectorTree(result, module, filter, path) {\n if (path.includes(filter)) {\n result.push({\n id: path || 'root',\n label: path.endsWith('/') ? path.slice(0, path.length - 1) : path || 'Root',\n tags: module.namespaced ? [TAG_NAMESPACED] : []\n });\n }\n\n Object.keys(module._children).forEach(moduleName => {\n flattenStoreForInspectorTree(result, module._children[moduleName], filter, path + moduleName + '/');\n });\n}\n\nfunction extractNameFromPath(path) {\n return path && path !== 'root' ? path.split('/').slice(-2, -1)[0] : 'Root';\n}\n\nfunction formatStoreForInspectorState(module, getters, path) {\n getters = !module.namespaced || path === 'root' ? module.context.getters : getters[path];\n const gettersKeys = Object.keys(getters);\n const storeState = {\n state: Object.keys(module.state).map(key => ({\n key,\n editable: true,\n value: module.state[key]\n }))\n };\n\n if (gettersKeys.length) {\n const tree = transformPathsToObjectTree(getters);\n storeState.getters = Object.keys(tree).map(key => ({\n key: key.endsWith('/') ? extractNameFromPath(key) : key,\n editable: false,\n value: canThrow(() => tree[key])\n }));\n }\n\n return storeState;\n}\n\nfunction transformPathsToObjectTree(getters) {\n const result = {};\n Object.keys(getters).forEach(key => {\n const path = key.split('/');\n\n if (path.length > 1) {\n let target = result;\n const leafKey = path.pop();\n\n for (const p of path) {\n if (!target[p]) {\n target[p] = {\n _custom: {\n value: {},\n display: p,\n tooltip: 'Module',\n abstract: true\n }\n };\n }\n\n target = target[p]._custom.value;\n }\n\n target[leafKey] = canThrow(() => getters[key]);\n } else {\n result[key] = canThrow(() => getters[key]);\n }\n });\n return result;\n}\n\nfunction getStoreModule(moduleMap, path) {\n const names = path.split('/').filter(n => n);\n return names.reduce((module, moduleName, i) => {\n const child = module[moduleName];\n\n if (!child) {\n throw new Error(`Missing module \"${moduleName}\" for path \"${path}\".`);\n }\n\n return i === names.length - 1 ? child : child._children;\n }, path === 'root' ? moduleMap : moduleMap.root._children);\n}\n\nfunction canThrow(cb) {\n try {\n return cb();\n } catch (e) {\n return e;\n }\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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UCxFQUFVO0FBQ1YsV0FBTyxDQUFQO0FBQ0Q7QUFDRiIsInNvdXJjZXMiOlsid2VicGFjazovL0B2dWUvZGV2dG9vbHMvLi4vc3JjL3BsdWdpbi50cz8wY2NhIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5zZXR1cFBsdWdpbiA9IHZvaWQgMDtcbmNvbnN0IGRldnRvb2xzX2FwaV8xID0gcmVxdWlyZShcIkB2dWUvZGV2dG9vbHMtYXBpXCIpO1xuY29uc3Qgc2hhcmVkX3V0aWxzXzEgPSByZXF1aXJlKFwiQHZ1ZS1kZXZ0b29scy9zaGFyZWQtdXRpbHNcIik7XG5jb25zdCBjbG9uZV9kZWVwXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImNsb25lLWRlZXBcIikpO1xubGV0IGFjdGlvbklkID0gMDtcbmZ1bmN0aW9uIHNldHVwUGx1Z2luKGFwaSwgYXBwLCBWdWUpIHtcbiAgICBjb25zdCBST1VURVJfSU5TUEVDVE9SX0lEID0gJ3Z1ZTItcm91dGVyLWluc3BlY3Rvcic7XG4gICAgY29uc3QgUk9VVEVSX0NIQU5HRVNfTEFZRVJfSUQgPSAndnVlMi1yb3V0ZXItY2hhbmdlcyc7XG4gICAgY29uc3QgVlVFWF9JTlNQRUNUT1JfSUQgPSAndnVlMi12dWV4LWluc3BlY3Rvcic7XG4gICAgY29uc3QgVlVFWF9NVVRBVElPTlNfSUQgPSAndnVlMi12dWV4LW11dGF0aW9ucyc7XG4gICAgY29uc3QgVlVFWF9BQ1RJT05TX0lEID0gJ3Z1ZTItdnVleC1hY3Rpb25zJztcbiAgICAoMCwgZGV2dG9vbHNfYXBpXzEuc2V0dXBEZXZ0b29sc1BsdWdpbikoe1xuICAgICAgICBhcHAsXG4gICAgICAgIGlkOiAnb3JnLnZ1ZWpzLnZ1ZTItaW50ZXJuYWwnLFxuICAgICAgICBsYWJlbDogJ1Z1ZSAyJyxcbiAgICAgICAgaG9tZXBhZ2U6ICdodHRwczovL3Z1ZWpzLm9yZy8nLFxuICAgICAgICBsb2dvOiAnaHR0cHM6Ly92dWVqcy5vcmcvaW1hZ2VzL2ljb25zL2Zhdmljb24tOTZ4OTYucG5nJyxcbiAgICB9LCBhcGkgPT4ge1xuICAgICAgICBjb25zdCBob29rID0gc2hhcmVkX3V0aWxzXzEudGFyZ2V0Ll9fVlVFX0RFVlRPT0xTX0dMT0JBTF9IT09LX187XG4gICAgICAgIC8vIFZ1ZSBSb3V0ZXJcbiAgICAgICAgaWYgKGFwcC4kcm91dGVyKSB7XG4gICAgICAgICAgICBjb25zdCByb3V0ZXIgPSBhcHAuJHJvdXRlcjtcbiAgICAgICAgICAgIC8vIEluc3BlY3RvclxuICAgICAgICAgICAgYXBpLmFkZEluc3BlY3Rvcih7XG4gICAgICAgICAgICAgICAgaWQ6IFJPVVRFUl9JTlNQRUNUT1JfSUQsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICdSb3V0ZXMnLFxuICAgICAgICAgICAgICAgIGljb246ICdib29rJyxcbiAgICAgICAgICAgICAgICB0cmVlRmlsdGVyUGxhY2Vob2xkZXI6ICdTZWFyY2ggcm91dGVzJyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYXBpLm9uLmdldEluc3BlY3RvclRyZWUocGF5bG9hZCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHBheWxvYWQuaW5zcGVjdG9ySWQgPT09IFJPVVRFUl9JTlNQRUNUT1JfSUQpIHtcbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC5yb290Tm9kZXMgPSByb3V0ZXIub3B0aW9ucy5yb3V0ZXMubWFwKHJvdXRlID0+IGZvcm1hdFJvdXRlTm9kZShyb3V0ZXIsIHJvdXRlLCAnJywgcGF5bG9hZC5maWx0ZXIpKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhcGkub24uZ2V0SW5zcGVjdG9yU3RhdGUocGF5bG9hZCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHBheWxvYWQuaW5zcGVjdG9ySWQgPT09IFJPVVRFUl9JTlNQRUNUT1JfSUQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm91dGUgPSByb3V0ZXIubWF0Y2hlci5nZXRSb3V0ZXMoKS5maW5kKHIgPT4gZ2V0UGF0aElkKHIpID09PSBwYXlsb2FkLm5vZGVJZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC5zdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBmb3JtYXRSb3V0ZURhdGEocm91dGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gVGltZWxpbmVcbiAgICAgICAgICAgIGFwaS5hZGRUaW1lbGluZUxheWVyKHtcbiAgICAgICAgICAgICAgICBpZDogUk9VVEVSX0NIQU5HRVNfTEFZRVJfSUQsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICdSb3V0ZXIgTmF2aWdhdGlvbnMnLFxuICAgICAgICAgICAgICAgIGNvbG9yOiAweDQwYThjNCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcm91dGVyLmFmdGVyRWFjaCgodG8sIGZyb20pID0+IHtcbiAgICAgICAgICAgICAgICBhcGkuYWRkVGltZWxpbmVFdmVudCh7XG4gICAgICAgICAgICAgICAgICAgIGxheWVySWQ6IFJPVVRFUl9DSEFOR0VTX0xBWUVSX0lELFxuICAgICAgICAgICAgICAgICAgICBldmVudDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGltZTogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0by5wYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGFwaS5zZW5kSW5zcGVjdG9yVHJlZShST1VURVJfSU5TUEVDVE9SX0lEKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFZ1ZXhcbiAgICAgICAgaWYgKGFwcC4kc3RvcmUpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0b3JlID0gYXBwLiRzdG9yZTtcbiAgICAgICAgICAgIGFwaS5hZGRJbnNwZWN0b3Ioe1xuICAgICAgICAgICAgICAgIGlkOiBWVUVYX0lOU1BFQ1RPUl9JRCxcbiAgICAgICAgICAgICAgICBsYWJlbDogJ1Z1ZXgnLFxuICAgICAgICAgICAgICAgIGljb246ICdzdG9yYWdlJyxcbiAgICAgICAgICAgICAgICB0cmVlRmlsdGVyUGxhY2Vob2xkZXI6ICdGaWx0ZXIgc3RvcmVzLi4uJyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYXBpLm9uLmdldEluc3BlY3RvclRyZWUoKHBheWxvYWQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocGF5bG9hZC5pbnNwZWN0b3JJZCA9PT0gVlVFWF9JTlNQRUNUT1JfSUQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBheWxvYWQuZmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmxhdHRlblN0b3JlRm9ySW5zcGVjdG9yVHJlZShub2Rlcywgc3RvcmUuX21vZHVsZXMucm9vdCwgcGF5bG9hZC5maWx0ZXIsICcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQucm9vdE5vZGVzID0gbm9kZXM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLnJvb3ROb2RlcyA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRTdG9yZUZvckluc3BlY3RvclRyZWUoc3RvcmUuX21vZHVsZXMucm9vdCwgJycpLFxuICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYXBpLm9uLmdldEluc3BlY3RvclN0YXRlKChwYXlsb2FkKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHBheWxvYWQuaW5zcGVjdG9ySWQgPT09IFZVRVhfSU5TUEVDVE9SX0lEKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1vZHVsZVBhdGggPSBwYXlsb2FkLm5vZGVJZDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9kdWxlID0gZ2V0U3RvcmVNb2R1bGUoc3RvcmUuX21vZHVsZXMsIG1vZHVsZVBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAvLyBBY2Nlc3MgdGhlIGdldHRlcnMgcHJvcCB0byBpbml0IGdldHRlcnMgY2FjaGUgKHdoaWNoIGlzIGxhenkpXG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnNcbiAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmNvbnRleHQuZ2V0dGVycztcbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC5zdGF0ZSA9IGZvcm1hdFN0b3JlRm9ySW5zcGVjdG9yU3RhdGUobW9kdWxlLCBzdG9yZS5fbWFrZUxvY2FsR2V0dGVyc0NhY2hlLCBtb2R1bGVQYXRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGFwaS5vbi5lZGl0SW5zcGVjdG9yU3RhdGUoKHBheWxvYWQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocGF5bG9hZC5pbnNwZWN0b3JJZCA9PT0gVlVFWF9JTlNQRUNUT1JfSUQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhdGggPSBwYXlsb2FkLnBhdGg7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXlsb2FkLm5vZGVJZCAhPT0gJ3Jvb3QnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnBheWxvYWQubm9kZUlkLnN1YnN0cmluZygwLCBwYXlsb2FkLm5vZGVJZC5sZW5ndGggLSAxKS5zcGxpdCgnLycpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlLl9jb21taXR0aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC5zZXQoc3RvcmUuX3ZtLiRkYXRhLiQkc3RhdGUsIHBhdGgpO1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5fY29tbWl0dGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYXBpLmFkZFRpbWVsaW5lTGF5ZXIoe1xuICAgICAgICAgICAgICAgIGlkOiBWVUVYX01VVEFUSU9OU19JRCxcbiAgICAgICAgICAgICAgICBsYWJlbDogJ1Z1ZXggTXV0YXRpb25zJyxcbiAgICAgICAgICAgICAgICBjb2xvcjogTElNRV81MDAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGFwaS5hZGRUaW1lbGluZUxheWVyKHtcbiAgICAgICAgICAgICAgICBpZDogVlVFWF9BQ1RJT05TX0lELFxuICAgICAgICAgICAgICAgIGxhYmVsOiAnVnVleCBBY3Rpb25zJyxcbiAgICAgICAgICAgICAgICBjb2xvcjogTElNRV81MDAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGhvb2sub24oJ3Z1ZXg6bXV0YXRpb24nLCAobXV0YXRpb24sIHN0YXRlKSA9PiB7XG4gICAgICAgICAgICAgICAgYXBpLnNlbmRJbnNwZWN0b3JTdGF0ZShWVUVYX0lOU1BFQ1RPUl9JRCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IHt9O1xuICAgICAgICAgICAgICAgIGlmIChtdXRhdGlvbi5wYXlsb2FkKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEucGF5bG9hZCA9IG11dGF0aW9uLnBheWxvYWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRhdGEuc3RhdGUgPSAoMCwgY2xvbmVfZGVlcF8xLmRlZmF1bHQpKHN0YXRlKTtcbiAgICAgICAgICAgICAgICBhcGkuYWRkVGltZWxpbmVFdmVudCh7XG4gICAgICAgICAgICAgICAgICAgIGxheWVySWQ6IFZVRVhfTVVUQVRJT05TX0lELFxuICAgICAgICAgICAgICAgICAgICBldmVudDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGltZTogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBtdXRhdGlvbi50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3RvcmUuc3Vic2NyaWJlQWN0aW9uKHtcbiAgICAgICAgICAgICAgICBiZWZvcmU6IChhY3Rpb24sIHN0YXRlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbi5wYXlsb2FkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnBheWxvYWQgPSBhY3Rpb24ucGF5bG9hZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhY3Rpb24uX2lkID0gYWN0aW9uSWQrKztcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uLl90aW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5zdGF0ZSA9IHN0YXRlO1xuICAgICAgICAgICAgICAgICAgICBhcGkuYWRkVGltZWxpbmVFdmVudCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXllcklkOiBWVUVYX0FDVElPTlNfSUQsXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWU6IGFjdGlvbi5fdGltZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogYWN0aW9uLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBJZDogYWN0aW9uLl9pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0aXRsZTogJ3N0YXJ0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBhZnRlcjogKGFjdGlvbiwgc3RhdGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkdXJhdGlvbiA9IERhdGUubm93KCkgLSBhY3Rpb24uX3RpbWU7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEuZHVyYXRpb24gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfY3VzdG9tOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2R1cmF0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBgJHtkdXJhdGlvbn1tc2AsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcDogJ0FjdGlvbiBkdXJhdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGR1cmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbi5wYXlsb2FkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnBheWxvYWQgPSBhY3Rpb24ucGF5bG9hZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkYXRhLnN0YXRlID0gc3RhdGU7XG4gICAgICAgICAgICAgICAgICAgIGFwaS5hZGRUaW1lbGluZUV2ZW50KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVySWQ6IFZVRVhfQUNUSU9OU19JRCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZTogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogYWN0aW9uLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBJZDogYWN0aW9uLl9pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0aXRsZTogJ2VuZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LCB7IHByZXBlbmQ6IHRydWUgfSk7XG4gICAgICAgICAgICAvLyBJbnNwZWN0IGdldHRlcnMgb24gbXV0YXRpb25zXG4gICAgICAgICAgICBhcGkub24uaW5zcGVjdFRpbWVsaW5lRXZlbnQocGF5bG9hZCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHBheWxvYWQubGF5ZXJJZCA9PT0gVlVFWF9NVVRBVElPTlNfSUQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2V0dGVyS2V5cyA9IE9iamVjdC5rZXlzKHN0b3JlLmdldHRlcnMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0dGVyS2V5cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZtID0gbmV3IFZ1ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkJHN0YXRlOiBwYXlsb2FkLmRhdGEuc3RhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlZDogc3RvcmUuX3ZtLiRvcHRpb25zLmNvbXB1dGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbFZtID0gc3RvcmUuX3ZtO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUuX3ZtID0gdm07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmVlID0gdHJhbnNmb3JtUGF0aHNUb09iamVjdFRyZWUoc3RvcmUuZ2V0dGVycyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLmRhdGEuZ2V0dGVycyA9ICgwLCBjbG9uZV9kZWVwXzEuZGVmYXVsdCkodHJlZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9yZS5fdm0gPSBvcmlnaW5hbFZtO1xuICAgICAgICAgICAgICAgICAgICAgICAgdm0uJGRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5leHBvcnRzLnNldHVwUGx1Z2luID0gc2V0dXBQbHVnaW47XG4vKipcbiAqIEV4dHJhY3RlZCBmcm9tIHRhaWx3aW5kIHBhbGV0dGVcbiAqL1xuY29uc3QgQkxVRV82MDAgPSAweDI1NjNlYjtcbmNvbnN0IExJTUVfNTAwID0gMHg4NGNjMTY7XG5jb25zdCBDWUFOXzQwMCA9IDB4MjJkM2VlO1xuY29uc3QgT1JBTkdFXzQwMCA9IDB4ZmI5MjNjO1xuY29uc3QgV0hJVEUgPSAweGZmZmZmZjtcbmNvbnN0IERBUksgPSAweDY2NjY2NjtcbmZ1bmN0aW9uIGZvcm1hdFJvdXRlTm9kZShyb3V0ZXIsIHJvdXRlLCBwYXJlbnRQYXRoLCBmaWx0ZXIpIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIGNvbnN0IG5vZGUgPSB7XG4gICAgICAgIGlkOiBwYXJlbnRQYXRoICsgcm91dGUucGF0aCxcbiAgICAgICAgbGFiZWw6IHJvdXRlLnBhdGgsXG4gICAgICAgIGNoaWxkcmVuOiAoX2EgPSByb3V0ZS5jaGlsZHJlbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm1hcChjaGlsZCA9PiBmb3JtYXRSb3V0ZU5vZGUocm91dGVyLCBjaGlsZCwgcm91dGUucGF0aCwgZmlsdGVyKSkuZmlsdGVyKEJvb2xlYW4pLFxuICAgICAgICB0YWdzOiBbXSxcbiAgICB9O1xuICAgIGlmIChmaWx0ZXIgJiYgIW5vZGUuaWQuaW5jbHVkZXMoZmlsdGVyKSAmJiAhKChfYiA9IG5vZGUuY2hpbGRyZW4pID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5sZW5ndGgpKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBpZiAocm91dGUubmFtZSAhPSBudWxsKSB7XG4gICAgICAgIG5vZGUudGFncy5wdXNoKHtcbiAgICAgICAgICAgIGxhYmVsOiBTdHJpbmcocm91dGUubmFtZSksXG4gICAgICAgICAgICB0ZXh0Q29sb3I6IDAsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IENZQU5fNDAwLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHJvdXRlLmFsaWFzICE9IG51bGwpIHtcbiAgICAgICAgbm9kZS50YWdzLnB1c2goe1xuICAgICAgICAgICAgbGFiZWw6ICdhbGlhcycsXG4gICAgICAgICAgICB0ZXh0Q29sb3I6IDAsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IE9SQU5HRV80MDAsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBjdXJyZW50UGF0aCA9IHJvdXRlci5jdXJyZW50Um91dGUubWF0Y2hlZC5yZWR1Y2UoKHAsIG0pID0+IHAgKyBtLnBhdGgsICcnKTtcbiAgICBpZiAobm9kZS5pZCA9PT0gY3VycmVudFBhdGgpIHtcbiAgICAgICAgbm9kZS50YWdzLnB1c2goe1xuICAgICAgICAgICAgbGFiZWw6ICdhY3RpdmUnLFxuICAgICAgICAgICAgdGV4dENvbG9yOiBXSElURSxcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogQkxVRV82MDAsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAocm91dGUucmVkaXJlY3QpIHtcbiAgICAgICAgbm9kZS50YWdzLnB1c2goe1xuICAgICAgICAgICAgbGFiZWw6ICdyZWRpcmVjdDogJyArXG4gICAgICAgICAgICAgICAgKHR5cGVvZiByb3V0ZS5yZWRpcmVjdCA9PT0gJ3N0cmluZycgPyByb3V0ZS5yZWRpcmVjdCA6ICdPYmplY3QnKSxcbiAgICAgICAgICAgIHRleHRDb2xvcjogV0hJVEUsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IERBUkssXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gbm9kZTtcbn1cbmZ1bmN0aW9uIGZvcm1hdFJvdXRlRGF0YShyb3V0ZSkge1xuICAgIGNvbnN0IGRhdGEgPSBbXTtcbiAgICBkYXRhLnB1c2goeyBrZXk6ICdwYXRoJywgdmFsdWU6IHJvdXRlLnBhdGggfSk7XG4gICAgaWYgKHJvdXRlLnJlZGlyZWN0KSB7XG4gICAgICAgIGRhdGEucHVzaCh7IGtleTogJ3JlZGlyZWN0JywgdmFsdWU6IHJvdXRlLnJlZGlyZWN0IH0pO1xuICAgIH1cbiAgICBpZiAocm91dGUuYWxpYXMpIHtcbiAgICAgICAgZGF0YS5wdXNoKHsga2V5OiAnYWxpYXMnLCB2YWx1ZTogcm91dGUuYWxpYXMgfSk7XG4gICAgfVxuICAgIGlmIChyb3V0ZS5wcm9wcykge1xuICAgICAgICBkYXRhLnB1c2goeyBrZXk6ICdwcm9wcycsIHZhbHVlOiByb3V0ZS5wcm9wcyB9KTtcbiAgICB9XG4gICAgaWYgKHJvdXRlLm5hbWUgJiYgcm91dGUubmFtZSAhPSBudWxsKSB7XG4gICAgICAgIGRhdGEucHVzaCh7IGtleTogJ25hbWUnLCB2YWx1ZTogcm91dGUubmFtZSB9KTtcbiAgICB9XG4gICAgaWYgKHJvdXRlLmNvbXBvbmVudCkge1xuICAgICAgICBjb25zdCBjb21wb25lbnQgPSB7fTtcbiAgICAgICAgLy8gaWYgKHJvdXRlLmNvbXBvbmVudC5fX2ZpbGUpIHtcbiAgICAgICAgLy8gICBjb21wb25lbnQuZmlsZSA9IHJvdXRlLmNvbXBvbmVudC5fX2ZpbGVcbiAgICAgICAgLy8gfVxuICAgICAgICBpZiAocm91dGUuY29tcG9uZW50LnRlbXBsYXRlKSB7XG4gICAgICAgICAgICBjb21wb25lbnQudGVtcGxhdGUgPSByb3V0ZS5jb21wb25lbnQudGVtcGxhdGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJvdXRlLmNvbXBvbmVudC5wcm9wcykge1xuICAgICAgICAgICAgY29tcG9uZW50LnByb3BzID0gcm91dGUuY29tcG9uZW50LnByb3BzO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKDAsIHNoYXJlZF91dGlsc18xLmlzRW1wdHlPYmplY3QpKGNvbXBvbmVudCkpIHtcbiAgICAgICAgICAgIGRhdGEucHVzaCh7IGtleTogJ2NvbXBvbmVudCcsIHZhbHVlOiBjb21wb25lbnQgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG59XG5mdW5jdGlvbiBnZXRQYXRoSWQocm91dGVNYXRjaGVyKSB7XG4gICAgbGV0IHBhdGggPSByb3V0ZU1hdGNoZXIucGF0aDtcbiAgICBpZiAocm91dGVNYXRjaGVyLnBhcmVudCkge1xuICAgICAgICBwYXRoID0gZ2V0UGF0aElkKHJvdXRlTWF0Y2hlci5wYXJlbnQpICsgcGF0aDtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGg7XG59XG5jb25zdCBUQUdfTkFNRVNQQUNFRCA9IHtcbiAgICBsYWJlbDogJ25hbWVzcGFjZWQnLFxuICAgIHRleHRDb2xvcjogV0hJVEUsXG4gICAgYmFja2dyb3VuZENvbG9yOiBEQVJLLFxufTtcbmZ1bmN0aW9uIGZvcm1hdFN0b3JlRm9ySW5zcGVjdG9yVHJlZShtb2R1bGUsIHBhdGgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBpZDogcGF0aCB8fCAncm9vdCcsXG4gICAgICAgIC8vIGFsbCBtb2R1bGVzIGVuZCB3aXRoIGEgYC9gLCB3ZSB3YW50IHRoZSBsYXN0IHNlZ21lbnQgb25seVxuICAgICAgICAvLyBjYXJ0LyAtPiBjYXJ0XG4gICAgICAgIC8vIG5lc3RlZC9jYXJ0LyAtPiBjYXJ0XG4gICAgICAgIGxhYmVsOiBleHRyYWN0TmFtZUZyb21QYXRoKHBhdGgpLFxuICAgICAgICB0YWdzOiBtb2R1bGUubmFtZXNwYWNlZCA/IFtUQUdfTkFNRVNQQUNFRF0gOiBbXSxcbiAgICAgICAgY2hpbGRyZW46IE9iamVjdC5rZXlzKG1vZHVsZS5fY2hpbGRyZW4pLm1hcCgobW9kdWxlTmFtZSkgPT4gZm9ybWF0U3RvcmVGb3JJbnNwZWN0b3JUcmVlKG1vZHVsZS5fY2hpbGRyZW5bbW9kdWxlTmFtZV0sIHBhdGggKyBtb2R1bGVOYW1lICsgJy8nKSksXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGZsYXR0ZW5TdG9yZUZvckluc3BlY3RvclRyZWUocmVzdWx0LCBtb2R1bGUsIGZpbHRlciwgcGF0aCkge1xuICAgIGlmIChwYXRoLmluY2x1ZGVzKGZpbHRlcikpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgICAgaWQ6IHBhdGggfHwgJ3Jvb3QnLFxuICAgICAgICAgICAgbGFiZWw6IHBhdGguZW5kc1dpdGgoJy8nKSA/IHBhdGguc2xpY2UoMCwgcGF0aC5sZW5ndGggLSAxKSA6IHBhdGggfHwgJ1Jvb3QnLFxuICAgICAgICAgICAgdGFnczogbW9kdWxlLm5hbWVzcGFjZWQgPyBbVEFHX05BTUVTUEFDRURdIDogW10sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBPYmplY3Qua2V5cyhtb2R1bGUuX2NoaWxkcmVuKS5mb3JFYWNoKG1vZHVsZU5hbWUgPT4ge1xuICAgICAgICBmbGF0dGVuU3RvcmVGb3JJbnNwZWN0b3JUcmVlKHJlc3VsdCwgbW9kdWxlLl9jaGlsZHJlblttb2R1bGVOYW1lXSwgZmlsdGVyLCBwYXRoICsgbW9kdWxlTmFtZSArICcvJyk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBleHRyYWN0TmFtZUZyb21QYXRoKHBhdGgpIHtcbiAgICByZXR1cm4gcGF0aCAmJiBwYXRoICE9PSAncm9vdCcgPyBwYXRoLnNwbGl0KCcvJykuc2xpY2UoLTIsIC0xKVswXSA6ICdSb290Jztcbn1cbmZ1bmN0aW9uIGZvcm1hdFN0b3JlRm9ySW5zcGVjdG9yU3RhdGUobW9kdWxlLCBnZXR0ZXJzLCBwYXRoKSB7XG4gICAgZ2V0dGVycyA9ICFtb2R1bGUubmFtZXNwYWNlZCB8fCBwYXRoID09PSAncm9vdCcgPyBtb2R1bGUuY29udGV4dC5nZXR0ZXJzIDogZ2V0dGVyc1twYXRoXTtcbiAgICBjb25zdCBnZXR0ZXJzS2V5cyA9IE9iamVjdC5rZXlzKGdldHRlcnMpO1xuICAgIGNvbnN0IHN0b3JlU3RhdGUgPSB7XG4gICAgICAgIHN0YXRlOiBPYmplY3Qua2V5cyhtb2R1bGUuc3RhdGUpLm1hcCgoa2V5KSA9PiAoe1xuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbW9kdWxlLnN0YXRlW2tleV0sXG4gICAgICAgIH0pKSxcbiAgICB9O1xuICAgIGlmIChnZXR0ZXJzS2V5cy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgdHJlZSA9IHRyYW5zZm9ybVBhdGhzVG9PYmplY3RUcmVlKGdldHRlcnMpO1xuICAgICAgICBzdG9yZVN0YXRlLmdldHRlcnMgPSBPYmplY3Qua2V5cyh0cmVlKS5tYXAoKGtleSkgPT4gKHtcbiAgICAgICAgICAgIGtleToga2V5LmVuZHNXaXRoKCcvJykgPyBleHRyYWN0TmFtZUZyb21QYXRoKGtleSkgOiBrZXksXG4gICAgICAgICAgICBlZGl0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICB2YWx1ZTogY2FuVGhyb3coKCkgPT4gdHJlZVtrZXldKSxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICByZXR1cm4gc3RvcmVTdGF0ZTtcbn1cbmZ1bmN0aW9uIHRyYW5zZm9ybVBhdGhzVG9PYmplY3RUcmVlKGdldHRlcnMpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBPYmplY3Qua2V5cyhnZXR0ZXJzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBrZXkuc3BsaXQoJy8nKTtcbiAgICAgICAgaWYgKHBhdGgubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgbGV0IHRhcmdldCA9IHJlc3VsdDtcbiAgICAgICAgICAgIGNvbnN0IGxlYWZLZXkgPSBwYXRoLnBvcCgpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBwIG9mIHBhdGgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldFtwXSkge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRbcF0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfY3VzdG9tOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHt9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IHAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcDogJ01vZHVsZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzdHJhY3Q6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXRbcF0uX2N1c3RvbS52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRhcmdldFtsZWFmS2V5XSA9IGNhblRocm93KCgpID0+IGdldHRlcnNba2V5XSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHRba2V5XSA9IGNhblRocm93KCgpID0+IGdldHRlcnNba2V5XSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gZ2V0U3RvcmVNb2R1bGUobW9kdWxlTWFwLCBwYXRoKSB7XG4gICAgY29uc3QgbmFtZXMgPSBwYXRoLnNwbGl0KCcvJykuZmlsdGVyKChuKSA9PiBuKTtcbiAgICByZXR1cm4gbmFtZXMucmVkdWNlKChtb2R1bGUsIG1vZHVsZU5hbWUsIGkpID0+IHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSBtb2R1bGVbbW9kdWxlTmFtZV07XG4gICAgICAgIGlmICghY2hpbGQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBtb2R1bGUgXCIke21vZHVsZU5hbWV9XCIgZm9yIHBhdGggXCIke3BhdGh9XCIuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGkgPT09IG5hbWVzLmxlbmd0aCAtIDEgPyBjaGlsZCA6IGNoaWxkLl9jaGlsZHJlbjtcbiAgICB9LCBwYXRoID09PSAncm9vdCcgPyBtb2R1bGVNYXAgOiBtb2R1bGVNYXAucm9vdC5fY2hpbGRyZW4pO1xufVxuZnVuY3Rpb24gY2FuVGhyb3coY2IpIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gY2IoKTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGU7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGx1Z2luLmpzLm1hcCJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///7725\n");
|
|
318
|
+
eval("\n\nvar __importDefault = this && this.__importDefault || function (mod) {\n return mod && mod.__esModule ? mod : {\n \"default\": mod\n };\n};\n\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nexports.setupPlugin = void 0;\n\nconst devtools_api_1 = __webpack_require__(72039);\n\nconst shared_utils_1 = __webpack_require__(27146);\n\nconst clone_deep_1 = __importDefault(__webpack_require__(96206));\n\nlet actionId = 0;\n\nfunction setupPlugin(api, app, Vue) {\n const ROUTER_INSPECTOR_ID = 'vue2-router-inspector';\n const ROUTER_CHANGES_LAYER_ID = 'vue2-router-changes';\n const VUEX_INSPECTOR_ID = 'vue2-vuex-inspector';\n const VUEX_MUTATIONS_ID = 'vue2-vuex-mutations';\n const VUEX_ACTIONS_ID = 'vue2-vuex-actions';\n (0, devtools_api_1.setupDevtoolsPlugin)({\n app,\n id: 'org.vuejs.vue2-internal',\n label: 'Vue 2',\n homepage: 'https://vuejs.org/',\n logo: 'https://vuejs.org/images/icons/favicon-96x96.png'\n }, api => {\n var _a;\n\n const hook = shared_utils_1.target.__VUE_DEVTOOLS_GLOBAL_HOOK__; // Vue Router\n\n if (app.$router) {\n const router = app.$router; // Inspector\n\n api.addInspector({\n id: ROUTER_INSPECTOR_ID,\n label: 'Routes',\n icon: 'book',\n treeFilterPlaceholder: 'Search routes'\n });\n api.on.getInspectorTree(payload => {\n if (payload.inspectorId === ROUTER_INSPECTOR_ID) {\n payload.rootNodes = router.options.routes.map(route => formatRouteNode(router, route, '', payload.filter)).filter(Boolean);\n }\n });\n api.on.getInspectorState(payload => {\n if (payload.inspectorId === ROUTER_INSPECTOR_ID) {\n const route = router.matcher.getRoutes().find(r => getPathId(r) === payload.nodeId);\n\n if (route) {\n payload.state = {\n options: formatRouteData(route)\n };\n }\n }\n }); // Timeline\n\n api.addTimelineLayer({\n id: ROUTER_CHANGES_LAYER_ID,\n label: 'Router Navigations',\n color: 0x40a8c4\n });\n router.afterEach((to, from) => {\n api.addTimelineEvent({\n layerId: ROUTER_CHANGES_LAYER_ID,\n event: {\n time: Date.now(),\n title: to.path,\n data: {\n from,\n to\n }\n }\n });\n api.sendInspectorTree(ROUTER_INSPECTOR_ID);\n });\n } // Vuex\n\n\n if (app.$store) {\n const store = app.$store;\n api.addInspector({\n id: VUEX_INSPECTOR_ID,\n label: 'Vuex',\n icon: 'storage',\n treeFilterPlaceholder: 'Filter stores...'\n });\n api.on.getInspectorTree(payload => {\n if (payload.inspectorId === VUEX_INSPECTOR_ID) {\n if (payload.filter) {\n const nodes = [];\n flattenStoreForInspectorTree(nodes, store._modules.root, payload.filter, '');\n payload.rootNodes = nodes;\n } else {\n payload.rootNodes = [formatStoreForInspectorTree(store._modules.root, '')];\n }\n }\n });\n api.on.getInspectorState(payload => {\n if (payload.inspectorId === VUEX_INSPECTOR_ID) {\n const modulePath = payload.nodeId;\n const module = getStoreModule(store._modules, modulePath); // Access the getters prop to init getters cache (which is lazy)\n // eslint-disable-next-line no-unused-expressions\n\n module.context.getters;\n payload.state = formatStoreForInspectorState(module, store._makeLocalGettersCache, modulePath);\n }\n });\n api.on.editInspectorState(payload => {\n if (payload.inspectorId === VUEX_INSPECTOR_ID) {\n let path = payload.path;\n\n if (payload.nodeId !== 'root') {\n path = [...payload.nodeId.substring(0, payload.nodeId.length - 1).split('/'), ...path];\n }\n\n store._committing = true;\n payload.set(store._vm.$data.$$state, path);\n store._committing = false;\n }\n });\n api.addTimelineLayer({\n id: VUEX_MUTATIONS_ID,\n label: 'Vuex Mutations',\n color: LIME_500\n });\n api.addTimelineLayer({\n id: VUEX_ACTIONS_ID,\n label: 'Vuex Actions',\n color: LIME_500\n });\n hook.on('vuex:mutation', (mutation, state) => {\n api.sendInspectorState(VUEX_INSPECTOR_ID);\n const data = {};\n\n if (mutation.payload) {\n data.payload = mutation.payload;\n }\n\n data.state = (0, clone_deep_1.default)(state);\n api.addTimelineEvent({\n layerId: VUEX_MUTATIONS_ID,\n event: {\n time: Date.now(),\n title: mutation.type,\n data\n }\n });\n });\n (_a = store.subscribeAction) === null || _a === void 0 ? void 0 : _a.call(store, {\n before: (action, state) => {\n const data = {};\n\n if (action.payload) {\n data.payload = action.payload;\n }\n\n action._id = actionId++;\n action._time = Date.now();\n data.state = state;\n api.addTimelineEvent({\n layerId: VUEX_ACTIONS_ID,\n event: {\n time: action._time,\n title: action.type,\n groupId: action._id,\n subtitle: 'start',\n data\n }\n });\n },\n after: (action, state) => {\n const data = {};\n\n const duration = Date.now() - action._time;\n\n data.duration = {\n _custom: {\n type: 'duration',\n display: `${duration}ms`,\n tooltip: 'Action duration',\n value: duration\n }\n };\n\n if (action.payload) {\n data.payload = action.payload;\n }\n\n data.state = state;\n api.addTimelineEvent({\n layerId: VUEX_ACTIONS_ID,\n event: {\n time: Date.now(),\n title: action.type,\n groupId: action._id,\n subtitle: 'end',\n data\n }\n });\n }\n }, {\n prepend: true\n }); // Inspect getters on mutations\n\n api.on.inspectTimelineEvent(payload => {\n if (payload.layerId === VUEX_MUTATIONS_ID) {\n const getterKeys = Object.keys(store.getters);\n\n if (getterKeys.length) {\n const vm = new Vue({\n data: {\n $$state: payload.data.state\n },\n computed: store._vm.$options.computed\n });\n const originalVm = store._vm;\n store._vm = vm;\n const tree = transformPathsToObjectTree(store.getters);\n payload.data.getters = (0, clone_deep_1.default)(tree);\n store._vm = originalVm;\n vm.$destroy();\n }\n }\n });\n }\n });\n}\n\nexports.setupPlugin = setupPlugin;\n/**\n * Extracted from tailwind palette\n */\n\nconst BLUE_600 = 0x2563eb;\nconst LIME_500 = 0x84cc16;\nconst CYAN_400 = 0x22d3ee;\nconst ORANGE_400 = 0xfb923c;\nconst WHITE = 0xffffff;\nconst DARK = 0x666666;\n\nfunction formatRouteNode(router, route, parentPath, filter) {\n var _a, _b;\n\n const node = {\n id: parentPath + route.path,\n label: route.path,\n children: (_a = route.children) === null || _a === void 0 ? void 0 : _a.map(child => formatRouteNode(router, child, route.path, filter)).filter(Boolean),\n tags: []\n };\n if (filter && !node.id.includes(filter) && !((_b = node.children) === null || _b === void 0 ? void 0 : _b.length)) return null;\n\n if (route.name != null) {\n node.tags.push({\n label: String(route.name),\n textColor: 0,\n backgroundColor: CYAN_400\n });\n }\n\n if (route.alias != null) {\n node.tags.push({\n label: 'alias',\n textColor: 0,\n backgroundColor: ORANGE_400\n });\n }\n\n const currentPath = router.currentRoute.matched.reduce((p, m) => p + m.path, '');\n\n if (node.id === currentPath) {\n node.tags.push({\n label: 'active',\n textColor: WHITE,\n backgroundColor: BLUE_600\n });\n }\n\n if (route.redirect) {\n node.tags.push({\n label: 'redirect: ' + (typeof route.redirect === 'string' ? route.redirect : 'Object'),\n textColor: WHITE,\n backgroundColor: DARK\n });\n }\n\n return node;\n}\n\nfunction formatRouteData(route) {\n const data = [];\n data.push({\n key: 'path',\n value: route.path\n });\n\n if (route.redirect) {\n data.push({\n key: 'redirect',\n value: route.redirect\n });\n }\n\n if (route.alias) {\n data.push({\n key: 'alias',\n value: route.alias\n });\n }\n\n if (route.props) {\n data.push({\n key: 'props',\n value: route.props\n });\n }\n\n if (route.name && route.name != null) {\n data.push({\n key: 'name',\n value: route.name\n });\n }\n\n if (route.component) {\n const component = {}; // if (route.component.__file) {\n // component.file = route.component.__file\n // }\n\n if (route.component.template) {\n component.template = route.component.template;\n }\n\n if (route.component.props) {\n component.props = route.component.props;\n }\n\n if (!(0, shared_utils_1.isEmptyObject)(component)) {\n data.push({\n key: 'component',\n value: component\n });\n }\n }\n\n return data;\n}\n\nfunction getPathId(routeMatcher) {\n let path = routeMatcher.path;\n\n if (routeMatcher.parent) {\n path = getPathId(routeMatcher.parent) + path;\n }\n\n return path;\n}\n\nconst TAG_NAMESPACED = {\n label: 'namespaced',\n textColor: WHITE,\n backgroundColor: DARK\n};\n\nfunction formatStoreForInspectorTree(module, path) {\n return {\n id: path || 'root',\n // all modules end with a `/`, we want the last segment only\n // cart/ -> cart\n // nested/cart/ -> cart\n label: extractNameFromPath(path),\n tags: module.namespaced ? [TAG_NAMESPACED] : [],\n children: Object.keys(module._children).map(moduleName => formatStoreForInspectorTree(module._children[moduleName], path + moduleName + '/'))\n };\n}\n\nfunction flattenStoreForInspectorTree(result, module, filter, path) {\n if (path.includes(filter)) {\n result.push({\n id: path || 'root',\n label: path.endsWith('/') ? path.slice(0, path.length - 1) : path || 'Root',\n tags: module.namespaced ? [TAG_NAMESPACED] : []\n });\n }\n\n Object.keys(module._children).forEach(moduleName => {\n flattenStoreForInspectorTree(result, module._children[moduleName], filter, path + moduleName + '/');\n });\n}\n\nfunction extractNameFromPath(path) {\n return path && path !== 'root' ? path.split('/').slice(-2, -1)[0] : 'Root';\n}\n\nfunction formatStoreForInspectorState(module, getters, path) {\n getters = !module.namespaced || path === 'root' ? module.context.getters : getters[path];\n const gettersKeys = Object.keys(getters);\n const storeState = {\n state: Object.keys(module.state).map(key => ({\n key,\n editable: true,\n value: module.state[key]\n }))\n };\n\n if (gettersKeys.length) {\n const tree = transformPathsToObjectTree(getters);\n storeState.getters = Object.keys(tree).map(key => ({\n key: key.endsWith('/') ? extractNameFromPath(key) : key,\n editable: false,\n value: canThrow(() => tree[key])\n }));\n }\n\n return storeState;\n}\n\nfunction transformPathsToObjectTree(getters) {\n const result = {};\n Object.keys(getters).forEach(key => {\n const path = key.split('/');\n\n if (path.length > 1) {\n let target = result;\n const leafKey = path.pop();\n\n for (const p of path) {\n if (!target[p]) {\n target[p] = {\n _custom: {\n value: {},\n display: p,\n tooltip: 'Module',\n abstract: true\n }\n };\n }\n\n target = target[p]._custom.value;\n }\n\n target[leafKey] = canThrow(() => getters[key]);\n } else {\n result[key] = canThrow(() => getters[key]);\n }\n });\n return result;\n}\n\nfunction getStoreModule(moduleMap, path) {\n const names = path.split('/').filter(n => n);\n return names.reduce((module, moduleName, i) => {\n const child = module[moduleName];\n\n if (!child) {\n throw new Error(`Missing module \"${moduleName}\" for path \"${path}\".`);\n }\n\n return i === names.length - 1 ? child : child._children;\n }, path === 'root' ? moduleMap : moduleMap.root._children);\n}\n\nfunction canThrow(cb) {\n try {\n return cb();\n } catch (e) {\n return e;\n }\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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bkIsRUFBZ0M7QUFDOUIsTUFBSTtBQUNGLFdBQU8sRUFBRSxFQUFUO0FBQ0QsR0FGRCxDQUVFLE9BQU8sQ0FBUCxFQUFVO0FBQ1YsV0FBTyxDQUFQO0FBQ0Q7QUFDRiIsInNvdXJjZXMiOlsid2VicGFjazovL0B2dWUvZGV2dG9vbHMvLi4vc3JjL3BsdWdpbi50cz8wY2NhIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5zZXR1cFBsdWdpbiA9IHZvaWQgMDtcbmNvbnN0IGRldnRvb2xzX2FwaV8xID0gcmVxdWlyZShcIkB2dWUvZGV2dG9vbHMtYXBpXCIpO1xuY29uc3Qgc2hhcmVkX3V0aWxzXzEgPSByZXF1aXJlKFwiQHZ1ZS1kZXZ0b29scy9zaGFyZWQtdXRpbHNcIik7XG5jb25zdCBjbG9uZV9kZWVwXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImNsb25lLWRlZXBcIikpO1xubGV0IGFjdGlvbklkID0gMDtcbmZ1bmN0aW9uIHNldHVwUGx1Z2luKGFwaSwgYXBwLCBWdWUpIHtcbiAgICBjb25zdCBST1VURVJfSU5TUEVDVE9SX0lEID0gJ3Z1ZTItcm91dGVyLWluc3BlY3Rvcic7XG4gICAgY29uc3QgUk9VVEVSX0NIQU5HRVNfTEFZRVJfSUQgPSAndnVlMi1yb3V0ZXItY2hhbmdlcyc7XG4gICAgY29uc3QgVlVFWF9JTlNQRUNUT1JfSUQgPSAndnVlMi12dWV4LWluc3BlY3Rvcic7XG4gICAgY29uc3QgVlVFWF9NVVRBVElPTlNfSUQgPSAndnVlMi12dWV4LW11dGF0aW9ucyc7XG4gICAgY29uc3QgVlVFWF9BQ1RJT05TX0lEID0gJ3Z1ZTItdnVleC1hY3Rpb25zJztcbiAgICAoMCwgZGV2dG9vbHNfYXBpXzEuc2V0dXBEZXZ0b29sc1BsdWdpbikoe1xuICAgICAgICBhcHAsXG4gICAgICAgIGlkOiAnb3JnLnZ1ZWpzLnZ1ZTItaW50ZXJuYWwnLFxuICAgICAgICBsYWJlbDogJ1Z1ZSAyJyxcbiAgICAgICAgaG9tZXBhZ2U6ICdodHRwczovL3Z1ZWpzLm9yZy8nLFxuICAgICAgICBsb2dvOiAnaHR0cHM6Ly92dWVqcy5vcmcvaW1hZ2VzL2ljb25zL2Zhdmljb24tOTZ4OTYucG5nJyxcbiAgICB9LCBhcGkgPT4ge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IGhvb2sgPSBzaGFyZWRfdXRpbHNfMS50YXJnZXQuX19WVUVfREVWVE9PTFNfR0xPQkFMX0hPT0tfXztcbiAgICAgICAgLy8gVnVlIFJvdXRlclxuICAgICAgICBpZiAoYXBwLiRyb3V0ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvdXRlciA9IGFwcC4kcm91dGVyO1xuICAgICAgICAgICAgLy8gSW5zcGVjdG9yXG4gICAgICAgICAgICBhcGkuYWRkSW5zcGVjdG9yKHtcbiAgICAgICAgICAgICAgICBpZDogUk9VVEVSX0lOU1BFQ1RPUl9JRCxcbiAgICAgICAgICAgICAgICBsYWJlbDogJ1JvdXRlcycsXG4gICAgICAgICAgICAgICAgaWNvbjogJ2Jvb2snLFxuICAgICAgICAgICAgICAgIHRyZWVGaWx0ZXJQbGFjZWhvbGRlcjogJ1NlYXJjaCByb3V0ZXMnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhcGkub24uZ2V0SW5zcGVjdG9yVHJlZShwYXlsb2FkID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocGF5bG9hZC5pbnNwZWN0b3JJZCA9PT0gUk9VVEVSX0lOU1BFQ1RPUl9JRCkge1xuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLnJvb3ROb2RlcyA9IHJvdXRlci5vcHRpb25zLnJvdXRlcy5tYXAocm91dGUgPT4gZm9ybWF0Um91dGVOb2RlKHJvdXRlciwgcm91dGUsICcnLCBwYXlsb2FkLmZpbHRlcikpLmZpbHRlcihCb29sZWFuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGFwaS5vbi5nZXRJbnNwZWN0b3JTdGF0ZShwYXlsb2FkID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocGF5bG9hZC5pbnNwZWN0b3JJZCA9PT0gUk9VVEVSX0lOU1BFQ1RPUl9JRCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByb3V0ZSA9IHJvdXRlci5tYXRjaGVyLmdldFJvdXRlcygpLmZpbmQociA9PiBnZXRQYXRoSWQocikgPT09IHBheWxvYWQubm9kZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLnN0YXRlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IGZvcm1hdFJvdXRlRGF0YShyb3V0ZSksXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBUaW1lbGluZVxuICAgICAgICAgICAgYXBpLmFkZFRpbWVsaW5lTGF5ZXIoe1xuICAgICAgICAgICAgICAgIGlkOiBST1VURVJfQ0hBTkdFU19MQVlFUl9JRCxcbiAgICAgICAgICAgICAgICBsYWJlbDogJ1JvdXRlciBOYXZpZ2F0aW9ucycsXG4gICAgICAgICAgICAgICAgY29sb3I6IDB4NDBhOGM0LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByb3V0ZXIuYWZ0ZXJFYWNoKCh0bywgZnJvbSkgPT4ge1xuICAgICAgICAgICAgICAgIGFwaS5hZGRUaW1lbGluZUV2ZW50KHtcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXJJZDogUk9VVEVSX0NIQU5HRVNfTEFZRVJfSUQsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1lOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRvLnBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYXBpLnNlbmRJbnNwZWN0b3JUcmVlKFJPVVRFUl9JTlNQRUNUT1JfSUQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVnVleFxuICAgICAgICBpZiAoYXBwLiRzdG9yZSkge1xuICAgICAgICAgICAgY29uc3Qgc3RvcmUgPSBhcHAuJHN0b3JlO1xuICAgICAgICAgICAgYXBpLmFkZEluc3BlY3Rvcih7XG4gICAgICAgICAgICAgICAgaWQ6IFZVRVhfSU5TUEVDVE9SX0lELFxuICAgICAgICAgICAgICAgIGxhYmVsOiAnVnVleCcsXG4gICAgICAgICAgICAgICAgaWNvbjogJ3N0b3JhZ2UnLFxuICAgICAgICAgICAgICAgIHRyZWVGaWx0ZXJQbGFjZWhvbGRlcjogJ0ZpbHRlciBzdG9yZXMuLi4nLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhcGkub24uZ2V0SW5zcGVjdG9yVHJlZSgocGF5bG9hZCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChwYXlsb2FkLmluc3BlY3RvcklkID09PSBWVUVYX0lOU1BFQ1RPUl9JRCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGF5bG9hZC5maWx0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBmbGF0dGVuU3RvcmVGb3JJbnNwZWN0b3JUcmVlKG5vZGVzLCBzdG9yZS5fbW9kdWxlcy5yb290LCBwYXlsb2FkLmZpbHRlciwgJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC5yb290Tm9kZXMgPSBub2RlcztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQucm9vdE5vZGVzID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdFN0b3JlRm9ySW5zcGVjdG9yVHJlZShzdG9yZS5fbW9kdWxlcy5yb290LCAnJyksXG4gICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhcGkub24uZ2V0SW5zcGVjdG9yU3RhdGUoKHBheWxvYWQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocGF5bG9hZC5pbnNwZWN0b3JJZCA9PT0gVlVFWF9JTlNQRUNUT1JfSUQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9kdWxlUGF0aCA9IHBheWxvYWQubm9kZUlkO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtb2R1bGUgPSBnZXRTdG9yZU1vZHVsZShzdG9yZS5fbW9kdWxlcywgbW9kdWxlUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFjY2VzcyB0aGUgZ2V0dGVycyBwcm9wIHRvIGluaXQgZ2V0dGVycyBjYWNoZSAod2hpY2ggaXMgbGF6eSlcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xuICAgICAgICAgICAgICAgICAgICBtb2R1bGUuY29udGV4dC5nZXR0ZXJzO1xuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLnN0YXRlID0gZm9ybWF0U3RvcmVGb3JJbnNwZWN0b3JTdGF0ZShtb2R1bGUsIHN0b3JlLl9tYWtlTG9jYWxHZXR0ZXJzQ2FjaGUsIG1vZHVsZVBhdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYXBpLm9uLmVkaXRJbnNwZWN0b3JTdGF0ZSgocGF5bG9hZCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChwYXlsb2FkLmluc3BlY3RvcklkID09PSBWVUVYX0lOU1BFQ1RPUl9JRCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGF0aCA9IHBheWxvYWQucGF0aDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBheWxvYWQubm9kZUlkICE9PSAncm9vdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucGF5bG9hZC5ub2RlSWQuc3Vic3RyaW5nKDAsIHBheWxvYWQubm9kZUlkLmxlbmd0aCAtIDEpLnNwbGl0KCcvJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc3RvcmUuX2NvbW1pdHRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLnNldChzdG9yZS5fdm0uJGRhdGEuJCRzdGF0ZSwgcGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlLl9jb21taXR0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhcGkuYWRkVGltZWxpbmVMYXllcih7XG4gICAgICAgICAgICAgICAgaWQ6IFZVRVhfTVVUQVRJT05TX0lELFxuICAgICAgICAgICAgICAgIGxhYmVsOiAnVnVleCBNdXRhdGlvbnMnLFxuICAgICAgICAgICAgICAgIGNvbG9yOiBMSU1FXzUwMCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYXBpLmFkZFRpbWVsaW5lTGF5ZXIoe1xuICAgICAgICAgICAgICAgIGlkOiBWVUVYX0FDVElPTlNfSUQsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICdWdWV4IEFjdGlvbnMnLFxuICAgICAgICAgICAgICAgIGNvbG9yOiBMSU1FXzUwMCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaG9vay5vbigndnVleDptdXRhdGlvbicsIChtdXRhdGlvbiwgc3RhdGUpID0+IHtcbiAgICAgICAgICAgICAgICBhcGkuc2VuZEluc3BlY3RvclN0YXRlKFZVRVhfSU5TUEVDVE9SX0lEKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0ge307XG4gICAgICAgICAgICAgICAgaWYgKG11dGF0aW9uLnBheWxvYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5wYXlsb2FkID0gbXV0YXRpb24ucGF5bG9hZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGF0YS5zdGF0ZSA9ICgwLCBjbG9uZV9kZWVwXzEuZGVmYXVsdCkoc3RhdGUpO1xuICAgICAgICAgICAgICAgIGFwaS5hZGRUaW1lbGluZUV2ZW50KHtcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXJJZDogVlVFWF9NVVRBVElPTlNfSUQsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1lOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IG11dGF0aW9uLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAoX2EgPSBzdG9yZS5zdWJzY3JpYmVBY3Rpb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKHN0b3JlLCB7XG4gICAgICAgICAgICAgICAgYmVmb3JlOiAoYWN0aW9uLCBzdGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0ge307XG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb24ucGF5bG9hZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5wYXlsb2FkID0gYWN0aW9uLnBheWxvYWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uLl9pZCA9IGFjdGlvbklkKys7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbi5fdGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEuc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgYXBpLmFkZFRpbWVsaW5lRXZlbnQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJJZDogVlVFWF9BQ1RJT05TX0lELFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lOiBhY3Rpb24uX3RpbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGFjdGlvbi50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwSWQ6IGFjdGlvbi5faWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidGl0bGU6ICdzdGFydCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYWZ0ZXI6IChhY3Rpb24sIHN0YXRlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZHVyYXRpb24gPSBEYXRlLm5vdygpIC0gYWN0aW9uLl90aW1lO1xuICAgICAgICAgICAgICAgICAgICBkYXRhLmR1cmF0aW9uID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgX2N1c3RvbToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdkdXJhdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogYCR7ZHVyYXRpb259bXNgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXA6ICdBY3Rpb24gZHVyYXRpb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBkdXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb24ucGF5bG9hZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5wYXlsb2FkID0gYWN0aW9uLnBheWxvYWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZGF0YS5zdGF0ZSA9IHN0YXRlO1xuICAgICAgICAgICAgICAgICAgICBhcGkuYWRkVGltZWxpbmVFdmVudCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXllcklkOiBWVUVYX0FDVElPTlNfSUQsXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWU6IERhdGUubm93KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGFjdGlvbi50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwSWQ6IGFjdGlvbi5faWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidGl0bGU6ICdlbmQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSwgeyBwcmVwZW5kOiB0cnVlIH0pO1xuICAgICAgICAgICAgLy8gSW5zcGVjdCBnZXR0ZXJzIG9uIG11dGF0aW9uc1xuICAgICAgICAgICAgYXBpLm9uLmluc3BlY3RUaW1lbGluZUV2ZW50KHBheWxvYWQgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChwYXlsb2FkLmxheWVySWQgPT09IFZVRVhfTVVUQVRJT05TX0lEKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdldHRlcktleXMgPSBPYmplY3Qua2V5cyhzdG9yZS5nZXR0ZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGdldHRlcktleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2bSA9IG5ldyBWdWUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCRzdGF0ZTogcGF5bG9hZC5kYXRhLnN0YXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZWQ6IHN0b3JlLl92bS4kb3B0aW9ucy5jb21wdXRlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxWbSA9IHN0b3JlLl92bTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlLl92bSA9IHZtO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJlZSA9IHRyYW5zZm9ybVBhdGhzVG9PYmplY3RUcmVlKHN0b3JlLmdldHRlcnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC5kYXRhLmdldHRlcnMgPSAoMCwgY2xvbmVfZGVlcF8xLmRlZmF1bHQpKHRyZWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUuX3ZtID0gb3JpZ2luYWxWbTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLiRkZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuZXhwb3J0cy5zZXR1cFBsdWdpbiA9IHNldHVwUGx1Z2luO1xuLyoqXG4gKiBFeHRyYWN0ZWQgZnJvbSB0YWlsd2luZCBwYWxldHRlXG4gKi9cbmNvbnN0IEJMVUVfNjAwID0gMHgyNTYzZWI7XG5jb25zdCBMSU1FXzUwMCA9IDB4ODRjYzE2O1xuY29uc3QgQ1lBTl80MDAgPSAweDIyZDNlZTtcbmNvbnN0IE9SQU5HRV80MDAgPSAweGZiOTIzYztcbmNvbnN0IFdISVRFID0gMHhmZmZmZmY7XG5jb25zdCBEQVJLID0gMHg2NjY2NjY7XG5mdW5jdGlvbiBmb3JtYXRSb3V0ZU5vZGUocm91dGVyLCByb3V0ZSwgcGFyZW50UGF0aCwgZmlsdGVyKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICBjb25zdCBub2RlID0ge1xuICAgICAgICBpZDogcGFyZW50UGF0aCArIHJvdXRlLnBhdGgsXG4gICAgICAgIGxhYmVsOiByb3V0ZS5wYXRoLFxuICAgICAgICBjaGlsZHJlbjogKF9hID0gcm91dGUuY2hpbGRyZW4pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5tYXAoY2hpbGQgPT4gZm9ybWF0Um91dGVOb2RlKHJvdXRlciwgY2hpbGQsIHJvdXRlLnBhdGgsIGZpbHRlcikpLmZpbHRlcihCb29sZWFuKSxcbiAgICAgICAgdGFnczogW10sXG4gICAgfTtcbiAgICBpZiAoZmlsdGVyICYmICFub2RlLmlkLmluY2x1ZGVzKGZpbHRlcikgJiYgISgoX2IgPSBub2RlLmNoaWxkcmVuKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IubGVuZ3RoKSlcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgaWYgKHJvdXRlLm5hbWUgIT0gbnVsbCkge1xuICAgICAgICBub2RlLnRhZ3MucHVzaCh7XG4gICAgICAgICAgICBsYWJlbDogU3RyaW5nKHJvdXRlLm5hbWUpLFxuICAgICAgICAgICAgdGV4dENvbG9yOiAwLFxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBDWUFOXzQwMCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChyb3V0ZS5hbGlhcyAhPSBudWxsKSB7XG4gICAgICAgIG5vZGUudGFncy5wdXNoKHtcbiAgICAgICAgICAgIGxhYmVsOiAnYWxpYXMnLFxuICAgICAgICAgICAgdGV4dENvbG9yOiAwLFxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBPUkFOR0VfNDAwLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgY3VycmVudFBhdGggPSByb3V0ZXIuY3VycmVudFJvdXRlLm1hdGNoZWQucmVkdWNlKChwLCBtKSA9PiBwICsgbS5wYXRoLCAnJyk7XG4gICAgaWYgKG5vZGUuaWQgPT09IGN1cnJlbnRQYXRoKSB7XG4gICAgICAgIG5vZGUudGFncy5wdXNoKHtcbiAgICAgICAgICAgIGxhYmVsOiAnYWN0aXZlJyxcbiAgICAgICAgICAgIHRleHRDb2xvcjogV0hJVEUsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IEJMVUVfNjAwLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHJvdXRlLnJlZGlyZWN0KSB7XG4gICAgICAgIG5vZGUudGFncy5wdXNoKHtcbiAgICAgICAgICAgIGxhYmVsOiAncmVkaXJlY3Q6ICcgK1xuICAgICAgICAgICAgICAgICh0eXBlb2Ygcm91dGUucmVkaXJlY3QgPT09ICdzdHJpbmcnID8gcm91dGUucmVkaXJlY3QgOiAnT2JqZWN0JyksXG4gICAgICAgICAgICB0ZXh0Q29sb3I6IFdISVRFLFxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBEQVJLLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGU7XG59XG5mdW5jdGlvbiBmb3JtYXRSb3V0ZURhdGEocm91dGUpIHtcbiAgICBjb25zdCBkYXRhID0gW107XG4gICAgZGF0YS5wdXNoKHsga2V5OiAncGF0aCcsIHZhbHVlOiByb3V0ZS5wYXRoIH0pO1xuICAgIGlmIChyb3V0ZS5yZWRpcmVjdCkge1xuICAgICAgICBkYXRhLnB1c2goeyBrZXk6ICdyZWRpcmVjdCcsIHZhbHVlOiByb3V0ZS5yZWRpcmVjdCB9KTtcbiAgICB9XG4gICAgaWYgKHJvdXRlLmFsaWFzKSB7XG4gICAgICAgIGRhdGEucHVzaCh7IGtleTogJ2FsaWFzJywgdmFsdWU6IHJvdXRlLmFsaWFzIH0pO1xuICAgIH1cbiAgICBpZiAocm91dGUucHJvcHMpIHtcbiAgICAgICAgZGF0YS5wdXNoKHsga2V5OiAncHJvcHMnLCB2YWx1ZTogcm91dGUucHJvcHMgfSk7XG4gICAgfVxuICAgIGlmIChyb3V0ZS5uYW1lICYmIHJvdXRlLm5hbWUgIT0gbnVsbCkge1xuICAgICAgICBkYXRhLnB1c2goeyBrZXk6ICduYW1lJywgdmFsdWU6IHJvdXRlLm5hbWUgfSk7XG4gICAgfVxuICAgIGlmIChyb3V0ZS5jb21wb25lbnQpIHtcbiAgICAgICAgY29uc3QgY29tcG9uZW50ID0ge307XG4gICAgICAgIC8vIGlmIChyb3V0ZS5jb21wb25lbnQuX19maWxlKSB7XG4gICAgICAgIC8vICAgY29tcG9uZW50LmZpbGUgPSByb3V0ZS5jb21wb25lbnQuX19maWxlXG4gICAgICAgIC8vIH1cbiAgICAgICAgaWYgKHJvdXRlLmNvbXBvbmVudC50ZW1wbGF0ZSkge1xuICAgICAgICAgICAgY29tcG9uZW50LnRlbXBsYXRlID0gcm91dGUuY29tcG9uZW50LnRlbXBsYXRlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyb3V0ZS5jb21wb25lbnQucHJvcHMpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5wcm9wcyA9IHJvdXRlLmNvbXBvbmVudC5wcm9wcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoISgwLCBzaGFyZWRfdXRpbHNfMS5pc0VtcHR5T2JqZWN0KShjb21wb25lbnQpKSB7XG4gICAgICAgICAgICBkYXRhLnB1c2goeyBrZXk6ICdjb21wb25lbnQnLCB2YWx1ZTogY29tcG9uZW50IH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xufVxuZnVuY3Rpb24gZ2V0UGF0aElkKHJvdXRlTWF0Y2hlcikge1xuICAgIGxldCBwYXRoID0gcm91dGVNYXRjaGVyLnBhdGg7XG4gICAgaWYgKHJvdXRlTWF0Y2hlci5wYXJlbnQpIHtcbiAgICAgICAgcGF0aCA9IGdldFBhdGhJZChyb3V0ZU1hdGNoZXIucGFyZW50KSArIHBhdGg7XG4gICAgfVxuICAgIHJldHVybiBwYXRoO1xufVxuY29uc3QgVEFHX05BTUVTUEFDRUQgPSB7XG4gICAgbGFiZWw6ICduYW1lc3BhY2VkJyxcbiAgICB0ZXh0Q29sb3I6IFdISVRFLFxuICAgIGJhY2tncm91bmRDb2xvcjogREFSSyxcbn07XG5mdW5jdGlvbiBmb3JtYXRTdG9yZUZvckluc3BlY3RvclRyZWUobW9kdWxlLCBwYXRoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IHBhdGggfHwgJ3Jvb3QnLFxuICAgICAgICAvLyBhbGwgbW9kdWxlcyBlbmQgd2l0aCBhIGAvYCwgd2Ugd2FudCB0aGUgbGFzdCBzZWdtZW50IG9ubHlcbiAgICAgICAgLy8gY2FydC8gLT4gY2FydFxuICAgICAgICAvLyBuZXN0ZWQvY2FydC8gLT4gY2FydFxuICAgICAgICBsYWJlbDogZXh0cmFjdE5hbWVGcm9tUGF0aChwYXRoKSxcbiAgICAgICAgdGFnczogbW9kdWxlLm5hbWVzcGFjZWQgPyBbVEFHX05BTUVTUEFDRURdIDogW10sXG4gICAgICAgIGNoaWxkcmVuOiBPYmplY3Qua2V5cyhtb2R1bGUuX2NoaWxkcmVuKS5tYXAoKG1vZHVsZU5hbWUpID0+IGZvcm1hdFN0b3JlRm9ySW5zcGVjdG9yVHJlZShtb2R1bGUuX2NoaWxkcmVuW21vZHVsZU5hbWVdLCBwYXRoICsgbW9kdWxlTmFtZSArICcvJykpLFxuICAgIH07XG59XG5mdW5jdGlvbiBmbGF0dGVuU3RvcmVGb3JJbnNwZWN0b3JUcmVlKHJlc3VsdCwgbW9kdWxlLCBmaWx0ZXIsIHBhdGgpIHtcbiAgICBpZiAocGF0aC5pbmNsdWRlcyhmaWx0ZXIpKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICAgIGlkOiBwYXRoIHx8ICdyb290JyxcbiAgICAgICAgICAgIGxhYmVsOiBwYXRoLmVuZHNXaXRoKCcvJykgPyBwYXRoLnNsaWNlKDAsIHBhdGgubGVuZ3RoIC0gMSkgOiBwYXRoIHx8ICdSb290JyxcbiAgICAgICAgICAgIHRhZ3M6IG1vZHVsZS5uYW1lc3BhY2VkID8gW1RBR19OQU1FU1BBQ0VEXSA6IFtdLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgT2JqZWN0LmtleXMobW9kdWxlLl9jaGlsZHJlbikuZm9yRWFjaChtb2R1bGVOYW1lID0+IHtcbiAgICAgICAgZmxhdHRlblN0b3JlRm9ySW5zcGVjdG9yVHJlZShyZXN1bHQsIG1vZHVsZS5fY2hpbGRyZW5bbW9kdWxlTmFtZV0sIGZpbHRlciwgcGF0aCArIG1vZHVsZU5hbWUgKyAnLycpO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gZXh0cmFjdE5hbWVGcm9tUGF0aChwYXRoKSB7XG4gICAgcmV0dXJuIHBhdGggJiYgcGF0aCAhPT0gJ3Jvb3QnID8gcGF0aC5zcGxpdCgnLycpLnNsaWNlKC0yLCAtMSlbMF0gOiAnUm9vdCc7XG59XG5mdW5jdGlvbiBmb3JtYXRTdG9yZUZvckluc3BlY3RvclN0YXRlKG1vZHVsZSwgZ2V0dGVycywgcGF0aCkge1xuICAgIGdldHRlcnMgPSAhbW9kdWxlLm5hbWVzcGFjZWQgfHwgcGF0aCA9PT0gJ3Jvb3QnID8gbW9kdWxlLmNvbnRleHQuZ2V0dGVycyA6IGdldHRlcnNbcGF0aF07XG4gICAgY29uc3QgZ2V0dGVyc0tleXMgPSBPYmplY3Qua2V5cyhnZXR0ZXJzKTtcbiAgICBjb25zdCBzdG9yZVN0YXRlID0ge1xuICAgICAgICBzdGF0ZTogT2JqZWN0LmtleXMobW9kdWxlLnN0YXRlKS5tYXAoKGtleSkgPT4gKHtcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIGVkaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG1vZHVsZS5zdGF0ZVtrZXldLFxuICAgICAgICB9KSksXG4gICAgfTtcbiAgICBpZiAoZ2V0dGVyc0tleXMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHRyZWUgPSB0cmFuc2Zvcm1QYXRoc1RvT2JqZWN0VHJlZShnZXR0ZXJzKTtcbiAgICAgICAgc3RvcmVTdGF0ZS5nZXR0ZXJzID0gT2JqZWN0LmtleXModHJlZSkubWFwKChrZXkpID0+ICh7XG4gICAgICAgICAgICBrZXk6IGtleS5lbmRzV2l0aCgnLycpID8gZXh0cmFjdE5hbWVGcm9tUGF0aChrZXkpIDoga2V5LFxuICAgICAgICAgICAgZWRpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgdmFsdWU6IGNhblRocm93KCgpID0+IHRyZWVba2V5XSksXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0b3JlU3RhdGU7XG59XG5mdW5jdGlvbiB0cmFuc2Zvcm1QYXRoc1RvT2JqZWN0VHJlZShnZXR0ZXJzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgT2JqZWN0LmtleXMoZ2V0dGVycykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBjb25zdCBwYXRoID0ga2V5LnNwbGl0KCcvJyk7XG4gICAgICAgIGlmIChwYXRoLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSByZXN1bHQ7XG4gICAgICAgICAgICBjb25zdCBsZWFmS2V5ID0gcGF0aC5wb3AoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcCBvZiBwYXRoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0YXJnZXRbcF0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W3BdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgX2N1c3RvbToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXA6ICdNb2R1bGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFic3RyYWN0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0W3BdLl9jdXN0b20udmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0YXJnZXRbbGVhZktleV0gPSBjYW5UaHJvdygoKSA9PiBnZXR0ZXJzW2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBjYW5UaHJvdygoKSA9PiBnZXR0ZXJzW2tleV0pO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGdldFN0b3JlTW9kdWxlKG1vZHVsZU1hcCwgcGF0aCkge1xuICAgIGNvbnN0IG5hbWVzID0gcGF0aC5zcGxpdCgnLycpLmZpbHRlcigobikgPT4gbik7XG4gICAgcmV0dXJuIG5hbWVzLnJlZHVjZSgobW9kdWxlLCBtb2R1bGVOYW1lLCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gbW9kdWxlW21vZHVsZU5hbWVdO1xuICAgICAgICBpZiAoIWNoaWxkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgbW9kdWxlIFwiJHttb2R1bGVOYW1lfVwiIGZvciBwYXRoIFwiJHtwYXRofVwiLmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpID09PSBuYW1lcy5sZW5ndGggLSAxID8gY2hpbGQgOiBjaGlsZC5fY2hpbGRyZW47XG4gICAgfSwgcGF0aCA9PT0gJ3Jvb3QnID8gbW9kdWxlTWFwIDogbW9kdWxlTWFwLnJvb3QuX2NoaWxkcmVuKTtcbn1cbmZ1bmN0aW9uIGNhblRocm93KGNiKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGNiKCk7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBlO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBsdWdpbi5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///7725\n");
|
|
319
319
|
|
|
320
320
|
/***/ }),
|
|
321
321
|
|