surveyjs-widgets
Version:
Custom widgets for the SurveyJS library
372 lines (358 loc) • 32.3 kB
JavaScript
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory(require("nouislider"));
else if(typeof define === 'function' && define.amd)
define("widgets/nouislider", ["nouislider"], factory);
else if(typeof exports === 'object')
exports["widgets/nouislider"] = factory(require("nouislider"));
else
root["widgets/nouislider"] = factory(root["noUiSlider"]);
})(self, (__WEBPACK_EXTERNAL_MODULE_nouislider__) => {
return /******/ (() => { // webpackBootstrap
/******/ var __webpack_modules__ = ({
/***/ "./node_modules/svg-inline-loader/index.js?classPrefix!./src/images/nouislider.svg":
/*!*****************************************************************************************!*\
!*** ./node_modules/svg-inline-loader/index.js?classPrefix!./src/images/nouislider.svg ***!
\*****************************************************************************************/
/***/ ((module) => {
module.exports = "<svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\"><rect y=\"10\" width=\"16\" height=\"2\"></rect><polygon points=\"2,4 2,7 4,9 6,7 6,4 \"></polygon><polygon points=\"10,4 10,7 12,9 14,7 14,4 \"></polygon></svg>"
/***/ }),
/***/ "nouislider":
/*!**********************************************************************************************************!*\
!*** external {"root":"noUiSlider","commonjs2":"nouislider","commonjs":"nouislider","amd":"nouislider"} ***!
\**********************************************************************************************************/
/***/ ((module) => {
"use strict";
module.exports = __WEBPACK_EXTERNAL_MODULE_nouislider__;
/***/ })
/******/ });
/************************************************************************/
/******/ // The module cache
/******/ var __webpack_module_cache__ = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ var cachedModule = __webpack_module_cache__[moduleId];
/******/ if (cachedModule !== undefined) {
/******/ return cachedModule.exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = __webpack_module_cache__[moduleId] = {
/******/ // no module.id needed
/******/ // no module.loaded needed
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/************************************************************************/
/******/ /* webpack/runtime/compat get default export */
/******/ (() => {
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = (module) => {
/******/ var getter = module && module.__esModule ?
/******/ () => (module['default']) :
/******/ () => (module);
/******/ __webpack_require__.d(getter, { a: getter });
/******/ return getter;
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/define property getters */
/******/ (() => {
/******/ // define getter functions for harmony exports
/******/ __webpack_require__.d = (exports, definition) => {
/******/ for(var key in definition) {
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ }
/******/ }
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ (() => {
/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
/******/ })();
/******/
/******/ /* webpack/runtime/make namespace object */
/******/ (() => {
/******/ // define __esModule on exports
/******/ __webpack_require__.r = (exports) => {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/ })();
/******/
/************************************************************************/
var __webpack_exports__ = {};
// This entry need to be wrapped in an IIFE because it need to be in strict mode.
(() => {
"use strict";
/*!***************************!*\
!*** ./src/nouislider.js ***!
\***************************/
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var nouislider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! nouislider */ "nouislider");
/* harmony import */ var nouislider__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(nouislider__WEBPACK_IMPORTED_MODULE_0__);
function init(Survey) {
const iconId = "icon-nouislider";
const componentName = "nouislider";
Survey.SvgRegistry && Survey.SvgRegistry.registerIconFromSvg(iconId, __webpack_require__(/*! svg-inline-loader?classPrefix!./images/nouislider.svg */ "./node_modules/svg-inline-loader/index.js?classPrefix!./src/images/nouislider.svg"), "");
var widget = {
name: componentName,
title: "noUiSlider",
iconName: iconId,
widgetIsLoaded: function () {
return typeof (nouislider__WEBPACK_IMPORTED_MODULE_0___default()) != "undefined";
},
isFit: function (question) {
return question.getType() === componentName;
},
htmlTemplate:
"<div><div></div></div>",
activatedByChanged: function (activatedBy) {
Survey.Serializer.addClass(componentName, [], null, "empty");
let registerQuestion = Survey.ElementFactory.Instance.registerCustomQuestion;
if (!!registerQuestion) registerQuestion(componentName);
Survey.Serializer.addProperties(componentName, [
{
name: "step:number",
category: "slider",
categoryIndex: 1,
default: 1,
},
{
name: "rangeMin:number",
category: "slider",
default: 0,
},
{
name: "rangeMax:number",
category: "slider",
default: 100,
},
{
name: "pipsMode",
category: "slider",
default: "positions",
},
{
name: "pipsValues:itemvalues",
category: "slider",
default: [0, 25, 50, 75, 100],
},
{
name: "pipsText:itemvalues",
category: "slider",
default: [0, 25, 50, 75, 100],
},
{
name: "pipsDensity:number",
category: "slider",
default: 5,
},
{
name: "orientation",
category: "slider",
default: "horizontal",
choices: ["horizontal", "vertical"]
},
{
name: "direction:string",
category: "slider",
default: "ltr",
},
{
name: "tooltips:boolean",
category: "slider",
default: true,
},
]);
},
afterRender: function (question, el) {
el.style.paddingBottom = "19px";
el.style.paddingLeft = "20px";
el.style.paddingRight = "20px";
el.style.paddingTop = "44px";
el = el.children[0];
el.style.marginBottom = "60px";
if (question.orientation === "vertical") {
el.style.height = "250px";
el.style.marginLeft = "60px";
}
var slider = nouislider__WEBPACK_IMPORTED_MODULE_0___default().create(el, {
start: question.rangeMin <= question.value && question.value <= question.rangeMax ?
question.value : (question.rangeMin + question.rangeMax) / 2,
connect: [true, false],
step: question.step,
tooltips: question.tooltips,
pips: {
mode: question.pipsMode || "positions",
values: question.pipsValues.map(function (pVal) {
var pipValue = pVal;
if (pVal.value !== undefined) {
pipValue = pVal.value;
}
return parseInt(pipValue);
}),
density: question.pipsDensity || 5,
format: {
to: function (pVal) {
var pipText = pVal;
question.pipsText.map(function (el) {
if (el.text !== undefined && pVal === el.value) {
pipText = el.text;
}
});
return pipText;
},
},
},
range: {
min: question.rangeMin,
max: question.rangeMax,
},
orientation: question.orientation,
direction: question.direction,
});
slider.on("change", function () {
question.value = Number(slider.get());
});
question.updateSliderProperties = function () {
const elems = document.getElementsByClassName("noUi-pips");
if (elems.length > 0) elems[elems.length - 1].style.display = "none";
if (elems.length > 1) elems[elems.length - 2].style.display = "none";
var getStart = function (currentStart) {
return question.rangeMin + Math.round((currentStart - question.rangeMin) / question.step) * question.step;
}
slider.updateOptions(
{
step: question.step,
start: question.rangeMin <= question.value && question.value <= question.rangeMax ?
getStart(question.value) : getStart((question.rangeMin + question.rangeMax) / 2),
range: {
min: question.rangeMin,
max: question.rangeMax
}
}, true);
slider.pips(
{
mode: question.pipsMode || "positions",
values: question.pipsValues.map(function (pVal) {
var pipValue = pVal;
if (pVal.value !== undefined) {
pipValue = pVal.value;
}
return parseInt(pipValue);
}),
density: question.pipsDensity || 5,
format: {
to: function (pVal) {
var pipText = pVal;
question.pipsText.map(function (el) {
if (el.text !== undefined && pVal === el.value) {
pipText = el.text;
}
});
return pipText;
},
},
});
};
var updateValueHandler = function () {
slider.set(question.value);
};
if (question.isReadOnly) {
el.setAttribute("disabled", true);
}
updateValueHandler();
question.noUiSlider = slider;
question.registerFunctionOnPropertiesValueChanged(
["pipsValues", "step", "rangeMin", "rangeMax", "pipsMode", "pipsDensity"],
question.updateSliderProperties
);
question.valueChangedCallback = updateValueHandler;
question.readOnlyChangedCallback = function () {
if (question.isReadOnly) {
el.setAttribute("disabled", true);
} else {
el.removeAttribute("disabled");
}
};
},
willUnmount: function (question, el) {
if (!!question.noUiSlider) {
question.noUiSlider.destroy();
question.noUiSlider = null;
}
question.readOnlyChangedCallback = null;
question.valueChangedCallback = null;
if (!question.updateSliderProperties) return;
question.unRegisterFunctionOnPropertiesValueChanged(
["pipsValues", "step", "rangeMin", "rangeMax", "pipsMode", "pipsDensity"],
question.updateSliderProperties
);
question.updateSliderProperties = undefined
},
pdfRender: function (_, options) {
if (options.question.getType() === componentName) {
var point = options.module.SurveyHelper.createPoint(
options.module.SurveyHelper.mergeRects.apply(null, options.bricks)
);
point.xLeft += options.controller.unitWidth;
point.yTop +=
options.controller.unitHeight *
options.module.FlatQuestion.CONTENT_GAP_VERT_SCALE;
var rect = options.module.SurveyHelper.createTextFieldRect(
point,
options.controller
);
if (options.module.SurveyHelper.shouldRenderReadOnly(this.question, this.controller)) {
options.bricks.push(new options.module.TextFieldBrick(
options.question,
options.controller,
rect,
true,
options.question.id,
options.question.value || options.question.defaultValue || "",
"",
options.question.isReadOnly,
false,
"text"
));
} else {
return new Promise(resolve => {
options.module.SurveyHelper.createCommentFlat(point, options.question,
options.controller, true, { rows: options.module.FlatTextbox.MULTILINE_TEXT_ROWS_COUNT }).then((brick) => {
options.bricks.push(brick);
resolve();
})
})
}
}
},
};
Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, "customtype");
}
if (typeof Survey !== "undefined") {
init(Survey);
}
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (init);
})();
/******/ return __webpack_exports__;
/******/ })()
;
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSwwQ0FBMEMsNERBQTREO0FBQ3RHO0FBQ0E7QUFDQSxlQUFlO0FBQ2YsV0FBVztBQUNYO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxpRUFBZSxJQUFJLEVBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zdXJ2ZXlqcy13aWRnZXRzL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9zdXJ2ZXlqcy13aWRnZXRzLy4vc3JjL2ltYWdlcy9ub3Vpc2xpZGVyLnN2ZyIsIndlYnBhY2s6Ly9zdXJ2ZXlqcy13aWRnZXRzL2V4dGVybmFsIHVtZCB7XCJyb290XCI6XCJub1VpU2xpZGVyXCIsXCJjb21tb25qczJcIjpcIm5vdWlzbGlkZXJcIixcImNvbW1vbmpzXCI6XCJub3Vpc2xpZGVyXCIsXCJhbWRcIjpcIm5vdWlzbGlkZXJcIn0iLCJ3ZWJwYWNrOi8vc3VydmV5anMtd2lkZ2V0cy93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9zdXJ2ZXlqcy13aWRnZXRzL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL3N1cnZleWpzLXdpZGdldHMvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL3N1cnZleWpzLXdpZGdldHMvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9zdXJ2ZXlqcy13aWRnZXRzL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vc3VydmV5anMtd2lkZ2V0cy8uL3NyYy9ub3Vpc2xpZGVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIm5vdWlzbGlkZXJcIikpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoXCJ3aWRnZXRzL25vdWlzbGlkZXJcIiwgW1wibm91aXNsaWRlclwiXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJ3aWRnZXRzL25vdWlzbGlkZXJcIl0gPSBmYWN0b3J5KHJlcXVpcmUoXCJub3Vpc2xpZGVyXCIpKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJ3aWRnZXRzL25vdWlzbGlkZXJcIl0gPSBmYWN0b3J5KHJvb3RbXCJub1VpU2xpZGVyXCJdKTtcbn0pKHNlbGYsIChfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX25vdWlzbGlkZXJfXykgPT4ge1xucmV0dXJuICIsIm1vZHVsZS5leHBvcnRzID0gXCI8c3ZnIHZpZXdCb3g9XFxcIjAgMCAxNiAxNlxcXCIgeG1sbnM9XFxcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXFxcIj48cmVjdCB5PVxcXCIxMFxcXCIgd2lkdGg9XFxcIjE2XFxcIiBoZWlnaHQ9XFxcIjJcXFwiPjwvcmVjdD48cG9seWdvbiBwb2ludHM9XFxcIjIsNCAyLDcgNCw5IDYsNyA2LDQgXFxcIj48L3BvbHlnb24+PHBvbHlnb24gcG9pbnRzPVxcXCIxMCw0IDEwLDcgMTIsOSAxNCw3IDE0LDQgXFxcIj48L3BvbHlnb24+PC9zdmc+XCIiLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfbm91aXNsaWRlcl9fOyIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCJpbXBvcnQgbm9VaVNsaWRlciBmcm9tIFwibm91aXNsaWRlclwiO1xuXG5mdW5jdGlvbiBpbml0KFN1cnZleSkge1xuICBjb25zdCBpY29uSWQgPSBcImljb24tbm91aXNsaWRlclwiO1xuICBjb25zdCBjb21wb25lbnROYW1lID0gXCJub3Vpc2xpZGVyXCI7XG4gIFN1cnZleS5TdmdSZWdpc3RyeSAmJiBTdXJ2ZXkuU3ZnUmVnaXN0cnkucmVnaXN0ZXJJY29uRnJvbVN2ZyhpY29uSWQsIHJlcXVpcmUoJ3N2Zy1pbmxpbmUtbG9hZGVyP2NsYXNzUHJlZml4IS4vaW1hZ2VzL25vdWlzbGlkZXIuc3ZnJyksIFwiXCIpO1xuICB2YXIgd2lkZ2V0ID0ge1xuICAgIG5hbWU6IGNvbXBvbmVudE5hbWUsXG4gICAgdGl0bGU6IFwibm9VaVNsaWRlclwiLFxuICAgIGljb25OYW1lOiBpY29uSWQsXG4gICAgd2lkZ2V0SXNMb2FkZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0eXBlb2Ygbm9VaVNsaWRlciAhPSBcInVuZGVmaW5lZFwiO1xuICAgIH0sXG4gICAgaXNGaXQ6IGZ1bmN0aW9uIChxdWVzdGlvbikge1xuICAgICAgcmV0dXJuIHF1ZXN0aW9uLmdldFR5cGUoKSA9PT0gY29tcG9uZW50TmFtZTtcbiAgICB9LFxuICAgIGh0bWxUZW1wbGF0ZTpcbiAgICAgIFwiPGRpdj48ZGl2PjwvZGl2PjwvZGl2PlwiLFxuICAgIGFjdGl2YXRlZEJ5Q2hhbmdlZDogZnVuY3Rpb24gKGFjdGl2YXRlZEJ5KSB7XG4gICAgICBTdXJ2ZXkuU2VyaWFsaXplci5hZGRDbGFzcyhjb21wb25lbnROYW1lLCBbXSwgbnVsbCwgXCJlbXB0eVwiKTtcbiAgICAgIGxldCByZWdpc3RlclF1ZXN0aW9uID0gU3VydmV5LkVsZW1lbnRGYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyQ3VzdG9tUXVlc3Rpb247XG4gICAgICBpZiAoISFyZWdpc3RlclF1ZXN0aW9uKSByZWdpc3RlclF1ZXN0aW9uKGNvbXBvbmVudE5hbWUpO1xuICAgICAgU3VydmV5LlNlcmlhbGl6ZXIuYWRkUHJvcGVydGllcyhjb21wb25lbnROYW1lLCBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInN0ZXA6bnVtYmVyXCIsXG4gICAgICAgICAgY2F0ZWdvcnk6IFwic2xpZGVyXCIsXG4gICAgICAgICAgY2F0ZWdvcnlJbmRleDogMSxcbiAgICAgICAgICBkZWZhdWx0OiAxLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJyYW5nZU1pbjpudW1iZXJcIixcbiAgICAgICAgICBjYXRlZ29yeTogXCJzbGlkZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAwLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJyYW5nZU1heDpudW1iZXJcIixcbiAgICAgICAgICBjYXRlZ29yeTogXCJzbGlkZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAxMDAsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInBpcHNNb2RlXCIsXG4gICAgICAgICAgY2F0ZWdvcnk6IFwic2xpZGVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogXCJwb3NpdGlvbnNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwicGlwc1ZhbHVlczppdGVtdmFsdWVzXCIsXG4gICAgICAgICAgY2F0ZWdvcnk6IFwic2xpZGVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogWzAsIDI1LCA1MCwgNzUsIDEwMF0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInBpcHNUZXh0Oml0ZW12YWx1ZXNcIixcbiAgICAgICAgICBjYXRlZ29yeTogXCJzbGlkZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiBbMCwgMjUsIDUwLCA3NSwgMTAwXSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwicGlwc0RlbnNpdHk6bnVtYmVyXCIsXG4gICAgICAgICAgY2F0ZWdvcnk6IFwic2xpZGVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogNSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwib3JpZW50YXRpb25cIixcbiAgICAgICAgICBjYXRlZ29yeTogXCJzbGlkZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiBcImhvcml6b250YWxcIixcbiAgICAgICAgICBjaG9pY2VzOiBbXCJob3Jpem9udGFsXCIsIFwidmVydGljYWxcIl1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwiZGlyZWN0aW9uOnN0cmluZ1wiLFxuICAgICAgICAgIGNhdGVnb3J5OiBcInNsaWRlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IFwibHRyXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInRvb2x0aXBzOmJvb2xlYW5cIixcbiAgICAgICAgICBjYXRlZ29yeTogXCJzbGlkZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgfSxcbiAgICBhZnRlclJlbmRlcjogZnVuY3Rpb24gKHF1ZXN0aW9uLCBlbCkge1xuICAgICAgZWwuc3R5bGUucGFkZGluZ0JvdHRvbSA9IFwiMTlweFwiO1xuICAgICAgZWwuc3R5bGUucGFkZGluZ0xlZnQgPSBcIjIwcHhcIjtcbiAgICAgIGVsLnN0eWxlLnBhZGRpbmdSaWdodCA9IFwiMjBweFwiO1xuICAgICAgZWwuc3R5bGUucGFkZGluZ1RvcCA9IFwiNDRweFwiO1xuICAgICAgZWwgPSBlbC5jaGlsZHJlblswXTtcbiAgICAgIGVsLnN0eWxlLm1hcmdpbkJvdHRvbSA9IFwiNjBweFwiO1xuICAgICAgaWYgKHF1ZXN0aW9uLm9yaWVudGF0aW9uID09PSBcInZlcnRpY2FsXCIpIHtcbiAgICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gXCIyNTBweFwiO1xuICAgICAgICBlbC5zdHlsZS5tYXJnaW5MZWZ0ID0gXCI2MHB4XCI7XG4gICAgICB9XG4gICAgICB2YXIgc2xpZGVyID0gbm9VaVNsaWRlci5jcmVhdGUoZWwsIHtcbiAgICAgICAgc3RhcnQ6IHF1ZXN0aW9uLnJhbmdlTWluIDw9IHF1ZXN0aW9uLnZhbHVlICYmIHF1ZXN0aW9uLnZhbHVlIDw9IHF1ZXN0aW9uLnJhbmdlTWF4ID9cbiAgICAgICAgICBxdWVzdGlvbi52YWx1ZSA6IChxdWVzdGlvbi5yYW5nZU1pbiArIHF1ZXN0aW9uLnJhbmdlTWF4KSAvIDIsXG4gICAgICAgIGNvbm5lY3Q6IFt0cnVlLCBmYWxzZV0sXG4gICAgICAgIHN0ZXA6IHF1ZXN0aW9uLnN0ZXAsXG4gICAgICAgIHRvb2x0aXBzOiBxdWVzdGlvbi50b29sdGlwcyxcbiAgICAgICAgcGlwczoge1xuICAgICAgICAgIG1vZGU6IHF1ZXN0aW9uLnBpcHNNb2RlIHx8IFwicG9zaXRpb25zXCIsXG4gICAgICAgICAgdmFsdWVzOiBxdWVzdGlvbi5waXBzVmFsdWVzLm1hcChmdW5jdGlvbiAocFZhbCkge1xuICAgICAgICAgICAgdmFyIHBpcFZhbHVlID0gcFZhbDtcbiAgICAgICAgICAgIGlmIChwVmFsLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgcGlwVmFsdWUgPSBwVmFsLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHBpcFZhbHVlKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBkZW5zaXR5OiBxdWVzdGlvbi5waXBzRGVuc2l0eSB8fCA1LFxuICAgICAgICAgIGZvcm1hdDoge1xuICAgICAgICAgICAgdG86IGZ1bmN0aW9uIChwVmFsKSB7XG4gICAgICAgICAgICAgIHZhciBwaXBUZXh0ID0gcFZhbDtcbiAgICAgICAgICAgICAgcXVlc3Rpb24ucGlwc1RleHQubWFwKGZ1bmN0aW9uIChlbCkge1xuICAgICAgICAgICAgICAgIGlmIChlbC50ZXh0ICE9PSB1bmRlZmluZWQgJiYgcFZhbCA9PT0gZWwudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgIHBpcFRleHQgPSBlbC50ZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJldHVybiBwaXBUZXh0O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICByYW5nZToge1xuICAgICAgICAgIG1pbjogcXVlc3Rpb24ucmFuZ2VNaW4sXG4gICAgICAgICAgbWF4OiBxdWVzdGlvbi5yYW5nZU1heCxcbiAgICAgICAgfSxcbiAgICAgICAgb3JpZW50YXRpb246IHF1ZXN0aW9uLm9yaWVudGF0aW9uLFxuICAgICAgICBkaXJlY3Rpb246IHF1ZXN0aW9uLmRpcmVjdGlvbixcbiAgICAgIH0pO1xuICAgICAgc2xpZGVyLm9uKFwiY2hhbmdlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcXVlc3Rpb24udmFsdWUgPSBOdW1iZXIoc2xpZGVyLmdldCgpKTtcbiAgICAgIH0pO1xuICAgICAgcXVlc3Rpb24udXBkYXRlU2xpZGVyUHJvcGVydGllcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgZWxlbXMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwibm9VaS1waXBzXCIpO1xuICAgICAgICBpZiAoZWxlbXMubGVuZ3RoID4gMCkgZWxlbXNbZWxlbXMubGVuZ3RoIC0gMV0uc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICBpZiAoZWxlbXMubGVuZ3RoID4gMSkgZWxlbXNbZWxlbXMubGVuZ3RoIC0gMl0uc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICB2YXIgZ2V0U3RhcnQgPSBmdW5jdGlvbiAoY3VycmVudFN0YXJ0KSB7XG4gICAgICAgICAgcmV0dXJuIHF1ZXN0aW9uLnJhbmdlTWluICsgTWF0aC5yb3VuZCgoY3VycmVudFN0YXJ0IC0gcXVlc3Rpb24ucmFuZ2VNaW4pIC8gcXVlc3Rpb24uc3RlcCkgKiBxdWVzdGlvbi5zdGVwO1xuICAgICAgICB9XG4gICAgICAgIHNsaWRlci51cGRhdGVPcHRpb25zKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHN0ZXA6IHF1ZXN0aW9uLnN0ZXAsXG4gICAgICAgICAgICBzdGFydDogcXVlc3Rpb24ucmFuZ2VNaW4gPD0gcXVlc3Rpb24udmFsdWUgJiYgcXVlc3Rpb24udmFsdWUgPD0gcXVlc3Rpb24ucmFuZ2VNYXggP1xuICAgICAgICAgICAgICBnZXRTdGFydChxdWVzdGlvbi52YWx1ZSkgOiBnZXRTdGFydCgocXVlc3Rpb24ucmFuZ2VNaW4gKyBxdWVzdGlvbi5yYW5nZU1heCkgLyAyKSxcbiAgICAgICAgICAgIHJhbmdlOiB7XG4gICAgICAgICAgICAgIG1pbjogcXVlc3Rpb24ucmFuZ2VNaW4sXG4gICAgICAgICAgICAgIG1heDogcXVlc3Rpb24ucmFuZ2VNYXhcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCB0cnVlKTtcbiAgICAgICAgc2xpZGVyLnBpcHMoXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kZTogcXVlc3Rpb24ucGlwc01vZGUgfHwgXCJwb3NpdGlvbnNcIixcbiAgICAgICAgICAgIHZhbHVlczogcXVlc3Rpb24ucGlwc1ZhbHVlcy5tYXAoZnVuY3Rpb24gKHBWYWwpIHtcbiAgICAgICAgICAgICAgdmFyIHBpcFZhbHVlID0gcFZhbDtcbiAgICAgICAgICAgICAgaWYgKHBWYWwudmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHBpcFZhbHVlID0gcFZhbC52YWx1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQocGlwVmFsdWUpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBkZW5zaXR5OiBxdWVzdGlvbi5waXBzRGVuc2l0eSB8fCA1LFxuICAgICAgICAgICAgZm9ybWF0OiB7XG4gICAgICAgICAgICAgIHRvOiBmdW5jdGlvbiAocFZhbCkge1xuICAgICAgICAgICAgICAgIHZhciBwaXBUZXh0ID0gcFZhbDtcbiAgICAgICAgICAgICAgICBxdWVzdGlvbi5waXBzVGV4dC5tYXAoZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoZWwudGV4dCAhPT0gdW5kZWZpbmVkICYmIHBWYWwgPT09IGVsLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHBpcFRleHQgPSBlbC50ZXh0O1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBwaXBUZXh0O1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICB2YXIgdXBkYXRlVmFsdWVIYW5kbGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBzbGlkZXIuc2V0KHF1ZXN0aW9uLnZhbHVlKTtcbiAgICAgIH07XG4gICAgICBpZiAocXVlc3Rpb24uaXNSZWFkT25seSkge1xuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHVwZGF0ZVZhbHVlSGFuZGxlcigpO1xuICAgICAgcXVlc3Rpb24ubm9VaVNsaWRlciA9IHNsaWRlcjtcbiAgICAgIHF1ZXN0aW9uLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnRpZXNWYWx1ZUNoYW5nZWQoXG4gICAgICAgIFtcInBpcHNWYWx1ZXNcIiwgXCJzdGVwXCIsIFwicmFuZ2VNaW5cIiwgXCJyYW5nZU1heFwiLCBcInBpcHNNb2RlXCIsIFwicGlwc0RlbnNpdHlcIl0sXG4gICAgICAgIHF1ZXN0aW9uLnVwZGF0ZVNsaWRlclByb3BlcnRpZXNcbiAgICAgICk7XG4gICAgICBxdWVzdGlvbi52YWx1ZUNoYW5nZWRDYWxsYmFjayA9IHVwZGF0ZVZhbHVlSGFuZGxlcjtcbiAgICAgIHF1ZXN0aW9uLnJlYWRPbmx5Q2hhbmdlZENhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAocXVlc3Rpb24uaXNSZWFkT25seSkge1xuICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZShcImRpc2FibGVkXCIsIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShcImRpc2FibGVkXCIpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0sXG4gICAgd2lsbFVubW91bnQ6IGZ1bmN0aW9uIChxdWVzdGlvbiwgZWwpIHtcbiAgICAgIGlmICghIXF1ZXN0aW9uLm5vVWlTbGlkZXIpIHtcbiAgICAgICAgcXVlc3Rpb24ubm9VaVNsaWRlci5kZXN0cm95KCk7XG4gICAgICAgIHF1ZXN0aW9uLm5vVWlTbGlkZXIgPSBudWxsO1xuICAgICAgfVxuICAgICAgcXVlc3Rpb24ucmVhZE9ubHlDaGFuZ2VkQ2FsbGJhY2sgPSBudWxsO1xuICAgICAgcXVlc3Rpb24udmFsdWVDaGFuZ2VkQ2FsbGJhY2sgPSBudWxsO1xuXG4gICAgICBpZiAoIXF1ZXN0aW9uLnVwZGF0ZVNsaWRlclByb3BlcnRpZXMpIHJldHVybjtcbiAgICAgIHF1ZXN0aW9uLnVuUmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydGllc1ZhbHVlQ2hhbmdlZChcbiAgICAgICAgW1wicGlwc1ZhbHVlc1wiLCBcInN0ZXBcIiwgXCJyYW5nZU1pblwiLCBcInJhbmdlTWF4XCIsIFwicGlwc01vZGVcIiwgXCJwaXBzRGVuc2l0eVwiXSxcbiAgICAgICAgcXVlc3Rpb24udXBkYXRlU2xpZGVyUHJvcGVydGllc1xuICAgICAgKTtcbiAgICAgIHF1ZXN0aW9uLnVwZGF0ZVNsaWRlclByb3BlcnRpZXMgPSB1bmRlZmluZWRcbiAgICB9LFxuICAgIHBkZlJlbmRlcjogZnVuY3Rpb24gKF8sIG9wdGlvbnMpIHtcbiAgICAgIGlmIChvcHRpb25zLnF1ZXN0aW9uLmdldFR5cGUoKSA9PT0gY29tcG9uZW50TmFtZSkge1xuICAgICAgICB2YXIgcG9pbnQgPSBvcHRpb25zLm1vZHVsZS5TdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoXG4gICAgICAgICAgb3B0aW9ucy5tb2R1bGUuU3VydmV5SGVscGVyLm1lcmdlUmVjdHMuYXBwbHkobnVsbCwgb3B0aW9ucy5icmlja3MpXG4gICAgICAgICk7XG4gICAgICAgIHBvaW50LnhMZWZ0ICs9IG9wdGlvbnMuY29udHJvbGxlci51bml0V2lkdGg7XG4gICAgICAgIHBvaW50LnlUb3AgKz1cbiAgICAgICAgICBvcHRpb25zLmNvbnRyb2xsZXIudW5pdEhlaWdodCAqXG4gICAgICAgICAgb3B0aW9ucy5tb2R1bGUuRmxhdFF1ZXN0aW9uLkNPTlRFTlRfR0FQX1ZFUlRfU0NBTEU7XG4gICAgICAgIHZhciByZWN0ID0gb3B0aW9ucy5tb2R1bGUuU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGaWVsZFJlY3QoXG4gICAgICAgICAgcG9pbnQsXG4gICAgICAgICAgb3B0aW9ucy5jb250cm9sbGVyXG4gICAgICAgICk7XG4gICAgICAgIGlmIChvcHRpb25zLm1vZHVsZS5TdXJ2ZXlIZWxwZXIuc2hvdWxkUmVuZGVyUmVhZE9ubHkodGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyKSkge1xuICAgICAgICAgIG9wdGlvbnMuYnJpY2tzLnB1c2gobmV3IG9wdGlvbnMubW9kdWxlLlRleHRGaWVsZEJyaWNrKFxuICAgICAgICAgICAgb3B0aW9ucy5xdWVzdGlvbixcbiAgICAgICAgICAgIG9wdGlvbnMuY29udHJvbGxlcixcbiAgICAgICAgICAgIHJlY3QsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgb3B0aW9ucy5xdWVzdGlvbi5pZCxcbiAgICAgICAgICAgIG9wdGlvbnMucXVlc3Rpb24udmFsdWUgfHwgb3B0aW9ucy5xdWVzdGlvbi5kZWZhdWx0VmFsdWUgfHwgXCJcIixcbiAgICAgICAgICAgIFwiXCIsXG4gICAgICAgICAgICBvcHRpb25zLnF1ZXN0aW9uLmlzUmVhZE9ubHksXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFwidGV4dFwiXG4gICAgICAgICAgKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgb3B0aW9ucy5tb2R1bGUuU3VydmV5SGVscGVyLmNyZWF0ZUNvbW1lbnRGbGF0KHBvaW50LCBvcHRpb25zLnF1ZXN0aW9uLFxuICAgICAgICAgICAgICBvcHRpb25zLmNvbnRyb2xsZXIsIHRydWUsIHsgcm93czogb3B0aW9ucy5tb2R1bGUuRmxhdFRleHRib3guTVVMVElMSU5FX1RFWFRfUk9XU19DT1VOVCB9KS50aGVuKChicmljaykgPT4ge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuYnJpY2tzLnB1c2goYnJpY2spO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbiAgU3VydmV5LkN1c3RvbVdpZGdldENvbGxlY3Rpb24uSW5zdGFuY2UuYWRkQ3VzdG9tV2lkZ2V0KHdpZGdldCwgXCJjdXN0b210eXBlXCIpO1xufVxuXG5pZiAodHlwZW9mIFN1cnZleSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICBpbml0KFN1cnZleSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGluaXQ7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=