module.exports = /******/ (() => { // webpackBootstrap /******/ var __webpack_modules__ = ({ /***/ 79668: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; // ESM COMPAT FLAG __webpack_require__.r(__webpack_exports__); // NAMESPACE OBJECT: E:\Users\lecoq\Documents\GitHub\gitstats\src\setup.mjs var E_Users_lecoq_Documents_GitHub_gitstats_src_setup_namespaceObject = {}; __webpack_require__.r(E_Users_lecoq_Documents_GitHub_gitstats_src_setup_namespaceObject); __webpack_require__.d(E_Users_lecoq_Documents_GitHub_gitstats_src_setup_namespaceObject, { "default": () => E_Users_lecoq_Documents_GitHub_gitstats_src_setup }); // NAMESPACE OBJECT: E:\Users\lecoq\Documents\GitHub\gitstats\src\metrics.mjs var E_Users_lecoq_Documents_GitHub_gitstats_src_metrics_namespaceObject = {}; __webpack_require__.r(E_Users_lecoq_Documents_GitHub_gitstats_src_metrics_namespaceObject); __webpack_require__.d(E_Users_lecoq_Documents_GitHub_gitstats_src_metrics_namespaceObject, { "default": () => metrics }); // EXTERNAL MODULE: external "fs" var external_fs_ = __webpack_require__(35747); var external_fs_default = /*#__PURE__*/__webpack_require__.n(external_fs_); // EXTERNAL MODULE: external "path" var external_path_ = __webpack_require__(85622); var external_path_default = /*#__PURE__*/__webpack_require__.n(external_path_); // CONCATENATED MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\src\setup.mjs //Imports /** Setup */ /* harmony default export */ async function E_Users_lecoq_Documents_GitHub_gitstats_src_setup({log = true} = {}) { //Init const logger = log ? console.debug : () => null logger(`metrics/setup > setup`) const templates = "src/templates" const conf = { templates:{}, settings:{}, statics:__webpack_require__.ab + "html", node_modules:external_path_default().resolve("node_modules"), } //Load settings logger(`metrics/setup > load settings.json`) if (external_fs_default().existsSync(__webpack_require__.ab + "settings.json")) { conf.settings = JSON.parse(`${await external_fs_default().promises.readFile(external_path_default().resolve("settings.json"))}`) logger(`metrics/setup > load settings.json > success`) } else logger(`metrics/setup > load settings.json > (missing)`) if (!conf.settings.templates) conf.settings.templates = {default:"classic", enabled:[]} if (!conf.settings.plugins) conf.settings.plugins = {} conf.settings.plugins.base = {parts:["header", "activity", "community", "repositories", "metadata"]} if (conf.settings.debug) logger(conf.settings) //Load package settings logger(`metrics/setup > load package.json`) if (external_fs_default().existsSync(__webpack_require__.ab + "package.json")) { conf.package = JSON.parse(`${await external_fs_default().promises.readFile(external_path_default().resolve("package.json"))}`) logger(`metrics/setup > load package.json > success`) } else { logger(`metrics/setup > load package.json > (missing)`) conf.package = {version:"2.3.0", author:"lowlighter"} } //Load templates if (external_fs_default().existsSync(__webpack_require__.ab + "templates")) { for (const name of await external_fs_default().promises.readdir(templates)) { //Cache templates if (/.*[.]mjs$/.test(name)) continue logger(`metrics/setup > load template [${name}]`) const files = [ `${templates}/${name}/query.graphql`, `${templates}/${name}/image.svg`, `${templates}/${name}/style.css`, `${templates}/${name}/fonts.css`, ] const [query, image, style, fonts] = await Promise.all(files.map(async file => `${await external_fs_default().promises.readFile(external_path_default().resolve(file))}`)) conf.templates[name] = {query, image, style, fonts} logger(`metrics/setup > load template [${name}] > success`) //Debug if (conf.settings.debug) { Object.defineProperty(conf.templates, name, { get() { logger(`metrics/setup > reload template [${name}]`) const [query, image, style, fonts] = files.map(file => `${external_fs_default().readFileSync(external_path_default().resolve(file))}`) logger(`metrics/setup > reload template [${name}] > success`) return {query, image, style, fonts} } }) } } } else { logger(`metrics/setup > load templates from build`) conf.templates = JSON.parse(Buffer.from(`eyJjbGFzc2ljIjp7InF1ZXJ5IjoicXVlcnkgTWV0cmljcyB7XHJcbiAgdXNlcihsb2dpbjogJGxvZ2luKSB7XHJcbiAgICBkYXRhYmFzZUlkXHJcbiAgICBuYW1lXHJcbiAgICBsb2dpblxyXG4gICAgY3JlYXRlZEF0XHJcbiAgICBhdmF0YXJVcmxcclxuICAgIHdlYnNpdGVVcmxcclxuICAgIGdpc3RzIHtcclxuICAgICAgdG90YWxDb3VudFxyXG4gICAgfVxyXG4gICAgcmVwb3NpdG9yaWVzKGxhc3Q6ICRyZXBvc2l0b3JpZXMsIGlzRm9yazogZmFsc2UsIG93bmVyQWZmaWxpYXRpb25zOiBPV05FUikge1xyXG4gICAgICB0b3RhbENvdW50XHJcbiAgICAgIHRvdGFsRGlza1VzYWdlXHJcbiAgICAgIG5vZGVzIHtcclxuICAgICAgICBuYW1lXHJcbiAgICAgICAgd2F0Y2hlcnMge1xyXG4gICAgICAgICAgdG90YWxDb3VudFxyXG4gICAgICAgIH1cclxuICAgICAgICBzdGFyZ2F6ZXJzIHtcclxuICAgICAgICAgIHRvdGFsQ291bnRcclxuICAgICAgICB9XHJcbiAgICAgICAgbGFuZ3VhZ2VzKGZpcnN0OiA0KSB7XHJcbiAgICAgICAgICBlZGdlcyB7XHJcbiAgICAgICAgICAgIHNpemVcclxuICAgICAgICAgICAgbm9kZSB7XHJcbiAgICAgICAgICAgICAgY29sb3JcclxuICAgICAgICAgICAgICBuYW1lXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaXNzdWVzX29wZW46IGlzc3VlcyhzdGF0ZXM6IE9QRU4pIHtcclxuICAgICAgICAgIHRvdGFsQ291bnRcclxuICAgICAgICB9XHJcbiAgICAgICAgaXNzdWVzX2Nsb3NlZDogaXNzdWVzKHN0YXRlczogQ0xPU0VEKSB7XHJcbiAgICAgICAgICB0b3RhbENvdW50XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHByX29wZW46IHB1bGxSZXF1ZXN0cyhzdGF0ZXM6IE9QRU4pIHtcclxuICAgICAgICAgIHRvdGFsQ291bnRcclxuICAgICAgICB9XHJcbiAgICAgICAgcHJfbWVyZ2VkOiBwdWxsUmVxdWVzdHMoc3RhdGVzOiBNRVJHRUQpIHtcclxuICAgICAgICAgIHRvdGFsQ291bnRcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9ya0NvdW50XHJcbiAgICAgICAgbGljZW5zZUluZm8ge1xyXG4gICAgICAgICAgc3BkeElkXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBwYWNrYWdlcyB7XHJcbiAgICAgIHRvdGFsQ291bnRcclxuICAgIH1cclxuICAgIHN0YXJyZWRSZXBvc2l0b3JpZXMge1xyXG4gICAgICB0b3RhbENvdW50XHJcbiAgICB9XHJcbiAgICB3YXRjaGluZyB7XHJcbiAgICAgIHRvdGFsQ291bnRcclxuICAgIH1cclxuICAgIHNwb25zb3JzaGlwc0FzU3BvbnNvciB7XHJcbiAgICAgIHRvdGFsQ291bnRcclxuICAgIH1cclxuICAgIHNwb25zb3JzaGlwc0FzTWFpbnRhaW5lciB7XHJcbiAgICAgIHRvdGFsQ291bnRcclxuICAgIH1cclxuICAgIGNvbnRyaWJ1dGlvbnNDb2xsZWN0aW9uIHtcclxuICAgICAgdG90YWxSZXBvc2l0b3JpZXNXaXRoQ29udHJpYnV0ZWRDb21taXRzXHJcbiAgICAgIHRvdGFsQ29tbWl0Q29udHJpYnV0aW9uc1xyXG4gICAgICByZXN0cmljdGVkQ29udHJpYnV0aW9uc0NvdW50XHJcbiAgICAgIHRvdGFsSXNzdWVDb250cmlidXRpb25zXHJcbiAgICAgIHRvdGFsUHVsbFJlcXVlc3RDb250cmlidXRpb25zXHJcbiAgICAgIHRvdGFsUHVsbFJlcXVlc3RSZXZpZXdDb250cmlidXRpb25zXHJcbiAgICB9XHJcbiAgICBjYWxlbmRhcjpjb250cmlidXRpb25zQ29sbGVjdGlvbihmcm9tOiAkY2FsZW5kYXIuZnJvbSwgdG86ICRjYWxlbmRhci50bykge1xyXG4gICAgICBjb250cmlidXRpb25DYWxlbmRhciB7XHJcbiAgICAgICAgd2Vla3Mge1xyXG4gICAgICAgICAgY29udHJpYnV0aW9uRGF5cyB7XHJcbiAgICAgICAgICAgIGNvbG9yXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXBvc2l0b3JpZXNDb250cmlidXRlZFRvIHtcclxuICAgICAgdG90YWxDb3VudFxyXG4gICAgfVxyXG4gICAgZm9sbG93ZXJzIHtcclxuICAgICAgdG90YWxDb3VudFxyXG4gICAgfVxyXG4gICAgZm9sbG93aW5nIHtcclxuICAgICAgdG90YWxDb3VudFxyXG4gICAgfVxyXG4gICAgaXNzdWVDb21tZW50cyB7XHJcbiAgICAgIHRvdGFsQ291bnRcclxuICAgIH1cclxuICAgIG9yZ2FuaXphdGlvbnMge1xyXG4gICAgICB0b3RhbENvdW50XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsImltYWdlIjoiPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCI0ODBcIiBoZWlnaHQ9XCI8JT0gMTJcclxuICArICghIWJhc2UuaGVhZGVyKSo4MFxyXG4gICsgKCEhYmFzZS5tZXRhZGF0YSkqMzhcclxuICArICgoISFiYXNlLmFjdGl2aXR5KXx8KCEhYmFzZS5jb21tdW5pdHkpKSoxMjhcclxuICArICghIWJhc2UucmVwb3NpdG9yaWVzKSo5MlxyXG4gICsgKCghIWJhc2UucmVwb3NpdG9yaWVzKSooKCEhY29tcHV0ZWQucGx1Z2lucy50cmFmZmljKXx8KCEhY29tcHV0ZWQucGx1Z2lucy5saW5lcykpKSoxNlxyXG4gICsgKCEhY29tcHV0ZWQucGx1Z2lucy5mb2xsb3d1cCkqNjhcclxuICArICghIWNvbXB1dGVkLnBsdWdpbnMucGFnZXNwZWVkKSoxMjZcclxuICArICghIWNvbXB1dGVkLnBsdWdpbnMuaGFiaXRzKSo2OFxyXG4gICsgKCEhY29tcHV0ZWQucGx1Z2lucy5sYW5ndWFnZXMpKjk2XHJcbiAgKyAoISFjb21wdXRlZC5wbHVnaW5zLm11c2ljKSo2NCArIChjb21wdXRlZC5wbHVnaW5zLm11c2ljID8gY29tcHV0ZWQucGx1Z2lucy5tdXNpYy50cmFja3MgPyAxNCtNYXRoLm1heCgwLCBjb21wdXRlZC5wbHVnaW5zLm11c2ljLnRyYWNrcy5sZW5ndGgtMSkqMzYgOiAwIDogMClcclxuICArICghIWNvbXB1dGVkLnBsdWdpbnMucG9zdHMpKjY0ICsgKGNvbXB1dGVkLnBsdWdpbnMucG9zdHMgPyBjb21wdXRlZC5wbHVnaW5zLnBvc3RzLnBvc3RzID8gTWF0aC5tYXgoMCwgY29tcHV0ZWQucGx1Z2lucy5wb3N0cy5wb3N0cy5sZW5ndGgtMSkqNDAgOiAwIDogMClcclxuICArIE1hdGgubWF4KDAsICgoKCEhYmFzZS5tZXRhZGF0YSkrKCEhYmFzZS5oZWFkZXIpKygoISFiYXNlLmFjdGl2aXR5KXx8KCEhYmFzZS5jb21tdW5pdHkpKSsoISFiYXNlLnJlcG9zaXRvcmllcykrKCghIWNvbXB1dGVkLnBsdWdpbnMuaGFiaXRzKSkrKCEhY29tcHV0ZWQucGx1Z2lucy5wYWdlc3BlZWQpKyghIWNvbXB1dGVkLnBsdWdpbnMubGFuZ3VhZ2VzKSsoISFjb21wdXRlZC5wbHVnaW5zLm11c2ljKSsoISFjb21wdXRlZC5wbHVnaW5zLnBvc3RzKSktMSkpKjRcclxuJT5cIj5cclxuXHJcbiAgPGRlZnM+PHN0eWxlPjwlPSBmb250cyAlPjwvc3R5bGU+PC9kZWZzPlxyXG5cclxuICA8c3R5bGU+XHJcbiAgICA8JT0gc3R5bGUgJT5cclxuICA8L3N0eWxlPlxyXG5cclxuICA8Zm9yZWlnbk9iamVjdCB4PVwiMFwiIHk9XCIwXCIgd2lkdGg9XCIxMDAlXCIgaGVpZ2h0PVwiMTAwJVwiPlxyXG4gICAgPGRpdiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIj5cclxuXHJcbiAgICAgIDwlIGlmIChiYXNlLmhlYWRlcikgeyAlPlxyXG4gICAgICAgIDxzZWN0aW9uPlxyXG4gICAgICAgICAgPGgxIGNsYXNzPVwiZmllbGRcIj5cclxuICAgICAgICAgICAgPGltZyBjbGFzcz1cImF2YXRhclwiIHNyYz1cImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCw8JT0gY29tcHV0ZWQuYXZhdGFyICU+XCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgLz5cclxuICAgICAgICAgICAgPHNwYW4+PCU9IHVzZXIubmFtZSB8fCB1c2VyLmxvZ2luICU+PC9zcGFuPlxyXG4gICAgICAgICAgPC9oMT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgPHNlY3Rpb24+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCI+PHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNMS41IDhhNi41IDYuNSAwIDExMTMgMCA2LjUgNi41IDAgMDEtMTMgMHpNOCAwYTggOCAwIDEwMCAxNkE4IDggMCAwMDggMHptLjUgNC43NWEuNzUuNzUgMCAwMC0xLjUgMHYzLjVhLjc1Ljc1IDAgMDAuNDcxLjY5NmwyLjUgMWEuNzUuNzUgMCAwMC41NTctMS4zOTJMOC41IDcuNzQyVjQuNzV6XCI+PC9wYXRoPjwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgSm9pbmVkIEdpdEh1YiA8JT0gY29tcHV0ZWQucmVnaXN0cmF0aW9uICU+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCI+PHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNNS41IDMuNWEyIDIgMCAxMDAgNCAyIDIgMCAwMDAtNHpNMiA1LjVhMy41IDMuNSAwIDExNS44OTggMi41NDkgNS41MDcgNS41MDcgMCAwMTMuMDM0IDQuMDg0Ljc1Ljc1IDAgMTEtMS40ODIuMjM1IDQuMDAxIDQuMDAxIDAgMDAtNy45IDAgLjc1Ljc1IDAgMDEtMS40ODItLjIzNkE1LjUwNyA1LjUwNyAwIDAxMy4xMDIgOC4wNSAzLjQ5IDMuNDkgMCAwMTIgNS41ek0xMSA0YS43NS43NSAwIDEwMCAxLjUgMS41IDEuNSAwIDAxLjY2NiAyLjg0NC43NS43NSAwIDAwLS40MTYuNjcydi4zNTJhLjc1Ljc1IDAgMDAuNTc0LjczYzEuMi4yODkgMi4xNjIgMS4yIDIuNTIyIDIuMzcyYS43NS43NSAwIDEwMS40MzQtLjQ0IDUuMDEgNS4wMSAwIDAwLTIuNTYtMy4wMTJBMyAzIDAgMDAxMSA0elwiPjwvcGF0aD48L3N2Zz5cclxuICAgICAgICAgICAgICAgIEZvbGxvd2VkIGJ5IDwlPSB1c2VyLmZvbGxvd2Vycy50b3RhbENvdW50ICU+IHVzZXI8JT0gcyh1c2VyLmZvbGxvd2Vycy50b3RhbENvdW50KSAlPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L3NlY3Rpb24+XHJcbiAgICAgICAgICAgIDxzZWN0aW9uPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjYWxlbmRhclwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCA8JT0gY29tcHV0ZWQuY2FsZW5kYXIubGVuZ3RoKjE1ICU+IDExXCIgd2lkdGg9XCI8JT0gY29tcHV0ZWQuY2FsZW5kYXIubGVuZ3RoKjE1ICU+XCIgaGVpZ2h0PVwiMTZcIj5cclxuICAgICAgICAgICAgICAgICAgPGc+XHJcbiAgICAgICAgICAgICAgICAgICAgPCUgZm9yIChjb25zdCBbeCwge2NvbG9yfV0gb2YgT2JqZWN0LmVudHJpZXMoY29tcHV0ZWQuY2FsZW5kYXIpKSB7ICU+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8cmVjdCBjbGFzcz1cImRheVwiIHg9XCI8JT0geCoxNSAlPlwiIHk9XCIwXCIgd2lkdGg9XCIxMVwiIGhlaWdodD1cIjExXCIgZmlsbD1cIjwlPSBjb2xvciAlPlwiIHJ4PVwiMlwiIHJ5PVwiMlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPCUgfSAlPlxyXG4gICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGRcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIj48cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgZD1cIk0xIDIuNUEyLjUgMi41IDAgMDEzLjUgMGg4Ljc1YS43NS43NSAwIDAxLjc1Ljc1djMuNWEuNzUuNzUgMCAwMS0xLjUgMFYxLjVoLThhMSAxIDAgMDAtMSAxdjYuNzA4QTIuNDkyIDIuNDkyIDAgMDEzLjUgOWgzLjI1YS43NS43NSAwIDAxMCAxLjVIMy41YTEgMSAwIDEwMCAyaDUuNzVhLjc1Ljc1IDAgMDEwIDEuNUgzLjVBMi41IDIuNSAwIDAxMSAxMS41di05em0xMy4yMyA3Ljc5YS43NS43NSAwIDAwMS4wNi0xLjA2bC0yLjUwNS0yLjUwNWEuNzUuNzUgMCAwMC0xLjA2IDBMOS4yMiA5LjIyOWEuNzUuNzUgMCAwMDEuMDYgMS4wNjFsMS4yMjUtMS4yMjR2Ni4xODRhLjc1Ljc1IDAgMDAxLjUgMFY5LjA2NmwxLjIyNCAxLjIyNHpcIj48L3BhdGg+PC9zdmc+XHJcbiAgICAgICAgICAgICAgICBDb250cmlidXRlZCB0byA8JT0gdXNlci5yZXBvc2l0b3JpZXNDb250cmlidXRlZFRvLnRvdGFsQ291bnQgJT4gcmVwb3NpdG9yPCU9IHModXNlci5yZXBvc2l0b3JpZXNDb250cmlidXRlZFRvLnRvdGFsQ291bnQsIFwieVwiKSAlPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L3NlY3Rpb24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L3NlY3Rpb24+XHJcbiAgICAgIDwlIH0gJT5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICA8JSBpZiAoYmFzZS5hY3Rpdml0eSkgeyAlPlxyXG4gICAgICAgICAgPHNlY3Rpb24+XHJcbiAgICAgICAgICAgIDxoMiBjbGFzcz1cImZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTEuNSAxLjc1YS43NS43NSAwIDAwLTEuNSAwdjEyLjVjMCAuNDE0LjMzNi43NS43NS43NWgxNC41YS43NS43NSAwIDAwMC0xLjVIMS41VjEuNzV6bTE0LjI4IDIuNTNhLjc1Ljc1IDAgMDAtMS4wNi0xLjA2TDEwIDcuOTQgNy41MyA1LjQ3YS43NS43NSAwIDAwLTEuMDYgMEwzLjIyIDguNzJhLjc1Ljc1IDAgMDAxLjA2IDEuMDZMNyA3LjA2bDIuNDcgMi40N2EuNzUuNzUgMCAwMDEuMDYgMGw1LjI1LTUuMjV6XCI+PC9wYXRoPjwvc3ZnPlxyXG4gICAgICAgICAgICAgIEFjdGl2aXR5XHJcbiAgICAgICAgICAgIDwvaDI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZFwiPlxyXG4gICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIj48cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgZD1cIk0xMC41IDcuNzVhMi41IDIuNSAwIDExLTUgMCAyLjUgMi41IDAgMDE1IDB6bTEuNDMuNzVhNC4wMDIgNC4wMDIgMCAwMS03Ljg2IDBILjc1YS43NS43NSAwIDExMC0xLjVoMy4zMmE0LjAwMSA0LjAwMSAwIDAxNy44NiAwaDMuMzJhLjc1Ljc1IDAgMTEwIDEuNWgtMy4zMnpcIj48L3BhdGg+PC9zdmc+XHJcbiAgICAgICAgICAgICAgPCU9IGNvbXB1dGVkLmNvbW1pdHMgJT4gQ29tbWl0PCU9IHMoY29tcHV0ZWQuY29tbWl0cykgJT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZFwiPlxyXG4gICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIj48cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgZD1cIk0yLjUgMS43NWEuMjUuMjUgMCAwMS4yNS0uMjVoOC41YS4yNS4yNSAwIDAxLjI1LjI1djcuNzM2YS43NS43NSAwIDEwMS41IDBWMS43NUExLjc1IDEuNzUgMCAwMDExLjI1IDBoLTguNUExLjc1IDEuNzUgMCAwMDEgMS43NXYxMS41YzAgLjk2Ni43ODQgMS43NSAxLjc1IDEuNzVoMy4xN2EuNzUuNzUgMCAwMDAtMS41SDIuNzVhLjI1LjI1IDAgMDEtLjI1LS4yNVYxLjc1ek00Ljc1IDRhLjc1Ljc1IDAgMDAwIDEuNWg0LjVhLjc1Ljc1IDAgMDAwLTEuNWgtNC41ek00IDcuNzVBLjc1Ljc1IDAgMDE0Ljc1IDdoMmEuNzUuNzUgMCAwMTAgMS41aC0yQS43NS43NSAwIDAxNCA3Ljc1em0xMS43NzQgMy41MzdhLjc1Ljc1IDAgMDAtMS4wNDgtMS4wNzRMMTAuNyAxNC4xNDUgOS4yODEgMTIuNzJhLjc1Ljc1IDAgMDAtMS4wNjIgMS4wNThsMS45NDMgMS45NWEuNzUuNzUgMCAwMDEuMDU1LjAwOGw0LjU1Ny00LjQ1elwiPjwvcGF0aD48L3N2Zz5cclxuICAgICAgICAgICAgICA8JT0gdXNlci5jb250cmlidXRpb25zQ29sbGVjdGlvbi50b3RhbFB1bGxSZXF1ZXN0UmV2aWV3Q29udHJpYnV0aW9ucyAlPiBQdWxsIHJlcXVlc3Q8JT0gcyh1c2VyLmNvbnRyaWJ1dGlvbnNDb2xsZWN0aW9uLnRvdGFsUHVsbFJlcXVlc3RSZXZpZXdDb250cmlidXRpb25zKSAlPiByZXZpZXdlZFxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTcuMTc3IDMuMDczTDkuNTczLjY3N0EuMjUuMjUgMCAwMTEwIC44NTR2NC43OTJhLjI1LjI1IDAgMDEtLjQyNy4xNzdMNy4xNzcgMy40MjdhLjI1LjI1IDAgMDEwLS4zNTR6TTMuNzUgMi41YS43NS43NSAwIDEwMCAxLjUuNzUuNzUgMCAwMDAtMS41em0tMi4yNS43NWEyLjI1IDIuMjUgMCAxMTMgMi4xMjJ2NS4yNTZhMi4yNTEgMi4yNTEgMCAxMS0xLjUgMFY1LjM3MkEyLjI1IDIuMjUgMCAwMTEuNSAzLjI1ek0xMSAyLjVoLTFWNGgxYTEgMSAwIDAxMSAxdjUuNjI4YTIuMjUxIDIuMjUxIDAgMTAxLjUgMFY1QTIuNSAyLjUgMCAwMDExIDIuNXptMSAxMC4yNWEuNzUuNzUgMCAxMTEuNSAwIC43NS43NSAwIDAxLTEuNSAwek0zLjc1IDEyYS43NS43NSAwIDEwMCAxLjUuNzUuNzUgMCAwMDAtMS41elwiPjwvcGF0aD48L3N2Zz5cclxuICAgICAgICAgICAgICA8JT0gdXNlci5jb250cmlidXRpb25zQ29sbGVjdGlvbi50b3RhbFB1bGxSZXF1ZXN0Q29udHJpYnV0aW9ucyAlPiBQdWxsIHJlcXVlc3Q8JT0gcyh1c2VyLmNvbnRyaWJ1dGlvbnNDb2xsZWN0aW9uLnRvdGFsUHVsbFJlcXVlc3RDb250cmlidXRpb25zKSAlPiBvcGVuZWRcclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZFwiPlxyXG4gICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIj48cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgZD1cIk04IDEuNWE2LjUgNi41IDAgMTAwIDEzIDYuNSA2LjUgMCAwMDAtMTN6TTAgOGE4IDggMCAxMTE2IDBBOCA4IDAgMDEwIDh6bTkgM2ExIDEgMCAxMS0yIDAgMSAxIDAgMDEyIDB6bS0uMjUtNi4yNWEuNzUuNzUgMCAwMC0xLjUgMHYzLjVhLjc1Ljc1IDAgMDAxLjUgMHYtMy41elwiPjwvcGF0aD48L3N2Zz5cclxuICAgICAgICAgICAgICA8JT0gdXNlci5jb250cmlidXRpb25zQ29sbGVjdGlvbi50b3RhbElzc3VlQ29udHJpYnV0aW9ucyAlPiBJc3N1ZTwlPSBzKHVzZXIuY29udHJpYnV0aW9uc0NvbGxlY3Rpb24udG90YWxJc3N1ZUNvbnRyaWJ1dGlvbnMpICU+IG9wZW5lZFxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTIuNzUgMi41YS4yNS4yNSAwIDAwLS4yNS4yNXY3LjVjMCAuMTM4LjExMi4yNS4yNS4yNWgyYS43NS43NSAwIDAxLjc1Ljc1djIuMTlsMi43Mi0yLjcyYS43NS43NSAwIDAxLjUzLS4yMmg0LjVhLjI1LjI1IDAgMDAuMjUtLjI1di03LjVhLjI1LjI1IDAgMDAtLjI1LS4yNUgyLjc1ek0xIDIuNzVDMSAxLjc4NCAxLjc4NCAxIDIuNzUgMWgxMC41Yy45NjYgMCAxLjc1Ljc4NCAxLjc1IDEuNzV2Ny41QTEuNzUgMS43NSAwIDAxMTMuMjUgMTJIOS4wNmwtMi41NzMgMi41NzNBMS40NTcgMS40NTcgMCAwMTQgMTMuNTQzVjEySDIuNzVBMS43NSAxLjc1IDAgMDExIDEwLjI1di03LjV6XCI+PC9wYXRoPjwvc3ZnPlxyXG4gICAgICAgICAgICAgIDwlPSB1c2VyLmlzc3VlQ29tbWVudHMudG90YWxDb3VudCAlPiBpc3N1ZSBjb21tZW50PCU9IHModXNlci5pc3N1ZUNvbW1lbnRzLnRvdGFsQ291bnQpICU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9zZWN0aW9uPlxyXG4gICAgICAgIDwlIH0gJT5cclxuICAgICAgICA8JSBpZiAoYmFzZS5jb21tdW5pdHkpIHsgJT5cclxuICAgICAgICAgIDxzZWN0aW9uPlxyXG4gICAgICAgICAgICA8aDIgY2xhc3M9XCJmaWVsZFwiPlxyXG4gICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIj48cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgZD1cIk0xLjc1IDBBMS43NSAxLjc1IDAgMDAwIDEuNzV2MTIuNUMwIDE1LjIxNi43ODQgMTYgMS43NSAxNmgxMi41QTEuNzUgMS43NSAwIDAwMTYgMTQuMjVWMS43NUExLjc1IDEuNzUgMCAwMDE0LjI1IDBIMS43NXpNMS41IDEuNzVhLjI1LjI1IDAgMDEuMjUtLjI1aDEyLjVhLjI1LjI1IDAgMDEuMjUuMjV2MTIuNWEuMjUuMjUgMCAwMS0uMjUuMjVIMS43NWEuMjUuMjUgMCAwMS0uMjUtLjI1VjEuNzV6TTExLjc1IDNhLjc1Ljc1IDAgMDAtLjc1Ljc1djcuNWEuNzUuNzUgMCAwMDEuNSAwdi03LjVhLjc1Ljc1IDAgMDAtLjc1LS43NXptLTguMjUuNzVhLjc1Ljc1IDAgMDExLjUgMHY1LjVhLjc1Ljc1IDAgMDEtMS41IDB2LTUuNXpNOCAzYS43NS43NSAwIDAwLS43NS43NXYzLjVhLjc1Ljc1IDAgMDAxLjUgMHYtMy41QS43NS43NSAwIDAwOCAzelwiPjwvcGF0aD48L3N2Zz5cclxuICAgICAgICAgICAgICBDb21tdW5pdHkgc3RhdHNcclxuICAgICAgICAgICAgPC9oMj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTUuNSAzLjVhMiAyIDAgMTAwIDQgMiAyIDAgMDAwLTR6TTIgNS41YTMuNSAzLjUgMCAxMTUuODk4IDIuNTQ5IDUuNTA3IDUuNTA3IDAgMDEzLjAzNCA0LjA4NC43NS43NSAwIDExLTEuNDgyLjIzNSA0LjAwMSA0LjAwMSAwIDAwLTcuOSAwIC43NS43NSAwIDAxLTEuNDgyLS4yMzZBNS41MDcgNS41MDcgMCAwMTMuMTAyIDguMDUgMy40OSAzLjQ5IDAgMDEyIDUuNXpNMTEgNGEuNzUuNzUgMCAxMDAgMS41IDEuNSAxLjUgMCAwMS42NjYgMi44NDQuNzUuNzUgMCAwMC0uNDE2LjY3MnYuMzUyYS43NS43NSAwIDAwLjU3NC43M2MxLjIuMjg5IDIuMTYyIDEuMiAyLjUyMiAyLjM3MmEuNzUuNzUgMCAxMDEuNDM0LS40NCA1LjAxIDUuMDEgMCAwMC0yLjU2LTMuMDEyQTMgMyAwIDAwMTEgNHpcIj48L3BhdGg+PC9zdmc+XHJcbiAgICAgICAgICAgICAgRm9sbG93aW5nIDwlPSB1c2VyLmZvbGxvd2luZy50b3RhbENvdW50ICU+IHVzZXI8JT0gcyh1c2VyLmZvbGxvd2Vycy50b3RhbENvdW50KSAlPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTQuMjUgMi41Yy0xLjMzNiAwLTIuNzUgMS4xNjQtMi43NSAzIDAgMi4xNSAxLjU4IDQuMTQ0IDMuMzY1IDUuNjgyQTIwLjU2NSAyMC41NjUgMCAwMDggMTMuMzkzYTIwLjU2MSAyMC41NjEgMCAwMDMuMTM1LTIuMjExQzEyLjkyIDkuNjQ0IDE0LjUgNy42NSAxNC41IDUuNWMwLTEuODM2LTEuNDE0LTMtMi43NS0zLTEuMzczIDAtMi42MDkuOTg2LTMuMDI5IDIuNDU2YS43NS43NSAwIDAxLTEuNDQyIDBDNi44NTkgMy40ODYgNS42MjMgMi41IDQuMjUgMi41ek04IDE0LjI1bC0uMzQ1LjY2Ni0uMDAyLS4wMDEtLjAwNi0uMDAzLS4wMTgtLjAxYTcuNjQzIDcuNjQzIDAgMDEtLjMxLS4xNyAyMi4wNzUgMjIuMDc1IDAgMDEtMy40MzQtMi40MTRDMi4wNDUgMTAuNzMxIDAgOC4zNSAwIDUuNSAwIDIuODM2IDIuMDg2IDEgNC4yNSAxIDUuNzk3IDEgNy4xNTMgMS44MDIgOCAzLjAyIDguODQ3IDEuODAyIDEwLjIwMyAxIDExLjc1IDEgMTMuOTE0IDEgMTYgMi44MzYgMTYgNS41YzAgMi44NS0yLjA0NSA1LjIzMS0zLjg4NSA2LjgxOGEyMi4wOCAyMi4wOCAwIDAxLTMuNzQ0IDIuNTg0bC0uMDE4LjAxLS4wMDYuMDAzaC0uMDAyTDggMTQuMjV6bTAgMGwuMzQ1LjY2NmEuNzUyLjc1MiAwIDAxLS42OSAwTDggMTQuMjV6XCI+PC9wYXRoPjwvc3ZnPlxyXG4gICAgICAgICAgICAgIFNwb25zb3JpbmcgPCU9IGNvbXB1dGVkLnNwb25zb3JzaGlwcyAlPiByZXBvc2l0b3I8JT0gcyhjb21wdXRlZC5zcG9uc29yc2hpcHMsIFwieVwiKSAlPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTggLjI1YS43NS43NSAwIDAxLjY3My40MThsMS44ODIgMy44MTUgNC4yMS42MTJhLjc1Ljc1IDAgMDEuNDE2IDEuMjc5bC0zLjA0NiAyLjk3LjcxOSA0LjE5MmEuNzUuNzUgMCAwMS0xLjA4OC43OTFMOCAxMi4zNDdsLTMuNzY2IDEuOThhLjc1Ljc1IDAgMDEtMS4wODgtLjc5bC43Mi00LjE5NEwuODE4IDYuMzc0YS43NS43NSAwIDAxLjQxNi0xLjI4bDQuMjEtLjYxMUw3LjMyNy42NjhBLjc1Ljc1IDAgMDE4IC4yNXptMCAyLjQ0NUw2LjYxNSA1LjVhLjc1Ljc1IDAgMDEtLjU2NC40MWwtMy4wOTcuNDUgMi4yNCAyLjE4NGEuNzUuNzUgMCAwMS4yMTYuNjY0bC0uNTI4IDMuMDg0IDIuNzY5LTEuNDU2YS43NS43NSAwIDAxLjY5OCAwbDIuNzcgMS40NTYtLjUzLTMuMDg0YS43NS43NSAwIDAxLjIxNi0uNjY0bDIuMjQtMi4xODMtMy4wOTYtLjQ1YS43NS43NSAwIDAxLS41NjQtLjQxTDggMi42OTR2LjAwMXpcIj48L3BhdGg+PC9zdmc+XHJcbiAgICAgICAgICAgICAgU3RhcnJlZCA8JT0gdXNlci5zdGFycmVkUmVwb3NpdG9yaWVzLnRvdGFsQ291bnQgJT4gcmVwb3NpdG9yPCU9IHModXNlci5zdGFycmVkUmVwb3NpdG9yaWVzLnRvdGFsQ291bnQsIFwieVwiKSAlPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTEuNjc5IDcuOTMyYy40MTItLjYyMSAxLjI0Mi0xLjc1IDIuMzY2LTIuNzE3QzUuMTc1IDQuMjQyIDYuNTI3IDMuNSA4IDMuNWMxLjQ3MyAwIDIuODI0Ljc0MiAzLjk1NSAxLjcxNSAxLjEyNC45NjcgMS45NTQgMi4wOTYgMi4zNjYgMi43MTdhLjExOS4xMTkgMCAwMTAgLjEzNmMtLjQxMi42MjEtMS4yNDIgMS43NS0yLjM2NiAyLjcxN0MxMC44MjUgMTEuNzU4IDkuNDczIDEyLjUgOCAxMi41Yy0xLjQ3MyAwLTIuODI0LS43NDItMy45NTUtMS43MTVDMi45MiA5LjgxOCAyLjA5IDguNjkgMS42NzkgOC4wNjhhLjExOS4xMTkgMCAwMTAtLjEzNnpNOCAyYy0xLjk4MSAwLTMuNjcuOTkyLTQuOTMzIDIuMDc4QzEuNzk3IDUuMTY5Ljg4IDYuNDIzLjQzIDcuMWExLjYxOSAxLjYxOSAwIDAwMCAxLjc5OGMuNDUuNjc4IDEuMzY3IDEuOTMyIDIuNjM3IDMuMDI0QzQuMzI5IDEzLjAwOCA2LjAxOSAxNCA4IDE0YzEuOTgxIDAgMy42Ny0uOTkyIDQuOTMzLTIuMDc4IDEuMjctMS4wOTEgMi4xODctMi4zNDUgMi42MzctMy4wMjNhMS42MTkgMS42MTkgMCAwMDAtMS43OThjLS40NS0uNjc4LTEuMzY3LTEuOTMyLTIuNjM3LTMuMDIzQzExLjY3MSAyLjk5MiA5Ljk4MSAyIDggMnptMCA4YTIgMiAwIDEwMC00IDIgMiAwIDAwMCA0elwiPjwvcGF0aD48L3N2Zz5cclxuICAgICAgICAgICAgICBXYXRjaGluZyA8JT0gdXNlci53YXRjaGluZy50b3RhbENvdW50ICU+IHJlcG9zaXRvcjwlPSBzKHVzZXIud2F0Y2hpbmcudG90YWxDb3VudCwgXCJ5XCIpICU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGRcIj5cclxuICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCI+PHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNMS41IDE0LjI1YzAgLjEzOC4xMTIuMjUuMjUuMjVINHYtMS4yNWEuNzUuNzUgMCAwMS43NS0uNzVoMi41YS43NS43NSAwIDAxLjc1Ljc1djEuMjVoMi4yNWEuMjUuMjUgMCAwMC4yNS0uMjVWMS43NWEuMjUuMjUgMCAwMC0uMjUtLjI1aC04LjVhLjI1LjI1IDAgMDAtLjI1LjI1djEyLjV6TTEuNzUgMTZBMS43NSAxLjc1IDAgMDEwIDE0LjI1VjEuNzVDMCAuNzg0Ljc4NCAwIDEuNzUgMGg4LjVDMTEuMjE2IDAgMTIgLjc4NCAxMiAxLjc1djEyLjVjMCAuMDg1LS4wMDYuMTY4LS4wMTguMjVoMi4yNjhhLjI1LjI1IDAgMDAuMjUtLjI1VjguMjg1YS4yNS4yNSAwIDAwLS4xMTEtLjIwOGwtMS4wNTUtLjcwM2EuNzUuNzUgMCAxMS44MzItMS4yNDhsMS4wNTUuNzAzYy40ODcuMzI1Ljc3OS44NzEuNzc5IDEuNDU2djUuOTY1QTEuNzUgMS43NSAwIDAxMTQuMjUgMTZoLTMuNWEuNzUuNzUgMCAwMS0uMTk3LS4wMjZjLS4wOTkuMDE3LS4yLjAyNi0uMzAzLjAyNmgtM2EuNzUuNzUgMCAwMS0uNzUtLjc1VjE0aC0xdjEuMjVhLjc1Ljc1IDAgMDEtLjc1Ljc1aC0zek0zIDMuNzVBLjc1Ljc1IDAgMDEzLjc1IDNoLjVhLjc1Ljc1IDAgMDEwIDEuNWgtLjVBLjc1Ljc1IDAgMDEzIDMuNzV6TTMuNzUgNmEuNzUuNzUgMCAwMDAgMS41aC41YS43NS43NSAwIDAwMC0xLjVoLS41ek0zIDkuNzVBLjc1Ljc1IDAgMDEzLjc1IDloLjVhLjc1Ljc1IDAgMDEwIDEuNWgtLjVBLjc1Ljc1IDAgMDEzIDkuNzV6TTcuNzUgOWEuNzUuNzUgMCAwMDAgMS41aC41YS43NS43NSAwIDAwMC0xLjVoLS41ek03IDYuNzVBLjc1Ljc1IDAgMDE3Ljc1IDZoLjVhLjc1Ljc1IDAgMDEwIDEuNWgtLjVBLjc1Ljc1IDAgMDE3IDYuNzV6TTcuNzUgM2EuNzUuNzUgMCAwMDAgMS41aC41YS43NS43NSAwIDAwMC0xLjVoLS41elwiPjwvcGF0aD48L3N2Zz5cclxuICAgICAgICAgICAgICBNZW1iZXIgb2YgPCU9IHVzZXIub3JnYW5pemF0aW9ucy50b3RhbENvdW50ICU+IG9yZ2FuaXphdGlvbjwlPSBzKHVzZXIub3JnYW5pemF0aW9ucy50b3RhbENvdW50KSAlPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvc2VjdGlvbj5cclxuICAgICAgICA8JSB9ICU+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPCUgaWYgKGJhc2UucmVwb3NpdG9yaWVzKSB7ICU+XHJcbiAgICAgICAgPHNlY3Rpb24+XHJcbiAgICAgICAgICA8aDIgY2xhc3M9XCJmaWVsZFwiPlxyXG4gICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCI+PHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNMiAyLjVBMi41IDIuNSAwIDAxNC41IDBoOC43NWEuNzUuNzUgMCAwMS43NS43NXYxMi41YS43NS43NSAwIDAxLS43NS43NWgtMi41YS43NS43NSAwIDExMC0xLjVoMS43NXYtMmgtOGExIDEgMCAwMC0uNzE0IDEuNy43NS43NSAwIDAxLTEuMDcyIDEuMDVBMi40OTUgMi40OTUgMCAwMTIgMTEuNXYtOXptMTAuNS0xVjloLThjLS4zNTYgMC0uNjk0LjA3NC0xIC4yMDhWMi41YTEgMSAwIDAxMS0xaDh6TTUgMTIuMjV2My4yNWEuMjUuMjUgMCAwMC40LjJsMS40NS0xLjA4N2EuMjUuMjUgMCAwMS4zIDBMOC42IDE1LjdhLjI1LjI1IDAgMDAuNC0uMnYtMy4yNWEuMjUuMjUgMCAwMC0uMjUtLjI1aC0zLjVhLjI1LjI1IDAgMDAtLjI1LjI1elwiPjwvcGF0aD48L3N2Zz5cclxuICAgICAgICAgICAgPCU9IHVzZXIucmVwb3NpdG9yaWVzLnRvdGFsQ291bnQgJT4gUmVwb3NpdG9yPCU9IHModXNlci5yZXBvc2l0b3JpZXMudG90YWxDb3VudCwgXCJ5XCIpICU+XHJcbiAgICAgICAgICA8L2gyPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICA8c2VjdGlvbj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCI+PHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNOC43NS43NWEuNzUuNzUgMCAwMC0xLjUgMFYyaC0uOTg0Yy0uMzA1IDAtLjYwNC4wOC0uODY5LjIzbC0xLjI4OC43MzdBLjI1LjI1IDAgMDEzLjk4NCAzSDEuNzVhLjc1Ljc1IDAgMDAwIDEuNWguNDI4TC4wNjYgOS4xOTJhLjc1Ljc1IDAgMDAuMTU0LjgzOGwuNTMtLjUzLS41My41M3YuMDAxbC4wMDIuMDAyLjAwMi4wMDIuMDA2LjAwNi4wMTYuMDE1LjA0NS4wNGEzLjUxNCAzLjUxNCAwIDAwLjY4Ni40NUE0LjQ5MiA0LjQ5MiAwIDAwMyAxMWMuODggMCAxLjU1Ni0uMjIgMi4wMjMtLjQ1NGEzLjUxNSAzLjUxNSAwIDAwLjY4Ni0uNDVsLjA0NS0uMDQuMDE2LS4wMTUuMDA2LS4wMDYuMDAyLS4wMDIuMDAxLS4wMDJMNS4yNSA5LjVsLjUzLjUzYS43NS43NSAwIDAwLjE1NC0uODM4TDMuODIyIDQuNWguMTYyYy4zMDUgMCAuNjA0LS4wOC44NjktLjIzbDEuMjg5LS43MzdhLjI1LjI1IDAgMDEuMTI0LS4wMzNoLjk4NFYxM2gtMi41YS43NS43NSAwIDAwMCAxLjVoNi41YS43NS43NSAwIDAwMC0xLjVoLTIuNVYzLjVoLjk4NGEuMjUuMjUgMCAwMS4xMjQuMDMzbDEuMjkuNzM2Yy4yNjQuMTUyLjU2My4yMzEuODY4LjIzMWguMTYybC0yLjExMiA0LjY5MmEuNzUuNzUgMCAwMC4xNTQuODM4bC41My0uNTMtLjUzLjUzdi4wMDFsLjAwMi4wMDIuMDAyLjAwMi4wMDYuMDA2LjAxNi4wMTUuMDQ1LjA0YTMuNTE3IDMuNTE3IDAgMDAuNjg2LjQ1QTQuNDkyIDQuNDkyIDAgMDAxMyAxMWMuODggMCAxLjU1Ni0uMjIgMi4wMjMtLjQ1NGEzLjUxMiAzLjUxMiAwIDAwLjY4Ni0uNDVsLjA0NS0uMDQuMDEtLjAxLjAwNi0uMDA1LjAwNi0uMDA2LjAwMi0uMDAyLjAwMS0uMDAyLS41MjktLjUzMS41My41M2EuNzUuNzUgMCAwMC4xNTQtLjgzOEwxMy44MjMgNC41aC40MjdhLjc1Ljc1IDAgMDAwLTEuNWgtMi4yMzRhLjI1LjI1IDAgMDEtLjEyNC0uMDMzbC0xLjI5LS43MzZBMS43NSAxLjc1IDAgMDA5LjczNSAySDguNzVWLjc1ek0xLjY5NSA5LjIyN2MuMjg1LjEzNS43MTguMjczIDEuMzA1LjI3M3MxLjAyLS4xMzggMS4zMDUtLjI3M0wzIDYuMzI3bC0xLjMwNSAyLjl6bTEwIDBjLjI4NS4xMzUuNzE4LjI3MyAxLjMwNS4yNzNzMS4wMi0uMTM4IDEuMzA1LS4yNzNMMTMgNi4zMjdsLTEuMzA1IDIuOXpcIj48L3BhdGg+PC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8JSBpZiAoY29tcHV0ZWQubGljZW5zZXMuZmF2b3JpdGUubGVuZ3RoKSB7ICU+XHJcbiAgICAgICAgICAgICAgICAgIFByZWZlciA8JT0gY29tcHV0ZWQubGljZW5zZXMuZmF2b3JpdGUgJT4gbGljZW5zZVxyXG4gICAgICAgICAgICAgICAgPCUgfSBlbHNlIHsgJT5cclxuICAgICAgICAgICAgICAgICAgTm8gbGljZW5zZSBwcmVmZXJlbmNlXHJcbiAgICAgICAgICAgICAgICA8JSB9ICU+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCI+PHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNOC44NzguMzkyYTEuNzUgMS43NSAwIDAwLTEuNzU2IDBsLTUuMjUgMy4wNDVBMS43NSAxLjc1IDAgMDAxIDQuOTUxdjYuMDk4YzAgLjYyNC4zMzIgMS4yLjg3MiAxLjUxNGw1LjI1IDMuMDQ1YTEuNzUgMS43NSAwIDAwMS43NTYgMGw1LjI1LTMuMDQ1Yy41NC0uMzEzLjg3Mi0uODkuODcyLTEuNTE0VjQuOTUxYzAtLjYyNC0uMzMyLTEuMi0uODcyLTEuNTE0TDguODc4LjM5MnpNNy44NzUgMS42OWEuMjUuMjUgMCAwMS4yNSAwbDQuNjMgMi42ODVMOCA3LjEzMyAzLjI0NSA0LjM3NWw0LjYzLTIuNjg1ek0yLjUgNS42Nzd2NS4zNzJjMCAuMDkuMDQ3LjE3MS4xMjUuMjE2bDQuNjI1IDIuNjgzVjguNDMyTDIuNSA1LjY3N3ptNi4yNSA4LjI3MWw0LjYyNS0yLjY4M2EuMjUuMjUgMCAwMC4xMjUtLjIxNlY1LjY3N0w4Ljc1IDguNDMydjUuNTE2elwiPjwvcGF0aD48L3N2Zz5cclxuICAgICAgICAgICAgICAgIDwlPSB1c2VyLnBhY2thZ2VzLnRvdGFsQ291bnQgJT4gUGFja2FnZTwlPSBzKHVzZXIucGFja2FnZXMudG90YWxDb3VudCkgJT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGRcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIj48cGF0aCB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNMi41IDMuNWMwLS4xMzMuMDU4LS4zMTguMjgyLS41NS4yMjctLjIzNy41OTItLjQ4NCAxLjEtLjcwOEM0Ljg5OSAxLjc5NSA2LjM1NCAxLjUgOCAxLjVjMS42NDcgMCAzLjEwMi4yOTUgNC4xMTcuNzQyLjUxLjIyNC44NzQuNDcgMS4xMDEuNzA3LjIyNC4yMzMuMjgyLjQxOC4yODIuNTUxIDAgLjEzMy0uMDU4LjMxOC0uMjgyLjU1LS4yMjcuMjM3LS41OTIuNDg0LTEuMS43MDhDMTEuMTAxIDUuMjA1IDkuNjQ2IDUuNSA4IDUuNWMtMS42NDcgMC0zLjEwMi0uMjk1LTQuMTE3LS43NDItLjUxLS4yMjQtLjg3NC0uNDctMS4xMDEtLjcwNy0uMjI0LS4yMzMtLjI4Mi0uNDE4LS4yODItLjU1MXpNMSAzLjVjMC0uNjI2LjI5Mi0xLjE2NS43LTEuNTkuNDA2LS40MjIuOTU2LS43NjcgMS41NzktMS4wNDFDNC41MjUuMzIgNi4xOTUgMCA4IDBjMS44MDUgMCAzLjQ3NS4zMiA0LjcyMi44NjkuNjIyLjI3NCAxLjE3Mi42MiAxLjU3OCAxLjA0LjQwOC40MjYuNy45NjUuNyAxLjU5MXY5YzAgLjYyNi0uMjkyIDEuMTY1LS43IDEuNTktLjQwNi40MjItLjk1Ni43NjctMS41NzkgMS4wNDFDMTEuNDc2IDE1LjY4IDkuODA2IDE2IDggMTZjLTEuODA1IDAtMy40NzUtLjMyLTQuNzIxLS44NjktLjYyMy0uMjc0LTEuMTczLS42Mi0xLjU3OS0xLjA0LS40MDgtLjQyNi0uNy0uOTY1LS43LTEuNTkxdi05ek0yLjUgOFY1LjcyNGMuMjQxLjE1LjUwMy4yODYuNzc5LjQwN0M0LjUyNSA2LjY4IDYuMTk1IDcgOCA3YzEuODA1IDAgMy40NzUtLjMyIDQuNzIyLS44NjkuMjc1LS4xMjEuNTM3LS4yNTcuNzc4LS40MDdWOGMwIC4xMzMtLjA1OC4zMTgtLjI4Mi41NS0uMjI3LjIzNy0uNTkyLjQ4NC0xLjEuNzA4QzExLjEwMSA5LjcwNSA5LjY0NiAxMCA4IDEwYy0xLjY0NyAwLTMuMTAyLS4yOTUtNC4xMTctLjc0Mi0uNTEtLjIyNC0uODc0LS40Ny0xLjEwMS0uNzA3QzIuNTU4IDguMzE4IDIuNSA4LjEzMyAyLjUgOHptMCAyLjIyNVYxMi41YzAgLjEzMy4wNTguMzE4LjI4Mi41NS4yMjcuMjM3LjU5Mi40ODQgMS4xLjcwOCAxLjAxNi40NDcgMi40NzEuNzQyIDQuMTE4Ljc0MiAxLjY0NyAwIDMuMTAyLS4yOTUgNC4xMTctLjc0Mi41MS0uMjI0Ljg3NC0uNDcgMS4xMDEtLjcwNy4yMjQtLjIzMy4yODItLjQxOC4yODItLjU1MXYtMi4yNzVjLS4yNDEuMTUtLjUwMy4yODUtLjc3OC40MDYtMS4yNDcuNTQ5LTIuOTE3Ljg2OS00LjcyMi44NjktMS44MDUgMC0zLjQ3NS0uMzItNC43MjEtLjg2OWE2LjIzNiA2LjIzNiAwIDAxLS43NzktLjQwNnpcIi8+PC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8JT0gY29tcHV0ZWQuZGlza1VzYWdlICU+IHVzZWRcclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8JSBpZiAoY29tcHV0ZWQucGx1Z2lucy5saW5lcykgeyAlPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgPCU9IGNvbXB1dGVkLnBsdWdpbnMubGluZXMuZXJyb3IgPyAnZXJyb3InIDogJycgJT5cIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCI+PHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNNC43MiAzLjIyYS43NS43NSAwIDAxMS4wNiAxLjA2TDIuMDYgOGwzLjcyIDMuNzJhLjc1Ljc1IDAgMTEtMS4wNiAxLjA2TC40NyA4LjUzYS43NS43NSAwIDAxMC0xLjA2bDQuMjUtNC4yNXptNi41NiAwYS43NS43NSAwIDEwLTEuMDYgMS4wNkwxMy45NCA4bC0zLjcyIDMuNzJhLjc1Ljc1IDAgMTAxLjA2IDEuMDZsNC4yNS00LjI1YS43NS43NSAwIDAwMC0xLjA2bC00LjI1LTQuMjV6XCI+PC9wYXRoPjwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIDwlIGlmIChjb21wdXRlZC5wbHVnaW5zLmxpbmVzLmVycm9yKSB7ICU+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8JT0gY29tcHV0ZWQucGx1Z2lucy5saW5lcy5lcnJvci5tZXNzYWdlICU+XHJcbiAgICAgICAgICAgICAgICAgICAgPCUgfSBlbHNlIHsgJT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwlPSBjb21wdXRlZC5wbHVnaW5zLmxpbmVzLmFkZGVkICU+IGFkZGVkLCA8JT0gY29tcHV0ZWQucGx1Z2lucy5saW5lcy5kZWxldGVkICU+IHJlbW92ZWRcclxuICAgICAgICAgICAgICAgICAgICA8JSB9ICU+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwlIH0gJT5cclxuICAgICAgICAgICAgPC9zZWN0aW9uPlxyXG4gICAgICAgICAgICA8c2VjdGlvbj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGRcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIj48cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgZD1cIk04IC4yNWEuNzUuNzUgMCAwMS42NzMuNDE4bDEuODgyIDMuODE1IDQuMjEuNjEyYS43NS43NSAwIDAxLjQxNiAxLjI3OWwtMy4wNDYgMi45Ny43MTkgNC4xOTJhLjc1Ljc1IDAgMDEtMS4wODguNzkxTDggMTIuMzQ3bC0zLjc2NiAxLjk4YS43NS43NSAwIDAxLTEuMDg4LS43OWwuNzItNC4xOTRMLjgxOCA2LjM3NGEuNzUuNzUgMCAwMS40MTYtMS4yOGw0LjIxLS42MTFMNy4zMjcuNjY4QS43NS43NSAwIDAxOCAuMjV6bTAgMi40NDVMNi42MTUgNS41YS43NS43NSAwIDAxLS41NjQuNDFsLTMuMDk3LjQ1IDIuMjQgMi4xODRhLjc1Ljc1IDAgMDEuMjE2LjY2NGwtLjUyOCAzLjA4NCAyLjc2OS0xLjQ1NmEuNzUuNzUgMCAwMS42OTggMGwyLjc3IDEuNDU2LS41My0zLjA4NGEuNzUuNzUgMCAwMS4yMTYtLjY2NGwyLjI0LTIuMTgzLTMuMDk2LS40NWEuNzUuNzUgMCAwMS0uNTY0LS40MUw4IDIuNjk0di4wMDF6XCI+PC9wYXRoPjwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPCU9IGNvbXB1dGVkLnJlcG9zaXRvcmllcy5zdGFyZ2F6ZXJzICU+IFN0YXJnYXplcjwlPSBzKGNvbXB1dGVkLnJlcG9zaXRvcmllcy5zdGFyZ2F6ZXJzKSAlPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTUgMy4yNWEuNzUuNzUgMCAxMS0xLjUgMCAuNzUuNzUgMCAwMTEuNSAwem0wIDIuMTIyYTIuMjUgMi4yNSAwIDEwLTEuNSAwdi44NzhBMi4yNSAyLjI1IDAgMDA1Ljc1IDguNWgxLjV2Mi4xMjhhMi4yNTEgMi4yNTEgMCAxMDEuNSAwVjguNWgxLjVhMi4yNSAyLjI1IDAgMDAyLjI1LTIuMjV2LS44NzhhMi4yNSAyLjI1IDAgMTAtMS41IDB2Ljg3OGEuNzUuNzUgMCAwMS0uNzUuNzVoLTQuNUEuNzUuNzUgMCAwMTUgNi4yNXYtLjg3OHptMy43NSA3LjM3OGEuNzUuNzUgMCAxMS0xLjUgMCAuNzUuNzUgMCAwMTEuNSAwem0zLTguNzVhLjc1Ljc1IDAgMTAwLTEuNS43NS43NSAwIDAwMCAxLjV6XCI+PC9wYXRoPjwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPCU9IGNvbXB1dGVkLnJlcG9zaXRvcmllcy5mb3JrcyAlPiBGb3JrPCU9IHMoY29tcHV0ZWQucmVwb3NpdG9yaWVzLmZvcmtzKSAlPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTEuNjc5IDcuOTMyYy40MTItLjYyMSAxLjI0Mi0xLjc1IDIuMzY2LTIuNzE3QzUuMTc1IDQuMjQyIDYuNTI3IDMuNSA4IDMuNWMxLjQ3MyAwIDIuODI0Ljc0MiAzLjk1NSAxLjcxNSAxLjEyNC45NjcgMS45NTQgMi4wOTYgMi4zNjYgMi43MTdhLjExOS4xMTkgMCAwMTAgLjEzNmMtLjQxMi42MjEtMS4yNDIgMS43NS0yLjM2NiAyLjcxN0MxMC44MjUgMTEuNzU4IDkuNDczIDEyLjUgOCAxMi41Yy0xLjQ3MyAwLTIuODI0LS43NDItMy45NTUtMS43MTVDMi45MiA5LjgxOCAyLjA5IDguNjkgMS42NzkgOC4wNjhhLjExOS4xMTkgMCAwMTAtLjEzNnpNOCAyYy0xLjk4MSAwLTMuNjcuOTkyLTQuOTMzIDIuMDc4QzEuNzk3IDUuMTY5Ljg4IDYuNDIzLjQzIDcuMWExLjYxOSAxLjYxOSAwIDAwMCAxLjc5OGMuNDUuNjc4IDEuMzY3IDEuOTMyIDIuNjM3IDMuMDI0QzQuMzI5IDEzLjAwOCA2LjAxOSAxNCA4IDE0YzEuOTgxIDAgMy42Ny0uOTkyIDQuOTMzLTIuMDc4IDEuMjctMS4wOTEgMi4xODctMi4zNDUgMi42MzctMy4wMjNhMS42MTkgMS42MTkgMCAwMDAtMS43OThjLS40NS0uNjc4LTEuMzY3LTEuOTMyLTIuNjM3LTMuMDIzQzExLjY3MSAyLjk5MiA5Ljk4MSAyIDggMnptMCA4YTIgMiAwIDEwMC00IDIgMiAwIDAwMCA0elwiPjwvcGF0aD48L3N2Zz5cclxuICAgICAgICAgICAgICAgIDwlPSBjb21wdXRlZC5yZXBvc2l0b3JpZXMud2F0Y2hlcnMgJT4gV2F0Y2hlcjwlPSBzKGNvbXB1dGVkLnJlcG9zaXRvcmllcy53YXRjaGVycykgJT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8JSBpZiAoY29tcHV0ZWQucGx1Z2lucy50cmFmZmljKSB7ICU+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCA8JT0gY29tcHV0ZWQucGx1Z2lucy50cmFmZmljLmVycm9yID8gJ2Vycm9yJyA6ICcnICU+XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTAgMS43NUEuNzUuNzUgMCAwMS43NSAxaDQuMjUzYzEuMjI3IDAgMi4zMTcuNTkgMyAxLjUwMUEzLjc0NCAzLjc0NCAwIDAxMTEuMDA2IDFoNC4yNDVhLjc1Ljc1IDAgMDEuNzUuNzV2MTAuNWEuNzUuNzUgMCAwMS0uNzUuNzVoLTQuNTA3YTIuMjUgMi4yNSAwIDAwLTEuNTkxLjY1OWwtLjYyMi42MjFhLjc1Ljc1IDAgMDEtMS4wNiAwbC0uNjIyLS42MjFBMi4yNSAyLjI1IDAgMDA1LjI1OCAxM0guNzVhLjc1Ljc1IDAgMDEtLjc1LS43NVYxLjc1em04Ljc1NSAzYTIuMjUgMi4yNSAwIDAxMi4yNS0yLjI1SDE0LjV2OWgtMy43NTdjLS43MSAwLTEuNC4yMDEtMS45OTIuNTcybC4wMDQtNy4zMjJ6bS0xLjUwNCA3LjMyNGwuMDA0LTUuMDczLS4wMDItMi4yNTNBMi4yNSAyLjI1IDAgMDA1LjAwMyAyLjVIMS41djloMy43NTdhMy43NSAzLjc1IDAgMDExLjk5NC41NzR6XCI+PC9wYXRoPjwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIDwlIGlmIChjb21wdXRlZC5wbHVnaW5zLnRyYWZmaWMuZXJyb3IpIHsgJT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwlPSBjb21wdXRlZC5wbHVnaW5zLnRyYWZmaWMuZXJyb3IubWVzc2FnZSAlPlxyXG4gICAgICAgICAgICAgICAgICAgIDwlIH0gZWxzZSB7ICU+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8JT0gY29tcHV0ZWQucGx1Z2lucy50cmFmZmljLnZpZXdzLmNvdW50ICU+IHZpZXc8JT0gcyhjb21wdXRlZC5wbHVnaW5zLnRyYWZmaWMudmlld3MuY291bnQpICU+IGluIGxhc3QgdHdvIHdlZWtzXHJcbiAgICAgICAgICAgICAgICAgICAgPCUgfSAlPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8JSB9ICU+XHJcbiAgICAgICAgICAgIDwvc2VjdGlvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvc2VjdGlvbj5cclxuICAgICAgPCUgfSAlPlxyXG5cclxuICAgICAgPCUgaWYgKGNvbXB1dGVkLnBsdWdpbnMuZm9sbG93dXApIHsgJT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcblxyXG4gICAgICAgICAgPHNlY3Rpb24gY2xhc3M9XCJjb2x1bW5cIj5cclxuICAgICAgICAgICAgPGgzPklzc3VlczwvaDM+XHJcbiAgICAgICAgICAgIDwlIGlmIChjb21wdXRlZC5wbHVnaW5zLmZvbGxvd3VwLmVycm9yKSB7ICU+XHJcbiAgICAgICAgICAgICAgPHNlY3Rpb24+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgZXJyb3JcIj5cclxuICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTQuNDcuMjJBLjc1Ljc1IDAgMDE1IDBoNmEuNzUuNzUgMCAwMS41My4yMmw0LjI1IDQuMjVjLjE0MS4xNC4yMi4zMzEuMjIuNTN2NmEuNzUuNzUgMCAwMS0uMjIuNTNsLTQuMjUgNC4yNUEuNzUuNzUgMCAwMTExIDE2SDVhLjc1Ljc1IDAgMDEtLjUzLS4yMkwuMjIgMTEuNTNBLjc1Ljc1IDAgMDEwIDExVjVhLjc1Ljc1IDAgMDEuMjItLjUzTDQuNDcuMjJ6bS44NCAxLjI4TDEuNSA1LjMxdjUuMzhsMy44MSAzLjgxaDUuMzhsMy44MS0zLjgxVjUuMzFMMTAuNjkgMS41SDUuMzF6TTggNGEuNzUuNzUgMCAwMS43NS43NXYzLjVhLjc1Ljc1IDAgMDEtMS41IDB2LTMuNUEuNzUuNzUgMCAwMTggNHptMCA4YTEgMSAwIDEwMC0yIDEgMSAwIDAwMCAyelwiPjwvcGF0aD48L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgPCU9IGNvbXB1dGVkLnBsdWdpbnMuZm9sbG93dXAuZXJyb3IubWVzc2FnZSAlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9zZWN0aW9uPlxyXG4gICAgICAgICAgICA8JSB9IGVsc2UgeyAlPlxyXG4gICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJiYXJcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMjBcIiBoZWlnaHQ9XCI4XCI+XHJcbiAgICAgICAgICAgICAgICA8bWFzayBpZD1cImlzc3Vlcy1iYXJcIj5cclxuICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjBcIiB5PVwiMFwiIHdpZHRoPVwiMjIwXCIgaGVpZ2h0PVwiOFwiIGZpbGw9XCJ3aGl0ZVwiIHJ4PVwiNVwiLz5cclxuICAgICAgICAgICAgICAgIDwvbWFzaz5cclxuICAgICAgICAgICAgICAgIDxyZWN0IG1hc2s9XCJ1cmwoI2lzc3Vlcy1iYXIpXCIgeD1cIjBcIiB5PVwiMFwiIHdpZHRoPVwiPCU9IGNvbXB1dGVkLnBsdWdpbnMuZm9sbG93dXAuaXNzdWVzLmNvdW50ID8gMCA6IDIyMCAlPlwiIGhlaWdodD1cIjhcIiBmaWxsPVwiI2QxZDVkYVwiLz5cclxuICAgICAgICAgICAgICAgIDxyZWN0IG1hc2s9XCJ1cmwoI2lzc3Vlcy1iYXIpXCIgeD1cIjBcIiB5PVwiMFwiIHdpZHRoPVwiPCU9IChjb21wdXRlZC5wbHVnaW5zLmZvbGxvd3VwLmlzc3Vlcy5jbG9zZWQvY29tcHV0ZWQucGx1Z2lucy5mb2xsb3d1cC5pc3N1ZXMuY291bnQpKjIyMCB8fCAwICU+XCIgaGVpZ2h0PVwiOFwiIGZpbGw9XCIjZDczYTQ5XCIvPlxyXG4gICAgICAgICAgICAgICAgPHJlY3QgbWFzaz1cInVybCgjaXNzdWVzLWJhcilcIiB4PVwiPCU9IChjb21wdXRlZC5wbHVnaW5zLmZvbGxvd3VwLmlzc3Vlcy5jbG9zZWQvY29tcHV0ZWQucGx1Z2lucy5mb2xsb3d1cC5pc3N1ZXMuY291bnQpKjIyMCB8fCAwICU+XCIgeT1cIjBcIiB3aWR0aD1cIjwlPSAoMS1jb21wdXRlZC5wbHVnaW5zLmZvbGxvd3VwLmlzc3Vlcy5jbG9zZWQvY29tcHV0ZWQucGx1Z2lucy5mb2xsb3d1cC5pc3N1ZXMuY291bnQpKjIyMCB8fCAwICU+XCIgaGVpZ2h0PVwiOFwiIGZpbGw9XCIjMjhhNzQ1XCIvPlxyXG4gICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBob3Jpem9udGFsIGZpbGwtd2lkdGhcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiPjxwYXRoIGZpbGw9XCIjZDczYTQ5XCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNMS41IDhhNi41IDYuNSAwIDAxMTAuNjUtNS4wMDMuNzUuNzUgMCAwMC45NTktMS4xNTMgOCA4IDAgMTAyLjU5MiA4LjMzLjc1Ljc1IDAgMTAtMS40NDQtLjQwN0E2LjUgNi41IDAgMDExLjUgOHpNOCAxMmExIDEgMCAxMDAtMiAxIDEgMCAwMDAgMnptMC04YS43NS43NSAwIDAxLjc1Ljc1djMuNWEuNzUuNzUgMCAxMS0xLjUgMHYtMy41QS43NS43NSAwIDAxOCA0em00Ljc4IDQuMjhsMy0zYS43NS43NSAwIDAwLTEuMDYtMS4wNmwtMi40NyAyLjQ3LS45Ny0uOTdhLjc0OS43NDkgMCAxMC0xLjA2IDEuMDZsMS41IDEuNWEuNzUuNzUgMCAwMDEuMDYgMHpcIj48L3BhdGg+PC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibm8td3JhcFwiPjwlPSBjb21wdXRlZC5wbHVnaW5zLmZvbGxvd3VwLmlzc3Vlcy5jbG9zZWQgJT4gQ2xvc2VkPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIj48cGF0aCBmaWxsPVwiIzI4YTc0NVwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTggMS41YTYuNSA2LjUgMCAxMDAgMTMgNi41IDYuNSAwIDAwMC0xM3pNMCA4YTggOCAwIDExMTYgMEE4IDggMCAwMTAgOHptOSAzYTEgMSAwIDExLTIgMCAxIDEgMCAwMTIgMHptLS4yNS02LjI1YS43NS43NSAwIDAwLTEuNSAwdjMuNWEuNzUuNzUgMCAwMDEuNSAwdi0zLjV6XCI+PC9wYXRoPjwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5vLXdyYXBcIj48JT0gY29tcHV0ZWQucGx1Z2lucy5mb2xsb3d1cC5pc3N1ZXMub3BlbiAlPiBPcGVuPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwlIH0gJT5cclxuICAgICAgICAgIDwvc2VjdGlvbj5cclxuXHJcbiAgICAgICAgICA8c2VjdGlvbiBjbGFzcz1cImNvbHVtblwiPlxyXG4gICAgICAgICAgICA8aDM+UHVsbCByZXF1ZXN0czwvaDM+XHJcbiAgICAgICAgICAgIDwlIGlmIChjb21wdXRlZC5wbHVnaW5zLmZvbGxvd3VwLmVycm9yKSB7ICU+XHJcbiAgICAgICAgICAgICAgPHNlY3Rpb24+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgZXJyb3JcIj5cclxuICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTQuNDcuMjJBLjc1Ljc1IDAgMDE1IDBoNmEuNzUuNzUgMCAwMS41My4yMmw0LjI1IDQuMjVjLjE0MS4xNC4yMi4zMzEuMjIuNTN2NmEuNzUuNzUgMCAwMS0uMjIuNTNsLTQuMjUgNC4yNUEuNzUuNzUgMCAwMTExIDE2SDVhLjc1Ljc1IDAgMDEtLjUzLS4yMkwuMjIgMTEuNTNBLjc1Ljc1IDAgMDEwIDExVjVhLjc1Ljc1IDAgMDEuMjItLjUzTDQuNDcuMjJ6bS44NCAxLjI4TDEuNSA1LjMxdjUuMzhsMy44MSAzLjgxaDUuMzhsMy44MS0zLjgxVjUuMzFMMTAuNjkgMS41SDUuMzF6TTggNGEuNzUuNzUgMCAwMS43NS43NXYzLjVhLjc1Ljc1IDAgMDEtMS41IDB2LTMuNUEuNzUuNzUgMCAwMTggNHptMCA4YTEgMSAwIDEwMC0yIDEgMSAwIDAwMCAyelwiPjwvcGF0aD48L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgPCU9IGNvbXB1dGVkLnBsdWdpbnMuZm9sbG93dXAuZXJyb3IubWVzc2FnZSAlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9zZWN0aW9uPlxyXG4gICAgICAgICAgICA8JSB9IGVsc2UgeyAlPlxyXG4gICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJiYXJcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMjBcIiBoZWlnaHQ9XCI4XCI+XHJcbiAgICAgICAgICAgICAgICA8bWFzayBpZD1cInByLWJhclwiPlxyXG4gICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMFwiIHk9XCIwXCIgd2lkdGg9XCIyMjBcIiBoZWlnaHQ9XCI4XCIgZmlsbD1cIndoaXRlXCIgcng9XCI1XCIvPlxyXG4gICAgICAgICAgICAgICAgPC9tYXNrPlxyXG4gICAgICAgICAgICAgICAgPHJlY3QgbWFzaz1cInVybCgjcHItYmFyKVwiIHg9XCIwXCIgeT1cIjBcIiB3aWR0aD1cIjwlPSBjb21wdXRlZC5wbHVnaW5zLmZvbGxvd3VwLnByLmNvdW50ID8gMCA6IDIyMCAlPlwiIGhlaWdodD1cIjhcIiBmaWxsPVwiI2QxZDVkYVwiLz5cclxuICAgICAgICAgICAgICAgIDxyZWN0IG1hc2s9XCJ1cmwoI3ByLWJhcilcIiB4PVwiMFwiIHk9XCIwXCIgd2lkdGg9XCI8JT0gKGNvbXB1dGVkLnBsdWdpbnMuZm9sbG93dXAucHIubWVyZ2VkL2NvbXB1dGVkLnBsdWdpbnMuZm9sbG93dXAucHIuY291bnQpKjIyMCB8fCAwICU+XCIgaGVpZ2h0PVwiOFwiIGZpbGw9XCIjNmY0MmMxXCIvPlxyXG4gICAgICAgICAgICAgICAgPHJlY3QgbWFzaz1cInVybCgjcHItYmFyKVwiIHg9XCI8JT0gKGNvbXB1dGVkLnBsdWdpbnMuZm9sbG93dXAucHIubWVyZ2VkL2NvbXB1dGVkLnBsdWdpbnMuZm9sbG93dXAucHIuY291bnQpKjIyMCB8fCAwICU+XCIgeT1cIjBcIiB3aWR0aD1cIjwlPSAoMS1jb21wdXRlZC5wbHVnaW5zLmZvbGxvd3VwLnByLm1lcmdlZC9jb21wdXRlZC5wbHVnaW5zLmZvbGxvd3VwLnByLmNvdW50KSoyMjAgfHwgMCAlPlwiIGhlaWdodD1cIjhcIiBmaWxsPVwiIzI4YTc0NVwiLz5cclxuICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgaG9yaXpvbnRhbCBmaWxsLXdpZHRoXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIj48cGF0aCBmaWxsPVwiIzZmNDJjMVwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTUgMy4yNTRWMy4yNXYuMDA1YS43NS43NSAwIDExMC0uMDA1di4wMDR6bS40NSAxLjlhMi4yNSAyLjI1IDAgMTAtMS45NS4yMTh2NS4yNTZhMi4yNSAyLjI1IDAgMTAxLjUgMFY3LjEyM0E1LjczNSA1LjczNSAwIDAwOS4yNSA5aDEuMzc4YTIuMjUxIDIuMjUxIDAgMTAwLTEuNUg5LjI1YTQuMjUgNC4yNSAwIDAxLTMuOC0yLjM0NnpNMTIuNzUgOWEuNzUuNzUgMCAxMDAtMS41Ljc1Ljc1IDAgMDAwIDEuNXptLTguNSA0LjVhLjc1Ljc1IDAgMTAwLTEuNS43NS43NSAwIDAwMCAxLjV6XCI+PC9wYXRoPjwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5vLXdyYXBcIj48JT0gY29tcHV0ZWQucGx1Z2lucy5mb2xsb3d1cC5wci5tZXJnZWQgJT4gTWVyZ2VkPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIj48cGF0aCBmaWxsPVwiIzI4YTc0NVwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTcuMTc3IDMuMDczTDkuNTczLjY3N0EuMjUuMjUgMCAwMTEwIC44NTR2NC43OTJhLjI1LjI1IDAgMDEtLjQyNy4xNzdMNy4xNzcgMy40MjdhLjI1LjI1IDAgMDEwLS4zNTR6TTMuNzUgMi41YS43NS43NSAwIDEwMCAxLjUuNzUuNzUgMCAwMDAtMS41em0tMi4yNS43NWEyLjI1IDIuMjUgMCAxMTMgMi4xMjJ2NS4yNTZhMi4yNTEgMi4yNTEgMCAxMS0xLjUgMFY1LjM3MkEyLjI1IDIuMjUgMCAwMTEuNSAzLjI1ek0xMSAyLjVoLTFWNGgxYTEgMSAwIDAxMSAxdjUuNjI4YTIuMjUxIDIuMjUxIDAgMTAxLjUgMFY1QTIuNSAyLjUgMCAwMDExIDIuNXptMSAxMC4yNWEuNzUuNzUgMCAxMTEuNSAwIC43NS43NSAwIDAxLTEuNSAwek0zLjc1IDEyYS43NS43NSAwIDEwMCAxLjUuNzUuNzUgMCAwMDAtMS41elwiPjwvcGF0aD48L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuby13cmFwXCI+PCU9IGNvbXB1dGVkLnBsdWdpbnMuZm9sbG93dXAucHIub3BlbiAlPiBPcGVuPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwlIH0gJT5cclxuICAgICAgICAgIDwvc2VjdGlvbj5cclxuXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwlIH0gJT5cclxuXHJcbiAgICAgIDwlIGlmIChjb21wdXRlZC5wbHVnaW5zLmxhbmd1YWdlcykgeyAlPlxyXG4gICAgICAgIDxzZWN0aW9uIGNsYXNzPVwiY29sdW1uXCI+XHJcbiAgICAgICAgICA8aDM+TW9zdCB1c2VkIGxhbmd1YWdlczwvaDM+XHJcbiAgICAgICAgICA8JSBpZiAoY29tcHV0ZWQucGx1Z2lucy5sYW5ndWFnZXMuZXJyb3IpIHsgJT5cclxuICAgICAgICAgICAgPHNlY3Rpb24+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGVycm9yXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCI+PHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNNC40Ny4yMkEuNzUuNzUgMCAwMTUgMGg2YS43NS43NSAwIDAxLjUzLjIybDQuMjUgNC4yNWMuMTQxLjE0LjIyLjMzMS4yMi41M3Y2YS43NS43NSAwIDAxLS4yMi41M2wtNC4yNSA0LjI1QS43NS43NSAwIDAxMTEgMTZINWEuNzUuNzUgMCAwMS0uNTMtLjIyTC4yMiAxMS41M0EuNzUuNzUgMCAwMTAgMTFWNWEuNzUuNzUgMCAwMS4yMi0uNTNMNC40Ny4yMnptLjg0IDEuMjhMMS41IDUuMzF2NS4zOGwzLjgxIDMuODFoNS4zOGwzLjgxLTMuODFWNS4zMUwxMC42OSAxLjVINS4zMXpNOCA0YS43NS43NSAwIDAxLjc1Ljc1djMuNWEuNzUuNzUgMCAwMS0xLjUgMHYtMy41QS43NS43NSAwIDAxOCA0em0wIDhhMSAxIDAgMTAwLTIgMSAxIDAgMDAwIDJ6XCI+PC9wYXRoPjwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPCU9IGNvbXB1dGVkLnBsdWdpbnMubGFuZ3VhZ2VzLmVycm9yLm1lc3NhZ2UgJT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9zZWN0aW9uPlxyXG4gICAgICAgICAgPCUgfSBlbHNlIHsgJT5cclxuICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImJhclwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjQ2MFwiIGhlaWdodD1cIjhcIj5cclxuICAgICAgICAgICAgICA8bWFzayBpZD1cImxhbmd1YWdlcy1iYXJcIj5cclxuICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIwXCIgeT1cIjBcIiB3aWR0aD1cIjQ2MFwiIGhlaWdodD1cIjhcIiBmaWxsPVwid2hpdGVcIiByeD1cIjVcIi8+XHJcbiAgICAgICAgICAgICAgPC9tYXNrPlxyXG4gICAgICAgICAgICAgIDxyZWN0IG1hc2s9XCJ1cmwoI2xhbmd1YWdlcy1iYXIpXCIgeD1cIjBcIiB5PVwiMFwiIHdpZHRoPVwiPCU9IGNvbXB1dGVkLnBsdWdpbnMubGFuZ3VhZ2VzLmZhdm9yaXRlcy5sZW5ndGggPyAwIDogNDYwICU+XCIgaGVpZ2h0PVwiOFwiIGZpbGw9XCIjZDFkNWRhXCIvPlxyXG4gICAgICAgICAgICAgIDwlIGZvciAoY29uc3Qge25hbWUsIHZhbHVlLCBjb2xvciwgeH0gb2YgY29tcHV0ZWQucGx1Z2lucy5sYW5ndWFnZXMuZmF2b3JpdGVzKSB7ICU+XHJcbiAgICAgICAgICAgICAgICA8cmVjdCBtYXNrPVwidXJsKCNsYW5ndWFnZXMtYmFyKVwiIHg9XCI8JT0geCo0NjAgJT5cIiB5PVwiMFwiIHdpZHRoPVwiPCU9IHZhbHVlKjQ2MCAlPlwiIGhlaWdodD1cIjhcIiBmaWxsPVwiPCU9IGNvbG9yICU+XCIvPlxyXG4gICAgICAgICAgICAgIDwlIH0gJT5cclxuICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjZW50ZXIgaG9yaXpvbnRhbC13cmFwIGZpbGwtd2lkdGhcIj5cclxuICAgICAgICAgICAgICA8JSBmb3IgKGNvbnN0IHtuYW1lLCB2YWx1ZSwgY29sb3J9IG9mIGNvbXB1dGVkLnBsdWdpbnMubGFuZ3VhZ2VzLmZhdm9yaXRlcykgeyAlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNlbnRlciBuby13cmFwIGxhbmd1YWdlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIj48cGF0aCBmaWxsPVwiPCU9IGNvbG9yICU+XCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNOCA0YTQgNCAwIDEwMCA4IDQgNCAwIDAwMC04elwiPjwvcGF0aD48L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgPCU9IG5hbWUgJT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwlIH0gJT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8JSB9ICU+XHJcbiAgICAgICAgPC9zZWN0aW9uPlxyXG4gICAgICA8JSB9ICU+XHJcblxyXG4gICAgICA8JSBpZiAoY29tcHV0ZWQucGx1Z2lucy5wYWdlc3BlZWQpIHsgJT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICA8c2VjdGlvbj5cclxuICAgICAgICAgICAgPGgyIGNsYXNzPVwiZmllbGRcIj5cclxuICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCI+PHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNMTQuMDY0IDBhOC43NSA4Ljc1IDAgMDAtNi4xODcgMi41NjNsLS40NTkuNDU4Yy0uMzE0LjMxNC0uNjE2LjY0MS0uOTA0Ljk3OUgzLjMxYTEuNzUgMS43NSAwIDAwLTEuNDkuODMzTC4xMSA3LjYwN2EuNzUuNzUgMCAwMC40MTggMS4xMWwzLjEwMi45NTRjLjAzNy4wNTEuMDc5LjEuMTI0LjE0NWwyLjQyOSAyLjQyOGMuMDQ2LjA0Ni4wOTQuMDg4LjE0NS4xMjVsLjk1NCAzLjEwMmEuNzUuNzUgMCAwMDEuMTEuNDE4bDIuNzc0LTEuNzA3YTEuNzUgMS43NSAwIDAwLjgzMy0xLjQ5VjkuNDg1Yy4zMzgtLjI4OC42NjUtLjU5Ljk3OS0uOTA0bC40NTgtLjQ1OUE4Ljc1IDguNzUgMCAwMDE2IDEuOTM2VjEuNzVBMS43NSAxLjc1IDAgMDAxNC4yNSAwaC0uMTg2ek0xMC41IDEwLjYyNWMtLjA4OC4wNi0uMTc3LjExOC0uMjY2LjE3NWwtMi4zNSAxLjUyMS41NDggMS43ODMgMS45NDktMS4yYS4yNS4yNSAwIDAwLjExOS0uMjEzdi0yLjA2NnpNMy42NzggOC4xMTZMNS4yIDUuNzY2Yy4wNTgtLjA5LjExNy0uMTc4LjE3Ni0uMjY2SDMuMzA5YS4yNS4yNSAwIDAwLS4yMTMuMTE5bC0xLjIgMS45NSAxLjc4Mi41NDd6bTUuMjYtNC40OTNBNy4yNSA3LjI1IDAgMDExNC4wNjMgMS41aC4xODZhLjI1LjI1IDAgMDEuMjUuMjV2LjE4NmE3LjI1IDcuMjUgMCAwMS0yLjEyMyA1LjEyN2wtLjQ1OS40NThhMTUuMjEgMTUuMjEgMCAwMS0yLjQ5OSAyLjAybC0yLjMxNyAxLjUtMi4xNDMtMi4xNDMgMS41LTIuMzE3YTE1LjI1IDE1LjI1IDAgMDEyLjAyLTIuNWwuNDU4LS40NThoLjAwMnpNMTIgNWExIDEgMCAxMS0yIDAgMSAxIDAgMDEyIDB6bS04LjQ0IDkuNTZhMS41IDEuNSAwIDEwLTIuMTItMi4xMmMtLjczNC43My0xLjA0NyAyLjMzMi0xLjE1IDMuMDAzYS4yMy4yMyAwIDAwLjI2NS4yNjVjLjY3MS0uMTAzIDIuMjczLS40MTYgMy4wMDUtMS4xNDh6XCI+PC9wYXRoPjwvc3ZnPlxyXG4gICAgICAgICAgICAgIFBhZ2VTcGVlZCBJbnNpZ2h0c1xyXG4gICAgICAgICAgICA8L2gyPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGRcIj5cclxuICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCI+PHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNNy43NzUgMy4yNzVhLjc1Ljc1IDAgMDAxLjA2IDEuMDZsMS4yNS0xLjI1YTIgMiAwIDExMi44MyAyLjgzbC0yLjUgMi41YTIgMiAwIDAxLTIuODMgMCAuNzUuNzUgMCAwMC0xLjA2IDEuMDYgMy41IDMuNSAwIDAwNC45NSAwbDIuNS0yLjVhMy41IDMuNSAwIDAwLTQuOTUtNC45NWwtMS4yNSAxLjI1em0tNC42OSA5LjY0YTIgMiAwIDAxMC0yLjgzbDIuNS0yLjVhMiAyIDAgMDEyLjgzIDAgLjc1Ljc1IDAgMDAxLjA2LTEuMDYgMy41IDMuNSAwIDAwLTQuOTUgMGwtMi41IDIuNWEzLjUgMy41IDAgMDA0Ljk1IDQuOTVsMS4yNS0xLjI1YS43NS43NSAwIDAwLTEuMDYtMS4wNmwtMS4yNSAxLjI1YTIgMiAwIDAxLTIuODMgMHpcIj48L3BhdGg+PC9zdmc+XHJcbiAgICAgICAgICAgICAgPCU9IHVzZXIud2Vic2l0ZVVybCAlPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvc2VjdGlvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8JSBpZiAoY29tcHV0ZWQucGx1Z2lucy5wYWdlc3BlZWQuZXJyb3IpIHsgJT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgPHNlY3Rpb24+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGVycm9yXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCI+PHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNNC40Ny4yMkEuNzUuNzUgMCAwMTUgMGg2YS43NS43NSAwIDAxLjUzLjIybDQuMjUgNC4yNWMuMTQxLjE0LjIyLjMzMS4yMi41M3Y2YS43NS43NSAwIDAxLS4yMi41M2wtNC4yNSA0LjI1QS43NS43NSAwIDAxMTEgMTZINWEuNzUuNzUgMCAwMS0uNTMtLjIyTC4yMiAxMS41M0EuNzUuNzUgMCAwMTAgMTFWNWEuNzUuNzUgMCAwMS4yMi0uNTNMNC40Ny4yMnptLjg0IDEuMjhMMS41IDUuMzF2NS4zOGwzLjgxIDMuODFoNS4zOGwzLjgxLTMuODFWNS4zMUwxMC42OSAxLjVINS4zMXpNOCA0YS43NS43NSAwIDAxLjc1Ljc1djMuNWEuNzUuNzUgMCAwMS0xLjUgMHYtMy41QS43NS43NSAwIDAxOCA0em0wIDhhMSAxIDAgMTAwLTIgMSAxIDAgMDAwIDJ6XCI+PC9wYXRoPjwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPCU9IGNvbXB1dGVkLnBsdWdpbnMucGFnZXNwZWVkLmVycm9yLm1lc3NhZ2UgJT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9zZWN0aW9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPCUgfSBlbHNlIHsgJT5cclxuICAgICAgICAgIDxzZWN0aW9uPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGZpbGwtd2lkdGhcIj5cclxuICAgICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz1cImNhdGVnb3JpZXNcIj5cclxuICAgICAgICAgICAgICAgIDwlIGZvciAoY29uc3Qge3Njb3JlLCB0aXRsZX0gb2YgY29tcHV0ZWQucGx1Z2lucy5wYWdlc3BlZWQuc2NvcmVzKSB7ICU+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yaWUgY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxMjAgMTIwXCIgd2lkdGg9XCI1MFwiIGhlaWdodD1cIjUwXCIgY2xhc3M9XCJnYXVnZSA8JT0gIU51bWJlci5pc05hTihzY29yZSkgPyAoc2NvcmUgPj0gMC45ID8gJ2hpZ2gnIDogc2NvcmUgPj0gMC41ID8gJ2F2ZXJhZ2UnIDogJ2xvdycpIDogJycgJT5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY2xhc3M9XCJnYXVnZS1iYXNlXCIgcj1cIjUzXCIgY3g9XCI2MFwiIGN5PVwiNjBcIj48L2NpcmNsZT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwlIGlmICghTnVtYmVyLmlzTmFOKHNjb3JlKSkgeyAlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGNsYXNzPVwiZ2F1Z2UtYXJjXCIgdHJhbnNmb3JtPVwicm90YXRlKC05MCA2MCA2MClcIiByPVwiNTNcIiBjeD1cIjYwXCIgY3k9XCI2MFwiIHN0cm9rZS1kYXNoYXJyYXk9XCI8JT0gc2NvcmUgKiAzMjkgJT4gMzI5XCI+PC9jaXJjbGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0IHg9XCI2MFwiIHk9XCI2MFwiIGRvbWluYW50LWJhc2VsaW5lPVwiY2VudHJhbFwiID48JT0gTWF0aC5yb3VuZChzY29yZSoxMDApICU+PC90ZXh0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPCUgfSBlbHNlIHsgJT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRleHQgeD1cIjYwXCIgeT1cIjYwXCIgZG9taW5hbnQtYmFzZWxpbmU9XCJjZW50cmFsXCIgPi08L3RleHQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8JSB9ICU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aXRsZVwiPjwlPSB0aXRsZSAlPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8JSB9ICU+XHJcbiAgICAgICAgICAgICAgPC9zZWN0aW9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvc2VjdGlvbj5cclxuICAgICAgICA8JSB9ICU+XHJcbiAgICAgIDwlIH0gJT5cclxuXHJcbiAgICAgIDwlIGlmIChjb21wdXRlZC5wbHVnaW5zLmhhYml0cykgeyAlPlxyXG4gICAgICAgIDxzZWN0aW9uPlxyXG4gICAgICAgICAgPGgyIGNsYXNzPVwiZmllbGRcIj5cclxuICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTggMS41Yy0yLjM2MyAwLTQgMS42OS00IDMuNzUgMCAuOTg0LjQyNCAxLjYyNS45ODQgMi4zMDRsLjIxNC4yNTNjLjIyMy4yNjQuNDcuNTU2LjY3My44NDguMjg0LjQxMS41MzcuODk2LjYyMSAxLjQ5YS43NS43NSAwIDAxLTEuNDg0LjIxMWMtLjA0LS4yODItLjE2My0uNTQ3LS4zNy0uODQ3YTguNjk1IDguNjk1IDAgMDAtLjU0Mi0uNjhjLS4wODQtLjEtLjE3My0uMjA1LS4yNjgtLjMyQzMuMjAxIDcuNzUgMi41IDYuNzY2IDIuNSA1LjI1IDIuNSAyLjMxIDQuODYzIDAgOCAwczUuNSAyLjMxIDUuNSA1LjI1YzAgMS41MTYtLjcwMSAyLjUtMS4zMjggMy4yNTktLjA5NS4xMTUtLjE4NC4yMi0uMjY4LjMxOS0uMjA3LjI0NS0uMzgzLjQ1My0uNTQxLjY4MS0uMjA4LjMtLjMzLjU2NS0uMzcuODQ3YS43NS43NSAwIDAxLTEuNDg1LS4yMTJjLjA4NC0uNTkzLjMzNy0xLjA3OC42MjEtMS40ODkuMjAzLS4yOTIuNDUtLjU4NC42NzMtLjg0OC4wNzUtLjA4OC4xNDctLjE3My4yMTMtLjI1My41NjEtLjY3OS45ODUtMS4zMi45ODUtMi4zMDQgMC0yLjA2LTEuNjM3LTMuNzUtNC0zLjc1ek02IDE1LjI1YS43NS43NSAwIDAxLjc1LS43NWgyLjVhLjc1Ljc1IDAgMDEwIDEuNWgtMi41YS43NS43NSAwIDAxLS43NS0uNzV6TTUuNzUgMTJhLjc1Ljc1IDAgMDAwIDEuNWg0LjVhLjc1Ljc1IDAgMDAwLTEuNWgtNC41elwiPjwvcGF0aD48L3N2Zz5cclxuICAgICAgICAgICAgQ29kaW5nIGhhYml0c1xyXG4gICAgICAgICAgPC9oMj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgPCUgaWYgKGNvbXB1dGVkLnBsdWdpbnMuaGFiaXRzLmVycm9yKSB7ICU+XHJcbiAgICAgICAgICAgICAgPHNlY3Rpb24+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgZXJyb3JcIj5cclxuICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTQuNDcuMjJBLjc1Ljc1IDAgMDE1IDBoNmEuNzUuNzUgMCAwMS41My4yMmw0LjI1IDQuMjVjLjE0MS4xNC4yMi4zMzEuMjIuNTN2NmEuNzUuNzUgMCAwMS0uMjIuNTNsLTQuMjUgNC4yNUEuNzUuNzUgMCAwMTExIDE2SDVhLjc1Ljc1IDAgMDEtLjUzLS4yMkwuMjIgMTEuNTNBLjc1Ljc1IDAgMDEwIDExVjVhLjc1Ljc1IDAgMDEuMjItLjUzTDQuNDcuMjJ6bS44NCAxLjI4TDEuNSA1LjMxdjUuMzhsMy44MSAzLjgxaDUuMzhsMy44MS0zLjgxVjUuMzFMMTAuNjkgMS41SDUuMzF6TTggNGEuNzUuNzUgMCAwMS43NS43NXYzLjVhLjc1Ljc1IDAgMDEtMS41IDB2LTMuNUEuNzUuNzUgMCAwMTggNHptMCA4YTEgMSAwIDEwMC0yIDEgMSAwIDAwMCAyelwiPjwvcGF0aD48L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgPCU9IGNvbXB1dGVkLnBsdWdpbnMuaGFiaXRzLmVycm9yLm1lc3NhZ2UgJT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvc2VjdGlvbj5cclxuICAgICAgICAgICAgPCUgfSBlbHNlIHsgJT5cclxuICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJoYWJpdHNcIj5cclxuICAgICAgICAgICAgICAgIDwlIGlmIChjb21wdXRlZC5wbHVnaW5zLmhhYml0cy5pbmRlbnRzLnN0eWxlKSB7ICU+XHJcbiAgICAgICAgICAgICAgICAgIDxsaT5Vc2UgPCU9IGNvbXB1dGVkLnBsdWdpbnMuaGFiaXRzLmluZGVudHMuc3R5bGUgJT4gZm9yIGluZGVudHM8L2xpPlxyXG4gICAgICAgICAgICAgICAgPCUgfSAlPlxyXG4gICAgICAgICAgICAgICAgPCUgaWYgKCFOdW1iZXIuaXNOYU4oY29tcHV0ZWQucGx1Z2lucy5oYWJpdHMuY29tbWl0cy5ob3VyKSkgeyAlPlxyXG4gICAgICAgICAgICAgICAgICA8bGk+TW9zdGx5IHB1c2ggY29kZSBhcm91bmQgPCU9IGNvbXB1dGVkLnBsdWdpbnMuaGFiaXRzLmNvbW1pdHMuaG91ciAlPjowMDwvbGk+XHJcbiAgICAgICAgICAgICAgICA8JSB9ICU+XHJcbiAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgPCUgfSAlPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9zZWN0aW9uPlxyXG4gICAgICA8JSB9ICU+XHJcblxyXG4gICAgICA8JSBpZiAoY29tcHV0ZWQucGx1Z2lucy5tdXNpYykgeyAlPlxyXG4gICAgICAgIDxzZWN0aW9uPlxyXG4gICAgICAgICAgPGgyIGNsYXNzPVwiZmllbGRcIj5cclxuICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTEuNSA4YTYuNSA2LjUgMCAxMTEzIDAgNi41IDYuNSAwIDAxLTEzIDB6TTggMGE4IDggMCAxMDAgMTZBOCA4IDAgMDA4IDB6TTYuMzc5IDUuMjI3QS4yNS4yNSAwIDAwNiA1LjQ0MnY1LjExN2EuMjUuMjUgMCAwMC4zNzkuMjE0bDQuMjY0LTIuNTU5YS4yNS4yNSAwIDAwMC0uNDI4TDYuMzc5IDUuMjI3elwiPjwvcGF0aD48L3N2Zz5cclxuICAgICAgICAgICAgPCU9IGNvbXB1dGVkLnBsdWdpbnMubXVzaWMubW9kZSAlPlxyXG4gICAgICAgICAgPC9oMj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgZmlsbC13aWR0aFwiPlxyXG4gICAgICAgICAgICA8c2VjdGlvbj5cclxuICAgICAgICAgICAgICA8JSBpZiAoY29tcHV0ZWQucGx1Z2lucy5tdXNpYy5wcm92aWRlcikgeyAlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIj48cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgZD1cIk0yLjAwMiAyLjcyNWEuNzUuNzUgMCAwMS43OTctLjY5OUM4Ljc5IDIuNDIgMTMuNTggNy4yMSAxMy45NzQgMTMuMjAxYS43NS43NSAwIDExLTEuNDk3LjA5OCAxMC41MDIgMTAuNTAyIDAgMDAtOS43NzYtOS43NzYuNzUuNzUgMCAwMS0uNy0uNzk4ek0yIDEzYTEgMSAwIDExMiAwIDEgMSAwIDAxLTIgMHptLjg0LTUuOTVhLjc1Ljc1IDAgMDAtLjE3OSAxLjQ4OWMyLjUwOS4zIDQuNSAyLjI5MSA0LjggNC44YS43NS43NSAwIDEwMS40OS0uMTc4QTcuMDAzIDcuMDAzIDAgMDAyLjgzOCA3LjA1elwiPjwvcGF0aD48L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgRnJvbSA8JT0gY29tcHV0ZWQucGx1Z2lucy5tdXNpYy5wcm92aWRlciAlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPCUgfSAlPlxyXG4gICAgICAgICAgICAgIDwlIGlmIChjb21wdXRlZC5wbHVnaW5zLm11c2ljLmVycm9yKSB7ICU+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgZXJyb3JcIj5cclxuICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTQuNDcuMjJBLjc1Ljc1IDAgMDE1IDBoNmEuNzUuNzUgMCAwMS41My4yMmw0LjI1IDQuMjVjLjE0MS4xNC4yMi4zMzEuMjIuNTN2NmEuNzUuNzUgMCAwMS0uMjIuNTNsLTQuMjUgNC4yNUEuNzUuNzUgMCAwMTExIDE2SDVhLjc1Ljc1IDAgMDEtLjUzLS4yMkwuMjIgMTEuNTNBLjc1Ljc1IDAgMDEwIDExVjVhLjc1Ljc1IDAgMDEuMjItLjUzTDQuNDcuMjJ6bS44NCAxLjI4TDEuNSA1LjMxdjUuMzhsMy44MSAzLjgxaDUuMzhsMy44MS0zLjgxVjUuMzFMMTAuNjkgMS41SDUuMzF6TTggNGEuNzUuNzUgMCAwMS43NS43NXYzLjVhLjc1Ljc1IDAgMDEtMS41IDB2LTMuNUEuNzUuNzUgMCAwMTggNHptMCA4YTEgMSAwIDEwMC0yIDEgMSAwIDAwMCAyelwiPjwvcGF0aD48L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgPCU9IGNvbXB1dGVkLnBsdWdpbnMubXVzaWMuZXJyb3IubWVzc2FnZSAlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPCUgfSBlbHNlIHsgJT5cclxuICAgICAgICAgICAgICAgIDwlIGlmIChjb21wdXRlZC5wbHVnaW5zLm11c2ljLnRyYWNrcy5sZW5ndGgpIHsgJT5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRyYWNrbGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwlIGZvciAoY29uc3Qge25hbWUgPSBcIlwiLCBhcnRpc3QgPSBcIlwiLCBhcnR3b3JrID0gXCJcIn0gb2YgY29tcHV0ZWQucGx1Z2lucy5tdXNpYy50cmFja3MpIHsgJT5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0cmFja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCw8JT0gYXJ0d29yayAlPlwiIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIGFsdD1cIlwiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImluZm9zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5hbWVcIj48JT0gbmFtZSAlPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcnRpc3RcIj48JT0gYXJ0aXN0ICU+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPCUgfSAlPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwlIH0gZWxzZSB7ICU+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIj48cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgZD1cIk0xLjc1IDEuNWEuMjUuMjUgMCAwMC0uMjUuMjV2OS41YzAgLjEzOC4xMTIuMjUuMjUuMjVoMmEuNzUuNzUgMCAwMS43NS43NXYyLjE5bDIuNzItMi43MmEuNzUuNzUgMCAwMS41My0uMjJoNi41YS4yNS4yNSAwIDAwLjI1LS4yNXYtOS41YS4yNS4yNSAwIDAwLS4yNS0uMjVIMS43NXpNMCAxLjc1QzAgLjc4NC43ODQgMCAxLjc1IDBoMTIuNUMxNS4yMTYgMCAxNiAuNzg0IDE2IDEuNzV2OS41QTEuNzUgMS43NSAwIDAxMTQuMjUgMTNIOC4wNmwtMi41NzMgMi41NzNBMS40NTcgMS40NTcgMCAwMTMgMTQuNTQzVjEzSDEuNzVBMS43NSAxLjc1IDAgMDEwIDExLjI1di05LjV6TTkgOWExIDEgMCAxMS0yIDAgMSAxIDAgMDEyIDB6bS0uMjUtNS4yNWEuNzUuNzUgMCAwMC0xLjUgMHYyLjVhLjc1Ljc1IDAgMDAxLjUgMHYtMi41elwiPjwvcGF0aD48L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICBObyBtdXNpYyByZWNlbnRseSBsaXN0ZW5lZFxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwlIH0gJT5cclxuICAgICAgICAgICAgICA8JSB9ICU+XHJcbiAgICAgICAgICAgIDwvc2VjdGlvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvc2VjdGlvbj5cclxuICAgICAgPCUgfSAlPlxyXG5cclxuICAgICAgPCUgaWYgKGNvbXB1dGVkLnBsdWdpbnMucG9zdHMpIHsgJT5cclxuICAgICAgICA8c2VjdGlvbj5cclxuICAgICAgICAgIDxoMiBjbGFzcz1cImZpZWxkXCI+XHJcbiAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIj48cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgZD1cIk02IDJhLjc1Ljc1IDAgMDEuNjk2LjQ3MUwxMCAxMC43MzFsMS4zMDQtMy4yNkEuNzUuNzUgMCAwMTEyIDdoMy4yNWEuNzUuNzUgMCAwMTAgMS41aC0yLjc0MmwtMS44MTIgNC41MjhhLjc1Ljc1IDAgMDEtMS4zOTIgMEw2IDQuNzcgNC42OTYgOC4wM0EuNzUuNzUgMCAwMTQgOC41SC43NWEuNzUuNzUgMCAwMTAtMS41aDIuNzQybDEuODEyLTQuNTI5QS43NS43NSAwIDAxNiAyelwiLz48L3N2Zz5cclxuICAgICAgICAgICAgUmVjZW50IGFydGljbGVzXHJcbiAgICAgICAgICA8L2gyPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBmaWxsLXdpZHRoXCI+XHJcbiAgICAgICAgICAgIDxzZWN0aW9uPlxyXG4gICAgICAgICAgICAgIDwlIGlmIChjb21wdXRlZC5wbHVnaW5zLnBvc3RzLmVycm9yKSB7ICU+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgZXJyb3JcIj5cclxuICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTQuNDcuMjJBLjc1Ljc1IDAgMDE1IDBoNmEuNzUuNzUgMCAwMS41My4yMmw0LjI1IDQuMjVjLjE0MS4xNC4yMi4zMzEuMjIuNTN2NmEuNzUuNzUgMCAwMS0uMjIuNTNsLTQuMjUgNC4yNUEuNzUuNzUgMCAwMTExIDE2SDVhLjc1Ljc1IDAgMDEtLjUzLS4yMkwuMjIgMTEuNTNBLjc1Ljc1IDAgMDEwIDExVjVhLjc1Ljc1IDAgMDEuMjItLjUzTDQuNDcuMjJ6bS44NCAxLjI4TDEuNSA1LjMxdjUuMzhsMy44MSAzLjgxaDUuMzhsMy44MS0zLjgxVjUuMzFMMTAuNjkgMS41SDUuMzF6TTggNGEuNzUuNzUgMCAwMS43NS43NXYzLjVhLjc1Ljc1IDAgMDEtMS41IDB2LTMuNUEuNzUuNzUgMCAwMTggNHptMCA4YTEgMSAwIDEwMC0yIDEgMSAwIDAwMCAyelwiPjwvcGF0aD48L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgPCU9IGNvbXB1dGVkLnBsdWdpbnMucG9zdHMuZXJyb3IubWVzc2FnZSAlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPCUgfSBlbHNlIHsgJT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCI+PHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNMi4wMDIgMi43MjVhLjc1Ljc1IDAgMDEuNzk3LS42OTlDOC43OSAyLjQyIDEzLjU4IDcuMjEgMTMuOTc0IDEzLjIwMWEuNzUuNzUgMCAxMS0xLjQ5Ny4wOTggMTAuNTAyIDEwLjUwMiAwIDAwLTkuNzc2LTkuNzc2Ljc1Ljc1IDAgMDEtLjctLjc5OHpNMiAxM2ExIDEgMCAxMTIgMCAxIDEgMCAwMS0yIDB6bS44NC01Ljk1YS43NS43NSAwIDAwLS4xNzkgMS40ODljMi41MDkuMyA0LjUgMi4yOTEgNC44IDQuOGEuNzUuNzUgMCAxMDEuNDktLjE3OEE3LjAwMyA3LjAwMyAwIDAwMi44MzggNy4wNXpcIj48L3BhdGg+PC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgIEZyb20gPCU9IGNvbXB1dGVkLnBsdWdpbnMucG9zdHMuc291cmNlICU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwlIGlmIChjb21wdXRlZC5wbHVnaW5zLnBvc3RzLnBvc3RzLmxlbmd0aCkgeyAlPlxyXG4gICAgICAgICAgICAgICAgICA8JSBmb3IgKGNvbnN0IHt0aXRsZSwgZGF0ZX0gb2YgY29tcHV0ZWQucGx1Z2lucy5wb3N0cy5wb3N0cykgeyAlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBwb3N0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCI+PHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNNC43NSAwYS43NS43NSAwIDAxLjc1Ljc1VjJoNVYuNzVhLjc1Ljc1IDAgMDExLjUgMFYyaDEuMjVjLjk2NiAwIDEuNzUuNzg0IDEuNzUgMS43NXYxMC41QTEuNzUgMS43NSAwIDAxMTMuMjUgMTZIMi43NUExLjc1IDEuNzUgMCAwMTEgMTQuMjVWMy43NUMxIDIuNzg0IDEuNzg0IDIgMi43NSAySDRWLjc1QS43NS43NSAwIDAxNC43NSAwem0wIDMuNWg4LjVhLjI1LjI1IDAgMDEuMjUuMjVWNmgtMTFWMy43NWEuMjUuMjUgMCAwMS4yNS0uMjVoMnptLTIuMjUgNHY2Ljc1YzAgLjEzOC4xMTIuMjUuMjUuMjVoMTAuNWEuMjUuMjUgMCAwMC4yNS0uMjVWNy41aC0xMXpcIi8+PC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5mb3NcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGVcIj48JT0gZGF0ZSAlPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj48JT0gdGl0bGUgJT48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8JSB9ICU+XHJcbiAgICAgICAgICAgICAgICA8JSB9IGVsc2UgeyAlPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCI+PHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNMS43NSAxLjVhLjI1LjI1IDAgMDAtLjI1LjI1djkuNWMwIC4xMzguMTEyLjI1LjI1LjI1aDJhLjc1Ljc1IDAgMDEuNzUuNzV2Mi4xOWwyLjcyLTIuNzJhLjc1Ljc1IDAgMDEuNTMtLjIyaDYuNWEuMjUuMjUgMCAwMC4yNS0uMjV2LTkuNWEuMjUuMjUgMCAwMC0uMjUtLjI1SDEuNzV6TTAgMS43NUMwIC43ODQuNzg0IDAgMS43NSAwaDEyLjVDMTUuMjE2IDAgMTYgLjc4NCAxNiAxLjc1djkuNUExLjc1IDEuNzUgMCAwMTE0LjI1IDEzSDguMDZsLTIuNTczIDIuNTczQTEuNDU3IDEuNDU3IDAgMDEzIDE0LjU0M1YxM0gxLjc1QTEuNzUgMS43NSAwIDAxMCAxMS4yNXYtOS41ek05IDlhMSAxIDAgMTEtMiAwIDEgMSAwIDAxMiAwem0tLjI1LTUuMjVhLjc1Ljc1IDAgMDAtMS41IDB2Mi41YS43NS43NSAwIDAwMS41IDB2LTIuNXpcIj48L3BhdGg+PC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgTm8gcmVjZW50IHBvc3RzXHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPCUgfSAlPlxyXG4gICAgICAgICAgICAgIDwlIH0gJT5cclxuICAgICAgICAgICAgPC9zZWN0aW9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9zZWN0aW9uPlxyXG4gICAgICA8JSB9ICU+XHJcblxyXG4gICAgICA8JSBpZiAoYmFzZS5tZXRhZGF0YSkgeyAlPlxyXG4gICAgICAgIDxmb290ZXI+XHJcbiAgICAgICAgICA8c3Bhbj5UaGVzZSBtZXRyaWNzIDwlPSAhY29tcHV0ZWQudG9rZW4uc2NvcGVzLmluY2x1ZGVzKFwicmVwb1wiKSA/IFwiZG9lcyBub3QgaW5jbHVkZVwiIDogXCJpbmNsdWRlc1wiICU+IHByaXZhdGUgY29udHJpYnV0aW9uczwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuPkxhc3QgdXBkYXRlZCA8JT0gbmV3IERhdGUoKSAlPjwvc3Bhbj5cclxuICAgICAgICA8L2Zvb3Rlcj5cclxuICAgICAgPCUgfSAlPlxyXG5cclxuICAgIDwvZGl2PlxyXG4gIDwvZm9yZWlnbk9iamVjdD5cclxuPC9zdmc+Iiwic3R5bGUiOiIvKiBTVkcgZ2xvYmFsIGNvbnRleHQgKi9cclxuICBzdmcge1xyXG4gICAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgU2Vnb2UgVUksIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYsIEFwcGxlIENvbG9yIEVtb2ppLCBTZWdvZSBVSSBFbW9qaTtcclxuICAgIGZvbnQtc2l6ZTogMTRweDtcclxuICAgIGNvbG9yOiAjNzc3Nzc3O1xyXG4gIH1cclxuXHJcbi8qIEhlYWRlcnMgKi9cclxuICBoMSwgaDIsIGgzIHtcclxuICAgIG1hcmdpbjogOHB4IDAgMnB4O1xyXG4gICAgcGFkZGluZzogMDtcclxuICAgIGNvbG9yOiAjMDM2NmQ2O1xyXG4gICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcclxuICB9XHJcbiAgaDEgc3ZnLCBoMiBzdmcsIGgzIHN2ZyB7XHJcbiAgICBmaWxsOiBjdXJyZW50Q29sb3I7XHJcbiAgfVxyXG4gIGgxIHtcclxuICAgIGZvbnQtc2l6ZTogMjBweDtcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG4gIH1cclxuICBoMiB7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbiAgfVxyXG4gIGgzIHtcclxuICAgIGZvbnQtc2l6ZTogMTRweDtcclxuICB9XHJcblxyXG4vKiBGaWVsZHMgKi9cclxuICBzZWN0aW9uID4gLmZpZWxkIHtcclxuICAgIG1hcmdpbi1sZWZ0OiA1cHg7XHJcbiAgICBtYXJnaW4tcmlnaHQ6IDVweDtcclxuICB9XHJcbiAgLmZpZWxkIHtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgbWFyZ2luLWJvdHRvbTogMnB4O1xyXG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcclxuICB9XHJcbiAgLmZpZWxkIHN2ZyB7XHJcbiAgICBtYXJnaW46IDAgOHB4O1xyXG4gICAgZmlsbDogIzk1OWRhNTtcclxuICAgIGZsZXgtc2hyaW5rOiAwO1xyXG4gIH1cclxuICAuZmllbGQuZXJyb3Ige1xyXG4gICAgY29sb3I6ICNjYjI0MzE7XHJcbiAgfVxyXG4gIC5maWVsZC5lcnJvciBzdmcge1xyXG4gICAgZmlsbDogI2NiMjQzMTtcclxuICB9XHJcblxyXG4vKiBEaXNwbGF5cyAqL1xyXG4gIC5yb3cge1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICB9XHJcbiAgLnJvdyBzZWN0aW9uIHtcclxuICAgIGZsZXg6IDEgMSAwO1xyXG4gIH1cclxuICAuY29sdW1uIHtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICB9XHJcbiAgLmNlbnRlciB7XHJcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICB9XHJcbiAgLmhvcml6b250YWwge1xyXG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1hcm91bmQ7XHJcbiAgfVxyXG4gIC5ob3Jpem9udGFsLXdyYXAge1xyXG4gICAgZmxleC13cmFwOiB3cmFwO1xyXG4gIH1cclxuICAuaG9yaXpvbnRhbCAuZmllbGQge1xyXG4gICAgZmxleDogMSAxIDA7XHJcbiAgfVxyXG4gIC5uby13cmFwIHtcclxuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XHJcbiAgfVxyXG4gIC5maWxsLXdpZHRoIHtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gIH1cclxuXHJcbi8qIFVzZXIgYXZhdGFyICovXHJcbiAgLmF2YXRhciB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwO1xyXG4gICAgYm9yZGVyLXJhZGl1czogNTAlO1xyXG4gICAgbWFyZ2luOiAwIDZweDtcclxuICB9XHJcblxyXG4vKiBDb21taXQgY2FsZW5kYXIgKi9cclxuICAuY2FsZW5kYXIuZmllbGQge1xyXG4gICAgbWFyZ2luOiA0cHggMDtcclxuICAgIG1hcmdpbi1sZWZ0OiA3cHg7XHJcbiAgfVxyXG4gIC5jYWxlbmRhciAuZGF5IHtcclxuICAgIG91dGxpbmU6IDFweCBzb2xpZCByZ2JhKDI3LDMxLDM1LC4wNCk7XHJcbiAgICBvdXRsaW5lLW9mZnNldDogLTFweDtcclxuICB9XHJcblxyXG4vKiBQcm9ncmVzcyBiYXJzICovXHJcbiAgc3ZnLmJhciB7XHJcbiAgICBtYXJnaW46IDRweCAwO1xyXG4gIH1cclxuXHJcbi8qIExhbmd1YWdlICovXHJcbiAgLmZpZWxkLmxhbmd1YWdlIHtcclxuICAgIG1hcmdpbjogMCA4cHg7XHJcbiAgICBmbGV4LWdyb3c6IDA7XHJcbiAgfVxyXG5cclxuICAuZmllbGQubGFuZ3VhZ2Ugc21hbGwge1xyXG4gICAgbWFyZ2luLWxlZnQ6IDRweDtcclxuICAgIG9wYWNpdHk6IC43O1xyXG4gIH1cclxuXHJcbi8qIEhhYml0cyAqL1xyXG4gIC5oYWJpdHMge1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xyXG4gICAgcGFkZGluZy1sZWZ0OiAzN3B4O1xyXG4gIH1cclxuXHJcbi8qIEZvb3RlciAqL1xyXG4gIGZvb3RlciB7XHJcbiAgICBtYXJnaW4tdG9wOiA4cHg7XHJcbiAgICBmb250LXNpemU6IDEwcHg7XHJcbiAgICBmb250LXN0eWxlOiBpdGFsaWM7XHJcbiAgICBvcGFjaXR5OiAwLjU7XHJcbiAgICB0ZXh0LWFsaWduOiByaWdodDtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcclxuICB9XHJcblxyXG4vKiBTcGVlZCB0ZXN0IGNhdGVnb3JpZXMgKi9cclxuICAuY2F0ZWdvcmllcyB7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYXJvdW5kO1xyXG4gICAgbWFyZ2luLXRvcDogNHB4O1xyXG4gIH1cclxuICAuY2F0ZWdvcmllIHtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgIGZsZXg6IDEgMSAwO1xyXG4gIH1cclxuXHJcbi8qIEdhdWdlcyAqL1xyXG4gIC5nYXVnZSB7XHJcbiAgICBzdHJva2UtbGluZWNhcDogcm91bmQ7XHJcbiAgICBmaWxsOiBub25lO1xyXG4gIH1cclxuICAuZ2F1Z2UuaGlnaCB7XHJcbiAgICBjb2xvcjogIzE4YjY2MztcclxuICB9XHJcbiAgLmdhdWdlLmF2ZXJhZ2Uge1xyXG4gICAgY29sb3I6ICNmYjhjMDA7XHJcbiAgfVxyXG4gIC5nYXVnZS5sb3cge1xyXG4gICAgY29sb3I6ICNlNTM5MzU7XHJcbiAgfVxyXG4gIC5nYXVnZS1iYXNlLCAuZ2F1Z2UtYXJjIHtcclxuICAgIHN0cm9rZTogY3VycmVudENvbG9yO1xyXG4gICAgc3Ryb2tlLXdpZHRoOiAxMDtcclxuICB9XHJcbiAgLmdhdWdlLWJhc2Uge1xyXG4gICAgc3Ryb2tlLW9wYWNpdHk6IC4yO1xyXG4gIH1cclxuICAuZ2F1Z2UtYXJjIHtcclxuICAgIGZpbGw6IG5vbmU7XHJcbiAgICBzdHJva2UtZGFzaG9mZnNldDogMDtcclxuICAgIGFuaW1hdGlvbi1kZWxheTogMjUwbXM7XHJcbiAgICBhbmltYXRpb246IGFuaW1hdGlvbi1nYXVnZSAxcyBlYXNlIGZvcndhcmRzXHJcbiAgfVxyXG4gIC5nYXVnZSB0ZXh0IHtcclxuICAgIGZpbGw6IGN1cnJlbnRDb2xvcjtcclxuICAgIGZvbnQtc2l6ZTogNDBweDtcclxuICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XHJcbiAgICB0ZXh0LWFuY2hvcjogbWlkZGxlO1xyXG4gICAgZm9udC13ZWlnaHQ6IDYwMDtcclxuICB9XHJcbiAgLmdhdWdlIC50aXRsZSB7XHJcbiAgICBmb250LXNpemU6IDE4cHg7XHJcbiAgICBjb2xvcjogIzc3Nzc3NztcclxuICB9XHJcbiAgQGtleWZyYW1lcyBhbmltYXRpb24tZ2F1Z2Uge1xyXG4gICAgZnJvbSB7XHJcbiAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IDAgMzI5O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbi8qIE11c2ljIHBsdWdpbiAqL1xyXG4gIC50cmFja2xpc3Qge1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcclxuICAgIG1hcmdpbi1sZWZ0OiAyOHB4O1xyXG4gICAgbWFyZ2luLXRvcDogNHB4O1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgfVxyXG4gIC50cmFjayB7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gICAgbWFyZ2luLWJvdHRvbTogNHB4O1xyXG4gIH1cclxuICAudHJhY2sgaW1nIHtcclxuICAgIG1hcmdpbjogMCAxMHB4O1xyXG4gICAgYm9yZGVyLXJhZGl1czogN3B4O1xyXG4gIH1cclxuICAudHJhY2sgLm5hbWUge1xyXG4gICAgZm9udC1zaXplOiAxNHB4O1xyXG4gICAgbGluZS1oZWlnaHQ6IDE0cHg7XHJcbiAgfVxyXG4gIC50cmFjayAuYXJ0aXN0IHtcclxuICAgIGZvbnQtc2l6ZTogMTJweDtcclxuICAgIG9wYWNpdHk6IC43O1xyXG4gIH1cclxuXHJcbi8qIFBvc3RzIHBsdWdpbiAqL1xyXG4gIC5wb3N0IHtcclxuICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xyXG4gIH1cclxuICAucG9zdCAuaW5mb3Mge1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIG1hcmdpbi1ib3R0b206IDRweDtcclxuICB9XHJcbiAgLnBvc3QgLmluZm9zIC50aXRsZSB7XHJcbiAgICBmb250LXNpemU6IDE0cHg7XHJcbiAgICB3aWR0aDogNDAwcHg7XHJcbiAgICB3aGl0ZS1zcGFjZTogbm9ybWFsO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xyXG4gICAgbWF4LWhlaWdodDogNDBweDs7XHJcbiAgfVxyXG4gIC5wb3N0IC5pbmZvcyAuZGF0ZSB7XHJcbiAgICBmbGV4LXNocmluazogMDtcclxuICAgIGZvbnQtc2l6ZTogMTJweDtcclxuICAgIG9wYWNpdHk6IC43O1xyXG4gICAgd2lkdGg6IDQwcHg7XHJcbiAgfVxyXG5cclxuLyogRmFkZSBhbmltYXRpb24gKi9cclxuICAuYWYge1xyXG4gICAgb3BhY2l0eTogMDtcclxuICAgIGFuaW1hdGlvbjogYW5pbWF0aW9uLWZhZGUgMXMgZWFzZSBmb3J3YXJkcztcclxuICB9XHJcbiAgQGtleWZyYW1lcyBhbmltYXRpb24tZmFkZSB7XHJcbiAgICBmcm9tIHtcclxuICAgICAgb3BhY2l0eTogMDtcclxuICAgIH1cclxuICAgIHRvIHtcclxuICAgICAgb3BhY2l0eTogMTtcclxuICAgIH1cclxuICB9XHJcblxyXG4vKiBDYWxlbmRhciAqL1xyXG4gIDpyb290IHtcclxuICAgIC0tY29sb3ItY2FsZW5kYXItZ3JhcGgtZGF5LWJnOiAjZWJlZGYwO1xyXG4gICAgLS1jb2xvci1jYWxlbmRhci1ncmFwaC1kYXktYm9yZGVyOiByZ2JhKDI3LDMxLDM1LDAuMDYpO1xyXG4gICAgLS1jb2xvci1jYWxlbmRhci1ncmFwaC1kYXktTDEtYmc6ICM5YmU5YTg7XHJcbiAgICAtLWNvbG9yLWNhbGVuZGFyLWdyYXBoLWRheS1MMi1iZzogIzQwYzQ2MztcclxuICAgIC0tY29sb3ItY2FsZW5kYXItZ3JhcGgtZGF5LUwzLWJnOiAjMzBhMTRlO1xyXG4gICAgLS1jb2xvci1jYWxlbmRhci1ncmFwaC1kYXktTDQtYmc6ICMyMTZlMzk7XHJcbiAgICAtLWNvbG9yLWNhbGVuZGFyLWhhbGxvd2Vlbi1ncmFwaC1kYXktTDEtYmc6ICNmZmVlNGE7XHJcbiAgICAtLWNvbG9yLWNhbGVuZGFyLWhhbGxvd2Vlbi1ncmFwaC1kYXktTDItYmc6ICNmZmM1MDE7XHJcbiAgICAtLWNvbG9yLWNhbGVuZGFyLWhhbGxvd2Vlbi1ncmFwaC1kYXktTDMtYmc6ICNmZTk2MDA7XHJcbiAgICAtLWNvbG9yLWNhbGVuZGFyLWhhbGxvd2Vlbi1ncmFwaC1kYXktTDQtYmc6ICMwMzAwMWM7XHJcbiAgICAtLWNvbG9yLWNhbGVuZGFyLWdyYXBoLWRheS1MNC1ib3JkZXI6IHJnYmEoMjcsMzEsMzUsMC4wNik7XHJcbiAgICAtLWNvbG9yLWNhbGVuZGFyLWdyYXBoLWRheS1MMy1ib3JkZXI6IHJnYmEoMjcsMzEsMzUsMC4wNik7XHJcbiAgICAtLWNvbG9yLWNhbGVuZGFyLWdyYXBoLWRheS1MMi1ib3JkZXI6IHJnYmEoMjcsMzEsMzUsMC4wNik7XHJcbiAgICAtLWNvbG9yLWNhbGVuZGFyLWdyYXBoLWRheS1MMS1ib3JkZXI6IHJnYmEoMjcsMzEsMzUsMC4wNik7XHJcbiAgfSIsImZvbnRzIjoiIn0sInRlcm1pbmFsIjp7InF1ZXJ5IjoicXVlcnkgTWV0cmljcyB7XHJcbiAgdXNlcihsb2dpbjogJGxvZ2luKSB7XHJcbiAgICBkYXRhYmFzZUlkXHJcbiAgICBuYW1lXHJcbiAgICBsb2dpblxyXG4gICAgY3JlYXRlZEF0XHJcbiAgICBhdmF0YXJVcmxcclxuICAgIHdlYnNpdGVVcmxcclxuICAgIGdpc3RzIHtcclxuICAgICAgdG90YWxDb3VudFxyXG4gICAgfVxyXG4gICAgcmVwb3NpdG9yaWVzKGxhc3Q6ICRyZXBvc2l0b3JpZXMsIGlzRm9yazogZmFsc2UsIG93bmVyQWZmaWxpYXRpb25zOiBPV05FUikge1xyXG4gICAgICB0b3RhbENvdW50XHJcbiAgICAgIHRvdGFsRGlza1VzYWdlXHJcbiAgICAgIG5vZGVzIHtcclxuICAgICAgICBuYW1lXHJcbiAgICAgICAgd2F0Y2hlcnMge1xyXG4gICAgICAgICAgdG90YWxDb3VudFxyXG4gICAgICAgIH1cclxuICAgICAgICBzdGFyZ2F6ZXJzIHtcclxuICAgICAgICAgIHRvdGFsQ291bnRcclxuICAgICAgICB9XHJcbiAgICAgICAgbGFuZ3VhZ2VzKGZpcnN0OiA0KSB7XHJcbiAgICAgICAgICBlZGdlcyB7XHJcbiAgICAgICAgICAgIHNpemVcclxuICAgICAgICAgICAgbm9kZSB7XHJcbiAgICAgICAgICAgICAgY29sb3JcclxuICAgICAgICAgICAgICBuYW1lXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaXNzdWVzX29wZW46IGlzc3VlcyhzdGF0ZXM6IE9QRU4pIHtcclxuICAgICAgICAgIHRvdGFsQ291bnRcclxuICAgICAgICB9XHJcbiAgICAgICAgaXNzdWVzX2Nsb3NlZDogaXNzdWVzKHN0YXRlczogQ0xPU0VEKSB7XHJcbiAgICAgICAgICB0b3RhbENvdW50XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHByX29wZW46IHB1bGxSZXF1ZXN0cyhzdGF0ZXM6IE9QRU4pIHtcclxuICAgICAgICAgIHRvdGFsQ291bnRcclxuICAgICAgICB9XHJcbiAgICAgICAgcHJfbWVyZ2VkOiBwdWxsUmVxdWVzdHMoc3RhdGVzOiBNRVJHRUQpIHtcclxuICAgICAgICAgIHRvdGFsQ291bnRcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9ya0NvdW50XHJcbiAgICAgICAgbGljZW5zZUluZm8ge1xyXG4gICAgICAgICAgc3BkeElkXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBwYWNrYWdlcyB7XHJcbiAgICAgIHRvdGFsQ291bnRcclxuICAgIH1cclxuICAgIHN0YXJyZWRSZXBvc2l0b3JpZXMge1xyXG4gICAgICB0b3RhbENvdW50XHJcbiAgICB9XHJcbiAgICB3YXRjaGluZyB7XHJcbiAgICAgIHRvdGFsQ291bnRcclxuICAgIH1cclxuICAgIHNwb25zb3JzaGlwc0FzU3BvbnNvciB7XHJcbiAgICAgIHRvdGFsQ291bnRcclxuICAgIH1cclxuICAgIHNwb25zb3JzaGlwc0FzTWFpbnRhaW5lciB7XHJcbiAgICAgIHRvdGFsQ291bnRcclxuICAgIH1cclxuICAgIGNvbnRyaWJ1dGlvbnNDb2xsZWN0aW9uIHtcclxuICAgICAgdG90YWxSZXBvc2l0b3JpZXNXaXRoQ29udHJpYnV0ZWRDb21taXRzXHJcbiAgICAgIHRvdGFsQ29tbWl0Q29udHJpYnV0aW9uc1xyXG4gICAgICByZXN0cmljdGVkQ29udHJpYnV0aW9uc0NvdW50XHJcbiAgICAgIHRvdGFsSXNzdWVDb250cmlidXRpb25zXHJcbiAgICAgIHRvdGFsUHVsbFJlcXVlc3RDb250cmlidXRpb25zXHJcbiAgICAgIHRvdGFsUHVsbFJlcXVlc3RSZXZpZXdDb250cmlidXRpb25zXHJcbiAgICB9XHJcbiAgICBjYWxlbmRhcjpjb250cmlidXRpb25zQ29sbGVjdGlvbihmcm9tOiAkY2FsZW5kYXIuZnJvbSwgdG86ICRjYWxlbmRhci50bykge1xyXG4gICAgICBjb250cmlidXRpb25DYWxlbmRhciB7XHJcbiAgICAgICAgd2Vla3Mge1xyXG4gICAgICAgICAgY29udHJpYnV0aW9uRGF5cyB7XHJcbiAgICAgICAgICAgIGNvbG9yXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXBvc2l0b3JpZXNDb250cmlidXRlZFRvIHtcclxuICAgICAgdG90YWxDb3VudFxyXG4gICAgfVxyXG4gICAgZm9sbG93ZXJzIHtcclxuICAgICAgdG90YWxDb3VudFxyXG4gICAgfVxyXG4gICAgZm9sbG93aW5nIHtcclxuICAgICAgdG90YWxDb3VudFxyXG4gICAgfVxyXG4gICAgaXNzdWVDb21tZW50cyB7XHJcbiAgICAgIHRvdGFsQ291bnRcclxuICAgIH1cclxuICAgIG9yZ2FuaXphdGlvbnMge1xyXG4gICAgICB0b3RhbENvdW50XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsImltYWdlIjoiPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCI0ODBcIiBoZWlnaHQ9XCI8JT0gNDhcclxuICArICghIWJhc2UuaGVhZGVyKSo2MlxyXG4gICsgKCEhYmFzZS5tZXRhZGF0YSkqMTA4XHJcbiAgKyAoISFiYXNlLmFjdGl2aXR5KSoxMDhcclxuICArICghIWJhc2UuY29tbXVuaXR5KSo5NFxyXG4gICsgKCEhYmFzZS5yZXBvc2l0b3JpZXMpKjE0MlxyXG4gICsgKCghIWJhc2UucmVwb3NpdG9yaWVzKSooISFjb21wdXRlZC5wbHVnaW5zLnRyYWZmaWMpKSoxOFxyXG4gICsgKCghIWJhc2UucmVwb3NpdG9yaWVzKSooISFjb21wdXRlZC5wbHVnaW5zLmZvbGxvd3VwKSkqMTAyXHJcbiAgKyAoKCEhYmFzZS5yZXBvc2l0b3JpZXMpKighIWNvbXB1dGVkLnBsdWdpbnMubGluZXMpKSozNFxyXG4gICsgKCEhY29tcHV0ZWQucGx1Z2lucy5wYWdlc3BlZWQpKjExMFxyXG4gICsgKCEhY29tcHV0ZWQucGx1Z2lucy5sYW5ndWFnZXMpKjEyNFxyXG4gICsgTWF0aC5tYXgoMCwgKCgoISFiYXNlLm1ldGFkYXRhKSsoISFiYXNlLmhlYWRlcikrKCghIWJhc2UuYWN0aXZpdHkpfHwoISFiYXNlLmNvbW11bml0eSkpKyghIWJhc2UucmVwb3NpdG9yaWVzKSsoISFjb21wdXRlZC5wbHVnaW5zLnBhZ2VzcGVlZCkrKCEhY29tcHV0ZWQucGx1Z2lucy5sYW5ndWFnZXMpKS0xKSkqMjBcclxuJT5cIj5cclxuICA8JVxyXG4gICAgbWV0YS4kID0gYDxzcGFuIGNsYXNzPVwicHMxLXBhdGhcIj4ke2Ake3VzZXIubG9naW59YC50b0xvY2FsZUxvd2VyQ2FzZSgpfUBtZXRyaWNzPC9zcGFuPjo8c3BhbiBjbGFzcz1cInBzMS1sb2NhdGlvblwiPn48L3NwYW4+JHtjb21wdXRlZC50b2tlbi5zY29wZXMuaW5jbHVkZXMoXCJyZXBvXCIpID8gXCIjXCIgOiBcIiRcIn1gXHJcbiAgICBtZXRhLmFuaW1hdGlvbnMgPSAhbWV0YS5wbGFjZWhvbGRlciA/IHtzdGRpbjouMTYsIHN0ZG91dDouMjgsIGxlbmd0aDooMitPYmplY3Qua2V5cyhiYXNlKS5sZW5ndGgrT2JqZWN0LmtleXMoY29tcHV0ZWQucGx1Z2lucykubGVuZ3RoKX0gOiB7c3RkaW46MCwgc3Rkb3V0OjAsIGxlbmd0aDowfVxyXG4gICU+XHJcblxyXG4gIDxkZWZzPjxzdHlsZT48JT0gZm9udHMgJT48L3N0eWxlPjwvZGVmcz5cclxuXHJcbiAgPHN0eWxlPlxyXG4gICAgPCU9IHN0eWxlICU+XHJcbiAgICAgIC5zdGRpbiwgLnN0ZG91dCB7XHJcbiAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiA8JT0gbWV0YS5hbmltYXRpb25zLnN0ZGluICU+cztcclxuICAgICAgfVxyXG4gICAgICAuc3Rkb3V0IHtcclxuICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IDwlPSBtZXRhLmFuaW1hdGlvbnMuc3Rkb3V0ICU+cztcclxuICAgICAgfVxyXG4gICAgICA8JSBmb3IgKGxldCBpID0gMCwgZCA9IDA7IGkgPCBtZXRhLmFuaW1hdGlvbnMubGVuZ3RoOyBpKyssIGQrPW1ldGEuYW5pbWF0aW9ucy5zdGRpbittZXRhLmFuaW1hdGlvbnMuc3Rkb3V0KSB7ICU+XHJcbiAgICAgICAgLnN0ZGluOm50aC1vZi10eXBlKDwlPSBpKzEgJT4pIHtcclxuICAgICAgICAgIGFuaW1hdGlvbi1kZWxheTogPCU9IGQgJT5zO1xyXG4gICAgICAgIH1cclxuICAgICAgICAuc3Rkb3V0Om50aC1vZi10eXBlKDwlPSBpKzIgJT4pIHtcclxuICAgICAgICAgIGFuaW1hdGlvbi1kZWxheTogPCU9IGQrbWV0YS5hbmltYXRpb25zLnN0ZGluICU+cztcclxuICAgICAgICB9XHJcbiAgICAgICAgPCUgaWYgKGkgPT09IG1ldGEuYW5pbWF0aW9ucy5sZW5ndGgtMSkgeyAlPlxyXG4gICAgICAgICAgZm9vdGVyIHtcclxuICAgICAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiA8JT0gZCAlPnM7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgPCUgfSAlPlxyXG4gICAgICA8JSB9ICU+XHJcbiAgPC9zdHlsZT5cclxuXHJcbiAgPGZvcmVpZ25PYmplY3QgeD1cIjBcIiB5PVwiMFwiIHdpZHRoPVwiMTAwJVwiIGhlaWdodD1cIjEwMCVcIj5cclxuICAgIDxkaXYgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCI+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyXCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aXRsZVwiPjwvc3Bhbj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYnV0dG9uc1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImJ1dHRvblwiPuKUgDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImJ1dHRvblwiPuKWoTwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImJ1dHRvbiBleGl0XCI+4pyVPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuPHByZT48JSMgLSU+XHJcbjwlIGlmIChiYXNlLm1ldGFkYXRhKSB7ICU+XHJcbjxkaXYgY2xhc3M9XCJiYW5uZXJcIj48JSMgLSU+XHJcbkdpdEh1YiBtZXRyaWNzIGdlbmVyYXRvciA8JT0gbWV0YS52ZXJzaW9uICU+XHJcblRoZXNlIGdlbmVyYXRlZCBtZXRyaWNzIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOT1xyXG5XQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgYXBwbGljYWJsZSBsYXcuXHJcblxyXG5MYXN0IGdlbmVyYXRlZDogPCU9IG5ldyBEYXRlKCkudG9HTVRTdHJpbmcoKSAlPlxyXG48L2Rpdj48JSB9IC0lPlxyXG48JSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtJT5cclxuPCUgaWYgKGJhc2UuaGVhZGVyKSB7ICU+XHJcbjxkaXYgY2xhc3M9XCJzdGRpblwiPjwlLSBtZXRhLiQgJT4gd2hvYW1pPC9kaXY+PCUjIC0lPlxyXG48ZGl2IGNsYXNzPVwic3Rkb3V0XCI+PCUjIC0lPlxyXG48Yj48JT0gdXNlci5uYW1lIHx8IHVzZXIubG9naW4gJT48L2I+IHJlZ2lzdGVyZWQ9PCU9IGNvbXB1dGVkLnJlZ2lzdHJhdGlvbi5tYXRjaCgvXi4rPyBbeW1dLylbMF0ucmVwbGFjZSgvIC9nLCBcIlwiKSAlPiwgdWlkPTwlPSBgJHt1c2VyLmRhdGFiYXNlSWR9YC5zdWJzdHIoLTQpICU+LCBnaWQ9PCU9IHVzZXIub3JnYW5pemF0aW9ucy50b3RhbENvdW50ICU+XHJcbiAgY29udHJpYnV0ZWQgdG8gPCU9IHVzZXIucmVwb3NpdG9yaWVzQ29udHJpYnV0ZWRUby50b3RhbENvdW50ICU+IHJlcG9zaXRvcjwlPSBzKHVzZXIucmVwb3NpdG9yaWVzQ29udHJpYnV0ZWRUby50b3RhbENvdW50LCBcInlcIikgJT4gPGI+PCUgZm9yIChjb25zdCBbeCwge2NvbG9yfV0gb2YgT2JqZWN0LmVudHJpZXMoY29tcHV0ZWQuY2FsZW5kYXIpKSB7IC0lPjxzcGFuIHN0eWxlPVwiY29sb3I6PCU9IGNvbG9yICU+XCI+Izwvc3Bhbj48JSB9ICU+PC9iPlxyXG4gIGZvbGxvd2VkIGJ5IDxiPjwlPSB1c2VyLmZvbGxvd2Vycy50b3RhbENvdW50ICU+PC9iPiB1c2VyPCU9IHModXNlci5mb2xsb3dlcnMudG90YWxDb3VudCkgJT5cclxuPC9kaXY+PCUgfSAtJT5cclxuPCUjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLSU+XHJcbjwlIGlmICgoYmFzZS5hY3Rpdml0eSl8fChiYXNlLmNvbW11bml0eSkpIHsgJT5cclxuPGRpdiBjbGFzcz1cInN0ZGluXCI+PCUtIG1ldGEuJCAlPiBnaXQgc3RhdHVzPC9kaXY+PCUjIC0lPlxyXG48ZGl2IGNsYXNzPVwic3Rkb3V0XCI+PCUjIC0lPlxyXG48JSBpZiAoYmFzZS5hY3Rpdml0eSkgeyAtJT5cclxuPGI+UmVjZW50IGFjdGl2aXR5PC9iPlxyXG4gIDxiPjwlPSBgJHtjb21wdXRlZC5jb21taXRzfWAucGFkU3RhcnQoNSkgJT48L2I+IGNvbW1pdDwlPSBzKGNvbXB1dGVkLmNvbW1pdHMpICU+XHJcbiAgPGI+PCU9IGAke3VzZXIuY29udHJpYnV0aW9uc0NvbGxlY3Rpb24udG90YWxQdWxsUmVxdWVzdFJldmlld0NvbnRyaWJ1dGlvbnN9YC5wYWRTdGFydCg1KSAlPjwvYj4gcHVsbCByZXF1ZXN0PCU9IHModXNlci5jb250cmlidXRpb25zQ29sbGVjdGlvbi50b3RhbFB1bGxSZXF1ZXN0UmV2aWV3Q29udHJpYnV0aW9ucykgJT4gcmV2aWV3ZWRcclxuICA8Yj48JT0gYCR7dXNlci5jb250cmlidXRpb25zQ29sbGVjdGlvbi50b3RhbFB1bGxSZXF1ZXN0Q29udHJpYnV0aW9uc31gLnBhZFN0YXJ0KDUpICU+PC9iPiBwdWxsIHJlcXVlc3Q8JT0gcyh1c2VyLmNvbnRyaWJ1dGlvbnNDb2xsZWN0aW9uLnRvdGFsUHVsbFJlcXVlc3RDb250cmlidXRpb25zKSAlPiBvcGVuZWRcclxuICA8Yj48JT0gYCR7dXNlci5jb250cmlidXRpb25zQ29sbGVjdGlvbi50b3RhbElzc3VlQ29udHJpYnV0aW9uc31gLnBhZFN0YXJ0KDUpICU+PC9iPiBpc3N1ZTwlPSBzKHVzZXIuY29udHJpYnV0aW9uc0NvbGxlY3Rpb24udG90YWxJc3N1ZUNvbnRyaWJ1dGlvbnMpICU+IG9wZW5lZFxyXG4gIDxiPjwlPSBgJHt1c2VyLmlzc3VlQ29tbWVudHMudG90YWxDb3VudH1gLnBhZFN0YXJ0KDUpICU+PC9iPiBpc3N1ZSBjb21tZW50PCU9IHModXNlci5pc3N1ZUNvbW1lbnRzLnRvdGFsQ291bnQpICU+XHJcbjwlIH0gLSU+XHJcbjwlIGlmICgoYmFzZS5hY3Rpdml0eSkmJihiYXNlLmNvbW11bml0eSkpIHsgLSU+XHJcblxyXG48JSB9IC0lPlxyXG48JSBpZiAoYmFzZS5jb21tdW5pdHkpIHsgLSU+XHJcbjxiPlRyYWNrZWQgYWN0aXZpdHk8L2I+XHJcbiAgPGI+PCU9IGAke3VzZXIuZm9sbG93aW5nLnRvdGFsQ291bnR9YC5wYWRTdGFydCg1KSAlPjwvYj4gdXNlcjwlPSBzKHVzZXIuZm9sbG93ZXJzLnRvdGFsQ291bnQpICU+IGZvbGxvd2VkXHJcbiAgPGI+PCU9IGAke2NvbXB1dGVkLnNwb25zb3JzaGlwc31gLnBhZFN0YXJ0KDUpICU+PC9iPiByZXBvc2l0b3I8JT0gcyhjb21wdXRlZC5zcG9uc29yc2hpcHMsIFwieVwiKSAlPiBzcG9uc29yZWRcclxuICA8Yj48JT0gYCR7dXNlci5zdGFycmVkUmVwb3NpdG9yaWVzLnRvdGFsQ291bnR9YC5wYWRTdGFydCg1KSAlPjwvYj4gcmVwb3NpdG9yPCU9IHModXNlci5zdGFycmVkUmVwb3NpdG9yaWVzLnRvdGFsQ291bnQsIFwieVwiKSAlPiBzdGFycmVkXHJcbiAgPGI+PCU9IGAke3VzZXIud2F0Y2hpbmcudG90YWxDb3VudH1gLnBhZFN0YXJ0KDUpICU+PC9iPiByZXBvc2l0b3I8JT0gcyh1c2VyLndhdGNoaW5nLnRvdGFsQ291bnQsIFwieVwiKSAlPiB3YXRjaGVkXHJcbjwlIH0gLSU+XHJcbjwvZGl2PjwlIH0gLSU+XHJcbjwlIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0lPlxyXG48JSBpZiAoYmFzZS5yZXBvc2l0b3JpZXMpIHsgJT5cclxuPGRpdiBjbGFzcz1cInN0ZGluXCI+PCUtIG1ldGEuJCAlPiBscyAtbGggZ2l0aHViL3JlcG9zaXRvcmllczwvZGl2PjwlIyAtJT5cclxuPGRpdiBjbGFzcz1cInN0ZG91dFwiPjwlIyAtJT5cclxuVG90YWwgPCU9IHVzZXIucmVwb3NpdG9yaWVzLnRvdGFsQ291bnQgJT4gcmVwb3NpdG9yPCU9IHModXNlci5yZXBvc2l0b3JpZXMudG90YWxDb3VudCwgXCJ5XCIpICU+IC0gPCU9IGNvbXB1dGVkLmRpc2tVc2FnZSAlPlxyXG48JSBpZiAoY29tcHV0ZWQucGx1Z2lucy50cmFmZmljKSB7IGlmIChjb21wdXRlZC5wbHVnaW5zLnRyYWZmaWMuZXJyb3IpIHsgLSU+XHJcbi0tLS0gIDxiPiAgICAgPC9iPiAgdmlld3MgPHNwYW4gY2xhc3M9XCJlcnJvclwiPig8JT0gY29tcHV0ZWQucGx1Z2lucy50cmFmZmljLmVycm9yLm1lc3NhZ2UgJT4pPC9zcGFuPlxyXG48JSB9IGVsc2UgeyAtJT5cclxuLXItLSAgPGI+PCU9IGAke2NvbXB1dGVkLnBsdWdpbnMudHJhZmZpYy52aWV3cy5jb3VudH1gLnBhZFN0YXJ0KDUpICU+PC9iPiAgdmlld3NcclxuPCUgfX0gLSU+XHJcbi1yLS0gIDxiPjwlPSBgJHtjb21wdXRlZC5yZXBvc2l0b3JpZXMuc3RhcmdhemVyc31gLnBhZFN0YXJ0KDUpICU+PC9iPiAgc3RhcmdhemVyPCU9IHMoY29tcHV0ZWQucmVwb3NpdG9yaWVzLnN0YXJnYXplcnMpICU+XHJcbi1yLS0gIDxiPjwlPSBgJHtjb21wdXRlZC5yZXBvc2l0b3JpZXMuZm9ya3N9YC5wYWRTdGFydCg1KSAlPjwvYj4gIGZvcms8JT0gcyhjb21wdXRlZC5yZXBvc2l0b3JpZXMuZm9ya3MpICU+XHJcbi1yLS0gIDxiPjwlPSBgJHtjb21wdXRlZC5yZXBvc2l0b3JpZXMud2F0Y2hlcnN9YC5wYWRTdGFydCg1KSAlPjwvYj4gIHdhdGNoZXI8JT0gcyhjb21wdXRlZC5yZXBvc2l0b3JpZXMud2F0Y2hlcnMpICU+XHJcbmRyLXggIDxiPjwlPSBgJHt1c2VyLnBhY2thZ2VzLnRvdGFsQ291bnR9YC5wYWRTdGFydCg1KSAlPjwvYj4gIHBhY2thZ2U8JT0gcyh1c2VyLnBhY2thZ2VzLnRvdGFsQ291bnQpICU+XHJcbmRyLXggIDxiPjwlPSBgJHt1c2VyLmdpc3RzLnRvdGFsQ291bnR9YC5wYWRTdGFydCg1KSAlPjwvYj4gIGdpc3Q8JT0gcyh1c2VyLmdpc3RzLnRvdGFsQ291bnQpICU+XHJcbjwlIGlmIChjb21wdXRlZC5wbHVnaW5zLmZvbGxvd3VwKSB7IGlmIChjb21wdXRlZC5wbHVnaW5zLmZvbGxvd3VwLmVycm9yKSB7IC0lPlxyXG5kLS0tICA8Yj4gICAgIDwvYj4gIElTU1VFUyA8c3BhbiBjbGFzcz1cImVycm9yXCI+KDwlPSBjb21wdXRlZC5wbHVnaW5zLmZvbGxvd3VwLmVycm9yLm1lc3NhZ2UgJT4pPC9zcGFuPlxyXG5kLS0tICA8Yj4gICAgIDwvYj4gIFBVTExfUkVRVUVTVFMgPHNwYW4gY2xhc3M9XCJlcnJvclwiPig8JT0gY29tcHV0ZWQucGx1Z2lucy5mb2xsb3d1cC5lcnJvci5tZXNzYWdlICU+KTwvc3Bhbj5cclxuPCUgfSBlbHNlIHsgLSU+XHJcbmRyLXggIDxiPjwlPSBgJHtjb21wdXRlZC5wbHVnaW5zLmZvbGxvd3VwLmlzc3Vlcy5jb3VudH1gLnBhZFN0YXJ0KDUpICU+PC9iPiAgSVNTVUVTXHJcbi1yLS0gIDxiPjwlPSBgJHtjb21wdXRlZC5wbHVnaW5zLmZvbGxvd3VwLmlzc3Vlcy5vcGVufWAucGFkU3RhcnQoNSkgJT48L2I+ICDilJzilIDilIAgb3BlblxyXG4tci0tICA8Yj48JT0gYCR7Y29tcHV0ZWQucGx1Z2lucy5mb2xsb3d1cC5pc3N1ZXMuY2xvc2VkfWAucGFkU3RhcnQoNSkgJT48L2I+ICDilJTilIDilIAgY2xvc2VkXHJcbmRyLXggIDxiPjwlPSBgJHtjb21wdXRlZC5wbHVnaW5zLmZvbGxvd3VwLmlzc3Vlcy5jb3VudH1gLnBhZFN0YXJ0KDUpICU+PC9iPiAgUFVMTF9SRVFVRVNUU1xyXG4tci0tICA8Yj48JT0gYCR7Y29tcHV0ZWQucGx1Z2lucy5mb2xsb3d1cC5wci5vcGVufWAucGFkU3RhcnQoNSkgJT48L2I+ICDilJzilIDilIAgb3BlblxyXG4tci0tICA8Yj48JT0gYCR7Y29tcHV0ZWQucGx1Z2lucy5mb2xsb3d1cC5wci5tZXJnZWR9YC5wYWRTdGFydCg1KSAlPjwvYj4gIOKUlOKUgOKUgCBtZXJnZWRcclxuPCUgfX0gLSU+XHJcbjwlIGlmIChjb21wdXRlZC5saWNlbnNlcy5mYXZvcml0ZS5sZW5ndGgpIHsgLSU+XHJcbmRyLXggICAgICAgICBMSUNFTlNFXHJcbi1yLS0gICAgICAgICDilJTilIDilIAgPCU9IGNvbXB1dGVkLmxpY2Vuc2VzLmZhdm9yaXRlICU+XHJcbjwlIH0gLSU+XHJcbjwlIGlmIChjb21wdXRlZC5wbHVnaW5zLmxpbmVzKSB7IGlmIChjb21wdXRlZC5wbHVnaW5zLmxpbmVzLmVycm9yKSB7ICU+XHJcbjxzcGFuIGNsYXNzPVwiZGlmZiBlcnJvclwiPkBAIDwlPSBjb21wdXRlZC5wbHVnaW5zLmxpbmVzLmVycm9yLm1lc3NhZ2UgJT4gQEA8L3NwYW4+PCUgfSBlbHNlIHsgJT5cclxuPHNwYW4gY2xhc3M9XCJkaWZmXCI+QEAgLTwlPSBjb21wdXRlZC5wbHVnaW5zLmxpbmVzLmRlbGV0ZWQgJT4gKzwlPSBjb21wdXRlZC5wbHVnaW5zLmxpbmVzLmFkZGVkICU+IEBAPC9zcGFuPlxyXG48JSB9fSAtJT5cclxuPC9kaXY+PCUgfSAtJT5cclxuPCUjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLSU+XHJcbjwlIGlmIChjb21wdXRlZC5wbHVnaW5zLmxhbmd1YWdlcykgeyAlPlxyXG48ZGl2IGNsYXNzPVwic3RkaW5cIj48JS0gbWV0YS4kICU+IGxvY2FsZTwvZGl2PjwlIyAtJT5cclxuPGRpdiBjbGFzcz1cInN0ZG91dFwiPjwlIyAtJT5cclxuPCUgaWYgKGNvbXB1dGVkLnBsdWdpbnMubGFuZ3VhZ2VzLmVycm9yKSB7IC0lPlxyXG48c3BhbiBjbGFzcz1cImVycm9yXCI+PCU9IGNvbXB1dGVkLnBsdWdpbnMubGFuZ3VhZ2VzLmVycm9yLm1lc3NhZ2UgJT48L3NwYW4+PCUjIC0lPlxyXG48JSB9IGVsc2UgeyBmb3IgKGNvbnN0IHtuYW1lLCB2YWx1ZX0gb2YgY29tcHV0ZWQucGx1Z2lucy5sYW5ndWFnZXMuZmF2b3JpdGVzKSB7IC0lPlxyXG48Yj48JT0gbmFtZS50b0xvY2FsZVVwcGVyQ2FzZSgpLnBhZEVuZCgxMikgJT48L2I+IFs8JT0gXCIjXCIucmVwZWF0KE1hdGguY2VpbCgxMDAqdmFsdWUvNSkpLnBhZEVuZCgyMCkgJT5dIDwlPSAoMTAwKnZhbHVlKS50b0ZpeGVkKDIpLnBhZEVuZCg1KSAlPiVcclxuPCUgfX0gLSU+XHJcbjwvZGl2PjwlIH0gLSU+XHJcbjwlIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0lPlxyXG48JSBpZiAoY29tcHV0ZWQucGx1Z2lucy5wYWdlc3BlZWQpIHsgJT5cclxuPGRpdiBjbGFzcz1cInN0ZGluXCI+PCUtIG1ldGEuJCAlPiBjdXJsIC1JIDwlPSB1c2VyLndlYnNpdGVVcmwgJT48L2Rpdj48JSMgLSU+XHJcbjxkaXYgY2xhc3M9XCJzdGRvdXRcIj48JSMgLSU+XHJcbjwlIGlmIChjb21wdXRlZC5wbHVnaW5zLnBhZ2VzcGVlZC5lcnJvcikgeyAtJT5cclxuPHNwYW4gY2xhc3M9XCJlcnJvclwiPjwlPSBjb21wdXRlZC5wbHVnaW5zLnBhZ2VzcGVlZC5lcnJvci5tZXNzYWdlICU+PC9zcGFuPjwlIH0gZWxzZSB7IC0lPlxyXG48Yj5Vc2VyLUFnZW50PC9iPjogR29vZ2xlIFBhZ2VTcGVlZCBBUElcclxuPGI+TG9jYXRpb248L2I+OiA8JT0gdXNlci53ZWJzaXRlVXJsICU+XHJcbjwlIGZvciAoY29uc3Qge3Njb3JlLCB0aXRsZX0gb2YgY29tcHV0ZWQucGx1Z2lucy5wYWdlc3BlZWQuc2NvcmVzKSB7IC0lPlxyXG48Yj48JT0gYFgtJHt0aXRsZS5yZXBsYWNlKC8gL2csIFwiLVwiKX1gICU+PC9iPjogPCU9ICFOdW1iZXIuaXNOYU4oc2NvcmUpID8gTWF0aC5yb3VuZChzY29yZSoxMDApIDogXCItXCIgJT4lXHJcbjwlIH19IC0lPlxyXG48L2Rpdj48JSB9IC0lPlxyXG48JSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtJT5cclxuPCUgaWYgKGJhc2UubWV0YWRhdGEpIHsgLSU+XHJcblxyXG48Zm9vdGVyPkNvbm5lY3Rpb24gcmVzZXQgYnkgPCU9IE1hdGguZmxvb3IoMjU2Kk1hdGgucmFuZG9tKCkpICU+LjwlPSBNYXRoLmZsb29yKDI1NipNYXRoLnJhbmRvbSgpKSAlPi48JT0gTWF0aC5mbG9vcigyNTYqTWF0aC5yYW5kb20oKSkgJT4uPCU9IE1hdGguZmxvb3IoMjU2Kk1hdGgucmFuZG9tKCkpICU+PC9mb290ZXI+PCUjIC0lPlxyXG48JSB9IC0lPjwvcHJlPlxyXG5cclxuICAgIDwvZGl2PlxyXG4gIDwvZm9yZWlnbk9iamVjdD5cclxuPC9zdmc+XHJcblxyXG4iLCJzdHlsZSI6Ii8qIFNWRyBnbG9iYWwgY29udGV4dCAqL1xyXG4gIHN2ZyB7XHJcbiAgICBmb250LWZhbWlseTogJ0NvdXJpZXIgUHJpbWUnO1xyXG4gICAgZm9udC1zaXplOiAxNHB4O1xyXG4gICAgY29sb3I6ICM3Nzc3Nzc7XHJcbiAgfVxyXG5cclxuLyogVGl0bGUgYmFyICovXHJcbiAgLmhlYWRlciB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDIwcHg7XHJcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgcGFkZGluZzogMCA4cHg7XHJcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNXB4O1xyXG4gICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDVweDtcclxuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgjNTA0YjQ1IDAlLCMzYzNiMzcgMTAwJSk7XHJcbiAgfVxyXG5cclxuICAudGl0bGUge1xyXG4gICAgY29sb3I6ICNkNWQwY2U7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbiAgfVxyXG5cclxuICAuYnV0dG9ucyB7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICB9XHJcblxyXG4gIC5idXR0b24ge1xyXG4gICAgY29sb3I6IGJsYWNrO1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gICAgbWFyZ2luLXJpZ2h0OiA1cHg7XHJcbiAgICBmb250LXNpemU6IDhweDtcclxuICAgIGhlaWdodDogMTJweDtcclxuICAgIHdpZHRoOiAxMnB4O1xyXG4gICAgYm9yZGVyLXJhZGl1czogMTAwJTtcclxuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgjN2Q3ODcxIDAlLCAjNTk1OTUzIDEwMCUpO1xyXG4gICAgdGV4dC1zaGFkb3c6IDBweCAxcHggMHB4IHJnYmEoMjU1LDI1NSwyNTUsMC4yKTtcclxuICB9XHJcblxyXG4gIC5idXR0b24uZXhpdCB7XHJcbiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoI2YzNzQ1OCAwJSwgI2RlNGMxMiAxMDAlKTtcclxuICB9XHJcblxyXG4vKiBUZXJtaW5hbCAqL1xyXG4gIHByZSwgLmJhbm5lciwgZm9vdGVyIHtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIGZvbnQtZmFtaWx5OiAnQ291cmllciBQcmltZSc7XHJcbiAgICBjb2xvcjogI0RERERERDtcclxuICB9XHJcbiAgcHJlIHtcclxuICAgIGJhY2tncm91bmQ6ICM0MjA5MkI7XHJcbiAgICBwYWRkaW5nOiAxMnB4O1xyXG4gICAgYm9yZGVyLXJhZGl1czogNXB4O1xyXG4gIH1cclxuICAuYmFubmVyLCBmb290ZXIge1xyXG4gICAgY29sb3I6ICNBRTlEQTc7XHJcbiAgfVxyXG5cclxuLyogUHJvbXB0ICovXHJcbiAgLnBzMS1wYXRoIHtcclxuICAgIGNvbG9yOiAjN0VEQTI5O1xyXG4gIH1cclxuXHJcbiAgLnBzMS1sb2NhdGlvbiB7XHJcbiAgICBjb2xvcjogIzQ4NzhjMDtcclxuICB9XHJcblxyXG4vKiBEaWZmICovXHJcbiAgLmRpZmYge1xyXG4gICAgY29sb3I6ICMzQTk2REQ7XHJcbiAgfVxyXG5cclxuLyogRXJyb3IgKi9cclxuICAuZXJyb3Ige1xyXG4gICAgY29sb3I6ICNjYjI0MzE7XHJcbiAgfVxyXG5cclxuLyogQW5pbWF0aW9ucyAqL1xyXG4gIC5zdGRpbiwgZm9vdGVyIHtcclxuICAgIHdpZHRoOiAwJTtcclxuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gICAgYW5pbWF0aW9uLW5hbWU6IHN0ZGluLWFuaW1hdGlvbjtcclxuICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGJvdGg7XHJcbiAgfVxyXG5cclxuICAuc3Rkb3V0IHtcclxuICAgIG1heC1oZWlnaHQ6IDAlO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICAgIGFuaW1hdGlvbi1uYW1lOiBzdGRvdXQtYW5pbWF0aW9uO1xyXG4gICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogYm90aDtcclxuICB9XHJcblxyXG4gIEBrZXlmcmFtZXMgc3RkaW4tYW5pbWF0aW9uIHtcclxuICAgIDAlIHsgd2lkdGg6IDAlOyB9XHJcbiAgICAxMDAlIHsgd2lkdGg6IDEwMCU7IH1cclxuICB9XHJcblxyXG4gIEBrZXlmcmFtZXMgc3Rkb3V0LWFuaW1hdGlvbiB7XHJcbiAgICAwJSB7IG1heC1oZWlnaHQ6IDA7IH1cclxuICAgIDEwMCUgeyBtYXgtaGVpZ2h0OiAzNjBweDsgfVxyXG4gIH1cclxuXHJcbi8qIENhbGVuZGFyICovXHJcbiAgOnJvb3Qge1xyXG4gICAgLS1jb2xvci1jYWxlbmRhci1ncmFwaC1kYXktYmc6ICNlYmVkZjA7XHJcbiAgICAtLWNvbG9yLWNhbGVuZGFyLWdyYXBoLWRheS1ib3JkZXI6IHJnYmEoMjcsMzEsMzUsMC4wNik7XHJcbiAgICAtLWNvbG9yLWNhbGVuZGFyLWdyYXBoLWRheS1MMS1iZzogIzliZTlhODtcclxuICAgIC0tY29sb3ItY2FsZW5kYXItZ3JhcGgtZGF5LUwyLWJnOiAjNDBjNDYzO1xyXG4gICAgLS1jb2xvci1jYWxlbmRhci1ncmFwaC1kYXktTDMtYmc6ICMzMGExNGU7XHJcbiAgICAtLWNvbG9yLWNhbGVuZGFyLWdyYXBoLWRheS1MNC1iZzogIzIxNmUzOTtcclxuICAgIC0tY29sb3ItY2FsZW5kYXItaGFsbG93ZWVuLWdyYXBoLWRheS1MMS1iZzogI2ZmZWU0YTtcclxuICAgIC0tY29sb3ItY2FsZW5kYXItaGFsbG93ZWVuLWdyYXBoLWRheS1MMi1iZzogI2ZmYzUwMTtcclxuICAgIC0tY29sb3ItY2FsZW5kYXItaGFsbG93ZWVuLWdyYXBoLWRheS1MMy1iZzogI2ZlOTYwMDtcclxuICAgIC0tY29sb3ItY2FsZW5kYXItaGFsbG93ZWVuLWdyYXBoLWRheS1MNC1iZzogIzAzMDAxYztcclxuICAgIC0tY29sb3ItY2FsZW5kYXItZ3JhcGgtZGF5LUw0LWJvcmRlcjogcmdiYSgyNywzMSwzNSwwLjA2KTtcclxuICAgIC0tY29sb3ItY2FsZW5kYXItZ3JhcGgtZGF5LUwzLWJvcmRlcjogcmdiYSgyNywzMSwzNSwwLjA2KTtcclxuICAgIC0tY29sb3ItY2FsZW5kYXItZ3JhcGgtZGF5LUwyLWJvcmRlcjogcmdiYSgyNywzMSwzNSwwLjA2KTtcclxuICAgIC0tY29sb3ItY2FsZW5kYXItZ3JhcGgtZGF5LUwxLWJvcmRlcjogcmdiYSgyNywzMSwzNSwwLjA2KTtcclxuICB9IiwiZm9udHMiOiJAZm9udC1mYWNlIHtcclxuICBmb250LWZhbWlseTogJ0NvdXJpZXIgUHJpbWUnO1xyXG4gIHNyYzogdXJsKCdkYXRhOmFwcGxpY2F0aW9uL2ZvbnQtd29mZjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHUmdBQkFBQUFBRCtrQUJJQUFBQUFjYkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQkdSbFJOQUFBL2lBQUFBQndBQUFBY2lUdjBNVWRFUlVZQUFENjBBQUFBS0FBQUFDb0Evd0UxUjFCUFV3QUFQMVFBQUFBeUFBQUFRQmFiS0poSFUxVkNBQUErM0FBQUFIZ0FBQUNpWjRkeXhVOVRMeklBQUFJTUFBQUFUd0FBQUdCdzFvL1dZMjFoY0FBQUF5QUFBQUN1QUFBQlVzUnRXeUpqZG5RZ0FBQUxhQUFBQUVNQUFBQnNKdUVRaFdad1oyMEFBQVBRQUFBRzhnQUFEaFdlTmhQT1oyRnpjQUFBUHF3QUFBQUlBQUFBQ0FBQUFCQm5iSGxtQUFBTWdBQUFMM3dBQUZkUWcrSEVybWhsWVdRQUFBR1VBQUFBTmdBQUFEWVhtUnFzYUdobFlRQUFBY3dBQUFBZ0FBQUFKQXNQQWZsb2JYUjRBQUFDWEFBQUFNRUFBQURZTDNRZHcyeHZZMkVBQUF1c0FBQUEwZ0FBQU5JdkJCbCtiV0Y0Y0FBQUFld0FBQUFnQUFBQUlBSFJBZ1p1WVcxbEFBQTcvQUFBQWNRQUFBT1RBVnl1cG5CdmMzUUFBRDNBQUFBQTdBQUFBVWxrWDhUeWNISmxjQUFBQ3NRQUFBQ2lBQUFBdlZxeDN6c0FBUUFBQUFNRW0xT3V3elJmRHp6MUFCOElBQUFBQUFEWm5JUGhBQUFBQU5uN1NVZi81UDVsQk9nRmh3QUFBQWdBQWdBQUFBQUFBSGphWTJCa1lHQnorT3ZDd01CeTV2K1QvMDlZWGpBQVJWQUFDd0NwRkFjUUFBRUFBQUJvQUhBQUJRQXZBQUlBQWdBc0FGb0FqUUFBQUtZQkNnQUNBQUY0Mm1OZ1lUbkRPSUdCbFlHQjFaamxEQU1EdzB3SXpYU0dvWWxKQzhobllPVmtnQUZtQmlRUUdCcm95SENBUVlGaEE1dkRYeGNHQnZZY1pnVUZCb2JKWUlWeldCWURLUVVHWmdCbi9ReWlBSGphWXpuRE1KVUJDRmpPUUREalM0Yi9ERFlNbXhtTUdDWXpQbVhVWk14bTJNK3dpckVFaU84ekhHUFl3M0NIWVRkUVpES1FkWkxoS2NNNWhnT005eGs3R0dvWlZqR3NaL2dIMU1YRkVNQlFCc1FnbUFURUp4aUt3V3c1QmplR0NDQU53dk1ZcW9BOHJ2L2ZnT3B0R0pZemVqR21NYno0LzRUUmtxR2RRWldoSGdnbkFXMnBaL0FGa3ZzWW5CazIvdjhEWkxlQTVTWUQzVmJLNE1GZ0JOVHRCdFMvaVdFamt6VERPNFpwRE4vKy8vNy9tMEdFWVI4VE84TnVBQkZVUGtrQUFBQjQybU5nWUdCbWdHQVpCa1lHRVBBQjhoakJmQllHQXlETkFZUk1RRHFhb1k1aHcvLy9RSllDUXl5STlmL3gvMGYvTjBKMWdRRWpHd09jeXdqU3c4U0FDb0NTekN5c2JPd2NuRnpjUEx4OC9BS0NRc0lpb21MaUVwSlMwakt5Y3ZJS2lrcktLcXBxNmhxYVd0bzZ1bnI2Qm9aR3hpYW1adVlXbGxiV05yWjJEUFlPams3T0xxNXU3aDZlWHQ0K3ZuNytBWUZCd1NHaFllRVJrVkhSTWJGeDhRa01CRUVpQTAwQkFCVk5INWdBQUhqYXJWZHJXeHZIRlo3VkRZd0JBNUt3bTNYZFVjYWlManVTU2VzNHhGWWNzc3VpT0VwU2dYRzc2elR0TGhMdS9aTDBScS9wL2FMOG1iT2lmZXA4eTAvTGUyWldDampnUG4yZThrSG5uWmwzNWx6bnpFSkNTeElQb3pDV3N2ZEVMTzcycVBMZ1VVUzNYTG9SSjQvbDZHRkVoV2I2MGF5WUZZT0JPbkFiRFJJeGlVQnRqNFVqZ3NSdmthTkpKbzliVk5DcW9Sb3RLbW81UEM3VzZzSVBxQnJJSlBHelFpM3dzMll4b0VLd2Z5UnBYZ0VFNlpCSy9hTnhvVkRBTWRRNHZOcmcyZkZpM2ZHdlNrRGxqNnRPRld1S1JEODZqTWVyVHNFb0xHa3FlbFFQSXRaSHEwR1FFMXc1bFBSeG4wcHJqOFkzbklVZ0hJUlVDYU1HRlp2eDNqc1J5TzRva3RUdlkyb0xiTnBrdEJuSE1yTnNXSFFEVS9sSTBnYXZiekR6NDM0a0VZMVJLbW11SHlXWWtidzJ4K2cybzl1Sm04Ung3Q0phTkI4TVNPeEZKSHBNYm1Eczl1Z2FvMnU5OU1tU0dERGpTVmtjeFBFd2pjbng0amozSUpaRCtLUDh1RVZsTFdGQnFabkNwNW1nSDlHTThtbFcrY2dBdGlRdHFwaHdJeEp5bU0wYytKSVgyVjNYbXMrL1ZFekNBWlhYRzFnTTVFaU9vQ3ZiS0RjUm9kMG82YnZwWGh5cHVCRkwybm9RWWMzbHVPU210R2hHMDRYQUc0dUNUZk1zaHNwWEtCZmxwMVE0ZUV6T0FJYlF6SHFMTG1qSjFpN0NyWkk0a0h3Q2JTVXhVNUp0WSsyY0hsOVlGRUhvcnplbWhYTlJueTZrZVh1SzQ4R0VBSzRuTWh5cGxKTnFnaTFjVGdoSkYwWk9yRVJxVmJwdFZTeWNzNTJ1WTVkd1AzWHQ1S1pGYlJ3NlhwZ1h4UkJhWE5XSTExSEVsM1JXS0lRMFRMZGJ0S1JCbFpJdUJXL3dBUURJRUMzeGFBK2pKWk92WlJ5MFpJSWlFWU1CTk5OeWtNaFJJbWtaWVd2Uml1N3RSMWxwdUIxZnA0VkRkZFNpcXU3dFJyMEhkdEp0WUw1cTVtczZFeXZCd3loYldRbklTWDFhOXZqS29iVDg3QkwvTE9HSG5GWGtvdGpzUnhtSEQvNzZJMlFZYXBmV0d3cmJKdGkxNjd3Rk41bG5ZbmpTaGYxZHpKNU8xamtweklTb0tzUXJJSEZ2N0RpT3lWWmRpMHdVd3YySVZwUXZRMXBFK1Mwb2xCeEtzWWFaQkRiODU4b1ZSeXlMcXZCOW55TlJneUZZeTJxekhuM291YzhqYnF0d3R1NjE2TExPSEpaWEVIaVduOU5aa2VWek9pdXhkSFZXWm5sVlp4V1duOWZaRE10ck9wdGwrUVdkWFdEcGFUVkpCRlVTaEZ6Sk5qbnY4clZwa1Q2eHVEcGRmTTh1dGs0c3JrMFgzN2VMVWd1NjVKM25NUHY2Yitzck8zclN2d2I4azdEcmVmakhVc0UvbHRmaEg4c20vR081QnY5WWZoSCtzYndCLzFoK0NmNnhYSWQvTE50YWRremwzdFJRZXlXUjZINU9FcGpjNGphMnVYZzNOTjMwNkNZdTVndTRFMTE1VGxwVnVxbTR3eitUNGJMM1g1N2tPbHVzaEZ4NjlNSjZWbmJxWVlUdXlGNSs1VVI0enVQYzB2SkZZL21MT00xeXdzL3F4UDA5MHhhZUY2di9FdnkzZlU5dFpyZWNPdnQ2Ry9HQUEyZmJqMXVUYnJib0pkMiszR25SNW4ram9zSUhvTCtNRkluVnBtekxMdmNHaFBiK2FOUlZYVFNUQ0M4ZzJpK2VwazNIcWRjUTRUdG9ZcXQwR2JRUyttclQwTEo1NGRQRndEc2N0WldVblJIT3ZIdWFKdHYyUEtyZ051UnNTUWszbDYzZDZMZ2t5OUk5THEyVm40dDlicmx6Nk43SzdGQTdDVldDcCs5dHdtM1BQaytsSUJrcUt1TjF4WElwU0YzZ2hGdmUwM3RTbUlhSFFPMGd4d29hZHZqcG1ndU1GcHgzaGhKbG0yc0ZseGpKS0tQZ3lwODVGU2V5RVUwMm9vamZ2S1YrcWd1RjBKbkVRbUsydkpiSFFuVVFwbGVtU3pSbjFuZFVsNVZ5RnU5TlE4ak8yRWlUMkkvYXNvT1huYTNQSnlYYmxhZUNLazJNN3AvOGlMRkpQS3ZhODJ3cEx2bFhUMWdTVE5LVjhKZk8weTVQVXJ5Ri90SG1LTzdRNVNEcXUzaGNaU2R1Wnh0T0RmZjJ0Vk9yZTI3LzFLcC81dDVuN1FnMDNmR2VwWEJiMDExdkJOdTR4dURVdVZRa3RFMGIyQkVhbDdrKzEyemtVM3lwK2RaMUxsQ0Y2OVBHemJQbjcraHNEby9PWk12L1dOTGQvMWNWczAvY3h6b0tyZXBFdlRUaTNNNHVHdkFkYnhLVjF6RzY2elZVSHBmY20ya0k3aU1FZFh2dDhWbUNHMTV0MDIzYzhqZk9tZS9oT0tkV3BaZUEzOVQwTXNSYkhNVVE0Wlk3ZUlFbjBYcGJjMEhUVzRCZjFXTWhkZ0Q2QUE2RFhUMTJ6TXdlZ0psNXdKd3V3RDV6R0R4a0RvT3ZNWWZCMS9VeGVtRUFGQUU1QnNYNjJMRnpqNERzM0R2TWN4aDlnM2tHdmNzOGc3N0pQSU8reFRwRGdJUjFNa2haSjRNRDFzbGd3SnpYQVliTVlYRElIQWFQbWNQZzI4YXViYUR2R0xzWWZkZll4ZWg3eGk1RzN6ZDJNZnFCc1l2UkQ0MWRqSDVrN0dMMFk4UzRNMDNnVDh5SXRnRGZzL0Exd1BjNTZHYmtZL1JUdkxVNTUyY1dNdWZuaHVQa25GOWc4eXZUVTM5cFJtYkhrWVc4NDFjV012M1hPQ2NuL01aQ0p2eldRaWI4RHR4NzAvTitiMGFHL29HRlRQK0RoVXovSTNibWhEOVp5SVEvVzhpRXY0RDc2dlM4djVxUm9mL05RcWIvM1VLbS93TTdjOEkvTFdUQ3lFSW1mS2pIRjgwbkxsWGNjYWxRRFBIZkU5cGc3SHMwZTBqRjYvMmp5V1BkK2dUMW9BUDZBQUI0Mm1QdzNzRndJaWhpSXlOalgrUUd4cDBjREJ3TXlRVWJHZGlkdGpCb1N6TXphSUdZMncxWUZEaUUySm01SUR3VEpnMDJTVll3ajh0cEQ0OERod1BMQVFabUJtNGduOWRwRDRNREdJTDRPNEVrZzh0R0ZjYU93SWdORGgwUklINkt5MFlORUg4SEJ3TkVnTUVsVW5xak9raG9GMGNEQXlPTFEwZHlDRXdDQkxZYk1TbXhpYkF5ODJudFlQemZ1b0dsZHlNVGc4dG0xaFEyQmhjWEFIMlZMZ2NBQUhqYVkyQWdBSXdna0dVbkF3UHpuUC9mL2hVaFdBenpnSEFLd3hTV3hRd01yQXJNY3hnWS90V3c3UHovaWpXWWVkUC9WLy9TWUhwWnpSZ2ZBL0ZGQU1tRUdZZ0FBQUFBaUFDSUFJZ0FpQURpQVBBQmtBSmlBd3dENmdRZ0JHUUVxZ1VvQlhBRm5nWElCZTRHTEFaMkJzQUhQQWU0Q0JJSWhBanFDVUFKdWdvZUNtQUtwZ3JrQ3lvTGFBdnlESjROQmcxc0RkZ09KZzdBRDB3UHhoQkNFSWdRM0JGMkVjWVNSQkxBRXdvVFloUXFGS3dWUUJXWUZlNFdRaGJDRjBRWHFoZ0FHRHdZZUJqQUdPb1pHQm5lR3B3YkJodkVIQ0ljcGgyRUhnd2VHQjRrSHJnZkNCL09JSElndWlGbUloSWlraU1tSTRRa0VpUm1KTllsVmlXNEpqb213aWIwSjNvbjJpZ29LTllwMkNyd0t6d3JhQ3VvQUFCNDJyVjhCM3djMWJYM3ZWTzNhRmZhMVJaSjI3UmR2YTU2VzNmWjZ1NnliRXR5bDhGTjJJQndFemJHZ0ttMkFadGdJTlFrTkdPRFFYVDRDQ1dVSkE4ZTVGRkNQZ0lFeUV2Z3ZjU0VJbzIrYysvTTdLNktiWDd2L1Q3L3JOblptVHV6OS9UL3VlZk1JQmJkS0gzR05mRTVLQm1sb2lxMEtEcS9QTitmemdrY2J1WXh4d2dNSnd6cVJFWmc0Zjh1RGNhSTRUQ3pWb3RaaE5oRjhNR2lidGhEYlJaTFNncENsaXBMWmFRa0srUnhwNlNtcEpwTmNGZERtVjZ3NXlLYmxiVUlmcTh2VkpZYUtTLzFzcWxldGp4VUZxbElaV0ZiWGxwaXN6dHdQWVpQcTBWa1UyRXIrSDFoUFJiOFhJR0xkZm1HWC9lUkQ3WXNueG5KWkE0RjJIZmZaWHhXY3pwLzU1MTh1dG5xWTk1OWx3MVlROW83NzlTRytCeFA4SWRwUVk4bnlEOFQ5UHpnNVFkKzJQK3R5Y0FKK0JaOGhCV05acjFPT29sYmRIcXpVV1NsZGRJYWdUT1lVbkdMZERJVk1makwwVytaUDNPbmtSRTUwWUxIZFN6RElveWJtNDdiMnhkSDdRZ2gzTXRoakFNdFBORE85Q0tHOFRPdGpxZ1ZEZ0lmTU9wTFBONFpOU2NuSTVUc1RIYllMSERIcEtDZ0lid1FXU1AyKzBKaE5sUmVnODAyRnliVWh1b3dNSUo1MXNJVU02Nk1EQTh1WWl6MlBiaW1adXBVK09OT3AyV00xTm5UMCszTS84bElHMDUzK1c3eHVlaG1kQlNOTXEremIzS25VL3hJTjVxQlVBcUxkT2h6UlA0eHFIYjBLKzU2YmdnMW9UYTBPTHBnVmkyajFYbHRETXN3elNrR1BhczFhaGlFdFdpZEtWbGtzY0F4REF2eVRjSTZYUllsTVp0dGJXNUdxTG10dWEyMUJXNHlaOGEwYUVOMVpWbXBOeEQwVy8wQmI4Q3M4UkR4V29SY0xGTDV3WTVNSHhHdk43NUxQNERnQ25Vbk5TWndiM3kzRkZkNFJlNENvTzNGNk5PRXhFL21jWjVVWng3VEpQMmc3dDFCanY4NitoejUrTFJEUHRpSWVYWHZtRFFRbFg2TXNyM2VjTmg3bW15azUxSk03alJXaHozeHZkaEpYQ0Vma3Y0YTM1TzJuejVOK01laWs2Tjd1UXcrRTgxQzdhZ1QzUk4xOEN5alFSYU1OWXZicXEwY2o2dXdsczhLTVl5V0J5M0pCQzNKMDJNTlJwcE9BVFFDOHdqM0lWN0w4SjFKV0F1bXcycVpQc1N5WXE4T2kyS0FCZFVwZ1QzRWlwM251b3Bjd1BiQ1NMYWpNK3JzNkdoc1JLaWpzNk96c2IyeEhXWTMweDNNOGp1RFdRYU5DOFRod2phN2JGZXljb1ZEWWF2TjdzWldpeEdMVmtYZDRGaGM4VXJJYWJzcEZDN0FaUkdRQnJtYUVhd1dteDN1WkM0dmk0VGdIaVptbjdlN3c1ZWQ3Zk5sKzR5MTErMXVidTljZE4rRjNtRFF1Mk9CZk5pYXBuVnU2ZHd6YzNaSDE4L1hlSU4zcmMzTzhyZi9jMk5lZHQ0Q1B0UGpleWh0ZHI3ZjdmWS82M2RuYkhYOHkraDBiVnl5ZUY4emM4TG44ZmllU1Y5UVNVNSs0M2VuMnBvV0ptTjdpc3UxZHQ2aW5kR2YrenpTZ1JtMW1WbUdKUDNYSTkzenB2cnlqTWs2NmIrSWpIaFVBanArQytoNE12S2lZalFGZGFBVjBXNndaUjR6L0NCaU5ZS0dGUVlSaDVESW9iNGtMQnF3VmlOcSsvU1k1ekVJQXVPc0ZxVFJDTDFJRUxLRjFxbFRTMHA4UG9TbWRreHRuOU5ZTXFVa1dsM3BLL1lWNVdRNTBzMHA4Q1BHa0pHWXNjeE52MDloR0ZkYVlpY2FqQ203UWVGeHdBZ2ozS0RZOVRDaUFQdkhYMkZreHB6RzErNmFNMGY5enp4anowaExUeHUreVVZLzJmVWpKVlBEWWZVL2t6ZzBuSENDRzVxVGNHYlE0YkRaN2NNdjJ1QXp6Y2JXV3hLSGpyeVhPSFJQNGluaU53NEJUemNBVCt0UkkvcDcwL0ZpVU93MFBVYTRFak9vRWJQTUxMK1Y1ZGhDekhOOHMyUHlVeG80MVNsN3ppeFFhZ2FDeHlEY21lVVl0ZytjcXRpckJaWE9hdEZnanVON0JSQ0duMjkxeUQ5VmNzN3hDSWJUWFZWc2ptalJXUzVDc1dzU0pOMEpEaHFobWRPQnlEcC94QitvRG9SMHhIenNjWmNjOHZ1SUZHMTJYRjRCTGt2eGI0Sm9WMTJkcjVBSW5FaTB2Q0pFeFVxc2hvaTFBak9mM213bFZ0RzhvYUlqSnpzSEI3TXlrN0tPRWErMUxGQ3lZVDdaNlM5eUw5cjdVTi9SampYTFZzNDdzdXFkdW9LNVpSZDJTVDl5USt1U3c3dUpNU3dwTEdndGpIUVdTcWNXYjRESUZ2UmMwbjBKK2ZEMkhsbHljOWZxMjZac3Zicno0UHlSM1BPbVJlWVhiY1loSVBvejVuWG1MeEREa2xDNXpQNGtFcmk2R1JLNEVEREt6SkJvaFJlUkE2Z1g5c0NSUkhVd0pnbnBBaXpSN1hpRXFzSE1YNFFLMXU5MkJkZ0tvZkJ1N25TSlZKL2hkR2JnRjRtUWNMYjBTN2FYWDQwOHlITVM3amFIL3VCamNLOHcvTkpKK0x5dzgxR2JCV3RzdVlqNEdHSWhBdWk5bWU2Ukh3R0h3NVJGek9VVnJGR1g0dEtiREE5KzllVkRCcFBlbGFMVFgvTGVsVmYrWVlCZmJUTzcwaTNhZnVucTBWSHArbjZ0SmQxbHRnbXovNEhudnZvcW5uOTZOcG5IZVRDUHU1UjVhREdhVFgweG1VZE9mQjV1SjUySHpXeTFNSUpJQkV3TnRkeHNTbUhvSG9sQ2RtYnFINjY4OHIxTDlQSnNIdnJ5cXdlVjJmQzIwOUlEcjc0cVBmU1AyWUl5STd3WlFmakZXOVU1RVgrRTBYUDRLczRBdGxPRzVrZVRpekRpQ3NQKzlHUVdYRHNETVNJSEJKSktKSUF2QjRqRlpiVUFiRUM1UkM1VzJPTXdoL0Fna2N4bDlDd0hLTUlBZHkxREVYZWdBQUJFQmdVUXdYS0ZtNExJeTB6MWd5YUtpdTlwd0VHaWtUSTl2QXl4bU1QNWZBQWp1eWt0cUJOOG1kSlhMNlhudUROeTB2ZnZUOC9KY09la3Z5ajlaNlpQMEFYVFRIYU1BamcvaHhzcXlwRytHTkI1UGFsbVowZ28rMTI2SytpMkZwdytYV0IxQjEzcHZ5c1RRazV6cXNlckc4QnB2TTZmSmRQK0szUVY1K01Za0VOK05BZU1Ha0VRNHpCQUkzQU9lQzJ4Y29LT2VLWURSbnVRTytEM0IveWl4a0VnaE1sTGJjcnZOVkhqS3pONUtWQW85WnJJOUE5NGNCV3hHT2tWb3YzU0syUWZWM21DSERQeFdKQ09KZlBCVzZYM21iK0JWYVFnZDlRQmlnRmdEbEhsUnpIZEQ0VVlUUnJGTUNJTFAweXdTajBHdmYvQUxMNWpudDdJTE9jYzFoZHhLRFhabUN3NXMwdTRKUHhKcXBYU3lqQ2NqN2tLR1pBbjZreTBxVzV5dGcxKzM0RDBFV3BRTW1FS1BSd1A4eHdSeUd5Wkg1aXJ5SHpKSDUzdng0QS8vNGJ6NE1yMHFFMDFVT1JIcmZSdVNVSDVibU1nNDBNTkRZMk44SWZ6WEw0bnlFMmZrR2xITDB2SE9JSHZSeVpVZmtyUE1ES1FKUkFsaWR3NHAwV3gwcWlPYXVNK2FpVFVENWhRU2xpZHRvaFZCRWNBT3Z0dkVYYWtSL1Ric3lJc2N3ZDg4djF1dTBiNy9ZMHBGdklwbkpkaWtYSG4weEEvVW1oTTlxQzhhRGJCa2pKMEJsOE1VeUZFWmFOV2tqU2tlRkxjYVRZYVYyVjRUTTBUZnBLNmhmRlJrdm44aGI2KzV5Kzk5UG0rdmhjRzJ3YW1UeDlvazdmYzBGSHB5eWVla0w0NmVoVGJubmdDMjQ4ZTN2VDJ3WU52Yjl4SXRwc0lQejVFQ096eWFaaFJVVFRmQ0xBS2RBRTJMSU1CSmJBQWVEbkNpSjRZdjBFL3cvNUFoTmhjWUl3QVRhcWhWVkE3Qk0xbHZ5RWlYVTRWMFBDOXlaaHBOM3J3Z01WaWM2SFJLMVFCczB0K3BzdE9zL25NWHlTNU1vWlpLcU9uQUdSK0RYd3FST2MvNXNNY1MwUmtCQkVGRU95ekhNeU1xTlZtbUo4Y0k3T0kxSmdlTmZFSUpnd0Q3N0ZyOG5HZFVTTjhLMFFGZ1p3eXY1MmFHOEVpZ29pOUNTalJxMG9ad0o3ZkY0T0oxSTB3VHp6Y3Mvbzg2VGcrUVFJYWtEckg1MHJHVHl4dHVtakR4bDV5eUQ3N1YwdTRvWG0zYlZoei93YnAvbDBrY3IxSXFBNmw0R2VYNzJ4Y3RxRnlJemwyS0p4U1ZrTjk1T2hYN0g5VGZORVViU3pHQWk4QUdVd3pFZ0JRQ0J5UXc1Sk1oS0EyRnJnQ2FKZ1hlelZ5S0krckQyd2hkQWNDa1VqQW5xY2xvVnNtU3dWYWluOEhKMGcwaUlCWUNOaHk4a0cvSlZJSjhiMlVlZUdCNWUyenUxYjNQbm5waWxmYjNLYU16QlR6MUZ0YWQrelplK0ZzSXRxSy9nc3ZQSDhyQmNBRzQzWEh1YUdPRzFjdDNCa01IVnl6NGQ2bDA2dHRUb3NyeDFCY3RXM04ydk9Jdkh1V0x1Z05UeU5rYjdCbGFCZFR1emdFT2dnd0RRVlJGaXFQbG1aaEpPQm1FU05lZHBBYUxBaFpMUUQ1R2JZSFpPbG5nY1p3Q0VaRHBoWHhCbnhhalRNWFdVMHErckNXbGlRb1pnMHVpOG13Rkh0VDJabDNrbG5mZVJuMW0zUEo5ckRrODdsMCtGTmJTVWc2RHkvVWNFT3RJL3ZJWFAra0tpbnNlSTNNenozdWtRcjhqZXpUbjZheXVndEYwTXpvTkJGZ05TWnlZbm1CQmJ2aGVKYmJCWU5BZ0h3ZkRCZTdpWmg4QkhIUlBEaWJJV0tLb0JKL0tHQVArUUpVVFBLa1daRE01S0pTak4wblIybmlqMHU5N00yRWlnTERxZ3N1UHI1czNmTzdlbDVzODZRUUNVMDUwdFJ4Y1VQTnBqblR6eTlOOGVYNEdRdVRtYzNZdUx0b1VIaXVjczFqMjdZTnJZOVdXTjIyakZ4RFFmbVViYTF6K3FQK2dNN3R4Ly8wdTJWLzlScjRxeVR1U2NqNjgxQnR0RW9qVTRtQldrNm1pd1d6SWs0aWdTNFh1RmxYbmlzMzZJZkxIS0ZBUUtOSmwya1RJY3Nnd1hjTWRlWkFCUnFYRXJESEliaEszMHFmT0NOSEZtNThaUFdhcHdZMlBGN1pjZ2hQK1U0NnZIVkt3d1hOemYzMWRWdGF1U2REcFI0SE52N3JuZWx6bGordytmejdlMVoxWC9iYkIzSGtUZjNJdFJXOURUTTMxbGV1blQ1alhSV1YxMmRBQ3cveWNxQzVqd0V3WjRoUFNTSUFIbllCSXZkRElHQzdPYURHMXlMYmtTT2FMcDlDZ3hQT2RWTDA2RURwZm11WVYraExpQW5laEJ6U3kzN2hFcVNGMnJBamtNL2ptNldRN0N1WU80a28wbEorL0w5MnV5dk5xR2YvZkpEWXhMc1E4VmowRnVpV0JQYmdBQWhVZzZaSHAxZ0VRQWZFTVlNSU9JYnZFMm5rRU9USXdYR3E2ZWZsT1owSTVkWGtWVWRLbkxuT25JQVBicEVCVHNBKzNnbkkySHp5bklzWkp3L21yVi8yTEoyemJQUDZKN2R1ZlhMOTVxVnp1bnArdWE2K3Q3SnlaVzN0eXNySzN2clpteHNhTnMrV3Q5elFvaU5kSFlOWk9UZXRXSHZQOHVYM3JGMXhVMDdXWUVmWGtVV0g4K2RYbHM0dktwcGZXamsvWCtMTGUrdnJWMVJVcktpdjd5MG51dmI4NkpjY0N6UXJ1bWJDREFjRWN5QUNqZ0Y2ZVQ2bWEwcjRCM3JINmxvZ0VKWjFqV0EvaGhNRll2NFZlYmppek9rbDh3cFJMT201N3h5Z2NsaUgzWEdWazNWc050VTNib2hxbHZUR20zbzhYdWNPeXpvbTZ4dk1sbUlWOWw3QUpRNFM0emtWclFTSmo0YXNBRk1IWm9UWVkzUVlNNnlwRk1EUUdLK3VPZEM0dzR6OTVsYmdqUHJIYkk3RG1wSEx4MEFjbU1NVjB2c1FBTWtjM0NnbkdyYkxVWjJGdU02c2prOElndzl5TzIwV09nTit3Z3pNRTdDZk9va3JFekZnNGt5a1V4UHg0RTYwblhOeHFTaWQ0RUc5aGxoVU04RjBxSk11SE1JSTNPSE1wR0JUV1N6UVlnVzdoN0dzcHBoOXplUzFKV1dQOURCM1pDZlpBQW9QL3l2ZFprdG50VnhxYnByWmE1R2VsWjYxZU0xcHVUcThNeWt6UFQwekNlOGtPdlVyWE0zNTJMbFVGb0J1MVBYSXRTQUVrTVVpdWl6WlRialNwc2dqM1dxbThGU1lBRS9OWndhcnZvUjlkcTRhTXFUTkNSQVdxSHdZK05DbThzR2N6TVJBZDJjY2REdkRLdWdXNGtzbVdxd0dBY3hWQWRYRC83SlFiakIzalBUSTNHQzF6Q0NsV3Rxcm8vekFVL0ZVbVIvU1hzSUhhZlJiOW1YSWZjT1FNVjBjMVdWZ0JodkFCVExLRW00bzV1Y2c0aUorRjNGMzFOZ0NMY1R3dUY1d01YNE9IR0pnM0VBWWc0aHU5U1VPNjR4YXNpRHZ5U3JMaWhUbXcwK0dBbm5aMUM1bDM1T01hVllXS20vQTljd2tjR1BjMHUrN3grYk4yTC9Cd05jMXNBWW0yVFNqZlZuKzZxVzdGeE1ubW1TNCtXbFRlWGxkSGZ4eHA5dXVXYlp3ZTFmKzlVVkZMMXZTUktlM3VyRzRhVW13a3pqVjNWYUhwdXZILzNMNSt1bnFBckVTQnBXTXJ1VU9jdVZvRGxxTXVxS0xNK3lNanRGaFZrZmdGdUlobEEvcXNRWnhqSWJyUTB3UzFyR01yaytMSVdWREFvc0Flb2tpMzBrQkdCSjVzYU9wQ2FHbXhVMkw1cmJERFdlSFMwTEJnbEFnWk5DNDQwdGlvWENDSHlxeEsyRWRMTXhxc1ZFY1JtTzc0cC9LNldsMU9ZQmNaQTZVVXNkc2s1MVh5TS9tLzJYWHpNRjVVNWJaSThzYmlqc0tGaDVjc0RESEk2UW1wMXJzWEl1WTVXOWEyUFBJd0JVZjdWenkwUFlaKzhvMHJOUEFwNVhmM0hINzU5dHZ4N1lIYXhkVUJkekZpeUpaQWE3OHdIZDNiRDI1Y21yRHRHbmxxMmQyL1diL3FnYTlLS1licFg5enBPY1VIaHJZODl6YUd5WHA5c0ZuMWxoTVRMNVo1OUNsT2ZmKzg3NFhjYzJqMHRMT0E3TUtDN3F1bWxwUUttTUdTSlc0RnlITzVxTmlWQmt0UTFyd08xcDJMUkpGVGJjT2F6UytGb0ZqV0xMMEFtQUMrNGtUS2lxRTBia0V5NWtDRWIrZU1NMW14K05RWE5ncmpqc2lSMXV3UnBIMXNzd3ZpcE53YngwRmRiZVI3ZjY1a21QZUFQMStnbXdyY2ROVE5CUFpGSHdLWC9Fa1JGL2ZjRWcxMGIvL1BaYU9IQ0xiSzBiK3pMamt0ZTUyb0djbTBPTUdWUzVFZGRGcUFZdHlaQkl4SjRJckFVOEM2STVnQTBGSmMrVk1xVEEvSnlzYzlFSytoSnplUUsxV05ZRllFRmJwTUtsMHNDb2NoNlFmZHZ4ZTV2dTc1ODJJcnQreTVJRkxSbDRqazcva0VrckM2YzkrZThHRlc3ZjlGbXUzNy90UkFoVGFma052ODdhZzcrWk5mVWZteHFtUWhKN0ZTNWNQYjFqZis1YnNneTRFRERRRFltd0ptaGFORm1DQWN6UXFJSlloRUlmdkZRRm15RWxTZkIvU2VXTFkyUnhCckNXb09CVDJoNEpCRFlIY2tPUEppeEpVZFZYVU1GWjFsWVMxUkY1NjUxSjh4SExyZGkwNy83NWxpKzg4ZitXampTYklrYzJlWlI5c3ZmWEwzWHYrZXZQeWd5VytiRzdJN1pkT0VkT2R2bmxhL3p2WFh2dDJmM1dGTWV5MnUyMVRwcEpNOW5Gc3Z5VmFVNjNpVkNLanJTQ2pOT0I4YmpSTGxvbEFaY0tOa1luZjYwaUhVVFp2b0Z5a1VFRk9xeWVUaEl3UWN1RW1mOSs3OSsvSHBHekMrYzJiS2YvZisvMlRGeDN2NlRsK0VhalJkZEkvVHAyUy9ubGRuTzAvZnRiMzVxRkRiNjZYZVU3bTFneHpxMEVIbTQ3cndOdVdJNEFtRE5lZmhQVmFEZGIzZzd2UjZnVXRXQWlDSkVIVEo4OGVrY21UWlhnMTlYWkVLOG1GSWljTTBpdTFlczNnVDd5ME0ycURuUnBVWFFGYUZmU2JVb09RTlpVWjVCcVZ5VElKL1NWeEordzFLZW13SXV6WUVTNEhZT3p3SHNLUU5XdklsbDBQQjBDNkkxOWl4cE9WNVNGL2tzVGsrckx4UXlEUDl4SU56Qk9VaUhpZmxLN3BJcC9TaTJUYkphMzdERVFxODJ3aDhLd2NYU3J6ckJBc0VVSlBQOGlhNE4rMW9MV2N3SExna0RIV2RldXhUdWRySVZtaTJBMSt4aS9LNjk2a1RFblh2WC9TSlJDMmdFbmxLRkpVQUk0b2xiSXBLYzRpbWZEU2NhendtOGI1cEJnSHVTcUZGMUtNRlY5UW9DQ1I3V1UwKzJTdklEbUE5QjJoL1NWcFlBd25kb3gxU0xJdXJWRHFsclZvVG5SV0pjWWlRWFlRc0RnQ2FEaDFiVi9EMEJVQnlEcGord3lqTHUvRDRWcFVFd29HSWo0d1l4MzF0Wk9hY1VWWlhCbG9XbTJhMUtBNWF0QlRkaTNhZEg5UDEzMGJIOTd4TDJvaEQ1SnRabUR1dTl0dS9YcnYvcStQTEwraFdESHJQeEw2YXBlWHlXWmQ5ZWNZWGpwZGJDa3NQb3J0ajUvQ2FiZlVWQlJUNDVaMVlRZm93alRpczVBZWNWalByVTNTYVNDRWFMdU5Ca2FyOWJXSVBFdldVc0hrNmNvT1hEY05UYW1ycWE2cUxDOHBWT0tLTjVBY0w4cE9FSnYzaklKVXFmZkdSZHNOdERVMjB0RHlNdGt1bFl4TDQ5L2tNN2lhbnNIL3ZWVCtKaWZld3h0VWN2RVJhZDFZRVZNbVhJTXZvT0xHNkZXZ213TzZQU2c3R3VJQUtQTGRaQW5MMXdLVVlvSmFGVW85eUVWWFFaVDFZcnBVN0MwWnV6S243ckJ2dzF4R0ViWlFUWnhLWjJZWlJSUzYzalIraGpIRncrZ0MwTHZMWVM1QnNqcGpKMnVEelNScUFISWVUSndaSWtrcEtYK1FvQTZEL2Y1QTJCK2ZHRkVocGI1Z1VzeUlBcC9ZOUxnK21NaHJiN3pVUHhSTklWbzEvK0RlQzZYNzZld2VsV2MzVXZMd294MHpVek94aTlyS2QwMWJCNWpqY2ZzZ3VuSTN6SE1lc1k4NW1JT1pNR1Q5REFPT3cxeWZYdEVhUTVLaU5Rekp5QVNzTENuQlpSMHRUYk5uVFlzQ1F3TlprY3JpZ0RHdU1sakdhK1MvTFZieklqWGtBaHlteUMwWm4xT0hZb2lGVWxvbkxkT2s3RzMxRkRvNWIwcTQxRWtJbmJ0NlZyclBIcktuelM3SWFYVzc2VktWdERnaDlLeVExZXFVckdUVGxmV2M4L0NxckZWTnVnV3VSdkwxUU1taXV2bGVYOER0Y2tudlRLSms4L0NEWTNsRzRsTUFsWUNiaGJRRU1QNGdvSHNrZEVNT0lzZ1JOTDd1QnVOOEVEejhwb0FDQVJUamlQdkZDZFF6SDhCVS94dC9MUzk4eUJIalRrb1prNk1xSFo1TkJYckJSSjhIWG9CN0NPWVhKZlpmNjdHekhLTG9pMVNGQmpXWXlGT3ZPNE1YaUtMNnFuSWl6QUN4a0tTNE1GUEhTVW92cjkyRTllTlJaNnhCZ3piandDZnR3aWpKS0kvYit5YmJHNGJjUUNEWDhLWjFVL3hvZVhveCtYZzd6U244OFNOOTBkc1RyS3QwNUdWQ01sTTkvT1pZRWFXWVJtNW5lcjJFOXBtSzNaV2gzbE81QmxLc1VESTJCK2d1a1JENGQxbEVESU43aVdNQTAzTkVQUlBQVWxUZ2I1R05zek5xb3NXelVvSURJZ0YvUUFrRE1STU5uekd3VVViZ1V0TVlSYTRLaHNvOEk5OXoxOFRSOTdRV3N2MlR6YUhCNzNNRGlibzZySE5rVnJDM0Q3ODZsbXFqY2ZnNDh5a1ZPNE1XQTkxYi96L1VTVmptNjcxN3Y3NzFWcnJkZUY4WEJDeDV5dzNkSW4zNStPUFNsMGRKQUNMbzhyQWNuL3JmdnZiYWQvcFZqTGtZWk9GRk9hZ3NXZ0xRQzJFQnJSVko0UjN3LzBUUG5KTVY4TUZvRC9IT0lhMWFYakRpM0RQN2lWZ0N3Rlk4dTNMbHMvdisrZzExMUg5SXNCai9YOTg5Y1BEUVZlOXlkeTEvWU11V1h5NlQzaHZMeDVHYmRtMjVnSUNleGRJM2xJZFZhRFlhaXFhV1lDVGFBQklXWXNpK21uV1l3VTFOeHdPZ1NtRmlTU3dtV1M1QkVleHFrcVFKdlZxNjVnN1FTQzIxT1pxT2gyQjRFTEFtd2lKa3dHZStUQU02bUlONGxyOTg0bURFOGd6Yk4yWndaMmZVWGwyTlVQWHM2c2FwVVpod1pYRXczKzhQNmFtRFVRUWFGdVhpcnBKZjJCSnlZK3ArNDFYZXM0cmVtWFpwUjF0bVZlNk1jRlpMcmxhWDdFa3kyYXJYbG1iVUJEV1JHVm5uYnhNMVhuK0c5dEZiSG9heG0rN3Q2cnAzazd6bGhtNlEvbm5paEhUNkJtWi9wa2Fibk9FUjBpd3VXMFpLYmtBak1ucGRNVnZnU3pmcTM2akcvdCtld0VrM0hGNy82cFZYdnRyWFI3YnJZemtLaVUyMWFEcHFpTmFDazlLQUg5UEFHUTNUcDZWQVZFZHJCRHpMcUIxMU5EdWVQcldoRHE2cUpucVVIYW5YeHlzNnREdkpsaGlPUW1vOE9xdVNaY282SnB4Y2R2alN5cUFueitGTVZzSlBZKzI4c0MzVEhjeHd6Nis1Z2pwcWFXTkMzdm5EVjY5ajR4VTcvcDI3YS82UjFmMjN1V3pGMlIwMWRVNGFkQnFhOHhxbnpnN2s1RXI3eG1ua0Y2LzA5TW0rL0RhdzYyemFkOWNSYloyRnNlREZERS9pTXhaNmdZMVU0OEJ4eGZaSlZZRUY3NVhkZ2tpSm5PNVN4MDU3N2txSzhuTkRBWS9MSDlUU1ZUT2xxNHNHWTlLZElnZnIrUEtMVmFtZ1J4SnJYeks3MUFZdkJkV3lmd0JVR3pJV1BiUnA0MEJPMkwrOGJlSHE0bFZiVmp4MythcjdHK1NPcnR6azdKTjdCNjlzcUEwdGFaMjdxYkM5YytVald4YmZYUzFqM00vOTdveXU3alVMc3lzdFpudXl5VzdKUHJSejNiSEZzMmUyRW8rUDgvenVuSzA3Tm5ZMXRHV1lyQ2twVG10Zys2cTFSenFtVjlmSitTeEdsNEN1ekFWZHlVYVJhTEdBbFE0ZXNsNmlGcExpUHAwRzVXd1U5cHRvMnFKVWttTGRBcE1nM1RnYnZGd1p6VktrMC85SkhjMUJzdjFQNmJRY3Fka2xORDNaVHlkZGxnZ01wZGZwc1FFMVJxdHhLcC8yTjlEbEhiWWJoRWdMSnFTZkxBWUs4MUV1b01JSS9NVktYaW9zTEpzQWwrUjFzYkd4cHY2RFYxLzlvRjRPS0JRVzdUbHdZTS9teEFBenN2SDNiNzMxZSthZ090MlJQVWN2di93b3MwdkIxVHFZSzFtZkNwTzV1a21OdjVsWFpneHBPWjJ4T3Rrd0N2cm9YQk9namdJVThMaTVhdVBRN2g2WVM0dDAxRkNhbDF1YUpOM2FUT2QySWRsZWcwdHcyU3I2dlZVSmhpbCt0OGZIZnFQT2RmaHFkcXM4ejlGdllaN3YwdnBpNytPNUFRT0xCUkw4MCtYZ3o4SjhPUkxmSWY5cWdjUXUyTUtvd2Q4TmtZblVUd2ZIalZJR3lMRS9na29DUkF4all6L3RiNklOeHFUTGFSeUZEcXgwSk1jSUhTSXc1eW8rTzJ1dVplZ3A2N3h3TnJlUFloNU04ZXJCVlU4YnF6UDl3bFByZG93Si95a0IxeFJteHNoVFU5eitCTG8vWnBvTExaYVJCMW12alB3d0tvRzUzMEx6dm1pMHJqbzdUZVNJcUhSYUVZalNkQ2ZwR1hrcFVZWjgvTmpFcjZvaUFvS2ovdzF4MEtjZEQrN1k4UWUwZUFMUlk1SytLZExyZUVsMUhPVnNHSlYrbkVlLzBxN2NlcnhNZW5WR25BV2RILzJ4bG40clVtQjZxK1NKNVg4YnBCZ2d4My9HeDJQZy9DVmNHOHU3YW9FSDF3TVBTbEJGTkFJc1lBa0xSQ0NhNUZ3ZzEwblN3UkpVcEpLZUlObUowZUFzbEJLRU8xMjYreFBxRXU2bDdjYlN2VE5sdGFWOWVqOE1UMGtrYStUMzBxMHhVbFl4aFRGUzF1S2pjUngvSDlEaVYzUElTUm8wMUJ3eTNxQ2g1SkRXTXI5VnpTRkZQQ0hUaUZWYlpZL0dqcmgwSTMyTVJlbklZSHd1STNOSTBpbEYxeitSR2FjYmg5dXhnZVliRDVPWjJxenNBOTlUaDFhbjlCdk5rVTZ5YS9pbHlFNXliNUlSa2Y1dlR1N3Y1K0w5L1REV2pteUJzZ2dwQVhNeC9wcGliQ1dwT0R1YjZBZE4yekJWR21rSXozcUc5Rmg3Z29JM1NGdXVmN2lJOGdpdmdkL2RRMzgzS3hva3Y4Y0F0Rm9iYjgyS3RWRFprUldTTUtYeWJKbzAxVjhkLzlsWjBwRDg4L3hTVC9EN2orWGY1SzhrVzFrMlgrQnYyVThoTHJ0UTFpUENxdWxSbHhFU0NFanlnV3pFN0NOVnN3dGhuQXM1dytrY2hOcEhCTUF3a0FiUU9wVWc1MDFLMTZMU1o4SHNjZXR3UkhEYXpQWlVsL0MzdndtdVZMdlo1aFJ3Uk9kMmNrUG0xSkZIZEhxVFF4UU5TZmhQVW1hU1FSUWRKa2pqMmxMTk1KL1JUNlVkM0JlakhES2dURG9mNjNnV0JBT01NZzl1YkYzdUk3MCs2Y2VjSk5oeTd3NW41T1Jra0QvSzJ5ck95T2J5KzVFSnBkTjdHcEhhM3BWbVVXK0dsTHBqTUZaeFkzUFRiR2xHczNTVnplMzFwWnJ4VW01amFyb2pYZmVCSWNNVnpqYU15dXZQKzBuOFkwK2dBbFNOUG0wNjdnSW5uZXpFR3JhaUhOQmRDc3lhYlhhTU9TTENFYVVMT0J2eEhPa1hHVVFzb0dMRWF2b1E2ZDhsaURDM1JTUjA5ekl5RkhUSWR5NDk5d1ZBcnAvdXFrMFpqbWp4MmE1Q3NZc0E4S3ZYRUZoZVdJaFFZWFZoVlZrcDBKYnZEd1FEa1loZVhmcFBoSjJ4bmdKZ0dpM3FDYkZ1TUtYNzEwYVdGQWtRRHowOTFVL1VNVHBsbVhIdWMrZXQvdG5pVDA3ZWZzT0dnYVk3WjV1TVhwcytPUCtGM3VmM3JlNTY1WTdwdDdheEozNXhqOVRmUnR6SWxJYkcxaG1YZGQxMmMrbUMzcTZjb0xZb0xjV2ZtbGNvY1cwTFozZmNzOEZtbDJVUkJGbTA4Sm5nT3NyUUo2ZFNJRFVSMWF6Wmo5UmNMZEJDT3FCcGFwUGJJdEQwVWcyZ2NqTmcvcG1IeXM1V3VRcXBGNUVHN1Z3WWp6aGdkTjlQdUNTYVBkbG9GQnNNVVYwZDJ3bWlzSVZDQ0lYS1FwR0NQT0lWd2ZwRDRPRGxGdEV4SFVPS1JNWW03ZU5iYlBBMDE2VlA3M2hwOCthWGRxeTR0OEhsdTUydVBkRlYvR2R3K29HMnRnT2RuWVBUcGcxMjhwbUFBSXZ2MmZiQjRjTWZiRnM4dDEzMjdGd0s5ZnRTKzVGMTY0NjBMeml5Y3VXUkJjUXVkd1B2WFdBSFo2MHY1U2JVbDNMLzEvV2xjY0Q5WDNRNU9ycTdzK2ZJd281RFBVc2ZuR1UxdTlLVE05dmY3Ny91ZzRzditlQ2F6aHNqdm16MmhMb1FYYmM4c3ZDV250NmpDNnZLVTdMVDdYNTc3ZlJkSDE1MTFZZTdwdFRXRWpUT1VKb094ZlRKbWN5Z00rb1RlUktGSlJJZmE3U1Q2VlBpMEc1cWVVS2l1U2JxRTh0emEzL0NKWW8ralJ1TllvTkJuK0tXUFVHZmZLRmd4Sy9xVTZ5TlAxU0h4OVNzejZoUDdHY3Uya2tIZXRSdzd3cFpzWjYrbEs1WWZDKzVxQ1oxVXEwaSt2VGpBekpDYUorN1dOYXJlL0FCV1o5a1RaSzFpdkQrSVBCK0d1aFRKa0J4eUpuVjFVbkV3MGtlMGI1QXJwZXN3T1MyMEo0RlJKL044a0pVODRhOW9ZQWZMdlNFL1Q1SWlqSkl6bXdua2VLTUttVEVvcGVRZ3Q3Y3FBSGtrQ2ZlZGVQU1I2ZWJqSDZiTnEvbDM5YmYvTzdtUy81d1lQdlAwNW1WMXB2M3NDZTIvWGEvejNuajBjS3d0c3hxeXJLRmk3YStmOU4xSHc3Y3NIUFRCUU5LRHl1M2hBK2lVblRSWTREUnRHcWJjYmI2UUlZR015SnA3MlFod0dOdHJ3NXJ0UUVRS2RFVEpELzJFUTJyWStFazNGS0wrK0lYSlk2a2oyekFMNVVvRFpGK201N0FYclVIUGd6KzJJWGprT1FNSzN2VWdPNjlySWcxQnZTRzNSdC9nNWRRdUhLdi9FbWFXMTIrbCtuaTVzdEQ5L0hCVW5PUlBybUtMLzZQalZSNEw2bXdqNkg0ZGZzOVE3SS8zaTJ0NFE2QkRBdFJBOVpGOVVFR0NFaWp5L0t5RWVVaVVGbWU1UVoxR3RKbzNLc1ZHTm9zSllycXN5bEtiMkUrdFlzQXJhQW1YcUlHTWZuNmJuUzJxNGxWUmRTcmtZaDRWdVQ3em55WGhHc2hnSTYvTExhR1JiVnY0alhFek94RlJRZ1ZOUlRWVjViVFZ1T0FQUkFva3lPb1hWbE9WWExkU1ZwejY5U25hQ1pwWExzaDdyWlhQNysvNTZVRllZMDVyTmUzUHRCMjFkVTdYcEF0c0MzQjhOZ1RNZTg5L05aRjl5L3hlb3pobExRS3pwbTV0LysxV3pmOTd1cXJmN2ZwY05zMVhWM1h0TTI1cHFmbm1qbEVoOEY5Y1B2Qjk5V2dEVVNIT1ZXSEEwaWowWGJMR3F1MkgrYU9YMzkzUkgxRWJUVklTN0hHNUlOa3phMUJWZkpDZENRUTFDczFWNlZUZEVMaUVwR2ZQanJqK2pUdWRVMjVmMlhYNVkxejQ0blowcm50Q3c0dFhoby9NSmZ1bjZUUnpkaTd0dTN3U3NrWlMySCt2WFBkaWdmV1M1K29CK1JvaDBaSHFVM1A1dWVsK05CYWhGSVl0SWFEeWNQeFo2VTE3SDU2ZkRWOTBuUU5lcEhpNm1rSy94clF0cWkyTGkvWnlHRlI1V0VRMUZQb0JxOHNCd1JOTi9BMDJLTFhjUXhwVStzbXo3L1FxcitmdENOcEJMN3ZMS1BrMm5VRHFxK3RqaEFIQUlsOWhGUTdBbVBUWGRGNjVrVjlxMm5pa2tZcHR6N0dzY1lmVDgyT045TnMya3UyNzROWDJUa3JuaGpXU08vajl1cFlaei9PdWVPcXNUejBCSWUvd08yeC9IQkVrdk1lOUFqd3FRSDQ1RUN6Wk9iWXdaTnozZVJabjBBTEV3dDRCRFZaNFNBcDViTnJFNC9MandNNVVEcWhYWDRjeUhyR0tpaHpwd3ZUQkhiNEcvblpHT2xyK3JrdU1UakZ4RTd5a1dHWTMrZmd3OXJSS2VwRFRqVk9aY0JOTkR2b2pnYXJXTjZqSVE5TGFIdHBRU3JZWWtnU2VZNWhVTGRBbG5UbE5YVGlnWExvTUYwdmFVTEliWkd2NlVhVFh4RU5rNFZnZFN5MXU4bEhnck5KZzhtMm83YW0yVE9uTjlRU2d3cVMvMFpWRVNnc0hHYy9reDJiVEQxYzhvUG85bkxGS0xuWGdHTTMrbHo1SllYdGhmUVJwT3VWTHhHcUpaOVNLNk1tQ0tOeUw1NDVmWTI1ODVxYVpSWDFpbm93N1RObUxQclpTdW01U2I5Q0ZMbGEzbHU1dkh0cDUyTTFBNHRIUHBGMWhmaWtHMEFXTmVodXlzM0hLc2thUXJPRGZJb3hTVGhKaDdTbVY2ZGxpTDJNNnpoVHhCQWlZK1RBU3hJbkdDOWIxL2pSNE83aTQxRE1DTWNONjFSZFdYVkU5V1hVbGYxUGZKakNiN2JrSEY2TUF2YVRQdGZVUjlhd0o4N3V4RlIrWHJ6bWZEa3VYd2JZcWhINE9LSEdsbnV1R3R2Wm45aGx2djV3NTg0UHI3eVNibnNQdGJjZjZwVzM3SWtkSHgwNDhORU9lWHQ0d2RFVks0NHVrTGMwYjRPY3Z3WG1rNDJxMEdPblFscEc1RlNjRFlrT1F4NVYxWktVSVJnclNtWEgxNzdDc2VoZVNNY21SSE1GSlozeHNtamVtRUIranVFa3BPZmtJSlJUbFZOWlVnU1R6U0xTOXNtMUtwVXg0WE1KZG54dEtsMEJ6QS9FeS8xckV2RDB5b1NFRElDbmpKbWxiZU45SytEcHcyTXpNaGwvN2VEdWkvSFZRK0JYSWw4bmdWelo4ZXBDbUUzazY5bXgxcmpMeHZIMUhNTW44dFZIQXRta1VHazhjMzhTU0ZvVForMERhdXA3Qm56MFkyeFpHaDlRTXQvRFl6TVQ0b2ZJTTB0emdhOUY2TUtvRGxSRXlDT0xaUXBudlNpaFpxUFVzNEpqaWpZT0FMNkpkUjM2SEZkdUN4M2ZqY2FQN295Q0hjSlBGY3EreGFhVm44aU93M3NqamdQOFNaV09LV1UvbjU2bHRRYVREY1dWUzA1dHd4MFUxTk8xK1dPN3lmWU5uNnZvaWx1YTJCTlphU0Z6V3BYR3NmTjMyMTRjN3o1K3MvaXlScG4raytBL01vRCtabExMYTV5a2xwZWJVTXZMUFVzdHJ4azF6WnhlV3Z3L3FlWEZYOUp3dG1MZWIraUxHWEx2M3RXN0lUdkx1MmhHNzBWbDdaMWREMTl5L3QxMXNkY3pCSDV4OWRZZGVkbitycG5MZDVYUjF6VDAvcnhhWGlnZ2IyV1lPMjFHZldhV1FaOGs2bE5UWFJ1WExOay9wN1l1L2xxR25zWHpaL3J5alBwa1VXZXp5aTlucUk3a2svVURqTFlSUDhzTm9YeTY3ZzFrWTVZWkZPaXpiU3g5dGsxcDBFdFlCY2xIZVFGL21Ed0VyRmJ6NGc4QjJ5WTAySmJGQkUwV252RS9mUGhuVk5kWHQ2MllkbmlHMGVSTE0zaGJuNS8zcTJPdms4T3ZLMjE0dEM5SU90eS92anhmVjVDUm1ta3BibmprT0I2Z1dwK24xaUViWWU0WHM3ZENabm50WThrMHpNcnFuVUZXc2poUzRlTzRZQXMvYnIyRHVJdkF4Qkh5TWdRL1pzM0NOMlpZd21LRi9FUzBzZ3laUXBQYllobk94SGd5eVNyRkdEeXJkTXJIanJHL2lhMVJRTHhVRTRSZitsdzByRjVMdm56RzN1b0pqaFFSSnJpREEydk9oNUNLUDVVVmYrUXZOS0JpZDZ3K1JkNnZBYnc1VXgweCtMK3RJKzZFQ1RWSXp4Z3Jpb3ZLa3FYbjYrUHRYNFBZaEMyTDVMNUNscFplUnV6a1ZTSE1sN0dhNTFiWllOVTZJc3l6SEZWSEsvSkRSbHBJbkxSR0dDc2l5bjJ3L2dETU9UU3hRS2l1OWs5V0lxU3JST05LaEdtLzFvVkR1Y1ZKUjMrV1ZKb2JDbWxmTU5PWmg4aDIrL1gzaVNGUGcvSGV3NnZwUWJOS1RzRGw4ZUVUVXF2UDR3b2trUFVrL3AwMUkwdktabWJHYW1RellmNlhBMzFucVJNRy81ZDFRdjA1NjRUMmluRjF3dmZ3bEZKcWhiOGcyNTV2dm02THQ0YVY0Qm5TKzdQaVpjTG1kLzY5UXE2bnlkUkxyMGdQeGlJUUkwbXgvUVc0UXQzLy9QT1lIa3FycVI0V2tGNkJvSVUyaVFtS1dGVzdJdDFob0kzNVZMUUZLTTlIQVdwaUNSNGJHZnE4WEVVOVUzRU9uYXlYMWs3WjhiTk4vbEJaejVidUdkTEJoa1RGek1DR3prVEZISDV5MzVGWkhBNFdUbUg1OHIwSG1MZGlvbnlMS1luSjhBUk1OZ05vQ0tJYjVINXZ2MXdnN0k4LzUwM0xnOEV4ejNuTHoyOEc0a1BIbEJLRDUzNG1mT0s0VHZtaDhFbktqaE1mQ1IvN2tPYy9YTWtqdCtIUGxMS2pqWlFkVjBwVlN0bnhEY0lNbDJsaytRTTBaQkFPdUpPWnUyNGszLzVENGNFajBrbjJqL3hTU0NEV1JYWGxrT1FhNkxQZmNqN3NpRDN5VFJaQW1kVjBCWjNNbnJ6SUkrb2xyNVJBSEkvNjRzTkE1T1RCTXVKRk1kTVJ5MDJLQzNPek05MFphUUV4OW9RYllBY1B0Z21pbFVUWFpDeVhhbXhLVFRYU2dPVm53dVUza3NGK0lhYTc3QXNnNWZVRHhSekxiOXE5YXd2VzRMM1VoYjcyTWFObkxyK2U3QjY0RFBQTVI2L3pTMG1oc1hyN3FzYUxqMFYwd2VzMjJ2UURodlRkVzhuUlJ4LzFtN2M3azdac0lWOTJiYlhvNXJnTlEyVGhFRE1PNlJqekNOK1BES2pncDcyZklmNGlDR3RDaXd0em5VOE84bnkvMi8vOWc0VGp3ancxdnYxZE9zazVLTTlYUjNWNWNEOHJoZ0FkNHprTVljbExwK1FISjVINlJwNGNUdVU1cmQ3RWh3RmU2MFR5bTg1WXd2TmttZWZsa1VCMklGdVVWeVhHY1JqMlBUakc3RVFPazJJWk1MOUFOVDc4M1VjTWp5ODdRSFB0eTRISkg5TW5ncTdkQzZ6ZnNtdjNKcDdsaWdmV2swUDgwcUVoZzN1T3pySjFGMkhybGkxSnp1MW0vNk9Qa2k5YmQ2Y2JCdlMyamRjRmRaRmpGemV1Mmw0dFY0RXh1Z2sveUpVekg0UHVOOVA2NkJRRHNEY1RsSWxnT3A0ODd6Y0lKc1NBVGc2U1J5dFFKMkVBcVNnU0JoQ1NFWDE5U1JBRmZJR3dqM1o5SzNWaStqVEJHTWd5cG1PUEZBanhoNnVqMVkzaEJUTlRiRFpycGxoNFJXdjFxcW1WYzBJSkI1aVBjN0o4bWZOVFRXbE9vNzY1S3lmTDY0MTlJWG5PdDh5VmJFanBHYTJnRk9SeHBBTEZBdUFpZlllSTZWVHlXZ1oxVEpMVzBzbWVJN1ZkY21sVDA2WE56WFFibmhhTy9lZUdZb2RodXoveEZMQ0VHLzF4MU1mOUhuVFpoUXBSSytwQW0rajhWbm1BdysyWTAwN0ZnbzV0dG1vWlpnNTVDOHcrWURhL0QzRmFuWmJURFpJbkRwRVdvN1ZJeTRuYVRzQ2dyRTZEQlZFbjlDR3RWbHlCUkswNHQ2MnRxS2l0bzYyanFMV29aVTZqM3g5S1M4L3orNHJKMGcrbGl6aXRzZ2dneEhpYnBOeEZRVGFCTVMvb0lvSXlLeTlTVUo5N29ScFlvYnlMMEZUcVQyVVprOFVxVGN2SitkVTF4aVI3c3NIK285YVFiTG5UYW1HYWpjUHJSYTNkYWpTeU41SFBqUmFMcFN2RDdYWklMMXZTQlEydVMvWllYZmxkYi9BZk1TK2xsMFh3RzNORXB6WFpvdC9ObTAwanYwNTMxRnRTTlNPLzVad1dzMW5MRkhQT0VXZWEwNWwrRk81aU9lck5URTdWNDRGVXM4TWlYWTExMHJlZ2lNRGJMTzUxaGJmTDBDamxiTElISkQ4ZGN5SWpjMVZHclRWeDVtcmduRjdrOU9SUktwMU92em1CeVVqa3RHSWYwZ21DYmhIUzZZUWVKT2lFZGdYVzFwN2hGcUpldCt2Yzk0aE9UUlN2cUJFNXpTRFM2RVdOZnRkUHZna3AzUlVWRlMwcld0cEpFdGJzY2xuU2h2K3hwQ0drMFVzcWdzbzdUb1N4THptaGppcFpEb0EvV2Vvck1ySWxmMVlHdGhYbFRxMFB6SFNCQW1TWWluZlhiZG85ZGVZcjJKRGhubHo0bThjSmYvZ1dxM1ZuZm0ybS9jdXM2ZG5GVmFia2hUYXIxWFpKbXQ0YjJMb2l1cjdxbmlsV0s5Z1hzbEQ3dWdDY2JRczZIMjFDMzFFdHlDakFBZzhPZ0pzQ1NWY0tCTTVOV0d0Y0RZd1d3TU9uZ2pSYjFSZXJhTEQ2WmhXdFVXZlU2Z1pKaHdZdmlIdzhvSUlETVRLb3o0U04yaVJqWnpMV0diQStTYWNuQjR4SksxQ1NNV211SXpvLzlxWVdEWUFORFFFYjVMYTdKcjJ0NWlmZXRqTWFhQVhjdG5GRDYvbXQ1NjNzWGI2MGM5RzhqbGt6Nit0SWJBa0VTaU1CZTQ0WmtGek1nZEhuUzRVenZPaGw4dmU4RUVHakNlL3FNeWRrV1pQNEFyWTBGUy9kVkx1OG91Nkt5K3AyRktlS1JvZW96ZW5KYjVyYk5pY3ZZRFo3WnpiT21US3Rrc3ErNk9JYVZrY1ZKSzRveHZ3dXl5VGVZZlFQUEg5QlNWZjFxdExVZWZVcnR6Z2RPcHNoTmN6YTBpdEtLdklqYWE2aXN1S1N0RElyL0Z1YW9YVzVSdjdzTkk5Ukcra1ljUStUZUExcEdkYkpjWi9XYXdCdlpoTE1yTWNNZlJSZjBRQzE4QkNNTFlQbTAzZnFaQ0szUDJBUHFzV0Z5UmdjYjc1YTd6cjJxM25QdDNvTmFUNlRjY2JoYVN2YUpCa1dTd1FKRG04Ni9raERzU1V6TmFOQWwxKyt2cCtOeXJrYUkzSnR6Sy81ZVFCbHdsU0RsZmRuZFNhOGt5NEI2TWpoZGN6VDhzZXlzaW9xNEkrZjV3cnNDYmpvUnFsRnp3WjZIU2hNRjdOVkNoTkxLT2V1bjhTZTUzbGdYUDFraEg3TWp5ZlA4UlVqdU92L0EyQStoZng0Mm8yU1VXdmJNQlNGajl5MFl3OE5nMjB2ZlprZTAwR3RwRjJoTkt3UUFuMVpvYzFvQzN0TU0yRzdKSkVqeVErRi9xbjFSNHl4dC8yZ3dZNVVyVXZET21aajY3dlg5eHhkU3dMd0FsOGhjSDk5eHZmRUFwdmlRK0lNejBTVmVBMXZ4SmZFTGJ3V1B4T3ZZek5UaVRmd0tpc1N0N0dWM1ZFbFdzOFpmWXNPZ1FXMmhFcWNvUzArSlY3RGtWZ2tidUd0K0pGNG5UNHZFMitnazcxUDNNYTc3QlpER05TNGdVV0ZBaVU4SkhiUlJRLzdwSE5tTk1kUTFjUWF6YmZFV2VSWi9CYlk0Sm84aWVvQkt6MTFobm5IdUJOZFBXZHhPSVRpWFZBYktocGNJYWZLMEVsaHdkZ3dyem5PbDZJeGxVR3JWcnI0MDhNMlhUQTA5WTJ0aXRMTDNXNXZYNTZYV2c1Tll5dHQ1Wm10WnBwdmM2MG5YZzRhWHhyclpLZjB2bmFIU2hXVkw1dXJmR0ptYXRFWXI1dDVITVoxN1ZTeWlBN2JZWlluRndLUFpnTStNbGV3ZHNvZnNBeDEwVXpIaEQwMkc1YjNBSDJNY01GblFIcnExM1pXZmZieWJ1K2dQN29ZRGZyTHZlMDgrUDlycTFhOEhxL1BnOE5sVkRxcUREZENMbldNUzIxZFplWXlkb0gvNy9ydnJmNCtGL2Vud3ZFa0JJT2FPY2NwUXdOVGp1RWNGZngraW1PY1VNUmQ0NmE1aWExcTczSlhUWE5qQzNWNmZJSmYzMkt6S0hqYVpZclhUc0pnQUViUFgwWVJuQXpGTFc1UnNjVlpWMXdvdUFVbnFLVXhZQzhJTlFWanZOVm44N1dNcG9reDBYTnp2cHg4U0RoOGZ2RDJMY0ZmVEtkS3VIRGp3WXVNandiOEJHaWtpV1phYUtXTklDSENSR2luZ3lpZGRORk5ENzMwMGM4QU1RWVpZcGdSUmhsam5BbmlURExGTkFsbVVGQkpNc3NjOHl5d3lCSWF5Nnl3eWhycmJMREpGdHZza0dLWFBkSmsyT2VBUTQ0NDVvUlR6c2lTNDV3TExybmltaHZ5RkxqbGpudDBpaGk4QzBtNGhGdDRoRmZJSWF0YTBtc1ZvMmJxWmV2WlRwUnQ0eUg0MitvdmxwTWlkZE11L1R2S2o1WFhKMVBUZkk1VlJma1o2aGNOUnpWUUFBRUFBZi8vQUE5NDJtTmdaR0JnNEFGaUpTQm1ZbUFHd2tRR1JvWWtoaFFnTDVVaEhjaG1BY3N3QUFBbjFBSTFlTnBqWUdSZ1lPQmlDR0ZJWW1CMmNmTUpZUkJKTDByTlpsRElTU3pKWTlCaFlBSEtNdnovendCU2hjd1dZMkIyZGd4UllCRHo5ZmNCa2tIK3ZrQVNMc3VZVnBTWXpNQUJZb0V4QzFndkkxQ0VFV2dtRTlBK0JTREp4c0RIa016QXpDREVJQXF5SFVpTGc5V213TmxNRENJTVlnQzF0aE1aZU5wallHUmdZT0Jpc0dHd1kyQjJjZk1KWVJCSkwwck5acERMU1N6Slk5QmdZQUhLTXZ6L0R5U3dzWUFBQUZzYUMyc0FBQUFBQUFFQUFBQUExYVFuQ0FBQUFBRFpuSVBoQUFBQUFObjdTVWM9JykgZm9ybWF0KCd3b2ZmJyk7XHJcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcclxuICBmb250LXN0eWxlOiBub3JtYWw7XHJcbiAgZm9udC1kaXNwbGF5OiBzd2FwO1xyXG59XHJcblxyXG5AZm9udC1mYWNlIHtcclxuICBmb250LWZhbWlseTogJ0NvdXJpZXIgUHJpbWUnO1xyXG4gIHNyYzogdXJsKCdkYXRhOmFwcGxpY2F0aW9uL2ZvbnQtd29mZjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHUmdBQkFBQUFBRUNvQUJJQUFBQUFkUFFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQkdSbFJOQUFCQWpBQUFBQndBQUFBY2lUdjBIa2RFUlVZQUFEKzRBQUFBS0FBQUFDb0Evd0UxUjFCUFV3QUFRRmdBQUFBeUFBQUFRQmFiS0poSFUxVkNBQUEvNEFBQUFIZ0FBQUNpWjRkeXhVOVRMeklBQUFJTUFBQUFUd0FBQUdCeUFwSzJZMjFoY0FBQUF4Z0FBQUN1QUFBQlVzUnRXeUpqZG5RZ0FBQUxZQUFBQUQ0QUFBQnNKN0VSVm1ad1oyMEFBQVBJQUFBRzhnQUFEaFdlTmhQT1oyRnpjQUFBUDdBQUFBQUlBQUFBQ0FBQUFCQm5iSGxtQUFBTWRBQUFNSWtBQUZxNGlLNXhPR2hsWVdRQUFBR1VBQUFBTmdBQUFEWVhtaHBRYUdobFlRQUFBY3dBQUFBZ0FBQUFKQXNQQWU5b2JYUjRBQUFDWEFBQUFMb0FBQURZS3VjWlBteHZZMkVBQUF1Z0FBQUEwZ0FBQU5KWWVrSk9iV0Y0Y0FBQUFld0FBQUFnQUFBQUlBSEhBaEZ1WVcxbEFBQTlBQUFBQWNJQUFBTnYreDlxZ25CdmMzUUFBRDdFQUFBQTdBQUFBVWxrZmNUeWNISmxjQUFBQ3J3QUFBQ2lBQUFBdlZxeDN6c0FBUUFBQUFNRW13aWJpUWhmRHp6MUFCOElBQUFBQUFEWm5JUGhBQUFBQU5uN1NUVC8ydjMvQlBJRnBBQUJBQWdBQWdBQUFBQUFBSGphWTJCa1lHQnorT3ZDd01CeTV2K3QvN2RZUGpFQVJWQUFDd0NvR2djR0FBRUFBQUJvQUc0QUJRQXhBQUlBQWdBc0FGb0FqUUFBQUp3QkZRQUNBQUY0Mm1OZ1lUbkR0SWVCbFlHQjFaamxEQU1EdzB3SXpYU0dvWWxKQzhobjRPQmtnQUZtQmlRUUdCcm95TENBUVlGaEE1dkRYeGNHQnZZY1pnVUZCb2JKWUlWeldCWURLUVVHWmdCMGx3eXlBSGphSlk2aGl3SnhFSVcvQVpQWkpnZ0tna1VGbXlCY0Uvd3pWb05CT0pOZ0V4R0w4V0J0NXhvVVlTMmFCRkZrMndXRFdjd0hCeWJEMXA5UGJ4N3ZHOTdBREpNNDQ2TktuUDl0UDJ5cHNKQTdkakt6SWtkQzgrU0lnREY3WnV6b3MySE9nVFZUaTZ5bkhQTEZoYXlMcWRPbTlsWkRWMEphWW8yaytLSCtzaytUaW92ZG5Rd0ZKcGF6RXBHN1dvcFAwZ3p3R0xFU3kySkFsVy8zRUx2a05Sdm9OMCszQ3RxdXY3WloyaCsvRExtNXV4UVRLSytlTjhrOU1RQUFlTnBqWUdCZ1pvQmdHUVpHQmhEd0FmSVl3WHdXQmdNZ3pRR0VURUE2bXFHT1ljUC8vMENXQWtNc2lQWC84ZjlIL3pkQ2RZRUJJeHNEbk1zSTBzUEVnQXFBa3N3c3JHenNISnhjM0R5OGZQd0Nna0xDSXFKaTRoS1NVdEl5c25MeUNvcEt5aXFxYXVvYW1scmFPcnA2K2dhR1JzWW1wbWJtRnBaVzFqYTJkZ3oyRG81T3ppNnVidTRlbmw3ZVByNSsvZ0dCUWNFaG9XSGhFWkZSMFRHeGNmRUpEQVJCSWdOTkFRQVZUUitZQUFCNDJxMVhhMXNieHhXZTFRMk1BUU9Tc0p0MTNWSEdvaTQ3a2tuck9NUldITExMb2poS1VvRnh1K3MwN1M0Uzd2MlM5RWF2NmYyaS9KbXpvbjNxZk10UHkzdG1WZ280NEQ1OW52SkI1NTJaZCtaYzU4eENRa3NTRDZNd2xyTDNSQ3p1OXFqeTRGRkV0MXk2RVNlUDVlaGhSSVZtK3RHc21CV0RnVHB3R3cwU01ZbEFiWStGSTRMRWI1R2pTU2FQVzFUUXFxRWFMU3BxT1R3dTF1ckNENmdheUNUeHMwSXQ4TE5tTWFCQ3NIOGthVjRCQk9tUVN2MmpjYUZRd0RIVU9MemE0Tm54WXQzeHIwcEE1WStyVGhWcmlrUS9Pb3pIcTA3QktDeHBLbnBVRHlMV1I2dEJrQk5jT1pUMGNaOUthNC9HTjV5RklCeUVWQW1qQmhXYjhkNDdFY2p1S0pMVTcyTnFDMnphWkxRWnh6S3piRmgwQTFQNVNOSUdyMjh3OCtOK0pCR05VU3Bwcmg4bG1KRzhOc2ZvTnFQYmladkVjZXdpV2pRZkRFanNSU1I2VEc1ZzdQYm9HcU5ydmZUSmtoZ3c0MGxaSE1UeE1JM0o4ZUk0OXlDV1EvaWovTGhGWlMxaFFhbVp3cWVab0IvUmpQSnBWdm5JQUxZa0xhcVljQ01TY3BqTkhQaVNGOWxkMTVyUHYxUk13Z0dWMXh0WURPUklqcUFyMnlnM0VhSGRLT203NlY0Y3FiZ1JTOXA2RUdITjViamtwclJvUnRPRndCdUxnazN6TEliS1Z5Z1g1YWRVT0hoTXpnQ0cwTXg2aXk1b3lkWXV3cTJTT0pCOEFtMGxNVk9TYldQdG5CNWZXQlJCNks4M3BvVnpVWjh1cEhsN2l1UEJoQUN1SnpJY3FaU1Rhb0l0WEU0SVNSZEdUcXhFYWxXNmJWVXNuTE9kcm1PWGNEOTE3ZVNtUlcwY09sNllGOFVRV2x6VmlOZFJ4SmQwVmlpRU5FeTNXN1NrUVpXU0xnVnY4QUVBeUJBdDhXZ1BveVdUcjJVY3RHU0NJaEdEQVRUVGNwRElVU0pwR1dGcjBZcnU3VWRaYWJnZFg2ZUZRM1hVb3FydTdVYTlCM2JTYldDK2F1WnJPaE1yd2NNb1cxa0p5RWw5V3ZiNHlxRzAvT3dTL3l6aGg1eFY1S0xZN0VjWmh3LysraU5rR0dxWDFoc0syeWJZdGV1OEJUZVpaMko0MG9YOVhjeWVUdFk1S2N5RXFDckVLeUJ4Yit3NGpzbFdYWXRNRk1MOWlGYVVMME5hUlBrdEtKUWNTckdHbVFRMi9PZktGVWNzaTZyd2ZaOGpVWU1oV010cXN4NTk2TG5QSTI2cmNMYnV0ZWl5emh5V1Z4QjRscC9UV1pIbGN6b3JzWFIxVm1aNVZXY1ZscC9YMlF6TGF6cWJaZmtGblYxZzZXazFTUVJWRW9SY3lUWTU3L0sxYVpFK3NiZzZYWHpQTHJaT0xLNU5GOSszaTFJTHV1U2Q1ekQ3K20vckt6dDYwcjhHL0pPdzYzbjR4MUxCUDViWDRSL0xKdnhqdVFiL1dINFIvckc4QWY5WWZnbitzVnlIZnl6YlduWk01ZDdVVUhzbGtlaCtUaEtZM09JMnRybDROelRkOU9nbUx1WUx1Qk5kZVU1YVZicXB1TU0vaytHeTkxK2U1RHBicklSY2V2VENlbFoyNm1HRTdzaGVmdVZFZU03ajNOTHlSV1A1aXpqTmNzTFA2c1Q5UGRNV25oZXIveEw4dDMxUGJXYTNuRHI3ZWh2eGdBTm4yNDliazI2MjZDWGR2dHhwMGVaL282TENCNkMvakJTSjFhWnN5eTczQm9UMi9talVWVjAwa3dndklOb3ZucVpOeDZuWEVPRTdhR0tyZEJtMEV2cHEwOUN5ZWVIVHhjQTdITFdWbEowUnpyeDdtaWJiOWp5cTREYmtiRWtKTjVldDNlaTRKTXZTUFM2dGxaK0xmVzY1YytqZXl1eFFPd2xWZ3FmdmJjSnR6ejVQcFNBWktpcmpkY1Z5S1VoZDRJUmIzdE43VXBpR2gwRHRJTWNLR25iNDZab0xqQmFjZDRZU1padHJCWmNZeVNpajRNcWZPUlVuc2hGTk5xS0kzN3lsZnFvTGhkQ1p4RUppdHJ5V3gwSjFFS1pYcGtzMFo5WjNWSmVWY2hidlRVUEl6dGhJazlpUDJyS0RsNTJ0enljbDI1V25naXBOak82Zi9JaXhTVHlyMnZOc0tTNzVWMDlZRWt6U2xmQ1h6dE11VDFLOGhmN1I1aWp1ME9VZzZydDRYR1VuYm1jYlRnMzM5clZUcTN0dS85U3FmK2JlWiswSU5OM3hucVZ3VzlOZGJ3VGJ1TWJnMUxsVUpMUk5HOWdSR3BlNVB0ZHM1Rk44cWZuV2RTNVFoZXZUeHMyejUrL29iQTZQem1UTC8xalMzZjlYRmJOUDNNYzZDcTNxUkwwMDR0ek9MaHJ3SFc4U2xkY3h1dXMxVkI2WDNKdHBDTzRqQkhWNzdmRlpnaHRlYmROdDNQSTN6cG52NFRpblZxV1hnTi9VOURMRVd4ekZFT0dXTzNpQko5RjZXM05CMDF1QVg5VmpJWFlBK2dBT2cxMDlkc3pNSG9DWmVjQ2NMc0ErY3hnOFpBNkRyekdId2RmMU1YcGhBQlFCT1FiRit0aXhjNCtBN053N3pITVlmWU41QnIzTFBJTyt5VHlEdnNVNlE0Q0VkVEpJV1NlREE5YkpZTUNjMXdHR3pHRnd5QndHajVuRDROdkdybTJnN3hpN0dIM1gyTVhvZThZdVJ0ODNkakg2Z2JHTDBRK05YWXgrWk94aTlHUEV1RE5ONEUvTWlMWUEzN1B3TmNEM09laG01R1AwVTd5MU9lZG5GakxuNTRiajVKeGZZUE1yMDFOL2FVWm14NUdGdk9OWEZqTDkxemduSi96R1FpYjgxa0ltL0E3Y2U5UHpmbTlHaHY2QmhVei9nNFZNL3lOMjVvUS9XY2lFUDF2SWhMK0ErK3IwdkwrYWthSC96VUttLzkxQ3B2OERPM1BDUHkxa3dzaENKbnlveHhmTkp5NVYzSEdwVUF6eDN4UGFZT3g3Tkh0SXhldjlvOGxqM2ZvRTlhQUQrZ0FBZU5wajhON0JjQ0lvWWlNalkxL2tCc2FkSEF3Y0RNa0ZHeG5ZbmJZd2FFc3pNMmlCbU5zTldCUTRoTmladVNBOEV5WU5Oa2xXTUkvTGFRK1BBNGNEeXdFR1pnWnVJSi9YYVErREF4aUMrRHVCSklQTFJoWEdqc0NJRFE0ZEVTQitpc3RHRFJCL0J3Y0RSSURCSlZKNm96cElhQmRIQXdNamkwTkhjZ2hNQWdTMkd6RXBzWW13TXZOcDdXRDgzN3FCcFhjakU0UExadFlVTmdZWEZ3QjlsUzRIQUFCNDJtTmdJQUNNSUpCbEp3TUQ4eHdHaG44MUNCWWpEeU1QdzJPR3h5eUxHUmhZRldDeS8xK3hCak52K3YvcVh4cE1MNnNaNDJNZ3ZnZ0ExbEVWTGdBQUFBQUFpQUNJQUlnQWlBRGNBT29Ca0FKRUF1b0RuZ1BhQkRBRWhnVUlCVndGakFXOEJlSUdKZ1pxQnJ3SFBBZXlDQllJZ0Fqb0NVUUpzZ29ZQ2xvS29ncmlDekFMY0F2NERKd05FZzJVRGZvT1lnOHNEOGdRUkJEWUVTZ1JnaEl5RXFRVE5oUENGQVlVZkJWRUZlb1dlaGJXRnp3WG5CZ2NHTFFaS2htYUdkWWFFaHBhR29vYXVCdUVIRHdjcGgxV0hiUWVQQjdlSDNRZmdCK01JQ0FnZUNFY0lhNGg5aUtVSXpJajNDUmlKTUFsUUNXZ0poNG1zaWNnSjVRb0ppaGNLTzRwWkNtc0tvSXJraXljTE9ndEZDMWNBQUI0MnExOENYd2IxYlgzdmJOb3QyeHRsaGZKc21aR2ttVlo4aTdGdXhKbnRTMW50K1BFaWVQc0Rsa2dJYXdobUlha0pRbVVRS0VwQkdoSmdLOUFBNFNHa0JBZWExdmFRdmVtZlpRQzc5SFNYN3E5OXlqd0NzU1Q3OXc3TTFwc2gvQys3MEdzR2MzY0dkMnozSFArWjVsQkxMcEwvaVBYelZlaWZPUkFUYWcvdVNnZUZZczVIWWQ3ZU13eE9vYlRqWnIwakk2RmY3c01HQ09Hdzh4NkkyWVJZdnRodzZJaDJFTnpuYzZDQW9TY1RjNHBEWFVWUVY5WmdhUEFZYmZCWGZNYXpUcDNCQlc2V0tkTzlBdkJSa2REdk43UE92eHNQTmpZa0hDdzhCbXZyeXQwbCtKMkRGdVhVODg2NEZNbkNpRXoxb2xjek10NmhmTS9Gc2lHYll3eVkrWE1uUko3OWl3anVPekYvSU1QOHNWMmw4Q2NQY3RLcnFEeHdRZU5RYjdTRi9pME0rRHpCZmpuQTc1UC9meTFuMzc1WTFzZXA4UDM0RU9zM21vM20rU25jY3BrdGx2MXJMeEJYcWZqOG13T25KS2ZkaUFHdjNiaFk1YmpQa0lXVklKNnVwOTB6MXVTZENPRThCQ0hNWlpTUEpETURDT0dFWm5lMHFRTERnTDVHSTFrSHg5STJ2UHlFTW9yeVN0MjJ1RkdKa2xuSUN6UXM0UW9OaGh2d1V5aEZ4TVNnMjBZcUdmKzA4azA4U3RXOEUyTTAvMitmODZjQlF2Z2ovdW9xR1JzYTNNemM3Q2s2UHhpcjNCVzhOSVBtTTJGQytncDVnSE96MzFVSUNLVC9BRkNCU3d5WVNzaS96R283c0tmdVh1NFUyZ2g2a2RMay8xenB6TkdVNkNFWVJtbXg1YXZaN0dPWXhnV3hHakJKbE5GeW1wZ0VESU9GZVNaV2FNeFFDa01zNzJMRmlHMHFIOVJmOTlpdU0yQ1ZQZnNXZE9TYlMzK1lFQjBpVUYvMEc3d1JWQVpkam10T0lMMTlYWHBYU3NHcWhvYk9yQ1l0U3ZFY0dORE8yN0JpYXhkVmR6NXVENXJGMGJvdWUwbGVYa2xSWWZiYml5aU82ZVNYS1FzT2djbmZxL3RyRkZPUE5CNms3SnpwazA1MGZpMnRyTktYdDc2K3piMmNYdE5kWFdON1p5eStiakFWbDZpWTMrbGJXM2txUDJjc3ZtcmN2QkgybGFPbnpzSG1uMzB3bTR1eHBlakdTaUZGcUZyays2VWsyYzVqQmIyVEhGeFBGNlVxQWh5RE0rQ3FwU0RxcFRwUUI4d2ovQUk0bUdoc0R3emdsaFdQMnpBZXIzRWdzWklzSWRZL2NERWNXUUlPd3puMlBrRFNWaEw4SXZUUFlFS0VmNk1CaStvanhjWHVwVzFvdWhPS0JoeUZib1Z4dXRkcWpiQnNZeGUxYm5oaWhnT0JRbkhFK1JhUnVkeWtvT29zWUZjem53OVdGdFYyNUdNUjJvYm5ja1YxNlhtTGUxN2VFY3drUWcyMURZbmsvSHEycmJDbHZWVFJ5TDdsajJ3TnBpNHBWWnlTVGhjNlFuejVSN3hCWHVwaWFqa0x3V3ZhN3IzRG11NS82cmhaVi9wNWI0cmVqemk2N1l5QXpuNWpyL00wKzM5bHFtc3FPZG8zK2hNNW9qb2tYc3J2T1VPTTMvYjJHOW4rRjBXM1RlQVZqNnRzL2xJUk5Xb0EzV2pUY21SUXN6eDVkaGdaSHBnWmZLWTRVY1JhOUFaV04wbzRoRFNjMmpFZ3ZWNTJHalFHMGZNbU9meHNBbFdhVVVLR1F5NllhVFRoWFc5eVdSTmpTUWhsT3hPZHMyY1h0TlIwejRsTGxWTHNjb0tUNG05QUg3T0dyU1MxYW53VVZQUGVvNllKR0tNTU9FbTRXQUNjOEM4d3ZxNmVHTkRVQncvM29vejUvQnR1N3E2dEgvTXR4MVdzYmlxOFB5ZGJwdFZMSXE2MmMxanMrcnJKUW4rbU95QmtucVFPOVdWZFhTanV5VHFjUlNlL3hlWHU2U20xT1ptcDdVcHc2UjZ1U0I3NEhQYVlWai9sd0V2cndkZWRxSWVkRERwc21DRWU5cGNZS0M2Z3d6SE5tQ2U0MVRUVmdGYXlJQlJINFdyV0k1aFJ4REcrbUVqcUdKRnlvQTVqaC9XQVZ0RkhqUzM3bEpEaHhDTXBMc2E3OEVRSXRRMUcrWXhUWXlMd1dZcFpDS2FERHFidG41QlVTQmM5ZUY0Z2hpRnRCM1I2ZDBab3lKVUV5a1FUc2NUVkplcEhnTzdFeUhtMzQ4VnVwcVQ3YkhaczZiTW5OSndvdFNwTDNLOXBWaUZaYVZseTFMSzdtTVY1Vk52ZW1Iay9yNmxTeGNQUHI3akZmKzBSRy9ISzl5cGxSYXY2M3VDMXlPdWsyYTMxQ3lQUHorMXpWbFlVRlZaV1dWTEpWZll5RTZCdi9PNi9udlhETjNaZXMzTzFZZVhuQi9yRERkTmIvc3hjQU8vd0R6QU9zQlhXRkhiQ1NNd0dhdGN0VkNId1JDSGdZQnpkb1o0Q2R4UERxQmgyRU93d2swd3hvb3NFa3VVVDg5U1d4a2l6ckFGc3c3OUhMNHlGcXZrNStES1Q3bVA2dVJ5dnlqNjhidWNJVWp1akxIOENQc0F2eDc1MERUbEI4MXd1RElGWjBLNHQxU3hSR2FrL0JpcWhFUEVuc0RYQVhMMU1Qdytuajh3Y01MbExHZklqMnVhcm1OY1RqdmRJNU1KeFREVDJHQ1BKMWliMVYzcmxPeXZ2Zjc2YTNiSldldTJXdmYvNmZiYi83U2ZYeC93eGNPbGxodms1OCtlbForL3dWSWFqdnNDaHJsL3g3MXZ2SUY3L3o2WHpqVUtjLzF4N2x3eGhya2lGRUtadVNyendwV0l6cFZ3YXdCbG1EVnd3dXVwb0hNdHRMdWNqRTZmWHBOeGUyTURRL2VJQzNFemkrak1yQk5tekJmOFhUNyt4aHZ5OGIvUE5haXp4cDFueitKT2JkWmtCdWg1dkp2TGgzWFRnaFlsODZjd0RPSWF3MTRibUJYRWdHUmRNRk1IRVNYZUM5Q0lxMGlCMzBjUk1tTVg3SEdZUTNpVWlQaG1lcFlEN1FjUUFQZHFyZzVXaDNTR0VnS0N3TVVsNGlyRGRmbVlXbTlLVGJYaU9Ra3A4UTRjSXJwT1NmSlI2dzJHKzRFT3J2cnBja0ZJV0EzTjFUKzczK1ZPQkVQbGpkYUZDNjJONWFGZ3d1MjYvMmZWelFaclFoREtuNjdtT3BxNFUyM1Z0dnpYTnptcklxWE82QlRlY1lzajZvNkhQU0hocFplRWtDY2NkMGZoRUQ4bDZpeU5WRGszdlo1dnEyNGpQSGdVN2VNRWpnSHBSSk9Wc1BnUnd3K0F1Mk14WmhCZVQ2d0JnVGs4TTU5S01CaVVwS0NrTjVSU0EycnpxMHRXOU5zMDQyanpheWJTYjZNcjk2NGFHODVUVnFYOEQ4WDF5aDhxMzdFRi9EVEhrRE1mS2g1Yi9vZDZKazhaaVMzd25lclZzUHdtVzRCWElSc3FTNWFhNk9LamV0T2YwWnRRa0RFVVVhNVQ1RVhoSmpFeWpHelgvODNaRjR6Z05WeXA2eDk0bFQwL1AzL3NUeldlWWlQSGxEbGNWQmNleFdjNWdUa0o5L2NsUGRrTGVJaWNKYm9ONkRiT1pybU9ES0hzWjNUU1l6cGw4c3luekVtRkhJVUlPditYQUdlYThUYVVoNHFUaFpwbEFOL1hDNTk1eUJLZ2Q4NUZpYy8zOXZiM3d4L2U1aFZrNGx4bENnWXhla0EreEVYNXE4R1pkVDlqQXJXbGhxaVVHQ0p5NDZ6RkpxbkhFTjZqSGt1YTBsK3ZHbENzRW5HSnlxOXI3bzg0djNnOSs0dGwzTmc2ZTdKekdjZmNZMC95VjFjSlp1TW54eUprbzFzUUFiZXdCL3pPTE9yRFMxRlZNa3lRSkI3bUZJOE0weUlFaGxFdkNSUUtTZ3RLQ3AzMHAzU1pkUTAvUlcxT2pqZGxQbm56eWl2ZnZQTk8rcmxoOCtZTjVJODdkWjk4N3J2ZmxjOGRQb3pkMy8wdWR0LzMzdmRlZlBIVlYxOTg4WHZBajlNSWNWWGNHUlJBTmNtb0hlQVY2QVo4c0F3Ry9NQldwSGlPRUwweXplOEFrc0ppTUU3V3FEUk9tQzNZbHJZMjhVU0FyRjJYclo3akZRRkxpb0EvL3JuZDZoRHRUb2NUUCt6eGVxVy92cUY0RHNXUk1BOWViWkpDVlY2WHgvejNndkx5OC9PcHpPNkhPWUt2UjdWbzB3a0pjeXdSV1FHSVIwS3dEd0J6bEdyejVUQmZ4UWRYRUNreUs3WElJNUExREt6UHJzbkhEU1JKU0ZDTGFxU3FSdEd0TFZPblRvLzlXVWpTcjdwV0NNQUl3NFUwbUtRbWlQbmRxYUZscStYL3dDV3g5bVJ6bVhqK1V5RGFaTVhmV2RneHI2ZS9qeHlNRER6Yng1MWFkblRMMmtlSDVFOEdSWTlYK0VEd0FROHFLdkx3ZmZOV05jeFlWSG1BSFAxYjJGMWJpeWo5SjBGWENvSCtadFNkbkIzRk9vREJnQ3A2RU96d09nN0lZa21JUW5BZUM5d0JtTXdyS0RwSGxlQ3pHVFZKVWtPRFZCaFdVRExvTENWUnNhWEUySUtSVlZRSmdBU1JJcUNNK0NSMHNrVy91M1hoY3ZrUDN6OFl0QW1WQnN2VWZWTTNidXBidEo2ZzJaNkIva1VMdW5zSnJiVnpIMXZJblhyaW9jZTZnbDhlZXU2RmxDTmFHbDNFKzRTNVhiUG5STnZiWTlObVRwL3Bua3VJZlM3cUtKZG9QSFlOeUxvTGFJMmlHaFJQMXRkZ3BNTTllb3g0eGFnYXNFNVhrWUl3Z0dGWGdoeEZGdWlxanNIb0tuOHc3ZytLUm9PSEVHYkxBQ0pYZmQwRVBXMVVkb2tVNjNHOWc2MnBmbHpSenNkdlU3WmpQMUcyajhvTFlNZUJ6NWJPcXBmdisxMEJkeXBXTmZhdW9yRVBaU3Z1UTdDWldzUjBDdUxZWGtBeUdEMUpaWFlFOFBuTVpLY2VBRGttOG1KNUhRdnJpb093YUJjTTRrRUxSNEJzL1JBUmw1QkNIRWNENHpCRHhGV05vb0lrdWdPQ3BJa0w5RThmVitqSnVIVVN1dFJyWWlLSGllVUd3M29HaENIUHRLNWN1Zk9KcFovOWZ1aTVYa1ZXOSt3ZXZIelp3aFdyS2l1U2pZeWY4UXJNU3U1SXJMMDkrazVnN1ltcmZ2alQ2a3BYaElncHRYTHgvRUdwb0V4a2dtS1pFaXQvRTJpS2M2Y0JuMFJSTXRrR0NKYzFrVkFEdkFsUXlDbTBzTEMwaU9ISW9xVzhIS0h5YUhsVlJSQXVMUXNHQ2cyR1lxQkh3VStNbnZodUxVUUlVbmR1bHdLSTJEVk5HMFgyTDE2ZUNULzdYM3VjOGIzOVc0K3Qydjc2Nks2WHA0YWp6K0V0MkNCdlgxb1g3Vy91MnpDOG1EdmRNTVhtNldlTlBiZHZhMjBhZW5UTDVVK3RYcmV5N2RqYVgrTGF4MHhqU3lwbXgySzlzWUh1VkQ5WlYyZUFuaWtnb3pLMDRJUVZnQXV4S3lhd0swV3dDd0IrR3pnSGRnaldHaXVrbERWVW1peFdUcUhSQ2VjR0tKUXRReDdSWGNFVCtpaGV3U28rSk1ybVY2VFdhQ05aSGM1V2ttZVVoMHkxZ0tpalRUcDhqWHdIV1RJK2dUblBIUUhOcW5XZmw5eHV2U2xhWnNsbkwzdVJMQkxjUndYQm9zZGczbjVZSTZYZ2x1clI5T1JVcHc1UUJqSGNCaEFEdzQvb3FUZlJLZDZFNHpRVFVGSGg4U0JVVVY5UkY2dnloRHhCb1J4dVVWSmwxQnl6VHA4ZHFjVVRrOFJyVEZaY3g3ejc3S3ErMU5CbFcxKzcrZWJYdG01Y21lcGI5ZXgxc3hhUmZNeWlXWDJEZzMza2p6dTE5TjdsZ3plSTRtMlhiZmxXWDkrM3RteTZWUlIyRFM2L2QrbWJxWTZPbnA2T2pwUWNXdExWMWRmWDFiVUVkT3p1QytmQUg1MENSbFlSSFhOZ2hqTVRqdmVBZFdNd3h3QnRQSi9XTVJVS0FHMCtIMEsrS2w4a0FPRW04Z1lLUTZxT0FVVUZzTTZVdGRMT0pDYkdvY1NTeDdESS9KSW9sSHhRdnE2RTZOb3p2OW1ZbjlhMXhhQmF6VlRKdUZOVW5lVFQ4dUY4ck9wYTkyMDdORjE3aDZpV29tUXdXNHBiMkljQm8xQWZ6Mm5JSlVEc01qdE1mRDRZTUN2NEhXdXB0Y1Rsb0dDRytuZzFKNkg0SENiM1c3NEtiYlEvWmtFbTN6VjJOQ2YzQlhQWUFkaFBvblB3b2Nwa3FFang4Q3o0ZUdadFprSVk3STNQQ3lpRHpJQ2ZNQU9xeXJtNFVKdkY0em40TUhzdS96a1JLc0thdXdhbHVHWnVLbkFFc0tpUjRLbWU4ZkZXV1RuRm9scXNaY1RwT0F1cnpwZjlmcDVUY3BWSVl5ZVpPVktKUzNMbU9jOS9XT3h5RmJNV2JxcFUyZUFUSFBKYjhsc093ZGRRS1pud0hYa1Y0VEM0MXp0QXZ4NUYvOFVKN0dGQXBDSUtKNE1nQThLSzFlbTBaUUQxMmdGMTJrVzd2N1NJNGxiZHBMalZmbWtrV3pUdU8zczRHOW5LOGZFNEY5MEJ2Rm1rOGFZZ2c5T3o0cnV5a0liVGRWbnBGaU5PaDNXWTZ3QStuUC9RcVhDSW1UTjJVdVVRYTJFT1VUN0lXMHdLajdDRUpaVkg4aGJnemM5QVg5K0hHRjFDZGVpNnBBVjBCVnZBWjRHeXFzRjZNRzM5d0I4amZoY3hnblFwU2lteUxMbGhNRFlpUjFKMzR3YkNHRVEwYnlSNzJFRFNHUWlBOHRVRmFxc3E0VWRGS1ZLaHJGb2E4RkYzVUkyREhaTmdyWGk5UFFmdnM4VnZmUDJ3anFsS0pLb1lDK05mUDN2bTNKU0NRY0tuSDJxYlBqMlZnai91b3pPUDdIOGcwbGZzZGhmL3ZFcnZ0TTVxbno2empFS3dmd2s3bDV5UGVvVmpSSGVQcVdzSCtTK3M1NDV3Y2RTRit0R0M1TndpRjJOa0lIeGltUjRUMWlPTzBYTWppREZqSThzWVJ3d1l3ajRFekFMNHBkUHhBd0RDU0dxSDE4M3Y3a2FvdTcrN2I4RTh1TkdjYURBWUM0aEJDL0hvR2FlbkxDMHFRQldHd1hMTHRrNkM1ZzR6SWJGZU0yVjJxWjdKc21VaVcvc2Z1K2Z1WHpKam1TMTF6YUoxUys1WXVDemc1NHNjcnBJeWJyYWh2RGpZS2k1OWRQdWVuKzlZZkhUN1Y2NHo2S3hPbzk1aWFmeldnaVAvY2VNUjdIdXFlbWExVkNiTWlFN2o0Z2MrdWYvR1U4TTlIYmZ2MnJiK3AzdTJ6ekRxOUs0OCtiVnlseFJvMzk1ejFmRlZYLzM0eml1ZkhLNWdTLzJsTnB1ZGQzdjNmUGpRaTdqbEdUazE5L3IyNnZxQkcyTHJFSFBoWThCMFo4SFBKaURDbjVKc1JFYXdQMFoyUGRMckRVTW1iREFJS1IzSHNHUUZBa3pDSWpGR3pVMHd1cEZnT2xzd0xwb05aY1NXNDBtZ1hNaXZuK1NvSTIzay9YcTJubVgrcmM2TWhYNDFrbDZpYlB1aTh0ZWlYZXF4VGNwMjBkZ2phaEQ5NXBMclA3bUdPK0lUemwrbUlEd0Y3UjA4bVAyTk5TcmJOK1RGK0RGRWZmTk1vSFU3ME9wREZZQmdkNXpnc1o0anVLSVdsazg1K0RBOTV2VHJlWUpmQWZNUjlLQlRBMlVTWDVVbXE4QWE4VHlCSGpvQXZ0dklCVHE0QUxTSlhhbU1SenFkTmh3V0VFSTFzVWk0Z3JoeUgvTDZnMDFHYlFIcEZieVlpYzB5TEdFMWpBOHdtVzdab1IvT24vUEh0Mzg2OW9KQy9XV1hxVGJMZVBTMnBVc1dMNy90eFplSFZyL0lIWG5zMElJZFl2dTczMzVDWVFKclZMWnlLRG10czIzTXZMOXJGclZqNndHZnJBY2ZIa09keVdRbEJvaElQUTRzSEFLYitHRTl3QlVsK01yc013dzFDMkdPSUY4QTlNR2dLQVVDQmhYT085V2NwcG9DaGZrcnVGZk5DQ21SY0IxTitYTlZzYlpaMWZYT3pXdjMzLzZOQS8zZlhGRmdyZlpaWTJkL2ZmVFRXL2IrN2U0bkZqY251Vk9BakVjRkwxQzQ1cHJYenB6K2NYV05ZV0d3ckw1dzQ5M1kvZHhwN0w1N1Y0ZG1BMXBCbnJ0Qm5oNklmSmNxWWl4U3hLZWo0dUJ5eENlbHhjY2hEc1JIeEthTUl6QXNMVGFJNmdPaXp3czNMUUVWMTFPUktWSDk1OHVMeGVmMzdqMy9oQnhXeERNOHJDcnJiM1p1dVBmKysrL2R3QjNaSjM5MDVvejgwZjVjQVoxdmVPbjA2UmVwYkFnOUFQaFJISDJtZ04yWWtxdUd1YkljeDI4all1SVpGZ0l0akkyd09vMUdBV3c3eCtsV2d1S0pPcElac2NCVjFWbFhzVHczK2dVdUk2eXJTU2ZHditoMXlWWmtBSmhnMkRiaFNqMEhLeU05WDFBczQwcmxlcFM1ZkdDQTV0V0IyZ1ovc0ZHMFNYNUh3RXpLY2FwT2dmZnd1Mmc5VFFlclFRMzA2YWxKQmNIRnlraitYTDc4UXhMcGZvanZhZW1jVmdOaC9tQ3VQTmpidVNObG92d0xraXcvTkVaaUsvbWRINUV2OGpjRlg2NWtjbVJTang1U3VCdlN1S3VVRDlicmdUdUdJYU5pS3RQMUExN2o2dmpLeE1YSGc3VDF3R3I5dHZGWEFQc01LeWRlQU93alU2eEh0Y1FVRSs2WnFDbk9jTS9tcjFNTXpXUnhkamJycGltc3V3N1hFTjdKUC90WEZSNGRVN1kzcWdWTTltZ1c3K1NmRXViOWQzYWduV0VjUm5QQXpod0ZPOU9PdXBLem1vRXNGMkFNRWlrQXFtTTRyZXBpWUdnbUJLTHM5RDdEYUdVWE9OeU8yb0xCWUZ3QWM1Tk5YSTY1U1RSbUtFbG5GbXlxRDg0MVAxYkYvR3pZU016UDF0VXZhZjVFMmZvY3R1VnZYNjJZb2ljWHFhYm8vMUJUMUxlQ21LS3lSN0lkakR4V0pCbHJhalN6ZEZVQ3pCSUdkSWE0ZTBCZkZoTDdpc3hnYWN6Y2Vvdkp3SkxhdERXUG9ZdUlaMGtlR3F3VXpXNEJuUXZSL080NXMyZk5uTjdlb3ZwVmZ6QS91elJ0bTB5Q2Z0dm55elhERFgrMnRKV3lkRk9UNmw3M0tkdE9lV2RuN2hGdEJMNUtIWUZ2N3RTTzBEZ1ltSEErUndGd1JQNzFaQXFoTXV3VHJGY1ZoT1RuRVNjQW4wSUU2WE9BcFBraGt2WVRVc0FaWUEzU09CTkNBWm85U2lmOUZIcnFKa0Q4Ykp2OEp6ckx2MktVQy9NeCtxdnFPMzh4K2Z6VENvelJhbHJIUFFMaGF6eFpYMHh5cmoxa1BZSVBHYzJlTFFKSnJnSmREaE5nQklORFlpQW9qcHVzbXNRanFRVXliUnVOMGJQcUNhcEFUdi8yNTMrK3Q0QXE2SXpoQlF0a05jM0Z2Sy9OZGV5dUYxKzZzMERBMDZsS3l1ZUYvbVZNZjlwVXFicjNPc3g1SlpxZjdGME12cThLSW5TU0FRS29nc0VxY3d6ODIyVldsVEhQb2lvalF3SmVIVll6ZG5EMWlpVjlpeGIwekFHK2krRjRreTFvemRaRVhFYktQVzRTdldmVk9VbXdFNHFSZ284bzVHUFhGOVZMbktXV1g2TGtSdVFIcHd3SzdtQ1JaQzJzOFprVUh1eHZXeXk1aSszQmdwS2tVQ1hXYjFmMXRDSVhFZUd2S2R0cVBMMVJQYkpINDUzOEdKdW84YytxN3lvS1ZDaEh1anNqVGNHZTRsQlVxSHZ5YzNUMlJaeE02NFRtQ3lKb3RRWWFHVVJ5VTZNUVNDSGRFRVI5T2dWMWFBblFVaEtXS1VQQUVyQ1kyNVk5RW1VR0RpVHpFYW5DaFFuVGJVR0tyYkpXcjZZNkYzTit6Q2VVM2pmeEVOV2ZqTnU3NHc1Vmk5YWx0UWpqS1lvQzFVMTBlQmlaZ01hWGdjWVVzVit6QTE2V0kxa0FqdWdRSGpWZ29qaG0wMFdzV0FwMXo1Z0dCRWdTV2JHV2JLMXhUS0lSWmlXTURKbng1MGNKV2xPVm4vc3lwU1Z1YmMwMVZJTzZyK2ZGS2lNeDZ5SGQ4dHd6TGZseFZSTThybExkeVdkMHBTN3NuWHp0TS9Qa0RhTFhLK0s3eHA2ZVRCK3NOdG1GLzJLemtuVUd0dUVZOEtnRERUOVRYMEFLVldvTVhncUxpWWdYZkptaUNReURoNGxCQzVQaXRXL2lXWGFJaUQrbEdCREZuM2VnTmdtNEY0ZEFsTHE4SERNU0RHSHhVa1lmUXJGc2E2L3dyS211TlJhMXllM2MxdHlncWxPejZJYUtBdndBcDJvTnZqck5vejYvdjlqRG5CdjczbVE4S1IyYmo4YzAzV0ZRQi9EbDF2L3R1aGxyK3ZTV1d6NDllcFIrN3IvOTl2M2tqenQxbDN6dXVlZmtjM2NUOS9zY2R0LzEzbXRuenZ6d2gyZk92S2JHQlZlQWZBSVFyS3pUVnFvT2tiaHR2WjRpS01NRVYwTldLc2ZyOWR3MmJTU0V3UHpLaVFNcGFJMlJmSGtBaVJSNUdZbTFWMkRxSlF4ZkpsaTQrVzkvZS85dURXYmRvMnp2dkZOZHErTGRWMTk5N2JWWGd4Qisrc29yUDN0cU1zNlBIUjljdVhJWjRibjhiNVRuVFdnR2VxWDdTUWZRYXFyRFNLOGsvMHVUWnZJRjk1Z0FVbllQS09jbHBBY0s5WWoyYlBFRExDZ3BLZnV2SmVHK2J0aElxamdHQWwrOU1EYWdqYVVaRkZwR0lFNWsvR0NJalZsYXdSc2w0MWx5Nzg4WkRzalYzZHlNVVBPTTV1bkpkcGo2RktuQ0lZbEJNNDBvVlZVSTZXazJKU2V2b3RmS0VHbzFKVVRiOGk2dU5NWE9qYjI5dmhrK1QwdEpiN2NscnpDUzd4Q2JOamRKM2ZWVEY4YXUycW96T0NyekMyMW52bkVNeHU0N2VIQWYrZU5PM1NhZi84NTM1TTl1WXpaNmpUcmVXS0dUZkVGZlpVbWxhRFpaek5XczVBbUpaYmJYMm5EUks5L0IzRzN2UGZQd3d5ZFBQdnp3TTVtWTlGblFQZEt6dFAwRXJIR0RsbUVRa0FIT0c1Z1J3Z1U5eEZPa3FzU3pETW10Y2twdXBSVENCWjNlYU5SdDA4WWlvMUcvY3JLaE5ML1EwelZ6T3Z6U1ZLS0c0WGliV2FzY0ZuNnVoNzRJbXB4TVRaZi8rei9qNVM3UlhaVG5yQ2gycUpIVTNGVmhwOGNwRmZwNkdwTnFWQ1UzajB0TzVEOTYxN3BWcTliZHhSMDUvZFNmV2wzaDBwWm9qY3Z2VjFRNTJTMjJ4VHJMSThFTGFETGRsdkdjN3U0NW9FQjNnVDNwQU4zdVFxbGsxMHlNZFQ3TThBVFBZTjJ3UWMrUWFpUHdQTE5QcWxvc1dOVndDcEgyRHJwTEhWTVhtak45bWhTUXFxV0FNU3Ryb1dnU2lTTGNDc2VVbEY4b3F4YWthaUJoaDhLOGtNcWtPcVdKa2YxVlBBTHhsN242YThOekZrcEMxV1ViYm03KzV2TFRYM25rU3FVZFVReWI0M2V2V1RJWURwV251dnN1ciszcFcvWFV0bmxmcWFzRnVyeUMvSGZCVzFEUU5iK3J4UnV3MnV4T1VScis3WmFqZzJ1REpOV0pld1d2dlhEOWh0bkppb1Nqd0ZsZ0x5dXAyTE54NDBPRERUVUJrZ0hCYUJYbzJrYlF0U2hxU05icXNCbzJranlkVnJUTStCZ0s3YUlvSXBMWXdoRlFxNVkybGRLTE9CVmJkbEdzcHl6UmxJaWMrSzFxdFBxVTdXOVBrS00rZ2QxTFk4T2wvaktZT1lDTUhOZDZRZjVQZXZ4aFVpVERhbzhreVRtUzNoeWFYbVNIUUlnMEYwTzZIOU9BT29FYVJaRUNDbU1tS1V0OG9kYVZNMm5vcHdEc0NSRlA5WmJYRHh4NGZVdDFibFNUMnJKaXhaYlUrTGhtN0FmN1hsMjc5dFY5VEZNMkdoejczZllycnRqT0JETDVnUXNmQXkxbmFTMFphSkZvellSWEtkTHJGSW8wWWtqTkdOQ2RtSXZ1VkJDRUo2R2tOQnNlUDBGbk9GMit5OXJjMXRhVUp6K296Zm00c2gzNHpSOW5hVGc0N2IwWFM5NHlrWDBzaDRaN21iVlo4LzhyelA5ZG1QOVUxSnhNeEdNMkZ1dElOUnlSMnY0b2dYaWdZd1N4Y0p5UVlyQkd5bFRVUVVDZUZKUnlRUXByWlJSRXA4Z254RTVLbGJKOGNxZzdSV2MrWlMxYldCZWIxbUw1NW9PVzFzNVlyWXNkcmxOcFVnSGRqc1k3OUJYVmRWVzZPK1BySjhTaWk0czlsaklSLzBZT2kyVVdUL0U0dXAvRmo3dUxIQzQ1eGN6T3l1K0FRbElzdDVCVU5HZlhseGs1SWtLVFVRK0VHNFlzWmtaSmdTdFFsODhOMkdmTmlJTkE2Yis4YkxCcm5EUVpQbGt1M0RpWjJOMkpMTWFNS0l5UlA4WmlXeTUwYS9qT1kwSDF5S2l5YmNlaS9FbHJMc01pZHh3c1VvOXNTZ2REZStVcnN0Zm5oeC9tQlBIMzRLM1pqUHY1ejdOanpBcmcxMUhnVnp0S0pCdUFYU3hobHg0WVJHSmkwSk5KUXZoMjFLcXhLVWRaSmtkTGwxd0lOMUJxcXVSSFgxVXQwUzVsKzZyOGVDeVg5czdUWnhvbkxPeVA1R3hpMFFYR2xCUHZ2WVdsZEx5M0QyaWRRbk1VYTVSOHJLaDBLMjNMOURScGFZQkw5VFJOSEtmME5JVlFRQ3hzRkF2VEdZTjBTMU5Xc0RkSmU0Sjc3R1c4bFNUdElOVDdCZERvWk5ybDQrUTdXT0lDU211YjcveC92MDBUbXdkb25EZXRsRFhTUkNkZXFmU01ZQ3pJVDdQMzg0UElUWEl3SkVvbEQxTnd5ak14WE9hWkdCanJSb1ZTWXdOcG5lRFUwb1U2RnpYQmFQT3pYeUtaUTRZNkxwbG1FWi9Iblp1cXAwMkxlUVZkUlBDU3ZjK0tsZCtOd2U4K1NuKzNJaGtndjhkZ2xsbWZhWHRNdHlhNmtjc3ZOZkpLMmNTbS9pNzVXWnUydzk1SytnY1o4b080VTM2ZWJtViswQ3Q4OG12Qkc1czJyWnI3RS9sVWRQY2wvQ3ZPREhqQ2k4SlA2ZFpNVDVhNXJhU0NpbnVBYnNUc0ljMlJWOEZBTC9JRXc1eWhLUEtVRGswbnBTMWFzdEZsREZzbzNhREUzRjV0eE8xOFBDeDR2R0g5YzgvcHcxNlBFSTd6dU4wWWkzQ243STZ4KzAwR3QyZ3k1RnZ4WHZrNmE3N0JKTG9OSm1hVnd3NjI5ODJ4Qzl3SDhydkloc3JwZkZ6aldhQjBmdEpwVE1oM2NXOWJkVHByM21lVmVYVExuWlhmdGRYVTFGVGJiTld3SWJFOGRySmpiQU4vRk81ZlRPOVBZbGVsUmJMSW1iNnhVcVlKQmJSK0paNXRLQ3lYTEdaNXBLaWlLV1lyd011NC9jRFZldDBibHZKUXZOdDhRY0c1VzhCdjNNc2VSM1d3dlArZ3REL24rN0NCYlcwQjNPb0FDbGdJUG5LTzZObWVBU1ZNRGtOb1FQcXNSa21Qa2dHeGhoRlNGcURSUVNTbEp6d1labFJBck55NS90SVhBTGtpM2RVYW0wcVR0WjkzRlVwZkJIR2VkZzBKVE9yckVhcHZyMjlyU2dCdHRTS2d4bmlqV1FPTmhibUFPdDJPUXhQTUpDT2RhZW5PZFBmSEU0MFFrU1JlRmNwOWlqVzZ2SDJvZU82VHk2ODQydi85NDN2dVhyU3g1ZUFzbTZVNFZKQWZHM2h0eVlOelpuWE8rSExMemJ2WTQvL3lsUHhPUlZReFRQV0p0czdVVjRjUDNGUG03VXg2aS9oQVZaV24zbFplUHZaR1hVMTFiYUltV2FySXBSVGtjaGxmamlwUk0vcUJ3bTRUQ3dHY0RjTWFBNUdvWDBndVhwVUdHRFUxSXBaUzVERUlHcWRIVWpvYXZhc3VYNVZEOU9KREZYdXZYb1hVakVjRWhpSU94REJ5NmRIQSs4SklCQVkwUjVycWEySCtGZjVnWXpCZ1VvSnJXMjRqR2cyMkp3dGQ3Rm90WHEzTjQwUGUrcjI5dTEvZHNPSFYzVU9IRzd6Q3V5cnEwOHB6bnJjM3RMZHZTTFlQMXRZT3R2UGxZRXlXTmJXTnZ2V1ZyN3cxT2pCdmtlQlZpOGw3MWJEN2lkWWQ4K2J0YU8yNHNyZjN5ZzZ5Um04a2ZYZDBIWFFtazdHTDFGTWpXZlhVeUxoNktpaFpNQ1FHZ3hQcXFkbWRCWm1TYWxhUGxGTFVZRDlSaWhyaCtVMnpON1cwYkpxZCtsYVBQVDhxMkNQTDMxaC82UDBiZHYzcjNnYzdtNVBzY1RESkw5REVYK1hzU01lT1ZHcEhSMTJWYVc2a0xGclUwTHp6clFNSGZuLzlqamlKS3hnMEREUTlvdXJRZDVNbUh5eGRHMVllSHBoTVljalRYaXlSNjhTRkcvMmNvVU4wOWVseWxxeWlNQ3pQcmIvMDZJa0tJd1lEY1ZGVG1Lekhib0p0T0p0dGhlNHNoVUhqRkliOTBLdjJJdnhaOERZY0hsSlVwM2R2dlpxY3diMXlCZFdWSk5VYm9qR2YvVlZSRHErd2FONkFvanB0VGRpdGFZeWlLNHJlS0d0ME4vQjNMdWlNSDl4L1I3STFuU0htNFNTUGFCOHROMHdTVlJHYUlpWmNDTE85Z29DUUVCS0NrZ2dYbG9jZEFnUnhKV3B6b09pL1NQOEprS2pUK3dsZGxyT2J2Y0xZTHNjTksrODlZYkVVbHVlWjNDVnJmcmJtMEZ2YnIvbjNyNStNNEdkdFcvdlk0N3ZQM1MxNDVpMU9jQlUxZ1pJU3I5RWYzUG03V3crOHRmTzllK1lvL2Q2UEFDWmF3d2RRRTdwY0VYRllLMWNhTUtQSFdzSFNPRXpxdmRLNENtZElHd3NuNFY1R1BKSzVLS2UwU1F2REpDOUVFMnlDV0VRTHc4cGpKc3J6SmFMZ3hSbjBNV2s2UTJtU3Btdmtua1BGeFNhTFdHU3gzVGgwRTA1UWZQSkRYS3dDU0RWSGZQSWtPWDd5NURFKzBHVDBlMHFrcWlBZmVyaVYxb2luNXlEa002UkRlczdwbDhsYWtkZHhqNEFzYTFFSHVrTjVDaUdJZWIyMlZpSUlsSmxudVZHVGdad2FOdW9ZMm1PbzEvUEQ5RGt6clJVM1N0US9uak5hYzFYS3BVUG9vaGVDMTZxckEwdlNVZGMrSlU3YTVBTmlrUmhVdlpaYmFSVWZsMFpPOTZRUi81U3pQTVoxWG00bFJ2UFBDb1A2Ly9MbnZ0ZVgxK1RsQjRyenpDOWNlZTBtTUswM3ZicHg0NnMzTlc3WnNqdzUwdFkyQW5abVh2ZE16V3lPMWIzNkc3ODNQMTRVcTY3a1d0YXVYNWRvdmZiWFgvN3lyNjk5NzhidDIyOU1iTzd0M1p3QVBRQjR4ajBFOW1ZNjJueUNKYzhmcVUraFNzaGdVQm9QcEhTcmJHUjgzYUUwS1JCdE1pQWo5ZStURDFJVWFqcWkxUW1hVU5BNkRkVEN5bVNSQ0hIb1Z1ekZuNThzdzQ5N3IzbDAyUzFkcWR6S1EzVzhvM2xEUjNYdXdZelhvWjZtNU9TOE8xZkx3em1xdGFaMzN2Q0RnMGR5OG1KN3RRRHN3Z1c2L3Vid0N3c0V0QjZoQWdhdHN5clBVVDhncjJQdnBjZlgwcWVvMTZGbjZYcHRndkVIZ2JkVDBSVkpZMGZNYk9KSWdLL3hWMTF5VXNwQWM1S2dYWUdVeVVoWWg0WmdvU3FOTXdJWUprNFBUdnppZ3hUK1RrVkpxWUVXTDZSR3dsK3BVRFhBSVZaL3FaSWdpQ0lncXFCZTdmblFPK3E1SFI3eTFHT2Q1L3crclVOczFYaFdnaUhnNmlqd3Y1OThWbnp5ajdZM0t0dUFleFY0eGNpOHlSZ0pkakQycTJBOEVRd200c0VmeWs4VFB0MEhmT29BUHZuUkxJVTVickM2M0JCNUJrNUtNV2tQUkZDTkN3NkNqK2ZZOWRuSGxjZmsvTWhIS25qcVkzS1hxRk16UC9KcU51aTgrcXdudHAxVGQ0NHFybVZ5UmNBWFBvRDVIZ0M3MDRFTzB3ZHVubWxOTUVTeWdQQmFNYTlMQVBhZ0NJODhpd09ZWGpFbkJqMnIwd1ZTSE1Nb290WDhPZW1IMUU2UzRIMlNvVWtmR1RXRXRDRnF3MFlrUFdKQUsxKzFneE51RE1EL21ZNE4rc1NLVFduWnVOalh6QlAxcExHWjJpYnkvTEt3MFN2c0ZMekZwZFdKM0IyMU9lRVloSlkzOW53dEVydHVGbnY4N20rTW5TRVJLR051ckx2amdQejRoUDNiTlFXNC9Zb3JmN3htdmJvK25nQStUa2NqSjZhUmVGMDEzQjdTcDI4WU5oa1pneUV3dmdleU5Ca2tweFVuUnlJUUdEcUVKaG1vMlozT3VHWjR6R3FpNlAvWjRpajhBWjgyNzM5bWN6NFV2RGQvSDZ6ekY3RTRES1B4NmVENzRPTzJBbDVaRGp6S1I3N2N1bDVrUWwzUFYxQldWSmlwNjQxL3Vwekp3VnFNL0lmcnIvL0RvVVAwYy9iR3BxYU5zNVZQOWpnQnBHL3RWRDdmVXhDVWhya1pGSkIzY3BmQmZHcFFFdDJjTkVVeHg1c3dTdnRjeVVUU2xUenh0VHhQWGFZeXhVeGVLa1RjUmpVZGx1VmtWV040c1N2QXk1S0h2bXFUdFIwUUc5YWdhaUpUdFdpVmlVeHNsNWJkUkVhd0hScktWRnRjWllQcWNYT3c2SWFzVUlVOXJpRk4rWndpclBFMkRzRG9lN25SQ3NYMndMdEhNcndqeUNLUWhWZWt5WEZLT0ZOSkNMRXE3ejRmb09SZU1ZRjNJdWtRdUFoQ21ZeURuNk5FT1FpbFA1ZC9qNlNEdjhJczBNNGV6d3J0emwrbmJKVlA3TmFpdi9mRzQzYUk5Y0JXRUwyTG8yZG9MK0NKZXZMc1cwOHAyV0pNcksyRmxreUpPYVUxcVVDSzVKVFNYN0tyTWFydHJjcTBUbVl1eWhTNHhsMlRBZHNaWTB3YjZVaTFKNUl6ZGtCNStVWWNOU3FteDAwTEtKbkg0bFZMNDcrRVY2YmF5bjdZWFdXM1I0dXRCVk5hVTN2bll6V05NYlpJclZ2dlVGMldYZkIydjdLR1BUNmx2TUVmamNZTXZsV1BieHlhM0s3ODY4SDdGSjRlQmRzU28vYTNKemtuQ1lTWGphdnhSYkpxZkpIUHFmR0JrWTJKQWFsYURHaXZHYUY5VjJxRlR5bndhY3MwOStVaVJKbElmWTlXK0lMWm9mV1A2QXRGV2c2dGFlbnNDcTFZZm4xaTN0TGxUKy9hZjdYMlRwRzZ3OHUvR2EwcVhyYjJZTXUrRlErdC8vcU8yZzcydVBJbWtZN0dTckhTYmpLYUN3djlWdzBQN2UrZWxYNlBTRWZ6d3VJeUU1OW44Zmw3anZaL2FjWWNrL3I4TTRtN0Y5UGU3SGl5SGx3UlNZdU82dWp6bFN4OXZsSnRrTXp0eHBiRUNsR1FKSzFBbG03NnREblZ2SUVhRXFxVlBqVXNJdGxieGxudnhOdHBNSFRyVGJIckZ4VG11YVFDdTh2MWs2OGZPL2tTT2Z4UzJ5enVGRmxPNzlNZzZNOFBod05Hc1NMcUtmU2FON3g4R29za0RNSWxTdDhqelAxcjdHRTBCYTArWWN2eW95VWt4OE9SNmg3SGtaZnlaT2NJa3RMRWswcWN6MmZIK1ZTUnA2QzRGQURjSGhlMTBtVnVnSytiVUEraytUcGlKdHF5cWdmc1g3eXEwM3lYK01NTWJzY2dIdW8rdFdheUlIc1ljT0xsR1VjSW5oTS9vR2d6WUhkcnR0Y2tkUkhTN3dyMFg2d09HUGpmcWdQZW9OWUJmNWMvZmViTWFmbnk3NmZsZHI5MVB2VjBRajB5eWg1VzQ3QkJzYXhNWkk3bVZEcG00VlBqNjRBdy93NVNCMnlvS3FCMUhhVGpFS2REdVhYQVFGWWRrRFFyU2NRTGl1UHJnRGlUTGcvK1Q4dUE0VHNNamEzTlUvSU8zR2FkMHRKYWIvaXFvQktrUGgyeXVIdWZ1U29jaVpodjZaMnRaV1V5cEpLU0oxNHQzeWVXZWFWeEpPL0VDejNlb2hMNVlYeHpkazJMUEJleUYyai9uQnBnNEdJMXdKbTBCaWdXanE4QjZyOXdEZEFSdWxRTmNMSFN5L1pmbUszUExmaFpkKyswcVVmdVY3WngrZU9HM1BwMjN1aTFoZXFSVlJxVFBwTS95VGJMZS9mbUFFTERwOWxNMjcwN1hRK3JrTmRTSFUrUWZvTXFOMjE4MDZtcW9hNWhSRHJleU90U3RQSTlNRWR5alN2Zll5dWoxOUVYRWJRemlTK284RW41cHBrM0hybEpDcFFXejEwOXYwbitTWGV1MnJjZU94WWZyL2JuLzNucm5XMGNudEpWWDhYd2RadTNNRHR5dE9GbXZEUFQ5MGhyZlVCYmhOVDZyQmV2OVFXK1lLMHZNTEhXRjBGaDBSMmY3UDBGT2EyZGNhM2NGOFBVUWRGNm45VSs5aEdlMFRDek9wYXZWdnlzZHNZcy81UWU4UWxzQ1hzWWFDbVZIR1BuZG9vZVMwbXgvRTlhOVlNampIdWJja1FzZzBrK0pEL052czhQUXF5K0tXbHRnVUEySDZZZkJnZWp2ZnFyTlAycUFwS1VaTmJTekRXaGlMN1V4azllcFlJNEhvMWtob0hJeVZPUXhGNWpabjQ2RlpCb3JJNUtncmMwb0ZkZndtR2xDVzBmQTNTN0NQbjVXS2NnT2UyWmVkTE1wVHdycjZWcTRWczFEaXErMkdNcExWcDFXWWpqOGFicnI5K0tqVGkyY1dsUnFjVWpmdllCbTRldnZseXRyV3pISnZhRDgveGdwRDBXSzRnczZ4MHVHYmxGTkFuNzFqbE51eTFGbmZOQytiRlllOVZUcDcyK3J4b0tGaSszeGFxcW9yYkJ4UVhHeldXZUU4ZG9mZktjZkIvekhrL2VhUkpYZUpMNy9oSHRSVWdERTE2RWxIbmhpU3VyZFliNVRuemF0Q1Q4OGR1OHdpZmZKcDB3dW42L1VvTkY3OHRQY3lHUXh6UTBrclNDMitOcTRKNXVERXFWbGdjTVk4a2IxcFFIZzVIMk5xdEtUcE1IcmJCa2hnRUlIRURLYS94WUlnL1NXVHdOVFcxdERvU0RZWDM2QlQ1S2NVcURSUEROaHdzMU9iU3IrRnBoZnFJeGhxbGtZdWw2RitQL2dEWGg3UnJUcjhaNTdBZWZpVVJFU3pmR1FEWmJyOTg5b3VOeGRNTWdGUkUvZU95RXAyeXpzV0R4b0MxYVZSV3pMVjljWVBpcXozdjZxU29RVTM1b1htZVJaYmZKdVc2ZllBcmNmZVd3eWQ0NU4xZ0Fjb3BRSHQyRUQzRGR6Qmd3LzNKU3gzeEdzSUpqSlFERG92Q0haZENBamlldlBBREVSQmpCUUhUS0lHWStBY3pBSDJEcktLeFRodVVBT0N1ajRTZ3BEU3FERVJtcjFlT0RvaFFTNmF1QTFQTHZ4UHFMMmplbTExN09RZDVVOGQ2S2FZMWRVcWl0M0Y3b0QxZm50ZXhmR2g5T3htZUwyVWVZTVZId2VNc0ZSeUFjc0xuNmwwaUN4NVA1cHNSbmJ6R043RXExaHpaQnE3WlZIS2txS2FSQlVNWU1xREUzZytaUDBrcWJYU3llN0tWdXpJNnY5ZmRyLzJKVHA4YklIM2VxUCt2b0w1V0RzYW13MEFFWEJMbjMrTzBRK2RlaWVlRHlucU56Y3BneHcvckJTeTZvWkhqVGRLdzNjK3FyZXFZQWY5azl4QkxzUWJ6SmJPTE5venFPNU1rZ1F0K0FUTHpCTkdDMTVMRm1JOVlielBvUlpESVpWaUdEeWJDQVBFMm1YS3FEUzNWWWw3NmV2cHp5VXBjUEpEM3o1OWZWelY4NGYySGR2THE1UFYxVGsyS3dxRmdFV2RhU0oya29YN1FHQXZWdE9GUjQycnR3NEVOU1h4UVVVdDhVVk9lMnEyMjkyaE5WOU9xRStvWlBXNzJZMEROK3Axc09Gem1jN3Z1dXpNc3JjK2VWZ251enUzMkgzRTVtc2ZOOHY4VlE2aTF5c3Q4bTI4c2hEdW4yVmRaVXltODdCSjBCeDYwUk1ScnQvanQvTC9NVHdSOE0rdkhscmZyYVVwY243M3A5aVh2c24wTEFXT2l3alAwM0g1Vmd5eGo1NkZpdEVBajRyM0k1bk02cnBvcjVJSWJyN1BiaVF2bldIL3dBc1NDckVQZU9LcXNoN0tLU3l0Y2tOUk1rWlNCR3BSaWtsQnpIYWlQbURSWURieG5Od3hhejJYSjVGc3VSZ1RjWlJwQlpyemYzSTdOWnZ4THB6ZnA1YW4xdjVnU1JHWXdHM2ppS2pCYUQwYkxyQzk4dE9ldlNOekpZekxzdWVTY0llNHZxNnVxRzZsWXNXN3BvUWZlY2NFTFZBZXYvaHc2b2J4Y2lBeWQ5dFZDZDhsQjh2V0lZdjdnK0RGVFlYYksreW8xdE5aR0dXSHVOTHh5cEtJbnZtWHJ0elhON0h2cStMM3d4cldnWnB4WG5qenVkdDduc2k2TDJYNGtKWDBYTTFVVVU1S0RiNmltN2J1M1VqWWxyUWk0SFdjc2YwN1c4RFRXaGJyUVJiVWJ2VXcwcGlwSVhLWUtXZE9RRG9OczhtekhrcmNZbUk2L2ExNW5wTGdwRG5qSFBZQndGejRISXU0Mm9Rd0s3TktJblFzbkRhS1FBNXhuTWVRTldiTFJnazlsb0lnZnl6S3VRT2M4TXl6dVZ2cEdlSVZXL3lXK29oeHVpTDNDL2dhVFkwNFBRcHN0Nk52YU1yQndhWE5xL2VQN2NHZE5iVzJqWlVHeW9qNFp0RUY0cE5qenpNcVdzeXBjYTltZmVwcFFsV1ZXd1NEWDZHWVd3cTJweUVhdkExaWZ3WGZ2WE5iWjg0MERibmhxdjBWUnFaWFhWNjZ0MnhxcFNUcGZMMmJhaEtUNmx1YXh5UVVuam51bXNpZXBDUmlkaTBlN0NTVXpFTzNmei9MYXRxMWJYT3VjMWpWeFc3TXp6MjRvOFpZeWphTFlZRUlKQm9VY0l1bXBkam9yUkVvdTdaT3lQVkMweTZpRi9pOWlIU2N5R3ZPSUg5SjFyNjloN0FmY0tLSmFNcE45V3BaVStBdWtFYjVTK3BVcEE1WUpVRk5ES0c1TnhOT3ZCTm5hWDkrU3h2bFBMb25aN3NOanFXbkI5N0NaWmZkTXQwMHpDNi9ON1RyOWNHeXVNZWlvclE0WkErR0htWFMzV3dPZTRXc0JnQ3dGU2hhaVdlaVppcml6QXBZZzU1eTF6anpZMXpweloxRENUWCtnVmpwTFV5MUhSbzlhdjV3QzlmaFJLU2xsMFpwZHkvc2QxbkY5TlVzZjV0YnB6dTVKSG1Dd05odjR2RWY1dENnQUFBSGphalpMQlRoc3hFSVovTHdIUkE2aXRla0k5V0tnSE9MQk9vRWdST1lWSXVSUUpJZ0ZxajdDMWRoY2w4V0o3RDd4RUg2SXYwaHVxK2g1OWh4NzcyM0ZMcUVyVlhhMzllVHovekt6SEFKN2pIZ0tMNXlPK0pSYllFTzhTWitpSUl2RUtYb3ZQaVR0NEtiNG5Yc1ZHOWlyeEdsNWs0OFNiMk1vK1VTVTZ6N2o2R2lNRUZ0Z1NLbkdHZGZFaDhRcjZva3Jjd1J2eEpmRXEvWDhrWHNOMnRwMTRFMit6OXhqQm9NRWRMR3FVcU9BaHNZOHVlamdrbmRPaU9RZXZOdnBvamhKbmtXZHhMN0RCRGJtSTZpRTlQWFdHZHNmMVRvenFtY1hoQ0lwdlNXM3dhSEdObkNyRFNBcTNYQnZhTmVmNTB1cUt5cUJWZjFUeFVNTXVvMkJrbWp0Ymw1V1grOTNlb1R5dnRCeVoxdGJheWpOYnp6UkhjNk1MTDRldHI0eDFjcWZ5dm5GSFNwVzFyOXJydkRBemRkc2FyOXQ1bks2YXhxa1VJa2JZRFZtZVBBZzh5Z1ljMDNQS2E0RmpNK1Y0d0JyRHFmWXh3QVFYL0lha3AvNW83MEYra0hkNy9jSGtZakljTEJlenR3ajdyOGI4RHZINEhCYkN5eWh3ZERZOGJibFVIeTYxZGJXWnk1Z1ovMVBqWHdyNzFmTkZ4eDI3SEhRTmJZNlpRdDRwNTNCSFN1NmZZb3dUaXRnUk5zUVZ0bTY4eTEwOXpZMHQxZW40QkQ4QityR29lUUFBZU5wbGl0ZE93bUFBUnM5ZlJoR2NETVV0YmxHeHhWbFhYQ2k0QlNlb3BURmdMd2cxQldPODFVZjFQWXltaVRIUmMzTytuSHhJT0h4KzhQWXR3VjlNcDBxNGNPUEJpNHlQQnZ3RWFLU0pabHBvcFkwZ0ljSkVhS2VES0oxMDBVMFB2ZlRSendBeEJobGltQkZHR1dPY0NlSk1Nc1UwQ1daUVVFa3l5eHp6TExESUVockxyTERLR3V0c3NNa1cyK3lRWXBjOTBtVFk1NEJEampqbWhGUE95SkxqbkFzdXVlS2FHL0lVdU9XT2UzU0tHTHdMU2JpRVczaUVWOGdocTFyU2F4V2padXBsNjlsT2xHM2pJZmpiNmkrV2t5SjEweTc5TzhxUGxkY25VOU44amxWRitSbnFGekxITlc0QUFRQUIvLzhBRDNqYVkyQmtZR0RnQVdJbElHWmlZQWJDUkFaR2hpU0dGQ0F2bFNFZHlHWUJ5ekFBQUNmVUFqVjQybU5nWkdCZzRHSUlZVWhpWUhaeDh3bGhFRWt2U3MxbVVNaEpMTWxqMEdGZ0Fjb3kvUC9QQUZLRnpCWmpZSFoyREZGZ0VQUDE5d0dTUWY2K1FCSXV5NWhXbEpqTXdBRmlnVEVMV0M4alVJUVJhQ1lUMEQ0RklNbkd3TWVRek1ETUlNUWdDcklkU0l1RDFhYkEyVXdNSWd4aUFMVzJFeGw0Mm1OZ1pHQmc0R0t3WWJCallIWng4d2xoRUVrdlNzMW1rTXRKTE1sajBHQmdBY295L1A4UEpMQ3hnQUFBV3hvTGF3QUFBQUFBQVFBQUFBRFZwQ2NJQUFBQUFObWNnK0VBQUFBQTJmdEpOQT09JykgZm9ybWF0KCd3b2ZmJyk7XHJcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xyXG4gIGZvbnQtZGlzcGxheTogc3dhcDtcclxufVxyXG4ifX0=`, "base64").toString("utf8")) } //Conf logger(`metrics/setup > setup > success`) return conf } // EXTERNAL MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\node_modules\ejs\lib\ejs.js var E_Users_lecoq_Documents_GitHub_gitstats_node_modules_ejs_lib_ejs = __webpack_require__(58509); var E_Users_lecoq_Documents_GitHub_gitstats_node_modules_ejs_lib_ejs_default = /*#__PURE__*/__webpack_require__.n(E_Users_lecoq_Documents_GitHub_gitstats_node_modules_ejs_lib_ejs); // EXTERNAL MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\node_modules\svgo\lib\svgo.js var E_Users_lecoq_Documents_GitHub_gitstats_node_modules_svgo_lib_svgo = __webpack_require__(20485); var E_Users_lecoq_Documents_GitHub_gitstats_node_modules_svgo_lib_svgo_default = /*#__PURE__*/__webpack_require__.n(E_Users_lecoq_Documents_GitHub_gitstats_node_modules_svgo_lib_svgo); // EXTERNAL MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\node_modules\image-to-base64\image-to-base64.min.js var E_Users_lecoq_Documents_GitHub_gitstats_node_modules_image_to_base64_image_to_base64_min = __webpack_require__(67192); var E_Users_lecoq_Documents_GitHub_gitstats_node_modules_image_to_base64_image_to_base64_min_default = /*#__PURE__*/__webpack_require__.n(E_Users_lecoq_Documents_GitHub_gitstats_node_modules_image_to_base64_image_to_base64_min); // EXTERNAL MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\node_modules\axios\index.js var E_Users_lecoq_Documents_GitHub_gitstats_node_modules_axios_index = __webpack_require__(2390); var E_Users_lecoq_Documents_GitHub_gitstats_node_modules_axios_index_default = /*#__PURE__*/__webpack_require__.n(E_Users_lecoq_Documents_GitHub_gitstats_node_modules_axios_index); // CONCATENATED MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\src\plugins\followup\index.mjs //Setup /* harmony default export */ async function E_Users_lecoq_Documents_GitHub_gitstats_src_plugins_followup_index({computed, q}, {enabled = false} = {}) { //Plugin execution try { //Check if plugin is enabled and requirements are met if ((!enabled)||(!q.followup)) return null //Define getters const followup = { issues:{ get count() { return this.open + this.closed }, get open() { return computed.repositories.issues_open }, get closed() { return computed.repositories.issues_closed }, }, pr:{ get count() { return this.open + this.merged }, get open() { return computed.repositories.pr_open }, get merged() { return computed.repositories.pr_merged } } } //Results return followup } //Handle errors catch (error) { console.debug(error) throw {error:{message:`An error occured`}} } } // CONCATENATED MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\src\plugins\habits\index.mjs //Setup /* harmony default export */ async function E_Users_lecoq_Documents_GitHub_gitstats_src_plugins_habits_index({login, rest, q}, {enabled = false, from:defaults = 100} = {}) { //Plugin execution try { //Check if plugin is enabled and requirements are met if ((!enabled)||(!q.habits)) return null //Parameters override let {"habits.from":from = defaults.from ?? 100} = q //Events from = Math.max(1, Math.min(100, Number(from))) //Initialization const habits = {commits:{hour:NaN, hours:{}}, indents:{style:"", spaces:0, tabs:0}} //Get user recent commits from events const events = await rest.activity.listEventsForAuthenticatedUser({username:login, per_page:from}) const commits = events.data .filter(({type}) => type === "PushEvent") .filter(({actor}) => actor.login === login) //Commit hour { //Compute commit hours const hours = commits.map(({created_at}) => (new Date(created_at)).getHours()) for (const hour of hours) habits.commits.hours[hour] = (habits.commits.hours[hour] ?? 0) + 1 //Compute hour with most commits habits.commits.hour = hours.length ? `${Object.entries(habits.commits.hours).sort(([an, a], [bn, b]) => b - a).map(([hour, occurence]) => hour)[0]}`.padStart(2, "0") : NaN } //Indent style { //Retrieve edited files const edited = await Promise.allSettled(commits .flatMap(({payload}) => payload.commits).map(commit => commit.url) .map(async commit => (await rest.request(commit)).data.files) ) //Attemp to guess whether tabs or spaces are used from patch edited .filter(({status}) => status === "fulfilled") .map(({value}) => value) .flatMap(files => files.flatMap(file => (file.patch ?? "").match(/(?<=^[+])((?:\t)|(?: )) /gm) ?? [])) .forEach(indent => habits.indents[/^\t/.test(indent) ? "tabs" : "spaces"]++) //Compute indent style habits.indents.style = habits.indents.spaces > habits.indents.tabs ? "spaces" : habits.indents.tabs > habits.indents.spaces ? "tabs" : "" } //Results return habits } //Handle errors catch (error) { console.debug(error) throw {error:{message:`An error occured`}} } } // CONCATENATED MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\src\plugins\languages\index.mjs //Setup /* harmony default export */ async function E_Users_lecoq_Documents_GitHub_gitstats_src_plugins_languages_index({data, q}, {enabled = false} = {}) { //Plugin execution try { //Check if plugin is enabled and requirements are met if ((!enabled)||(!q.languages)) return null //Iterate through user's repositories and retrieve languages data const languages = {colors:{}, total:0, stats:{}} for (const repository of data.user.repositories.nodes) { for (const {size, node:{color, name}} of Object.values(repository.languages.edges)) { languages.stats[name] = (languages.stats[name] ?? 0) + size languages.colors[name] = color ?? "#ededed" languages.total += size } } //Compute languages stats Object.keys(languages.stats).map(name => languages.stats[name] /= languages.total) languages.favorites = Object.entries(languages.stats).sort(([an, a], [bn, b]) => b - a).slice(0, 8).map(([name, value]) => ({name, value, color:languages.colors[name], x:0})) for (let i = 1; i < languages.favorites.length; i++) languages.favorites[i].x = languages.favorites[i-1].x + languages.favorites[i-1].value //Results return languages } //Handle errors catch (error) { console.debug(error) throw {error:{message:`An error occured`}} } } // CONCATENATED MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\src\plugins\lines\index.mjs //Setup /* harmony default export */ async function E_Users_lecoq_Documents_GitHub_gitstats_src_plugins_lines_index({login, data, imports, rest, q}, {enabled = false} = {}) { //Plugin execution try { //Check if plugin is enabled and requirements are met if ((!enabled)||(!q.lines)) return null //Repositories const repositories = data.user.repositories.nodes.map(({name}) => name) ?? [] //Get contributors stats from repositories const lines = {added:0, deleted:0} const response = await Promise.all(repositories.map(async repo => await rest.repos.getContributorsStats({owner:login, repo}))) //Compute changed lines response.map(({data:repository}) => { //Check if data are available if (!Array.isArray(repository)) return //Extract author const [contributor] = repository.filter(({author}) => author.login === login) //Compute editions if (contributor) contributor.weeks.forEach(({a, d}) => (lines.added += a, lines.deleted += d)) }) //Format values lines.added = imports.format(lines.added) lines.deleted = imports.format(lines.deleted) //Results return lines } //Handle errors catch (error) { console.debug(error) throw {error:{message:`An error occured`}} } } // CONCATENATED MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\src\plugins\music\index.mjs //Supported providers const providers = { apple:{ name:"Apple Music", embed:/^https:..embed.music.apple.com.\w+.playlist/, }, spotify:{ name:"Spotify", embed:/^https:..open.spotify.com.embed.playlist/, }, } //Supported modes const modes = { playlist:"Suggested tracks", recent:"Recently played", } //Setup /* harmony default export */ async function E_Users_lecoq_Documents_GitHub_gitstats_src_plugins_music_index({login, imports, q}, {enabled = false, token = ""} = {}) { //Plugin execution try { //Check if plugin is enabled and requirements are met if ((!enabled)||(!q.music)) return null //Initialization const raw = { get provider() { return providers[provider]?.name ?? "" }, get mode() { return modes[mode] ?? "Unconfigured music plugin"}, } let tracks = null //Parameters override let {"music.provider":provider = "", "music.mode":mode = "", "music.playlist":playlist = null, "music.limit":limit = 4} = q //Auto-guess parameters if ((playlist)&&(!mode)) mode = "playlist" if ((playlist)&&(!provider)) for (const [name, {embed}] of Object.entries(providers)) if (embed.test(playlist)) provider = name if (!mode) mode = "recent" //Provider if (!(provider in providers)) throw {error:{message:provider ? `Unsupported provider "${provider}"` : `Missing provider`}, ...raw} //Mode if (!(mode in modes)) throw {error:{message:`Unsupported mode "${mode}"`}, ...raw} //Playlist mode if (mode === "playlist") { if (!playlist) throw {error:{message:`Missing playlist url`}, ...raw} if (!providers[provider].embed.test(playlist)) throw {error:{message:`Unsupported playlist url format`}, ...raw} } //Limit limit = Math.max(1, Math.min(100, Number(limit))) //Handle mode switch (mode) { //Playlist mode case "playlist":{ //Start puppeteer and navigate to playlist console.debug(`metrics/compute/${login}/plugins > music > starting browser`) const browser = await imports.puppeteer.launch({headless:true, executablePath:process.env.PUPPETEER_BROWSER_PATH, args:["--no-sandbox", "--disable-extensions", "--disable-setuid-sandbox", "--disable-dev-shm-usage"]}) console.debug(`metrics/compute/${login}/plugins > music > loaded ${await browser.version()}`) const page = await browser.newPage() console.debug(`metrics/compute/${login}/plugins > music > loading page`) await page.goto(playlist) const frame = page.mainFrame() //Handle provider switch (provider) { //Apple music case "apple":{ //Parse tracklist await frame.waitForSelector(".tracklist.playlist") tracks = [...await frame.evaluate(() => [...document.querySelectorAll(".tracklist li")].map(li => ({ name:li.querySelector(".tracklist__track__name").innerText, artist:li.querySelector(".tracklist__track__sub").innerText, artwork:li.querySelector(".tracklist__track__artwork img").src })))] break } //Spotify case "spotify":{ //Parse tracklist await frame.waitForSelector("table") tracks = [...await frame.evaluate(() => [...document.querySelectorAll("table tr")].map(tr => ({ name:tr.querySelector("td:nth-child(2) div:nth-child(1)").innerText, artist:tr.querySelector("td:nth-child(2) div:nth-child(2)").innerText, //Spotify doesn't provide artworks so we fallback on playlist artwork instead artwork:window.getComputedStyle(document.querySelector("button[title=Play]").parentNode, null).backgroundImage.match(/^url\("(https:...+)"\)$/)[1] })))] break } //Unsupported default: throw {error:{message:`Unsupported mode "${mode}" for provider "${provider}"`}, ...raw} } //Close browser console.debug(`metrics/compute/${login}/plugins > music > closing browser`) await browser.close() //Format tracks if (Array.isArray(tracks)) { //Tracks console.debug(`metrics/compute/${login}/plugins > music > found ${tracks.length} tracks`) console.debug(JSON.stringify(tracks)) //Shuffle tracks tracks = imports.shuffle(tracks) } break } //Recently played case "recent":{ //Initialisation const timestamp = Date.now()-24*60*60*1000 //Handle provider switch (provider) { //Spotify case "spotify":{ //Prepare credentials const [client_id, client_secret, refresh_token] = token.split(",").map(part => part.trim()) if ((!client_id)||(!client_secret)||(!refresh_token)) throw {error:`Spotify token must contain client id/secret and refresh token`} //API call and parse tracklist try { //Request access token console.debug(`metrics/compute/${login}/plugins > music > requesting access token with refresh token for spotify`) const {data:{access_token:access}} = await imports.axios.post("https://accounts.spotify.com/api/token", `${new imports.url.URLSearchParams({grant_type:"refresh_token", refresh_token, client_id, client_secret})}`, {headers:{"Content-Type":"application/x-www-form-urlencoded"}}, ) console.log(access) console.debug(`metrics/compute/${login}/plugins > music > got new access token`) //Retriev tracks tracks = (await imports.axios(`https://api.spotify.com/v1/me/player/recently-played?limit=${limit}&after=${timestamp}`, {headers:{ "Accept":"application/json", "Content-Type":"application/json", "Authorization":`Bearer ${access}`} })).data.items.map(({track}) => ({ name:track.name, artist:track.artists[0].name, artwork:track.album.images[0].url, })) } //Handle errors catch (error) { if ((error.response?.status)) throw {error:{message:`API returned ${error.response.status}`}, ...raw} throw error } break } //Unsupported default: throw {error:{message:`Unsupported mode "${mode}" for provider "${provider}"`}, ...raw} } break } //Unsupported default: throw {error:{message:`Unsupported mode "${mode}"`}, ...raw} } //Format tracks if (Array.isArray(tracks)) { //Limit tracklist if (limit > 0) { console.debug(`metrics/compute/${login}/plugins > music > keeping only ${limit} tracks`) tracks = tracks.slice(0, limit) } //Convert artworks to base64 console.debug(`metrics/compute/${login}/plugins > music > loading artworks`) for (const track of tracks) { console.debug(`metrics/compute/${login}/plugins > music > processing ${track.name}`) track.artwork = await imports.imgb64(track.artwork) } //Save results console.debug(`metrics/compute/${login}/plugins > music > success`) return {...raw, tracks} } //Unhandled error throw {error:{message:`An error occured (could not retrieve tracks)`}} } //Handle errors catch (error) { if (error.error?.message) throw error console.debug(error) throw {error:{message:`An error occured`}} } } // CONCATENATED MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\src\plugins\pagespeed\index.mjs //Setup /* harmony default export */ async function E_Users_lecoq_Documents_GitHub_gitstats_src_plugins_pagespeed_index({imports, data, q}, {enabled = false, token = null} = {}) { //Plugin execution try { //Check if plugin is enabled and requirements are met if ((!enabled)||(!q.pagespeed)||(!data.user.websiteUrl)) return null //Format url if needed let url = data.user.websiteUrl if (!/^https?:[/][/]/.test(url)) url = `https://${url}` //Load scores from API const scores = new Map() await Promise.all(["performance", "accessibility", "best-practices", "seo"].map(async category => { const {score, title} = (await imports.axios.get(`https://www.googleapis.com/pagespeedonline/v5/runPagespeed?category=${category}&url=${url}&key=${token}`)).data.lighthouseResult.categories[category] scores.set(category, {score, title}) })) //Results return {url, scores:[scores.get("performance"), scores.get("accessibility"), scores.get("best-practices"), scores.get("seo")]} } //Handle errors catch (error) { if (error.response?.status) throw {error:{message:`PageSpeed token error (code ${error.response.status})`}, url} throw {error:{message:`An error occured`}} } } // CONCATENATED MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\src\plugins\posts\index.mjs //Setup /* harmony default export */ async function E_Users_lecoq_Documents_GitHub_gitstats_src_plugins_posts_index({imports, data, q}, {enabled = false} = {}) { //Plugin execution try { //Check if plugin is enabled and requirements are met if ((!enabled)||(!q.posts)) return null //Parameters override const login = data.user.login let {"posts.source":source = "", "posts.limit":limit = 4} = q //Limit limit = Math.max(1, Math.min(30, Number(limit))) //Retrieve posts let posts = null switch (source) { //Dev.to case "dev.to":{ posts = (await imports.axios.get(`https://dev.to/api/articles?username=${login}&state=fresh`)).data.map(({title, readable_publish_date:date}) => ({title, date})) break } //Unsupported default: throw {error:{message:`Unsupported source "${source}"`}} } //Format posts if (Array.isArray(posts)) { //Limit tracklist if (limit > 0) { console.debug(`metrics/compute/${login}/plugins > music > keeping only ${limit} posts`) posts = posts.slice(0, limit) } //Results return {source, posts} } //Unhandled error throw {error:{message:`An error occured (could not retrieve posts)`}} } //Handle errors catch (error) { console.debug(error) throw {error:{message:`An error occured`}} } } // CONCATENATED MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\src\plugins\selfskip\index.mjs //Setup /* harmony default export */ async function E_Users_lecoq_Documents_GitHub_gitstats_src_plugins_selfskip_index({login, rest, computed, q}, {enabled = false} = {}) { //Plugin execution try { //Check if plugin is enabled and requirements are met if ((!enabled)||(!q.selfskip)) return null //Search for auto-generated commits let commits = 0 for (let page = 0;;page++) { const {data} = await rest.repos.listCommits({owner:login, repo:login, author:login, per_page:100, page}) commits += data.filter(({commit}) => /\[Skip GitHub Action\]/.test(commit.message)).length if (!data.length) break } //Results computed.commits -= commits return {commits} } //Handle errors catch (error) { console.debug(error) throw {error:{message:`An error occured`}} } } // CONCATENATED MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\src\plugins\traffic\index.mjs //Setup /* harmony default export */ async function E_Users_lecoq_Documents_GitHub_gitstats_src_plugins_traffic_index({login, imports, data, rest, q}, {enabled = false} = {}) { //Plugin execution try { //Check if plugin is enabled and requirements are met if ((!enabled)||(!q.traffic)) return null //Repositories const repositories = data.user.repositories.nodes.map(({name}) => name) ?? [] //Get views stats from repositories const views = {count:0, uniques:0} const response = await Promise.all(repositories.map(async repo => await rest.repos.getViews({owner:login, repo}))) //Compute views response.filter(({data}) => data).map(({data:{count, uniques}}) => (views.count += count, views.uniques += uniques)) //Format values views.count = imports.format(views.count) views.uniques = imports.format(views.uniques) //Results return {views} } //Handle errors catch (error) { if (error.status === 403) throw {error:{message:`Insufficient token rights`}} console.debug(error) throw {error:{message:`An error occured`}} } } // CONCATENATED MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\src\plugins\index.mjs //Imports //Exports /* harmony default export */ const E_Users_lecoq_Documents_GitHub_gitstats_src_plugins_index = ({ followup: E_Users_lecoq_Documents_GitHub_gitstats_src_plugins_followup_index, habits: E_Users_lecoq_Documents_GitHub_gitstats_src_plugins_habits_index, languages: E_Users_lecoq_Documents_GitHub_gitstats_src_plugins_languages_index, lines: E_Users_lecoq_Documents_GitHub_gitstats_src_plugins_lines_index, music: E_Users_lecoq_Documents_GitHub_gitstats_src_plugins_music_index, pagespeed: E_Users_lecoq_Documents_GitHub_gitstats_src_plugins_pagespeed_index, posts: E_Users_lecoq_Documents_GitHub_gitstats_src_plugins_posts_index, selfskip: E_Users_lecoq_Documents_GitHub_gitstats_src_plugins_selfskip_index, traffic: E_Users_lecoq_Documents_GitHub_gitstats_src_plugins_traffic_index, }); // CONCATENATED MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\src\templates\common.mjs /** Template common processor */ /* harmony default export */ async function E_Users_lecoq_Documents_GitHub_gitstats_src_templates_common({login, q}, {conf, data, rest, graphql, plugins}, {s, pending, imports}) { //Init const computed = data.computed = {commits:0, sponsorships:0, licenses:{favorite:"", used:{}}, token:{}, repositories:{watchers:0, stargazers:0, issues_open:0, issues_closed:0, pr_open:0, pr_merged:0, forks:0}, plugins:{}} const avatar = imports.imgb64(data.user.avatarUrl) //Plugins for (const name of Object.keys(imports.plugins)) { pending.push((async () => { try { computed.plugins[name] = await imports.plugins[name]({login, q, imports, data, computed, rest, graphql}, plugins[name]) } catch (error) { computed.plugins[name] = error } finally { return {name, result:computed.plugins[name]} } })()) } //Iterate through user's repositories for (const repository of data.user.repositories.nodes) { //Simple properties with totalCount for (const property of ["watchers", "stargazers", "issues_open", "issues_closed", "pr_open", "pr_merged"]) computed.repositories[property] += repository[property].totalCount //Forks computed.repositories.forks += repository.forkCount //License if (repository.licenseInfo) computed.licenses.used[repository.licenseInfo.spdxId] = (computed.licenses.used[repository.licenseInfo.spdxId] || 0) + 1 } //Total disk usage computed.diskUsage = `${imports.bytes(data.user.repositories.totalDiskUsage*1000)}` //Compute licenses stats computed.licenses.favorite = Object.entries(computed.licenses.used).sort(([an, a], [bn, b]) => b - a).slice(0, 1).map(([name, value]) => name) || "" //Compute total commits and sponsorships computed.commits += data.user.contributionsCollection.totalCommitContributions + data.user.contributionsCollection.restrictedContributionsCount computed.sponsorships = data.user.sponsorshipsAsSponsor.totalCount + data.user.sponsorshipsAsMaintainer.totalCount //Compute registration date const diff = (Date.now()-(new Date(data.user.createdAt)).getTime())/(365*24*60*60*1000) const years = Math.floor(diff) const months = Math.ceil((diff-years)*12) computed.registration = years ? `${years} year${s(years)} ago` : `${months} month${s(months)} ago` //Compute calendar computed.calendar = data.user.calendar.contributionCalendar.weeks.flatMap(({contributionDays}) => contributionDays).slice(0, 14).reverse() //Avatar (base64) computed.avatar = await avatar || "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==" //Token scopes computed.token.scopes = (await rest.request("HEAD /")).headers["x-oauth-scopes"].split(", ") //Meta data.meta = {version:conf.package.version, author:conf.package.author} } // CONCATENATED MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\src\templates\classic\template.mjs //Imports /** Template processor */ /* harmony default export */ async function E_Users_lecoq_Documents_GitHub_gitstats_src_templates_classic_template({login, q}, {conf, data, rest, graphql, plugins}, {s, pending, imports}) { //Common await E_Users_lecoq_Documents_GitHub_gitstats_src_templates_common(...arguments) } // CONCATENATED MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\src\templates\terminal\template.mjs //Imports /** Template processor */ /* harmony default export */ async function E_Users_lecoq_Documents_GitHub_gitstats_src_templates_terminal_template({login, q}, {conf, data, rest, graphql, plugins}, {s, pending, imports}) { //Common await E_Users_lecoq_Documents_GitHub_gitstats_src_templates_common(...arguments) //Disable optimization to keep white-spaces q.raw = true } // CONCATENATED MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\src\templates\index.mjs //Imports //Exports /* harmony default export */ const E_Users_lecoq_Documents_GitHub_gitstats_src_templates_index = ({ classic: E_Users_lecoq_Documents_GitHub_gitstats_src_templates_classic_template, terminal: E_Users_lecoq_Documents_GitHub_gitstats_src_templates_terminal_template, }); // EXTERNAL MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\node_modules\puppeteer\cjs-entry.js var E_Users_lecoq_Documents_GitHub_gitstats_node_modules_puppeteer_cjs_entry = __webpack_require__(34651); var E_Users_lecoq_Documents_GitHub_gitstats_node_modules_puppeteer_cjs_entry_default = /*#__PURE__*/__webpack_require__.n(E_Users_lecoq_Documents_GitHub_gitstats_node_modules_puppeteer_cjs_entry); // EXTERNAL MODULE: external "url" var external_url_ = __webpack_require__(78835); var external_url_default = /*#__PURE__*/__webpack_require__.n(external_url_); // CONCATENATED MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\src\metrics.mjs //Imports //Setup async function metrics({login, q}, {graphql, rest, plugins, conf, die = false}) { //Compute rendering try { //Init console.debug(`metrics/compute/${login} > start`) console.debug(JSON.stringify(q)) const template = q.template || conf.settings.templates.default const repositories = Math.max(0, Number(q.repositories)) || conf.settings.repositories || 100 const pending = [] const s = (value, end = "") => value > 1 ? {y:"ies", "":"s"}[end] : end if ((!(template in E_Users_lecoq_Documents_GitHub_gitstats_src_templates_index))||(!(template in conf.templates))||((conf.settings.templates.enabled.length)&&(!conf.settings.templates.enabled.includes(template)))) throw new Error("unsupported template") const {query, image, style, fonts} = conf.templates[template] const data = {base:{}} //Base parts if (("base" in q)&&(!q.base)) conf.settings.plugins.base.parts.map(part => q[`base.${part}`] = false) for (const part of conf.settings.plugins.base.parts) data.base[part] = (`base.${part}` in q) ? !!q[`base.${part}`] : true //Placeholder if (login === "placeholder") placeholder({data, conf, q}) //Compute else { //Query data from GitHub API console.debug(`metrics/compute/${login} > graphql query`) Object.assign(data, await graphql(query .replace(/[$]login/, `"${login}"`) .replace(/[$]repositories/, `${repositories}`) .replace(/[$]calendar.to/, `"${(new Date()).toISOString()}"`) .replace(/[$]calendar.from/, `"${(new Date(Date.now()-14*24*60*60*1000)).toISOString()}"`) )) //Compute metrics console.debug(`metrics/compute/${login} > compute`) const computer = E_Users_lecoq_Documents_GitHub_gitstats_src_templates_index[template].default || E_Users_lecoq_Documents_GitHub_gitstats_src_templates_index[template] await computer({login, q}, {conf, data, rest, graphql, plugins}, {s, pending, imports:{plugins:E_Users_lecoq_Documents_GitHub_gitstats_src_plugins_index, url: (external_url_default()), imgb64: (E_Users_lecoq_Documents_GitHub_gitstats_node_modules_image_to_base64_image_to_base64_min_default()), axios: (E_Users_lecoq_Documents_GitHub_gitstats_node_modules_axios_index_default()), puppeteer: (E_Users_lecoq_Documents_GitHub_gitstats_node_modules_puppeteer_cjs_entry_default()), format, bytes, shuffle}}) const promised = await Promise.all(pending) //Check plugins errors if (conf.settings.debug) for (const {name, result = null} of promised) console.debug(`plugin ${name} ${result ? result.error ? "failed" : "success" : "ignored"} : ${JSON.stringify(result).replace(/^(.{888}).+/, "$1...")}`) if (die) { const errors = promised.filter(({result = null}) => !!result?.error).length if (errors) throw new Error(`${errors} error${s(errors)} found...`) } } //Template rendering console.debug(`metrics/compute/${login} > render`) let rendered = await E_Users_lecoq_Documents_GitHub_gitstats_node_modules_ejs_lib_ejs_default().render(image, {...data, s, style, fonts}, {async:true}) //Optimize rendering if ((conf.optimize)&&(!q.raw)) { console.debug(`metrics/compute/${login} > optimize`) const svgo = new (E_Users_lecoq_Documents_GitHub_gitstats_node_modules_svgo_lib_svgo_default())({full:true, plugins:[{cleanupAttrs:true}, {inlineStyles:false}]}) const {data:optimized} = await svgo.optimize(rendered) rendered = optimized } //Result console.debug(`metrics/compute/${login} > success`) return rendered } //Internal error catch (error) { //User not found if (((Array.isArray(error.errors))&&(error.errors[0].type === "NOT_FOUND"))) throw new Error("user not found") //Generic error throw error } } /** Formatter */ function format(n) { for (const {u, v} of [{u:"b", v:10**9}, {u:"m", v:10**6}, {u:"k", v:10**3}]) if (n/v >= 1) return `${(n/v).toFixed(2).substr(0, 4).replace(/[.]0*$/, "")}${u}` return n } /** Bytes formatter */ function bytes(n) { for (const {u, v} of [{u:"E", v:10**18}, {u:"P", v:10**15}, {u:"T", v:10**12}, {u:"G", v:10**9}, {u:"M", v:10**6}, {u:"k", v:10**3}]) if (n/v >= 1) return `${(n/v).toFixed(2).substr(0, 4).replace(/[.]0*$/, "")} ${u}B` return `${n} byte${n > 1 ? "s" : ""}` } /** Array shuffler */ function shuffle(array) { for (let i = array.length-1; i > 0; i--) { const j = Math.floor(Math.random()*(i+1)) ;[array[i], array[j]] = [array[j], array[i]] } return array } /** Placeholder generator */ function placeholder({data, conf, q}) { //Proxifier const proxify = (target) => typeof target === "object" ? new Proxy(target, { get(target, property) { //Primitive conversion if (property === Symbol.toPrimitive) return () => "##" //Iterables if (property === Symbol.iterator) return Reflect.get(target, property) //Plugins should not be proxified by default as they can be toggled by user if (/^plugins$/.test(property)) return Reflect.get(target, property) //Consider no errors on plugins if (/^error/.test(property)) return undefined //Proxify recursively return proxify(property in target ? Reflect.get(target, property) : {}) } }) : target //Enabled plugins const enabled = Object.entries(conf.settings.plugins).filter(([key, plugin]) => plugin.enabled).map(([key]) => key).filter(key => (key in q)&&(q[key])) //Placeholder data Object.assign(data, { s(_, letter) { return letter === "y" ? "ies" : "s" }, meta:{version:conf.package.version, author:conf.package.author, placeholder:true}, user:proxify({name:`############`, websiteUrl:`########################`}), computed:proxify({ avatar:"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mOcOnfpfwAGfgLYttYINwAAAABJRU5ErkJggg==", registration:"## years ago", calendar:new Array(14).fill({color:"#ebedf0"}), licenses:{favorite:`########`}, plugins:Object.fromEntries(enabled.map(key => [key, proxify({ posts:{source:"########", posts:new Array("posts.limit" in q ? Math.max(Number(q["posts.limit"])||0, 0) : 2).fill({title:"###### ###### ####### ######", date:"####"})}, music:{provider:"########", tracks:new Array("music.limit" in q ? Math.max(Number(q["music.limit"])||0, 0) : 4).fill({name:"##########", artist:"######", artwork:"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mOcOnfpfwAGfgLYttYINwAAAABJRU5ErkJggg=="})}, pagespeed:{scores:["Performance", "Accessibility", "Best Practices", "SEO"].map(title => ({title, score:NaN}))}, followup:{issues:{count:0}, pr:{count:0}}, habits:{indents:{style:`########`}}, languages:{favorites:new Array(7).fill(null).map((_, x) => ({x, name:`######`, color:"#ebedf0", value:1/(x+1)}))}, }[key]??{})] )), token:{scopes:[]}, }), }) } // EXTERNAL MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\node_modules\@octokit\graphql\dist-node\index.js var E_Users_lecoq_Documents_GitHub_gitstats_node_modules_octokit_graphql_dist_node_index = __webpack_require__(3584); // EXTERNAL MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\node_modules\@actions\core\lib\core.js var E_Users_lecoq_Documents_GitHub_gitstats_node_modules_actions_core_lib_core = __webpack_require__(32882); // EXTERNAL MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\node_modules\@actions\github\lib\github.js var E_Users_lecoq_Documents_GitHub_gitstats_node_modules_actions_github_lib_github = __webpack_require__(29483); // CONCATENATED MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\action\index.mjs //Imports ((async function () { //Hack because ES modules are not correctly transpiled with ncc const [core, github, octokit, setup, metrics] = [E_Users_lecoq_Documents_GitHub_gitstats_node_modules_actions_core_lib_core, E_Users_lecoq_Documents_GitHub_gitstats_node_modules_actions_github_lib_github, E_Users_lecoq_Documents_GitHub_gitstats_node_modules_octokit_graphql_dist_node_index, E_Users_lecoq_Documents_GitHub_gitstats_src_setup_namespaceObject, E_Users_lecoq_Documents_GitHub_gitstats_src_metrics_namespaceObject].map(m => (m && m.default) ? m.default : m) //Yaml boolean converter const bool = (value, defaulted = false) => typeof value === "string" ? /^(?:[Tt]rue|[Oo]n|[Yy]es)$/.test(value) : defaulted //Runner try { //Initialization console.log(`GitHub metrics as SVG image`) console.log(`========================================================`) console.log(`Version | 2.3.0`) process.on("unhandledRejection", error => { throw error }) //Skip process if needed if ((github.context.eventName === "push")&&(github.context.payload)&&(github.context.payload.head_commit)) { if (/\[Skip GitHub Action\]/.test(github.context.payload.head_commit.message)) { console.log(`Skipped because [Skip GitHub Action] is in commit message`) process.exit(0) } } //Load configuration const conf = await setup({log:false}) console.log(`Configuration | loaded`) //Load svg template, style, fonts and query const template = core.getInput("template") || "classic" console.log(`Template to use | ${template}`) //Token for data gathering const token = core.getInput("token") console.log(`Github token | ${token ? "provided" : "missing"}`) if (!token) throw new Error("You must provide a valid GitHub token to gather your metrics") const graphql = octokit.graphql.defaults({headers:{authorization: `token ${token}`}}) console.log(`Github GraphQL API | ok`) const rest = github.getOctokit(token) console.log(`Github REST API | ok`) //SVG output const filename = core.getInput("filename") || "github-metrics.svg" console.log(`SVG output file | ${filename}`) //SVG optimization const optimize = bool(core.getInput("optimize"), true) conf.optimize = optimize console.log(`SVG optimization | ${optimize}`) //GitHub user const user = core.getInput("user") || (await rest.users.getAuthenticated()).data.login console.log(`GitHub user | ${user}`) //Debug mode const debug = bool(core.getInput("debug")) if (!debug) console.debug = () => null console.log(`Debug mode | ${debug}`) //Base elements const base = {} let parts = (core.getInput("base")||"").split(",").map(part => part.trim()) for (const part of conf.settings.plugins.base.parts) base[`base.${part}`] = parts.includes(part) console.log(`Base parts | ${parts.join(", ") || "(none)"}`) //Additional plugins const plugins = { lines:{enabled:bool(core.getInput("plugin_lines"))}, traffic:{enabled:bool(core.getInput("plugin_traffic"))}, pagespeed:{enabled:bool(core.getInput("plugin_pagespeed"))}, habits:{enabled:bool(core.getInput("plugin_habits")), from:Number(core.getInput("plugin_habits_from")) || 100}, selfskip:{enabled:bool(core.getInput("plugin_selfskip"))}, languages:{enabled:bool(core.getInput("plugin_languages"))}, followup:{enabled:bool(core.getInput("plugin_followup"))}, music:{enabled:bool(core.getInput("plugin_music"))}, posts:{enabled:bool(core.getInput("plugin_posts"))}, } let q = Object.fromEntries(Object.entries(plugins).filter(([key, plugin]) => plugin.enabled).map(([key]) => [key, true])) console.log(`Plugins enabled | ${Object.entries(plugins).filter(([key, plugin]) => plugin.enabled).map(([key]) => key).join(", ")}`) //Additional plugins options //Pagespeed if (plugins.pagespeed.enabled) { plugins.pagespeed.token = core.getInput("plugin_pagespeed_token") console.log(`Pagespeed token | ${plugins.pagespeed.token ? "provided" : "missing"}`) } //Music if (plugins.music.enabled) { for (const option of ["provider", "mode", "playlist", "limit"]) q[`music.${option}`] = core.getInput(`plugin_music_${option}`) || "" console.log(`Music provider | ${q["music.provider"]}`) console.log(`Music plugin mode | ${q["music.mode"]}`) console.log(`Music playlist | ${q["music.playlist"]}`) console.log(`Music tracks limit | ${q["music.limit"]}`) plugins.music.token = core.getInput("plugin_music_token") || "" console.log(`Music token | ${plugins.music.token ? "provided" : "missing"}`) } //Posts if (plugins.posts.enabled) { for (const option of ["source", "limit"]) q[`posts.${option}`] = core.getInput(`plugin_posts_${option}`) || "" console.log(`Posts provider | ${q["posts.provider"]}`) console.log(`Posts limit | ${q["posts.limit"]}`) } //Repositories to use const repositories = Number(core.getInput("repositories")) || 100 console.log(`Repositories to use | ${repositories}`) //Die on plugins errors const die = bool(core.getInput("plugins_errors_fatal")) console.log(`Plugin errors | ${die ? "die" : "ignore"}`) //Built query q = {...q, ...base, repositories, template} //Render metrics const rendered = await metrics({login:user, q}, {graphql, rest, plugins, conf, die}) console.log(`Render | complete`) //Verify svg const verify = bool(core.getInput("verify")) console.log(`Verify SVG | ${verify}`) if (verify) { const [libxmljs] = [await __webpack_require__.e(/* import() */ 344).then(__webpack_require__.t.bind(__webpack_require__, 53344, 3))].map(m => (m && m.default) ? m.default : m) const parsed = libxmljs.parseXml(rendered) if (parsed.errors.length) throw new Error(`Malformed SVG : \n${parsed.errors.join("\n")}`) console.log(`SVG valid | yes`) } //Commit to repository const dryrun = bool(core.getInput("dryrun")) if (dryrun) console.log(`Dry-run | complete`) else { //Repository console.log(`Repository | ${github.context.repo.owner}/${github.context.repo.repo}`) //Committer token const token = core.getInput("committer_token") || core.getInput("token") console.log(`Committer token | ${token ? "provided" : "missing"}`) if (!token) throw new Error("You must provide a valid GitHub token to commit your metrics") const rest = github.getOctokit(token) console.log(`Committer REST API | ok`) console.log(`Committer | ${(await rest.users.getAuthenticated()).data.login}`) //Retrieve previous render SHA to be able to update file content through API let sha = null try { const {data} = await rest.repos.getContent({...github.context.repo, path:filename}) sha = data.sha } catch (error) { console.debug(error) } console.log(`Previous render sha | ${sha || "none"}`) //Update file content through API await rest.repos.createOrUpdateFileContents({ ...github.context.repo, path:filename, message:`Update ${filename} - [Skip GitHub Action]`, content:Buffer.from(rendered).toString("base64"), ...(sha ? {sha} : {}) }) console.log(`Commit to repo | ok`) } //Success console.log(`Success !`) process.exit(0) //Errors } catch (error) { console.error(error) core.setFailed(error.message) process.exit(1) } })()).catch(error => process.exit(1)) /***/ }), /***/ 12541: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; result["default"] = mod; return result; }; Object.defineProperty(exports, "__esModule", ({ value: true })); const os = __importStar(__webpack_require__(12087)); const utils_1 = __webpack_require__(74332); /** * Commands * * Command Format: * ::name key=value,key=value::message * * Examples: * ::warning::This is the message * ::set-env name=MY_VAR::some value */ function issueCommand(command, properties, message) { const cmd = new Command(command, properties, message); process.stdout.write(cmd.toString() + os.EOL); } exports.issueCommand = issueCommand; function issue(name, message = '') { issueCommand(name, {}, message); } exports.issue = issue; const CMD_STRING = '::'; class Command { constructor(command, properties, message) { if (!command) { command = 'missing.command'; } this.command = command; this.properties = properties; this.message = message; } toString() { let cmdStr = CMD_STRING + this.command; if (this.properties && Object.keys(this.properties).length > 0) { cmdStr += ' '; let first = true; for (const key in this.properties) { if (this.properties.hasOwnProperty(key)) { const val = this.properties[key]; if (val) { if (first) { first = false; } else { cmdStr += ','; } cmdStr += `${key}=${escapeProperty(val)}`; } } } } cmdStr += `${CMD_STRING}${escapeData(this.message)}`; return cmdStr; } } function escapeData(s) { return utils_1.toCommandValue(s) .replace(/%/g, '%25') .replace(/\r/g, '%0D') .replace(/\n/g, '%0A'); } function escapeProperty(s) { return utils_1.toCommandValue(s) .replace(/%/g, '%25') .replace(/\r/g, '%0D') .replace(/\n/g, '%0A') .replace(/:/g, '%3A') .replace(/,/g, '%2C'); } //# sourceMappingURL=command.js.map /***/ }), /***/ 32882: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; result["default"] = mod; return result; }; Object.defineProperty(exports, "__esModule", ({ value: true })); const command_1 = __webpack_require__(12541); const file_command_1 = __webpack_require__(29582); const utils_1 = __webpack_require__(74332); const os = __importStar(__webpack_require__(12087)); const path = __importStar(__webpack_require__(85622)); /** * The code to exit an action */ var ExitCode; (function (ExitCode) { /** * A code indicating that the action was successful */ ExitCode[ExitCode["Success"] = 0] = "Success"; /** * A code indicating that the action was a failure */ ExitCode[ExitCode["Failure"] = 1] = "Failure"; })(ExitCode = exports.ExitCode || (exports.ExitCode = {})); //----------------------------------------------------------------------- // Variables //----------------------------------------------------------------------- /** * Sets env variable for this action and future actions in the job * @param name the name of the variable to set * @param val the value of the variable. Non-string values will be converted to a string via JSON.stringify */ // eslint-disable-next-line @typescript-eslint/no-explicit-any function exportVariable(name, val) { const convertedVal = utils_1.toCommandValue(val); process.env[name] = convertedVal; const filePath = process.env['GITHUB_ENV'] || ''; if (filePath) { const delimiter = '_GitHubActionsFileCommandDelimeter_'; const commandValue = `${name}<<${delimiter}${os.EOL}${convertedVal}${os.EOL}${delimiter}`; file_command_1.issueCommand('ENV', commandValue); } else { command_1.issueCommand('set-env', { name }, convertedVal); } } exports.exportVariable = exportVariable; /** * Registers a secret which will get masked from logs * @param secret value of the secret */ function setSecret(secret) { command_1.issueCommand('add-mask', {}, secret); } exports.setSecret = setSecret; /** * Prepends inputPath to the PATH (for this action and future actions) * @param inputPath */ function addPath(inputPath) { const filePath = process.env['GITHUB_PATH'] || ''; if (filePath) { file_command_1.issueCommand('PATH', inputPath); } else { command_1.issueCommand('add-path', {}, inputPath); } process.env['PATH'] = `${inputPath}${path.delimiter}${process.env['PATH']}`; } exports.addPath = addPath; /** * Gets the value of an input. The value is also trimmed. * * @param name name of the input to get * @param options optional. See InputOptions. * @returns string */ function getInput(name, options) { const val = process.env[`INPUT_${name.replace(/ /g, '_').toUpperCase()}`] || ''; if (options && options.required && !val) { throw new Error(`Input required and not supplied: ${name}`); } return val.trim(); } exports.getInput = getInput; /** * Sets the value of an output. * * @param name name of the output to set * @param value value to store. Non-string values will be converted to a string via JSON.stringify */ // eslint-disable-next-line @typescript-eslint/no-explicit-any function setOutput(name, value) { command_1.issueCommand('set-output', { name }, value); } exports.setOutput = setOutput; /** * Enables or disables the echoing of commands into stdout for the rest of the step. * Echoing is disabled by default if ACTIONS_STEP_DEBUG is not set. * */ function setCommandEcho(enabled) { command_1.issue('echo', enabled ? 'on' : 'off'); } exports.setCommandEcho = setCommandEcho; //----------------------------------------------------------------------- // Results //----------------------------------------------------------------------- /** * Sets the action status to failed. * When the action exits it will be with an exit code of 1 * @param message add error issue message */ function setFailed(message) { process.exitCode = ExitCode.Failure; error(message); } exports.setFailed = setFailed; //----------------------------------------------------------------------- // Logging Commands //----------------------------------------------------------------------- /** * Gets whether Actions Step Debug is on or not */ function isDebug() { return process.env['RUNNER_DEBUG'] === '1'; } exports.isDebug = isDebug; /** * Writes debug message to user log * @param message debug message */ function debug(message) { command_1.issueCommand('debug', {}, message); } exports.debug = debug; /** * Adds an error issue * @param message error issue message. Errors will be converted to string via toString() */ function error(message) { command_1.issue('error', message instanceof Error ? message.toString() : message); } exports.error = error; /** * Adds an warning issue * @param message warning issue message. Errors will be converted to string via toString() */ function warning(message) { command_1.issue('warning', message instanceof Error ? message.toString() : message); } exports.warning = warning; /** * Writes info to log with console.log. * @param message info message */ function info(message) { process.stdout.write(message + os.EOL); } exports.info = info; /** * Begin an output group. * * Output until the next `groupEnd` will be foldable in this group * * @param name The name of the output group */ function startGroup(name) { command_1.issue('group', name); } exports.startGroup = startGroup; /** * End an output group. */ function endGroup() { command_1.issue('endgroup'); } exports.endGroup = endGroup; /** * Wrap an asynchronous function call in a group. * * Returns the same type as the function itself. * * @param name The name of the group * @param fn The function to wrap in the group */ function group(name, fn) { return __awaiter(this, void 0, void 0, function* () { startGroup(name); let result; try { result = yield fn(); } finally { endGroup(); } return result; }); } exports.group = group; //----------------------------------------------------------------------- // Wrapper action state //----------------------------------------------------------------------- /** * Saves state for current action, the state can only be retrieved by this action's post job execution. * * @param name name of the state to store * @param value value to store. Non-string values will be converted to a string via JSON.stringify */ // eslint-disable-next-line @typescript-eslint/no-explicit-any function saveState(name, value) { command_1.issueCommand('save-state', { name }, value); } exports.saveState = saveState; /** * Gets the value of an state set by this action's main execution. * * @param name name of the state to get * @returns string */ function getState(name) { return process.env[`STATE_${name}`] || ''; } exports.getState = getState; //# sourceMappingURL=core.js.map /***/ }), /***/ 29582: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; // For internal use, subject to change. var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; result["default"] = mod; return result; }; Object.defineProperty(exports, "__esModule", ({ value: true })); // We use any as a valid input type /* eslint-disable @typescript-eslint/no-explicit-any */ const fs = __importStar(__webpack_require__(35747)); const os = __importStar(__webpack_require__(12087)); const utils_1 = __webpack_require__(74332); function issueCommand(command, message) { const filePath = process.env[`GITHUB_${command}`]; if (!filePath) { throw new Error(`Unable to find environment variable for file command ${command}`); } if (!fs.existsSync(filePath)) { throw new Error(`Missing file at path: ${filePath}`); } fs.appendFileSync(filePath, `${utils_1.toCommandValue(message)}${os.EOL}`, { encoding: 'utf8' }); } exports.issueCommand = issueCommand; //# sourceMappingURL=file-command.js.map /***/ }), /***/ 74332: /***/ ((__unused_webpack_module, exports) => { "use strict"; // We use any as a valid input type /* eslint-disable @typescript-eslint/no-explicit-any */ Object.defineProperty(exports, "__esModule", ({ value: true })); /** * Sanitizes an input into a string so it can be passed into issueCommand safely * @param input input to sanitize into a string */ function toCommandValue(input) { if (input === null || input === undefined) { return ''; } else if (typeof input === 'string' || input instanceof String) { return input; } return JSON.stringify(input); } exports.toCommandValue = toCommandValue; //# sourceMappingURL=utils.js.map /***/ }), /***/ 84873: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.Context = void 0; const fs_1 = __webpack_require__(35747); const os_1 = __webpack_require__(12087); class Context { /** * Hydrate the context from the environment */ constructor() { this.payload = {}; if (process.env.GITHUB_EVENT_PATH) { if (fs_1.existsSync(process.env.GITHUB_EVENT_PATH)) { this.payload = JSON.parse(fs_1.readFileSync(process.env.GITHUB_EVENT_PATH, { encoding: 'utf8' })); } else { const path = process.env.GITHUB_EVENT_PATH; process.stdout.write(`GITHUB_EVENT_PATH ${path} does not exist${os_1.EOL}`); } } this.eventName = process.env.GITHUB_EVENT_NAME; this.sha = process.env.GITHUB_SHA; this.ref = process.env.GITHUB_REF; this.workflow = process.env.GITHUB_WORKFLOW; this.action = process.env.GITHUB_ACTION; this.actor = process.env.GITHUB_ACTOR; this.job = process.env.GITHUB_JOB; this.runNumber = parseInt(process.env.GITHUB_RUN_NUMBER, 10); this.runId = parseInt(process.env.GITHUB_RUN_ID, 10); } get issue() { const payload = this.payload; return Object.assign(Object.assign({}, this.repo), { number: (payload.issue || payload.pull_request || payload).number }); } get repo() { if (process.env.GITHUB_REPOSITORY) { const [owner, repo] = process.env.GITHUB_REPOSITORY.split('/'); return { owner, repo }; } if (this.payload.repository) { return { owner: this.payload.repository.owner.login, repo: this.payload.repository.name }; } throw new Error("context.repo requires a GITHUB_REPOSITORY environment variable like 'owner/repo'"); } } exports.Context = Context; //# sourceMappingURL=context.js.map /***/ }), /***/ 29483: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.getOctokit = exports.context = void 0; const Context = __importStar(__webpack_require__(84873)); const utils_1 = __webpack_require__(24864); exports.context = new Context.Context(); /** * Returns a hydrated octokit ready to use for GitHub Actions * * @param token the repo PAT or GITHUB_TOKEN * @param options other options to set */ function getOctokit(token, options) { return new utils_1.GitHub(utils_1.getOctokitOptions(token, options)); } exports.getOctokit = getOctokit; //# sourceMappingURL=github.js.map /***/ }), /***/ 18145: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.getApiBaseUrl = exports.getProxyAgent = exports.getAuthString = void 0; const httpClient = __importStar(__webpack_require__(66305)); function getAuthString(token, options) { if (!token && !options.auth) { throw new Error('Parameter token or opts.auth is required'); } else if (token && options.auth) { throw new Error('Parameters token and opts.auth may not both be specified'); } return typeof options.auth === 'string' ? options.auth : `token ${token}`; } exports.getAuthString = getAuthString; function getProxyAgent(destinationUrl) { const hc = new httpClient.HttpClient(); return hc.getAgent(destinationUrl); } exports.getProxyAgent = getProxyAgent; function getApiBaseUrl() { return process.env['GITHUB_API_URL'] || 'https://api.github.com'; } exports.getApiBaseUrl = getApiBaseUrl; //# sourceMappingURL=utils.js.map /***/ }), /***/ 24864: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.getOctokitOptions = exports.GitHub = exports.context = void 0; const Context = __importStar(__webpack_require__(84873)); const Utils = __importStar(__webpack_require__(18145)); // octokit + plugins const core_1 = __webpack_require__(40812); const plugin_rest_endpoint_methods_1 = __webpack_require__(5462); const plugin_paginate_rest_1 = __webpack_require__(19227); exports.context = new Context.Context(); const baseUrl = Utils.getApiBaseUrl(); const defaults = { baseUrl, request: { agent: Utils.getProxyAgent(baseUrl) } }; exports.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(defaults); /** * Convience function to correctly format Octokit Options to pass into the constructor. * * @param token the repo PAT or GITHUB_TOKEN * @param options other options to set */ function getOctokitOptions(token, options) { const opts = Object.assign({}, options || {}); // Shallow clone - don't mutate the object provided by the caller // Auth const auth = Utils.getAuthString(token, opts); if (auth) { opts.auth = auth; } return opts; } exports.getOctokitOptions = getOctokitOptions; //# sourceMappingURL=utils.js.map /***/ }), /***/ 66305: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); const url = __webpack_require__(78835); const http = __webpack_require__(98605); const https = __webpack_require__(57211); const pm = __webpack_require__(92901); let tunnel; var HttpCodes; (function (HttpCodes) { HttpCodes[HttpCodes["OK"] = 200] = "OK"; HttpCodes[HttpCodes["MultipleChoices"] = 300] = "MultipleChoices"; HttpCodes[HttpCodes["MovedPermanently"] = 301] = "MovedPermanently"; HttpCodes[HttpCodes["ResourceMoved"] = 302] = "ResourceMoved"; HttpCodes[HttpCodes["SeeOther"] = 303] = "SeeOther"; HttpCodes[HttpCodes["NotModified"] = 304] = "NotModified"; HttpCodes[HttpCodes["UseProxy"] = 305] = "UseProxy"; HttpCodes[HttpCodes["SwitchProxy"] = 306] = "SwitchProxy"; HttpCodes[HttpCodes["TemporaryRedirect"] = 307] = "TemporaryRedirect"; HttpCodes[HttpCodes["PermanentRedirect"] = 308] = "PermanentRedirect"; HttpCodes[HttpCodes["BadRequest"] = 400] = "BadRequest"; HttpCodes[HttpCodes["Unauthorized"] = 401] = "Unauthorized"; HttpCodes[HttpCodes["PaymentRequired"] = 402] = "PaymentRequired"; HttpCodes[HttpCodes["Forbidden"] = 403] = "Forbidden"; HttpCodes[HttpCodes["NotFound"] = 404] = "NotFound"; HttpCodes[HttpCodes["MethodNotAllowed"] = 405] = "MethodNotAllowed"; HttpCodes[HttpCodes["NotAcceptable"] = 406] = "NotAcceptable"; HttpCodes[HttpCodes["ProxyAuthenticationRequired"] = 407] = "ProxyAuthenticationRequired"; HttpCodes[HttpCodes["RequestTimeout"] = 408] = "RequestTimeout"; HttpCodes[HttpCodes["Conflict"] = 409] = "Conflict"; HttpCodes[HttpCodes["Gone"] = 410] = "Gone"; HttpCodes[HttpCodes["TooManyRequests"] = 429] = "TooManyRequests"; HttpCodes[HttpCodes["InternalServerError"] = 500] = "InternalServerError"; HttpCodes[HttpCodes["NotImplemented"] = 501] = "NotImplemented"; HttpCodes[HttpCodes["BadGateway"] = 502] = "BadGateway"; HttpCodes[HttpCodes["ServiceUnavailable"] = 503] = "ServiceUnavailable"; HttpCodes[HttpCodes["GatewayTimeout"] = 504] = "GatewayTimeout"; })(HttpCodes = exports.HttpCodes || (exports.HttpCodes = {})); var Headers; (function (Headers) { Headers["Accept"] = "accept"; Headers["ContentType"] = "content-type"; })(Headers = exports.Headers || (exports.Headers = {})); var MediaTypes; (function (MediaTypes) { MediaTypes["ApplicationJson"] = "application/json"; })(MediaTypes = exports.MediaTypes || (exports.MediaTypes = {})); /** * Returns the proxy URL, depending upon the supplied url and proxy environment variables. * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com */ function getProxyUrl(serverUrl) { let proxyUrl = pm.getProxyUrl(url.parse(serverUrl)); return proxyUrl ? proxyUrl.href : ''; } exports.getProxyUrl = getProxyUrl; const HttpRedirectCodes = [ HttpCodes.MovedPermanently, HttpCodes.ResourceMoved, HttpCodes.SeeOther, HttpCodes.TemporaryRedirect, HttpCodes.PermanentRedirect ]; const HttpResponseRetryCodes = [ HttpCodes.BadGateway, HttpCodes.ServiceUnavailable, HttpCodes.GatewayTimeout ]; const RetryableHttpVerbs = ['OPTIONS', 'GET', 'DELETE', 'HEAD']; const ExponentialBackoffCeiling = 10; const ExponentialBackoffTimeSlice = 5; class HttpClientResponse { constructor(message) { this.message = message; } readBody() { return new Promise(async (resolve, reject) => { let output = Buffer.alloc(0); this.message.on('data', (chunk) => { output = Buffer.concat([output, chunk]); }); this.message.on('end', () => { resolve(output.toString()); }); }); } } exports.HttpClientResponse = HttpClientResponse; function isHttps(requestUrl) { let parsedUrl = url.parse(requestUrl); return parsedUrl.protocol === 'https:'; } exports.isHttps = isHttps; class HttpClient { constructor(userAgent, handlers, requestOptions) { this._ignoreSslError = false; this._allowRedirects = true; this._allowRedirectDowngrade = false; this._maxRedirects = 50; this._allowRetries = false; this._maxRetries = 1; this._keepAlive = false; this._disposed = false; this.userAgent = userAgent; this.handlers = handlers || []; this.requestOptions = requestOptions; if (requestOptions) { if (requestOptions.ignoreSslError != null) { this._ignoreSslError = requestOptions.ignoreSslError; } this._socketTimeout = requestOptions.socketTimeout; if (requestOptions.allowRedirects != null) { this._allowRedirects = requestOptions.allowRedirects; } if (requestOptions.allowRedirectDowngrade != null) { this._allowRedirectDowngrade = requestOptions.allowRedirectDowngrade; } if (requestOptions.maxRedirects != null) { this._maxRedirects = Math.max(requestOptions.maxRedirects, 0); } if (requestOptions.keepAlive != null) { this._keepAlive = requestOptions.keepAlive; } if (requestOptions.allowRetries != null) { this._allowRetries = requestOptions.allowRetries; } if (requestOptions.maxRetries != null) { this._maxRetries = requestOptions.maxRetries; } } } options(requestUrl, additionalHeaders) { return this.request('OPTIONS', requestUrl, null, additionalHeaders || {}); } get(requestUrl, additionalHeaders) { return this.request('GET', requestUrl, null, additionalHeaders || {}); } del(requestUrl, additionalHeaders) { return this.request('DELETE', requestUrl, null, additionalHeaders || {}); } post(requestUrl, data, additionalHeaders) { return this.request('POST', requestUrl, data, additionalHeaders || {}); } patch(requestUrl, data, additionalHeaders) { return this.request('PATCH', requestUrl, data, additionalHeaders || {}); } put(requestUrl, data, additionalHeaders) { return this.request('PUT', requestUrl, data, additionalHeaders || {}); } head(requestUrl, additionalHeaders) { return this.request('HEAD', requestUrl, null, additionalHeaders || {}); } sendStream(verb, requestUrl, stream, additionalHeaders) { return this.request(verb, requestUrl, stream, additionalHeaders); } /** * Gets a typed object from an endpoint * Be aware that not found returns a null. Other errors (4xx, 5xx) reject the promise */ async getJson(requestUrl, additionalHeaders = {}) { additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); let res = await this.get(requestUrl, additionalHeaders); return this._processResponse(res, this.requestOptions); } async postJson(requestUrl, obj, additionalHeaders = {}) { let data = JSON.stringify(obj, null, 2); additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); let res = await this.post(requestUrl, data, additionalHeaders); return this._processResponse(res, this.requestOptions); } async putJson(requestUrl, obj, additionalHeaders = {}) { let data = JSON.stringify(obj, null, 2); additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); let res = await this.put(requestUrl, data, additionalHeaders); return this._processResponse(res, this.requestOptions); } async patchJson(requestUrl, obj, additionalHeaders = {}) { let data = JSON.stringify(obj, null, 2); additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); let res = await this.patch(requestUrl, data, additionalHeaders); return this._processResponse(res, this.requestOptions); } /** * Makes a raw http request. * All other methods such as get, post, patch, and request ultimately call this. * Prefer get, del, post and patch */ async request(verb, requestUrl, data, headers) { if (this._disposed) { throw new Error('Client has already been disposed.'); } let parsedUrl = url.parse(requestUrl); let info = this._prepareRequest(verb, parsedUrl, headers); // Only perform retries on reads since writes may not be idempotent. let maxTries = this._allowRetries && RetryableHttpVerbs.indexOf(verb) != -1 ? this._maxRetries + 1 : 1; let numTries = 0; let response; while (numTries < maxTries) { response = await this.requestRaw(info, data); // Check if it's an authentication challenge if (response && response.message && response.message.statusCode === HttpCodes.Unauthorized) { let authenticationHandler; for (let i = 0; i < this.handlers.length; i++) { if (this.handlers[i].canHandleAuthentication(response)) { authenticationHandler = this.handlers[i]; break; } } if (authenticationHandler) { return authenticationHandler.handleAuthentication(this, info, data); } else { // We have received an unauthorized response but have no handlers to handle it. // Let the response return to the caller. return response; } } let redirectsRemaining = this._maxRedirects; while (HttpRedirectCodes.indexOf(response.message.statusCode) != -1 && this._allowRedirects && redirectsRemaining > 0) { const redirectUrl = response.message.headers['location']; if (!redirectUrl) { // if there's no location to redirect to, we won't break; } let parsedRedirectUrl = url.parse(redirectUrl); if (parsedUrl.protocol == 'https:' && parsedUrl.protocol != parsedRedirectUrl.protocol && !this._allowRedirectDowngrade) { throw new Error('Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true.'); } // we need to finish reading the response before reassigning response // which will leak the open socket. await response.readBody(); // strip authorization header if redirected to a different hostname if (parsedRedirectUrl.hostname !== parsedUrl.hostname) { for (let header in headers) { // header names are case insensitive if (header.toLowerCase() === 'authorization') { delete headers[header]; } } } // let's make the request with the new redirectUrl info = this._prepareRequest(verb, parsedRedirectUrl, headers); response = await this.requestRaw(info, data); redirectsRemaining--; } if (HttpResponseRetryCodes.indexOf(response.message.statusCode) == -1) { // If not a retry code, return immediately instead of retrying return response; } numTries += 1; if (numTries < maxTries) { await response.readBody(); await this._performExponentialBackoff(numTries); } } return response; } /** * Needs to be called if keepAlive is set to true in request options. */ dispose() { if (this._agent) { this._agent.destroy(); } this._disposed = true; } /** * Raw request. * @param info * @param data */ requestRaw(info, data) { return new Promise((resolve, reject) => { let callbackForResult = function (err, res) { if (err) { reject(err); } resolve(res); }; this.requestRawWithCallback(info, data, callbackForResult); }); } /** * Raw request with callback. * @param info * @param data * @param onResult */ requestRawWithCallback(info, data, onResult) { let socket; if (typeof data === 'string') { info.options.headers['Content-Length'] = Buffer.byteLength(data, 'utf8'); } let callbackCalled = false; let handleResult = (err, res) => { if (!callbackCalled) { callbackCalled = true; onResult(err, res); } }; let req = info.httpModule.request(info.options, (msg) => { let res = new HttpClientResponse(msg); handleResult(null, res); }); req.on('socket', sock => { socket = sock; }); // If we ever get disconnected, we want the socket to timeout eventually req.setTimeout(this._socketTimeout || 3 * 60000, () => { if (socket) { socket.end(); } handleResult(new Error('Request timeout: ' + info.options.path), null); }); req.on('error', function (err) { // err has statusCode property // res should have headers handleResult(err, null); }); if (data && typeof data === 'string') { req.write(data, 'utf8'); } if (data && typeof data !== 'string') { data.on('close', function () { req.end(); }); data.pipe(req); } else { req.end(); } } /** * Gets an http agent. This function is useful when you need an http agent that handles * routing through a proxy server - depending upon the url and proxy environment variables. * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com */ getAgent(serverUrl) { let parsedUrl = url.parse(serverUrl); return this._getAgent(parsedUrl); } _prepareRequest(method, requestUrl, headers) { const info = {}; info.parsedUrl = requestUrl; const usingSsl = info.parsedUrl.protocol === 'https:'; info.httpModule = usingSsl ? https : http; const defaultPort = usingSsl ? 443 : 80; info.options = {}; info.options.host = info.parsedUrl.hostname; info.options.port = info.parsedUrl.port ? parseInt(info.parsedUrl.port) : defaultPort; info.options.path = (info.parsedUrl.pathname || '') + (info.parsedUrl.search || ''); info.options.method = method; info.options.headers = this._mergeHeaders(headers); if (this.userAgent != null) { info.options.headers['user-agent'] = this.userAgent; } info.options.agent = this._getAgent(info.parsedUrl); // gives handlers an opportunity to participate if (this.handlers) { this.handlers.forEach(handler => { handler.prepareRequest(info.options); }); } return info; } _mergeHeaders(headers) { const lowercaseKeys = obj => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {}); if (this.requestOptions && this.requestOptions.headers) { return Object.assign({}, lowercaseKeys(this.requestOptions.headers), lowercaseKeys(headers)); } return lowercaseKeys(headers || {}); } _getExistingOrDefaultHeader(additionalHeaders, header, _default) { const lowercaseKeys = obj => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {}); let clientHeader; if (this.requestOptions && this.requestOptions.headers) { clientHeader = lowercaseKeys(this.requestOptions.headers)[header]; } return additionalHeaders[header] || clientHeader || _default; } _getAgent(parsedUrl) { let agent; let proxyUrl = pm.getProxyUrl(parsedUrl); let useProxy = proxyUrl && proxyUrl.hostname; if (this._keepAlive && useProxy) { agent = this._proxyAgent; } if (this._keepAlive && !useProxy) { agent = this._agent; } // if agent is already assigned use that agent. if (!!agent) { return agent; } const usingSsl = parsedUrl.protocol === 'https:'; let maxSockets = 100; if (!!this.requestOptions) { maxSockets = this.requestOptions.maxSockets || http.globalAgent.maxSockets; } if (useProxy) { // If using proxy, need tunnel if (!tunnel) { tunnel = __webpack_require__(34603); } const agentOptions = { maxSockets: maxSockets, keepAlive: this._keepAlive, proxy: { proxyAuth: proxyUrl.auth, host: proxyUrl.hostname, port: proxyUrl.port } }; let tunnelAgent; const overHttps = proxyUrl.protocol === 'https:'; if (usingSsl) { tunnelAgent = overHttps ? tunnel.httpsOverHttps : tunnel.httpsOverHttp; } else { tunnelAgent = overHttps ? tunnel.httpOverHttps : tunnel.httpOverHttp; } agent = tunnelAgent(agentOptions); this._proxyAgent = agent; } // if reusing agent across request and tunneling agent isn't assigned create a new agent if (this._keepAlive && !agent) { const options = { keepAlive: this._keepAlive, maxSockets: maxSockets }; agent = usingSsl ? new https.Agent(options) : new http.Agent(options); this._agent = agent; } // if not using private agent and tunnel agent isn't setup then use global agent if (!agent) { agent = usingSsl ? https.globalAgent : http.globalAgent; } if (usingSsl && this._ignoreSslError) { // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options // we have to cast it to any and change it directly agent.options = Object.assign(agent.options || {}, { rejectUnauthorized: false }); } return agent; } _performExponentialBackoff(retryNumber) { retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber); const ms = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber); return new Promise(resolve => setTimeout(() => resolve(), ms)); } static dateTimeDeserializer(key, value) { if (typeof value === 'string') { let a = new Date(value); if (!isNaN(a.valueOf())) { return a; } } return value; } async _processResponse(res, options) { return new Promise(async (resolve, reject) => { const statusCode = res.message.statusCode; const response = { statusCode: statusCode, result: null, headers: {} }; // not found leads to null obj returned if (statusCode == HttpCodes.NotFound) { resolve(response); } let obj; let contents; // get the result from the body try { contents = await res.readBody(); if (contents && contents.length > 0) { if (options && options.deserializeDates) { obj = JSON.parse(contents, HttpClient.dateTimeDeserializer); } else { obj = JSON.parse(contents); } response.result = obj; } response.headers = res.message.headers; } catch (err) { // Invalid resource (contents not json); leaving result obj null } // note that 3xx redirects are handled by the http layer. if (statusCode > 299) { let msg; // if exception/error in body, attempt to get better error if (obj && obj.message) { msg = obj.message; } else if (contents && contents.length > 0) { // it may be the case that the exception is in the body message as string msg = contents; } else { msg = 'Failed request: (' + statusCode + ')'; } let err = new Error(msg); // attach statusCode and body obj (if available) to the error object err['statusCode'] = statusCode; if (response.result) { err['result'] = response.result; } reject(err); } else { resolve(response); } }); } } exports.HttpClient = HttpClient; /***/ }), /***/ 92901: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); const url = __webpack_require__(78835); function getProxyUrl(reqUrl) { let usingSsl = reqUrl.protocol === 'https:'; let proxyUrl; if (checkBypass(reqUrl)) { return proxyUrl; } let proxyVar; if (usingSsl) { proxyVar = process.env['https_proxy'] || process.env['HTTPS_PROXY']; } else { proxyVar = process.env['http_proxy'] || process.env['HTTP_PROXY']; } if (proxyVar) { proxyUrl = url.parse(proxyVar); } return proxyUrl; } exports.getProxyUrl = getProxyUrl; function checkBypass(reqUrl) { if (!reqUrl.hostname) { return false; } let noProxy = process.env['no_proxy'] || process.env['NO_PROXY'] || ''; if (!noProxy) { return false; } // Determine the request port let reqPort; if (reqUrl.port) { reqPort = Number(reqUrl.port); } else if (reqUrl.protocol === 'http:') { reqPort = 80; } else if (reqUrl.protocol === 'https:') { reqPort = 443; } // Format the request hostname and hostname with port let upperReqHosts = [reqUrl.hostname.toUpperCase()]; if (typeof reqPort === 'number') { upperReqHosts.push(`${upperReqHosts[0]}:${reqPort}`); } // Compare request host against noproxy for (let upperNoProxyItem of noProxy .split(',') .map(x => x.trim().toUpperCase()) .filter(x => x)) { if (upperReqHosts.some(x => x === upperNoProxyItem)) { return true; } } return false; } exports.checkBypass = checkBypass; /***/ }), /***/ 22899: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); async function auth(token) { const tokenType = token.split(/\./).length === 3 ? "app" : /^v\d+\./.test(token) ? "installation" : "oauth"; return { type: "token", token: token, tokenType }; } /** * Prefix token for usage in the Authorization header * * @param token OAuth token or JSON Web Token */ function withAuthorizationPrefix(token) { if (token.split(/\./).length === 3) { return `bearer ${token}`; } return `token ${token}`; } async function hook(token, request, route, parameters) { const endpoint = request.endpoint.merge(route, parameters); endpoint.headers.authorization = withAuthorizationPrefix(token); return request(endpoint); } const createTokenAuth = function createTokenAuth(token) { if (!token) { throw new Error("[@octokit/auth-token] No token passed to createTokenAuth"); } if (typeof token !== "string") { throw new Error("[@octokit/auth-token] Token passed to createTokenAuth is not a string"); } token = token.replace(/^(token|bearer) +/i, ""); return Object.assign(auth.bind(null, token), { hook: hook.bind(null, token) }); }; exports.createTokenAuth = createTokenAuth; //# sourceMappingURL=index.js.map /***/ }), /***/ 40812: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); var universalUserAgent = __webpack_require__(1857); var beforeAfterHook = __webpack_require__(46401); var request = __webpack_require__(48826); var graphql = __webpack_require__(3584); var authToken = __webpack_require__(22899); function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread2(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } const VERSION = "3.1.2"; class Octokit { constructor(options = {}) { const hook = new beforeAfterHook.Collection(); const requestDefaults = { baseUrl: request.request.endpoint.DEFAULTS.baseUrl, headers: {}, request: Object.assign({}, options.request, { hook: hook.bind(null, "request") }), mediaType: { previews: [], format: "" } }; // prepend default user agent with `options.userAgent` if set requestDefaults.headers["user-agent"] = [options.userAgent, `octokit-core.js/${VERSION} ${universalUserAgent.getUserAgent()}`].filter(Boolean).join(" "); if (options.baseUrl) { requestDefaults.baseUrl = options.baseUrl; } if (options.previews) { requestDefaults.mediaType.previews = options.previews; } if (options.timeZone) { requestDefaults.headers["time-zone"] = options.timeZone; } this.request = request.request.defaults(requestDefaults); this.graphql = graphql.withCustomRequest(this.request).defaults(_objectSpread2(_objectSpread2({}, requestDefaults), {}, { baseUrl: requestDefaults.baseUrl.replace(/\/api\/v3$/, "/api") })); this.log = Object.assign({ debug: () => {}, info: () => {}, warn: console.warn.bind(console), error: console.error.bind(console) }, options.log); this.hook = hook; // (1) If neither `options.authStrategy` nor `options.auth` are set, the `octokit` instance // is unauthenticated. The `this.auth()` method is a no-op and no request hook is registred. // (2) If only `options.auth` is set, use the default token authentication strategy. // (3) If `options.authStrategy` is set then use it and pass in `options.auth`. Always pass own request as many strategies accept a custom request instance. // TODO: type `options.auth` based on `options.authStrategy`. if (!options.authStrategy) { if (!options.auth) { // (1) this.auth = async () => ({ type: "unauthenticated" }); } else { // (2) const auth = authToken.createTokenAuth(options.auth); // @ts-ignore ¯\_(ツ)_/¯ hook.wrap("request", auth.hook); this.auth = auth; } } else { const auth = options.authStrategy(Object.assign({ request: this.request }, options.auth)); // @ts-ignore ¯\_(ツ)_/¯ hook.wrap("request", auth.hook); this.auth = auth; } // apply plugins // https://stackoverflow.com/a/16345172 const classConstructor = this.constructor; classConstructor.plugins.forEach(plugin => { Object.assign(this, plugin(this, options)); }); } static defaults(defaults) { const OctokitWithDefaults = class extends this { constructor(...args) { const options = args[0] || {}; if (typeof defaults === "function") { super(defaults(options)); return; } super(Object.assign({}, defaults, options, options.userAgent && defaults.userAgent ? { userAgent: `${options.userAgent} ${defaults.userAgent}` } : null)); } }; return OctokitWithDefaults; } /** * Attach a plugin (or many) to your Octokit instance. * * @example * const API = Octokit.plugin(plugin1, plugin2, plugin3, ...) */ static plugin(...newPlugins) { var _a; const currentPlugins = this.plugins; const NewOctokit = (_a = class extends this {}, _a.plugins = currentPlugins.concat(newPlugins.filter(plugin => !currentPlugins.includes(plugin))), _a); return NewOctokit; } } Octokit.VERSION = VERSION; Octokit.plugins = []; exports.Octokit = Octokit; //# sourceMappingURL=index.js.map /***/ }), /***/ 70412: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); var isPlainObject = __webpack_require__(80641); var universalUserAgent = __webpack_require__(1857); function lowercaseKeys(object) { if (!object) { return {}; } return Object.keys(object).reduce((newObj, key) => { newObj[key.toLowerCase()] = object[key]; return newObj; }, {}); } function mergeDeep(defaults, options) { const result = Object.assign({}, defaults); Object.keys(options).forEach(key => { if (isPlainObject.isPlainObject(options[key])) { if (!(key in defaults)) Object.assign(result, { [key]: options[key] });else result[key] = mergeDeep(defaults[key], options[key]); } else { Object.assign(result, { [key]: options[key] }); } }); return result; } function removeUndefinedProperties(obj) { for (const key in obj) { if (obj[key] === undefined) { delete obj[key]; } } return obj; } function merge(defaults, route, options) { if (typeof route === "string") { let [method, url] = route.split(" "); options = Object.assign(url ? { method, url } : { url: method }, options); } else { options = Object.assign({}, route); } // lowercase header names before merging with defaults to avoid duplicates options.headers = lowercaseKeys(options.headers); // remove properties with undefined values before merging removeUndefinedProperties(options); removeUndefinedProperties(options.headers); const mergedOptions = mergeDeep(defaults || {}, options); // mediaType.previews arrays are merged, instead of overwritten if (defaults && defaults.mediaType.previews.length) { mergedOptions.mediaType.previews = defaults.mediaType.previews.filter(preview => !mergedOptions.mediaType.previews.includes(preview)).concat(mergedOptions.mediaType.previews); } mergedOptions.mediaType.previews = mergedOptions.mediaType.previews.map(preview => preview.replace(/-preview/, "")); return mergedOptions; } function addQueryParameters(url, parameters) { const separator = /\?/.test(url) ? "&" : "?"; const names = Object.keys(parameters); if (names.length === 0) { return url; } return url + separator + names.map(name => { if (name === "q") { return "q=" + parameters.q.split("+").map(encodeURIComponent).join("+"); } return `${name}=${encodeURIComponent(parameters[name])}`; }).join("&"); } const urlVariableRegex = /\{[^}]+\}/g; function removeNonChars(variableName) { return variableName.replace(/^\W+|\W+$/g, "").split(/,/); } function extractUrlVariableNames(url) { const matches = url.match(urlVariableRegex); if (!matches) { return []; } return matches.map(removeNonChars).reduce((a, b) => a.concat(b), []); } function omit(object, keysToOmit) { return Object.keys(object).filter(option => !keysToOmit.includes(option)).reduce((obj, key) => { obj[key] = object[key]; return obj; }, {}); } // Based on https://github.com/bramstein/url-template, licensed under BSD // TODO: create separate package. // // Copyright (c) 2012-2014, Bram Stein // All rights reserved. // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // 3. The name of the author may not be used to endorse or promote products // derived from this software without specific prior written permission. // THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO // EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, // BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, // EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* istanbul ignore file */ function encodeReserved(str) { return str.split(/(%[0-9A-Fa-f]{2})/g).map(function (part) { if (!/%[0-9A-Fa-f]/.test(part)) { part = encodeURI(part).replace(/%5B/g, "[").replace(/%5D/g, "]"); } return part; }).join(""); } function encodeUnreserved(str) { return encodeURIComponent(str).replace(/[!'()*]/g, function (c) { return "%" + c.charCodeAt(0).toString(16).toUpperCase(); }); } function encodeValue(operator, value, key) { value = operator === "+" || operator === "#" ? encodeReserved(value) : encodeUnreserved(value); if (key) { return encodeUnreserved(key) + "=" + value; } else { return value; } } function isDefined(value) { return value !== undefined && value !== null; } function isKeyOperator(operator) { return operator === ";" || operator === "&" || operator === "?"; } function getValues(context, operator, key, modifier) { var value = context[key], result = []; if (isDefined(value) && value !== "") { if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") { value = value.toString(); if (modifier && modifier !== "*") { value = value.substring(0, parseInt(modifier, 10)); } result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : "")); } else { if (modifier === "*") { if (Array.isArray(value)) { value.filter(isDefined).forEach(function (value) { result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : "")); }); } else { Object.keys(value).forEach(function (k) { if (isDefined(value[k])) { result.push(encodeValue(operator, value[k], k)); } }); } } else { const tmp = []; if (Array.isArray(value)) { value.filter(isDefined).forEach(function (value) { tmp.push(encodeValue(operator, value)); }); } else { Object.keys(value).forEach(function (k) { if (isDefined(value[k])) { tmp.push(encodeUnreserved(k)); tmp.push(encodeValue(operator, value[k].toString())); } }); } if (isKeyOperator(operator)) { result.push(encodeUnreserved(key) + "=" + tmp.join(",")); } else if (tmp.length !== 0) { result.push(tmp.join(",")); } } } } else { if (operator === ";") { if (isDefined(value)) { result.push(encodeUnreserved(key)); } } else if (value === "" && (operator === "&" || operator === "?")) { result.push(encodeUnreserved(key) + "="); } else if (value === "") { result.push(""); } } return result; } function parseUrl(template) { return { expand: expand.bind(null, template) }; } function expand(template, context) { var operators = ["+", "#", ".", "/", ";", "?", "&"]; return template.replace(/\{([^\{\}]+)\}|([^\{\}]+)/g, function (_, expression, literal) { if (expression) { let operator = ""; const values = []; if (operators.indexOf(expression.charAt(0)) !== -1) { operator = expression.charAt(0); expression = expression.substr(1); } expression.split(/,/g).forEach(function (variable) { var tmp = /([^:\*]*)(?::(\d+)|(\*))?/.exec(variable); values.push(getValues(context, operator, tmp[1], tmp[2] || tmp[3])); }); if (operator && operator !== "+") { var separator = ","; if (operator === "?") { separator = "&"; } else if (operator !== "#") { separator = operator; } return (values.length !== 0 ? operator : "") + values.join(separator); } else { return values.join(","); } } else { return encodeReserved(literal); } }); } function parse(options) { // https://fetch.spec.whatwg.org/#methods let method = options.method.toUpperCase(); // replace :varname with {varname} to make it RFC 6570 compatible let url = (options.url || "/").replace(/:([a-z]\w+)/g, "{$1}"); let headers = Object.assign({}, options.headers); let body; let parameters = omit(options, ["method", "baseUrl", "url", "headers", "request", "mediaType"]); // extract variable names from URL to calculate remaining variables later const urlVariableNames = extractUrlVariableNames(url); url = parseUrl(url).expand(parameters); if (!/^http/.test(url)) { url = options.baseUrl + url; } const omittedParameters = Object.keys(options).filter(option => urlVariableNames.includes(option)).concat("baseUrl"); const remainingParameters = omit(parameters, omittedParameters); const isBinaryRequest = /application\/octet-stream/i.test(headers.accept); if (!isBinaryRequest) { if (options.mediaType.format) { // e.g. application/vnd.github.v3+json => application/vnd.github.v3.raw headers.accept = headers.accept.split(/,/).map(preview => preview.replace(/application\/vnd(\.\w+)(\.v3)?(\.\w+)?(\+json)?$/, `application/vnd$1$2.${options.mediaType.format}`)).join(","); } if (options.mediaType.previews.length) { const previewsFromAcceptHeader = headers.accept.match(/[\w-]+(?=-preview)/g) || []; headers.accept = previewsFromAcceptHeader.concat(options.mediaType.previews).map(preview => { const format = options.mediaType.format ? `.${options.mediaType.format}` : "+json"; return `application/vnd.github.${preview}-preview${format}`; }).join(","); } } // for GET/HEAD requests, set URL query parameters from remaining parameters // for PATCH/POST/PUT/DELETE requests, set request body from remaining parameters if (["GET", "HEAD"].includes(method)) { url = addQueryParameters(url, remainingParameters); } else { if ("data" in remainingParameters) { body = remainingParameters.data; } else { if (Object.keys(remainingParameters).length) { body = remainingParameters; } else { headers["content-length"] = 0; } } } // default content-type for JSON if body is set if (!headers["content-type"] && typeof body !== "undefined") { headers["content-type"] = "application/json; charset=utf-8"; } // GitHub expects 'content-length: 0' header for PUT/PATCH requests without body. // fetch does not allow to set `content-length` header, but we can set body to an empty string if (["PATCH", "PUT"].includes(method) && typeof body === "undefined") { body = ""; } // Only return body/request keys if present return Object.assign({ method, url, headers }, typeof body !== "undefined" ? { body } : null, options.request ? { request: options.request } : null); } function endpointWithDefaults(defaults, route, options) { return parse(merge(defaults, route, options)); } function withDefaults(oldDefaults, newDefaults) { const DEFAULTS = merge(oldDefaults, newDefaults); const endpoint = endpointWithDefaults.bind(null, DEFAULTS); return Object.assign(endpoint, { DEFAULTS, defaults: withDefaults.bind(null, DEFAULTS), merge: merge.bind(null, DEFAULTS), parse }); } const VERSION = "6.0.8"; const userAgent = `octokit-endpoint.js/${VERSION} ${universalUserAgent.getUserAgent()}`; // DEFAULTS has all properties set that EndpointOptions has, except url. // So we use RequestParameters and add method as additional required property. const DEFAULTS = { method: "GET", baseUrl: "https://api.github.com", headers: { accept: "application/vnd.github.v3+json", "user-agent": userAgent }, mediaType: { format: "", previews: [] } }; const endpoint = withDefaults(null, DEFAULTS); exports.endpoint = endpoint; //# sourceMappingURL=index.js.map /***/ }), /***/ 3584: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); var request = __webpack_require__(48826); var universalUserAgent = __webpack_require__(1857); const VERSION = "4.5.6"; class GraphqlError extends Error { constructor(request, response) { const message = response.data.errors[0].message; super(message); Object.assign(this, response.data); Object.assign(this, { headers: response.headers }); this.name = "GraphqlError"; this.request = request; // Maintains proper stack trace (only available on V8) /* istanbul ignore next */ if (Error.captureStackTrace) { Error.captureStackTrace(this, this.constructor); } } } const NON_VARIABLE_OPTIONS = ["method", "baseUrl", "url", "headers", "request", "query", "mediaType"]; const GHES_V3_SUFFIX_REGEX = /\/api\/v3\/?$/; function graphql(request, query, options) { if (typeof query === "string" && options && "query" in options) { return Promise.reject(new Error(`[@octokit/graphql] "query" cannot be used as variable name`)); } const parsedOptions = typeof query === "string" ? Object.assign({ query }, options) : query; const requestOptions = Object.keys(parsedOptions).reduce((result, key) => { if (NON_VARIABLE_OPTIONS.includes(key)) { result[key] = parsedOptions[key]; return result; } if (!result.variables) { result.variables = {}; } result.variables[key] = parsedOptions[key]; return result; }, {}); // workaround for GitHub Enterprise baseUrl set with /api/v3 suffix // https://github.com/octokit/auth-app.js/issues/111#issuecomment-657610451 const baseUrl = parsedOptions.baseUrl || request.endpoint.DEFAULTS.baseUrl; if (GHES_V3_SUFFIX_REGEX.test(baseUrl)) { requestOptions.url = baseUrl.replace(GHES_V3_SUFFIX_REGEX, "/api/graphql"); } return request(requestOptions).then(response => { if (response.data.errors) { const headers = {}; for (const key of Object.keys(response.headers)) { headers[key] = response.headers[key]; } throw new GraphqlError(requestOptions, { headers, data: response.data }); } return response.data.data; }); } function withDefaults(request$1, newDefaults) { const newRequest = request$1.defaults(newDefaults); const newApi = (query, options) => { return graphql(newRequest, query, options); }; return Object.assign(newApi, { defaults: withDefaults.bind(null, newRequest), endpoint: request.request.endpoint }); } const graphql$1 = withDefaults(request.request, { headers: { "user-agent": `octokit-graphql.js/${VERSION} ${universalUserAgent.getUserAgent()}` }, method: "POST", url: "/graphql" }); function withCustomRequest(customRequest) { return withDefaults(customRequest, { method: "POST", url: "/graphql" }); } exports.graphql = graphql$1; exports.withCustomRequest = withCustomRequest; //# sourceMappingURL=index.js.map /***/ }), /***/ 19227: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); const VERSION = "2.4.0"; /** * Some “list” response that can be paginated have a different response structure * * They have a `total_count` key in the response (search also has `incomplete_results`, * /installation/repositories also has `repository_selection`), as well as a key with * the list of the items which name varies from endpoint to endpoint. * * Octokit normalizes these responses so that paginated results are always returned following * the same structure. One challenge is that if the list response has only one page, no Link * header is provided, so this header alone is not sufficient to check wether a response is * paginated or not. * * We check if a "total_count" key is present in the response data, but also make sure that * a "url" property is not, as the "Get the combined status for a specific ref" endpoint would * otherwise match: https://developer.github.com/v3/repos/statuses/#get-the-combined-status-for-a-specific-ref */ function normalizePaginatedListResponse(response) { const responseNeedsNormalization = "total_count" in response.data && !("url" in response.data); if (!responseNeedsNormalization) return response; // keep the additional properties intact as there is currently no other way // to retrieve the same information. const incompleteResults = response.data.incomplete_results; const repositorySelection = response.data.repository_selection; const totalCount = response.data.total_count; delete response.data.incomplete_results; delete response.data.repository_selection; delete response.data.total_count; const namespaceKey = Object.keys(response.data)[0]; const data = response.data[namespaceKey]; response.data = data; if (typeof incompleteResults !== "undefined") { response.data.incomplete_results = incompleteResults; } if (typeof repositorySelection !== "undefined") { response.data.repository_selection = repositorySelection; } response.data.total_count = totalCount; return response; } function iterator(octokit, route, parameters) { const options = typeof route === "function" ? route.endpoint(parameters) : octokit.request.endpoint(route, parameters); const requestMethod = typeof route === "function" ? route : octokit.request; const method = options.method; const headers = options.headers; let url = options.url; return { [Symbol.asyncIterator]: () => ({ next() { if (!url) { return Promise.resolve({ done: true }); } return requestMethod({ method, url, headers }).then(normalizePaginatedListResponse).then(response => { // `response.headers.link` format: // '; rel="next", ; rel="last"' // sets `url` to undefined if "next" URL is not present or `link` header is not set url = ((response.headers.link || "").match(/<([^>]+)>;\s*rel="next"/) || [])[1]; return { value: response }; }); } }) }; } function paginate(octokit, route, parameters, mapFn) { if (typeof parameters === "function") { mapFn = parameters; parameters = undefined; } return gather(octokit, [], iterator(octokit, route, parameters)[Symbol.asyncIterator](), mapFn); } function gather(octokit, results, iterator, mapFn) { return iterator.next().then(result => { if (result.done) { return results; } let earlyExit = false; function done() { earlyExit = true; } results = results.concat(mapFn ? mapFn(result.value, done) : result.value.data); if (earlyExit) { return results; } return gather(octokit, results, iterator, mapFn); }); } /** * @param octokit Octokit instance * @param options Options passed to Octokit constructor */ function paginateRest(octokit) { return { paginate: Object.assign(paginate.bind(null, octokit), { iterator: iterator.bind(null, octokit) }) }; } paginateRest.VERSION = VERSION; exports.paginateRest = paginateRest; //# sourceMappingURL=index.js.map /***/ }), /***/ 5462: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); const Endpoints = { actions: { addSelectedRepoToOrgSecret: ["PUT /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}"], cancelWorkflowRun: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/cancel"], createOrUpdateOrgSecret: ["PUT /orgs/{org}/actions/secrets/{secret_name}"], createOrUpdateRepoSecret: ["PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}"], createRegistrationTokenForOrg: ["POST /orgs/{org}/actions/runners/registration-token"], createRegistrationTokenForRepo: ["POST /repos/{owner}/{repo}/actions/runners/registration-token"], createRemoveTokenForOrg: ["POST /orgs/{org}/actions/runners/remove-token"], createRemoveTokenForRepo: ["POST /repos/{owner}/{repo}/actions/runners/remove-token"], createWorkflowDispatch: ["POST /repos/{owner}/{repo}/actions/workflows/{workflow_id}/dispatches"], deleteArtifact: ["DELETE /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"], deleteOrgSecret: ["DELETE /orgs/{org}/actions/secrets/{secret_name}"], deleteRepoSecret: ["DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}"], deleteSelfHostedRunnerFromOrg: ["DELETE /orgs/{org}/actions/runners/{runner_id}"], deleteSelfHostedRunnerFromRepo: ["DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}"], deleteWorkflowRun: ["DELETE /repos/{owner}/{repo}/actions/runs/{run_id}"], deleteWorkflowRunLogs: ["DELETE /repos/{owner}/{repo}/actions/runs/{run_id}/logs"], downloadArtifact: ["GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}/{archive_format}"], downloadJobLogsForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/jobs/{job_id}/logs"], downloadWorkflowRunLogs: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/logs"], getArtifact: ["GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"], getJobForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/jobs/{job_id}"], getOrgPublicKey: ["GET /orgs/{org}/actions/secrets/public-key"], getOrgSecret: ["GET /orgs/{org}/actions/secrets/{secret_name}"], getRepoPublicKey: ["GET /repos/{owner}/{repo}/actions/secrets/public-key"], getRepoSecret: ["GET /repos/{owner}/{repo}/actions/secrets/{secret_name}"], getSelfHostedRunnerForOrg: ["GET /orgs/{org}/actions/runners/{runner_id}"], getSelfHostedRunnerForRepo: ["GET /repos/{owner}/{repo}/actions/runners/{runner_id}"], getWorkflow: ["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}"], getWorkflowRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}"], getWorkflowRunUsage: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/timing"], getWorkflowUsage: ["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/timing"], listArtifactsForRepo: ["GET /repos/{owner}/{repo}/actions/artifacts"], listJobsForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs"], listOrgSecrets: ["GET /orgs/{org}/actions/secrets"], listRepoSecrets: ["GET /repos/{owner}/{repo}/actions/secrets"], listRepoWorkflows: ["GET /repos/{owner}/{repo}/actions/workflows"], listRunnerApplicationsForOrg: ["GET /orgs/{org}/actions/runners/downloads"], listRunnerApplicationsForRepo: ["GET /repos/{owner}/{repo}/actions/runners/downloads"], listSelectedReposForOrgSecret: ["GET /orgs/{org}/actions/secrets/{secret_name}/repositories"], listSelfHostedRunnersForOrg: ["GET /orgs/{org}/actions/runners"], listSelfHostedRunnersForRepo: ["GET /repos/{owner}/{repo}/actions/runners"], listWorkflowRunArtifacts: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts"], listWorkflowRuns: ["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs"], listWorkflowRunsForRepo: ["GET /repos/{owner}/{repo}/actions/runs"], reRunWorkflow: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun"], removeSelectedRepoFromOrgSecret: ["DELETE /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}"], setSelectedReposForOrgSecret: ["PUT /orgs/{org}/actions/secrets/{secret_name}/repositories"] }, activity: { checkRepoIsStarredByAuthenticatedUser: ["GET /user/starred/{owner}/{repo}"], deleteRepoSubscription: ["DELETE /repos/{owner}/{repo}/subscription"], deleteThreadSubscription: ["DELETE /notifications/threads/{thread_id}/subscription"], getFeeds: ["GET /feeds"], getRepoSubscription: ["GET /repos/{owner}/{repo}/subscription"], getThread: ["GET /notifications/threads/{thread_id}"], getThreadSubscriptionForAuthenticatedUser: ["GET /notifications/threads/{thread_id}/subscription"], listEventsForAuthenticatedUser: ["GET /users/{username}/events"], listNotificationsForAuthenticatedUser: ["GET /notifications"], listOrgEventsForAuthenticatedUser: ["GET /users/{username}/events/orgs/{org}"], listPublicEvents: ["GET /events"], listPublicEventsForRepoNetwork: ["GET /networks/{owner}/{repo}/events"], listPublicEventsForUser: ["GET /users/{username}/events/public"], listPublicOrgEvents: ["GET /orgs/{org}/events"], listReceivedEventsForUser: ["GET /users/{username}/received_events"], listReceivedPublicEventsForUser: ["GET /users/{username}/received_events/public"], listRepoEvents: ["GET /repos/{owner}/{repo}/events"], listRepoNotificationsForAuthenticatedUser: ["GET /repos/{owner}/{repo}/notifications"], listReposStarredByAuthenticatedUser: ["GET /user/starred"], listReposStarredByUser: ["GET /users/{username}/starred"], listReposWatchedByUser: ["GET /users/{username}/subscriptions"], listStargazersForRepo: ["GET /repos/{owner}/{repo}/stargazers"], listWatchedReposForAuthenticatedUser: ["GET /user/subscriptions"], listWatchersForRepo: ["GET /repos/{owner}/{repo}/subscribers"], markNotificationsAsRead: ["PUT /notifications"], markRepoNotificationsAsRead: ["PUT /repos/{owner}/{repo}/notifications"], markThreadAsRead: ["PATCH /notifications/threads/{thread_id}"], setRepoSubscription: ["PUT /repos/{owner}/{repo}/subscription"], setThreadSubscription: ["PUT /notifications/threads/{thread_id}/subscription"], starRepoForAuthenticatedUser: ["PUT /user/starred/{owner}/{repo}"], unstarRepoForAuthenticatedUser: ["DELETE /user/starred/{owner}/{repo}"] }, apps: { addRepoToInstallation: ["PUT /user/installations/{installation_id}/repositories/{repository_id}"], checkToken: ["POST /applications/{client_id}/token"], createContentAttachment: ["POST /content_references/{content_reference_id}/attachments", { mediaType: { previews: ["corsair"] } }], createFromManifest: ["POST /app-manifests/{code}/conversions"], createInstallationAccessToken: ["POST /app/installations/{installation_id}/access_tokens"], deleteAuthorization: ["DELETE /applications/{client_id}/grant"], deleteInstallation: ["DELETE /app/installations/{installation_id}"], deleteToken: ["DELETE /applications/{client_id}/token"], getAuthenticated: ["GET /app"], getBySlug: ["GET /apps/{app_slug}"], getInstallation: ["GET /app/installations/{installation_id}"], getOrgInstallation: ["GET /orgs/{org}/installation"], getRepoInstallation: ["GET /repos/{owner}/{repo}/installation"], getSubscriptionPlanForAccount: ["GET /marketplace_listing/accounts/{account_id}"], getSubscriptionPlanForAccountStubbed: ["GET /marketplace_listing/stubbed/accounts/{account_id}"], getUserInstallation: ["GET /users/{username}/installation"], listAccountsForPlan: ["GET /marketplace_listing/plans/{plan_id}/accounts"], listAccountsForPlanStubbed: ["GET /marketplace_listing/stubbed/plans/{plan_id}/accounts"], listInstallationReposForAuthenticatedUser: ["GET /user/installations/{installation_id}/repositories"], listInstallations: ["GET /app/installations"], listInstallationsForAuthenticatedUser: ["GET /user/installations"], listPlans: ["GET /marketplace_listing/plans"], listPlansStubbed: ["GET /marketplace_listing/stubbed/plans"], listReposAccessibleToInstallation: ["GET /installation/repositories"], listSubscriptionsForAuthenticatedUser: ["GET /user/marketplace_purchases"], listSubscriptionsForAuthenticatedUserStubbed: ["GET /user/marketplace_purchases/stubbed"], removeRepoFromInstallation: ["DELETE /user/installations/{installation_id}/repositories/{repository_id}"], resetToken: ["PATCH /applications/{client_id}/token"], revokeInstallationAccessToken: ["DELETE /installation/token"], suspendInstallation: ["PUT /app/installations/{installation_id}/suspended"], unsuspendInstallation: ["DELETE /app/installations/{installation_id}/suspended"] }, billing: { getGithubActionsBillingOrg: ["GET /orgs/{org}/settings/billing/actions"], getGithubActionsBillingUser: ["GET /users/{username}/settings/billing/actions"], getGithubPackagesBillingOrg: ["GET /orgs/{org}/settings/billing/packages"], getGithubPackagesBillingUser: ["GET /users/{username}/settings/billing/packages"], getSharedStorageBillingOrg: ["GET /orgs/{org}/settings/billing/shared-storage"], getSharedStorageBillingUser: ["GET /users/{username}/settings/billing/shared-storage"] }, checks: { create: ["POST /repos/{owner}/{repo}/check-runs", { mediaType: { previews: ["antiope"] } }], createSuite: ["POST /repos/{owner}/{repo}/check-suites", { mediaType: { previews: ["antiope"] } }], get: ["GET /repos/{owner}/{repo}/check-runs/{check_run_id}", { mediaType: { previews: ["antiope"] } }], getSuite: ["GET /repos/{owner}/{repo}/check-suites/{check_suite_id}", { mediaType: { previews: ["antiope"] } }], listAnnotations: ["GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations", { mediaType: { previews: ["antiope"] } }], listForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/check-runs", { mediaType: { previews: ["antiope"] } }], listForSuite: ["GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs", { mediaType: { previews: ["antiope"] } }], listSuitesForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/check-suites", { mediaType: { previews: ["antiope"] } }], rerequestSuite: ["POST /repos/{owner}/{repo}/check-suites/{check_suite_id}/rerequest", { mediaType: { previews: ["antiope"] } }], setSuitesPreferences: ["PATCH /repos/{owner}/{repo}/check-suites/preferences", { mediaType: { previews: ["antiope"] } }], update: ["PATCH /repos/{owner}/{repo}/check-runs/{check_run_id}", { mediaType: { previews: ["antiope"] } }] }, codeScanning: { getAlert: ["GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}", {}, { renamedParameters: { alert_id: "alert_number" } }], listAlertsForRepo: ["GET /repos/{owner}/{repo}/code-scanning/alerts"], listRecentAnalyses: ["GET /repos/{owner}/{repo}/code-scanning/analyses"], updateAlert: ["PATCH /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}"], uploadSarif: ["POST /repos/{owner}/{repo}/code-scanning/sarifs"] }, codesOfConduct: { getAllCodesOfConduct: ["GET /codes_of_conduct", { mediaType: { previews: ["scarlet-witch"] } }], getConductCode: ["GET /codes_of_conduct/{key}", { mediaType: { previews: ["scarlet-witch"] } }], getForRepo: ["GET /repos/{owner}/{repo}/community/code_of_conduct", { mediaType: { previews: ["scarlet-witch"] } }] }, emojis: { get: ["GET /emojis"] }, gists: { checkIsStarred: ["GET /gists/{gist_id}/star"], create: ["POST /gists"], createComment: ["POST /gists/{gist_id}/comments"], delete: ["DELETE /gists/{gist_id}"], deleteComment: ["DELETE /gists/{gist_id}/comments/{comment_id}"], fork: ["POST /gists/{gist_id}/forks"], get: ["GET /gists/{gist_id}"], getComment: ["GET /gists/{gist_id}/comments/{comment_id}"], getRevision: ["GET /gists/{gist_id}/{sha}"], list: ["GET /gists"], listComments: ["GET /gists/{gist_id}/comments"], listCommits: ["GET /gists/{gist_id}/commits"], listForUser: ["GET /users/{username}/gists"], listForks: ["GET /gists/{gist_id}/forks"], listPublic: ["GET /gists/public"], listStarred: ["GET /gists/starred"], star: ["PUT /gists/{gist_id}/star"], unstar: ["DELETE /gists/{gist_id}/star"], update: ["PATCH /gists/{gist_id}"], updateComment: ["PATCH /gists/{gist_id}/comments/{comment_id}"] }, git: { createBlob: ["POST /repos/{owner}/{repo}/git/blobs"], createCommit: ["POST /repos/{owner}/{repo}/git/commits"], createRef: ["POST /repos/{owner}/{repo}/git/refs"], createTag: ["POST /repos/{owner}/{repo}/git/tags"], createTree: ["POST /repos/{owner}/{repo}/git/trees"], deleteRef: ["DELETE /repos/{owner}/{repo}/git/refs/{ref}"], getBlob: ["GET /repos/{owner}/{repo}/git/blobs/{file_sha}"], getCommit: ["GET /repos/{owner}/{repo}/git/commits/{commit_sha}"], getRef: ["GET /repos/{owner}/{repo}/git/ref/{ref}"], getTag: ["GET /repos/{owner}/{repo}/git/tags/{tag_sha}"], getTree: ["GET /repos/{owner}/{repo}/git/trees/{tree_sha}"], listMatchingRefs: ["GET /repos/{owner}/{repo}/git/matching-refs/{ref}"], updateRef: ["PATCH /repos/{owner}/{repo}/git/refs/{ref}"] }, gitignore: { getAllTemplates: ["GET /gitignore/templates"], getTemplate: ["GET /gitignore/templates/{name}"] }, interactions: { getRestrictionsForOrg: ["GET /orgs/{org}/interaction-limits", { mediaType: { previews: ["sombra"] } }], getRestrictionsForRepo: ["GET /repos/{owner}/{repo}/interaction-limits", { mediaType: { previews: ["sombra"] } }], removeRestrictionsForOrg: ["DELETE /orgs/{org}/interaction-limits", { mediaType: { previews: ["sombra"] } }], removeRestrictionsForRepo: ["DELETE /repos/{owner}/{repo}/interaction-limits", { mediaType: { previews: ["sombra"] } }], setRestrictionsForOrg: ["PUT /orgs/{org}/interaction-limits", { mediaType: { previews: ["sombra"] } }], setRestrictionsForRepo: ["PUT /repos/{owner}/{repo}/interaction-limits", { mediaType: { previews: ["sombra"] } }] }, issues: { addAssignees: ["POST /repos/{owner}/{repo}/issues/{issue_number}/assignees"], addLabels: ["POST /repos/{owner}/{repo}/issues/{issue_number}/labels"], checkUserCanBeAssigned: ["GET /repos/{owner}/{repo}/assignees/{assignee}"], create: ["POST /repos/{owner}/{repo}/issues"], createComment: ["POST /repos/{owner}/{repo}/issues/{issue_number}/comments"], createLabel: ["POST /repos/{owner}/{repo}/labels"], createMilestone: ["POST /repos/{owner}/{repo}/milestones"], deleteComment: ["DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}"], deleteLabel: ["DELETE /repos/{owner}/{repo}/labels/{name}"], deleteMilestone: ["DELETE /repos/{owner}/{repo}/milestones/{milestone_number}"], get: ["GET /repos/{owner}/{repo}/issues/{issue_number}"], getComment: ["GET /repos/{owner}/{repo}/issues/comments/{comment_id}"], getEvent: ["GET /repos/{owner}/{repo}/issues/events/{event_id}"], getLabel: ["GET /repos/{owner}/{repo}/labels/{name}"], getMilestone: ["GET /repos/{owner}/{repo}/milestones/{milestone_number}"], list: ["GET /issues"], listAssignees: ["GET /repos/{owner}/{repo}/assignees"], listComments: ["GET /repos/{owner}/{repo}/issues/{issue_number}/comments"], listCommentsForRepo: ["GET /repos/{owner}/{repo}/issues/comments"], listEvents: ["GET /repos/{owner}/{repo}/issues/{issue_number}/events"], listEventsForRepo: ["GET /repos/{owner}/{repo}/issues/events"], listEventsForTimeline: ["GET /repos/{owner}/{repo}/issues/{issue_number}/timeline", { mediaType: { previews: ["mockingbird"] } }], listForAuthenticatedUser: ["GET /user/issues"], listForOrg: ["GET /orgs/{org}/issues"], listForRepo: ["GET /repos/{owner}/{repo}/issues"], listLabelsForMilestone: ["GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels"], listLabelsForRepo: ["GET /repos/{owner}/{repo}/labels"], listLabelsOnIssue: ["GET /repos/{owner}/{repo}/issues/{issue_number}/labels"], listMilestones: ["GET /repos/{owner}/{repo}/milestones"], lock: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/lock"], removeAllLabels: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels"], removeAssignees: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/assignees"], removeLabel: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{name}"], setLabels: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/labels"], unlock: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/lock"], update: ["PATCH /repos/{owner}/{repo}/issues/{issue_number}"], updateComment: ["PATCH /repos/{owner}/{repo}/issues/comments/{comment_id}"], updateLabel: ["PATCH /repos/{owner}/{repo}/labels/{name}"], updateMilestone: ["PATCH /repos/{owner}/{repo}/milestones/{milestone_number}"] }, licenses: { get: ["GET /licenses/{license}"], getAllCommonlyUsed: ["GET /licenses"], getForRepo: ["GET /repos/{owner}/{repo}/license"] }, markdown: { render: ["POST /markdown"], renderRaw: ["POST /markdown/raw", { headers: { "content-type": "text/plain; charset=utf-8" } }] }, meta: { get: ["GET /meta"] }, migrations: { cancelImport: ["DELETE /repos/{owner}/{repo}/import"], deleteArchiveForAuthenticatedUser: ["DELETE /user/migrations/{migration_id}/archive", { mediaType: { previews: ["wyandotte"] } }], deleteArchiveForOrg: ["DELETE /orgs/{org}/migrations/{migration_id}/archive", { mediaType: { previews: ["wyandotte"] } }], downloadArchiveForOrg: ["GET /orgs/{org}/migrations/{migration_id}/archive", { mediaType: { previews: ["wyandotte"] } }], getArchiveForAuthenticatedUser: ["GET /user/migrations/{migration_id}/archive", { mediaType: { previews: ["wyandotte"] } }], getCommitAuthors: ["GET /repos/{owner}/{repo}/import/authors"], getImportStatus: ["GET /repos/{owner}/{repo}/import"], getLargeFiles: ["GET /repos/{owner}/{repo}/import/large_files"], getStatusForAuthenticatedUser: ["GET /user/migrations/{migration_id}", { mediaType: { previews: ["wyandotte"] } }], getStatusForOrg: ["GET /orgs/{org}/migrations/{migration_id}", { mediaType: { previews: ["wyandotte"] } }], listForAuthenticatedUser: ["GET /user/migrations", { mediaType: { previews: ["wyandotte"] } }], listForOrg: ["GET /orgs/{org}/migrations", { mediaType: { previews: ["wyandotte"] } }], listReposForOrg: ["GET /orgs/{org}/migrations/{migration_id}/repositories", { mediaType: { previews: ["wyandotte"] } }], listReposForUser: ["GET /user/migrations/{migration_id}/repositories", { mediaType: { previews: ["wyandotte"] } }], mapCommitAuthor: ["PATCH /repos/{owner}/{repo}/import/authors/{author_id}"], setLfsPreference: ["PATCH /repos/{owner}/{repo}/import/lfs"], startForAuthenticatedUser: ["POST /user/migrations"], startForOrg: ["POST /orgs/{org}/migrations"], startImport: ["PUT /repos/{owner}/{repo}/import"], unlockRepoForAuthenticatedUser: ["DELETE /user/migrations/{migration_id}/repos/{repo_name}/lock", { mediaType: { previews: ["wyandotte"] } }], unlockRepoForOrg: ["DELETE /orgs/{org}/migrations/{migration_id}/repos/{repo_name}/lock", { mediaType: { previews: ["wyandotte"] } }], updateImport: ["PATCH /repos/{owner}/{repo}/import"] }, orgs: { blockUser: ["PUT /orgs/{org}/blocks/{username}"], checkBlockedUser: ["GET /orgs/{org}/blocks/{username}"], checkMembershipForUser: ["GET /orgs/{org}/members/{username}"], checkPublicMembershipForUser: ["GET /orgs/{org}/public_members/{username}"], convertMemberToOutsideCollaborator: ["PUT /orgs/{org}/outside_collaborators/{username}"], createInvitation: ["POST /orgs/{org}/invitations"], createWebhook: ["POST /orgs/{org}/hooks"], deleteWebhook: ["DELETE /orgs/{org}/hooks/{hook_id}"], get: ["GET /orgs/{org}"], getMembershipForAuthenticatedUser: ["GET /user/memberships/orgs/{org}"], getMembershipForUser: ["GET /orgs/{org}/memberships/{username}"], getWebhook: ["GET /orgs/{org}/hooks/{hook_id}"], list: ["GET /organizations"], listAppInstallations: ["GET /orgs/{org}/installations"], listBlockedUsers: ["GET /orgs/{org}/blocks"], listForAuthenticatedUser: ["GET /user/orgs"], listForUser: ["GET /users/{username}/orgs"], listInvitationTeams: ["GET /orgs/{org}/invitations/{invitation_id}/teams"], listMembers: ["GET /orgs/{org}/members"], listMembershipsForAuthenticatedUser: ["GET /user/memberships/orgs"], listOutsideCollaborators: ["GET /orgs/{org}/outside_collaborators"], listPendingInvitations: ["GET /orgs/{org}/invitations"], listPublicMembers: ["GET /orgs/{org}/public_members"], listWebhooks: ["GET /orgs/{org}/hooks"], pingWebhook: ["POST /orgs/{org}/hooks/{hook_id}/pings"], removeMember: ["DELETE /orgs/{org}/members/{username}"], removeMembershipForUser: ["DELETE /orgs/{org}/memberships/{username}"], removeOutsideCollaborator: ["DELETE /orgs/{org}/outside_collaborators/{username}"], removePublicMembershipForAuthenticatedUser: ["DELETE /orgs/{org}/public_members/{username}"], setMembershipForUser: ["PUT /orgs/{org}/memberships/{username}"], setPublicMembershipForAuthenticatedUser: ["PUT /orgs/{org}/public_members/{username}"], unblockUser: ["DELETE /orgs/{org}/blocks/{username}"], update: ["PATCH /orgs/{org}"], updateMembershipForAuthenticatedUser: ["PATCH /user/memberships/orgs/{org}"], updateWebhook: ["PATCH /orgs/{org}/hooks/{hook_id}"] }, projects: { addCollaborator: ["PUT /projects/{project_id}/collaborators/{username}", { mediaType: { previews: ["inertia"] } }], createCard: ["POST /projects/columns/{column_id}/cards", { mediaType: { previews: ["inertia"] } }], createColumn: ["POST /projects/{project_id}/columns", { mediaType: { previews: ["inertia"] } }], createForAuthenticatedUser: ["POST /user/projects", { mediaType: { previews: ["inertia"] } }], createForOrg: ["POST /orgs/{org}/projects", { mediaType: { previews: ["inertia"] } }], createForRepo: ["POST /repos/{owner}/{repo}/projects", { mediaType: { previews: ["inertia"] } }], delete: ["DELETE /projects/{project_id}", { mediaType: { previews: ["inertia"] } }], deleteCard: ["DELETE /projects/columns/cards/{card_id}", { mediaType: { previews: ["inertia"] } }], deleteColumn: ["DELETE /projects/columns/{column_id}", { mediaType: { previews: ["inertia"] } }], get: ["GET /projects/{project_id}", { mediaType: { previews: ["inertia"] } }], getCard: ["GET /projects/columns/cards/{card_id}", { mediaType: { previews: ["inertia"] } }], getColumn: ["GET /projects/columns/{column_id}", { mediaType: { previews: ["inertia"] } }], getPermissionForUser: ["GET /projects/{project_id}/collaborators/{username}/permission", { mediaType: { previews: ["inertia"] } }], listCards: ["GET /projects/columns/{column_id}/cards", { mediaType: { previews: ["inertia"] } }], listCollaborators: ["GET /projects/{project_id}/collaborators", { mediaType: { previews: ["inertia"] } }], listColumns: ["GET /projects/{project_id}/columns", { mediaType: { previews: ["inertia"] } }], listForOrg: ["GET /orgs/{org}/projects", { mediaType: { previews: ["inertia"] } }], listForRepo: ["GET /repos/{owner}/{repo}/projects", { mediaType: { previews: ["inertia"] } }], listForUser: ["GET /users/{username}/projects", { mediaType: { previews: ["inertia"] } }], moveCard: ["POST /projects/columns/cards/{card_id}/moves", { mediaType: { previews: ["inertia"] } }], moveColumn: ["POST /projects/columns/{column_id}/moves", { mediaType: { previews: ["inertia"] } }], removeCollaborator: ["DELETE /projects/{project_id}/collaborators/{username}", { mediaType: { previews: ["inertia"] } }], update: ["PATCH /projects/{project_id}", { mediaType: { previews: ["inertia"] } }], updateCard: ["PATCH /projects/columns/cards/{card_id}", { mediaType: { previews: ["inertia"] } }], updateColumn: ["PATCH /projects/columns/{column_id}", { mediaType: { previews: ["inertia"] } }] }, pulls: { checkIfMerged: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/merge"], create: ["POST /repos/{owner}/{repo}/pulls"], createReplyForReviewComment: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/comments/{comment_id}/replies"], createReview: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews"], createReviewComment: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/comments"], deletePendingReview: ["DELETE /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"], deleteReviewComment: ["DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}"], dismissReview: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/dismissals"], get: ["GET /repos/{owner}/{repo}/pulls/{pull_number}"], getReview: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"], getReviewComment: ["GET /repos/{owner}/{repo}/pulls/comments/{comment_id}"], list: ["GET /repos/{owner}/{repo}/pulls"], listCommentsForReview: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments"], listCommits: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/commits"], listFiles: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/files"], listRequestedReviewers: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"], listReviewComments: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/comments"], listReviewCommentsForRepo: ["GET /repos/{owner}/{repo}/pulls/comments"], listReviews: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews"], merge: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/merge"], removeRequestedReviewers: ["DELETE /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"], requestReviewers: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"], submitReview: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/events"], update: ["PATCH /repos/{owner}/{repo}/pulls/{pull_number}"], updateBranch: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/update-branch", { mediaType: { previews: ["lydian"] } }], updateReview: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"], updateReviewComment: ["PATCH /repos/{owner}/{repo}/pulls/comments/{comment_id}"] }, rateLimit: { get: ["GET /rate_limit"] }, reactions: { createForCommitComment: ["POST /repos/{owner}/{repo}/comments/{comment_id}/reactions", { mediaType: { previews: ["squirrel-girl"] } }], createForIssue: ["POST /repos/{owner}/{repo}/issues/{issue_number}/reactions", { mediaType: { previews: ["squirrel-girl"] } }], createForIssueComment: ["POST /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions", { mediaType: { previews: ["squirrel-girl"] } }], createForPullRequestReviewComment: ["POST /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions", { mediaType: { previews: ["squirrel-girl"] } }], createForTeamDiscussionCommentInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions", { mediaType: { previews: ["squirrel-girl"] } }], createForTeamDiscussionInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions", { mediaType: { previews: ["squirrel-girl"] } }], deleteForCommitComment: ["DELETE /repos/{owner}/{repo}/comments/{comment_id}/reactions/{reaction_id}", { mediaType: { previews: ["squirrel-girl"] } }], deleteForIssue: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/reactions/{reaction_id}", { mediaType: { previews: ["squirrel-girl"] } }], deleteForIssueComment: ["DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions/{reaction_id}", { mediaType: { previews: ["squirrel-girl"] } }], deleteForPullRequestComment: ["DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions/{reaction_id}", { mediaType: { previews: ["squirrel-girl"] } }], deleteForTeamDiscussion: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions/{reaction_id}", { mediaType: { previews: ["squirrel-girl"] } }], deleteForTeamDiscussionComment: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions/{reaction_id}", { mediaType: { previews: ["squirrel-girl"] } }], deleteLegacy: ["DELETE /reactions/{reaction_id}", { mediaType: { previews: ["squirrel-girl"] } }, { deprecated: "octokit.reactions.deleteLegacy() is deprecated, see https://developer.github.com/v3/reactions/#delete-a-reaction-legacy" }], listForCommitComment: ["GET /repos/{owner}/{repo}/comments/{comment_id}/reactions", { mediaType: { previews: ["squirrel-girl"] } }], listForIssue: ["GET /repos/{owner}/{repo}/issues/{issue_number}/reactions", { mediaType: { previews: ["squirrel-girl"] } }], listForIssueComment: ["GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions", { mediaType: { previews: ["squirrel-girl"] } }], listForPullRequestReviewComment: ["GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions", { mediaType: { previews: ["squirrel-girl"] } }], listForTeamDiscussionCommentInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions", { mediaType: { previews: ["squirrel-girl"] } }], listForTeamDiscussionInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions", { mediaType: { previews: ["squirrel-girl"] } }] }, repos: { acceptInvitation: ["PATCH /user/repository_invitations/{invitation_id}"], addAppAccessRestrictions: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps", {}, { mapToData: "apps" }], addCollaborator: ["PUT /repos/{owner}/{repo}/collaborators/{username}"], addStatusCheckContexts: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts", {}, { mapToData: "contexts" }], addTeamAccessRestrictions: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams", {}, { mapToData: "teams" }], addUserAccessRestrictions: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users", {}, { mapToData: "users" }], checkCollaborator: ["GET /repos/{owner}/{repo}/collaborators/{username}"], checkVulnerabilityAlerts: ["GET /repos/{owner}/{repo}/vulnerability-alerts", { mediaType: { previews: ["dorian"] } }], compareCommits: ["GET /repos/{owner}/{repo}/compare/{base}...{head}"], createCommitComment: ["POST /repos/{owner}/{repo}/commits/{commit_sha}/comments"], createCommitSignatureProtection: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures", { mediaType: { previews: ["zzzax"] } }], createCommitStatus: ["POST /repos/{owner}/{repo}/statuses/{sha}"], createDeployKey: ["POST /repos/{owner}/{repo}/keys"], createDeployment: ["POST /repos/{owner}/{repo}/deployments"], createDeploymentStatus: ["POST /repos/{owner}/{repo}/deployments/{deployment_id}/statuses"], createDispatchEvent: ["POST /repos/{owner}/{repo}/dispatches"], createForAuthenticatedUser: ["POST /user/repos"], createFork: ["POST /repos/{owner}/{repo}/forks"], createInOrg: ["POST /orgs/{org}/repos"], createOrUpdateFileContents: ["PUT /repos/{owner}/{repo}/contents/{path}"], createPagesSite: ["POST /repos/{owner}/{repo}/pages", { mediaType: { previews: ["switcheroo"] } }], createRelease: ["POST /repos/{owner}/{repo}/releases"], createUsingTemplate: ["POST /repos/{template_owner}/{template_repo}/generate", { mediaType: { previews: ["baptiste"] } }], createWebhook: ["POST /repos/{owner}/{repo}/hooks"], declineInvitation: ["DELETE /user/repository_invitations/{invitation_id}"], delete: ["DELETE /repos/{owner}/{repo}"], deleteAccessRestrictions: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions"], deleteAdminBranchProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"], deleteBranchProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection"], deleteCommitComment: ["DELETE /repos/{owner}/{repo}/comments/{comment_id}"], deleteCommitSignatureProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures", { mediaType: { previews: ["zzzax"] } }], deleteDeployKey: ["DELETE /repos/{owner}/{repo}/keys/{key_id}"], deleteDeployment: ["DELETE /repos/{owner}/{repo}/deployments/{deployment_id}"], deleteFile: ["DELETE /repos/{owner}/{repo}/contents/{path}"], deleteInvitation: ["DELETE /repos/{owner}/{repo}/invitations/{invitation_id}"], deletePagesSite: ["DELETE /repos/{owner}/{repo}/pages", { mediaType: { previews: ["switcheroo"] } }], deletePullRequestReviewProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"], deleteRelease: ["DELETE /repos/{owner}/{repo}/releases/{release_id}"], deleteReleaseAsset: ["DELETE /repos/{owner}/{repo}/releases/assets/{asset_id}"], deleteWebhook: ["DELETE /repos/{owner}/{repo}/hooks/{hook_id}"], disableAutomatedSecurityFixes: ["DELETE /repos/{owner}/{repo}/automated-security-fixes", { mediaType: { previews: ["london"] } }], disableVulnerabilityAlerts: ["DELETE /repos/{owner}/{repo}/vulnerability-alerts", { mediaType: { previews: ["dorian"] } }], downloadArchive: ["GET /repos/{owner}/{repo}/{archive_format}/{ref}"], enableAutomatedSecurityFixes: ["PUT /repos/{owner}/{repo}/automated-security-fixes", { mediaType: { previews: ["london"] } }], enableVulnerabilityAlerts: ["PUT /repos/{owner}/{repo}/vulnerability-alerts", { mediaType: { previews: ["dorian"] } }], get: ["GET /repos/{owner}/{repo}"], getAccessRestrictions: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions"], getAdminBranchProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"], getAllStatusCheckContexts: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts"], getAllTopics: ["GET /repos/{owner}/{repo}/topics", { mediaType: { previews: ["mercy"] } }], getAppsWithAccessToProtectedBranch: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps"], getBranch: ["GET /repos/{owner}/{repo}/branches/{branch}"], getBranchProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection"], getClones: ["GET /repos/{owner}/{repo}/traffic/clones"], getCodeFrequencyStats: ["GET /repos/{owner}/{repo}/stats/code_frequency"], getCollaboratorPermissionLevel: ["GET /repos/{owner}/{repo}/collaborators/{username}/permission"], getCombinedStatusForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/status"], getCommit: ["GET /repos/{owner}/{repo}/commits/{ref}"], getCommitActivityStats: ["GET /repos/{owner}/{repo}/stats/commit_activity"], getCommitComment: ["GET /repos/{owner}/{repo}/comments/{comment_id}"], getCommitSignatureProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures", { mediaType: { previews: ["zzzax"] } }], getCommunityProfileMetrics: ["GET /repos/{owner}/{repo}/community/profile", { mediaType: { previews: ["black-panther"] } }], getContent: ["GET /repos/{owner}/{repo}/contents/{path}"], getContributorsStats: ["GET /repos/{owner}/{repo}/stats/contributors"], getDeployKey: ["GET /repos/{owner}/{repo}/keys/{key_id}"], getDeployment: ["GET /repos/{owner}/{repo}/deployments/{deployment_id}"], getDeploymentStatus: ["GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses/{status_id}"], getLatestPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/latest"], getLatestRelease: ["GET /repos/{owner}/{repo}/releases/latest"], getPages: ["GET /repos/{owner}/{repo}/pages"], getPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/{build_id}"], getParticipationStats: ["GET /repos/{owner}/{repo}/stats/participation"], getPullRequestReviewProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"], getPunchCardStats: ["GET /repos/{owner}/{repo}/stats/punch_card"], getReadme: ["GET /repos/{owner}/{repo}/readme"], getRelease: ["GET /repos/{owner}/{repo}/releases/{release_id}"], getReleaseAsset: ["GET /repos/{owner}/{repo}/releases/assets/{asset_id}"], getReleaseByTag: ["GET /repos/{owner}/{repo}/releases/tags/{tag}"], getStatusChecksProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"], getTeamsWithAccessToProtectedBranch: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams"], getTopPaths: ["GET /repos/{owner}/{repo}/traffic/popular/paths"], getTopReferrers: ["GET /repos/{owner}/{repo}/traffic/popular/referrers"], getUsersWithAccessToProtectedBranch: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users"], getViews: ["GET /repos/{owner}/{repo}/traffic/views"], getWebhook: ["GET /repos/{owner}/{repo}/hooks/{hook_id}"], listBranches: ["GET /repos/{owner}/{repo}/branches"], listBranchesForHeadCommit: ["GET /repos/{owner}/{repo}/commits/{commit_sha}/branches-where-head", { mediaType: { previews: ["groot"] } }], listCollaborators: ["GET /repos/{owner}/{repo}/collaborators"], listCommentsForCommit: ["GET /repos/{owner}/{repo}/commits/{commit_sha}/comments"], listCommitCommentsForRepo: ["GET /repos/{owner}/{repo}/comments"], listCommitStatusesForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/statuses"], listCommits: ["GET /repos/{owner}/{repo}/commits"], listContributors: ["GET /repos/{owner}/{repo}/contributors"], listDeployKeys: ["GET /repos/{owner}/{repo}/keys"], listDeploymentStatuses: ["GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses"], listDeployments: ["GET /repos/{owner}/{repo}/deployments"], listForAuthenticatedUser: ["GET /user/repos"], listForOrg: ["GET /orgs/{org}/repos"], listForUser: ["GET /users/{username}/repos"], listForks: ["GET /repos/{owner}/{repo}/forks"], listInvitations: ["GET /repos/{owner}/{repo}/invitations"], listInvitationsForAuthenticatedUser: ["GET /user/repository_invitations"], listLanguages: ["GET /repos/{owner}/{repo}/languages"], listPagesBuilds: ["GET /repos/{owner}/{repo}/pages/builds"], listPublic: ["GET /repositories"], listPullRequestsAssociatedWithCommit: ["GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls", { mediaType: { previews: ["groot"] } }], listReleaseAssets: ["GET /repos/{owner}/{repo}/releases/{release_id}/assets"], listReleases: ["GET /repos/{owner}/{repo}/releases"], listTags: ["GET /repos/{owner}/{repo}/tags"], listTeams: ["GET /repos/{owner}/{repo}/teams"], listWebhooks: ["GET /repos/{owner}/{repo}/hooks"], merge: ["POST /repos/{owner}/{repo}/merges"], pingWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/pings"], removeAppAccessRestrictions: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps", {}, { mapToData: "apps" }], removeCollaborator: ["DELETE /repos/{owner}/{repo}/collaborators/{username}"], removeStatusCheckContexts: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts", {}, { mapToData: "contexts" }], removeStatusCheckProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"], removeTeamAccessRestrictions: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams", {}, { mapToData: "teams" }], removeUserAccessRestrictions: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users", {}, { mapToData: "users" }], replaceAllTopics: ["PUT /repos/{owner}/{repo}/topics", { mediaType: { previews: ["mercy"] } }], requestPagesBuild: ["POST /repos/{owner}/{repo}/pages/builds"], setAdminBranchProtection: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"], setAppAccessRestrictions: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps", {}, { mapToData: "apps" }], setStatusCheckContexts: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts", {}, { mapToData: "contexts" }], setTeamAccessRestrictions: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams", {}, { mapToData: "teams" }], setUserAccessRestrictions: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users", {}, { mapToData: "users" }], testPushWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/tests"], transfer: ["POST /repos/{owner}/{repo}/transfer"], update: ["PATCH /repos/{owner}/{repo}"], updateBranchProtection: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection"], updateCommitComment: ["PATCH /repos/{owner}/{repo}/comments/{comment_id}"], updateInformationAboutPagesSite: ["PUT /repos/{owner}/{repo}/pages"], updateInvitation: ["PATCH /repos/{owner}/{repo}/invitations/{invitation_id}"], updatePullRequestReviewProtection: ["PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"], updateRelease: ["PATCH /repos/{owner}/{repo}/releases/{release_id}"], updateReleaseAsset: ["PATCH /repos/{owner}/{repo}/releases/assets/{asset_id}"], updateStatusCheckPotection: ["PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"], updateWebhook: ["PATCH /repos/{owner}/{repo}/hooks/{hook_id}"], uploadReleaseAsset: ["POST /repos/{owner}/{repo}/releases/{release_id}/assets{?name,label}", { baseUrl: "https://uploads.github.com" }] }, search: { code: ["GET /search/code"], commits: ["GET /search/commits", { mediaType: { previews: ["cloak"] } }], issuesAndPullRequests: ["GET /search/issues"], labels: ["GET /search/labels"], repos: ["GET /search/repositories"], topics: ["GET /search/topics", { mediaType: { previews: ["mercy"] } }], users: ["GET /search/users"] }, teams: { addOrUpdateMembershipForUserInOrg: ["PUT /orgs/{org}/teams/{team_slug}/memberships/{username}"], addOrUpdateProjectPermissionsInOrg: ["PUT /orgs/{org}/teams/{team_slug}/projects/{project_id}", { mediaType: { previews: ["inertia"] } }], addOrUpdateRepoPermissionsInOrg: ["PUT /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"], checkPermissionsForProjectInOrg: ["GET /orgs/{org}/teams/{team_slug}/projects/{project_id}", { mediaType: { previews: ["inertia"] } }], checkPermissionsForRepoInOrg: ["GET /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"], create: ["POST /orgs/{org}/teams"], createDiscussionCommentInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments"], createDiscussionInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions"], deleteDiscussionCommentInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"], deleteDiscussionInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"], deleteInOrg: ["DELETE /orgs/{org}/teams/{team_slug}"], getByName: ["GET /orgs/{org}/teams/{team_slug}"], getDiscussionCommentInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"], getDiscussionInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"], getMembershipForUserInOrg: ["GET /orgs/{org}/teams/{team_slug}/memberships/{username}"], list: ["GET /orgs/{org}/teams"], listChildInOrg: ["GET /orgs/{org}/teams/{team_slug}/teams"], listDiscussionCommentsInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments"], listDiscussionsInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions"], listForAuthenticatedUser: ["GET /user/teams"], listMembersInOrg: ["GET /orgs/{org}/teams/{team_slug}/members"], listPendingInvitationsInOrg: ["GET /orgs/{org}/teams/{team_slug}/invitations"], listProjectsInOrg: ["GET /orgs/{org}/teams/{team_slug}/projects", { mediaType: { previews: ["inertia"] } }], listReposInOrg: ["GET /orgs/{org}/teams/{team_slug}/repos"], removeMembershipForUserInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/memberships/{username}"], removeProjectInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/projects/{project_id}"], removeRepoInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"], updateDiscussionCommentInOrg: ["PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"], updateDiscussionInOrg: ["PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"], updateInOrg: ["PATCH /orgs/{org}/teams/{team_slug}"] }, users: { addEmailForAuthenticated: ["POST /user/emails"], block: ["PUT /user/blocks/{username}"], checkBlocked: ["GET /user/blocks/{username}"], checkFollowingForUser: ["GET /users/{username}/following/{target_user}"], checkPersonIsFollowedByAuthenticated: ["GET /user/following/{username}"], createGpgKeyForAuthenticated: ["POST /user/gpg_keys"], createPublicSshKeyForAuthenticated: ["POST /user/keys"], deleteEmailForAuthenticated: ["DELETE /user/emails"], deleteGpgKeyForAuthenticated: ["DELETE /user/gpg_keys/{gpg_key_id}"], deletePublicSshKeyForAuthenticated: ["DELETE /user/keys/{key_id}"], follow: ["PUT /user/following/{username}"], getAuthenticated: ["GET /user"], getByUsername: ["GET /users/{username}"], getContextForUser: ["GET /users/{username}/hovercard"], getGpgKeyForAuthenticated: ["GET /user/gpg_keys/{gpg_key_id}"], getPublicSshKeyForAuthenticated: ["GET /user/keys/{key_id}"], list: ["GET /users"], listBlockedByAuthenticated: ["GET /user/blocks"], listEmailsForAuthenticated: ["GET /user/emails"], listFollowedByAuthenticated: ["GET /user/following"], listFollowersForAuthenticatedUser: ["GET /user/followers"], listFollowersForUser: ["GET /users/{username}/followers"], listFollowingForUser: ["GET /users/{username}/following"], listGpgKeysForAuthenticated: ["GET /user/gpg_keys"], listGpgKeysForUser: ["GET /users/{username}/gpg_keys"], listPublicEmailsForAuthenticated: ["GET /user/public_emails"], listPublicKeysForUser: ["GET /users/{username}/keys"], listPublicSshKeysForAuthenticated: ["GET /user/keys"], setPrimaryEmailVisibilityForAuthenticated: ["PATCH /user/email/visibility"], unblock: ["DELETE /user/blocks/{username}"], unfollow: ["DELETE /user/following/{username}"], updateAuthenticated: ["PATCH /user"] } }; const VERSION = "4.2.0"; function endpointsToMethods(octokit, endpointsMap) { const newMethods = {}; for (const [scope, endpoints] of Object.entries(endpointsMap)) { for (const [methodName, endpoint] of Object.entries(endpoints)) { const [route, defaults, decorations] = endpoint; const [method, url] = route.split(/ /); const endpointDefaults = Object.assign({ method, url }, defaults); if (!newMethods[scope]) { newMethods[scope] = {}; } const scopeMethods = newMethods[scope]; if (decorations) { scopeMethods[methodName] = decorate(octokit, scope, methodName, endpointDefaults, decorations); continue; } scopeMethods[methodName] = octokit.request.defaults(endpointDefaults); } } return newMethods; } function decorate(octokit, scope, methodName, defaults, decorations) { const requestWithDefaults = octokit.request.defaults(defaults); /* istanbul ignore next */ function withDecorations(...args) { // @ts-ignore https://github.com/microsoft/TypeScript/issues/25488 let options = requestWithDefaults.endpoint.merge(...args); // There are currently no other decorations than `.mapToData` if (decorations.mapToData) { options = Object.assign({}, options, { data: options[decorations.mapToData], [decorations.mapToData]: undefined }); return requestWithDefaults(options); } if (decorations.renamed) { const [newScope, newMethodName] = decorations.renamed; octokit.log.warn(`octokit.${scope}.${methodName}() has been renamed to octokit.${newScope}.${newMethodName}()`); } if (decorations.deprecated) { octokit.log.warn(decorations.deprecated); } if (decorations.renamedParameters) { // @ts-ignore https://github.com/microsoft/TypeScript/issues/25488 const options = requestWithDefaults.endpoint.merge(...args); for (const [name, alias] of Object.entries(decorations.renamedParameters)) { if (name in options) { octokit.log.warn(`"${name}" parameter is deprecated for "octokit.${scope}.${methodName}()". Use "${alias}" instead`); if (!(alias in options)) { options[alias] = options[name]; } delete options[name]; } } return requestWithDefaults(options); } // @ts-ignore https://github.com/microsoft/TypeScript/issues/25488 return requestWithDefaults(...args); } return Object.assign(withDecorations, requestWithDefaults); } /** * This plugin is a 1:1 copy of internal @octokit/rest plugins. The primary * goal is to rebuild @octokit/rest on top of @octokit/core. Once that is * done, we will remove the registerEndpoints methods and return the methods * directly as with the other plugins. At that point we will also remove the * legacy workarounds and deprecations. * * See the plan at * https://github.com/octokit/plugin-rest-endpoint-methods.js/pull/1 */ function restEndpointMethods(octokit) { return endpointsToMethods(octokit, Endpoints); } restEndpointMethods.VERSION = VERSION; exports.restEndpointMethods = restEndpointMethods; //# sourceMappingURL=index.js.map /***/ }), /***/ 48364: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } var deprecation = __webpack_require__(86649); var once = _interopDefault(__webpack_require__(86343)); const logOnce = once(deprecation => console.warn(deprecation)); /** * Error with extra properties to help with debugging */ class RequestError extends Error { constructor(message, statusCode, options) { super(message); // Maintains proper stack trace (only available on V8) /* istanbul ignore next */ if (Error.captureStackTrace) { Error.captureStackTrace(this, this.constructor); } this.name = "HttpError"; this.status = statusCode; Object.defineProperty(this, "code", { get() { logOnce(new deprecation.Deprecation("[@octokit/request-error] `error.code` is deprecated, use `error.status`.")); return statusCode; } }); this.headers = options.headers || {}; // redact request credentials without mutating original request options const requestCopy = Object.assign({}, options.request); if (options.request.headers.authorization) { requestCopy.headers = Object.assign({}, options.request.headers, { authorization: options.request.headers.authorization.replace(/ .*$/, " [REDACTED]") }); } requestCopy.url = requestCopy.url // client_id & client_secret can be passed as URL query parameters to increase rate limit // see https://developer.github.com/v3/#increasing-the-unauthenticated-rate-limit-for-oauth-applications .replace(/\bclient_secret=\w+/g, "client_secret=[REDACTED]") // OAuth tokens can be passed as URL query parameters, although it is not recommended // see https://developer.github.com/v3/#oauth2-token-sent-in-a-header .replace(/\baccess_token=\w+/g, "access_token=[REDACTED]"); this.request = requestCopy; } } exports.RequestError = RequestError; //# sourceMappingURL=index.js.map /***/ }), /***/ 48826: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } var endpoint = __webpack_require__(70412); var universalUserAgent = __webpack_require__(1857); var isPlainObject = __webpack_require__(80641); var nodeFetch = _interopDefault(__webpack_require__(22434)); var requestError = __webpack_require__(48364); const VERSION = "5.4.9"; function getBufferResponse(response) { return response.arrayBuffer(); } function fetchWrapper(requestOptions) { if (isPlainObject.isPlainObject(requestOptions.body) || Array.isArray(requestOptions.body)) { requestOptions.body = JSON.stringify(requestOptions.body); } let headers = {}; let status; let url; const fetch = requestOptions.request && requestOptions.request.fetch || nodeFetch; return fetch(requestOptions.url, Object.assign({ method: requestOptions.method, body: requestOptions.body, headers: requestOptions.headers, redirect: requestOptions.redirect }, requestOptions.request)).then(response => { url = response.url; status = response.status; for (const keyAndValue of response.headers) { headers[keyAndValue[0]] = keyAndValue[1]; } if (status === 204 || status === 205) { return; } // GitHub API returns 200 for HEAD requests if (requestOptions.method === "HEAD") { if (status < 400) { return; } throw new requestError.RequestError(response.statusText, status, { headers, request: requestOptions }); } if (status === 304) { throw new requestError.RequestError("Not modified", status, { headers, request: requestOptions }); } if (status >= 400) { return response.text().then(message => { const error = new requestError.RequestError(message, status, { headers, request: requestOptions }); try { let responseBody = JSON.parse(error.message); Object.assign(error, responseBody); let errors = responseBody.errors; // Assumption `errors` would always be in Array format error.message = error.message + ": " + errors.map(JSON.stringify).join(", "); } catch (e) {// ignore, see octokit/rest.js#684 } throw error; }); } const contentType = response.headers.get("content-type"); if (/application\/json/.test(contentType)) { return response.json(); } if (!contentType || /^text\/|charset=utf-8$/.test(contentType)) { return response.text(); } return getBufferResponse(response); }).then(data => { return { status, url, headers, data }; }).catch(error => { if (error instanceof requestError.RequestError) { throw error; } throw new requestError.RequestError(error.message, 500, { headers, request: requestOptions }); }); } function withDefaults(oldEndpoint, newDefaults) { const endpoint = oldEndpoint.defaults(newDefaults); const newApi = function (route, parameters) { const endpointOptions = endpoint.merge(route, parameters); if (!endpointOptions.request || !endpointOptions.request.hook) { return fetchWrapper(endpoint.parse(endpointOptions)); } const request = (route, parameters) => { return fetchWrapper(endpoint.parse(endpoint.merge(route, parameters))); }; Object.assign(request, { endpoint, defaults: withDefaults.bind(null, endpoint) }); return endpointOptions.request.hook(request, endpointOptions); }; return Object.assign(newApi, { endpoint, defaults: withDefaults.bind(null, endpoint) }); } const request = withDefaults(endpoint.endpoint, { headers: { "user-agent": `octokit-request.js/${VERSION} ${universalUserAgent.getUserAgent()}` } }); exports.request = request; //# sourceMappingURL=index.js.map /***/ }), /***/ 67208: /***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; const events_1 = __webpack_require__(28614); const promisify_1 = __importDefault(__webpack_require__(2929)); function isAgentBase(v) { return Boolean(v) && typeof v.addRequest === 'function'; } function isHttpAgent(v) { return Boolean(v) && typeof v.addRequest === 'function'; } function isSecureEndpoint() { const { stack } = new Error(); if (typeof stack !== 'string') return false; return stack.split('\n').some(l => l.indexOf('(https.js:') !== -1); } function createAgent(callback, opts) { return new createAgent.Agent(callback, opts); } (function (createAgent) { /** * Base `http.Agent` implementation. * No pooling/keep-alive is implemented by default. * * @param {Function} callback * @api public */ class Agent extends events_1.EventEmitter { constructor(callback, _opts) { super(); // The callback gets promisified lazily this.promisifiedCallback = undefined; let opts = _opts; if (typeof callback === 'function') { this.callback = callback; } else if (callback) { opts = callback; } // timeout for the socket to be returned from the callback this.timeout = null; if (opts && typeof opts.timeout === 'number') { this.timeout = opts.timeout; } this.options = opts || {}; this.maxFreeSockets = 1; this.maxSockets = 1; this.sockets = []; this.requests = []; } get defaultPort() { if (typeof this.explicitDefaultPort === 'number') { return this.explicitDefaultPort; } else { return isSecureEndpoint() ? 443 : 80; } } set defaultPort(v) { this.explicitDefaultPort = v; } get protocol() { if (typeof this.explicitProtocol === 'string') { return this.explicitProtocol; } else { return isSecureEndpoint() ? 'https:' : 'http:'; } } set protocol(v) { this.explicitProtocol = v; } callback(req, opts, fn) { throw new Error('"agent-base" has no default implementation, you must subclass and override `callback()`'); } /** * Called by node-core's "_http_client.js" module when creating * a new HTTP request with this Agent instance. * * @api public */ addRequest(req, _opts) { const ownOpts = Object.assign({}, _opts); if (typeof ownOpts.secureEndpoint !== 'boolean') { ownOpts.secureEndpoint = isSecureEndpoint(); } // Set default `host` for HTTP to localhost if (ownOpts.host == null) { ownOpts.host = 'localhost'; } // Set default `port` for HTTP if none was explicitly specified if (ownOpts.port == null) { ownOpts.port = ownOpts.secureEndpoint ? 443 : 80; } const opts = Object.assign(Object.assign({}, this.options), ownOpts); if (opts.host && opts.path) { // If both a `host` and `path` are specified then it's most likely the // result of a `url.parse()` call... we need to remove the `path` portion so // that `net.connect()` doesn't attempt to open that as a unix socket file. delete opts.path; } delete opts.agent; delete opts.hostname; delete opts._defaultAgent; delete opts.defaultPort; delete opts.createConnection; // Hint to use "Connection: close" // XXX: non-documented `http` module API :( req._last = true; req.shouldKeepAlive = false; // Create the `stream.Duplex` instance let timedOut = false; let timeout = null; const timeoutMs = this.timeout; const freeSocket = this.freeSocket; function onerror(err) { if (req._hadError) return; req.emit('error', err); // For Safety. Some additional errors might fire later on // and we need to make sure we don't double-fire the error event. req._hadError = true; } function ontimeout() { timeout = null; timedOut = true; const err = new Error(`A "socket" was not created for HTTP request before ${timeoutMs}ms`); err.code = 'ETIMEOUT'; onerror(err); } function callbackError(err) { if (timedOut) return; if (timeout !== null) { clearTimeout(timeout); timeout = null; } onerror(err); } function onsocket(socket) { let sock; function onfree() { freeSocket(sock, opts); } if (timedOut) return; if (timeout != null) { clearTimeout(timeout); timeout = null; } if (isAgentBase(socket) || isHttpAgent(socket)) { // `socket` is actually an `http.Agent` instance, so // relinquish responsibility for this `req` to the Agent // from here on socket.addRequest(req, opts); return; } if (socket) { sock = socket; sock.on('free', onfree); req.onSocket(sock); return; } const err = new Error(`no Duplex stream was returned to agent-base for \`${req.method} ${req.path}\``); onerror(err); } if (typeof this.callback !== 'function') { onerror(new Error('`callback` is not defined')); return; } if (!this.promisifiedCallback) { if (this.callback.length >= 3) { // Legacy callback function - convert to a Promise this.promisifiedCallback = promisify_1.default(this.callback); } else { this.promisifiedCallback = this.callback; } } if (typeof timeoutMs === 'number' && timeoutMs > 0) { timeout = setTimeout(ontimeout, timeoutMs); } if ('port' in opts && typeof opts.port !== 'number') { opts.port = Number(opts.port); } try { Promise.resolve(this.promisifiedCallback(req, opts)).then(onsocket, callbackError); } catch (err) { Promise.reject(err).catch(callbackError); } } freeSocket(socket, opts) { // TODO reuse sockets socket.destroy(); } destroy() { } } createAgent.Agent = Agent; })(createAgent || (createAgent = {})); // So that `instanceof` works correctly createAgent.prototype = createAgent.Agent.prototype; module.exports = createAgent; //# sourceMappingURL=index.js.map /***/ }), /***/ 2929: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); function promisify(fn) { return function (req, opts) { return new Promise((resolve, reject) => { fn.call(this, req, opts, (err, rtn) => { if (err) { reject(err); } else { resolve(rtn); } }); }); }; } exports.default = promisify; //# sourceMappingURL=promisify.js.map /***/ }), /***/ 2390: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { module.exports = __webpack_require__(64579); /***/ }), /***/ 38007: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var utils = __webpack_require__(19520); var settle = __webpack_require__(29801); var buildFullPath = __webpack_require__(92074); var buildURL = __webpack_require__(87481); var http = __webpack_require__(98605); var https = __webpack_require__(57211); var httpFollow = __webpack_require__(75955).http; var httpsFollow = __webpack_require__(75955).https; var url = __webpack_require__(78835); var zlib = __webpack_require__(78761); var pkg = __webpack_require__(35131); var createError = __webpack_require__(3034); var enhanceError = __webpack_require__(95261); var isHttps = /https:?/; /*eslint consistent-return:0*/ module.exports = function httpAdapter(config) { return new Promise(function dispatchHttpRequest(resolvePromise, rejectPromise) { var resolve = function resolve(value) { resolvePromise(value); }; var reject = function reject(value) { rejectPromise(value); }; var data = config.data; var headers = config.headers; // Set User-Agent (required by some servers) // Only set header if it hasn't been set in config // See https://github.com/axios/axios/issues/69 if (!headers['User-Agent'] && !headers['user-agent']) { headers['User-Agent'] = 'axios/' + pkg.version; } if (data && !utils.isStream(data)) { if (Buffer.isBuffer(data)) { // Nothing to do... } else if (utils.isArrayBuffer(data)) { data = Buffer.from(new Uint8Array(data)); } else if (utils.isString(data)) { data = Buffer.from(data, 'utf-8'); } else { return reject(createError( 'Data after transformation must be a string, an ArrayBuffer, a Buffer, or a Stream', config )); } // Add Content-Length header if data exists headers['Content-Length'] = data.length; } // HTTP basic authentication var auth = undefined; if (config.auth) { var username = config.auth.username || ''; var password = config.auth.password || ''; auth = username + ':' + password; } // Parse url var fullPath = buildFullPath(config.baseURL, config.url); var parsed = url.parse(fullPath); var protocol = parsed.protocol || 'http:'; if (!auth && parsed.auth) { var urlAuth = parsed.auth.split(':'); var urlUsername = urlAuth[0] || ''; var urlPassword = urlAuth[1] || ''; auth = urlUsername + ':' + urlPassword; } if (auth) { delete headers.Authorization; } var isHttpsRequest = isHttps.test(protocol); var agent = isHttpsRequest ? config.httpsAgent : config.httpAgent; var options = { path: buildURL(parsed.path, config.params, config.paramsSerializer).replace(/^\?/, ''), method: config.method.toUpperCase(), headers: headers, agent: agent, agents: { http: config.httpAgent, https: config.httpsAgent }, auth: auth }; if (config.socketPath) { options.socketPath = config.socketPath; } else { options.hostname = parsed.hostname; options.port = parsed.port; } var proxy = config.proxy; if (!proxy && proxy !== false) { var proxyEnv = protocol.slice(0, -1) + '_proxy'; var proxyUrl = process.env[proxyEnv] || process.env[proxyEnv.toUpperCase()]; if (proxyUrl) { var parsedProxyUrl = url.parse(proxyUrl); var noProxyEnv = process.env.no_proxy || process.env.NO_PROXY; var shouldProxy = true; if (noProxyEnv) { var noProxy = noProxyEnv.split(',').map(function trim(s) { return s.trim(); }); shouldProxy = !noProxy.some(function proxyMatch(proxyElement) { if (!proxyElement) { return false; } if (proxyElement === '*') { return true; } if (proxyElement[0] === '.' && parsed.hostname.substr(parsed.hostname.length - proxyElement.length) === proxyElement) { return true; } return parsed.hostname === proxyElement; }); } if (shouldProxy) { proxy = { host: parsedProxyUrl.hostname, port: parsedProxyUrl.port }; if (parsedProxyUrl.auth) { var proxyUrlAuth = parsedProxyUrl.auth.split(':'); proxy.auth = { username: proxyUrlAuth[0], password: proxyUrlAuth[1] }; } } } } if (proxy) { options.hostname = proxy.host; options.host = proxy.host; options.headers.host = parsed.hostname + (parsed.port ? ':' + parsed.port : ''); options.port = proxy.port; options.path = protocol + '//' + parsed.hostname + (parsed.port ? ':' + parsed.port : '') + options.path; // Basic proxy authorization if (proxy.auth) { var base64 = Buffer.from(proxy.auth.username + ':' + proxy.auth.password, 'utf8').toString('base64'); options.headers['Proxy-Authorization'] = 'Basic ' + base64; } } var transport; var isHttpsProxy = isHttpsRequest && (proxy ? isHttps.test(proxy.protocol) : true); if (config.transport) { transport = config.transport; } else if (config.maxRedirects === 0) { transport = isHttpsProxy ? https : http; } else { if (config.maxRedirects) { options.maxRedirects = config.maxRedirects; } transport = isHttpsProxy ? httpsFollow : httpFollow; } if (config.maxBodyLength > -1) { options.maxBodyLength = config.maxBodyLength; } // Create the request var req = transport.request(options, function handleResponse(res) { if (req.aborted) return; // uncompress the response body transparently if required var stream = res; // return the last request in case of redirects var lastRequest = res.req || req; // if no content, is HEAD request or decompress disabled we should not decompress if (res.statusCode !== 204 && lastRequest.method !== 'HEAD' && config.decompress !== false) { switch (res.headers['content-encoding']) { /*eslint default-case:0*/ case 'gzip': case 'compress': case 'deflate': // add the unzipper to the body stream processing pipeline stream = stream.pipe(zlib.createUnzip()); // remove the content-encoding in order to not confuse downstream operations delete res.headers['content-encoding']; break; } } var response = { status: res.statusCode, statusText: res.statusMessage, headers: res.headers, config: config, request: lastRequest }; if (config.responseType === 'stream') { response.data = stream; settle(resolve, reject, response); } else { var responseBuffer = []; stream.on('data', function handleStreamData(chunk) { responseBuffer.push(chunk); // make sure the content length is not over the maxContentLength if specified if (config.maxContentLength > -1 && Buffer.concat(responseBuffer).length > config.maxContentLength) { stream.destroy(); reject(createError('maxContentLength size of ' + config.maxContentLength + ' exceeded', config, null, lastRequest)); } }); stream.on('error', function handleStreamError(err) { if (req.aborted) return; reject(enhanceError(err, config, null, lastRequest)); }); stream.on('end', function handleStreamEnd() { var responseData = Buffer.concat(responseBuffer); if (config.responseType !== 'arraybuffer') { responseData = responseData.toString(config.responseEncoding); if (!config.responseEncoding || config.responseEncoding === 'utf8') { responseData = utils.stripBOM(responseData); } } response.data = responseData; settle(resolve, reject, response); }); } }); // Handle errors req.on('error', function handleRequestError(err) { if (req.aborted && err.code !== 'ERR_FR_TOO_MANY_REDIRECTS') return; reject(enhanceError(err, config, null, req)); }); // Handle request timeout if (config.timeout) { // Sometime, the response will be very slow, and does not respond, the connect event will be block by event loop system. // And timer callback will be fired, and abort() will be invoked before connection, then get "socket hang up" and code ECONNRESET. // At this time, if we have a large number of request, nodejs will hang up some socket on background. and the number will up and up. // And then these socket which be hang up will devoring CPU little by little. // ClientRequest.setTimeout will be fired on the specify milliseconds, and can make sure that abort() will be fired after connect. req.setTimeout(config.timeout, function handleRequestTimeout() { req.abort(); reject(createError('timeout of ' + config.timeout + 'ms exceeded', config, 'ECONNABORTED', req)); }); } if (config.cancelToken) { // Handle cancellation config.cancelToken.promise.then(function onCanceled(cancel) { if (req.aborted) return; req.abort(); reject(cancel); }); } // Send the request if (utils.isStream(data)) { data.on('error', function handleStreamError(err) { reject(enhanceError(err, config, null, req)); }).pipe(req); } else { req.end(data); } }); }; /***/ }), /***/ 63500: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var utils = __webpack_require__(19520); var settle = __webpack_require__(29801); var cookies = __webpack_require__(47536); var buildURL = __webpack_require__(87481); var buildFullPath = __webpack_require__(92074); var parseHeaders = __webpack_require__(77912); var isURLSameOrigin = __webpack_require__(11682); var createError = __webpack_require__(3034); module.exports = function xhrAdapter(config) { return new Promise(function dispatchXhrRequest(resolve, reject) { var requestData = config.data; var requestHeaders = config.headers; if (utils.isFormData(requestData)) { delete requestHeaders['Content-Type']; // Let the browser set it } if ( (utils.isBlob(requestData) || utils.isFile(requestData)) && requestData.type ) { delete requestHeaders['Content-Type']; // Let the browser set it } var request = new XMLHttpRequest(); // HTTP basic authentication if (config.auth) { var username = config.auth.username || ''; var password = unescape(encodeURIComponent(config.auth.password)) || ''; requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password); } var fullPath = buildFullPath(config.baseURL, config.url); request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true); // Set the request timeout in MS request.timeout = config.timeout; // Listen for ready state request.onreadystatechange = function handleLoad() { if (!request || request.readyState !== 4) { return; } // The request errored out and we didn't get a response, this will be // handled by onerror instead // With one exception: request that using file: protocol, most browsers // will return status as 0 even though it's a successful request if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) { return; } // Prepare the response var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null; var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response; var response = { data: responseData, status: request.status, statusText: request.statusText, headers: responseHeaders, config: config, request: request }; settle(resolve, reject, response); // Clean up request request = null; }; // Handle browser request cancellation (as opposed to a manual cancellation) request.onabort = function handleAbort() { if (!request) { return; } reject(createError('Request aborted', config, 'ECONNABORTED', request)); // Clean up request request = null; }; // Handle low level network errors request.onerror = function handleError() { // Real errors are hidden from us by the browser // onerror should only fire if it's a network error reject(createError('Network Error', config, null, request)); // Clean up request request = null; }; // Handle timeout request.ontimeout = function handleTimeout() { var timeoutErrorMessage = 'timeout of ' + config.timeout + 'ms exceeded'; if (config.timeoutErrorMessage) { timeoutErrorMessage = config.timeoutErrorMessage; } reject(createError(timeoutErrorMessage, config, 'ECONNABORTED', request)); // Clean up request request = null; }; // Add xsrf header // This is only done if running in a standard browser environment. // Specifically not if we're in a web worker, or react-native. if (utils.isStandardBrowserEnv()) { // Add xsrf header var xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName ? cookies.read(config.xsrfCookieName) : undefined; if (xsrfValue) { requestHeaders[config.xsrfHeaderName] = xsrfValue; } } // Add headers to the request if ('setRequestHeader' in request) { utils.forEach(requestHeaders, function setRequestHeader(val, key) { if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') { // Remove Content-Type if data is undefined delete requestHeaders[key]; } else { // Otherwise add header to the request request.setRequestHeader(key, val); } }); } // Add withCredentials to request if needed if (!utils.isUndefined(config.withCredentials)) { request.withCredentials = !!config.withCredentials; } // Add responseType to request if needed if (config.responseType) { try { request.responseType = config.responseType; } catch (e) { // Expected DOMException thrown by browsers not compatible XMLHttpRequest Level 2. // But, this can be suppressed for 'json' type as it can be parsed by default 'transformResponse' function. if (config.responseType !== 'json') { throw e; } } } // Handle progress if needed if (typeof config.onDownloadProgress === 'function') { request.addEventListener('progress', config.onDownloadProgress); } // Not all browsers support upload events if (typeof config.onUploadProgress === 'function' && request.upload) { request.upload.addEventListener('progress', config.onUploadProgress); } if (config.cancelToken) { // Handle cancellation config.cancelToken.promise.then(function onCanceled(cancel) { if (!request) { return; } request.abort(); reject(cancel); // Clean up request request = null; }); } if (!requestData) { requestData = null; } // Send the request request.send(requestData); }); }; /***/ }), /***/ 64579: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var utils = __webpack_require__(19520); var bind = __webpack_require__(69339); var Axios = __webpack_require__(10353); var mergeConfig = __webpack_require__(59807); var defaults = __webpack_require__(6769); /** * Create an instance of Axios * * @param {Object} defaultConfig The default config for the instance * @return {Axios} A new instance of Axios */ function createInstance(defaultConfig) { var context = new Axios(defaultConfig); var instance = bind(Axios.prototype.request, context); // Copy axios.prototype to instance utils.extend(instance, Axios.prototype, context); // Copy context to instance utils.extend(instance, context); return instance; } // Create the default instance to be exported var axios = createInstance(defaults); // Expose Axios class to allow class inheritance axios.Axios = Axios; // Factory for creating new instances axios.create = function create(instanceConfig) { return createInstance(mergeConfig(axios.defaults, instanceConfig)); }; // Expose Cancel & CancelToken axios.Cancel = __webpack_require__(56305); axios.CancelToken = __webpack_require__(99576); axios.isCancel = __webpack_require__(57822); // Expose all/spread axios.all = function all(promises) { return Promise.all(promises); }; axios.spread = __webpack_require__(83202); module.exports = axios; // Allow use of default import syntax in TypeScript module.exports.default = axios; /***/ }), /***/ 56305: /***/ ((module) => { "use strict"; /** * A `Cancel` is an object that is thrown when an operation is canceled. * * @class * @param {string=} message The message. */ function Cancel(message) { this.message = message; } Cancel.prototype.toString = function toString() { return 'Cancel' + (this.message ? ': ' + this.message : ''); }; Cancel.prototype.__CANCEL__ = true; module.exports = Cancel; /***/ }), /***/ 99576: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var Cancel = __webpack_require__(56305); /** * A `CancelToken` is an object that can be used to request cancellation of an operation. * * @class * @param {Function} executor The executor function. */ function CancelToken(executor) { if (typeof executor !== 'function') { throw new TypeError('executor must be a function.'); } var resolvePromise; this.promise = new Promise(function promiseExecutor(resolve) { resolvePromise = resolve; }); var token = this; executor(function cancel(message) { if (token.reason) { // Cancellation has already been requested return; } token.reason = new Cancel(message); resolvePromise(token.reason); }); } /** * Throws a `Cancel` if cancellation has been requested. */ CancelToken.prototype.throwIfRequested = function throwIfRequested() { if (this.reason) { throw this.reason; } }; /** * Returns an object that contains a new `CancelToken` and a function that, when called, * cancels the `CancelToken`. */ CancelToken.source = function source() { var cancel; var token = new CancelToken(function executor(c) { cancel = c; }); return { token: token, cancel: cancel }; }; module.exports = CancelToken; /***/ }), /***/ 57822: /***/ ((module) => { "use strict"; module.exports = function isCancel(value) { return !!(value && value.__CANCEL__); }; /***/ }), /***/ 10353: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var utils = __webpack_require__(19520); var buildURL = __webpack_require__(87481); var InterceptorManager = __webpack_require__(88030); var dispatchRequest = __webpack_require__(18944); var mergeConfig = __webpack_require__(59807); /** * Create a new instance of Axios * * @param {Object} instanceConfig The default config for the instance */ function Axios(instanceConfig) { this.defaults = instanceConfig; this.interceptors = { request: new InterceptorManager(), response: new InterceptorManager() }; } /** * Dispatch a request * * @param {Object} config The config specific for this request (merged with this.defaults) */ Axios.prototype.request = function request(config) { /*eslint no-param-reassign:0*/ // Allow for axios('example/url'[, config]) a la fetch API if (typeof config === 'string') { config = arguments[1] || {}; config.url = arguments[0]; } else { config = config || {}; } config = mergeConfig(this.defaults, config); // Set config.method if (config.method) { config.method = config.method.toLowerCase(); } else if (this.defaults.method) { config.method = this.defaults.method.toLowerCase(); } else { config.method = 'get'; } // Hook up interceptors middleware var chain = [dispatchRequest, undefined]; var promise = Promise.resolve(config); this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) { chain.unshift(interceptor.fulfilled, interceptor.rejected); }); this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) { chain.push(interceptor.fulfilled, interceptor.rejected); }); while (chain.length) { promise = promise.then(chain.shift(), chain.shift()); } return promise; }; Axios.prototype.getUri = function getUri(config) { config = mergeConfig(this.defaults, config); return buildURL(config.url, config.params, config.paramsSerializer).replace(/^\?/, ''); }; // Provide aliases for supported request methods utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) { /*eslint func-names:0*/ Axios.prototype[method] = function(url, config) { return this.request(mergeConfig(config || {}, { method: method, url: url })); }; }); utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { /*eslint func-names:0*/ Axios.prototype[method] = function(url, data, config) { return this.request(mergeConfig(config || {}, { method: method, url: url, data: data })); }; }); module.exports = Axios; /***/ }), /***/ 88030: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var utils = __webpack_require__(19520); function InterceptorManager() { this.handlers = []; } /** * Add a new interceptor to the stack * * @param {Function} fulfilled The function to handle `then` for a `Promise` * @param {Function} rejected The function to handle `reject` for a `Promise` * * @return {Number} An ID used to remove interceptor later */ InterceptorManager.prototype.use = function use(fulfilled, rejected) { this.handlers.push({ fulfilled: fulfilled, rejected: rejected }); return this.handlers.length - 1; }; /** * Remove an interceptor from the stack * * @param {Number} id The ID that was returned by `use` */ InterceptorManager.prototype.eject = function eject(id) { if (this.handlers[id]) { this.handlers[id] = null; } }; /** * Iterate over all the registered interceptors * * This method is particularly useful for skipping over any * interceptors that may have become `null` calling `eject`. * * @param {Function} fn The function to call for each interceptor */ InterceptorManager.prototype.forEach = function forEach(fn) { utils.forEach(this.handlers, function forEachHandler(h) { if (h !== null) { fn(h); } }); }; module.exports = InterceptorManager; /***/ }), /***/ 92074: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var isAbsoluteURL = __webpack_require__(55470); var combineURLs = __webpack_require__(65824); /** * Creates a new URL by combining the baseURL with the requestedURL, * only when the requestedURL is not already an absolute URL. * If the requestURL is absolute, this function returns the requestedURL untouched. * * @param {string} baseURL The base URL * @param {string} requestedURL Absolute or relative URL to combine * @returns {string} The combined full path */ module.exports = function buildFullPath(baseURL, requestedURL) { if (baseURL && !isAbsoluteURL(requestedURL)) { return combineURLs(baseURL, requestedURL); } return requestedURL; }; /***/ }), /***/ 3034: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var enhanceError = __webpack_require__(95261); /** * Create an Error with the specified message, config, error code, request and response. * * @param {string} message The error message. * @param {Object} config The config. * @param {string} [code] The error code (for example, 'ECONNABORTED'). * @param {Object} [request] The request. * @param {Object} [response] The response. * @returns {Error} The created error. */ module.exports = function createError(message, config, code, request, response) { var error = new Error(message); return enhanceError(error, config, code, request, response); }; /***/ }), /***/ 18944: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var utils = __webpack_require__(19520); var transformData = __webpack_require__(62479); var isCancel = __webpack_require__(57822); var defaults = __webpack_require__(6769); /** * Throws a `Cancel` if cancellation has been requested. */ function throwIfCancellationRequested(config) { if (config.cancelToken) { config.cancelToken.throwIfRequested(); } } /** * Dispatch a request to the server using the configured adapter. * * @param {object} config The config that is to be used for the request * @returns {Promise} The Promise to be fulfilled */ module.exports = function dispatchRequest(config) { throwIfCancellationRequested(config); // Ensure headers exist config.headers = config.headers || {}; // Transform request data config.data = transformData( config.data, config.headers, config.transformRequest ); // Flatten headers config.headers = utils.merge( config.headers.common || {}, config.headers[config.method] || {}, config.headers ); utils.forEach( ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'], function cleanHeaderConfig(method) { delete config.headers[method]; } ); var adapter = config.adapter || defaults.adapter; return adapter(config).then(function onAdapterResolution(response) { throwIfCancellationRequested(config); // Transform response data response.data = transformData( response.data, response.headers, config.transformResponse ); return response; }, function onAdapterRejection(reason) { if (!isCancel(reason)) { throwIfCancellationRequested(config); // Transform response data if (reason && reason.response) { reason.response.data = transformData( reason.response.data, reason.response.headers, config.transformResponse ); } } return Promise.reject(reason); }); }; /***/ }), /***/ 95261: /***/ ((module) => { "use strict"; /** * Update an Error with the specified config, error code, and response. * * @param {Error} error The error to update. * @param {Object} config The config. * @param {string} [code] The error code (for example, 'ECONNABORTED'). * @param {Object} [request] The request. * @param {Object} [response] The response. * @returns {Error} The error. */ module.exports = function enhanceError(error, config, code, request, response) { error.config = config; if (code) { error.code = code; } error.request = request; error.response = response; error.isAxiosError = true; error.toJSON = function toJSON() { return { // Standard message: this.message, name: this.name, // Microsoft description: this.description, number: this.number, // Mozilla fileName: this.fileName, lineNumber: this.lineNumber, columnNumber: this.columnNumber, stack: this.stack, // Axios config: this.config, code: this.code }; }; return error; }; /***/ }), /***/ 59807: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var utils = __webpack_require__(19520); /** * Config-specific merge-function which creates a new config-object * by merging two configuration objects together. * * @param {Object} config1 * @param {Object} config2 * @returns {Object} New object resulting from merging config2 to config1 */ module.exports = function mergeConfig(config1, config2) { // eslint-disable-next-line no-param-reassign config2 = config2 || {}; var config = {}; var valueFromConfig2Keys = ['url', 'method', 'data']; var mergeDeepPropertiesKeys = ['headers', 'auth', 'proxy', 'params']; var defaultToConfig2Keys = [ 'baseURL', 'transformRequest', 'transformResponse', 'paramsSerializer', 'timeout', 'timeoutMessage', 'withCredentials', 'adapter', 'responseType', 'xsrfCookieName', 'xsrfHeaderName', 'onUploadProgress', 'onDownloadProgress', 'decompress', 'maxContentLength', 'maxBodyLength', 'maxRedirects', 'transport', 'httpAgent', 'httpsAgent', 'cancelToken', 'socketPath', 'responseEncoding' ]; var directMergeKeys = ['validateStatus']; function getMergedValue(target, source) { if (utils.isPlainObject(target) && utils.isPlainObject(source)) { return utils.merge(target, source); } else if (utils.isPlainObject(source)) { return utils.merge({}, source); } else if (utils.isArray(source)) { return source.slice(); } return source; } function mergeDeepProperties(prop) { if (!utils.isUndefined(config2[prop])) { config[prop] = getMergedValue(config1[prop], config2[prop]); } else if (!utils.isUndefined(config1[prop])) { config[prop] = getMergedValue(undefined, config1[prop]); } } utils.forEach(valueFromConfig2Keys, function valueFromConfig2(prop) { if (!utils.isUndefined(config2[prop])) { config[prop] = getMergedValue(undefined, config2[prop]); } }); utils.forEach(mergeDeepPropertiesKeys, mergeDeepProperties); utils.forEach(defaultToConfig2Keys, function defaultToConfig2(prop) { if (!utils.isUndefined(config2[prop])) { config[prop] = getMergedValue(undefined, config2[prop]); } else if (!utils.isUndefined(config1[prop])) { config[prop] = getMergedValue(undefined, config1[prop]); } }); utils.forEach(directMergeKeys, function merge(prop) { if (prop in config2) { config[prop] = getMergedValue(config1[prop], config2[prop]); } else if (prop in config1) { config[prop] = getMergedValue(undefined, config1[prop]); } }); var axiosKeys = valueFromConfig2Keys .concat(mergeDeepPropertiesKeys) .concat(defaultToConfig2Keys) .concat(directMergeKeys); var otherKeys = Object .keys(config1) .concat(Object.keys(config2)) .filter(function filterAxiosKeys(key) { return axiosKeys.indexOf(key) === -1; }); utils.forEach(otherKeys, mergeDeepProperties); return config; }; /***/ }), /***/ 29801: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var createError = __webpack_require__(3034); /** * Resolve or reject a Promise based on response status. * * @param {Function} resolve A function that resolves the promise. * @param {Function} reject A function that rejects the promise. * @param {object} response The response. */ module.exports = function settle(resolve, reject, response) { var validateStatus = response.config.validateStatus; if (!response.status || !validateStatus || validateStatus(response.status)) { resolve(response); } else { reject(createError( 'Request failed with status code ' + response.status, response.config, null, response.request, response )); } }; /***/ }), /***/ 62479: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var utils = __webpack_require__(19520); /** * Transform the data for a request or a response * * @param {Object|String} data The data to be transformed * @param {Array} headers The headers for the request or response * @param {Array|Function} fns A single function or Array of functions * @returns {*} The resulting transformed data */ module.exports = function transformData(data, headers, fns) { /*eslint no-param-reassign:0*/ utils.forEach(fns, function transform(fn) { data = fn(data, headers); }); return data; }; /***/ }), /***/ 6769: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var utils = __webpack_require__(19520); var normalizeHeaderName = __webpack_require__(53293); var DEFAULT_CONTENT_TYPE = { 'Content-Type': 'application/x-www-form-urlencoded' }; function setContentTypeIfUnset(headers, value) { if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) { headers['Content-Type'] = value; } } function getDefaultAdapter() { var adapter; if (typeof XMLHttpRequest !== 'undefined') { // For browsers use XHR adapter adapter = __webpack_require__(63500); } else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') { // For node use HTTP adapter adapter = __webpack_require__(38007); } return adapter; } var defaults = { adapter: getDefaultAdapter(), transformRequest: [function transformRequest(data, headers) { normalizeHeaderName(headers, 'Accept'); normalizeHeaderName(headers, 'Content-Type'); if (utils.isFormData(data) || utils.isArrayBuffer(data) || utils.isBuffer(data) || utils.isStream(data) || utils.isFile(data) || utils.isBlob(data) ) { return data; } if (utils.isArrayBufferView(data)) { return data.buffer; } if (utils.isURLSearchParams(data)) { setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8'); return data.toString(); } if (utils.isObject(data)) { setContentTypeIfUnset(headers, 'application/json;charset=utf-8'); return JSON.stringify(data); } return data; }], transformResponse: [function transformResponse(data) { /*eslint no-param-reassign:0*/ if (typeof data === 'string') { try { data = JSON.parse(data); } catch (e) { /* Ignore */ } } return data; }], /** * A timeout in milliseconds to abort a request. If set to 0 (default) a * timeout is not created. */ timeout: 0, xsrfCookieName: 'XSRF-TOKEN', xsrfHeaderName: 'X-XSRF-TOKEN', maxContentLength: -1, maxBodyLength: -1, validateStatus: function validateStatus(status) { return status >= 200 && status < 300; } }; defaults.headers = { common: { 'Accept': 'application/json, text/plain, */*' } }; utils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) { defaults.headers[method] = {}; }); utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE); }); module.exports = defaults; /***/ }), /***/ 69339: /***/ ((module) => { "use strict"; module.exports = function bind(fn, thisArg) { return function wrap() { var args = new Array(arguments.length); for (var i = 0; i < args.length; i++) { args[i] = arguments[i]; } return fn.apply(thisArg, args); }; }; /***/ }), /***/ 87481: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var utils = __webpack_require__(19520); function encode(val) { return encodeURIComponent(val). replace(/%3A/gi, ':'). replace(/%24/g, '$'). replace(/%2C/gi, ','). replace(/%20/g, '+'). replace(/%5B/gi, '['). replace(/%5D/gi, ']'); } /** * Build a URL by appending params to the end * * @param {string} url The base of the url (e.g., http://www.google.com) * @param {object} [params] The params to be appended * @returns {string} The formatted url */ module.exports = function buildURL(url, params, paramsSerializer) { /*eslint no-param-reassign:0*/ if (!params) { return url; } var serializedParams; if (paramsSerializer) { serializedParams = paramsSerializer(params); } else if (utils.isURLSearchParams(params)) { serializedParams = params.toString(); } else { var parts = []; utils.forEach(params, function serialize(val, key) { if (val === null || typeof val === 'undefined') { return; } if (utils.isArray(val)) { key = key + '[]'; } else { val = [val]; } utils.forEach(val, function parseValue(v) { if (utils.isDate(v)) { v = v.toISOString(); } else if (utils.isObject(v)) { v = JSON.stringify(v); } parts.push(encode(key) + '=' + encode(v)); }); }); serializedParams = parts.join('&'); } if (serializedParams) { var hashmarkIndex = url.indexOf('#'); if (hashmarkIndex !== -1) { url = url.slice(0, hashmarkIndex); } url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams; } return url; }; /***/ }), /***/ 65824: /***/ ((module) => { "use strict"; /** * Creates a new URL by combining the specified URLs * * @param {string} baseURL The base URL * @param {string} relativeURL The relative URL * @returns {string} The combined URL */ module.exports = function combineURLs(baseURL, relativeURL) { return relativeURL ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '') : baseURL; }; /***/ }), /***/ 47536: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var utils = __webpack_require__(19520); module.exports = ( utils.isStandardBrowserEnv() ? // Standard browser envs support document.cookie (function standardBrowserEnv() { return { write: function write(name, value, expires, path, domain, secure) { var cookie = []; cookie.push(name + '=' + encodeURIComponent(value)); if (utils.isNumber(expires)) { cookie.push('expires=' + new Date(expires).toGMTString()); } if (utils.isString(path)) { cookie.push('path=' + path); } if (utils.isString(domain)) { cookie.push('domain=' + domain); } if (secure === true) { cookie.push('secure'); } document.cookie = cookie.join('; '); }, read: function read(name) { var match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)')); return (match ? decodeURIComponent(match[3]) : null); }, remove: function remove(name) { this.write(name, '', Date.now() - 86400000); } }; })() : // Non standard browser env (web workers, react-native) lack needed support. (function nonStandardBrowserEnv() { return { write: function write() {}, read: function read() { return null; }, remove: function remove() {} }; })() ); /***/ }), /***/ 55470: /***/ ((module) => { "use strict"; /** * Determines whether the specified URL is absolute * * @param {string} url The URL to test * @returns {boolean} True if the specified URL is absolute, otherwise false */ module.exports = function isAbsoluteURL(url) { // A URL is considered absolute if it begins with "://" or "//" (protocol-relative URL). // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed // by any combination of letters, digits, plus, period, or hyphen. return /^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(url); }; /***/ }), /***/ 11682: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var utils = __webpack_require__(19520); module.exports = ( utils.isStandardBrowserEnv() ? // Standard browser envs have full support of the APIs needed to test // whether the request URL is of the same origin as current location. (function standardBrowserEnv() { var msie = /(msie|trident)/i.test(navigator.userAgent); var urlParsingNode = document.createElement('a'); var originURL; /** * Parse a URL to discover it's components * * @param {String} url The URL to be parsed * @returns {Object} */ function resolveURL(url) { var href = url; if (msie) { // IE needs attribute set twice to normalize properties urlParsingNode.setAttribute('href', href); href = urlParsingNode.href; } urlParsingNode.setAttribute('href', href); // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils return { href: urlParsingNode.href, protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '', host: urlParsingNode.host, search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '', hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '', hostname: urlParsingNode.hostname, port: urlParsingNode.port, pathname: (urlParsingNode.pathname.charAt(0) === '/') ? urlParsingNode.pathname : '/' + urlParsingNode.pathname }; } originURL = resolveURL(window.location.href); /** * Determine if a URL shares the same origin as the current location * * @param {String} requestURL The URL to test * @returns {boolean} True if URL shares the same origin, otherwise false */ return function isURLSameOrigin(requestURL) { var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL; return (parsed.protocol === originURL.protocol && parsed.host === originURL.host); }; })() : // Non standard browser envs (web workers, react-native) lack needed support. (function nonStandardBrowserEnv() { return function isURLSameOrigin() { return true; }; })() ); /***/ }), /***/ 53293: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var utils = __webpack_require__(19520); module.exports = function normalizeHeaderName(headers, normalizedName) { utils.forEach(headers, function processHeader(value, name) { if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) { headers[normalizedName] = value; delete headers[name]; } }); }; /***/ }), /***/ 77912: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var utils = __webpack_require__(19520); // Headers whose duplicates are ignored by node // c.f. https://nodejs.org/api/http.html#http_message_headers var ignoreDuplicateOf = [ 'age', 'authorization', 'content-length', 'content-type', 'etag', 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since', 'last-modified', 'location', 'max-forwards', 'proxy-authorization', 'referer', 'retry-after', 'user-agent' ]; /** * Parse headers into an object * * ``` * Date: Wed, 27 Aug 2014 08:58:49 GMT * Content-Type: application/json * Connection: keep-alive * Transfer-Encoding: chunked * ``` * * @param {String} headers Headers needing to be parsed * @returns {Object} Headers parsed into an object */ module.exports = function parseHeaders(headers) { var parsed = {}; var key; var val; var i; if (!headers) { return parsed; } utils.forEach(headers.split('\n'), function parser(line) { i = line.indexOf(':'); key = utils.trim(line.substr(0, i)).toLowerCase(); val = utils.trim(line.substr(i + 1)); if (key) { if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) { return; } if (key === 'set-cookie') { parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]); } else { parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val; } } }); return parsed; }; /***/ }), /***/ 83202: /***/ ((module) => { "use strict"; /** * Syntactic sugar for invoking a function and expanding an array for arguments. * * Common use case would be to use `Function.prototype.apply`. * * ```js * function f(x, y, z) {} * var args = [1, 2, 3]; * f.apply(null, args); * ``` * * With `spread` this example can be re-written. * * ```js * spread(function(x, y, z) {})([1, 2, 3]); * ``` * * @param {Function} callback * @returns {Function} */ module.exports = function spread(callback) { return function wrap(arr) { return callback.apply(null, arr); }; }; /***/ }), /***/ 19520: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var bind = __webpack_require__(69339); /*global toString:true*/ // utils is a library of generic helper functions non-specific to axios var toString = Object.prototype.toString; /** * Determine if a value is an Array * * @param {Object} val The value to test * @returns {boolean} True if value is an Array, otherwise false */ function isArray(val) { return toString.call(val) === '[object Array]'; } /** * Determine if a value is undefined * * @param {Object} val The value to test * @returns {boolean} True if the value is undefined, otherwise false */ function isUndefined(val) { return typeof val === 'undefined'; } /** * Determine if a value is a Buffer * * @param {Object} val The value to test * @returns {boolean} True if value is a Buffer, otherwise false */ function isBuffer(val) { return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor) && typeof val.constructor.isBuffer === 'function' && val.constructor.isBuffer(val); } /** * Determine if a value is an ArrayBuffer * * @param {Object} val The value to test * @returns {boolean} True if value is an ArrayBuffer, otherwise false */ function isArrayBuffer(val) { return toString.call(val) === '[object ArrayBuffer]'; } /** * Determine if a value is a FormData * * @param {Object} val The value to test * @returns {boolean} True if value is an FormData, otherwise false */ function isFormData(val) { return (typeof FormData !== 'undefined') && (val instanceof FormData); } /** * Determine if a value is a view on an ArrayBuffer * * @param {Object} val The value to test * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false */ function isArrayBufferView(val) { var result; if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) { result = ArrayBuffer.isView(val); } else { result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer); } return result; } /** * Determine if a value is a String * * @param {Object} val The value to test * @returns {boolean} True if value is a String, otherwise false */ function isString(val) { return typeof val === 'string'; } /** * Determine if a value is a Number * * @param {Object} val The value to test * @returns {boolean} True if value is a Number, otherwise false */ function isNumber(val) { return typeof val === 'number'; } /** * Determine if a value is an Object * * @param {Object} val The value to test * @returns {boolean} True if value is an Object, otherwise false */ function isObject(val) { return val !== null && typeof val === 'object'; } /** * Determine if a value is a plain Object * * @param {Object} val The value to test * @return {boolean} True if value is a plain Object, otherwise false */ function isPlainObject(val) { if (toString.call(val) !== '[object Object]') { return false; } var prototype = Object.getPrototypeOf(val); return prototype === null || prototype === Object.prototype; } /** * Determine if a value is a Date * * @param {Object} val The value to test * @returns {boolean} True if value is a Date, otherwise false */ function isDate(val) { return toString.call(val) === '[object Date]'; } /** * Determine if a value is a File * * @param {Object} val The value to test * @returns {boolean} True if value is a File, otherwise false */ function isFile(val) { return toString.call(val) === '[object File]'; } /** * Determine if a value is a Blob * * @param {Object} val The value to test * @returns {boolean} True if value is a Blob, otherwise false */ function isBlob(val) { return toString.call(val) === '[object Blob]'; } /** * Determine if a value is a Function * * @param {Object} val The value to test * @returns {boolean} True if value is a Function, otherwise false */ function isFunction(val) { return toString.call(val) === '[object Function]'; } /** * Determine if a value is a Stream * * @param {Object} val The value to test * @returns {boolean} True if value is a Stream, otherwise false */ function isStream(val) { return isObject(val) && isFunction(val.pipe); } /** * Determine if a value is a URLSearchParams object * * @param {Object} val The value to test * @returns {boolean} True if value is a URLSearchParams object, otherwise false */ function isURLSearchParams(val) { return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams; } /** * Trim excess whitespace off the beginning and end of a string * * @param {String} str The String to trim * @returns {String} The String freed of excess whitespace */ function trim(str) { return str.replace(/^\s*/, '').replace(/\s*$/, ''); } /** * Determine if we're running in a standard browser environment * * This allows axios to run in a web worker, and react-native. * Both environments support XMLHttpRequest, but not fully standard globals. * * web workers: * typeof window -> undefined * typeof document -> undefined * * react-native: * navigator.product -> 'ReactNative' * nativescript * navigator.product -> 'NativeScript' or 'NS' */ function isStandardBrowserEnv() { if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' || navigator.product === 'NativeScript' || navigator.product === 'NS')) { return false; } return ( typeof window !== 'undefined' && typeof document !== 'undefined' ); } /** * Iterate over an Array or an Object invoking a function for each item. * * If `obj` is an Array callback will be called passing * the value, index, and complete array for each item. * * If 'obj' is an Object callback will be called passing * the value, key, and complete object for each property. * * @param {Object|Array} obj The object to iterate * @param {Function} fn The callback to invoke for each item */ function forEach(obj, fn) { // Don't bother if no value provided if (obj === null || typeof obj === 'undefined') { return; } // Force an array if not already something iterable if (typeof obj !== 'object') { /*eslint no-param-reassign:0*/ obj = [obj]; } if (isArray(obj)) { // Iterate over array values for (var i = 0, l = obj.length; i < l; i++) { fn.call(null, obj[i], i, obj); } } else { // Iterate over object keys for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { fn.call(null, obj[key], key, obj); } } } } /** * Accepts varargs expecting each argument to be an object, then * immutably merges the properties of each object and returns result. * * When multiple objects contain the same key the later object in * the arguments list will take precedence. * * Example: * * ```js * var result = merge({foo: 123}, {foo: 456}); * console.log(result.foo); // outputs 456 * ``` * * @param {Object} obj1 Object to merge * @returns {Object} Result of all merge properties */ function merge(/* obj1, obj2, obj3, ... */) { var result = {}; function assignValue(val, key) { if (isPlainObject(result[key]) && isPlainObject(val)) { result[key] = merge(result[key], val); } else if (isPlainObject(val)) { result[key] = merge({}, val); } else if (isArray(val)) { result[key] = val.slice(); } else { result[key] = val; } } for (var i = 0, l = arguments.length; i < l; i++) { forEach(arguments[i], assignValue); } return result; } /** * Extends object a by mutably adding to it the properties of object b. * * @param {Object} a The object to be extended * @param {Object} b The object to copy properties from * @param {Object} thisArg The object to bind function to * @return {Object} The resulting value of object a */ function extend(a, b, thisArg) { forEach(b, function assignValue(val, key) { if (thisArg && typeof val === 'function') { a[key] = bind(val, thisArg); } else { a[key] = val; } }); return a; } /** * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM) * * @param {string} content with BOM * @return {string} content value without BOM */ function stripBOM(content) { if (content.charCodeAt(0) === 0xFEFF) { content = content.slice(1); } return content; } module.exports = { isArray: isArray, isArrayBuffer: isArrayBuffer, isBuffer: isBuffer, isFormData: isFormData, isArrayBufferView: isArrayBufferView, isString: isString, isNumber: isNumber, isObject: isObject, isPlainObject: isPlainObject, isUndefined: isUndefined, isDate: isDate, isFile: isFile, isBlob: isBlob, isFunction: isFunction, isStream: isStream, isURLSearchParams: isURLSearchParams, isStandardBrowserEnv: isStandardBrowserEnv, forEach: forEach, merge: merge, extend: extend, trim: trim, stripBOM: stripBOM }; /***/ }), /***/ 15893: /***/ ((module) => { "use strict"; module.exports = balanced; function balanced(a, b, str) { if (a instanceof RegExp) a = maybeMatch(a, str); if (b instanceof RegExp) b = maybeMatch(b, str); var r = range(a, b, str); return r && { start: r[0], end: r[1], pre: str.slice(0, r[0]), body: str.slice(r[0] + a.length, r[1]), post: str.slice(r[1] + b.length) }; } function maybeMatch(reg, str) { var m = str.match(reg); return m ? m[0] : null; } balanced.range = range; function range(a, b, str) { var begs, beg, left, right, result; var ai = str.indexOf(a); var bi = str.indexOf(b, ai + 1); var i = ai; if (ai >= 0 && bi > 0) { begs = []; left = str.length; while (i >= 0 && !result) { if (i == ai) { begs.push(i); ai = str.indexOf(a, i + 1); } else if (begs.length == 1) { result = [ begs.pop(), bi ]; } else { beg = begs.pop(); if (beg < left) { left = beg; right = bi; } bi = str.indexOf(b, i + 1); } i = ai < bi && ai >= 0 ? ai : bi; } if (begs.length) { result = [ left, right ]; } } return result; } /***/ }), /***/ 46401: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var register = __webpack_require__(27798) var addHook = __webpack_require__(82446) var removeHook = __webpack_require__(16436) // bind with array of arguments: https://stackoverflow.com/a/21792913 var bind = Function.bind var bindable = bind.bind(bind) function bindApi (hook, state, name) { var removeHookRef = bindable(removeHook, null).apply(null, name ? [state, name] : [state]) hook.api = { remove: removeHookRef } hook.remove = removeHookRef ;['before', 'error', 'after', 'wrap'].forEach(function (kind) { var args = name ? [state, kind, name] : [state, kind] hook[kind] = hook.api[kind] = bindable(addHook, null).apply(null, args) }) } function HookSingular () { var singularHookName = 'h' var singularHookState = { registry: {} } var singularHook = register.bind(null, singularHookState, singularHookName) bindApi(singularHook, singularHookState, singularHookName) return singularHook } function HookCollection () { var state = { registry: {} } var hook = register.bind(null, state) bindApi(hook, state) return hook } var collectionHookDeprecationMessageDisplayed = false function Hook () { if (!collectionHookDeprecationMessageDisplayed) { console.warn('[before-after-hook]: "Hook()" repurposing warning, use "Hook.Collection()". Read more: https://git.io/upgrade-before-after-hook-to-1.4') collectionHookDeprecationMessageDisplayed = true } return HookCollection() } Hook.Singular = HookSingular.bind() Hook.Collection = HookCollection.bind() module.exports = Hook // expose constructors as a named property for TypeScript module.exports.Hook = Hook module.exports.Singular = Hook.Singular module.exports.Collection = Hook.Collection /***/ }), /***/ 82446: /***/ ((module) => { module.exports = addHook function addHook (state, kind, name, hook) { var orig = hook if (!state.registry[name]) { state.registry[name] = [] } if (kind === 'before') { hook = function (method, options) { return Promise.resolve() .then(orig.bind(null, options)) .then(method.bind(null, options)) } } if (kind === 'after') { hook = function (method, options) { var result return Promise.resolve() .then(method.bind(null, options)) .then(function (result_) { result = result_ return orig(result, options) }) .then(function () { return result }) } } if (kind === 'error') { hook = function (method, options) { return Promise.resolve() .then(method.bind(null, options)) .catch(function (error) { return orig(error, options) }) } } state.registry[name].push({ hook: hook, orig: orig }) } /***/ }), /***/ 27798: /***/ ((module) => { module.exports = register function register (state, name, method, options) { if (typeof method !== 'function') { throw new Error('method for before hook must be a function') } if (!options) { options = {} } if (Array.isArray(name)) { return name.reverse().reduce(function (callback, name) { return register.bind(null, state, name, callback, options) }, method)() } return Promise.resolve() .then(function () { if (!state.registry[name]) { return method(options) } return (state.registry[name]).reduce(function (method, registered) { return registered.hook.bind(null, method, options) }, method)() }) } /***/ }), /***/ 16436: /***/ ((module) => { module.exports = removeHook function removeHook (state, name, method) { if (!state.registry[name]) { return } var index = state.registry[name] .map(function (registered) { return registered.orig }) .indexOf(method) if (index === -1) { return } state.registry[name].splice(index, 1) } /***/ }), /***/ 66616: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; const { Buffer } = __webpack_require__(64293) const symbol = Symbol.for('BufferList') function BufferList (buf) { if (!(this instanceof BufferList)) { return new BufferList(buf) } BufferList._init.call(this, buf) } BufferList._init = function _init (buf) { Object.defineProperty(this, symbol, { value: true }) this._bufs = [] this.length = 0 if (buf) { this.append(buf) } } BufferList.prototype._new = function _new (buf) { return new BufferList(buf) } BufferList.prototype._offset = function _offset (offset) { if (offset === 0) { return [0, 0] } let tot = 0 for (let i = 0; i < this._bufs.length; i++) { const _t = tot + this._bufs[i].length if (offset < _t || i === this._bufs.length - 1) { return [i, offset - tot] } tot = _t } } BufferList.prototype._reverseOffset = function (blOffset) { const bufferId = blOffset[0] let offset = blOffset[1] for (let i = 0; i < bufferId; i++) { offset += this._bufs[i].length } return offset } BufferList.prototype.get = function get (index) { if (index > this.length || index < 0) { return undefined } const offset = this._offset(index) return this._bufs[offset[0]][offset[1]] } BufferList.prototype.slice = function slice (start, end) { if (typeof start === 'number' && start < 0) { start += this.length } if (typeof end === 'number' && end < 0) { end += this.length } return this.copy(null, 0, start, end) } BufferList.prototype.copy = function copy (dst, dstStart, srcStart, srcEnd) { if (typeof srcStart !== 'number' || srcStart < 0) { srcStart = 0 } if (typeof srcEnd !== 'number' || srcEnd > this.length) { srcEnd = this.length } if (srcStart >= this.length) { return dst || Buffer.alloc(0) } if (srcEnd <= 0) { return dst || Buffer.alloc(0) } const copy = !!dst const off = this._offset(srcStart) const len = srcEnd - srcStart let bytes = len let bufoff = (copy && dstStart) || 0 let start = off[1] // copy/slice everything if (srcStart === 0 && srcEnd === this.length) { if (!copy) { // slice, but full concat if multiple buffers return this._bufs.length === 1 ? this._bufs[0] : Buffer.concat(this._bufs, this.length) } // copy, need to copy individual buffers for (let i = 0; i < this._bufs.length; i++) { this._bufs[i].copy(dst, bufoff) bufoff += this._bufs[i].length } return dst } // easy, cheap case where it's a subset of one of the buffers if (bytes <= this._bufs[off[0]].length - start) { return copy ? this._bufs[off[0]].copy(dst, dstStart, start, start + bytes) : this._bufs[off[0]].slice(start, start + bytes) } if (!copy) { // a slice, we need something to copy in to dst = Buffer.allocUnsafe(len) } for (let i = off[0]; i < this._bufs.length; i++) { const l = this._bufs[i].length - start if (bytes > l) { this._bufs[i].copy(dst, bufoff, start) bufoff += l } else { this._bufs[i].copy(dst, bufoff, start, start + bytes) bufoff += l break } bytes -= l if (start) { start = 0 } } // safeguard so that we don't return uninitialized memory if (dst.length > bufoff) return dst.slice(0, bufoff) return dst } BufferList.prototype.shallowSlice = function shallowSlice (start, end) { start = start || 0 end = typeof end !== 'number' ? this.length : end if (start < 0) { start += this.length } if (end < 0) { end += this.length } if (start === end) { return this._new() } const startOffset = this._offset(start) const endOffset = this._offset(end) const buffers = this._bufs.slice(startOffset[0], endOffset[0] + 1) if (endOffset[1] === 0) { buffers.pop() } else { buffers[buffers.length - 1] = buffers[buffers.length - 1].slice(0, endOffset[1]) } if (startOffset[1] !== 0) { buffers[0] = buffers[0].slice(startOffset[1]) } return this._new(buffers) } BufferList.prototype.toString = function toString (encoding, start, end) { return this.slice(start, end).toString(encoding) } BufferList.prototype.consume = function consume (bytes) { // first, normalize the argument, in accordance with how Buffer does it bytes = Math.trunc(bytes) // do nothing if not a positive number if (Number.isNaN(bytes) || bytes <= 0) return this while (this._bufs.length) { if (bytes >= this._bufs[0].length) { bytes -= this._bufs[0].length this.length -= this._bufs[0].length this._bufs.shift() } else { this._bufs[0] = this._bufs[0].slice(bytes) this.length -= bytes break } } return this } BufferList.prototype.duplicate = function duplicate () { const copy = this._new() for (let i = 0; i < this._bufs.length; i++) { copy.append(this._bufs[i]) } return copy } BufferList.prototype.append = function append (buf) { if (buf == null) { return this } if (buf.buffer) { // append a view of the underlying ArrayBuffer this._appendBuffer(Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength)) } else if (Array.isArray(buf)) { for (let i = 0; i < buf.length; i++) { this.append(buf[i]) } } else if (this._isBufferList(buf)) { // unwrap argument into individual BufferLists for (let i = 0; i < buf._bufs.length; i++) { this.append(buf._bufs[i]) } } else { // coerce number arguments to strings, since Buffer(number) does // uninitialized memory allocation if (typeof buf === 'number') { buf = buf.toString() } this._appendBuffer(Buffer.from(buf)) } return this } BufferList.prototype._appendBuffer = function appendBuffer (buf) { this._bufs.push(buf) this.length += buf.length } BufferList.prototype.indexOf = function (search, offset, encoding) { if (encoding === undefined && typeof offset === 'string') { encoding = offset offset = undefined } if (typeof search === 'function' || Array.isArray(search)) { throw new TypeError('The "value" argument must be one of type string, Buffer, BufferList, or Uint8Array.') } else if (typeof search === 'number') { search = Buffer.from([search]) } else if (typeof search === 'string') { search = Buffer.from(search, encoding) } else if (this._isBufferList(search)) { search = search.slice() } else if (Array.isArray(search.buffer)) { search = Buffer.from(search.buffer, search.byteOffset, search.byteLength) } else if (!Buffer.isBuffer(search)) { search = Buffer.from(search) } offset = Number(offset || 0) if (isNaN(offset)) { offset = 0 } if (offset < 0) { offset = this.length + offset } if (offset < 0) { offset = 0 } if (search.length === 0) { return offset > this.length ? this.length : offset } const blOffset = this._offset(offset) let blIndex = blOffset[0] // index of which internal buffer we're working on let buffOffset = blOffset[1] // offset of the internal buffer we're working on // scan over each buffer for (; blIndex < this._bufs.length; blIndex++) { const buff = this._bufs[blIndex] while (buffOffset < buff.length) { const availableWindow = buff.length - buffOffset if (availableWindow >= search.length) { const nativeSearchResult = buff.indexOf(search, buffOffset) if (nativeSearchResult !== -1) { return this._reverseOffset([blIndex, nativeSearchResult]) } buffOffset = buff.length - search.length + 1 // end of native search window } else { const revOffset = this._reverseOffset([blIndex, buffOffset]) if (this._match(revOffset, search)) { return revOffset } buffOffset++ } } buffOffset = 0 } return -1 } BufferList.prototype._match = function (offset, search) { if (this.length - offset < search.length) { return false } for (let searchOffset = 0; searchOffset < search.length; searchOffset++) { if (this.get(offset + searchOffset) !== search[searchOffset]) { return false } } return true } ;(function () { const methods = { readDoubleBE: 8, readDoubleLE: 8, readFloatBE: 4, readFloatLE: 4, readInt32BE: 4, readInt32LE: 4, readUInt32BE: 4, readUInt32LE: 4, readInt16BE: 2, readInt16LE: 2, readUInt16BE: 2, readUInt16LE: 2, readInt8: 1, readUInt8: 1, readIntBE: null, readIntLE: null, readUIntBE: null, readUIntLE: null } for (const m in methods) { (function (m) { if (methods[m] === null) { BufferList.prototype[m] = function (offset, byteLength) { return this.slice(offset, offset + byteLength)[m](0, byteLength) } } else { BufferList.prototype[m] = function (offset) { return this.slice(offset, offset + methods[m])[m](0) } } }(m)) } }()) // Used internally by the class and also as an indicator of this object being // a `BufferList`. It's not possible to use `instanceof BufferList` in a browser // environment because there could be multiple different copies of the // BufferList class and some `BufferList`s might be `BufferList`s. BufferList.prototype._isBufferList = function _isBufferList (b) { return b instanceof BufferList || BufferList.isBufferList(b) } BufferList.isBufferList = function isBufferList (b) { return b != null && b[symbol] } module.exports = BufferList /***/ }), /***/ 96986: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; const DuplexStream = __webpack_require__(30009).Duplex const inherits = __webpack_require__(94835) const BufferList = __webpack_require__(66616) function BufferListStream (callback) { if (!(this instanceof BufferListStream)) { return new BufferListStream(callback) } if (typeof callback === 'function') { this._callback = callback const piper = function piper (err) { if (this._callback) { this._callback(err) this._callback = null } }.bind(this) this.on('pipe', function onPipe (src) { src.on('error', piper) }) this.on('unpipe', function onUnpipe (src) { src.removeListener('error', piper) }) callback = null } BufferList._init.call(this, callback) DuplexStream.call(this) } inherits(BufferListStream, DuplexStream) Object.assign(BufferListStream.prototype, BufferList.prototype) BufferListStream.prototype._new = function _new (callback) { return new BufferListStream(callback) } BufferListStream.prototype._write = function _write (buf, encoding, callback) { this._appendBuffer(buf) if (typeof callback === 'function') { callback() } } BufferListStream.prototype._read = function _read (size) { if (!this.length) { return this.push(null) } size = Math.min(size, this.length) this.push(this.slice(0, size)) this.consume(size) } BufferListStream.prototype.end = function end (chunk) { DuplexStream.prototype.end.call(this, chunk) if (this._callback) { this._callback(null, this.slice()) this._callback = null } } BufferListStream.prototype._destroy = function _destroy (err, cb) { this._bufs.length = 0 this.length = 0 cb(err) } BufferListStream.prototype._isBufferList = function _isBufferList (b) { return b instanceof BufferListStream || b instanceof BufferList || BufferListStream.isBufferList(b) } BufferListStream.isBufferList = BufferList.isBufferList module.exports = BufferListStream module.exports.BufferListStream = BufferListStream module.exports.BufferList = BufferList /***/ }), /***/ 94835: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { try { var util = __webpack_require__(31669); /* istanbul ignore next */ if (typeof util.inherits !== 'function') throw ''; module.exports = util.inherits; } catch (e) { /* istanbul ignore next */ module.exports = __webpack_require__(72739); } /***/ }), /***/ 72739: /***/ ((module) => { if (typeof Object.create === 'function') { // implementation from standard node.js 'util' module module.exports = function inherits(ctor, superCtor) { if (superCtor) { ctor.super_ = superCtor ctor.prototype = Object.create(superCtor.prototype, { constructor: { value: ctor, enumerable: false, writable: true, configurable: true } }) } }; } else { // old school shim for old browsers module.exports = function inherits(ctor, superCtor) { if (superCtor) { ctor.super_ = superCtor var TempCtor = function () {} TempCtor.prototype = superCtor.prototype ctor.prototype = new TempCtor() ctor.prototype.constructor = ctor } } } /***/ }), /***/ 71947: /***/ ((module) => { "use strict"; const codes = {}; function createErrorType(code, message, Base) { if (!Base) { Base = Error } function getMessage (arg1, arg2, arg3) { if (typeof message === 'string') { return message } else { return message(arg1, arg2, arg3) } } class NodeError extends Base { constructor (arg1, arg2, arg3) { super(getMessage(arg1, arg2, arg3)); } } NodeError.prototype.name = Base.name; NodeError.prototype.code = code; codes[code] = NodeError; } // https://github.com/nodejs/node/blob/v10.8.0/lib/internal/errors.js function oneOf(expected, thing) { if (Array.isArray(expected)) { const len = expected.length; expected = expected.map((i) => String(i)); if (len > 2) { return `one of ${thing} ${expected.slice(0, len - 1).join(', ')}, or ` + expected[len - 1]; } else if (len === 2) { return `one of ${thing} ${expected[0]} or ${expected[1]}`; } else { return `of ${thing} ${expected[0]}`; } } else { return `of ${thing} ${String(expected)}`; } } // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith function startsWith(str, search, pos) { return str.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search; } // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith function endsWith(str, search, this_len) { if (this_len === undefined || this_len > str.length) { this_len = str.length; } return str.substring(this_len - search.length, this_len) === search; } // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes function includes(str, search, start) { if (typeof start !== 'number') { start = 0; } if (start + search.length > str.length) { return false; } else { return str.indexOf(search, start) !== -1; } } createErrorType('ERR_INVALID_OPT_VALUE', function (name, value) { return 'The value "' + value + '" is invalid for option "' + name + '"' }, TypeError); createErrorType('ERR_INVALID_ARG_TYPE', function (name, expected, actual) { // determiner: 'must be' or 'must not be' let determiner; if (typeof expected === 'string' && startsWith(expected, 'not ')) { determiner = 'must not be'; expected = expected.replace(/^not /, ''); } else { determiner = 'must be'; } let msg; if (endsWith(name, ' argument')) { // For cases like 'first argument' msg = `The ${name} ${determiner} ${oneOf(expected, 'type')}`; } else { const type = includes(name, '.') ? 'property' : 'argument'; msg = `The "${name}" ${type} ${determiner} ${oneOf(expected, 'type')}`; } msg += `. Received type ${typeof actual}`; return msg; }, TypeError); createErrorType('ERR_STREAM_PUSH_AFTER_EOF', 'stream.push() after EOF'); createErrorType('ERR_METHOD_NOT_IMPLEMENTED', function (name) { return 'The ' + name + ' method is not implemented' }); createErrorType('ERR_STREAM_PREMATURE_CLOSE', 'Premature close'); createErrorType('ERR_STREAM_DESTROYED', function (name) { return 'Cannot call ' + name + ' after a stream was destroyed'; }); createErrorType('ERR_MULTIPLE_CALLBACK', 'Callback called multiple times'); createErrorType('ERR_STREAM_CANNOT_PIPE', 'Cannot pipe, not readable'); createErrorType('ERR_STREAM_WRITE_AFTER_END', 'write after end'); createErrorType('ERR_STREAM_NULL_VALUES', 'May not write null values to stream', TypeError); createErrorType('ERR_UNKNOWN_ENCODING', function (arg) { return 'Unknown encoding: ' + arg }, TypeError); createErrorType('ERR_STREAM_UNSHIFT_AFTER_END_EVENT', 'stream.unshift() after end event'); module.exports.q = codes; /***/ }), /***/ 18084: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. // a duplex stream is just a stream that is both readable and writable. // Since JS doesn't have multiple prototypal inheritance, this class // prototypally inherits from Readable, and then parasitically from // Writable. /**/ var objectKeys = Object.keys || function (obj) { var keys = []; for (var key in obj) { keys.push(key); } return keys; }; /**/ module.exports = Duplex; var Readable = __webpack_require__(11864); var Writable = __webpack_require__(92042); __webpack_require__(94835)(Duplex, Readable); { // Allow the keys array to be GC'ed. var keys = objectKeys(Writable.prototype); for (var v = 0; v < keys.length; v++) { var method = keys[v]; if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; } } function Duplex(options) { if (!(this instanceof Duplex)) return new Duplex(options); Readable.call(this, options); Writable.call(this, options); this.allowHalfOpen = true; if (options) { if (options.readable === false) this.readable = false; if (options.writable === false) this.writable = false; if (options.allowHalfOpen === false) { this.allowHalfOpen = false; this.once('end', onend); } } } Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail enumerable: false, get: function get() { return this._writableState.highWaterMark; } }); Object.defineProperty(Duplex.prototype, 'writableBuffer', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail enumerable: false, get: function get() { return this._writableState && this._writableState.getBuffer(); } }); Object.defineProperty(Duplex.prototype, 'writableLength', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail enumerable: false, get: function get() { return this._writableState.length; } }); // the no-half-open enforcer function onend() { // If the writable side ended, then we're ok. if (this._writableState.ended) return; // no more data can be written. // But allow more writes to happen in this tick. process.nextTick(onEndNT, this); } function onEndNT(self) { self.end(); } Object.defineProperty(Duplex.prototype, 'destroyed', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail enumerable: false, get: function get() { if (this._readableState === undefined || this._writableState === undefined) { return false; } return this._readableState.destroyed && this._writableState.destroyed; }, set: function set(value) { // we ignore the value if the stream // has not been initialized yet if (this._readableState === undefined || this._writableState === undefined) { return; } // backward compatibility, the user is explicitly // managing destroyed this._readableState.destroyed = value; this._writableState.destroyed = value; } }); /***/ }), /***/ 11798: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. // a passthrough stream. // basically just the most minimal sort of Transform stream. // Every written chunk gets output as-is. module.exports = PassThrough; var Transform = __webpack_require__(57173); __webpack_require__(94835)(PassThrough, Transform); function PassThrough(options) { if (!(this instanceof PassThrough)) return new PassThrough(options); Transform.call(this, options); } PassThrough.prototype._transform = function (chunk, encoding, cb) { cb(null, chunk); }; /***/ }), /***/ 11864: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. module.exports = Readable; /**/ var Duplex; /**/ Readable.ReadableState = ReadableState; /**/ var EE = __webpack_require__(28614).EventEmitter; var EElistenerCount = function EElistenerCount(emitter, type) { return emitter.listeners(type).length; }; /**/ /**/ var Stream = __webpack_require__(47640); /**/ var Buffer = __webpack_require__(64293).Buffer; var OurUint8Array = global.Uint8Array || function () {}; function _uint8ArrayToBuffer(chunk) { return Buffer.from(chunk); } function _isUint8Array(obj) { return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; } /**/ var debugUtil = __webpack_require__(31669); var debug; if (debugUtil && debugUtil.debuglog) { debug = debugUtil.debuglog('stream'); } else { debug = function debug() {}; } /**/ var BufferList = __webpack_require__(38568); var destroyImpl = __webpack_require__(22126); var _require = __webpack_require__(14286), getHighWaterMark = _require.getHighWaterMark; var _require$codes = __webpack_require__(71947)/* .codes */ .q, ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE, ERR_STREAM_PUSH_AFTER_EOF = _require$codes.ERR_STREAM_PUSH_AFTER_EOF, ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, ERR_STREAM_UNSHIFT_AFTER_END_EVENT = _require$codes.ERR_STREAM_UNSHIFT_AFTER_END_EVENT; // Lazy loaded to improve the startup performance. var StringDecoder; var createReadableStreamAsyncIterator; var from; __webpack_require__(94835)(Readable, Stream); var errorOrDestroy = destroyImpl.errorOrDestroy; var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; function prependListener(emitter, event, fn) { // Sadly this is not cacheable as some libraries bundle their own // event emitter implementation with them. if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); // This is a hack to make sure that our error handler is attached before any // userland ones. NEVER DO THIS. This is here only because this code needs // to continue to work with older versions of Node.js that do not include // the prependListener() method. The goal is to eventually remove this hack. if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (Array.isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; } function ReadableState(options, stream, isDuplex) { Duplex = Duplex || __webpack_require__(18084); options = options || {}; // Duplex streams are both readable and writable, but share // the same options object. // However, some cases require setting options to different // values for the readable and the writable sides of the duplex stream. // These options can be provided separately as readableXXX and writableXXX. if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex; // object stream flag. Used to make read(n) ignore n and to // make all the buffer merging and length checks go away this.objectMode = !!options.objectMode; if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; // the point at which it stops calling _read() to fill the buffer // Note: 0 is a valid value, means "don't call _read preemptively ever" this.highWaterMark = getHighWaterMark(this, options, 'readableHighWaterMark', isDuplex); // A linked list is used to store data chunks instead of an array because the // linked list can remove elements from the beginning faster than // array.shift() this.buffer = new BufferList(); this.length = 0; this.pipes = null; this.pipesCount = 0; this.flowing = null; this.ended = false; this.endEmitted = false; this.reading = false; // a flag to be able to tell if the event 'readable'/'data' is emitted // immediately, or on a later tick. We set this to true at first, because // any actions that shouldn't happen until "later" should generally also // not happen before the first read call. this.sync = true; // whenever we return null, then we set a flag to say // that we're awaiting a 'readable' event emission. this.needReadable = false; this.emittedReadable = false; this.readableListening = false; this.resumeScheduled = false; this.paused = true; // Should close be emitted on destroy. Defaults to true. this.emitClose = options.emitClose !== false; // Should .destroy() be called after 'end' (and potentially 'finish') this.autoDestroy = !!options.autoDestroy; // has it been destroyed this.destroyed = false; // Crypto is kind of old and crusty. Historically, its default string // encoding is 'binary' so we have to make this configurable. // Everything else in the universe uses 'utf8', though. this.defaultEncoding = options.defaultEncoding || 'utf8'; // the number of writers that are awaiting a drain event in .pipe()s this.awaitDrain = 0; // if true, a maybeReadMore has been scheduled this.readingMore = false; this.decoder = null; this.encoding = null; if (options.encoding) { if (!StringDecoder) StringDecoder = __webpack_require__(84882)/* .StringDecoder */ .s; this.decoder = new StringDecoder(options.encoding); this.encoding = options.encoding; } } function Readable(options) { Duplex = Duplex || __webpack_require__(18084); if (!(this instanceof Readable)) return new Readable(options); // Checking for a Stream.Duplex instance is faster here instead of inside // the ReadableState constructor, at least with V8 6.5 var isDuplex = this instanceof Duplex; this._readableState = new ReadableState(options, this, isDuplex); // legacy this.readable = true; if (options) { if (typeof options.read === 'function') this._read = options.read; if (typeof options.destroy === 'function') this._destroy = options.destroy; } Stream.call(this); } Object.defineProperty(Readable.prototype, 'destroyed', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail enumerable: false, get: function get() { if (this._readableState === undefined) { return false; } return this._readableState.destroyed; }, set: function set(value) { // we ignore the value if the stream // has not been initialized yet if (!this._readableState) { return; } // backward compatibility, the user is explicitly // managing destroyed this._readableState.destroyed = value; } }); Readable.prototype.destroy = destroyImpl.destroy; Readable.prototype._undestroy = destroyImpl.undestroy; Readable.prototype._destroy = function (err, cb) { cb(err); }; // Manually shove something into the read() buffer. // This returns true if the highWaterMark has not been hit yet, // similar to how Writable.write() returns true if you should // write() some more. Readable.prototype.push = function (chunk, encoding) { var state = this._readableState; var skipChunkCheck; if (!state.objectMode) { if (typeof chunk === 'string') { encoding = encoding || state.defaultEncoding; if (encoding !== state.encoding) { chunk = Buffer.from(chunk, encoding); encoding = ''; } skipChunkCheck = true; } } else { skipChunkCheck = true; } return readableAddChunk(this, chunk, encoding, false, skipChunkCheck); }; // Unshift should *always* be something directly out of read() Readable.prototype.unshift = function (chunk) { return readableAddChunk(this, chunk, null, true, false); }; function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { debug('readableAddChunk', chunk); var state = stream._readableState; if (chunk === null) { state.reading = false; onEofChunk(stream, state); } else { var er; if (!skipChunkCheck) er = chunkInvalid(state, chunk); if (er) { errorOrDestroy(stream, er); } else if (state.objectMode || chunk && chunk.length > 0) { if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) { chunk = _uint8ArrayToBuffer(chunk); } if (addToFront) { if (state.endEmitted) errorOrDestroy(stream, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT());else addChunk(stream, state, chunk, true); } else if (state.ended) { errorOrDestroy(stream, new ERR_STREAM_PUSH_AFTER_EOF()); } else if (state.destroyed) { return false; } else { state.reading = false; if (state.decoder && !encoding) { chunk = state.decoder.write(chunk); if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state); } else { addChunk(stream, state, chunk, false); } } } else if (!addToFront) { state.reading = false; maybeReadMore(stream, state); } } // We can push more data if we are below the highWaterMark. // Also, if we have no data yet, we can stand some more bytes. // This is to work around cases where hwm=0, such as the repl. return !state.ended && (state.length < state.highWaterMark || state.length === 0); } function addChunk(stream, state, chunk, addToFront) { if (state.flowing && state.length === 0 && !state.sync) { state.awaitDrain = 0; stream.emit('data', chunk); } else { // update the buffer info. state.length += state.objectMode ? 1 : chunk.length; if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); if (state.needReadable) emitReadable(stream); } maybeReadMore(stream, state); } function chunkInvalid(state, chunk) { var er; if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer', 'Uint8Array'], chunk); } return er; } Readable.prototype.isPaused = function () { return this._readableState.flowing === false; }; // backwards compatibility. Readable.prototype.setEncoding = function (enc) { if (!StringDecoder) StringDecoder = __webpack_require__(84882)/* .StringDecoder */ .s; var decoder = new StringDecoder(enc); this._readableState.decoder = decoder; // If setEncoding(null), decoder.encoding equals utf8 this._readableState.encoding = this._readableState.decoder.encoding; // Iterate over current buffer to convert already stored Buffers: var p = this._readableState.buffer.head; var content = ''; while (p !== null) { content += decoder.write(p.data); p = p.next; } this._readableState.buffer.clear(); if (content !== '') this._readableState.buffer.push(content); this._readableState.length = content.length; return this; }; // Don't raise the hwm > 1GB var MAX_HWM = 0x40000000; function computeNewHighWaterMark(n) { if (n >= MAX_HWM) { // TODO(ronag): Throw ERR_VALUE_OUT_OF_RANGE. n = MAX_HWM; } else { // Get the next highest power of 2 to prevent increasing hwm excessively in // tiny amounts n--; n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; n |= n >>> 16; n++; } return n; } // This function is designed to be inlinable, so please take care when making // changes to the function body. function howMuchToRead(n, state) { if (n <= 0 || state.length === 0 && state.ended) return 0; if (state.objectMode) return 1; if (n !== n) { // Only flow one buffer at a time if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; } // If we're asking for more than the current hwm, then raise the hwm. if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); if (n <= state.length) return n; // Don't have enough if (!state.ended) { state.needReadable = true; return 0; } return state.length; } // you can override either this method, or the async _read(n) below. Readable.prototype.read = function (n) { debug('read', n); n = parseInt(n, 10); var state = this._readableState; var nOrig = n; if (n !== 0) state.emittedReadable = false; // if we're doing read(0) to trigger a readable event, but we // already have a bunch of data in the buffer, then just trigger // the 'readable' event and move on. if (n === 0 && state.needReadable && ((state.highWaterMark !== 0 ? state.length >= state.highWaterMark : state.length > 0) || state.ended)) { debug('read: emitReadable', state.length, state.ended); if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); return null; } n = howMuchToRead(n, state); // if we've ended, and we're now clear, then finish it up. if (n === 0 && state.ended) { if (state.length === 0) endReadable(this); return null; } // All the actual chunk generation logic needs to be // *below* the call to _read. The reason is that in certain // synthetic stream cases, such as passthrough streams, _read // may be a completely synchronous operation which may change // the state of the read buffer, providing enough data when // before there was *not* enough. // // So, the steps are: // 1. Figure out what the state of things will be after we do // a read from the buffer. // // 2. If that resulting state will trigger a _read, then call _read. // Note that this may be asynchronous, or synchronous. Yes, it is // deeply ugly to write APIs this way, but that still doesn't mean // that the Readable class should behave improperly, as streams are // designed to be sync/async agnostic. // Take note if the _read call is sync or async (ie, if the read call // has returned yet), so that we know whether or not it's safe to emit // 'readable' etc. // // 3. Actually pull the requested chunks out of the buffer and return. // if we need a readable event, then we need to do some reading. var doRead = state.needReadable; debug('need readable', doRead); // if we currently have less than the highWaterMark, then also read some if (state.length === 0 || state.length - n < state.highWaterMark) { doRead = true; debug('length less than watermark', doRead); } // however, if we've ended, then there's no point, and if we're already // reading, then it's unnecessary. if (state.ended || state.reading) { doRead = false; debug('reading or ended', doRead); } else if (doRead) { debug('do read'); state.reading = true; state.sync = true; // if the length is currently zero, then we *need* a readable event. if (state.length === 0) state.needReadable = true; // call internal read method this._read(state.highWaterMark); state.sync = false; // If _read pushed data synchronously, then `reading` will be false, // and we need to re-evaluate how much data we can return to the user. if (!state.reading) n = howMuchToRead(nOrig, state); } var ret; if (n > 0) ret = fromList(n, state);else ret = null; if (ret === null) { state.needReadable = state.length <= state.highWaterMark; n = 0; } else { state.length -= n; state.awaitDrain = 0; } if (state.length === 0) { // If we have nothing in the buffer, then we want to know // as soon as we *do* get something into the buffer. if (!state.ended) state.needReadable = true; // If we tried to read() past the EOF, then emit end on the next tick. if (nOrig !== n && state.ended) endReadable(this); } if (ret !== null) this.emit('data', ret); return ret; }; function onEofChunk(stream, state) { debug('onEofChunk'); if (state.ended) return; if (state.decoder) { var chunk = state.decoder.end(); if (chunk && chunk.length) { state.buffer.push(chunk); state.length += state.objectMode ? 1 : chunk.length; } } state.ended = true; if (state.sync) { // if we are sync, wait until next tick to emit the data. // Otherwise we risk emitting data in the flow() // the readable code triggers during a read() call emitReadable(stream); } else { // emit 'readable' now to make sure it gets picked up. state.needReadable = false; if (!state.emittedReadable) { state.emittedReadable = true; emitReadable_(stream); } } } // Don't emit readable right away in sync mode, because this can trigger // another read() call => stack overflow. This way, it might trigger // a nextTick recursion warning, but that's not so bad. function emitReadable(stream) { var state = stream._readableState; debug('emitReadable', state.needReadable, state.emittedReadable); state.needReadable = false; if (!state.emittedReadable) { debug('emitReadable', state.flowing); state.emittedReadable = true; process.nextTick(emitReadable_, stream); } } function emitReadable_(stream) { var state = stream._readableState; debug('emitReadable_', state.destroyed, state.length, state.ended); if (!state.destroyed && (state.length || state.ended)) { stream.emit('readable'); state.emittedReadable = false; } // The stream needs another readable event if // 1. It is not flowing, as the flow mechanism will take // care of it. // 2. It is not ended. // 3. It is below the highWaterMark, so we can schedule // another readable later. state.needReadable = !state.flowing && !state.ended && state.length <= state.highWaterMark; flow(stream); } // at this point, the user has presumably seen the 'readable' event, // and called read() to consume some data. that may have triggered // in turn another _read(n) call, in which case reading = true if // it's in progress. // However, if we're not ended, or reading, and the length < hwm, // then go ahead and try to read some more preemptively. function maybeReadMore(stream, state) { if (!state.readingMore) { state.readingMore = true; process.nextTick(maybeReadMore_, stream, state); } } function maybeReadMore_(stream, state) { // Attempt to read more data if we should. // // The conditions for reading more data are (one of): // - Not enough data buffered (state.length < state.highWaterMark). The loop // is responsible for filling the buffer with enough data if such data // is available. If highWaterMark is 0 and we are not in the flowing mode // we should _not_ attempt to buffer any extra data. We'll get more data // when the stream consumer calls read() instead. // - No data in the buffer, and the stream is in flowing mode. In this mode // the loop below is responsible for ensuring read() is called. Failing to // call read here would abort the flow and there's no other mechanism for // continuing the flow if the stream consumer has just subscribed to the // 'data' event. // // In addition to the above conditions to keep reading data, the following // conditions prevent the data from being read: // - The stream has ended (state.ended). // - There is already a pending 'read' operation (state.reading). This is a // case where the the stream has called the implementation defined _read() // method, but they are processing the call asynchronously and have _not_ // called push() with new data. In this case we skip performing more // read()s. The execution ends in this method again after the _read() ends // up calling push() with more data. while (!state.reading && !state.ended && (state.length < state.highWaterMark || state.flowing && state.length === 0)) { var len = state.length; debug('maybeReadMore read 0'); stream.read(0); if (len === state.length) // didn't get any data, stop spinning. break; } state.readingMore = false; } // abstract method. to be overridden in specific implementation classes. // call cb(er, data) where data is <= n in length. // for virtual (non-string, non-buffer) streams, "length" is somewhat // arbitrary, and perhaps not very meaningful. Readable.prototype._read = function (n) { errorOrDestroy(this, new ERR_METHOD_NOT_IMPLEMENTED('_read()')); }; Readable.prototype.pipe = function (dest, pipeOpts) { var src = this; var state = this._readableState; switch (state.pipesCount) { case 0: state.pipes = dest; break; case 1: state.pipes = [state.pipes, dest]; break; default: state.pipes.push(dest); break; } state.pipesCount += 1; debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; var endFn = doEnd ? onend : unpipe; if (state.endEmitted) process.nextTick(endFn);else src.once('end', endFn); dest.on('unpipe', onunpipe); function onunpipe(readable, unpipeInfo) { debug('onunpipe'); if (readable === src) { if (unpipeInfo && unpipeInfo.hasUnpiped === false) { unpipeInfo.hasUnpiped = true; cleanup(); } } } function onend() { debug('onend'); dest.end(); } // when the dest drains, it reduces the awaitDrain counter // on the source. This would be more elegant with a .once() // handler in flow(), but adding and removing repeatedly is // too slow. var ondrain = pipeOnDrain(src); dest.on('drain', ondrain); var cleanedUp = false; function cleanup() { debug('cleanup'); // cleanup event handlers once the pipe is broken dest.removeListener('close', onclose); dest.removeListener('finish', onfinish); dest.removeListener('drain', ondrain); dest.removeListener('error', onerror); dest.removeListener('unpipe', onunpipe); src.removeListener('end', onend); src.removeListener('end', unpipe); src.removeListener('data', ondata); cleanedUp = true; // if the reader is waiting for a drain event from this // specific writer, then it would cause it to never start // flowing again. // So, if this is awaiting a drain, then we just call it now. // If we don't know, then assume that we are waiting for one. if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); } src.on('data', ondata); function ondata(chunk) { debug('ondata'); var ret = dest.write(chunk); debug('dest.write', ret); if (ret === false) { // If the user unpiped during `dest.write()`, it is possible // to get stuck in a permanently paused state if that write // also returned false. // => Check whether `dest` is still a piping destination. if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { debug('false write response, pause', state.awaitDrain); state.awaitDrain++; } src.pause(); } } // if the dest has an error, then stop piping into it. // however, don't suppress the throwing behavior for this. function onerror(er) { debug('onerror', er); unpipe(); dest.removeListener('error', onerror); if (EElistenerCount(dest, 'error') === 0) errorOrDestroy(dest, er); } // Make sure our error handler is attached before userland ones. prependListener(dest, 'error', onerror); // Both close and finish should trigger unpipe, but only once. function onclose() { dest.removeListener('finish', onfinish); unpipe(); } dest.once('close', onclose); function onfinish() { debug('onfinish'); dest.removeListener('close', onclose); unpipe(); } dest.once('finish', onfinish); function unpipe() { debug('unpipe'); src.unpipe(dest); } // tell the dest that it's being piped to dest.emit('pipe', src); // start the flow if it hasn't been started already. if (!state.flowing) { debug('pipe resume'); src.resume(); } return dest; }; function pipeOnDrain(src) { return function pipeOnDrainFunctionResult() { var state = src._readableState; debug('pipeOnDrain', state.awaitDrain); if (state.awaitDrain) state.awaitDrain--; if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { state.flowing = true; flow(src); } }; } Readable.prototype.unpipe = function (dest) { var state = this._readableState; var unpipeInfo = { hasUnpiped: false }; // if we're not piping anywhere, then do nothing. if (state.pipesCount === 0) return this; // just one destination. most common case. if (state.pipesCount === 1) { // passed in one, but it's not the right one. if (dest && dest !== state.pipes) return this; if (!dest) dest = state.pipes; // got a match. state.pipes = null; state.pipesCount = 0; state.flowing = false; if (dest) dest.emit('unpipe', this, unpipeInfo); return this; } // slow case. multiple pipe destinations. if (!dest) { // remove all. var dests = state.pipes; var len = state.pipesCount; state.pipes = null; state.pipesCount = 0; state.flowing = false; for (var i = 0; i < len; i++) { dests[i].emit('unpipe', this, { hasUnpiped: false }); } return this; } // try to find the right one. var index = indexOf(state.pipes, dest); if (index === -1) return this; state.pipes.splice(index, 1); state.pipesCount -= 1; if (state.pipesCount === 1) state.pipes = state.pipes[0]; dest.emit('unpipe', this, unpipeInfo); return this; }; // set up data events if they are asked for // Ensure readable listeners eventually get something Readable.prototype.on = function (ev, fn) { var res = Stream.prototype.on.call(this, ev, fn); var state = this._readableState; if (ev === 'data') { // update readableListening so that resume() may be a no-op // a few lines down. This is needed to support once('readable'). state.readableListening = this.listenerCount('readable') > 0; // Try start flowing on next tick if stream isn't explicitly paused if (state.flowing !== false) this.resume(); } else if (ev === 'readable') { if (!state.endEmitted && !state.readableListening) { state.readableListening = state.needReadable = true; state.flowing = false; state.emittedReadable = false; debug('on readable', state.length, state.reading); if (state.length) { emitReadable(this); } else if (!state.reading) { process.nextTick(nReadingNextTick, this); } } } return res; }; Readable.prototype.addListener = Readable.prototype.on; Readable.prototype.removeListener = function (ev, fn) { var res = Stream.prototype.removeListener.call(this, ev, fn); if (ev === 'readable') { // We need to check if there is someone still listening to // readable and reset the state. However this needs to happen // after readable has been emitted but before I/O (nextTick) to // support once('readable', fn) cycles. This means that calling // resume within the same tick will have no // effect. process.nextTick(updateReadableListening, this); } return res; }; Readable.prototype.removeAllListeners = function (ev) { var res = Stream.prototype.removeAllListeners.apply(this, arguments); if (ev === 'readable' || ev === undefined) { // We need to check if there is someone still listening to // readable and reset the state. However this needs to happen // after readable has been emitted but before I/O (nextTick) to // support once('readable', fn) cycles. This means that calling // resume within the same tick will have no // effect. process.nextTick(updateReadableListening, this); } return res; }; function updateReadableListening(self) { var state = self._readableState; state.readableListening = self.listenerCount('readable') > 0; if (state.resumeScheduled && !state.paused) { // flowing needs to be set to true now, otherwise // the upcoming resume will not flow. state.flowing = true; // crude way to check if we should resume } else if (self.listenerCount('data') > 0) { self.resume(); } } function nReadingNextTick(self) { debug('readable nexttick read 0'); self.read(0); } // pause() and resume() are remnants of the legacy readable stream API // If the user uses them, then switch into old mode. Readable.prototype.resume = function () { var state = this._readableState; if (!state.flowing) { debug('resume'); // we flow only if there is no one listening // for readable, but we still have to call // resume() state.flowing = !state.readableListening; resume(this, state); } state.paused = false; return this; }; function resume(stream, state) { if (!state.resumeScheduled) { state.resumeScheduled = true; process.nextTick(resume_, stream, state); } } function resume_(stream, state) { debug('resume', state.reading); if (!state.reading) { stream.read(0); } state.resumeScheduled = false; stream.emit('resume'); flow(stream); if (state.flowing && !state.reading) stream.read(0); } Readable.prototype.pause = function () { debug('call pause flowing=%j', this._readableState.flowing); if (this._readableState.flowing !== false) { debug('pause'); this._readableState.flowing = false; this.emit('pause'); } this._readableState.paused = true; return this; }; function flow(stream) { var state = stream._readableState; debug('flow', state.flowing); while (state.flowing && stream.read() !== null) { ; } } // wrap an old-style stream as the async data source. // This is *not* part of the readable stream interface. // It is an ugly unfortunate mess of history. Readable.prototype.wrap = function (stream) { var _this = this; var state = this._readableState; var paused = false; stream.on('end', function () { debug('wrapped end'); if (state.decoder && !state.ended) { var chunk = state.decoder.end(); if (chunk && chunk.length) _this.push(chunk); } _this.push(null); }); stream.on('data', function (chunk) { debug('wrapped data'); if (state.decoder) chunk = state.decoder.write(chunk); // don't skip over falsy values in objectMode if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; var ret = _this.push(chunk); if (!ret) { paused = true; stream.pause(); } }); // proxy all the other methods. // important when wrapping filters and duplexes. for (var i in stream) { if (this[i] === undefined && typeof stream[i] === 'function') { this[i] = function methodWrap(method) { return function methodWrapReturnFunction() { return stream[method].apply(stream, arguments); }; }(i); } } // proxy certain important events. for (var n = 0; n < kProxyEvents.length; n++) { stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); } // when we try to consume some more bytes, simply unpause the // underlying stream. this._read = function (n) { debug('wrapped _read', n); if (paused) { paused = false; stream.resume(); } }; return this; }; if (typeof Symbol === 'function') { Readable.prototype[Symbol.asyncIterator] = function () { if (createReadableStreamAsyncIterator === undefined) { createReadableStreamAsyncIterator = __webpack_require__(37090); } return createReadableStreamAsyncIterator(this); }; } Object.defineProperty(Readable.prototype, 'readableHighWaterMark', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail enumerable: false, get: function get() { return this._readableState.highWaterMark; } }); Object.defineProperty(Readable.prototype, 'readableBuffer', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail enumerable: false, get: function get() { return this._readableState && this._readableState.buffer; } }); Object.defineProperty(Readable.prototype, 'readableFlowing', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail enumerable: false, get: function get() { return this._readableState.flowing; }, set: function set(state) { if (this._readableState) { this._readableState.flowing = state; } } }); // exposed for testing purposes only. Readable._fromList = fromList; Object.defineProperty(Readable.prototype, 'readableLength', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail enumerable: false, get: function get() { return this._readableState.length; } }); // Pluck off n bytes from an array of buffers. // Length is the combined lengths of all the buffers in the list. // This function is designed to be inlinable, so please take care when making // changes to the function body. function fromList(n, state) { // nothing buffered if (state.length === 0) return null; var ret; if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { // read it all, truncate the list if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.first();else ret = state.buffer.concat(state.length); state.buffer.clear(); } else { // read part of list ret = state.buffer.consume(n, state.decoder); } return ret; } function endReadable(stream) { var state = stream._readableState; debug('endReadable', state.endEmitted); if (!state.endEmitted) { state.ended = true; process.nextTick(endReadableNT, state, stream); } } function endReadableNT(state, stream) { debug('endReadableNT', state.endEmitted, state.length); // Check that we didn't get one last unshift. if (!state.endEmitted && state.length === 0) { state.endEmitted = true; stream.readable = false; stream.emit('end'); if (state.autoDestroy) { // In case of duplex streams we need a way to detect // if the writable side is ready for autoDestroy as well var wState = stream._writableState; if (!wState || wState.autoDestroy && wState.finished) { stream.destroy(); } } } } if (typeof Symbol === 'function') { Readable.from = function (iterable, opts) { if (from === undefined) { from = __webpack_require__(97754); } return from(Readable, iterable, opts); }; } function indexOf(xs, x) { for (var i = 0, l = xs.length; i < l; i++) { if (xs[i] === x) return i; } return -1; } /***/ }), /***/ 57173: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. // a transform stream is a readable/writable stream where you do // something with the data. Sometimes it's called a "filter", // but that's not a great name for it, since that implies a thing where // some bits pass through, and others are simply ignored. (That would // be a valid example of a transform, of course.) // // While the output is causally related to the input, it's not a // necessarily symmetric or synchronous transformation. For example, // a zlib stream might take multiple plain-text writes(), and then // emit a single compressed chunk some time in the future. // // Here's how this works: // // The Transform stream has all the aspects of the readable and writable // stream classes. When you write(chunk), that calls _write(chunk,cb) // internally, and returns false if there's a lot of pending writes // buffered up. When you call read(), that calls _read(n) until // there's enough pending readable data buffered up. // // In a transform stream, the written data is placed in a buffer. When // _read(n) is called, it transforms the queued up data, calling the // buffered _write cb's as it consumes chunks. If consuming a single // written chunk would result in multiple output chunks, then the first // outputted bit calls the readcb, and subsequent chunks just go into // the read buffer, and will cause it to emit 'readable' if necessary. // // This way, back-pressure is actually determined by the reading side, // since _read has to be called to start processing a new chunk. However, // a pathological inflate type of transform can cause excessive buffering // here. For example, imagine a stream where every byte of input is // interpreted as an integer from 0-255, and then results in that many // bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in // 1kb of data being output. In this case, you could write a very small // amount of input, and end up with a very large amount of output. In // such a pathological inflating mechanism, there'd be no way to tell // the system to stop doing the transform. A single 4MB write could // cause the system to run out of memory. // // However, even in such a pathological case, only a single written chunk // would be consumed, and then the rest would wait (un-transformed) until // the results of the previous transformed chunk were consumed. module.exports = Transform; var _require$codes = __webpack_require__(71947)/* .codes */ .q, ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK, ERR_TRANSFORM_ALREADY_TRANSFORMING = _require$codes.ERR_TRANSFORM_ALREADY_TRANSFORMING, ERR_TRANSFORM_WITH_LENGTH_0 = _require$codes.ERR_TRANSFORM_WITH_LENGTH_0; var Duplex = __webpack_require__(18084); __webpack_require__(94835)(Transform, Duplex); function afterTransform(er, data) { var ts = this._transformState; ts.transforming = false; var cb = ts.writecb; if (cb === null) { return this.emit('error', new ERR_MULTIPLE_CALLBACK()); } ts.writechunk = null; ts.writecb = null; if (data != null) // single equals check for both `null` and `undefined` this.push(data); cb(er); var rs = this._readableState; rs.reading = false; if (rs.needReadable || rs.length < rs.highWaterMark) { this._read(rs.highWaterMark); } } function Transform(options) { if (!(this instanceof Transform)) return new Transform(options); Duplex.call(this, options); this._transformState = { afterTransform: afterTransform.bind(this), needTransform: false, transforming: false, writecb: null, writechunk: null, writeencoding: null }; // start out asking for a readable event once data is transformed. this._readableState.needReadable = true; // we have implemented the _read method, and done the other things // that Readable wants before the first _read call, so unset the // sync guard flag. this._readableState.sync = false; if (options) { if (typeof options.transform === 'function') this._transform = options.transform; if (typeof options.flush === 'function') this._flush = options.flush; } // When the writable side finishes, then flush out anything remaining. this.on('prefinish', prefinish); } function prefinish() { var _this = this; if (typeof this._flush === 'function' && !this._readableState.destroyed) { this._flush(function (er, data) { done(_this, er, data); }); } else { done(this, null, null); } } Transform.prototype.push = function (chunk, encoding) { this._transformState.needTransform = false; return Duplex.prototype.push.call(this, chunk, encoding); }; // This is the part where you do stuff! // override this function in implementation classes. // 'chunk' is an input chunk. // // Call `push(newChunk)` to pass along transformed output // to the readable side. You may call 'push' zero or more times. // // Call `cb(err)` when you are done with this chunk. If you pass // an error, then that'll put the hurt on the whole operation. If you // never call cb(), then you'll never get another chunk. Transform.prototype._transform = function (chunk, encoding, cb) { cb(new ERR_METHOD_NOT_IMPLEMENTED('_transform()')); }; Transform.prototype._write = function (chunk, encoding, cb) { var ts = this._transformState; ts.writecb = cb; ts.writechunk = chunk; ts.writeencoding = encoding; if (!ts.transforming) { var rs = this._readableState; if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); } }; // Doesn't matter what the args are here. // _transform does all the work. // That we got here means that the readable side wants more data. Transform.prototype._read = function (n) { var ts = this._transformState; if (ts.writechunk !== null && !ts.transforming) { ts.transforming = true; this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); } else { // mark that we need a transform, so that any data that comes in // will get processed, now that we've asked for it. ts.needTransform = true; } }; Transform.prototype._destroy = function (err, cb) { Duplex.prototype._destroy.call(this, err, function (err2) { cb(err2); }); }; function done(stream, er, data) { if (er) return stream.emit('error', er); if (data != null) // single equals check for both `null` and `undefined` stream.push(data); // TODO(BridgeAR): Write a test for these two error cases // if there's nothing in the write buffer, then that means // that nothing more will ever be provided if (stream._writableState.length) throw new ERR_TRANSFORM_WITH_LENGTH_0(); if (stream._transformState.transforming) throw new ERR_TRANSFORM_ALREADY_TRANSFORMING(); return stream.push(null); } /***/ }), /***/ 92042: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. // A bit simpler than readable streams. // Implement an async ._write(chunk, encoding, cb), and it'll handle all // the drain event emission and buffering. module.exports = Writable; /* */ function WriteReq(chunk, encoding, cb) { this.chunk = chunk; this.encoding = encoding; this.callback = cb; this.next = null; } // It seems a linked list but it is not // there will be only 2 of these for each stream function CorkedRequest(state) { var _this = this; this.next = null; this.entry = null; this.finish = function () { onCorkedFinish(_this, state); }; } /* */ /**/ var Duplex; /**/ Writable.WritableState = WritableState; /**/ var internalUtil = { deprecate: __webpack_require__(65941) }; /**/ /**/ var Stream = __webpack_require__(47640); /**/ var Buffer = __webpack_require__(64293).Buffer; var OurUint8Array = global.Uint8Array || function () {}; function _uint8ArrayToBuffer(chunk) { return Buffer.from(chunk); } function _isUint8Array(obj) { return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; } var destroyImpl = __webpack_require__(22126); var _require = __webpack_require__(14286), getHighWaterMark = _require.getHighWaterMark; var _require$codes = __webpack_require__(71947)/* .codes */ .q, ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE, ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK, ERR_STREAM_CANNOT_PIPE = _require$codes.ERR_STREAM_CANNOT_PIPE, ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED, ERR_STREAM_NULL_VALUES = _require$codes.ERR_STREAM_NULL_VALUES, ERR_STREAM_WRITE_AFTER_END = _require$codes.ERR_STREAM_WRITE_AFTER_END, ERR_UNKNOWN_ENCODING = _require$codes.ERR_UNKNOWN_ENCODING; var errorOrDestroy = destroyImpl.errorOrDestroy; __webpack_require__(94835)(Writable, Stream); function nop() {} function WritableState(options, stream, isDuplex) { Duplex = Duplex || __webpack_require__(18084); options = options || {}; // Duplex streams are both readable and writable, but share // the same options object. // However, some cases require setting options to different // values for the readable and the writable sides of the duplex stream, // e.g. options.readableObjectMode vs. options.writableObjectMode, etc. if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex; // object stream flag to indicate whether or not this stream // contains buffers or objects. this.objectMode = !!options.objectMode; if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; // the point at which write() starts returning false // Note: 0 is a valid value, means that we always return false if // the entire buffer is not flushed immediately on write() this.highWaterMark = getHighWaterMark(this, options, 'writableHighWaterMark', isDuplex); // if _final has been called this.finalCalled = false; // drain event flag. this.needDrain = false; // at the start of calling end() this.ending = false; // when end() has been called, and returned this.ended = false; // when 'finish' is emitted this.finished = false; // has it been destroyed this.destroyed = false; // should we decode strings into buffers before passing to _write? // this is here so that some node-core streams can optimize string // handling at a lower level. var noDecode = options.decodeStrings === false; this.decodeStrings = !noDecode; // Crypto is kind of old and crusty. Historically, its default string // encoding is 'binary' so we have to make this configurable. // Everything else in the universe uses 'utf8', though. this.defaultEncoding = options.defaultEncoding || 'utf8'; // not an actual buffer we keep track of, but a measurement // of how much we're waiting to get pushed to some underlying // socket or file. this.length = 0; // a flag to see when we're in the middle of a write. this.writing = false; // when true all writes will be buffered until .uncork() call this.corked = 0; // a flag to be able to tell if the onwrite cb is called immediately, // or on a later tick. We set this to true at first, because any // actions that shouldn't happen until "later" should generally also // not happen before the first write call. this.sync = true; // a flag to know if we're processing previously buffered items, which // may call the _write() callback in the same tick, so that we don't // end up in an overlapped onwrite situation. this.bufferProcessing = false; // the callback that's passed to _write(chunk,cb) this.onwrite = function (er) { onwrite(stream, er); }; // the callback that the user supplies to write(chunk,encoding,cb) this.writecb = null; // the amount that is being written when _write is called. this.writelen = 0; this.bufferedRequest = null; this.lastBufferedRequest = null; // number of pending user-supplied write callbacks // this must be 0 before 'finish' can be emitted this.pendingcb = 0; // emit prefinish if the only thing we're waiting for is _write cbs // This is relevant for synchronous Transform streams this.prefinished = false; // True if the error was already emitted and should not be thrown again this.errorEmitted = false; // Should close be emitted on destroy. Defaults to true. this.emitClose = options.emitClose !== false; // Should .destroy() be called after 'finish' (and potentially 'end') this.autoDestroy = !!options.autoDestroy; // count buffered requests this.bufferedRequestCount = 0; // allocate the first CorkedRequest, there is always // one allocated and free to use, and we maintain at most two this.corkedRequestsFree = new CorkedRequest(this); } WritableState.prototype.getBuffer = function getBuffer() { var current = this.bufferedRequest; var out = []; while (current) { out.push(current); current = current.next; } return out; }; (function () { try { Object.defineProperty(WritableState.prototype, 'buffer', { get: internalUtil.deprecate(function writableStateBufferGetter() { return this.getBuffer(); }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003') }); } catch (_) {} })(); // Test _writableState for inheritance to account for Duplex streams, // whose prototype chain only points to Readable. var realHasInstance; if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') { realHasInstance = Function.prototype[Symbol.hasInstance]; Object.defineProperty(Writable, Symbol.hasInstance, { value: function value(object) { if (realHasInstance.call(this, object)) return true; if (this !== Writable) return false; return object && object._writableState instanceof WritableState; } }); } else { realHasInstance = function realHasInstance(object) { return object instanceof this; }; } function Writable(options) { Duplex = Duplex || __webpack_require__(18084); // Writable ctor is applied to Duplexes, too. // `realHasInstance` is necessary because using plain `instanceof` // would return false, as no `_writableState` property is attached. // Trying to use the custom `instanceof` for Writable here will also break the // Node.js LazyTransform implementation, which has a non-trivial getter for // `_writableState` that would lead to infinite recursion. // Checking for a Stream.Duplex instance is faster here instead of inside // the WritableState constructor, at least with V8 6.5 var isDuplex = this instanceof Duplex; if (!isDuplex && !realHasInstance.call(Writable, this)) return new Writable(options); this._writableState = new WritableState(options, this, isDuplex); // legacy. this.writable = true; if (options) { if (typeof options.write === 'function') this._write = options.write; if (typeof options.writev === 'function') this._writev = options.writev; if (typeof options.destroy === 'function') this._destroy = options.destroy; if (typeof options.final === 'function') this._final = options.final; } Stream.call(this); } // Otherwise people can pipe Writable streams, which is just wrong. Writable.prototype.pipe = function () { errorOrDestroy(this, new ERR_STREAM_CANNOT_PIPE()); }; function writeAfterEnd(stream, cb) { var er = new ERR_STREAM_WRITE_AFTER_END(); // TODO: defer error events consistently everywhere, not just the cb errorOrDestroy(stream, er); process.nextTick(cb, er); } // Checks that a user-supplied chunk is valid, especially for the particular // mode the stream is in. Currently this means that `null` is never accepted // and undefined/non-string values are only allowed in object mode. function validChunk(stream, state, chunk, cb) { var er; if (chunk === null) { er = new ERR_STREAM_NULL_VALUES(); } else if (typeof chunk !== 'string' && !state.objectMode) { er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer'], chunk); } if (er) { errorOrDestroy(stream, er); process.nextTick(cb, er); return false; } return true; } Writable.prototype.write = function (chunk, encoding, cb) { var state = this._writableState; var ret = false; var isBuf = !state.objectMode && _isUint8Array(chunk); if (isBuf && !Buffer.isBuffer(chunk)) { chunk = _uint8ArrayToBuffer(chunk); } if (typeof encoding === 'function') { cb = encoding; encoding = null; } if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; if (typeof cb !== 'function') cb = nop; if (state.ending) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { state.pendingcb++; ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb); } return ret; }; Writable.prototype.cork = function () { this._writableState.corked++; }; Writable.prototype.uncork = function () { var state = this._writableState; if (state.corked) { state.corked--; if (!state.writing && !state.corked && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); } }; Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { // node::ParseEncoding() requires lower case. if (typeof encoding === 'string') encoding = encoding.toLowerCase(); if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new ERR_UNKNOWN_ENCODING(encoding); this._writableState.defaultEncoding = encoding; return this; }; Object.defineProperty(Writable.prototype, 'writableBuffer', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail enumerable: false, get: function get() { return this._writableState && this._writableState.getBuffer(); } }); function decodeChunk(state, chunk, encoding) { if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { chunk = Buffer.from(chunk, encoding); } return chunk; } Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail enumerable: false, get: function get() { return this._writableState.highWaterMark; } }); // if we're already writing something, then just put this // in the queue, and wait our turn. Otherwise, call _write // If we return false, then we need a drain event, so set that flag. function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) { if (!isBuf) { var newChunk = decodeChunk(state, chunk, encoding); if (chunk !== newChunk) { isBuf = true; encoding = 'buffer'; chunk = newChunk; } } var len = state.objectMode ? 1 : chunk.length; state.length += len; var ret = state.length < state.highWaterMark; // we must ensure that previous needDrain will not be reset to false. if (!ret) state.needDrain = true; if (state.writing || state.corked) { var last = state.lastBufferedRequest; state.lastBufferedRequest = { chunk: chunk, encoding: encoding, isBuf: isBuf, callback: cb, next: null }; if (last) { last.next = state.lastBufferedRequest; } else { state.bufferedRequest = state.lastBufferedRequest; } state.bufferedRequestCount += 1; } else { doWrite(stream, state, false, len, chunk, encoding, cb); } return ret; } function doWrite(stream, state, writev, len, chunk, encoding, cb) { state.writelen = len; state.writecb = cb; state.writing = true; state.sync = true; if (state.destroyed) state.onwrite(new ERR_STREAM_DESTROYED('write'));else if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); state.sync = false; } function onwriteError(stream, state, sync, er, cb) { --state.pendingcb; if (sync) { // defer the callback if we are being called synchronously // to avoid piling up things on the stack process.nextTick(cb, er); // this can emit finish, and it will always happen // after error process.nextTick(finishMaybe, stream, state); stream._writableState.errorEmitted = true; errorOrDestroy(stream, er); } else { // the caller expect this to happen before if // it is async cb(er); stream._writableState.errorEmitted = true; errorOrDestroy(stream, er); // this can emit finish, but finish must // always follow error finishMaybe(stream, state); } } function onwriteStateUpdate(state) { state.writing = false; state.writecb = null; state.length -= state.writelen; state.writelen = 0; } function onwrite(stream, er) { var state = stream._writableState; var sync = state.sync; var cb = state.writecb; if (typeof cb !== 'function') throw new ERR_MULTIPLE_CALLBACK(); onwriteStateUpdate(state); if (er) onwriteError(stream, state, sync, er, cb);else { // Check if we're actually ready to finish, but don't emit yet var finished = needFinish(state) || stream.destroyed; if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { clearBuffer(stream, state); } if (sync) { process.nextTick(afterWrite, stream, state, finished, cb); } else { afterWrite(stream, state, finished, cb); } } } function afterWrite(stream, state, finished, cb) { if (!finished) onwriteDrain(stream, state); state.pendingcb--; cb(); finishMaybe(stream, state); } // Must force callback to be called on nextTick, so that we don't // emit 'drain' before the write() consumer gets the 'false' return // value, and has a chance to attach a 'drain' listener. function onwriteDrain(stream, state) { if (state.length === 0 && state.needDrain) { state.needDrain = false; stream.emit('drain'); } } // if there's something in the buffer waiting, then process it function clearBuffer(stream, state) { state.bufferProcessing = true; var entry = state.bufferedRequest; if (stream._writev && entry && entry.next) { // Fast case, write everything using _writev() var l = state.bufferedRequestCount; var buffer = new Array(l); var holder = state.corkedRequestsFree; holder.entry = entry; var count = 0; var allBuffers = true; while (entry) { buffer[count] = entry; if (!entry.isBuf) allBuffers = false; entry = entry.next; count += 1; } buffer.allBuffers = allBuffers; doWrite(stream, state, true, state.length, buffer, '', holder.finish); // doWrite is almost always async, defer these to save a bit of time // as the hot path ends with doWrite state.pendingcb++; state.lastBufferedRequest = null; if (holder.next) { state.corkedRequestsFree = holder.next; holder.next = null; } else { state.corkedRequestsFree = new CorkedRequest(state); } state.bufferedRequestCount = 0; } else { // Slow case, write chunks one-by-one while (entry) { var chunk = entry.chunk; var encoding = entry.encoding; var cb = entry.callback; var len = state.objectMode ? 1 : chunk.length; doWrite(stream, state, false, len, chunk, encoding, cb); entry = entry.next; state.bufferedRequestCount--; // if we didn't call the onwrite immediately, then // it means that we need to wait until it does. // also, that means that the chunk and cb are currently // being processed, so move the buffer counter past them. if (state.writing) { break; } } if (entry === null) state.lastBufferedRequest = null; } state.bufferedRequest = entry; state.bufferProcessing = false; } Writable.prototype._write = function (chunk, encoding, cb) { cb(new ERR_METHOD_NOT_IMPLEMENTED('_write()')); }; Writable.prototype._writev = null; Writable.prototype.end = function (chunk, encoding, cb) { var state = this._writableState; if (typeof chunk === 'function') { cb = chunk; chunk = null; encoding = null; } else if (typeof encoding === 'function') { cb = encoding; encoding = null; } if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); // .end() fully uncorks if (state.corked) { state.corked = 1; this.uncork(); } // ignore unnecessary end() calls. if (!state.ending) endWritable(this, state, cb); return this; }; Object.defineProperty(Writable.prototype, 'writableLength', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail enumerable: false, get: function get() { return this._writableState.length; } }); function needFinish(state) { return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; } function callFinal(stream, state) { stream._final(function (err) { state.pendingcb--; if (err) { errorOrDestroy(stream, err); } state.prefinished = true; stream.emit('prefinish'); finishMaybe(stream, state); }); } function prefinish(stream, state) { if (!state.prefinished && !state.finalCalled) { if (typeof stream._final === 'function' && !state.destroyed) { state.pendingcb++; state.finalCalled = true; process.nextTick(callFinal, stream, state); } else { state.prefinished = true; stream.emit('prefinish'); } } } function finishMaybe(stream, state) { var need = needFinish(state); if (need) { prefinish(stream, state); if (state.pendingcb === 0) { state.finished = true; stream.emit('finish'); if (state.autoDestroy) { // In case of duplex streams we need a way to detect // if the readable side is ready for autoDestroy as well var rState = stream._readableState; if (!rState || rState.autoDestroy && rState.endEmitted) { stream.destroy(); } } } } return need; } function endWritable(stream, state, cb) { state.ending = true; finishMaybe(stream, state); if (cb) { if (state.finished) process.nextTick(cb);else stream.once('finish', cb); } state.ended = true; stream.writable = false; } function onCorkedFinish(corkReq, state, err) { var entry = corkReq.entry; corkReq.entry = null; while (entry) { var cb = entry.callback; state.pendingcb--; cb(err); entry = entry.next; } // reuse the free corkReq. state.corkedRequestsFree.next = corkReq; } Object.defineProperty(Writable.prototype, 'destroyed', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail enumerable: false, get: function get() { if (this._writableState === undefined) { return false; } return this._writableState.destroyed; }, set: function set(value) { // we ignore the value if the stream // has not been initialized yet if (!this._writableState) { return; } // backward compatibility, the user is explicitly // managing destroyed this._writableState.destroyed = value; } }); Writable.prototype.destroy = destroyImpl.destroy; Writable.prototype._undestroy = destroyImpl.undestroy; Writable.prototype._destroy = function (err, cb) { cb(err); }; /***/ }), /***/ 37090: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var _Object$setPrototypeO; function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var finished = __webpack_require__(26052); var kLastResolve = Symbol('lastResolve'); var kLastReject = Symbol('lastReject'); var kError = Symbol('error'); var kEnded = Symbol('ended'); var kLastPromise = Symbol('lastPromise'); var kHandlePromise = Symbol('handlePromise'); var kStream = Symbol('stream'); function createIterResult(value, done) { return { value: value, done: done }; } function readAndResolve(iter) { var resolve = iter[kLastResolve]; if (resolve !== null) { var data = iter[kStream].read(); // we defer if data is null // we can be expecting either 'end' or // 'error' if (data !== null) { iter[kLastPromise] = null; iter[kLastResolve] = null; iter[kLastReject] = null; resolve(createIterResult(data, false)); } } } function onReadable(iter) { // we wait for the next tick, because it might // emit an error with process.nextTick process.nextTick(readAndResolve, iter); } function wrapForNext(lastPromise, iter) { return function (resolve, reject) { lastPromise.then(function () { if (iter[kEnded]) { resolve(createIterResult(undefined, true)); return; } iter[kHandlePromise](resolve, reject); }, reject); }; } var AsyncIteratorPrototype = Object.getPrototypeOf(function () {}); var ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf((_Object$setPrototypeO = { get stream() { return this[kStream]; }, next: function next() { var _this = this; // if we have detected an error in the meanwhile // reject straight away var error = this[kError]; if (error !== null) { return Promise.reject(error); } if (this[kEnded]) { return Promise.resolve(createIterResult(undefined, true)); } if (this[kStream].destroyed) { // We need to defer via nextTick because if .destroy(err) is // called, the error will be emitted via nextTick, and // we cannot guarantee that there is no error lingering around // waiting to be emitted. return new Promise(function (resolve, reject) { process.nextTick(function () { if (_this[kError]) { reject(_this[kError]); } else { resolve(createIterResult(undefined, true)); } }); }); } // if we have multiple next() calls // we will wait for the previous Promise to finish // this logic is optimized to support for await loops, // where next() is only called once at a time var lastPromise = this[kLastPromise]; var promise; if (lastPromise) { promise = new Promise(wrapForNext(lastPromise, this)); } else { // fast path needed to support multiple this.push() // without triggering the next() queue var data = this[kStream].read(); if (data !== null) { return Promise.resolve(createIterResult(data, false)); } promise = new Promise(this[kHandlePromise]); } this[kLastPromise] = promise; return promise; } }, _defineProperty(_Object$setPrototypeO, Symbol.asyncIterator, function () { return this; }), _defineProperty(_Object$setPrototypeO, "return", function _return() { var _this2 = this; // destroy(err, cb) is a private API // we can guarantee we have that here, because we control the // Readable class this is attached to return new Promise(function (resolve, reject) { _this2[kStream].destroy(null, function (err) { if (err) { reject(err); return; } resolve(createIterResult(undefined, true)); }); }); }), _Object$setPrototypeO), AsyncIteratorPrototype); var createReadableStreamAsyncIterator = function createReadableStreamAsyncIterator(stream) { var _Object$create; var iterator = Object.create(ReadableStreamAsyncIteratorPrototype, (_Object$create = {}, _defineProperty(_Object$create, kStream, { value: stream, writable: true }), _defineProperty(_Object$create, kLastResolve, { value: null, writable: true }), _defineProperty(_Object$create, kLastReject, { value: null, writable: true }), _defineProperty(_Object$create, kError, { value: null, writable: true }), _defineProperty(_Object$create, kEnded, { value: stream._readableState.endEmitted, writable: true }), _defineProperty(_Object$create, kHandlePromise, { value: function value(resolve, reject) { var data = iterator[kStream].read(); if (data) { iterator[kLastPromise] = null; iterator[kLastResolve] = null; iterator[kLastReject] = null; resolve(createIterResult(data, false)); } else { iterator[kLastResolve] = resolve; iterator[kLastReject] = reject; } }, writable: true }), _Object$create)); iterator[kLastPromise] = null; finished(stream, function (err) { if (err && err.code !== 'ERR_STREAM_PREMATURE_CLOSE') { var reject = iterator[kLastReject]; // reject if we are waiting for data in the Promise // returned by next() and store the error if (reject !== null) { iterator[kLastPromise] = null; iterator[kLastResolve] = null; iterator[kLastReject] = null; reject(err); } iterator[kError] = err; return; } var resolve = iterator[kLastResolve]; if (resolve !== null) { iterator[kLastPromise] = null; iterator[kLastResolve] = null; iterator[kLastReject] = null; resolve(createIterResult(undefined, true)); } iterator[kEnded] = true; }); stream.on('readable', onReadable.bind(null, iterator)); return iterator; }; module.exports = createReadableStreamAsyncIterator; /***/ }), /***/ 38568: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } var _require = __webpack_require__(64293), Buffer = _require.Buffer; var _require2 = __webpack_require__(31669), inspect = _require2.inspect; var custom = inspect && inspect.custom || 'inspect'; function copyBuffer(src, target, offset) { Buffer.prototype.copy.call(src, target, offset); } module.exports = /*#__PURE__*/ function () { function BufferList() { _classCallCheck(this, BufferList); this.head = null; this.tail = null; this.length = 0; } _createClass(BufferList, [{ key: "push", value: function push(v) { var entry = { data: v, next: null }; if (this.length > 0) this.tail.next = entry;else this.head = entry; this.tail = entry; ++this.length; } }, { key: "unshift", value: function unshift(v) { var entry = { data: v, next: this.head }; if (this.length === 0) this.tail = entry; this.head = entry; ++this.length; } }, { key: "shift", value: function shift() { if (this.length === 0) return; var ret = this.head.data; if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; --this.length; return ret; } }, { key: "clear", value: function clear() { this.head = this.tail = null; this.length = 0; } }, { key: "join", value: function join(s) { if (this.length === 0) return ''; var p = this.head; var ret = '' + p.data; while (p = p.next) { ret += s + p.data; } return ret; } }, { key: "concat", value: function concat(n) { if (this.length === 0) return Buffer.alloc(0); var ret = Buffer.allocUnsafe(n >>> 0); var p = this.head; var i = 0; while (p) { copyBuffer(p.data, ret, i); i += p.data.length; p = p.next; } return ret; } // Consumes a specified amount of bytes or characters from the buffered data. }, { key: "consume", value: function consume(n, hasStrings) { var ret; if (n < this.head.data.length) { // `slice` is the same for buffers and strings. ret = this.head.data.slice(0, n); this.head.data = this.head.data.slice(n); } else if (n === this.head.data.length) { // First chunk is a perfect match. ret = this.shift(); } else { // Result spans more than one buffer. ret = hasStrings ? this._getString(n) : this._getBuffer(n); } return ret; } }, { key: "first", value: function first() { return this.head.data; } // Consumes a specified amount of characters from the buffered data. }, { key: "_getString", value: function _getString(n) { var p = this.head; var c = 1; var ret = p.data; n -= ret.length; while (p = p.next) { var str = p.data; var nb = n > str.length ? str.length : n; if (nb === str.length) ret += str;else ret += str.slice(0, n); n -= nb; if (n === 0) { if (nb === str.length) { ++c; if (p.next) this.head = p.next;else this.head = this.tail = null; } else { this.head = p; p.data = str.slice(nb); } break; } ++c; } this.length -= c; return ret; } // Consumes a specified amount of bytes from the buffered data. }, { key: "_getBuffer", value: function _getBuffer(n) { var ret = Buffer.allocUnsafe(n); var p = this.head; var c = 1; p.data.copy(ret); n -= p.data.length; while (p = p.next) { var buf = p.data; var nb = n > buf.length ? buf.length : n; buf.copy(ret, ret.length - n, 0, nb); n -= nb; if (n === 0) { if (nb === buf.length) { ++c; if (p.next) this.head = p.next;else this.head = this.tail = null; } else { this.head = p; p.data = buf.slice(nb); } break; } ++c; } this.length -= c; return ret; } // Make sure the linked list only shows the minimal necessary information. }, { key: custom, value: function value(_, options) { return inspect(this, _objectSpread({}, options, { // Only inspect one level. depth: 0, // It should not recurse. customInspect: false })); } }]); return BufferList; }(); /***/ }), /***/ 22126: /***/ ((module) => { "use strict"; // undocumented cb() API, needed for core, not for public API function destroy(err, cb) { var _this = this; var readableDestroyed = this._readableState && this._readableState.destroyed; var writableDestroyed = this._writableState && this._writableState.destroyed; if (readableDestroyed || writableDestroyed) { if (cb) { cb(err); } else if (err) { if (!this._writableState) { process.nextTick(emitErrorNT, this, err); } else if (!this._writableState.errorEmitted) { this._writableState.errorEmitted = true; process.nextTick(emitErrorNT, this, err); } } return this; } // we set destroyed to true before firing error callbacks in order // to make it re-entrance safe in case destroy() is called within callbacks if (this._readableState) { this._readableState.destroyed = true; } // if this is a duplex stream mark the writable part as destroyed as well if (this._writableState) { this._writableState.destroyed = true; } this._destroy(err || null, function (err) { if (!cb && err) { if (!_this._writableState) { process.nextTick(emitErrorAndCloseNT, _this, err); } else if (!_this._writableState.errorEmitted) { _this._writableState.errorEmitted = true; process.nextTick(emitErrorAndCloseNT, _this, err); } else { process.nextTick(emitCloseNT, _this); } } else if (cb) { process.nextTick(emitCloseNT, _this); cb(err); } else { process.nextTick(emitCloseNT, _this); } }); return this; } function emitErrorAndCloseNT(self, err) { emitErrorNT(self, err); emitCloseNT(self); } function emitCloseNT(self) { if (self._writableState && !self._writableState.emitClose) return; if (self._readableState && !self._readableState.emitClose) return; self.emit('close'); } function undestroy() { if (this._readableState) { this._readableState.destroyed = false; this._readableState.reading = false; this._readableState.ended = false; this._readableState.endEmitted = false; } if (this._writableState) { this._writableState.destroyed = false; this._writableState.ended = false; this._writableState.ending = false; this._writableState.finalCalled = false; this._writableState.prefinished = false; this._writableState.finished = false; this._writableState.errorEmitted = false; } } function emitErrorNT(self, err) { self.emit('error', err); } function errorOrDestroy(stream, err) { // We have tests that rely on errors being emitted // in the same tick, so changing this is semver major. // For now when you opt-in to autoDestroy we allow // the error to be emitted nextTick. In a future // semver major update we should change the default to this. var rState = stream._readableState; var wState = stream._writableState; if (rState && rState.autoDestroy || wState && wState.autoDestroy) stream.destroy(err);else stream.emit('error', err); } module.exports = { destroy: destroy, undestroy: undestroy, errorOrDestroy: errorOrDestroy }; /***/ }), /***/ 26052: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; // Ported from https://github.com/mafintosh/end-of-stream with // permission from the author, Mathias Buus (@mafintosh). var ERR_STREAM_PREMATURE_CLOSE = __webpack_require__(71947)/* .codes.ERR_STREAM_PREMATURE_CLOSE */ .q.ERR_STREAM_PREMATURE_CLOSE; function once(callback) { var called = false; return function () { if (called) return; called = true; for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } callback.apply(this, args); }; } function noop() {} function isRequest(stream) { return stream.setHeader && typeof stream.abort === 'function'; } function eos(stream, opts, callback) { if (typeof opts === 'function') return eos(stream, null, opts); if (!opts) opts = {}; callback = once(callback || noop); var readable = opts.readable || opts.readable !== false && stream.readable; var writable = opts.writable || opts.writable !== false && stream.writable; var onlegacyfinish = function onlegacyfinish() { if (!stream.writable) onfinish(); }; var writableEnded = stream._writableState && stream._writableState.finished; var onfinish = function onfinish() { writable = false; writableEnded = true; if (!readable) callback.call(stream); }; var readableEnded = stream._readableState && stream._readableState.endEmitted; var onend = function onend() { readable = false; readableEnded = true; if (!writable) callback.call(stream); }; var onerror = function onerror(err) { callback.call(stream, err); }; var onclose = function onclose() { var err; if (readable && !readableEnded) { if (!stream._readableState || !stream._readableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE(); return callback.call(stream, err); } if (writable && !writableEnded) { if (!stream._writableState || !stream._writableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE(); return callback.call(stream, err); } }; var onrequest = function onrequest() { stream.req.on('finish', onfinish); }; if (isRequest(stream)) { stream.on('complete', onfinish); stream.on('abort', onclose); if (stream.req) onrequest();else stream.on('request', onrequest); } else if (writable && !stream._writableState) { // legacy streams stream.on('end', onlegacyfinish); stream.on('close', onlegacyfinish); } stream.on('end', onend); stream.on('finish', onfinish); if (opts.error !== false) stream.on('error', onerror); stream.on('close', onclose); return function () { stream.removeListener('complete', onfinish); stream.removeListener('abort', onclose); stream.removeListener('request', onrequest); if (stream.req) stream.req.removeListener('finish', onfinish); stream.removeListener('end', onlegacyfinish); stream.removeListener('close', onlegacyfinish); stream.removeListener('finish', onfinish); stream.removeListener('end', onend); stream.removeListener('error', onerror); stream.removeListener('close', onclose); }; } module.exports = eos; /***/ }), /***/ 97754: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var ERR_INVALID_ARG_TYPE = __webpack_require__(71947)/* .codes.ERR_INVALID_ARG_TYPE */ .q.ERR_INVALID_ARG_TYPE; function from(Readable, iterable, opts) { var iterator; if (iterable && typeof iterable.next === 'function') { iterator = iterable; } else if (iterable && iterable[Symbol.asyncIterator]) iterator = iterable[Symbol.asyncIterator]();else if (iterable && iterable[Symbol.iterator]) iterator = iterable[Symbol.iterator]();else throw new ERR_INVALID_ARG_TYPE('iterable', ['Iterable'], iterable); var readable = new Readable(_objectSpread({ objectMode: true }, opts)); // Reading boolean to protect against _read // being called before last iteration completion. var reading = false; readable._read = function () { if (!reading) { reading = true; next(); } }; function next() { return _next2.apply(this, arguments); } function _next2() { _next2 = _asyncToGenerator(function* () { try { var _ref = yield iterator.next(), value = _ref.value, done = _ref.done; if (done) { readable.push(null); } else if (readable.push((yield value))) { next(); } else { reading = false; } } catch (err) { readable.destroy(err); } }); return _next2.apply(this, arguments); } return readable; } module.exports = from; /***/ }), /***/ 14705: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; // Ported from https://github.com/mafintosh/pump with // permission from the author, Mathias Buus (@mafintosh). var eos; function once(callback) { var called = false; return function () { if (called) return; called = true; callback.apply(void 0, arguments); }; } var _require$codes = __webpack_require__(71947)/* .codes */ .q, ERR_MISSING_ARGS = _require$codes.ERR_MISSING_ARGS, ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED; function noop(err) { // Rethrow the error if it exists to avoid swallowing it if (err) throw err; } function isRequest(stream) { return stream.setHeader && typeof stream.abort === 'function'; } function destroyer(stream, reading, writing, callback) { callback = once(callback); var closed = false; stream.on('close', function () { closed = true; }); if (eos === undefined) eos = __webpack_require__(26052); eos(stream, { readable: reading, writable: writing }, function (err) { if (err) return callback(err); closed = true; callback(); }); var destroyed = false; return function (err) { if (closed) return; if (destroyed) return; destroyed = true; // request.destroy just do .end - .abort is what we want if (isRequest(stream)) return stream.abort(); if (typeof stream.destroy === 'function') return stream.destroy(); callback(err || new ERR_STREAM_DESTROYED('pipe')); }; } function call(fn) { fn(); } function pipe(from, to) { return from.pipe(to); } function popCallback(streams) { if (!streams.length) return noop; if (typeof streams[streams.length - 1] !== 'function') return noop; return streams.pop(); } function pipeline() { for (var _len = arguments.length, streams = new Array(_len), _key = 0; _key < _len; _key++) { streams[_key] = arguments[_key]; } var callback = popCallback(streams); if (Array.isArray(streams[0])) streams = streams[0]; if (streams.length < 2) { throw new ERR_MISSING_ARGS('streams'); } var error; var destroys = streams.map(function (stream, i) { var reading = i < streams.length - 1; var writing = i > 0; return destroyer(stream, reading, writing, function (err) { if (!error) error = err; if (err) destroys.forEach(call); if (reading) return; destroys.forEach(call); callback(error); }); }); return streams.reduce(pipe); } module.exports = pipeline; /***/ }), /***/ 14286: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var ERR_INVALID_OPT_VALUE = __webpack_require__(71947)/* .codes.ERR_INVALID_OPT_VALUE */ .q.ERR_INVALID_OPT_VALUE; function highWaterMarkFrom(options, isDuplex, duplexKey) { return options.highWaterMark != null ? options.highWaterMark : isDuplex ? options[duplexKey] : null; } function getHighWaterMark(state, options, duplexKey, isDuplex) { var hwm = highWaterMarkFrom(options, isDuplex, duplexKey); if (hwm != null) { if (!(isFinite(hwm) && Math.floor(hwm) === hwm) || hwm < 0) { var name = isDuplex ? duplexKey : 'highWaterMark'; throw new ERR_INVALID_OPT_VALUE(name, hwm); } return Math.floor(hwm); } // Default value return state.objectMode ? 16 : 16 * 1024; } module.exports = { getHighWaterMark: getHighWaterMark }; /***/ }), /***/ 47640: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { module.exports = __webpack_require__(92413); /***/ }), /***/ 30009: /***/ ((module, exports, __webpack_require__) => { var Stream = __webpack_require__(92413); if (process.env.READABLE_STREAM === 'disable' && Stream) { module.exports = Stream.Readable; Object.assign(module.exports, Stream); module.exports.Stream = Stream; } else { exports = module.exports = __webpack_require__(11864); exports.Stream = Stream || exports; exports.Readable = exports; exports.Writable = __webpack_require__(92042); exports.Duplex = __webpack_require__(18084); exports.Transform = __webpack_require__(57173); exports.PassThrough = __webpack_require__(11798); exports.finished = __webpack_require__(26052); exports.pipeline = __webpack_require__(14705); } /***/ }), /***/ 27510: /***/ ((module) => { module.exports = { trueFunc: function trueFunc(){ return true; }, falseFunc: function falseFunc(){ return false; } }; /***/ }), /***/ 63726: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var concatMap = __webpack_require__(16755); var balanced = __webpack_require__(15893); module.exports = expandTop; var escSlash = '\0SLASH'+Math.random()+'\0'; var escOpen = '\0OPEN'+Math.random()+'\0'; var escClose = '\0CLOSE'+Math.random()+'\0'; var escComma = '\0COMMA'+Math.random()+'\0'; var escPeriod = '\0PERIOD'+Math.random()+'\0'; function numeric(str) { return parseInt(str, 10) == str ? parseInt(str, 10) : str.charCodeAt(0); } function escapeBraces(str) { return str.split('\\\\').join(escSlash) .split('\\{').join(escOpen) .split('\\}').join(escClose) .split('\\,').join(escComma) .split('\\.').join(escPeriod); } function unescapeBraces(str) { return str.split(escSlash).join('\\') .split(escOpen).join('{') .split(escClose).join('}') .split(escComma).join(',') .split(escPeriod).join('.'); } // Basically just str.split(","), but handling cases // where we have nested braced sections, which should be // treated as individual members, like {a,{b,c},d} function parseCommaParts(str) { if (!str) return ['']; var parts = []; var m = balanced('{', '}', str); if (!m) return str.split(','); var pre = m.pre; var body = m.body; var post = m.post; var p = pre.split(','); p[p.length-1] += '{' + body + '}'; var postParts = parseCommaParts(post); if (post.length) { p[p.length-1] += postParts.shift(); p.push.apply(p, postParts); } parts.push.apply(parts, p); return parts; } function expandTop(str) { if (!str) return []; // I don't know why Bash 4.3 does this, but it does. // Anything starting with {} will have the first two bytes preserved // but *only* at the top level, so {},a}b will not expand to anything, // but a{},b}c will be expanded to [a}c,abc]. // One could argue that this is a bug in Bash, but since the goal of // this module is to match Bash's rules, we escape a leading {} if (str.substr(0, 2) === '{}') { str = '\\{\\}' + str.substr(2); } return expand(escapeBraces(str), true).map(unescapeBraces); } function identity(e) { return e; } function embrace(str) { return '{' + str + '}'; } function isPadded(el) { return /^-?0\d/.test(el); } function lte(i, y) { return i <= y; } function gte(i, y) { return i >= y; } function expand(str, isTop) { var expansions = []; var m = balanced('{', '}', str); if (!m || /\$$/.test(m.pre)) return [str]; var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); var isSequence = isNumericSequence || isAlphaSequence; var isOptions = m.body.indexOf(',') >= 0; if (!isSequence && !isOptions) { // {a},b} if (m.post.match(/,.*\}/)) { str = m.pre + '{' + m.body + escClose + m.post; return expand(str); } return [str]; } var n; if (isSequence) { n = m.body.split(/\.\./); } else { n = parseCommaParts(m.body); if (n.length === 1) { // x{{a,b}}y ==> x{a}y x{b}y n = expand(n[0], false).map(embrace); if (n.length === 1) { var post = m.post.length ? expand(m.post, false) : ['']; return post.map(function(p) { return m.pre + n[0] + p; }); } } } // at this point, n is the parts, and we know it's not a comma set // with a single entry. // no need to expand pre, since it is guaranteed to be free of brace-sets var pre = m.pre; var post = m.post.length ? expand(m.post, false) : ['']; var N; if (isSequence) { var x = numeric(n[0]); var y = numeric(n[1]); var width = Math.max(n[0].length, n[1].length) var incr = n.length == 3 ? Math.abs(numeric(n[2])) : 1; var test = lte; var reverse = y < x; if (reverse) { incr *= -1; test = gte; } var pad = n.some(isPadded); N = []; for (var i = x; test(i, y); i += incr) { var c; if (isAlphaSequence) { c = String.fromCharCode(i); if (c === '\\') c = ''; } else { c = String(i); if (pad) { var need = width - c.length; if (need > 0) { var z = new Array(need + 1).join('0'); if (i < 0) c = '-' + z + c.slice(1); else c = z + c; } } } N.push(c); } } else { N = concatMap(n, function(el) { return expand(el, false) }); } for (var j = 0; j < N.length; j++) { for (var k = 0; k < post.length; k++) { var expansion = pre + N[j] + post[k]; if (!isTop || isSequence || expansion) expansions.push(expansion); } } return expansions; } /***/ }), /***/ 93514: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var Buffer = __webpack_require__(64293).Buffer; var CRC_TABLE = [ 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d ]; if (typeof Int32Array !== 'undefined') { CRC_TABLE = new Int32Array(CRC_TABLE); } function ensureBuffer(input) { if (Buffer.isBuffer(input)) { return input; } var hasNewBufferAPI = typeof Buffer.alloc === "function" && typeof Buffer.from === "function"; if (typeof input === "number") { return hasNewBufferAPI ? Buffer.alloc(input) : new Buffer(input); } else if (typeof input === "string") { return hasNewBufferAPI ? Buffer.from(input) : new Buffer(input); } else { throw new Error("input must be buffer, number, or string, received " + typeof input); } } function bufferizeInt(num) { var tmp = ensureBuffer(4); tmp.writeInt32BE(num, 0); return tmp; } function _crc32(buf, previous) { buf = ensureBuffer(buf); if (Buffer.isBuffer(previous)) { previous = previous.readUInt32BE(0); } var crc = ~~previous ^ -1; for (var n = 0; n < buf.length; n++) { crc = CRC_TABLE[(crc ^ buf[n]) & 0xff] ^ (crc >>> 8); } return (crc ^ -1); } function crc32() { return bufferizeInt(_crc32.apply(null, arguments)); } crc32.signed = function () { return _crc32.apply(null, arguments); }; crc32.unsigned = function () { return _crc32.apply(null, arguments) >>> 0; }; module.exports = crc32; /***/ }), /***/ 28729: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; const fs = __webpack_require__(35747) const path = __webpack_require__(85622) /* istanbul ignore next */ const LCHOWN = fs.lchown ? 'lchown' : 'chown' /* istanbul ignore next */ const LCHOWNSYNC = fs.lchownSync ? 'lchownSync' : 'chownSync' /* istanbul ignore next */ const needEISDIRHandled = fs.lchown && !process.version.match(/v1[1-9]+\./) && !process.version.match(/v10\.[6-9]/) const lchownSync = (path, uid, gid) => { try { return fs[LCHOWNSYNC](path, uid, gid) } catch (er) { if (er.code !== 'ENOENT') throw er } } /* istanbul ignore next */ const chownSync = (path, uid, gid) => { try { return fs.chownSync(path, uid, gid) } catch (er) { if (er.code !== 'ENOENT') throw er } } /* istanbul ignore next */ const handleEISDIR = needEISDIRHandled ? (path, uid, gid, cb) => er => { // Node prior to v10 had a very questionable implementation of // fs.lchown, which would always try to call fs.open on a directory // Fall back to fs.chown in those cases. if (!er || er.code !== 'EISDIR') cb(er) else fs.chown(path, uid, gid, cb) } : (_, __, ___, cb) => cb /* istanbul ignore next */ const handleEISDirSync = needEISDIRHandled ? (path, uid, gid) => { try { return lchownSync(path, uid, gid) } catch (er) { if (er.code !== 'EISDIR') throw er chownSync(path, uid, gid) } } : (path, uid, gid) => lchownSync(path, uid, gid) // fs.readdir could only accept an options object as of node v6 const nodeVersion = process.version let readdir = (path, options, cb) => fs.readdir(path, options, cb) let readdirSync = (path, options) => fs.readdirSync(path, options) /* istanbul ignore next */ if (/^v4\./.test(nodeVersion)) readdir = (path, options, cb) => fs.readdir(path, cb) const chown = (cpath, uid, gid, cb) => { fs[LCHOWN](cpath, uid, gid, handleEISDIR(cpath, uid, gid, er => { // Skip ENOENT error cb(er && er.code !== 'ENOENT' ? er : null) })) } const chownrKid = (p, child, uid, gid, cb) => { if (typeof child === 'string') return fs.lstat(path.resolve(p, child), (er, stats) => { // Skip ENOENT error if (er) return cb(er.code !== 'ENOENT' ? er : null) stats.name = child chownrKid(p, stats, uid, gid, cb) }) if (child.isDirectory()) { chownr(path.resolve(p, child.name), uid, gid, er => { if (er) return cb(er) const cpath = path.resolve(p, child.name) chown(cpath, uid, gid, cb) }) } else { const cpath = path.resolve(p, child.name) chown(cpath, uid, gid, cb) } } const chownr = (p, uid, gid, cb) => { readdir(p, { withFileTypes: true }, (er, children) => { // any error other than ENOTDIR or ENOTSUP means it's not readable, // or doesn't exist. give up. if (er) { if (er.code === 'ENOENT') return cb() else if (er.code !== 'ENOTDIR' && er.code !== 'ENOTSUP') return cb(er) } if (er || !children.length) return chown(p, uid, gid, cb) let len = children.length let errState = null const then = er => { if (errState) return if (er) return cb(errState = er) if (-- len === 0) return chown(p, uid, gid, cb) } children.forEach(child => chownrKid(p, child, uid, gid, then)) }) } const chownrKidSync = (p, child, uid, gid) => { if (typeof child === 'string') { try { const stats = fs.lstatSync(path.resolve(p, child)) stats.name = child child = stats } catch (er) { if (er.code === 'ENOENT') return else throw er } } if (child.isDirectory()) chownrSync(path.resolve(p, child.name), uid, gid) handleEISDirSync(path.resolve(p, child.name), uid, gid) } const chownrSync = (p, uid, gid) => { let children try { children = readdirSync(p, { withFileTypes: true }) } catch (er) { if (er.code === 'ENOENT') return else if (er.code === 'ENOTDIR' || er.code === 'ENOTSUP') return handleEISDirSync(p, uid, gid) else throw er } if (children && children.length) children.forEach(child => chownrKidSync(p, child, uid, gid)) return handleEISDirSync(p, uid, gid) } module.exports = chownr chownr.sync = chownrSync /***/ }), /***/ 16755: /***/ ((module) => { module.exports = function (xs, fn) { var res = []; for (var i = 0; i < xs.length; i++) { var x = fn(xs[i], i); if (isArray(x)) res.push.apply(res, x); else res.push(x); } return res; }; var isArray = Array.isArray || function (xs) { return Object.prototype.toString.call(xs) === '[object Array]'; }; /***/ }), /***/ 89072: /***/ ((module) => { "use strict"; module.exports = adapterFactory; function adapterFactory(implementation){ ensureImplementation(implementation); var adapter = {} var baseAdapter = { removeSubsets: function (nodes){ return removeSubsets(adapter, nodes); }, existsOne: function(test, elems){ return existsOne(adapter, test, elems); }, getSiblings: function(elem){ return getSiblings(adapter, elem); }, hasAttrib: function(elem, name){ return hasAttrib(adapter, elem, name); }, findOne: function(test, arr){ return findOne(adapter, test, arr); }, findAll: function(test, elems){ return findAll(adapter, test, elems) } }; Object.assign(adapter, baseAdapter, implementation); return adapter; } var expectImplemented = [ "isTag", "getAttributeValue", "getChildren", "getName", "getParent", "getText" ]; function ensureImplementation(implementation){ if(!implementation) throw new TypeError("Expected implementation") var notImplemented = expectImplemented.filter(function(fname){ return typeof implementation[fname] !== "function"; }); if(notImplemented.length){ var notList = "(" + notImplemented.join(", ") + ")"; var message = "Expected functions " + notList + " to be implemented"; throw new Error(message); } } function removeSubsets(adapter, nodes){ var idx = nodes.length, node, ancestor, replace; // Check if each node (or one of its ancestors) is already contained in the // array. while(--idx > -1){ node = ancestor = nodes[idx]; // Temporarily remove the node under consideration nodes[idx] = null; replace = true; while(ancestor){ if(nodes.indexOf(ancestor) > -1){ replace = false; nodes.splice(idx, 1); break; } ancestor = adapter.getParent(ancestor) } // If the node has been found to be unique, re-insert it. if(replace){ nodes[idx] = node; } } return nodes; } function existsOne(adapter, test, elems){ return elems.some(function(elem){ return adapter.isTag(elem) ? test(elem) || adapter.existsOne(test, adapter.getChildren(elem)) : false; }); } function getSiblings(adapter, elem){ var parent = adapter.getParent(elem); return parent && adapter.getChildren(parent); } function hasAttrib(adapter, elem, name){ return adapter.getAttributeValue(elem,name) !== undefined } function findOne(adapter, test, arr){ var elem = null; for(var i = 0, l = arr.length; i < l && !elem; i++){ if(test(arr[i])){ elem = arr[i]; } else { var childs = adapter.getChildren(arr[i]); if(childs && childs.length > 0){ elem = adapter.findOne(test, childs); } } } return elem; } function findAll(adapter, test, elems){ var result = []; for(var i = 0, j = elems.length; i < j; i++){ if(!adapter.isTag(elems[i])) continue; if(test(elems[i])) result.push(elems[i]); var childs = adapter.getChildren(elems[i]); if(childs) result = result.concat(adapter.findAll(test, childs)); } return result; } /***/ }), /***/ 32825: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; module.exports = CSSselect; var DomUtils = __webpack_require__(43370); var falseFunc = __webpack_require__(27510).falseFunc; var compileRaw = __webpack_require__(22365); function wrapCompile(func) { return function addAdapter(selector, options, context) { options = options || {}; options.adapter = options.adapter || DomUtils; return func(selector, options, context); }; } var compile = wrapCompile(compileRaw); var compileUnsafe = wrapCompile(compileRaw.compileUnsafe); function getSelectorFunc(searchFunc) { return function select(query, elems, options) { options = options || {}; options.adapter = options.adapter || DomUtils; if (typeof query !== "function") { query = compileUnsafe(query, options, elems); } if (query.shouldTestNextSiblings) { elems = appendNextSiblings((options && options.context) || elems, options.adapter); } if (!Array.isArray(elems)) elems = options.adapter.getChildren(elems); else elems = options.adapter.removeSubsets(elems); return searchFunc(query, elems, options); }; } function getNextSiblings(elem, adapter) { var siblings = adapter.getSiblings(elem); if (!Array.isArray(siblings)) return []; siblings = siblings.slice(0); while (siblings.shift() !== elem); return siblings; } function appendNextSiblings(elems, adapter) { // Order matters because jQuery seems to check the children before the siblings if (!Array.isArray(elems)) elems = [elems]; var newElems = elems.slice(0); for (var i = 0, len = elems.length; i < len; i++) { var nextSiblings = getNextSiblings(newElems[i], adapter); newElems.push.apply(newElems, nextSiblings); } return newElems; } var selectAll = getSelectorFunc(function selectAll(query, elems, options) { return query === falseFunc || !elems || elems.length === 0 ? [] : options.adapter.findAll(query, elems); }); var selectOne = getSelectorFunc(function selectOne(query, elems, options) { return query === falseFunc || !elems || elems.length === 0 ? null : options.adapter.findOne(query, elems); }); function is(elem, query, options) { options = options || {}; options.adapter = options.adapter || DomUtils; return (typeof query === "function" ? query : compile(query, options))(elem); } /* the exported interface */ function CSSselect(query, elems, options) { return selectAll(query, elems, options); } CSSselect.compile = compile; CSSselect.filters = compileRaw.Pseudos.filters; CSSselect.pseudos = compileRaw.Pseudos.pseudos; CSSselect.selectAll = selectAll; CSSselect.selectOne = selectOne; CSSselect.is = is; //legacy methods (might be removed) CSSselect.parse = compile; CSSselect.iterate = selectAll; //hooks CSSselect._compileUnsafe = compileUnsafe; CSSselect._compileToken = compileRaw.compileToken; /***/ }), /***/ 91221: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var falseFunc = __webpack_require__(27510).falseFunc; //https://github.com/slevithan/XRegExp/blob/master/src/xregexp.js#L469 var reChars = /[-[\]{}()*+?.,\\^$|#\s]/g; /* attribute selectors */ var attributeRules = { __proto__: null, equals: function(next, data, options) { var name = data.name; var value = data.value; var adapter = options.adapter; if (data.ignoreCase) { value = value.toLowerCase(); return function equalsIC(elem) { var attr = adapter.getAttributeValue(elem, name); return attr != null && attr.toLowerCase() === value && next(elem); }; } return function equals(elem) { return adapter.getAttributeValue(elem, name) === value && next(elem); }; }, hyphen: function(next, data, options) { var name = data.name; var value = data.value; var len = value.length; var adapter = options.adapter; if (data.ignoreCase) { value = value.toLowerCase(); return function hyphenIC(elem) { var attr = adapter.getAttributeValue(elem, name); return ( attr != null && (attr.length === len || attr.charAt(len) === "-") && attr.substr(0, len).toLowerCase() === value && next(elem) ); }; } return function hyphen(elem) { var attr = adapter.getAttributeValue(elem, name); return ( attr != null && attr.substr(0, len) === value && (attr.length === len || attr.charAt(len) === "-") && next(elem) ); }; }, element: function(next, data, options) { var name = data.name; var value = data.value; var adapter = options.adapter; if (/\s/.test(value)) { return falseFunc; } value = value.replace(reChars, "\\$&"); var pattern = "(?:^|\\s)" + value + "(?:$|\\s)", flags = data.ignoreCase ? "i" : "", regex = new RegExp(pattern, flags); return function element(elem) { var attr = adapter.getAttributeValue(elem, name); return attr != null && regex.test(attr) && next(elem); }; }, exists: function(next, data, options) { var name = data.name; var adapter = options.adapter; return function exists(elem) { return adapter.hasAttrib(elem, name) && next(elem); }; }, start: function(next, data, options) { var name = data.name; var value = data.value; var len = value.length; var adapter = options.adapter; if (len === 0) { return falseFunc; } if (data.ignoreCase) { value = value.toLowerCase(); return function startIC(elem) { var attr = adapter.getAttributeValue(elem, name); return attr != null && attr.substr(0, len).toLowerCase() === value && next(elem); }; } return function start(elem) { var attr = adapter.getAttributeValue(elem, name); return attr != null && attr.substr(0, len) === value && next(elem); }; }, end: function(next, data, options) { var name = data.name; var value = data.value; var len = -value.length; var adapter = options.adapter; if (len === 0) { return falseFunc; } if (data.ignoreCase) { value = value.toLowerCase(); return function endIC(elem) { var attr = adapter.getAttributeValue(elem, name); return attr != null && attr.substr(len).toLowerCase() === value && next(elem); }; } return function end(elem) { var attr = adapter.getAttributeValue(elem, name); return attr != null && attr.substr(len) === value && next(elem); }; }, any: function(next, data, options) { var name = data.name; var value = data.value; var adapter = options.adapter; if (value === "") { return falseFunc; } if (data.ignoreCase) { var regex = new RegExp(value.replace(reChars, "\\$&"), "i"); return function anyIC(elem) { var attr = adapter.getAttributeValue(elem, name); return attr != null && regex.test(attr) && next(elem); }; } return function any(elem) { var attr = adapter.getAttributeValue(elem, name); return attr != null && attr.indexOf(value) >= 0 && next(elem); }; }, not: function(next, data, options) { var name = data.name; var value = data.value; var adapter = options.adapter; if (value === "") { return function notEmpty(elem) { return !!adapter.getAttributeValue(elem, name) && next(elem); }; } else if (data.ignoreCase) { value = value.toLowerCase(); return function notIC(elem) { var attr = adapter.getAttributeValue(elem, name); return attr != null && attr.toLowerCase() !== value && next(elem); }; } return function not(elem) { return adapter.getAttributeValue(elem, name) !== value && next(elem); }; } }; module.exports = { compile: function(next, data, options) { if (options && options.strict && (data.ignoreCase || data.action === "not")) { throw new Error("Unsupported attribute selector"); } return attributeRules[data.action](next, data, options); }, rules: attributeRules }; /***/ }), /***/ 22365: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /* compiles a selector to an executable function */ module.exports = compile; var parse = __webpack_require__(17525).parse; var BaseFuncs = __webpack_require__(27510); var sortRules = __webpack_require__(65426); var procedure = __webpack_require__(86721); var Rules = __webpack_require__(35890); var Pseudos = __webpack_require__(65582); var trueFunc = BaseFuncs.trueFunc; var falseFunc = BaseFuncs.falseFunc; var filters = Pseudos.filters; function compile(selector, options, context) { var next = compileUnsafe(selector, options, context); return wrap(next, options); } function wrap(next, options) { var adapter = options.adapter; return function base(elem) { return adapter.isTag(elem) && next(elem); }; } function compileUnsafe(selector, options, context) { var token = parse(selector, options); return compileToken(token, options, context); } function includesScopePseudo(t) { return ( t.type === "pseudo" && (t.name === "scope" || (Array.isArray(t.data) && t.data.some(function(data) { return data.some(includesScopePseudo); }))) ); } var DESCENDANT_TOKEN = { type: "descendant" }; var FLEXIBLE_DESCENDANT_TOKEN = { type: "_flexibleDescendant" }; var SCOPE_TOKEN = { type: "pseudo", name: "scope" }; var PLACEHOLDER_ELEMENT = {}; //CSS 4 Spec (Draft): 3.3.1. Absolutizing a Scope-relative Selector //http://www.w3.org/TR/selectors4/#absolutizing function absolutize(token, options, context) { var adapter = options.adapter; //TODO better check if context is document var hasContext = !!context && !!context.length && context.every(function(e) { return e === PLACEHOLDER_ELEMENT || !!adapter.getParent(e); }); token.forEach(function(t) { if (t.length > 0 && isTraversal(t[0]) && t[0].type !== "descendant") { //don't return in else branch } else if (hasContext && !(Array.isArray(t) ? t.some(includesScopePseudo) : includesScopePseudo(t))) { t.unshift(DESCENDANT_TOKEN); } else { return; } t.unshift(SCOPE_TOKEN); }); } function compileToken(token, options, context) { token = token.filter(function(t) { return t.length > 0; }); token.forEach(sortRules); var isArrayContext = Array.isArray(context); context = (options && options.context) || context; if (context && !isArrayContext) context = [context]; absolutize(token, options, context); var shouldTestNextSiblings = false; var query = token .map(function(rules) { if (rules[0] && rules[1] && rules[0].name === "scope") { var ruleType = rules[1].type; if (isArrayContext && ruleType === "descendant") { rules[1] = FLEXIBLE_DESCENDANT_TOKEN; } else if (ruleType === "adjacent" || ruleType === "sibling") { shouldTestNextSiblings = true; } } return compileRules(rules, options, context); }) .reduce(reduceRules, falseFunc); query.shouldTestNextSiblings = shouldTestNextSiblings; return query; } function isTraversal(t) { return procedure[t.type] < 0; } function compileRules(rules, options, context) { return rules.reduce(function(func, rule) { if (func === falseFunc) return func; if (!(rule.type in Rules)) { throw new Error("Rule type " + rule.type + " is not supported by css-select"); } return Rules[rule.type](func, rule, options, context); }, (options && options.rootFunc) || trueFunc); } function reduceRules(a, b) { if (b === falseFunc || a === trueFunc) { return a; } if (a === falseFunc || b === trueFunc) { return b; } return function combine(elem) { return a(elem) || b(elem); }; } function containsTraversal(t) { return t.some(isTraversal); } //:not, :has and :matches have to compile selectors //doing this in lib/pseudos.js would lead to circular dependencies, //so we add them here filters.not = function(next, token, options, context) { var opts = { xmlMode: !!(options && options.xmlMode), strict: !!(options && options.strict), adapter: options.adapter }; if (opts.strict) { if (token.length > 1 || token.some(containsTraversal)) { throw new Error("complex selectors in :not aren't allowed in strict mode"); } } var func = compileToken(token, opts, context); if (func === falseFunc) return next; if (func === trueFunc) return falseFunc; return function not(elem) { return !func(elem) && next(elem); }; }; filters.has = function(next, token, options) { var adapter = options.adapter; var opts = { xmlMode: !!(options && options.xmlMode), strict: !!(options && options.strict), adapter: adapter }; //FIXME: Uses an array as a pointer to the current element (side effects) var context = token.some(containsTraversal) ? [PLACEHOLDER_ELEMENT] : null; var func = compileToken(token, opts, context); if (func === falseFunc) return falseFunc; if (func === trueFunc) { return function hasChild(elem) { return adapter.getChildren(elem).some(adapter.isTag) && next(elem); }; } func = wrap(func, options); if (context) { return function has(elem) { return next(elem) && ((context[0] = elem), adapter.existsOne(func, adapter.getChildren(elem))); }; } return function has(elem) { return next(elem) && adapter.existsOne(func, adapter.getChildren(elem)); }; }; filters.matches = function(next, token, options, context) { var opts = { xmlMode: !!(options && options.xmlMode), strict: !!(options && options.strict), rootFunc: next, adapter: options.adapter }; return compileToken(token, opts, context); }; compile.compileToken = compileToken; compile.compileUnsafe = compileUnsafe; compile.Pseudos = Pseudos; /***/ }), /***/ 35890: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var attributes = __webpack_require__(91221); var Pseudos = __webpack_require__(65582); /* all available rules */ module.exports = { __proto__: null, attribute: attributes.compile, pseudo: Pseudos.compile, //tags tag: function(next, data, options) { var name = data.name; var adapter = options.adapter; return function tag(elem) { return adapter.getName(elem) === name && next(elem); }; }, //traversal descendant: function(next, data, options) { // eslint-disable-next-line no-undef var isFalseCache = typeof WeakSet !== "undefined" ? new WeakSet() : null; var adapter = options.adapter; return function descendant(elem) { var found = false; while (!found && (elem = adapter.getParent(elem))) { if (!isFalseCache || !isFalseCache.has(elem)) { found = next(elem); if (!found && isFalseCache) { isFalseCache.add(elem); } } } return found; }; }, _flexibleDescendant: function(next, data, options) { var adapter = options.adapter; // Include element itself, only used while querying an array return function descendant(elem) { var found = next(elem); while (!found && (elem = adapter.getParent(elem))) { found = next(elem); } return found; }; }, parent: function(next, data, options) { if (options && options.strict) { throw new Error("Parent selector isn't part of CSS3"); } var adapter = options.adapter; return function parent(elem) { return adapter.getChildren(elem).some(test); }; function test(elem) { return adapter.isTag(elem) && next(elem); } }, child: function(next, data, options) { var adapter = options.adapter; return function child(elem) { var parent = adapter.getParent(elem); return !!parent && next(parent); }; }, sibling: function(next, data, options) { var adapter = options.adapter; return function sibling(elem) { var siblings = adapter.getSiblings(elem); for (var i = 0; i < siblings.length; i++) { if (adapter.isTag(siblings[i])) { if (siblings[i] === elem) break; if (next(siblings[i])) return true; } } return false; }; }, adjacent: function(next, data, options) { var adapter = options.adapter; return function adjacent(elem) { var siblings = adapter.getSiblings(elem), lastElement; for (var i = 0; i < siblings.length; i++) { if (adapter.isTag(siblings[i])) { if (siblings[i] === elem) break; lastElement = siblings[i]; } } return !!lastElement && next(lastElement); }; }, universal: function(next) { return next; } }; /***/ }), /***/ 65582: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /* pseudo selectors --- they are available in two forms: * filters called when the selector is compiled and return a function that needs to return next() * pseudos get called on execution they need to return a boolean */ var getNCheck = __webpack_require__(88970); var BaseFuncs = __webpack_require__(27510); var attributes = __webpack_require__(91221); var trueFunc = BaseFuncs.trueFunc; var falseFunc = BaseFuncs.falseFunc; var checkAttrib = attributes.rules.equals; function getAttribFunc(name, value) { var data = { name: name, value: value }; return function attribFunc(next, rule, options) { return checkAttrib(next, data, options); }; } function getChildFunc(next, adapter) { return function(elem) { return !!adapter.getParent(elem) && next(elem); }; } var filters = { contains: function(next, text, options) { var adapter = options.adapter; return function contains(elem) { return next(elem) && adapter.getText(elem).indexOf(text) >= 0; }; }, icontains: function(next, text, options) { var itext = text.toLowerCase(); var adapter = options.adapter; return function icontains(elem) { return ( next(elem) && adapter .getText(elem) .toLowerCase() .indexOf(itext) >= 0 ); }; }, //location specific methods "nth-child": function(next, rule, options) { var func = getNCheck(rule); var adapter = options.adapter; if (func === falseFunc) return func; if (func === trueFunc) return getChildFunc(next, adapter); return function nthChild(elem) { var siblings = adapter.getSiblings(elem); for (var i = 0, pos = 0; i < siblings.length; i++) { if (adapter.isTag(siblings[i])) { if (siblings[i] === elem) break; else pos++; } } return func(pos) && next(elem); }; }, "nth-last-child": function(next, rule, options) { var func = getNCheck(rule); var adapter = options.adapter; if (func === falseFunc) return func; if (func === trueFunc) return getChildFunc(next, adapter); return function nthLastChild(elem) { var siblings = adapter.getSiblings(elem); for (var pos = 0, i = siblings.length - 1; i >= 0; i--) { if (adapter.isTag(siblings[i])) { if (siblings[i] === elem) break; else pos++; } } return func(pos) && next(elem); }; }, "nth-of-type": function(next, rule, options) { var func = getNCheck(rule); var adapter = options.adapter; if (func === falseFunc) return func; if (func === trueFunc) return getChildFunc(next, adapter); return function nthOfType(elem) { var siblings = adapter.getSiblings(elem); for (var pos = 0, i = 0; i < siblings.length; i++) { if (adapter.isTag(siblings[i])) { if (siblings[i] === elem) break; if (adapter.getName(siblings[i]) === adapter.getName(elem)) pos++; } } return func(pos) && next(elem); }; }, "nth-last-of-type": function(next, rule, options) { var func = getNCheck(rule); var adapter = options.adapter; if (func === falseFunc) return func; if (func === trueFunc) return getChildFunc(next, adapter); return function nthLastOfType(elem) { var siblings = adapter.getSiblings(elem); for (var pos = 0, i = siblings.length - 1; i >= 0; i--) { if (adapter.isTag(siblings[i])) { if (siblings[i] === elem) break; if (adapter.getName(siblings[i]) === adapter.getName(elem)) pos++; } } return func(pos) && next(elem); }; }, //TODO determine the actual root element root: function(next, rule, options) { var adapter = options.adapter; return function(elem) { return !adapter.getParent(elem) && next(elem); }; }, scope: function(next, rule, options, context) { var adapter = options.adapter; if (!context || context.length === 0) { //equivalent to :root return filters.root(next, rule, options); } function equals(a, b) { if (typeof adapter.equals === "function") return adapter.equals(a, b); return a === b; } if (context.length === 1) { //NOTE: can't be unpacked, as :has uses this for side-effects return function(elem) { return equals(context[0], elem) && next(elem); }; } return function(elem) { return context.indexOf(elem) >= 0 && next(elem); }; }, //jQuery extensions (others follow as pseudos) checkbox: getAttribFunc("type", "checkbox"), file: getAttribFunc("type", "file"), password: getAttribFunc("type", "password"), radio: getAttribFunc("type", "radio"), reset: getAttribFunc("type", "reset"), image: getAttribFunc("type", "image"), submit: getAttribFunc("type", "submit"), //dynamic state pseudos. These depend on optional Adapter methods. hover: function(next, rule, options) { var adapter = options.adapter; if (typeof adapter.isHovered === 'function') { return function hover(elem) { return next(elem) && adapter.isHovered(elem); }; } return falseFunc; }, visited: function(next, rule, options) { var adapter = options.adapter; if (typeof adapter.isVisited === 'function') { return function visited(elem) { return next(elem) && adapter.isVisited(elem); }; } return falseFunc; }, active: function(next, rule, options) { var adapter = options.adapter; if (typeof adapter.isActive === 'function') { return function active(elem) { return next(elem) && adapter.isActive(elem); }; } return falseFunc; } }; //helper methods function getFirstElement(elems, adapter) { for (var i = 0; elems && i < elems.length; i++) { if (adapter.isTag(elems[i])) return elems[i]; } } //while filters are precompiled, pseudos get called when they are needed var pseudos = { empty: function(elem, adapter) { return !adapter.getChildren(elem).some(function(elem) { return adapter.isTag(elem) || elem.type === "text"; }); }, "first-child": function(elem, adapter) { return getFirstElement(adapter.getSiblings(elem), adapter) === elem; }, "last-child": function(elem, adapter) { var siblings = adapter.getSiblings(elem); for (var i = siblings.length - 1; i >= 0; i--) { if (siblings[i] === elem) return true; if (adapter.isTag(siblings[i])) break; } return false; }, "first-of-type": function(elem, adapter) { var siblings = adapter.getSiblings(elem); for (var i = 0; i < siblings.length; i++) { if (adapter.isTag(siblings[i])) { if (siblings[i] === elem) return true; if (adapter.getName(siblings[i]) === adapter.getName(elem)) break; } } return false; }, "last-of-type": function(elem, adapter) { var siblings = adapter.getSiblings(elem); for (var i = siblings.length - 1; i >= 0; i--) { if (adapter.isTag(siblings[i])) { if (siblings[i] === elem) return true; if (adapter.getName(siblings[i]) === adapter.getName(elem)) break; } } return false; }, "only-of-type": function(elem, adapter) { var siblings = adapter.getSiblings(elem); for (var i = 0, j = siblings.length; i < j; i++) { if (adapter.isTag(siblings[i])) { if (siblings[i] === elem) continue; if (adapter.getName(siblings[i]) === adapter.getName(elem)) { return false; } } } return true; }, "only-child": function(elem, adapter) { var siblings = adapter.getSiblings(elem); for (var i = 0; i < siblings.length; i++) { if (adapter.isTag(siblings[i]) && siblings[i] !== elem) return false; } return true; }, //:matches(a, area, link)[href] link: function(elem, adapter) { return adapter.hasAttrib(elem, "href"); }, //TODO: :any-link once the name is finalized (as an alias of :link) //forms //to consider: :target //:matches([selected], select:not([multiple]):not(> option[selected]) > option:first-of-type) selected: function(elem, adapter) { if (adapter.hasAttrib(elem, "selected")) return true; else if (adapter.getName(elem) !== "option") return false; //the first